L3 final: verb, reader-capability and bus-state edges; one unreadable manifest holds only its logins; the indexer holds mesh-catalog (ADR 0614, ADR 0604, issue 774) #149

Merged
mesh-tools merged 20 commits from feat/l3-final into main 2026-11-04 00:23:50 +00:00
Member

One delivery group, branch feat/l3-final in mesh-sdk, mesh-delivery, mesh-catalog, mesh-tools and mesh-host: the final release of design 47's step L3 (issue 774, with 1367 and 1585). Records: ADR 0614 (accepted), ADR 0603, ADR 0601, ADR 0604.

This member:

  • The module graph carries verb and bus-state edges, and every verb edge on a cycle is left out, from either side (ADR 0614 §2, §3, §5). The check's cycle refusal counts waits and bases only (§6).
  • The indexer writes the graph's new fields and each manifest's reader needs with its verdict (§4).
  • Assigner: a want waits on an unserved verb (rule 8), on a reader capability the node's engine lacks (rule 7; an engine that states nothing reads the baseline), and on bus state until a healthy build offering it runs (rule 8; the module offering bus-state itself never waits).
  • Checker: names a changed build module that invokes a verb no running build serves (§7).
  • Grants part: a manifest with no verdict yet, or a value that cannot be read, holds only that module's users, named unreadable (§8). It reads and follows mesh-delivery-indexer.verdicts.
  • view_tiers names each wait by its edge and lists left-out edges.
  • Words back: sdk/toolrunner goes; the judge and the grants part ask catalogue.IsToolRunner again.
  • The indexer claims the seat mesh-catalog and serves modules, module, provides and dependents (ADR 0604 §2).
  • After check 278aa5f0ccbe failed on stale verdicts (issue 774 notes 108-109): the indexer judges again a pull's manifest digests, and at its start every refused or waiting verdict another judge made; indexer_judge takes a digest. quick (new manifest bytes, in mesh-catalog and mesh-tools) and thorough (this) both chosen, because the running indexer takes in the merge.
  • Every go.mod pins mesh-sdk 85ba0a9a70d8.

Not in this release: ADR 0614 §4's check half (D8), issue 774 note 105.
Accepted limits: a verb counts as served by a healthy build on any node, so a node seat's verb is not ordered per node; a verb with no server in the graph holds nothing. A repeated refusal keeps the older judge's name, so it is judged again at each start and pull (4 today): a subtask on issue 774.
Tests: net zero test functions (876). Three review rounds.

Reviewed-by: mesh-code-reviewer@shanks at 70ade15c36
Pushed-by: lead-47@shanks

https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn

