Never put a module whose want names its own composition into the node's own, and read a re-registered module's fingerprint from the indexer (issue 1945)
#461
Merged
mesh-toolsmerged 1 commits from fix/r6-own-composition-dupes into main2026-10-25 13:37:34 +00:00
Since 12:43 on 2026-10-25 the controller raised apply-failing on all four machines: the node-engine refused '2 resources declare X' for node-env, power, restic, ssh-client, zsh and more, so no provisioner file of theirs was written.
Root cause: a catalogue merge that leaves a module's sources alone re-registers it at the merge commit from the same builder key; its build record (keyBuildID) already exists at the earlier commit and chainRecordBuild keeps it, so the new commit has no build. currentFingerprints (grants.go) then misses the module, and compositionsOf moved it into .node while its want still names its own src2 composition; the node-engine joined both.
What changes:
grants.go: fingerprintsAt falls back to the fingerprint the indexer's trunk value names at that commit (current value or the key's history); an indexer error fails the read instead of leaving a module out silently. The same gap also left these modules out of the grants written for the assigner.
composed_writer.go, composed_live.go: a module whose node want or have names a src2 fingerprint is never also put into the node's own composition, resources and filled paths alike; the modules left out are said.
Tests (each seen failing first): fingerprints_at_test.go (1945/AC15), TestAModuleItsWantNamesIsNeverInTheNodesOwnComposition (1945/AC16). Criteria in issue 1945 note 21.
Not fixed here: the build chain still keeps one record per key and revision with a single commit; direct BuildOf callers at built_from are not covered by the fallback.
Tries: try-1792933866452123122 passed on ac34bce4 (966 unit, 1625 integration).
Reviewed-by: reviewer-r6m@shanks at ac34bce49f
Pushed-by: lead-47@shanks
Since 12:43 on 2026-10-25 the controller raised apply-failing on all four machines: the node-engine refused '2 resources declare X' for node-env, power, restic, ssh-client, zsh and more, so no provisioner file of theirs was written.
Root cause: a catalogue merge that leaves a module's sources alone re-registers it at the merge commit from the same builder key; its build record (keyBuildID) already exists at the earlier commit and chainRecordBuild keeps it, so the new commit has no build. currentFingerprints (grants.go) then misses the module, and compositionsOf moved it into <node>.node while its want still names its own src2 composition; the node-engine joined both.
What changes:
1. grants.go: fingerprintsAt falls back to the fingerprint the indexer's trunk value names at that commit (current value or the key's history); an indexer error fails the read instead of leaving a module out silently. The same gap also left these modules out of the grants written for the assigner.
2. composed_writer.go, composed_live.go: a module whose node want or have names a src2 fingerprint is never also put into the node's own composition, resources and filled paths alike; the modules left out are said.
Tests (each seen failing first): fingerprints_at_test.go (1945/AC15), TestAModuleItsWantNamesIsNeverInTheNodesOwnComposition (1945/AC16). Criteria in issue 1945 note 21.
Not fixed here: the build chain still keeps one record per key and revision with a single commit; direct BuildOf callers at built_from are not covered by the fallback.
Tries: try-1792933866452123122 passed on ac34bce4 (966 unit, 1625 integration).
Reviewed-by: reviewer-r6m@shanks at ac34bce49f581c3a0759e05d2f7abb886a2ac7e4
Pushed-by: lead-47@shanks
A catalogue merge that leaves a module's sources alone registers it at the new
commit from the same done key, whose build record stands at its first commit,
so the commit had no build and the module no fingerprint of the new form: it
went into the node's own composition while its want named its own, and every
node declared its files twice. currentFingerprints now reads the indexer's
trunk value at the commit when no build points at it (1945/AC15), and a module
a want or have names by its own composition is left out of the node's own
(1945/AC16).
Deliverynovox/mesh-controller@ac34bce49f58 — merged since 2026-10-25T13:37:35Z
Source — source.main moved to novox/mesh-controller@2bcd85d2df. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
Transitions
2026-10-25 13:28 (new) → proposed (announced): novox/mesh-controller#461's head announced
2026-10-25 13:36 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail
2026-10-25 13:37 ready → merged (merged): on the trunk its modules follow: merged there
The commit's note under refs/notes/mesh-plan keeps every transition of this change up to its merge: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-controller@ac34bce49f58` — **merged** since 2026-10-25T13:37:35Z
**Source** — source.main moved to novox/mesh-controller@2bcd85d2df4c. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Transitions**
- 2026-10-25 13:28 (new) → proposed (announced): novox/mesh-controller#461's head announced
- 2026-10-25 13:36 proposed → ready (accepted): a verdict names this commit and the trunk's head as its trunk commit, the gate passed or warned, and the repository's own check did not fail
- 2026-10-25 13:37 ready → merged (merged): on the trunk its modules follow: merged there
The commit's note under `refs/notes/mesh-plan` keeps every transition of this change up to its merge: `git log --notes=mesh-plan`.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Since 12:43 on 2026-10-25 the controller raised apply-failing on all four machines: the node-engine refused '2 resources declare X' for node-env, power, restic, ssh-client, zsh and more, so no provisioner file of theirs was written.
Root cause: a catalogue merge that leaves a module's sources alone re-registers it at the merge commit from the same builder key; its build record (keyBuildID) already exists at the earlier commit and chainRecordBuild keeps it, so the new commit has no build. currentFingerprints (grants.go) then misses the module, and compositionsOf moved it into .node while its want still names its own src2 composition; the node-engine joined both.
What changes:
Tests (each seen failing first): fingerprints_at_test.go (1945/AC15), TestAModuleItsWantNamesIsNeverInTheNodesOwnComposition (1945/AC16). Criteria in issue 1945 note 21.
Not fixed here: the build chain still keeps one record per key and revision with a single commit; direct BuildOf callers at built_from are not covered by the fallback.
Tries: try-1792933866452123122 passed on
ac34bce4(966 unit, 1625 integration).Reviewed-by: reviewer-r6m@shanks at
ac34bce49fPushed-by: lead-47@shanks
Delivery
novox/mesh-controller@ac34bce49f58— merged since 2026-10-25T13:37:35ZSource — source.main moved to novox/mesh-controller@2bcd85d2df. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.