The running indexer accepts its successor, and a delivery group can be tried whole (issue 1966, issue 1921) #155

Merged
mesh-tools merged 11 commits from fix/1921-group-try into main 2026-11-05 18:34:53 +00:00
Member

Two fixes in one release of mesh-delivery, which the registry group (issue 1966) needs before its own push.

The indexer validates its successor with the seat definitions its revision carries (issue 1966; ADR 0633 §1 and §6 as of v33). The running indexer's manifest validator used a built-in seat list, so it would have refused the registry group's indexer (which serves seat-definitions on mesh-catalog and invokes node-engine.manifest-reads), and the new indexer would never have run. Now the running indexer, and the check's validator (cmd/mesh-judge), use the definitions the merges carry. A refusal is said on take-in.pending (refused) and in indexer_pending. The indexer fixes its own build at its start (ADR 0639 §7), and an indexer that cannot learn it says own build unknown on take-in.pending (§8).

A try is a delivery group's check at exact commits (issue 1921; ADR 0637, ADR 0638, ADR 0639). checker_try takes members (a repository and an exact commit each) and runs the group check's own code: each member merged onto its trunk, both levels, the manifest validator on the members' heads, and the composition on every placed node. It names every failure and owes the forge nothing. The checker says try.started and try.ended on its stream checks (an end is said again until acknowledged); the indexer writes and deletes the try's candidate from them, and recovers open tries at its start through the new tool checker_tries (consumer first, then recovery, then events). New tools: checker_tries, indexer_try_candidates, indexer_drop_try_candidate, indexer_recover_tries. A try's candidate never reaches the assigner, the gate or the forge bridge; the builder builds its fingerprints. The checker places mesh-contracts and mesh-delivery beside mesh-sdk.

Quick or thorough: the thorough fix was chosen for both: the try runs the check's own code, so the two cannot drift; the successor is validated with its own definitions, never the built-in list.

Tested: unit and integration levels green in the indexer, takein, checker, view, watchman and sdk; no test function added (mesh-delivery is over its budget, cases are table rows); both manifest validators (trunk and change) accept every manifest. Ordering edge in this release: the new indexer starts first (a pending revision it names), while the old checker does not serve checker_tries; the recovery then fails loudly and is asked again on the checker's next try event (ADR 0639 §1).

The review: three rounds and a fourth short look limited to round 3's four findings (a bent rule, said to the operator); notes on issues 1921 and 1966.

Reviewed-by: mesh-code-reviewer@shanks at f9578cb7b4

https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i

