The no-fake multi-node gate: built-store-cross-node #34

Merged
jschoubben merged 12 commits from bed/built-store-cross-node into main 2026-09-17 23:00:49 +00:00
Owner

The bed that removes the last shortcut: two machines, no pre-stocked images, no rewritten digests. The mesh's own builder is the only thing that turns a placeholder into a real reference; the joined node's consumers open the store and broker the mesh built and adopted, over the overlay, admitted by the derived firewall.

It gates hq issues 042/048 honestly (registry account and trust), and along the way surfaced and now guards 061 (a provisioner that never ran) and 062 (a compose silently missing the trust): the trust wait prints each push's output and, on failure, dumps the host's log and whether the received declaration named the trust — so the two failure shapes are distinguishable from the run log alone.

Green fresh on run 12 against mesh-controller 98aea8b, mesh-catalog 1891b09, mesh-lab cb353f9 (warm-wired; typecheck-gated).

The bed that removes the last shortcut: two machines, no pre-stocked images, no rewritten digests. The mesh's own builder is the only thing that turns a placeholder into a real reference; the joined node's consumers open the store and broker the mesh built and adopted, over the overlay, admitted by the derived firewall. It gates hq issues 042/048 honestly (registry account and trust), and along the way surfaced and now guards 061 (a provisioner that never ran) and 062 (a compose silently missing the trust): the trust wait prints each push's output and, on failure, dumps the host's log and whether the received declaration named the trust — so the two failure shapes are distinguishable from the run log alone. Green fresh on run 12 against mesh-controller 98aea8b, mesh-catalog 1891b09, mesh-lab cb353f9 (warm-wired; typecheck-gated).
jschoubben added 12 commits 2026-09-17 22:25:52 +00:00
The scenario names no images and the bed rewrites nothing: the installer raises anchor
(building the control plane), the mesh's own builder builds base, postgres, lavinmq and
the joined node's consumers from the forge and pins every digest itself, the committed
manifests are registered verbatim, and node2 proves both foundation halves cross-node.
Being iterated toward green (run 3 in flight); banked so nothing is lost.

https://claude.ai/code/session_01D6qtiYU3P9jk3pnAXyAFyx
Run 3 showed the Phase-3 installer already adopts postgres (superuser included), nftables
and the catalogue at genesis — re-registering them was redundant. Only lavinmq and the
joined node's consumers are the bed's to add. Issuance is now asserted per module and each
module is pushed as it lands, mirroring the one-node bringUp.

https://claude.ai/code/session_01D6qtiYU3P9jk3pnAXyAFyx
The review found a race: a container that settled in the window's last seconds could be
re-inspected past the deadline and failed as 'never stopped restarting'. A boolean now says
what happened.

https://claude.ai/code/session_01D6qtiYU3P9jk3pnAXyAFyx
letta is not mesh-buildable (hq issue 060) — the store's cross-node proof stays with the
stocked bed until a DB consumer gains a build section; amqp-ping carries the no-fake proof
alone, and the node2 delivery is named as the honest red gate for issues 042/048 (no
registry account, no registry trust). Also: overlay sites match genesis (hosting), the
manifest is read locally instead of a swallowed docker-exec, before() gets the one-node
budget, a node2 failure appends the host log (a failed pull never reaches container logs),
and the foundation's survival plus the consumer's steadiness are asserted.

https://claude.ai/code/session_01D6qtiYU3P9jk3pnAXyAFyx
https://claude.ai/code/session_01D6qtiYU3P9jk3pnAXyAFyx
https://claude.ai/code/session_01D6qtiYU3P9jk3pnAXyAFyx
https://claude.ai/code/session_01D6qtiYU3P9jk3pnAXyAFyx
MESH_LAB_WARM=1 snapshots the post-genesis, both-nodes-enrolled state and restores it in
seconds on later runs — refused, not silently rebuilt, when the commits have moved
(src/warm.ts, the mechanism mesh.test.ts already uses and this session had ignored).
Fresh stays the default.

https://claude.ai/code/session_01D6qtiYU3P9jk3pnAXyAFyx
The networking module delivers the registry trust, so the bed pushes both machines after
assigning it and waits for each runtime to actually hold the trust (file present AND the
daemon reloaded) before the first build pushes to anchor.internal:5000.

https://claude.ai/code/session_01D6qtiYU3P9jk3pnAXyAFyx
Run 11 failed with node2's daemon.json never written and nothing to say
whether the declaration lacked the trust or never applied. The dump now
answers that, and the push output is printed so a compose that refused
is visible in the run log.
jschoubben merged commit 85c8ad8131 into main 2026-09-17 23:00:49 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-lab#34