One delivery group, branch feat/l3-final in mesh-sdk, mesh-delivery, mesh-catalog, mesh-tools and mesh-host: the final release of design 47's step L3 (issue 774, with 1367 and 1585). Records: ADR 0614 (accepted), ADR 0603, ADR 0601, ADR 0604. This member: - The module graph carries verb and bus-state edges, and every verb edge on a cycle is left out, from either side (ADR 0614 §2, §3, §5). The check's cycle refusal counts waits and bases only (§6). - The indexer writes the graph's new fields and each manifest's reader needs with its verdict (§4). - Assigner: a want waits on an unserved verb (rule 8), on a reader capability the node's engine lacks (rule 7; an engine that states nothing reads the baseline), and on bus state until a healthy build offering it runs (rule 8; the module offering bus-state itself never waits). - Checker: names a changed build module that invokes a verb no running build serves (§7). - Grants part: a manifest with no verdict yet, or a value that cannot be read, holds only that module's users, named unreadable (§8). It reads and follows mesh-delivery-indexer.verdicts. - view_tiers names each wait by its edge and lists left-out edges. - Words back: sdk/toolrunner goes; the judge and the grants part ask catalogue.IsToolRunner again. - The indexer claims the seat mesh-catalog and serves modules, module, provides and dependents (ADR 0604 §2). - After check 278aa5f0ccbe failed on stale verdicts (issue 774 notes 108-109): the indexer judges again a pull's manifest digests, and at its start every refused or waiting verdict another judge made; indexer_judge takes a digest. quick (new manifest bytes, in mesh-catalog and mesh-tools) and thorough (this) both chosen, because the running indexer takes in the merge. - Every go.mod pins mesh-sdk 85ba0a9a70d8. Not in this release: ADR 0614 §4's check half (D8), issue 774 note 105. Accepted limits: a verb counts as served by a healthy build on any node, so a node seat's verb is not ordered per node; a verb with no server in the graph holds nothing. A repeated refusal keeps the older judge's name, so it is judged again at each start and pull (4 today): a subtask on issue 774. Tests: net zero test functions (876). Three review rounds. Reviewed-by: mesh-code-reviewer@shanks at 70ade15c36eb13f2570ed1f4226d970b7600dc7d Pushed-by: lead-47@shanks https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
mesh-tools added 19 commits 2026-11-03 22:50:39 +00:00
Reverts e3ce4b0: node-tools' manifest says tool-runner again, so the judge and
mesh-grants ask catalogue.IsToolRunner and the kept RuntimeModule is not counted.

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
CatalogTools moves into the index package so its row sits in the existing catalog test.

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
Module.Needs is catalogue.ManifestNeeds of the manifest held: written by the merge that takes a changed manifest in, so
no reader takes it as needing nothing before the judge's pass, named again by the judge with the verdict, and carried
over by a write that leaves the digest, as the verdict is. The module value is the one the assigner and the checker
already read.

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
The rules read Module.Needs from the indexer's modules value and each node's stated reads from its record in
`<node>.node` of the haves; an engine stating none is read as the baseline, so the node-engine's own new build, whose
manifest uses only the baseline's words, is not held. The hold is rule 7 (no rule of its own is numbered in this
release, ADR 0614 F2) with words naming the node's engine and each capability, which the want tools and view_tiers
already show.

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
A graph node now names what its manifest invokes and serves, and the verb edges the graph leaves out; a bus-state
entry is a requirement of bus-state. Before and Cycle count the kept verb edges beside bases and awaited provisions,
never a package or toolchain edge. LeaveOut leaves out every verb edge whose ends reach each other, so the builder's
remove and a holder's builder_versions hold nothing and the check never refuses them.

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
The assigner reads which edges are left out from the graph, so one place decides the cycle; the whole graph is
judged, a module past the graph's cap included, before the first GraphMost are written.

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
The assigner reads the indexer's module graph (a new reads line): of what a module invokes it waits only on the edges
the graph keeps and another module serves, so a left-out cycle holds nothing; a verb counts as served once a running
healthy build's manifest serves it. The hold is under the provisions' rule, its words naming the verb, since no reader
knows a rule number of its own yet. Without the graph no want waits on a verb.

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
What the running builds serve is read when a changed build module is met: the node-engine's haves, the builder's
build of each, its manifest. The modules it builds are composed from their manifests, as for any changed build
module, and the composition's warnings name the verb.

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
Rows in the judge's table: two modules invoking each other, or a verb closing a cycle with a provision, are not
refused; a cycle of provisions and one of bases are. The refusal's words name what a part waits on now.

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
The words of a want held on a verb or a reader capability are written and read in one place, the module graph's
package: the assigner writes them, the view names the edge from them. A bus-state wait is named bus state, and each
module's verb edges the graph leaves out on a cycle are listed beside its waits.

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
bus-state is answered with no credential of a consumer's own, so ADR 0603 §5 counts the provider's own have: the
assigner reads, per pass, what the running healthy builds on online nodes offer (their manifests through the builder's
builds) and holds a consumer with a bus-state entry under the provisions' rule until one offers it, handed or not and
with no provisioner key. The words name bus state, and the delivery view names the edge from them.

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
A bus module that both offers and asks bus state waited on itself for good at its first such build; it now waits on
nobody for it, as the graph and catalogue.Awaited leave a module's own provision out.

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
bus-state is offered with no credential of a consumer's own, so the provisioner keys nothing for it; the view showed
every module asking bus state as waiting for that key for good.

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
The indexer writes a changed manifest's value before it judges it; the part now reads the indexer's verdicts.

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
Pin mesh-sdk 85ba0a9a70d8, the group's head of feat/l3-final (issue 774)
mesh/delivery closed: a newer head of the same pull request
mesh/delivery-group group feat/l3-final rejected: composed together: the checker's verdict at the members' heads (278aa5f0ccbe): unit: mesh-provisioner-client/…
mesh/check failed (2): unit: mesh-provisioner-client/cmd/mesh-provisioner-client.TestNatsANodeComingBackFil…; and 1 more | cbbc10871f2e on 007c982ae670
cbbc10871f
Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
Author
Member

