A pull request's check composed the nodes before the change's own candidate builds ended, and read the running node-engine's "wanted at , of which the builder holds no done build yet" as the change's refusal (met twice on 2026-11-07: mesh-catalog #624 and mesh-delivery #163; issue 1921 notes 72 and 75). ADR 0603 §10 says the check waits for them (builds_not_ended).
Cause: the checker built its case from the indexer's first candidate write, which carries no fp2 yet (the merge preview follows on the same heads), and only a try waited for the previewed candidate; so buildsOfTheCheck skipped every module and awaitBuilds waited on nothing.
Fix (mesh-delivery-checker): internal/check/judge.go runs takeTryCandidate also for a pull request's check whose case still holds a module waiting on its preview, within the build-wait bound; WaitsOnPreview moves into internal/check. A build not ended within the bound is named and the composition marked not run (the engines are not asked); a check with no previewed candidate within the bound likewise, saying its manifests were judged from the indexer's first write. A not-run composition keeps a pass with the tests passed and says "composition not judged: …" on the status (as a compose error and a node without an answer do, ADR 0593 §9). A check that has its fingerprints does not wait; every wait is bounded (at most two build-wait bounds).
Changed behaviour of a try, said here: when a build runs late, a try is now not composed and so no pass (try.go), where before it composed without that build.
The first check (3f9acf02) failed only in the composition, from the fault this fixes (the checker module's own build was done minutes later); the operator's Decline of 13:56 was meant for another ask, so the review's note on judge.go's comment and words is pushed as c0da09d8 to ask again.
Quick fix named: read the candidate again before waiting on builds. Thorough fix, chosen: the check judges only the previewed candidate, as a try does, and a late builder is never read as the change refusing. Left for later (notes on issue 1921): the node-engine's "no done build yet" as a held module state; the noPreview words copied from the indexer belong in the candidate's contract.
Tests: two rows in aChangeToABuildModuleOrBaseNamesTheModulesBuiltOnIt (composition_test.go), each failing without the fix; no new test function; no module.json changed.
Reviewed-by: mesh-code-reviewer@shanks at c0da09d81f
A pull request's check composed the nodes before the change's own candidate builds ended, and read the running node-engine's "wanted at <fp>, of which the builder holds no done build yet" as the change's refusal (met twice on 2026-11-07: mesh-catalog #624 and mesh-delivery #163; issue 1921 notes 72 and 75). ADR 0603 §10 says the check waits for them (builds_not_ended).
Cause: the checker built its case from the indexer's first candidate write, which carries no fp2 yet (the merge preview follows on the same heads), and only a try waited for the previewed candidate; so buildsOfTheCheck skipped every module and awaitBuilds waited on nothing.
Fix (mesh-delivery-checker): internal/check/judge.go runs takeTryCandidate also for a pull request's check whose case still holds a module waiting on its preview, within the build-wait bound; WaitsOnPreview moves into internal/check. A build not ended within the bound is named and the composition marked not run (the engines are not asked); a check with no previewed candidate within the bound likewise, saying its manifests were judged from the indexer's first write. A not-run composition keeps a pass with the tests passed and says "composition not judged: …" on the status (as a compose error and a node without an answer do, ADR 0593 §9). A check that has its fingerprints does not wait; every wait is bounded (at most two build-wait bounds).
Changed behaviour of a try, said here: when a build runs late, a try is now not composed and so no pass (try.go), where before it composed without that build.
The first check (3f9acf02) failed only in the composition, from the fault this fixes (the checker module's own build was done minutes later); the operator's Decline of 13:56 was meant for another ask, so the review's note on judge.go's comment and words is pushed as c0da09d8 to ask again.
Quick fix named: read the candidate again before waiting on builds. Thorough fix, chosen: the check judges only the previewed candidate, as a try does, and a late builder is never read as the change refusing. Left for later (notes on issue 1921): the node-engine's "no done build yet" as a held module state; the noPreview words copied from the indexer belong in the candidate's contract.
Tests: two rows in aChangeToABuildModuleOrBaseNamesTheModulesBuiltOnIt (composition_test.go), each failing without the fix; no new test function; no module.json changed.
Reviewed-by: mesh-code-reviewer@shanks at c0da09d81f6e30c4135848811c9b7ca70ab11fa9
https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
mesh/check failed: novox: not composed on novox: mesh-delivery-checker: frombus: mesh-delivery-checker is wanted at src… | 3f9acf022325 on b719dc0ecf27
The indexer writes a pull request's candidate first from its pull message alone, every module's
fingerprint "no merge preview is computed", and the fingerprints only with the preview, on the same
heads. A check that began on that first write kept its case: it waited on no build, said nothing,
and the engines, reading the previewed candidate, refused the module as not yet built (mesh-catalog
#624, mesh-delivery #163). Such a check now takes the previewed candidate before it judges the
manifests, waits on the builds and composes, as a whole try already does.
A build not ended within the build-wait-bound is named and the change is not composed, never an
engine's refusal of a fingerprint it has no done build of read as the change's.
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
Deliverynovox/mesh-delivery@c0da09d81f6e — merged since 2026-11-07T13:28:41Z
Source — source.main moved to novox/mesh-delivery@6bc232eb78. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.
Transitions
2026-11-07 13:22 (new) → proposed (announced): novox/mesh-delivery#164's head announced
2026-11-07 13:22 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-07 13:28 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@c0da09d81f6e` — **merged** since 2026-11-07T13:28:41Z
**Source** — source.main moved to novox/mesh-delivery@6bc232eb78b9. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves.
**Transitions**
- 2026-11-07 13:22 (new) → proposed (announced): novox/mesh-delivery#164's head announced
- 2026-11-07 13:22 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-07 13:28 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: not merged. The merge of this pull request into main at 3f9acf0223 was declined: the operator, via telegram (user id verified), chose Decline. A new head asks the operator again.
mesh-delivery: **not merged.** The merge of this pull request into main at 3f9acf0223259b709cae5018f38fb05bc37dc6a8 was declined: the operator, via telegram (user id verified), chose Decline. A new head asks the operator again.
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.
A pull request's check composed the nodes before the change's own candidate builds ended, and read the running node-engine's "wanted at , of which the builder holds no done build yet" as the change's refusal (met twice on 2026-11-07: mesh-catalog #624 and mesh-delivery #163; issue 1921 notes 72 and 75). ADR 0603 §10 says the check waits for them (builds_not_ended).
Cause: the checker built its case from the indexer's first candidate write, which carries no fp2 yet (the merge preview follows on the same heads), and only a try waited for the previewed candidate; so buildsOfTheCheck skipped every module and awaitBuilds waited on nothing.
Fix (mesh-delivery-checker): internal/check/judge.go runs takeTryCandidate also for a pull request's check whose case still holds a module waiting on its preview, within the build-wait bound; WaitsOnPreview moves into internal/check. A build not ended within the bound is named and the composition marked not run (the engines are not asked); a check with no previewed candidate within the bound likewise, saying its manifests were judged from the indexer's first write. A not-run composition keeps a pass with the tests passed and says "composition not judged: …" on the status (as a compose error and a node without an answer do, ADR 0593 §9). A check that has its fingerprints does not wait; every wait is bounded (at most two build-wait bounds).
Changed behaviour of a try, said here: when a build runs late, a try is now not composed and so no pass (try.go), where before it composed without that build.
The first check (
3f9acf02) failed only in the composition, from the fault this fixes (the checker module's own build was done minutes later); the operator's Decline of 13:56 was meant for another ask, so the review's note on judge.go's comment and words is pushed asc0da09d8to ask again.Quick fix named: read the candidate again before waiting on builds. Thorough fix, chosen: the check judges only the previewed candidate, as a try does, and a late builder is never read as the change refusing. Left for later (notes on issue 1921): the node-engine's "no done build yet" as a held module state; the noPreview words copied from the indexer belong in the candidate's contract.
Tests: two rows in aChangeToABuildModuleOrBaseNamesTheModulesBuiltOnIt (composition_test.go), each failing without the fix; no new test function; no module.json changed.
Reviewed-by: mesh-code-reviewer@shanks at
c0da09d81fhttps://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
Delivery
novox/mesh-delivery@c0da09d81f6e— merged since 2026-11-07T13:28:41ZSource — source.main moved to novox/mesh-delivery@6bc232eb78. 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.mesh-delivery: not merged. The merge of this pull request into main at
3f9acf0223was declined: the operator, via telegram (user id verified), chose Decline. A new head asks the operator again.