Release sdk1 of issue 1126 (the controller's removal), delivery group feat/sdk1: mesh-sdk, mesh-catalog, mesh-delivery, mesh-host (the node-engine), mesh-tools, mesh-networking and the controller's repository. Decision: ADR 0593 (mesh-sdk keeps only what every module shares; the node-engine alone composes; the indexer alone computes a fingerprint, over the content of the mesh packages a module imports), with ADR 0591 (a failed check names every failure) and the mesh-sdk part of ADR 0592 (object buckets, history streams). Every member pins mesh-sdk f02f142.
After the first check (20:05, failed on mesh-sdk process.TestStatePutWritesAKeyWhole): tests leaked mesh-sdk's package-wide retry bounds and serving state; fixed as a kind in mesh-sdk, and every member re-pinned. This member also deletes TestTheControllersOwnManifestPassesStepNine: it judged the controller's own manifest at genesis step 9, which no longer exists now that the controller's repository is emptied (genesis's rework is noted on issue 1152). After the second check (20:33): TestRouteProxysProofsOfAComposition's route-proxy subtest skips aloud when the check places no mesh-networking beside (the running checker places none; the release's checker does).
Tests: gofmt, go vet with and without the integration tag, and the unit and integration suites of every Go module in every member pass locally with GOWORK=off against the pins, and were run exactly as the running checker places siblings. Delivered ahead of it: mesh-catalog #597.
Bent rules, said (rules-are-weighed): the node-engine's unit tests rise from 1232 to 1764 because about 530 moved in with the composition rules from mesh-sdk, whose count falls from 1425 to 607, so the mesh-wide count falls. Modules that import a sibling package of their own repository rebuild once more after the release (a one-time breach of ADR 0593 §4). The TypeScript package's move (subtask SDK9) stays out on purpose: the running indexer would lose fingerprints.
Release sdk1 of issue 1126 (the controller's removal), delivery group feat/sdk1: mesh-sdk, mesh-catalog, mesh-delivery, mesh-host (the node-engine), mesh-tools, mesh-networking and the controller's repository. Decision: ADR 0593 (mesh-sdk keeps only what every module shares; the node-engine alone composes; the indexer alone computes a fingerprint, over the content of the mesh packages a module imports), with ADR 0591 (a failed check names every failure) and the mesh-sdk part of ADR 0592 (object buckets, history streams). Every member pins mesh-sdk f02f142.
After the first check (20:05, failed on mesh-sdk process.TestStatePutWritesAKeyWhole): tests leaked mesh-sdk's package-wide retry bounds and serving state; fixed as a kind in mesh-sdk, and every member re-pinned. This member also deletes TestTheControllersOwnManifestPassesStepNine: it judged the controller's own manifest at genesis step 9, which no longer exists now that the controller's repository is emptied (genesis's rework is noted on issue 1152). After the second check (20:33): TestRouteProxysProofsOfAComposition's route-proxy subtest skips aloud when the check places no mesh-networking beside (the running checker places none; the release's checker does).
Tests: gofmt, go vet with and without the integration tag, and the unit and integration suites of every Go module in every member pass locally with GOWORK=off against the pins, and were run exactly as the running checker places siblings. Delivered ahead of it: mesh-catalog #597.
Bent rules, said (rules-are-weighed): the node-engine's unit tests rise from 1232 to 1764 because about 530 moved in with the composition rules from mesh-sdk, whose count falls from 1425 to 607, so the mesh-wide count falls. Modules that import a sibling package of their own repository rebuild once more after the release (a one-time breach of ADR 0593 §4). The TypeScript package's move (subtask SDK9) stays out on purpose: the running indexer would lose fingerprints.
Reviewed-by: review-1126@shanks at ae4b86e33300a3bb8a851963d4bc8d4e09b0cf6f
https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
ADR 0593 §1 and §7: compose, its bus reader and runtime reader, takein,
validate, the overlay generator, the composer's run and mesh-compose, and
the judgement of a move leave mesh-sdk for the node-engine's internal
packages, so no other module composes and a change to them rebuilds only
the node-engine. The shapes others read (the composer's request and
verdict, the overlay's names, compositions and answers) stay in mesh-sdk.
The node's grant is now a golden file of what the grants part composes,
since the composer of the bus's user list leaves mesh-sdk too.
Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
ADR 0593 §6: the provisioner, the assigner and the view read compositions
instead of composing, so the node's engine writes each one it makes to
its composition state: the wanted builds, every placed module at its
newest done build (so the plan exists before the want moves), each with
its provisioning plan, and a module refused alone with its refusal. A
key is written only when it differs, and kept while among the module's
five newest or named by a want. A placed module's trunk build landing
now makes a pass.
Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
ADR 0593 §7: a check's composition is the checker's, made from each
placed node's answer, since only a node can compose with its own sealed
values. The node composes the indexer's candidate in shadow on a copy of
its shadow's inputs, the candidate's modules laid over the indexer's
with their manifest verdicts, and answers per module composed (changed
or not), refused or held, and its own composition's verdict, within the
answer bound; it applies, writes and hands nothing. With input it also
answers the composition input, for the sandbox path.
Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
ADR 0593 §6: composed-<node> is written again, by the node's engine,
each composition with its plan. The verb composition finds a published
revision by the digest the have and want name, its resources', so a plan
on the record does not hide it. The golden node grant also reads the
indexer's verdicts, which compose-candidate takes for a candidate's
manifests.
Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
ADR 0593 §6, §7, §9: the integration test runs the node agent against
the real bus under the grant the grants part composes for a node: it
publishes web's composition in composed-<node> with the digest its have
names, and answers compose-candidate for the indexer's candidate,
changing nothing. A node that cannot compose now answers unready, so
the checker counts it as no answer by the verdict and never by words.
The golden grant reads the indexer's candidates and verdicts as it
reads the builder's builds.
Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
The test budget: mesh-host is over 500 unit tests, so the three tests
added for ADR 0593 §6 and §7 are paid for by folding the private
network's hub refusals, its MTU cases and its no-self-peer check into
table-driven tests, each case kept.
Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
ADR 0593 §6: a composition read from composed-<node> is a record never
applied, and the engine applies only what it composes itself, so no
composition carries a signature and nothing is verified. The agent's
trusted signers, its signed-composition test and the unused signing
helper of the integration bed go, so mesh-sdk can drop SignComposed,
VerifyComposed and Composed.Signature.
Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
ADR 0593 §7: the composer with its refusals leaves mesh-sdk, so mesh-sdk
carries no composition rule. The catalogue functions only the
node-engine's composition reaches (Resolve, Resolution's Compose,
Declaration, DataItems, LeftOut, Rules and the rest, the settings,
placeholder and template refusals, the rendering helpers) are copied
with their tests into internal/compose/resolution; a method of a
mesh-sdk shape becomes a function taking it first. The composition
calls its own copies, and the captured catalogue its tests read lives
here now, shared by mesh-compose's tests.
Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
ADR 0593 §7: the composition is the node-engine's, so its tests hold
what the indexer's judge tests and route-proxy's tests proved by
composing: a bundle's words per machine, a Go bundle's delivery, the
credential form in a handed plan, settings refusals, placeholder and
vault refusals, the session's files, a field set aside composed whole,
route-proxy's manifest composing for a machine, a route endpoint's
machine port in six cases and the plan's route entry end to end. Two
table tests, one subtest per item; route-proxy's manifest is captured
beside the catalogue.
Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
ADR 0593 §7: the environment's rendering left mesh-sdk for the node-engine,
so its two integration tests (the POSIX environment sourced twice, and
the service manager reading the systemd rendering) move with it.
Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
mesh/check failed: integration: meshbuildgo/cmd/mesh-build-go.TestAComposeAskIsBuiltOnceAndAnsweredOnTheBus: NOT CHECKED: the node-engine's composer c…
Deliverynovox/mesh-host@ae4b86e33300 — merged since 2026-11-02T20:43:13Z
Source — source.main moved to novox/mesh-host@4c7056de42. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
composed together: fail — the checker's verdict at the members' heads (10899da235da): the composition
Transitions
2026-11-02 19:41 (new) → proposed (announced): novox/mesh-host#198's head announced
2026-11-02 19:41 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-02 20:43 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@ae4b86e33300` — **merged** since 2026-11-02T20:43:13Z
**Source** — source.main moved to novox/mesh-host@4c7056de4241. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Group** `feat/sdk1`: novox/mesh-catalog@d221c633799a, novox/mesh-controller@597036717394, novox/mesh-delivery@2b5a7fe831c1, novox/mesh-host@ae4b86e33300, novox/mesh-networking@f18ec031c463, novox/mesh-sdk@f02f142af128, novox/mesh-tools@24c0ec0d324a
- composed together: fail — the checker's verdict at the members' heads (10899da235da): the composition
**Transitions**
- 2026-11-02 19:41 (new) → proposed (announced): novox/mesh-host#198's head announced
- 2026-11-02 19:41 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-02 20:43 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: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh/check failed: integration: meshbuildgo/cmd/mesh-build-go.TestAComposeAskIsBuiltOnceAndAnsweredOnTheBus: NOT CHECKED: the node-engine's composer c…
The test read mesh-controller/module.json beside the check, which no longer exists after the
controller's removal (issue 1126, ADR 0593 §11), so it would fail every check of the node-engine.
Claude-Session: https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: its head 3b3b096be8cd is no longer the pull request's head, or the pull request closed. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: its head 3b3b096be8cd is no longer the pull request's head, or the pull request closed. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
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.
Release sdk1 of issue 1126 (the controller's removal), delivery group feat/sdk1: mesh-sdk, mesh-catalog, mesh-delivery, mesh-host (the node-engine), mesh-tools, mesh-networking and the controller's repository. Decision: ADR 0593 (mesh-sdk keeps only what every module shares; the node-engine alone composes; the indexer alone computes a fingerprint, over the content of the mesh packages a module imports), with ADR 0591 (a failed check names every failure) and the mesh-sdk part of ADR 0592 (object buckets, history streams). Every member pins mesh-sdk f02f142.
After the first check (20:05, failed on mesh-sdk process.TestStatePutWritesAKeyWhole): tests leaked mesh-sdk's package-wide retry bounds and serving state; fixed as a kind in mesh-sdk, and every member re-pinned. This member also deletes TestTheControllersOwnManifestPassesStepNine: it judged the controller's own manifest at genesis step 9, which no longer exists now that the controller's repository is emptied (genesis's rework is noted on issue 1152). After the second check (20:33): TestRouteProxysProofsOfAComposition's route-proxy subtest skips aloud when the check places no mesh-networking beside (the running checker places none; the release's checker does).
Tests: gofmt, go vet with and without the integration tag, and the unit and integration suites of every Go module in every member pass locally with GOWORK=off against the pins, and were run exactly as the running checker places siblings. Delivered ahead of it: mesh-catalog #597.
Bent rules, said (rules-are-weighed): the node-engine's unit tests rise from 1232 to 1764 because about 530 moved in with the composition rules from mesh-sdk, whose count falls from 1425 to 607, so the mesh-wide count falls. Modules that import a sibling package of their own repository rebuild once more after the release (a one-time breach of ADR 0593 §4). The TypeScript package's move (subtask SDK9) stays out on purpose: the running indexer would lose fingerprints.
Reviewed-by: review-1126@shanks at
ae4b86e333https://claude.ai/code/session_01NcbgfJ9Gum47zkFKWRaovL
Delivery
novox/mesh-host@ae4b86e33300— merged since 2026-11-02T20:43:13ZSource — source.main moved to novox/mesh-host@4c7056de42. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Group
feat/sdk1: novox/mesh-catalog@d221c63379, novox/mesh-controller@5970367173, novox/mesh-delivery@2b5a7fe831, novox/mesh-host@ae4b86e333, novox/mesh-networking@f18ec031c4, novox/mesh-sdk@f02f142af1, novox/mesh-tools@24c0ec0d32Transitions
The commit's note under
refs/notes/mesh-plankeeps every transition of this change up to its merge:git log --notes=mesh-plan.mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: a head it covers moved on: the heads it covers are no longer the group's heads. Nothing is merged on it. The operator is asked again once the checks pass at the new head.
mesh-delivery: the operator's Approve of this pull request's merge into main is ended: its head 3b3b096be8cd is no longer the pull request's head, or the pull request closed. Nothing is merged on it. The operator is asked again once the checks pass at the new head.