A claim problem or a refused credential holds its module, not the whole pass (issue 1966, recovery) #219

Merged
mesh-tools merged 2 commits from fix/1966-s1-partial-pass into main 2026-11-09 17:54:55 +00:00
Member

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 ef41fa2e27

https://claude.ai/code/session_01NcbgfFfQ4Z9UE5jK32PmE5

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
mesh-tools added 2 commits 2026-11-09 12:07:04 +00:00
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
The node-engine's live path holds a module whose claim or credential fails (issue 1966, review round 1)
mesh/check being carried to ef41fa2e2796 on 6e461bd24aa5 | from 7c483da93a03
mesh/delivery merged: source.main moved to novox/mesh-host@6e461bd24aa5
ef41fa2e27
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
Author
Member

Delivery novox/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`.
mesh-tools merged commit 6e461bd24a into main 2026-11-09 17:54:55 +00:00
mesh-tools deleted branch fix/1966-s1-partial-pass 2026-11-09 17:54:55 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-host#219