Two fixes in one release of mesh-delivery, which the registry group (issue 1966) needs before its own push. **The indexer validates its successor with the seat definitions its revision carries** (issue 1966; ADR 0633 §1 and §6 as of v33). The running indexer's manifest validator used a built-in seat list, so it would have refused the registry group's indexer (which serves `seat-definitions` on `mesh-catalog` and invokes `node-engine.manifest-reads`), and the new indexer would never have run. Now the running indexer, and the check's validator (`cmd/mesh-judge`), use the definitions the merges carry. A refusal is said on `take-in.pending` (`refused`) and in `indexer_pending`. The indexer fixes its own build at its start (ADR 0639 §7), and an indexer that cannot learn it says `own build unknown` on `take-in.pending` (§8). **A try is a delivery group's check at exact commits** (issue 1921; ADR 0637, ADR 0638, ADR 0639). `checker_try` takes `members` (a repository and an exact commit each) and runs the group check's own code: each member merged onto its trunk, both levels, the manifest validator on the members' heads, and the composition on every placed node. It names every failure and owes the forge nothing. The checker says `try.started` and `try.ended` on its stream `checks` (an end is said again until acknowledged); the indexer writes and deletes the try's candidate from them, and recovers open tries at its start through the new tool `checker_tries` (consumer first, then recovery, then events). New tools: `checker_tries`, `indexer_try_candidates`, `indexer_drop_try_candidate`, `indexer_recover_tries`. A try's candidate never reaches the assigner, the gate or the forge bridge; the builder builds its fingerprints. The checker places mesh-contracts and mesh-delivery beside mesh-sdk. Quick or thorough: the thorough fix was chosen for both: the try runs the check's own code, so the two cannot drift; the successor is validated with its own definitions, never the built-in list. Tested: unit and integration levels green in the indexer, takein, checker, view, watchman and sdk; no test function added (mesh-delivery is over its budget, cases are table rows); both manifest validators (trunk and change) accept every manifest. Ordering edge in this release: the new indexer starts first (a pending revision it names), while the old checker does not serve `checker_tries`; the recovery then fails loudly and is asked again on the checker's next try event (ADR 0639 §1). The review: three rounds and a fourth short look limited to round 3's four findings (a bent rule, said to the operator); notes on issues 1921 and 1966. Reviewed-by: mesh-code-reviewer@shanks at f9578cb7b41893e1c3b1e69738722a917c1d8425 https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
mesh-tools added 11 commits 2026-11-05 18:27:17 +00:00
The take-in's dry run reads the contracts modules' definitions of the revision's merges and puts them over the seats while it judges; cmd/mesh-judge puts the request's seats over its own. A refusal of the named indexer's manifest is said on take-in.pending and in indexer_pending.

Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
A try names several repositories, each the exact commit asked. A whole try (not narrowed to a level or
tests) runs the group check's own path: the manifest validator, the module graph and the composition on every
placed node, reading the indexer's candidate of the try's group. A try with no such candidate is an error that
says so, never a pass. A try's candidate is no check: the checker leaves it alone and owes the forge nothing.

Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
A whole try has no pull request, yet compose-candidate and the manifest validator read the indexer's
candidate of a group. The indexer reads the checker's tries, writes candidates.<try id> (number 0 per member) from the
previews, judges its manifests with the seat definitions the members carry, leaves try-* alone in the open message,
deletes it when the try ends, and has a tool that reads and one that drops it.

Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
The checker says try.started (members at their commits) and try.ended for a whole try; the indexer writes and
deletes the candidate from them and finds the open tries again at its start through checker_tries, never reading
the checker's state. The try's digests are judged inside the one pass that takes the seats; the definitions of every
contracts module of each member are read; the config declarations leave a try's candidate alone.

Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
mesh-sdk compares its bootstrapped seat definitions with their contracts files, read beside it; the checker
places both, at the group's head for a member, else at the trunk, for a check and for a group try alike.

Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
A try's end is said again until the stream acknowledges it; a waiting try says why; a hand recovery never overlaps a try event (issue 1921, ADR 0639)
mesh/delivery merged: source.main moved to novox/mesh-delivery@abe9ea3796ea
mesh/check being carried to f9578cb7b418 on 8c67adaf9136 | from abe9ea3796ea
f9578cb7b4
Claude-Session: https://claude.ai/code/session_01NcbgfFSnn24M3GcqttoU7i
Author
Member

Delivery novox/mesh-delivery@f9578cb7b418 — merged since 2026-11-05T18:34:55Z

Source — source.main moved to novox/mesh-delivery@abe9ea3796. Whether it reached the machines is mesh-delivery-view's, derived from source.main, the wants and the haves.

Transitions

  • 2026-11-05 18:27 (new) → proposed (announced): novox/mesh-delivery#155's head announced
  • 2026-11-05 18:27 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-05 18:34 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@f9578cb7b418` — **merged** since 2026-11-05T18:34:55Z **Source** — source.main moved to novox/mesh-delivery@abe9ea3796ea. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves. **Transitions** - 2026-11-05 18:27 (new) → proposed (announced): novox/mesh-delivery#155's head announced - 2026-11-05 18:27 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-05 18:34 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-tools merged commit abe9ea3796 into main 2026-11-05 18:34:53 +00:00
mesh-tools deleted branch fix/1921-group-try 2026-11-05 18:34:53 +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-delivery#155