The node-engine refused its whole pass when one module's claim failed (S1) or one credential was refused (S5). Now that module is held, through #218's left-out path: its handed composition is kept, it is said with the claim's or the send's words, and the rest of the machine composes. The check's candidate answer and ComposeSent refuse a change that adds a second claimant, by name.
Quick fix: hold only the refused credential in planForNow (about 20 minutes).
Thorough fix, chosen: attribute every claim problem to its module and send claim and credential holds through the one hold path in frombus composeEach, so selfcompose, ComposeSent and the candidate answer read the same held words.
Not covered (ruled not a finding): a declared-and-not-made own secret (NotMadeError) still refuses in resolution; on the live path frombus's culprit search already holds that module.
Tests: go vet ./..., go vet -tags integration ./..., go test ./... pass against origin/main siblings (mesh-sdk 7798fb48, mesh-delivery 042b8d1f, mesh-contracts 66e0c611, mesh-networking f0ec726e). New row test TestASecondClaimantOfASeatIsHeldAndTheNodeComposesTheRest fails with the hold taken out. Test functions 1751 before and after.
A recovery fix under the instruction section recovery-fixes-merge-and-tell: small, undone by one revert. The delivery seat serves no recovery merge yet, so it waits for the operator's Approve like any change.
Reviewed-by: mesh-code-reviewer for lead-47@shanks at ef41fa2e27
Issue 1966, S1 and S5 (hq .work/47-G-prepare.md section 6, W13.6, finding F12).
The node-engine refused its whole pass when one module's claim failed (S1) or one credential was refused (S5). Now that module is held, through #218's left-out path: its handed composition is kept, it is said with the claim's or the send's words, and the rest of the machine composes. The check's candidate answer and ComposeSent refuse a change that adds a second claimant, by name.
- Quick fix: hold only the refused credential in planForNow (about 20 minutes).
- Thorough fix, chosen: attribute every claim problem to its module and send claim and credential holds through the one hold path in frombus composeEach, so selfcompose, ComposeSent and the candidate answer read the same held words.
Not covered (ruled not a finding): a declared-and-not-made own secret (NotMadeError) still refuses in resolution; on the live path frombus's culprit search already holds that module.
Tests: go vet ./..., go vet -tags integration ./..., go test ./... pass against origin/main siblings (mesh-sdk 7798fb48, mesh-delivery 042b8d1f, mesh-contracts 66e0c611, mesh-networking f0ec726e). New row test TestASecondClaimantOfASeatIsHeldAndTheNodeComposesTheRest fails with the hold taken out. Test functions 1751 before and after.
A recovery fix under the instruction section recovery-fixes-merge-and-tell: small, undone by one revert. The delivery seat serves no recovery merge yet, so it waits for the operator's Approve like any change.
Reviewed-by: mesh-code-reviewer for lead-47@shanks at ef41fa2e2796f7f60035677442031886fe53204c
https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
The node-engine refused the whole pass when two modules claimed a seat held once, or when a consumer's credential was
refused. Now the composer leaves that module out of the declaration and composes the rest: the module is returned held
(Resolved.Held, resolution.ResolveHolding), reaches the declaration as left out through the filter and the declaration
#218 already keep (Rendering.NotPlaced), and Declared.LeftOut names it. The second claimant of a seat is the one held;
its claim is not this node's holding. The rest-of-mesh view and the network use the same, so a node with a held module
stays on the network. Resolve stays strict for callers that cannot leave a module out.
Quick fix: hold only the credential refusal (resolve.go planForNow), about 20 minutes. Thorough fix, chosen: every
claim problem is attributed to its module (claimsOf) and both kinds go through the one left-out path of ADR 0163 rule 6,
in the declaration, the filter and the network, so no per-kind refusal of a pass remains in the composer. Left for the
next step: a declared-and-not-made own secret (NotMadeError) and the Foreseeing-mode refusal still refuse the pass; the
frombus candidate path holds those by stub already.
Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
compose.CompositionsHolding returns the modules the declaration leaves out for a claim that cannot be held or a refused
credential; frombus composeEach holds each with those words, so the node-engine keeps what it handed of the module (no
stop of a running module), the candidate answer and the check's sandbox name it refused, and the rest composes.
CredentialsNeeded asks nothing for a held module. Resolve and checkClaims move to a test helper (production uses
ResolveHolding and holdClaims); a pass refused anyway names a held module's reason among the others.
Quick fix: Declared.Held read in the composer only. Thorough, chosen: the same held words reach every reader of the
composition (selfcompose, ComposeSent, the candidate answer) through composeEach's one hold path.
Claude-Session: https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
Deliverynovox/mesh-host@ef41fa2e2796 — merged since 2026-11-09T17:54:56Z
Source — source.main moved to novox/mesh-host@6e461bd24a. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
Transitions
2026-11-09 12:07 (new) → proposed (announced): novox/mesh-host#219's head announced
2026-11-09 12:07 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; or the check gates no merge (check-gates-merge false)
2026-11-09 17:54 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-host@ef41fa2e2796` — **merged** since 2026-11-09T17:54:56Z
**Source** — source.main moved to novox/mesh-host@6e461bd24aa5. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Transitions**
- 2026-11-09 12:07 (new) → proposed (announced): novox/mesh-host#219's head announced
- 2026-11-09 12:07 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; or the check gates no merge (check-gates-merge false)
- 2026-11-09 17:54 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.
Issue 1966, S1 and S5 (hq .work/47-G-prepare.md section 6, W13.6, finding F12).
The node-engine refused its whole pass when one module's claim failed (S1) or one credential was refused (S5). Now that module is held, through #218's left-out path: its handed composition is kept, it is said with the claim's or the send's words, and the rest of the machine composes. The check's candidate answer and ComposeSent refuse a change that adds a second claimant, by name.
Not covered (ruled not a finding): a declared-and-not-made own secret (NotMadeError) still refuses in resolution; on the live path frombus's culprit search already holds that module.
Tests: go vet ./..., go vet -tags integration ./..., go test ./... pass against origin/main siblings (mesh-sdk 7798fb48, mesh-delivery 042b8d1f, mesh-contracts 66e0c611, mesh-networking f0ec726e). New row test TestASecondClaimantOfASeatIsHeldAndTheNodeComposesTheRest fails with the hold taken out. Test functions 1751 before and after.
A recovery fix under the instruction section recovery-fixes-merge-and-tell: small, undone by one revert. The delivery seat serves no recovery merge yet, so it waits for the operator's Approve like any change.
Reviewed-by: mesh-code-reviewer for lead-47@shanks at
ef41fa2e27https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5
Delivery
novox/mesh-host@ef41fa2e2796— merged since 2026-11-09T17:54:56ZSource — source.main moved to novox/mesh-host@6e461bd24a. 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.