Issue 1289 (R4c of design 47): its delivery is held by postgres on the control node.
The fault (live since 2026-10-31 ~01:30): postgres's repeat backup (the operator's "again") was interrupted by the node-engine's own restart. The held have was written from an empty running entry, so it lost the build and composition postgres runs; a have naming no build counts as inside the node's own composition, so postgres was composed from the indexer's manifest without its handed and refused ("its own secret reader is handed to the provisioner and the module is not: nothing would fill it"). And an interrupted backup was never run again: the node waited for a new want, the assigner for a new failure.
The fix (node agent only): a held have names the build and composition the module runs (readHave when running has none); a backup ended by the agent's own stop is marked BackupInterrupted and, at the next start, runs again and the module applies, unless the want says skip. Every other held cause still waits for the operator's answer. The rule for what is inside the node's own composition is unchanged (main's).
Quick fix vs thorough fix: quick: a new backup ask by hand, which would leave the next interrupted backup stuck the same way. Thorough (chosen): the cause fixed where it lives, in the node agent.
Tests (folded into existing tests, no new Test functions): the held have names what runs; an interrupted backup with "again" or no answer is backed up again and applied; a real failure stays held; end to end, a backup blocked until the agent stops leaves a held have naming the old build with BackupInterrupted. Each failed before the fix. gofmt, go vet (with and without -tags integration) and go test pass; the new case passes 5 runs with -race.
Left for later (noted on issue 1289): mesh-sdk's refusal should say "composed from a manifest without its build"; the assigner could skip asking for a BackupInterrupted have.
Issue 1289 (R4c of design 47): its delivery is held by postgres on the control node.
**The fault (live since 2026-10-31 ~01:30):** postgres's repeat backup (the operator's "again") was interrupted by the node-engine's own restart. The held have was written from an empty `running` entry, so it lost the build and composition postgres runs; a have naming no build counts as inside the node's own composition, so postgres was composed from the indexer's manifest without its `handed` and refused ("its own secret reader is handed to the provisioner and the module is not: nothing would fill it"). And an interrupted backup was never run again: the node waited for a new want, the assigner for a new failure.
**The fix (node agent only):** a held have names the build and composition the module runs (`readHave` when `running` has none); a backup ended by the agent's own stop is marked `BackupInterrupted` and, at the next start, runs again and the module applies, unless the want says skip. Every other held cause still waits for the operator's answer. The rule for what is inside the node's own composition is unchanged (main's).
**Quick fix vs thorough fix:** quick: a new backup ask by hand, which would leave the next interrupted backup stuck the same way. Thorough (chosen): the cause fixed where it lives, in the node agent.
**Tests** (folded into existing tests, no new Test functions): the held have names what runs; an interrupted backup with "again" or no answer is backed up again and applied; a real failure stays held; end to end, a backup blocked until the agent stops leaves a held have naming the old build with `BackupInterrupted`. Each failed before the fix. gofmt, go vet (with and without -tags integration) and go test pass; the new case passes 5 runs with -race.
Left for later (noted on issue 1289): mesh-sdk's refusal should say "composed from a manifest without its build"; the assigner could skip asking for a `BackupInterrupted` have.
Reviewed-by: rev-heldbackup@shanks at 76c7ddfc52271fe534730d0a473893ab6f1fef1a
https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
On novox (2026-10-31) postgres's repeat backup was interrupted by the node-engine's
restart: its held have named no build, so the node's own composition took postgres in
and was refused for its secret reader, and nothing ran the backup again. Issue 1289
(R4c, its delivery held).
- A held have names what runs: read from the module's have before backing-up when
the agent has no running entry, as the not-composed mark does.
- A have in any phase but running that names nothing is not run inside the node's own.
- A backup interrupted by the agent's stop is no failure: the next start backs the
module up again and applies while the want asks a backup. A real failure stays
held for the operator's answer.
Quick fix: a new backup ask by hand. Thorough, chosen: the fault fixed where it lives
in the node agent, so every data module's interrupted backup resumes by itself.
Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
Review round 1: a have naming no build in a phase but running is also written for a
module that runs inside the node's own (waiting for a yes), so taking it out would
drop its resources before the yes. The fp the held have now keeps already fixes
postgres (issue 1289); a test drives an interrupted backup end to end.
Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
Deliverynovox/mesh-host@76c7ddfc5227 — merged since 2026-10-31T16:33:57Z
Source — source.main moved to novox/mesh-host@ffa63d25a0. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
Transitions
2026-10-31 15:39 (new) → proposed (announced): novox/mesh-host#189's head announced
2026-10-31 15:39 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-10-31 16:33 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@76c7ddfc5227` — **merged** since 2026-10-31T16:33:57Z
**Source** — source.main moved to novox/mesh-host@ffa63d25a066. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Transitions**
- 2026-10-31 15:39 (new) → proposed (announced): novox/mesh-host#189's head announced
- 2026-10-31 15:39 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-10-31 16:33 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 1289 (R4c of design 47): its delivery is held by postgres on the control node.
The fault (live since 2026-10-31 ~01:30): postgres's repeat backup (the operator's "again") was interrupted by the node-engine's own restart. The held have was written from an empty
runningentry, so it lost the build and composition postgres runs; a have naming no build counts as inside the node's own composition, so postgres was composed from the indexer's manifest without itshandedand refused ("its own secret reader is handed to the provisioner and the module is not: nothing would fill it"). And an interrupted backup was never run again: the node waited for a new want, the assigner for a new failure.The fix (node agent only): a held have names the build and composition the module runs (
readHavewhenrunninghas none); a backup ended by the agent's own stop is markedBackupInterruptedand, at the next start, runs again and the module applies, unless the want says skip. Every other held cause still waits for the operator's answer. The rule for what is inside the node's own composition is unchanged (main's).Quick fix vs thorough fix: quick: a new backup ask by hand, which would leave the next interrupted backup stuck the same way. Thorough (chosen): the cause fixed where it lives, in the node agent.
Tests (folded into existing tests, no new Test functions): the held have names what runs; an interrupted backup with "again" or no answer is backed up again and applied; a real failure stays held; end to end, a backup blocked until the agent stops leaves a held have naming the old build with
BackupInterrupted. Each failed before the fix. gofmt, go vet (with and without -tags integration) and go test pass; the new case passes 5 runs with -race.Left for later (noted on issue 1289): mesh-sdk's refusal should say "composed from a manifest without its build"; the assigner could skip asking for a
BackupInterruptedhave.Reviewed-by: rev-heldbackup@shanks at
76c7ddfc52https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
Delivery
novox/mesh-host@76c7ddfc5227— merged since 2026-10-31T16:33:57ZSource — source.main moved to novox/mesh-host@ffa63d25a0. 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.