Delivery novox/mesh-delivery@70ade15c36eb — merged since 2026-11-04T00:23:55Z

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

Group feat/l3-final: novox/mesh-catalog@6c09be4a70, novox/mesh-delivery@70ade15c36, novox/mesh-host@30b86ea602, novox/mesh-sdk@85ba0a9a70, novox/mesh-tools@7fd9d893c0

  • composed together: pass — the checker's verdict at the members' heads (d6a3e805db4a)

Transitions

  • 2026-11-03 23:56 (new) → proposed (announced): novox/mesh-delivery#149's head announced
  • 2026-11-03 23:56 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-04 00:23 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@70ade15c36eb` — **merged** since 2026-11-04T00:23:55Z **Source** — source.main moved to novox/mesh-delivery@dd90a26251b9. Whether it reached the machines is `mesh-delivery-view`'s, derived from `source.main`, the wants and the haves. **Group** `feat/l3-final`: novox/mesh-catalog@6c09be4a703e, novox/mesh-delivery@70ade15c36eb, novox/mesh-host@30b86ea602a8, novox/mesh-sdk@85ba0a9a70d8, novox/mesh-tools@7fd9d893c0a5 - composed together: pass — the checker's verdict at the members' heads (d6a3e805db4a) **Transitions** - 2026-11-03 23:56 (new) → proposed (announced): novox/mesh-delivery#149's head announced - 2026-11-03 23:56 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-04 00:23 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`.
Author
Member

mesh-delivery: not merged. The merge of this pull request into main at cbbc10871f 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 cbbc10871f2ec4383ad2e08e9a6c01145e927794 was declined: the operator, via telegram (user id verified), chose Decline. A new head asks the operator again.
jschoubben added 1 commit 2026-11-03 23:56:50 +00:00
A refusal an older judge made never stands: the indexer judges again a pull's manifests and, at its start, every other judge's held verdict; indexer_judge takes a digest (issue 774)
mesh/delivery-group group feat/l3-final merged: every member is merged
mesh/delivery merged: source.main moved to novox/mesh-delivery@dd90a26251b9
mesh/check checking 70ade15c36eb on dd90a26251b9 | novox/mesh-delivery#149 in group feat/l3-final
70ade15c36
The indexer judged only the manifests its modules state holds, so a digest refused by an older judge (node-tools
48c729f6 and mesh-provisioner-client a382b9df, refused for words then unknown) kept that refusal once it was back on
the trunk or in a candidate. Each such digest is now judged alone, in the catalogue the trunk holds, writing its
verdict and nothing else; an accepted verdict stays accepted under any later judge (ADR 0579 §1), so only a refused or
waiting verdict by another judge, or none, is judged again.

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
mesh-tools merged commit dd90a26251 into main 2026-11-04 00:23:50 +00:00
mesh-tools deleted branch feat/l3-final 2026-11-04 00:23:50 +00:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/mesh-delivery#149