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-toolsmerged 20 commits from feat/l3-final into main2026-11-04 00:23:50 +00:00
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
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
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
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
Deliverynovox/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.
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`.
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.
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
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.
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:
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
70ade15c36Pushed-by: lead-47@shanks
https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
Delivery
novox/mesh-delivery@70ade15c36eb— merged since 2026-11-04T00:23:55ZSource — source.main moved to novox/mesh-delivery@dd90a26251. Whether it reached the machines is
mesh-delivery-view's, derived fromsource.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@7fd9d893c0Transitions
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
cbbc10871fwas declined: the operator, via telegram (user id verified), chose Decline. A new head asks the operator again.