L3: a source revision ordered by the module graph, the check waits on its candidate's builds, and an emptied repository never drops a module another trunk holds (ADR 0603, ADR 0604, issues 1367, 774)
#147
Merged
mesh-toolsmerged 55 commits from feat/l3b-bus into main2026-11-03 20:12:56 +00:00
Milestone L3 of design 47, one delivery group on branch feat/l3b-bus with mesh-sdk, mesh-catalog and mesh-tools; pins mesh-sdk b7abe203a929. (mesh-host goes alone after this group: its own check needs this group's checker, which reads not-judged.)
ADR 0603: the indexer keeps the module graph as its state (§2; the graph is this repository's own Go module sdk/, package graph); view_tiers (§6); a source revision delivered over the nodes present (§7); the watchman's waits past their bound (§8); only the newest manifest's provisions hold a want (§9); the check waits on the builder's candidate builds before it composes, new setting build-wait-bound, and asks itself again when a failed build is done again (§10; bases are composed from manifests and named, ADR 0487 §1); the check refuses a graph cycle.
ADR 0603 §5 in the assigner: a consumer's want also waits on a provision the provisioner has keyed while its provider is not yet answering, and on a requirement nothing offers (raised past its bound by the watchman); a requirement offered by a module's own name or by a module the mesh provides itself is not waited on (the second check's failure: a consumer moved before its provider).
ADR 0604 §1: the seat mesh-catalog's verbs answered from the indexer (served once the indexer claims the seat, in the next group).
Issue 1367: a merge that leaves a repository no module never deletes a module another trunk holds; indexer_take_in. (Commits also cite issue 1126, its origin.)
ADR 0601 §1, §3, §4 rows carried from L3a; the indexer's integration test expects a field its judge does not know to wait while its running build is unknown.
Tests: 876 test functions (unchanged; over the 500 budget, no new functions); the assigner and checker integration tests extended; every delivery part's integration tests run locally on this head.
Milestone L3 of design 47, one delivery group on branch feat/l3b-bus with mesh-sdk, mesh-catalog and mesh-tools; pins mesh-sdk b7abe203a929. (mesh-host goes alone after this group: its own check needs this group's checker, which reads not-judged.)
- ADR 0603: the indexer keeps the module graph as its state (§2; the graph is this repository's own Go module sdk/, package graph); view_tiers (§6); a source revision delivered over the nodes present (§7); the watchman's waits past their bound (§8); only the newest manifest's provisions hold a want (§9); the check waits on the builder's candidate builds before it composes, new setting build-wait-bound, and asks itself again when a failed build is done again (§10; bases are composed from manifests and named, ADR 0487 §1); the check refuses a graph cycle.
- ADR 0603 §5 in the assigner: a consumer's want also waits on a provision the provisioner has keyed while its provider is not yet answering, and on a requirement nothing offers (raised past its bound by the watchman); a requirement offered by a module's own name or by a module the mesh provides itself is not waited on (the second check's failure: a consumer moved before its provider).
- ADR 0604 §1: the seat mesh-catalog's verbs answered from the indexer (served once the indexer claims the seat, in the next group).
- Issue 1367: a merge that leaves a repository no module never deletes a module another trunk holds; indexer_take_in. (Commits also cite issue 1126, its origin.)
- ADR 0601 §1, §3, §4 rows carried from L3a; the indexer's integration test expects a field its judge does not know to wait while its running build is unknown.
Tests: 876 test functions (unchanged; over the 500 budget, no new functions); the assigner and checker integration tests extended; every delivery part's integration tests run locally on this head.
Issues: 774, 1367. Replaces #145 (feat/l3a-waits).
Reviewed-by: mesh-code-reviewer@shanks at 945906ac976c4ec61a0947f128bdc07ac2e3f358
Pushed-by: lead-47@shanks
https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
The forge bridge wrote no merged message for such a merge, so taken.<repo> never moved
and the view held 'the indexer has not yet taken in <head>' (hq #490-#492). The bridge
now writes it with no trees; the indexer drops every module of the repository on it,
after the same order check as any merged message. The view needed no change: with the
taken key moving it reaches the merge, which its new row proves.
Needs mesh-sdk fix/1126-no-module-reach (a merged message may carry no trees).
dropRemoved hands the module over from the other trunk, read from the forge at the head the source names, so no wait in memory is needed. indexer_take_in with a repository takes in a head with no module.json as a merge that leaves none, and answers by name for a head with modules.
The indexer's recompute and merge failed on listing a graph bucket not yet on the bus, and a package published from inside a module's directory had no publisher, so the dependents of a build module missed what imports its packages (review findings 3 and 4 of L3).
Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
D13b: the composition's warnings, and so the check's line, name the changed modules built with the Go build module the change alters and those standing on a changed base. D9: builder and verdict rows. D15: the assigner's integration test gets a source revision changing a provider, its new consumer and a build module.
Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
The builder already builds every candidate fingerprint into its own key. The check now watches exactly those keys on the
bus and composes once each is done or failed, within the new setting build-wait-bound (1800 s). A failed build fails the
check, naming it; a build not ended within the bound is named and the check composes without it. A module built by a
build module the change alters (mesh-build-go or mesh-build-node), one standing on a base the change alters, and one the
trunk holds no record of are not waited on, and the composition's warnings name each with why.
Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
Worked out from the builder's builds state at each read, stored nowhere: of each running check, the candidate's builds
that are neither done nor failed.
Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
A failed candidate build no longer needs mesh-delivery.recheck, an exception verb (ADR 0421 §12): the checker hears the
builder's keys the failed verdict names and, once each is written done (builder_build_again), retakes the check of the
same heads as it does after a failure of the nodes, at its start too. When the tests have already failed the check
composes at once and names the builds it did not wait on, so its red status is never held back by a build.
Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
Deliverynovox/mesh-delivery@945906ac976c — merged since 2026-11-03T20:13:00Z
Source — source.main moved to novox/mesh-delivery@4154c3040c. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
composed together: pass — the checker's verdict at the members' heads (eb182f6015c0)
Transitions
2026-11-03 18:50 (new) → proposed (announced): novox/mesh-delivery#147's head announced
2026-11-03 18:50 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-03 20:13 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-delivery@945906ac976c` — **merged** since 2026-11-03T20:13:00Z
**Source** — source.main moved to novox/mesh-delivery@4154c3040cee. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Group** `feat/l3b-bus`: novox/mesh-catalog@5fab8f118e18, novox/mesh-delivery@945906ac976c, novox/mesh-sdk@b7abe203a929, novox/mesh-tools@8b8a7600479e
- composed together: pass — the checker's verdict at the members' heads (eb182f6015c0)
**Transitions**
- 2026-11-03 18:50 (new) → proposed (announced): novox/mesh-delivery#147's head announced
- 2026-11-03 18:50 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-03 20:13 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: its head a24a1d72ad45 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 a24a1d72ad45 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/check failed: integration: mesh-delivery-assigner/cmd/mesh-delivery-assigner.TestWantsAreWrittenAndNoDifferenceIs:… | f12823681c06 on c4470f42dba9
mesh/delivery-group group feat/l3b-bus rejected: composed together: the checker's verdict at the members' heads (62ca67fc6b58): integration: mesh-delivery-assi…
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.
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.
Milestone L3 of design 47, one delivery group on branch feat/l3b-bus with mesh-sdk, mesh-catalog and mesh-tools; pins mesh-sdk b7abe203a929. (mesh-host goes alone after this group: its own check needs this group's checker, which reads not-judged.)
Tests: 876 test functions (unchanged; over the 500 budget, no new functions); the assigner and checker integration tests extended; every delivery part's integration tests run locally on this head.
Issues: 774, 1367. Replaces #145 (feat/l3a-waits).
Reviewed-by: mesh-code-reviewer@shanks at
945906ac97Pushed-by: lead-47@shanks
https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
c4470f42) 875d42fe3eDelivery
novox/mesh-delivery@945906ac976c— merged since 2026-11-03T20:13:00ZSource — source.main moved to novox/mesh-delivery@4154c3040c. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.main, the wants and the haves.Group
feat/l3b-bus: novox/mesh-catalog@5fab8f118e, novox/mesh-delivery@945906ac97, novox/mesh-sdk@b7abe203a9, novox/mesh-tools@8b8a760047Transitions
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: its head a24a1d72ad45 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: 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.