Milestone 47 G: mesh-delivery's part of the one release #214

Merged
mesh-tools merged 643 commits from feat/47-G-join12 into main 2026-11-13 13:08:59 +00:00
643 Commits
Author SHA1 Message Date
jschoubben bc8126efef Count a bus module's running build as offering bus-state while its newer build waits for a yes (ADR 0614 §5, A-352)
mesh/delivery merged: source.main moved to novox/mesh-delivery@93e222a8a8b6
mesh/delivery-group group feat/47-G-join12 merged: every member is merged
mesh/check checking bc8126efefa9 on 93e222a8a8b6 | novox/mesh-delivery#214 in group feat/47-G-join12
A have in phase waiting-yes keeps the build that still runs and that build's health (the node-engine writes the
running fingerprint and composition, and its check's health), and that build serves the bus state. So the
bus-state rule no longer holds a consumer that needs none of the newer build's forms: live, zfs on ace waited
while nats on novox waited for a yes with its old build running. A consumer of a form only the newer build reads
still waits by its kind-4 edge (§50), unchanged.

Builds: ADR 0614 §5 and §2, A-352

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 13:11:28 +01:00
jschoubben 8d40d90950 Fill the catalog's versions from every number the builder gave, numbered or published (design 47 G §372, A-350)
The builder numbers fresh versions without publishing them, so a fill from published alone would number again
below what the builder already said, and one version would name two contents. The fill and its kind 1 and 3 edges
take numbered and published alike; the version-form check and the claimed cut stay. A version the builder numbered
without a digest is filled with none.

Builds: design 47 G §372, A-350, A-351

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 13:06:53 +01:00
jschoubben ff9f089dd8 Merge main into feat/47-G-join11: reader release 3 (D1-D6); G's validator holds
The release copied G's judge rules (D1 queue invokes, D2 seat reads, D3 objects cap, D5 process bus consumes) and
added a transition, foundationAtG, for the parts G puts on the foundation list. Every conflict (busstate.go,
judge_test.go, rules.go, rules_test.go) and the two files merged cleanly (oldsections.go, busstate_test.go) are
resolved to G's form: G's foundation list holds and foundationAtG goes; G's g_words_test rows judge the objects cap.
The tree is G's head 8899b62c.

Builds: design 47 G (the milestone's mesh-delivery part, as at 8899b62c)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 12:50:29 +01:00
jschoubben 8899b62cd4 A-342 judge-node-env: a resource's own MESH_NODE is refused
mesh/delivery-group group feat/47-G-join11 checking: composed again for its members' new heads
mesh/delivery closed: the pull request closed unmerged
mesh/check checking 8899b62cd430 on 7c0492b06c37 | novox/mesh-delivery#209 in group feat/47-G-join11
The node-engine sets MESH_NODE to its node's name in every process it runs; the judge refuses a resource whose env sets it, so the mesh's value is the only one.

Builds: design 47 G A-342

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 09:20:46 +01:00
jschoubben 7044bf5024 A-340 process-bus-consumes: a process hears only what its module consumes, and is granted exactly that
The judge refuses a process's bus consumes its module does not consume (beside V5). The grants part gives such a process the subjects of those events, its own durable <node>_<module>_<process> on EVENTS and on each kept seat event's stream, and their consumer grants, and makes those consumers, as G1 gives the publish.

Builds: design 47 G A-340, A-339; design 42 zfs-owns-zfs V5, G1

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 09:16:25 +01:00
jschoubben 48c7d8252e Merge main into feat/47-G-join11: the zfs group's validator rules and process-bus grants (issue 1979)
The grants of a process's bus on requires (G1) join G's process principal: BusStreams beside G's Serves (AnswersSeat) and MarkedVerbs, and the emits of a requires stream split from the old emits as main does. The rules V1-V5 merged into G's judge whole.

Builds: design 47 G §383 (form kept); design 42 zfs-owns-zfs V1-V5, G1, A-38

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 09:10:44 +01:00
jschoubben 9e98b28844 Validator (A-337): the trunk case counts and declares by every manifest that decodes
mesh/delivery-group group feat/47-G-join11 checking: 15 of 17 member(s) ready
mesh/delivery closed: a newer head of the same pull request
mesh/check checking 9e98b2884440 on 7c0492b06c37 | novox/mesh-delivery#209 in group feat/47-G-join11
A change of migrated manifests was refused against an unmigrated trunk: the
old sections were counted and the seats declared only by the trunk manifests
the new rules accept, so every count was 0 and every declarer gone. The
trunk case now counts and declares by each manifest that decodes, and one
that does not decode is named in the trunk case's verdict.

Builds: design 47 G §712, A-337

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 02:53:57 +01:00
jschoubben bf852f27aa Runner (A-336): a publish heard before its branch's half starts with no steps
A-336 holds for every start of a pipeline: a package-published heard before
its branch's catalog half was held still placed steps from empty entries. Its
pipelines now start with no steps, placed by A-327's path once the half is
held. The hand start already refuses a branch whose half is not held.

Builds: design 47 G §200, A-327, A-336

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 02:43:18 +01:00
jschoubben d827d1abf0 Runner (A-336): a take-in heard before its branch's half starts with no steps
A take-in heard before its branch's catalog half was held placed steps from
empty entries, acting on a branch §200 says nothing new of is acted on. Its
pipelines now start with no steps, and the half becoming held places them by
A-327's path, also when the first view was none yet and the first half comes
from a later catalog-revision.

Builds: design 47 G §200, A-327, A-336

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 02:41:39 +01:00
jschoubben 8af822e3fd SDK (A-324, A-325): one PackedOrFetched for the seed and the runner
The rule of an artifact the builder packs or fetches itself was written twice,
in the indexer's seed and in the runner's placing; both now read the one in
mesh-delivery-sdk's buildstep, the contract of a build step every delivery
part reads.

Builds: design 47 G A-324, A-325

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 02:33:38 +01:00
jschoubben 59b46be0d2 Indexer (A-326): a branch take-in keeps no revision with a refused cycle
The trunk's take-in refused a cycle with a build edge, but a branch other
than the first kept its revision with one. The branch path now applies the
same rule before keeping its entries and says the cycle, as it says heads it
could not read.

Builds: design 47 G §49, §51, A-326

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 02:32:23 +01:00
jschoubben 78cf4e7666 Assigner (A-334): hold a group member's end until the graph says which module is the runner
The runner was learnt in memory at the first pass, so a group's runner
pipeline-ended heard before it was acknowledged and dropped, and the runner
was never wanted ahead of its group. Such an end is now kept unacknowledged
until a pass reads the runner from the acting edges, then taken.

Builds: design 47 G §29, §65, §268, A-334

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 02:30:13 +01:00
jschoubben 8ef266ad6f Runner (A-327): a registration heard before the runner can place from it is not lost
A registration-changed heard before the registrar was stored, or before the
branch's catalog half was held, placed nothing and was gone: its pipelines kept
no steps. The half becoming held and the registrations' first view now place
every running pipeline with no steps whose registration is held (Waiting), and
the first view also picks up each held branch whose readiness came before the
resume callback was stored.

Builds: design 47 G §21, §23, §54, §88, A-327

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 02:30:13 +01:00
jschoubben 36be6f31df Merge main into feat/47-G-join11 (G takes in main before its push)
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 02:16:56 +01:00
jschoubben c68d51b8b5 Assigner (A-334): in a group that changes the runner, the runner's member is wanted on its own end
In a group take-in that changes the runner, the other members' pipelines are held for the new runner, so the
group never ended before the bound and the new runner was never wanted. The runner is the acting part the
others wait on, so it goes first as the node-engine does: its member (the holder of the seat
mesh-pipeline-runner, read from the acting edges) is wanted on its own pipeline-ended once that passed, ahead of
the group; the other members keep the group's end.

Builds: design 47 G §29, §65, §268; A-328, A-334

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 02:16:00 +01:00
jschoubben a90412c7a6 Runner (A-328): never hold the runner's own pipeline for its new version
A take-in that changes the runner held its own pipeline with the others, so its new version could not be wanted
before the 30-minute bound and its change was judged by the old runner. The runner's own pipeline now runs on the
running runner, as a build module's running version builds its successor; its pass lets the new runner be wanted,
whose running releases the held ones. The bound stays as the failure bound, with its finding.

Builds: design 47 G §29, §65, §270; A-328

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 02:12:39 +01:00
jschoubben e557168e6e Runner (A-327): a registration-changed places the steps of its module's pipelines started before it
A pipeline started before its module had a registration kept no step for ever: Resume asks only placed steps.
On registration-changed the runner now places, from the registration, the steps of every running pipeline of
that module that has none, by compare-and-set so once each, asks them and says it; until then the start says
the pipeline waits on its module's registration.

Builds: design 47 G §21, §23, §54; A-327

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 02:11:28 +01:00
jschoubben c2e2ac82fa Indexer (A-333): a package-only cycle is not refused, and no delivery edge ends at a package
The cycle rule A-326 built refused today's trunk catalogue and G's own: a cycle of package edges alone (imports given to
every artifact of a module) and a kind-6 edge into a contracts package closing a cycle. A package is delivered only inside
what uses it, so no edge of kinds 2, 4, 5 or 6 is made into one, and a cycle of kind-1 edges alone is left to the
language's build. The dry run's entries of both catalogues are kept as test data and accepted.

Builds: design 47 G §47, §49, §51; A-326, A-333

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 02:09:34 +01:00
jschoubben df02ee40fd Indexer (A-326): refuse at take-in a cycle with a build edge no build seat's running version breaks
The take-in computes the revision's catalog graph over its dry run and refuses one whose edges hold a cycle with
a build edge (kind 1 or 3), naming every artifact on it, as a refusal by its validation is said; a kind-3 edge out
of a module holding a build seat into an artifact that seat builds breaks the cycle at the running version.

Builds: design 47 G §49, §51, §270; A-326

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 02:06:23 +01:00
jschoubben 73582f92e1 Assigner: the node-engine's want first; the acting-wait check sees cycles across steps
The assigner and the node-engine on one node waited for each other for ever: the assigner's
want in step compose for the new node-engine, the node-engine's in step place for the new
assigner, and the cycle check counted one step at a time, so nothing said it. The node-engine's
own want (the holder of the seat node-engine on the node, read from the acting edges' seat) is now
held by no acting edge, so it is written first and the node's other wants, the assigner's own
included, wait for it. Cycles finds a cycle across steps as well as within one, and a want held
on a cycle no rule breaks is the finding acting-cycle (scope module, id <node>.<module>), naming
each edge's step, cleared by the next pass that finds it on none.

Builds: design 47 G §49, §268, §272, A-323, A-330

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 01:56:48 +01:00
jschoubben ab31847d4e Seed and runner: an archive or upstream artifact has no steps; a module no seat builds is left out by name
The seed refused whole at the first artifact with no build seat: 134 archives and upstream
artifacts have none, so no first registrations were ever proposed. The seed now calls no build
seat's steps for an archive or upstream artifact with no language and seeds its lint, unit and
integration as bypass; the runner places those steps bypassed, asked of no one. A module with an
artifact whose language or kind no build seat serves is left out of the seed alone, named in the
ask beside the unprotected branches, with the finding seed-left-out (scope module, id the module)
naming the artifact; it clears only when a later seed finds a build seat for every artifact of
it, or the module left the catalogue.

Builds: design 47 G §8, §23, §28, §535, §704, A-324, A-325, A-329

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 01:52:07 +01:00
jschoubben 5812a2f97d Runner: an image artifact's steps are asked of the seat on kind:image
Place named an image's build seat by "kind: image", a form no seat definition writes, so every
image artifact's lint, unit and integration steps ended could not run. It now uses the seat
definition's own form, seatdef.OnKindImage ("kind:image"). No other kind constant has the space.

Builds: design 47 G §324, §397

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-13 01:47:23 +01:00
jschoubben 63f944b525 B2 (watchman): invoke the branches follower's three seat verbs
mesh/delivery-group group feat/47-G-join11 rejected: composed together: the checker's verdict at the members' heads (69ffef340e92): mesh-delivery-checker
mesh/delivery closed: a newer head of the same pull request
mesh/check failed (2): mesh-delivery-checker: no published of the tagged version of go-meshconditions of me…; and 1 more | 63f944b52564 on 7221a1e5cd7f
Builds: design 47 G (A-296, A-298)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 23:59:37 +01:00
jschoubben ec7e672c1f B2 (watchman): the wants are followed at the holder of the seat mesh-wants, the indexer's tools at the holder of mesh-catalog
FollowSeat(mesh-wants, wants) replaces the follow by the assigner's module; the pulse and stuck keys name the holder's real
bucket taken at each use (WantsAt, AwaitsWants), a start never waiting for it and the seeded keys of any `<holder>_wants`
kept until the late read (A-321). indexer_pending and indexer_verdicts are asked of the holder of mesh-catalog on each
call. The one catch-all of the seats' events is one handler per seat (A-322), source-moved taken from the branches
follower (AdoptEvent). The manifest consumes the seat's views and the seat-holders view.

Builds: design 47 G A-210, A-318, A-321, A-322, §428

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 23:47:59 +01:00
jschoubben 8e06b6af65 B1 (enrolment): the enrolment's own module is the one the runtime serves it as
enrolment.Module is gone: the finding writer, the reader, the warrant record, the log lines and the ask's bound act name
the served-as module (ownModule, the holder's Module).

Builds: design 47 G A-296, §428

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 23:39:54 +01:00
jschoubben 09e736a687 B1 (view): the view's module is its credential's, in the process and in the tools
viewstate.ViewModule is gone; the process takes cred.Module for its reader and emitter, the tools the served-as module.

Builds: design 47 G A-296, §428

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 23:38:40 +01:00
jschoubben 0fffea89b1 B1 (indexer): the indexer's own name is its credential's module, no constant
index.Module is gone: the indexer and its registry carry the credential's module (findings' observer and ids, its own
entry and graph key, the history subject, the views emitter and reader), the tools take the served-as module.

Builds: design 47 G A-296, §428

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 23:37:54 +01:00
jschoubben 1db4728081 B1 (checker): the checker's own buckets, events and asker are named from its credential's module
CheckerModule and the buckets built on it are gone; check.Bucket names a state of the credential's module, the examiner
takes the module as its asker, the tools take the served-as module, and the tools ask the indexer's read tools of the
holder of the seat mesh-catalog on each call (B2's tool addresses for the checker).

Builds: design 47 G A-296, A-210, §428

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 23:35:14 +01:00
jschoubben 07c13b0b9c B1 (builder): the builder's own buckets are named from its credential's module
The versions, bounds, reserved, publish-queue, acted, toolchains-heard and instances buckets were constants naming
mesh-delivery-builder; ownBucketsOf takes them from the module the credential names.

Builds: design 47 G A-296, §428

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 23:32:42 +01:00
jschoubben 33991dafa9 A3: the view tools' usage reader is built by one function main and its test use
Builds: design 47 G A-128
2026-11-12 23:29:33 +01:00
jschoubben 6f03ceac26 A4: a candidate's added modules take the branch the want's code takes
Builds: design 47 G A-316
2026-11-12 23:29:02 +01:00
jschoubben df766ca1db A2: the git seat's repository fixture names a neutral repository
Builds: design 47 G D3
2026-11-12 23:28:25 +01:00
jschoubben b707508d1e A1: the enrolment reads the node-engine's have in its module form
Builds: design 47 G A-318, A-210
2026-11-12 23:28:19 +01:00
jschoubben 1ce48944c7 D1 (view): the provisioner's provisions are read at the holder of the seat mesh-provisioner
Builds: design 47 G A-318

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 23:15:02 +01:00
jschoubben 81cb2d7ab8 D1 (enrolment): the integration bed reads the seat-form states at the seat list's holders
Builds: design 47 G A-210, A-128

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 23:07:47 +01:00
jschoubben 56be952060 D1 (view): the vault's signers are read at the holder of the seat mesh-vault
The view's trust tool reads the signers in the state of the module holding the seat when it reads (seat:mesh-vault.signers in the manifest's reads); the vault's module constant goes.

Builds: design 47 G §428, A-210, A-128, A-318

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 23:03:31 +01:00
jschoubben b289c0d361 D1 (enrolment): the vault's signers and the node-engine's have are read at the holders of their seats
Reads in the seat form seat:<seat>.<state> are resolved by the seat list's holder when read; the manifest reads and invokes follow (seat:mesh-module-assigner.assignments for the holder lookup). The vault's module name goes.

Builds: design 47 G §428, A-210, A-128, A-318

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 23:02:50 +01:00
jschoubben cd9a373067 D1 (view): the view's tools ask the indexer, the assigner and the wants' bucket of the holders of their seats
The tools program asks indexer_read_*, assigner_read_* and indexer_pending of the module holding the seat mesh-catalog or mesh-wants when it asks, and names the wants' real bucket from that holder at each status; the assigner's module constant goes.

Builds: design 47 G §428, §717, A-210, A-300, A-318

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 23:01:34 +01:00
jschoubben 058b2458fb §626 (teller, bridge, runner, watchman): the own-module guards are folded into an existing test each
The four TestNoCode...OwnModule functions became helpers called by TestTheNamesAreTheManifests, TestMergeCallsTheToolOnceAndWritesTheMergedMessage, TestTools and TestNoTickerTimerOrSleep, so no module ends with more tests than its merge base for them.

Builds: design 47 G §626, §428, A-296

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:58:54 +01:00
jschoubben 9af3540d28 A-316, A-317 (assigner): the passer writes each candidate with the version and parts of the modules it adds; the propose verb writes the proposal alone
Builds: design 47 G §379, §421, A-316, A-317

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:56:06 +01:00
jschoubben 54b9b2ce85 D1 (assigner): the first-view test grants seat-holders to the callers the manifest names
Builds: design 47 G §717, A-298, A-302

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:53:23 +01:00
jschoubben bc8d3e1499 D1 (assigner): the states the views family says are named when it starts, not when the package loads
viewedStates read the module before the start had said it, so every name began with an underscore at run time; it is a function now.

Builds: design 47 G A-296, §428

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:51:06 +01:00
jschoubben de24c7f07c D1 (pipeline runner): the runner's tools take their module from the runtime that serves them
The first views tools name the module the runtime serves them as, not a constant of the runner's name; a guard test finds none in its code.

Builds: design 47 G A-296, §428

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:48:09 +01:00
jschoubben 3d058af14c D1 (teller): the teller names its own module from its credential's
Its conditions' keys, its asks' subjects, its reader and emitter, its ends bucket and its tools' first views take the module its credential names (the tools: the module the runtime serves them as) instead of constants of its name; a guard test finds none in its code.

Builds: design 47 G A-296, §428

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:47:50 +01:00
jschoubben 1883e6e3e4 D1 (forge bridge): the bridge names its own module from its credential's
Its states' buckets, its stream's subjects and its finding observer take the module its credential names (the tools: the module the runtime serves them as) instead of constants of its name; a guard test finds none in its code.

Builds: design 47 G A-296, §428

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:47:02 +01:00
jschoubben d7b53bf2f1 D1 (watchman): the watchman names its own module from its credential's
Its finding observer, its dead-letter consumer, its reader's module and its tools' first views take the credential's module (the tools: the module the runtime serves them as) instead of constants of its name; a guard test finds none in its code.

Builds: design 47 G A-296, §428

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:46:17 +01:00
jschoubben 2a85e55d4e D1 (assigner): the assigner names its own states from its credential's module
Its buckets (the seat's states, wants, asks, puts, waits, findings, policies, pins, marks, first views) are functions of the module SetModule was told at its start (its credential's; the tools program's served-as), no longer constants of its name.

Builds: design 47 G A-296, §428

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:44:33 +01:00
jschoubben 39db267630 D1 (builder): the builder names its own module and buckets from its credential's module
Its states' buckets, its finding observer, its build log entries and its step asks' asker take the credential's module (tools: the module the runtime serves them as) instead of constants of its name; builds.StateBucket/BuildsBucket replace the Bucket constants. The readers of the builds bucket (checker, view, grants) still name the builder: the next D1 subtask finds it by the seat mesh-builds.

Builds: design 47 G A-296, §428

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:34:08 +01:00
jschoubben 2271b805bb D5 (sdk, indexer): the answer store is the steps state's own steps-objects; a state template takes objects-max-mib
Builds: design 47 G A-313, A-314

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:30:36 +01:00
jschoubben d2ba93abcd D4 (sdk, checker): a compose request's manifest names its fingerprint beside its digest
composer.Manifest gains Fingerprint (wire {"digest","fingerprint"}) and Fill's get takes the Manifest. The checker fills it from a
pull's fingerprint, else from the trunk revision's entry of the module (repoModules keeps each entry's fingerprint).

Builds: design 47 G A-310

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:22:07 +01:00
jschoubben 4ba52d9ab7 D3 (contracts): the fixtures and contract tests G adds name roles, not nodes and the operator
Nodes read anchor, home-server, laptop, workstation (in the order the node names sorted) and a person reads alice.

Builds: design 47 G A-296 (review round 2 D3)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:18:30 +01:00
jschoubben b056f32c13 D2 (view): build_usage reads the build seats' steps and pauses as seat reads in the holder's state
The manifest reads seat:<seat>.steps and .pauses, which the grants part resolves, and the tools read <holder>.steps and <holder>.pauses.

Builds: design 47 G A-82, A-128

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 22:17:20 +01:00
jschoubben 406e17446f The runner's process is judged by its unit, not by its own tool runner_health
A process is never judged by a tool of its own; the pipeline runner's health is now the unit, as every other process of
mesh-delivery declares. runner_health stays a tool.

Builds: design 47 G A-305; ADR 0227 rule 8, ADR 0240 rule 2

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 21:49:32 +01:00
jschoubben 7b9904b1fe The checker puts every ask of a phase at once, then waits for them all
judgeAll put one check ask and blocked in its wait before the next. Within each of its two phases (the modules that are
not TypeScript, then the TypeScript modules once groupPackages is read) every ask is now put first and waited for on its
own goroutine; a declined ask is put again there as before, and the steps are judged in the order the asks were put,
so the verdict reads as before whatever order they end in. The ask splits into prepareAsk, putAsk, wait and judgeAsk;
the placed ask of unmet packages stays one after the other.

Builds: design 47 G A-304, ADR 0525 §4

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 21:39:20 +01:00
jschoubben f468aa75e8 N3 (mesh-enrolment): the enrolment names no bucket of its own
Its state enrolments is the runtime's bucket of the credential's module; the constant `mesh-enrolment_enrolments` was read
by its tests alone, which now name the bed's bucket themselves.

Builds: design 47 G A-296

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 20:40:34 +01:00
jschoubben 3ac9947dc8 N3 (forge bridge): the bridge names its own buckets heads and inputs from its credential's module
Both were constants of the module's name; they are now `<module>_heads` and `<module>_inputs` of the credential's module.

Builds: design 47 G A-296

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 20:40:14 +01:00
jschoubben 29517d702c §717 (3), the status view follows the assignments, the wants and the asks by their seats, at the holders the seat-holders view names
The status view's process followed mesh-delivery-assigner's assignments, wants and asks by module name. It now follows them
through views.ProcessReader.FollowSeat with the catalog half's holder function (A-298), its pictures named in the seat form
(mesh-module-assigner_assignments, mesh-wants_wants, mesh-wants_asks); the watchman's stuck key of a want, which names the
holder's real bucket, is read at each use from the holder followed (ProcessReader.HolderBucket), and the tools program,
which reads the wants of the assigner's tool (A-300), names that module's bucket. The process names no module of the
assigner. The bed serves the seats' views at stand-in holders the claimant's seat-holders view names.

Builds: design 47 G §717, A-298, A-300, A-303 (corrected)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 20:38:44 +01:00
jschoubben 43f6b57ab2 Main's subject takes the checker's check and recheck again, as A-184 says until it goes
The asker rename (d29e1426) let main's subject, which names no asker, take only a build and a run, so a holder refused the
checker's check asks ("the kind check is not taken on main's subject"), and seven of the checker's eight integration tests
failed. Until main's subject goes it also takes the checker's check and recheck; a step there is still refused.

Builds: design 47 G A-184, §543

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 20:30:13 +01:00
jschoubben cd8afa47d9 The teller reads the router's record outside its lock, so a catch-up never holds a warrant
catchUp held the teller's lock across the router's record read (Where, through operatorask.Bucket and seatlist.HolderOf,
which retries); with no answer it blocked the module's event pull, whose Said waits on that lock (met when an ask arrived
inside a first view). OnAssignerAsk now catches up after it let go of the lock, catchUp takes the lock only once the record
is read (an asking no longer open by then is left), and OnCurrent reads the records of the asks asked again outside the
lock in the same way.

Builds: design 47 G §717 (the teller raises the assigner's asks whether or not anything else answers, issue 1906); principle 3

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 20:19:06 +01:00
jschoubben 04bfc92d3d §717 (3), the builder, the checker and the indexer follow the assignments by the seat, at the holder the seat-holders view names
buildrun's AssignerHolder asked the seat's verb for the holder every 5 seconds. The builder and the checker now follow
mesh-module-assigner's assignments through views.ProcessReader.FollowSeat with the catalog half's holder function (the
checker gains the catalog half's reader of §614 for it); the indexer reads the claimant from its own catalog
(Indexer.ClaimantNow) and follows its seat-holders view again at each refresh of its build modules. AssignerHolder goes; the
manifests consume the seat-holders view (the checker also the catalog half's events and verbs), and the assigner's
seat-holders first-view tool answers the checker and the indexer. The beds give each part a claimant and a seat-holders view
in place of the seat verb's answer; the indexer's beds hold the claimant from the start, so the merge test reads the newest
revision.

Builds: design 47 G §717, §614, A-298, A-302

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 20:17:36 +01:00
jschoubben 2165b3b296 §717 (3), the teller: it follows the asks and the answers by their seats, at the holders the seat-holders view names
The teller followed mesh-delivery-assigner's asks and mesh-delivery-view's answers by module name. It now gains the catalog
half's reader (§614), whose claimant of mesh-module-assigner's seat-holders view is its holder function (A-298), and
follows mesh-wants' asks and mesh-delivery-view's answers through views.ProcessReader.FollowSeat, each apart (issue 1906):
started before any module holds a seat it waits, and follows the holder once it is placed and as it moves. Its code names
neither module; its manifest invokes the catalog half's revision and the gate's source, and consumes the seat-holders view,
catalog-revision and source-moved; the assigner's seat-holders first-view tool answers the teller (A-131's module form).

Builds: design 47 G §717, §614, A-298, A-295, A-296

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 19:55:29 +01:00
jschoubben 8fa8289a6a §717 (2), the status view: it follows the assigner's views by their seats
The status view consumes seat:mesh-wants.views.asks, seat:mesh-wants.views.wants and
seat:mesh-module-assigner.views.assignments in place of the three mesh-delivery-assigner.views
entries, and its process takes each first view from the tool named for the state; its invokes
lose assigner_read_asks and assigner_read_assignments, and its tools program keeps
assigner_read_wants for a want's key and history reads (A-300).

Builds: design 47 G §717, A-300

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 19:36:17 +01:00
jschoubben c3fd29a64c §717 (1): the status view's answers are a view of the seat mesh-delivery-view
The Delivery contracts module defines the seat mesh-delivery-view (scope mesh, grain whole,
ADR 0540): no verb, no seat event, no family, one state answers (template state, history 5,
view), one key form per kind of mesh-wants' asks with .view after it (A-299), its value the
answer (v, asking, option, words); seatgen writes its Go and TypeScript packages, and the
module's artifacts name them. The status view claims the seat (scope mesh, serves none), its
first-view tool answers (views.FirstViewTool, callers the teller, A-301) replaces
view_read_answers, and it deletes its answer once the ask's key has left asks. The teller
follows the answers by seat:mesh-delivery-view.views.answers and invokes nothing of the view's.

Builds: design 47 G §717, A-299, A-301

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 19:35:37 +01:00
jschoubben 1bac48e84e §717 (2): the assigner's asks and wants are views of the seat mesh-wants
The seat mesh-wants' definition gains the state asks (template state, history 5, view), its key
forms the seven kinds' keys as the assigner's asks package writes them (hold, restore, backup,
record, outside, revert, assignments) and its value the ask as the assigner composes it; its
wants gains view. The assigner's first-view tool asks replaces assigner_read_asks, its callers
the teller and the status view; the status view joins the callers of wants and assignments.
The teller follows the asks by seat:mesh-wants.views.asks and invokes nothing of the assigner's.
The status view's part waits on a question (its tools ask assigner_read_wants).

Builds: design 47 G §717, A-299

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 19:29:57 +01:00
jschoubben cf93d30150 Names N3 (indexer): the indexer names its own buckets from its credential's module
Its 26 `<Module>_<state>` bucket constants (candidates, manifests, verdicts, packages, taken, the
control records, pins, pending and the rest), its consumers, findings and first views were named
from the constant Module; they are now index.Bucket(cred.Module, <state>), and its words name
the state where they named the bucket.

Builds: design 47 G A-296

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 19:18:56 +01:00
jschoubben 0de534c692 Names N3 (view): the status view names its own buckets from its credential's module
Its states answers, reach and waits (viewstate WaitsBucket, ReachBucket, ViewAnswersBucket), its
first views and its marks were named from the constant ViewModule; they are now
`<cred.Module>_<state>` (viewstate.BucketsOf), and the model is made for its module.

Builds: design 47 G A-296

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 19:14:55 +01:00
jschoubben e8d1bf96be Names N3 (watchman): the watchman names its own buckets from its credential's module
Its states presence, pulse and stuck and its first views were named from the constant
WatchmanModule; they are now `<cred.Module>_<state>` (watch.BucketsOf), and the watchman's
stuck keys of presence take its own presence bucket's name.

Builds: design 47 G A-296

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 19:09:46 +01:00
jschoubben 4938fb2d73 Names N2b: every seat list part's callers name seats, resolved from the seat-holders view
The builder, its tools bundle, the assigner (process and bundle) and the view's tools bundle answered
their seat list's again tool to the modules node-tools and mesh-healers. Their lists are now the
operator, seat:node-tool-runner and seat:mesh-healers, resolved by a holder function:
- meshcatalogclient's Branches.Claimant (moved from the builder's versions.HolderOf, which now asks it)
  names the claimant of mesh-module-assigner from the trunk's half, and Branches.SeatHolders follows
  that claimant's seat-holders view through the part's wiring. It drops the view and follows the new
  claimant's on a catalog change, asks nothing on a timer, and answers seatlist.HoldersIn.
- the assigner answers HoldersIn from its own seat-holders picture (its world in the process, the
  watched copy in the bundle).
The builder's and the view's manifests consume seat:mesh-module-assigner.views.seat-holders. The
assigner's seat-holders first-view tool answers both, by module as A-131 has it.

Builds: design 47 G A-298, A-295, A-296, A-210, A-131, §717, §616, §614

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 19:05:51 +01:00
jschoubben 5943cd87a1 Names N3 (teller): the teller names its own buckets from its credential's module
Its states answers, asked, widens-said, first-views, teller-marks and findings were named from the
constant tellerModule; they are now `<cred.Module>_<state>`, so the part keeps no name of its own
module for what it owns.

Builds: design 47 G A-296

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 18:58:14 +01:00
jschoubben 03b7b6ed24 A-297: the runner's step ask id takes the usual ask id form, so the holders accept it
The runner's step ask id was `step-<24 hex>`; every build seat holder's CheckAskID refuses it (base 36
milliseconds and six hex digits), so no placed step could be accepted. AskID now opens with base 36 of
the pipeline's start time in milliseconds and ends with six hex digits of the sha256 of the pipeline,
the artifact and the step: the same placement makes the same id at every start. A rerun uses its own
time.

Builds: design 47 G A-297, A-232, A-111

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 18:50:29 +01:00
jschoubben c529ca259f seatgen -check passes at the join: the catalog client's test imports no bus client
branches_test.go named nats.ErrNoResponders for a call that reached no holder, so the generator's
check refused the contracts module ("a client uses only its seat's contract and mesh-sdk's runtime",
ADR 0625 §3), met twice at join 11. The test now gives the words a runtime passes that refusal on
with, which busretry.Undelivered reads the same way.

Builds: design 47 G A-170 (the regenerated contracts, checked in place)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 18:40:16 +01:00
jschoubben 13edd34daa Names N1: the builder fixes no module name of the gate, the checker or the indexer
The three constants named modules the builder no longer calls or reads: the gate and the checker
by nothing, the indexer only by a test's stand-in of a tool the builder stopped calling when the
catalog half named the requirements (A-119). A deletion: nothing reads them.

Builds: design 47 G §7, §428, A-210

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 18:39:26 +01:00
jschoubben d29e1426d0 Asker rename R2: every asker of a build seat asks under its seat's own name, and its step is keyed so
A-163: the asker in `accept.<queue>.<asker>` is the asking seat's name (mesh-pipeline-runner,
mesh-catalog, mesh-wants, mesh-builds), never a nickname: the builder asks as mesh-builds (was
"builder"), the indexer's validation as mesh-catalog (was "indexer"), the assigner's runs as
mesh-wants (was "assigner"), the runner's steps on `accept.check.mesh-pipeline-runner` and
`accept.delivery.mesh-pipeline-runner` (were `accept.check.step` and `accept.delivery.step`, where
the holder read `step` as the asker). An asker naming none (the checker) asks on main's subject
(A-184). A build seat's queues are delivery, check and recheck alone (A-170, A-184): buildstep's
AskKinds holds no step, a holder takes a step from check or delivery, and the grants part makes a
worker per queue, never per kind. A holder keys a named ask's step `<asker>.<node>.<id>` and main's
`<node>.<id>` (§481, §483); readers watch their own name's keys. The composition step's step-progress
names the one caller mesh-wants' definition lists for step, read from the seat list (A-294).

Builds: design 47 G §481, §483, §543, §600, A-163, A-170, A-184, A-248, A-294

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 18:37:29 +01:00
jschoubben 4851475773 Asker rename R1: a build seat's streamed kind is sent on its queue's subject, the kind in the body
The generator wrote `accept.<stream>.<kind>` for a kind that rides a stream (step on check and delivery,
run on check), so the runner's step landed under the named worker `accept.check.*` with `step` read as
its asker. A-170 has the kind in the body only: the generated accept subject of a streamed kind is the
queue's, `accept.<stream>`; its generated names stay `<stream>.<kind>`. The three build seats'
contracts and fixtures are regenerated.

Builds: design 47 G §600, A-170, A-184

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 18:23:48 +01:00
jschoubben 93ecfc7f1f A-290 B2: every reader reads a step's answer from its key or the object it names
The shared asker (buildrun.Asker.Wait) answers an ended step whole: a key naming its answer as output-object has it read
through the build seat's verb output on the step's node (Step.Whole) with the asker's Outputs, so the checker's judge,
manifests judge, checking program and compose sandbox read the answer as before; a step whose object cannot be read is
the wait's error. The checker reads its run asks' failed key's answer for a program that exited other than 0. The
checker, the indexer and the assigner read a kept answer through process.Conn.CallFile (A-291), which receives the
verb's chunks; the checker's manifest invokes the three build seats' output.

Builds: design 47 G A-290, A-291, A-254

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 16:50:54 +01:00
jschoubben 386095bd53 A-290 B1: a step answer over the steps state's bound is kept as the object its key names
A step's key keeps its answer only within what the steps state holds per value (kvlimit.ModuleStateValueBytes less
the headers' room). Over it, finish keeps the answer with the holder's KeepOutput as the object output.<ask> in its
outputs store and the key names it in output-object: a check's whole answer, its result emptied; a run's output, the
key keeping the run answer without it. An answer that cannot be kept ends the key failed, saying why. The Puller says
step-ended from the end finish wrote, so the key and the event say one outcome: a run whose program exited other than
0 ends its key failed as well, its answer kept; step-ended names the object finish kept instead of putting it twice.
Step.Whole reads a key's object back through the seat's verb output on the step's node. The part build-step's Step
gains output-object, the verb output says it answers a step's answer; fixtures and the generated contracts follow.

Builds: design 47 G A-290, A-254, §467

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 16:44:07 +01:00
jschoubben 9fdd8a76c2 U2c: a package left unpublished by a build that reserved no version counts as done
The builder's unpublished count held every package without a reference and named the Node
build module for all of them, so a Go package built by a build reserving none (another
watched branch, a manifest with no MAJOR.MINOR, a candidate) left its key never done and
was sent to the wrong seat. A reserving build's package is published under its version or
its build fails, so the count now holds images alone.

Builds: design 47 G A-289, §371

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 16:15:41 +01:00
jschoubben e313248b5f U2b: the reserved version reaches each artifact's build, and a versioned ask names each artifact's registry seat
The ask carried the reserved version (§573), but the build modules' shared run gave each
artifact's build only the artifact's own version, which no asker sets, so no build got
MESH_VERSION and a Go package was packed as a candidate and never published. The run now
gives every build the ask's version, and the builder names the registry seat each artifact
of a versioned build is published through, so a Go package is published under its
reserved version on go-package-registry.

Builds: design 47 G §370, §573, §458; design 51 *Publishing*

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 16:13:13 +01:00
jschoubben 4332246f79 U2a: the builder plans a Go package on the Go build seat instead of refusing it
A module whose only artifact is a Go package (mesh-wireguard's go-overlay) never had a
done build: PlanOf refused every package of language go. The Go build module already packs
and publishes a Go package; the builder now asks it.

Builds: design 47 G §370; design 51 *Publishing*

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 16:13:13 +01:00
jschoubben 1550131792 Join 11: checkermsg carries the go.sum lines of the modules its packages load
01fb2e13 named nats.go and its dependencies in checkermsg's go.mod but left the go.sum
lines uncommitted, so the fetch's proof (both build tags, GOPROXY=off) refuses the
module with "missing go.sum entry" on any clean clone.

Builds: design 47 G (the join's guard rule)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 15:59:04 +01:00
jschoubben c4e8b51694 Join 11: merge mesh-delivery main (the checker previews a member whose fetch merged)
Main brought #208 (24d9c6cd), the quick fix of the checker's preview after a failed
step; G holds the same change in 5fbc366f, so G's side is kept where they meet
(judge.go: G's per-member merged list, no group tag versions). The tree is G's.

Builds: design 47 G A-286

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 15:48:07 +01:00
jschoubben 6e16742446 A-284, A-285: a group's check gives every TypeScript fetch the packages the group changes
The fetch's single `package` and its tagged form go; `group-packages` lists each
TypeScript package a member's merge changes, at the member's head with its
directory there. The checker asks every member's other fetches first, so every
merge's changed paths are known before any TypeScript fetch, and gives each the
whole list; the registry's version stays only for a package no member changes.

Builds: design 47 G A-284, A-285

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 15:30:22 +01:00
jschoubben ee338479ad Join 11: the indexer's seatfiles requires mesh-sdk at the zero version, not at a commit
A go.mod requires a mesh package at the zero version only, and the check builds it against the
group's head or the latest published version (ADR 0573 §2, §4). seatfiles still named mesh-sdk at a
November 4 commit; the fetch proof's new guard refuses that.

Builds: design 47 G (join 11, the check's shut-off build of the group's modules)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 15:19:30 +01:00
jschoubben 5fbc366f1b A-286: a member whose fetch merged is previewed and judged whatever its later steps ended with
A check step that errors after its fetch merged ends failed with its answer (the fetch and the levels so far)
beside its error (steprun askrun.go), and the checker previews the merge from it (judge.go), so a failed level
no longer hides the manifest validator and the composition (try 2: catalog, contracts and delivery were
unpreviewed by a seatgen bootstrap failure, not a conflict). Only a head that does not merge or a fetch that
did not answer stays unpreviewed, and the check says which.

Builds: design 47 G A-286 (hq 41dd30fe)
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 15:19:14 +01:00
jschoubben 01fb2e13ca Join 11: pipeline, checkermsg and meshcatalogclient name every module their packages load
The same gap as restic's in the catalogue: mesh-delivery-pipeline loads nats-server through testbus with neither its
requirement nor its sums; checkermsg loaded nats.go and its requirements with no require line; meshcatalogclient
required klauspost/compress below the version its graph selects. Each now passes go list -mod=readonly -deps -test
against the group's heads with GOPROXY=off, both build tags.

Builds: design 47 G (join 11, the check's shut-off build of the group's modules)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 15:00:49 +01:00
jschoubben e82e5a57ad Join 11: every go.mod requires, at the zero version, each mesh module its packages load
The checker's fetch pins only the zero-version requirements a directory's go.mod names
(mesh-build-go workspace.go goModOf), so a module reached only through another, such as
meshhandacts through meshhandactsclient or mesh-delivery-sdk through meshcatalogclient,
was never downloaded and the shut-off load failed (fetch.go:267). The join's merges had
dropped these indirect requirements that the trunk's go.mod files list.

Builds: design 47 G (join 11, the check's fetch of the group's modules)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 14:07:29 +01:00
jschoubben af772096d7 Join 11: merge origin/main (the indexer says a merged manifest accepted, issue 1966)
sayHeld stays in G's judgeOverHeld, after the written-verdict branch, for a fresh trunk manifest
whose verdict the pass did not write. The test's merged manifest is written as the candidate's
own text ("2.0"): the join's manifest digest is of the raw bytes (meshcatalogclient
ManifestDigest), so "2" was another manifest and the test stopped before the case it adds.

Builds: design 25 bus-state §1 (merged from main)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 14:07:13 +01:00
jschoubben 299f0b56e0 Join 11: the toolchain-change test leaves no old toolchain report for the builder to agree on first
Cause: the bed reports go1.27.1 for both nodes at its start, and the test then reports go1.27.2. The builder's new
durable on EVENTS hears the old reports first, so for a moment it agrees on go1.27.1 (said as toolchain-agreed
go1.27.1 by n1, seen in a run's EVENTS); a netcheck entry heard in that moment is built at its old fingerprint
("the old fingerprint, naming go1.27.1, was built with go1.27.2", integration_test.go:767, twice on 2026-11-12).
The builder acts as ADR 0465 says on what it heard; the bed told it a story the test does not mean. The test now
purges the bed's go reports before its own, and asserts that no toolchain-agreed of go1.27.1 is ever said.

Builds: design 47 G §492, §604, A-282

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 13:26:58 +01:00
jschoubben 347db8d4fd Join 11: the builder sets all of the catalog half's wiring before its views reader starts
The floor wake (half.floor), the builder (half.b), ready and branches.Changed were set after reader.Start, so a
catalog view heard on the reader's goroutine read them while main wrote them: the race detector named
catalog.go:117 against main.go:501 in TestBuilderMakesADoneKeyWithTheDigests. They are now set before the start;
the builder cmd integration package then ran 21 times under -race with no race.

Builds: design 47 G §614, A-119

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 13:26:58 +01:00
jschoubben 339964920b A-282 corrected (join 11): a moved step's bound is written again by a revision-checked update, never a delete
c5a6871f created the key once and never wrote it again, so a step that kept moving was bounded from its first
movement (issue 1930). Arm now creates the key when absent; one ending no earlier is armed already; one ending
earlier is written again by an update against the revision read, carrying the bound's time to live; a waiter
whose update loses reads the key again and takes the newer bound as armed. The test moves a step twice past its
first bound, with two waiters each time, and reads one write per movement, its time to live, and no delete.

Builds: design 47 G A-282, A-115, §544

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 13:16:22 +01:00
jschoubben c663b27848 A-282 (join 11): an ask's step bound key is created once, and a second waiter takes it as armed
stepBounds.Arm deleted the key and created it again, so two builder instances waiting on one ask raced: one's
create met the other's and failed "wrong last sequence", and the ask's build failed (the builder bed's two
instances together). Arm now creates the key only if absent; one already there is armed, and nothing deletes
it to make it again.

Builds: design 47 G A-282, A-115, §544

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 13:13:50 +01:00
jschoubben daa7737392 Item 5 (join 11): an asker's build-seat queue is served by the seat's holders, so the indexer draws its kind-6 edge
An asker names the queue it asks as seat:<seat>.accept.<queue> (A-231); no module's serves lists that form, so
graph.Servers matched nothing and the indexer drew no served-verb edge from a build seat's holders to the asker.
Servers now reads the form through mesh-sdk's catalogue.QueueInvoke and answers every module serving a verb of the
seat; the kind-6 edge asks the module graph's Servers, the one rule, instead of a match of its own.

Builds: design 47 G §544, §605, A-231

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 13:08:40 +01:00
jschoubben 99c21957de Item 4 (join 11): the composition-inputs test guards what each machine was asked
gather asks the machines side by side, and the test's stand-in call wrote one map from each of them: a concurrent map
write, the panic once seen at compositioninputs_test.go:61 (the race detector shows it every run). The record is
guarded; the whole assigner's unit suite runs clean under the race detector.

Builds: design 47 G §354, A-243, A-252

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 13:04:58 +01:00
jschoubben 778bcd0eee Item 2 (join 11): the builder's operator-ask tests check the ask's expiry on the asks' own clock
The asks were made at a fixed time while the channel client checked their expiry against the real clock, so from
2026-11-12 every ask "expires before it is asked". The client now takes the same fixed clock.

Builds: design 47 G §568

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 13:02:03 +01:00
jschoubben 24d0bae793 Item 2 (join 11): the builder's bed declares no build-seat worker beside the SDK's, and answers the seat mesh-builds
The SDK's DeclareAskWorkers now declares each queue's two workers, main's and the named asks' (accept.<queue>.<asker>),
and the puller takes from both; the bed declared main's worker again filtering both forms, which overlaps the named
worker and the work queue refused ("filtered consumer not unique", 15 tests). The kind is a bed declaring by hand
what the SDK declares: the builder's bed was the only one whose own consumer overlaps the SDK's, and now declares
none. Behind it, the builder's seat server admits no caller of mesh-builds.reserved until the seat list holds
mesh-builds' definition (A-278); the bed's seat-definitions answers it from the contracts module's own file.

Builds: design 47 G §544, §600, A-115, A-278

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 13:02:03 +01:00
jschoubben 8e50fab811 Item 1 (join 11): an entry the catalog holder says it holds none of is not-found, so a held want is passed again
A process's call gives the holder's own answer as its error (busretry.Answered); the entries kept by
fingerprint took that for a call that reached no holder and kept the entry asked, so §298's order edge
on the unread entry held the want for good and no pass ran again (the assigner's
TestWantsAreWrittenAndNoDifferenceIs, rule 7 "waits in place for the catalog entry").

Builds: design 47 G §614, §298, A-259, A-260

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 12:56:02 +01:00
jschoubben bec5278a89 Area 7 part 1 (join 11): the assigner's bed takes every seat's events on EVENTS and answers the seat list
The bed's kept streams (running, machine-away, machine-back, version-delivered) took subjects of their own, so a test that
widened EVENTS met "subjects overlap". They now source EVENTS' messages of their subject, as the grants part makes them
(KeptEvent.StreamConfig), and EVENTS takes mesh.seat.*.event.>. The bed answers the seat mesh-catalog's seat-definitions
from mesh-sdk's seatlisttest copy and its verb entry from the catalog half, so the seat server admits a caller once the
list is read (A-278). The composition step test calls input on its subject naming the caller (A-179) and waits for the
seat list read and the sourced running messages. TestTheCompositionStepComposesEachMachineThroughTheBuildSeat passes;
TestWantsAreWrittenAndNoDifferenceIs still fails (rule 7: web on ace held on an unread catalog entry).

Builds: design 47 G §354, §610, A-179, A-278

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 12:38:36 +01:00
jschoubben cdc6e1f521 Item 5, area 8 (join 11): the grants part lets a caller of a marked verb hear its own calls' ends
A holder says a held call's end on its seat's gated-ended, kept last per subject for a day in SEAT_<seat>_gated-ended,
which the grants part makes from the definition seatdef.Resolve gives (A-264). The caller is granted hearing
gated-ended.<caller>.> under its own escaped account name, and an ordered consumer on that stream filtered to it, from its
invokes of the marked verb by name; a module or process that answers a marked verb is granted saying the event to any
caller. No process of mesh-delivery holds a marked verb, so no holder here takes NewGateChannel.

Builds: design 47 G §677, §700, A-264, A-273

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 12:24:48 +01:00
jschoubben 4194e93a67 Area 2 (join 11): every seat verb and build-seat queue a delivery module calls is in its invokes
The grants part grants a seat verb only to a module that names it in invokes (GR8), so a call missing from a
manifest is refused live. Listed every module's seat-verb calls in code (constant clients, seatlist.HolderOf,
operatorask, buildrun's drops and puts) against its invokes: the teller asks who holds operator-channel
(operatorask.Bucket) and the checker drops asks of the image build seat. Every asker of a build seat names the
queues it asks as seat:<seat>.accept.<queue> (A-231): the runner check and delivery, the assigner check, the
builder delivery, the checker check and recheck; the indexer had its entry. The validator judges that form
through mesh-sdk's catalogue.QueueInvoke against the kinds the seat accepts.

mesh-grants: a consumed seat view whose seat has no holder on record grants nothing instead of refusing the whole
module (TestGrants); TestCallersAndWhyRefused and TestSentStoresRead take §610's class defaults.

Builds: design 47 G §544, §601, §610, §616, A-231, A-179

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 12:17:50 +01:00
jschoubben 4f076c6cc3 Area 4 (join 11): the indexer's TestManifestDeclarations reads its readers' invokes in both forms
The readers' invokes are read with mesh-sdk's catalogue.InvokedVerbs, so a long-form {verb, fields} entry (the
assigner's) is read rather than refused by the test's own decode.

Builds: design 47 G A-275, §558

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:56:44 +01:00
jschoubben a59e40c02f A-280: the grants part lists a module's finding-events stream in its membership
For a module that requires finding-events and is bound, the membership lists the stream its binding names, the subject
mesh.bus.<module>.finding-events.{event}.<node> and the finding events, so the tool runner carrying a stdio module (the
enrolment) says an emitted finding event there; the test holds the enrolment's membership.

Builds: design 47 G A-280, A-274, §529

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:56:08 +01:00
jschoubben af96eeba86 A-274: the watchman, forge bridge, teller and view pass their finding-events binding to the finding writer
Each asks the seat mesh-broker's show for its finding-events entry (process.Binding, started without waiting), passes it
as the writer's Bindings and hears the seat's recreated and dropped; the watchman's one handler of the seats' events
hands those two to the binding, since a message has one taker. The teller, view and watchman manifests gain the invoke
seat:mesh-broker.show and consume mesh-broker.recreated and dropped. The forge bridge's and the watchman's whole tests
answer show and read the finding-written under the binding's subject.

Builds: design 47 G A-274, §529, §577, A-13

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:56:08 +01:00
jschoubben 8f7fd39e21 A-277: the manifest validator reads a state's max-mib and judges an approvals state as §677 declares it
The template state takes max-mib (1 to 8192, as the old state section reads it). A state named approvals is refused
without key-ttl true, with ttl-seconds other than 172800 (approval.KeptFor, 48 hours), or with max-mib above 64; with
none declared its bucket takes the default 64 MiB.

Builds: design 47 G A-277, A-270, §677

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:42:16 +01:00
jschoubben db3f07d277 A-278: the assigner, builder, indexer and pipeline runner pass seatlist.Definition to AnswerSeat
Their four copies of the seat-definition function go; each passes its seat list part's reader to mesh-sdk's one.

Builds: design 47 G A-278, A-186

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:39:57 +01:00
jschoubben 7c461a96ae Join 11: merge main (mesh-delivery #206): the checker's compositions cap and drop tool, the assigner's heard reads-changed
G's grants already carry a state's max-mib onto its bucket (Bucket.MaxBytes, §469); main's second copy of that cap in
BucketStreamConfig and Composed is dropped for G's, and main's tests (the declared cap row, the held bucket raised)
are kept. The checker keeps G's version 0.1 (§368) with main's compositions max-mib 256.

Builds: design 47 G §469, §368; A-277 (since mesh-delivery #206 the grants part carries max-mib)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:30:57 +01:00
jschoubben ef142bb8c0 Area 3 (join 11): the runner clears pipeline-waits when its awaited version runs healthy
The finding pipeline-waits was raised at the wait's bound and nothing cleared
it. It now names the awaited runner fingerprint in one evidence entry,
`awaited <fp>`, written when it is raised (A-276), and the runner's hearing of
the node-engine seat's running clears exactly the findings whose entry names
the fingerprint said healthy (A-218), through its held writer, which holds what
its state findings held at its start: a finding raised before a restart is
cleared too, and one awaiting another fingerprint stands. The summary is never
read for it. A clear that fails has the running heard again.

Builds: design 47 G lead answers A-218, A-276 (join 11 area 3)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:24:16 +01:00
jschoubben 2242ae3c46 Area 4 (join 11): buildstep reads no bus, not even through buscalls
The builder's published package reached the bus library through buildstep,
whose KeptBuildsOf took mesh-sdk's buscalls.ObjectInfo, and buscalls now
imports nats.go for its seat chunks. buildstep's layouts, keys and codecs
are read by modules that never touch the bus (its own guard), so the kept
build of one object is judged from the object's own fields (KeptBuildOf,
SortKept) and the build module lists its store itself. The guard now also
refuses a bus library reached through an import, the kind that let this in.

Builds: design 47 G (join 11 area 4: builds TestThePackageReachesNoBus, buildstep's bus-free guard)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:21:29 +01:00
jschoubben bc78e01b6f Area 2 (join 11): the order-wait fixture's machine is online again
The five §298 order-wait tests of b2l (A-245, A-258, A-259, A-260) held no
wait and said none after the merge with b2f: b2l's fixture put ace's presence
as online (presenceValue(true)), and the merge rewrote it as b2f's
heardPresence("ace", true, ...), whose flag says away. With every node away
no module had a canary, so no want moved and no order edge was held (an order
wait starts only on an online node, §268). The fixture now hears ace back;
the order waits are built as those answers have them, unchanged.

Builds: design 47 G lead answers A-245, A-258, A-259, A-260 (join 11 area 2)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:17:22 +01:00
jschoubben 9ff6d98820 Area 6 (join 11): every AnswerSeat caller follows a seat list and its grant
AnswerSeat checks a call's caller against the seat's definition its caller
reads from the seat list it follows (A-186), refusing every caller while the
list is unread. The assigner (mesh-wants input), the builder (mesh-builds
reserved) and the indexer (mesh-catalog input) hand it the definition their
seat list holds once heard; the pipeline runner, which followed none, follows
one over its calls connection and hub, read again once its events are live,
and its manifest invokes seat-definitions and consumes the list's two events.
The runner's and the indexer's integration beds answer the seat list, and the
indexer's input test calls with a caller the bus proved (A-179).

Builds: design 47 G lead answers A-179, A-186 (join 11 area 6)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 11:15:02 +01:00
jschoubben 43de6790af Join 11: the reader release's node-engine claim case names a version G reads
The case main's validator release added names `version` "1", which G's
reader refuses (MAJOR.MINOR, design 47 G §368); it names 1.0.

Builds: design 47 G §368, §508

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 10:45:09 +01:00
jschoubben a1fbd5dfa7 Join 11: the merged heads compile where no area's fix is owed
The join's importers name the delivery repository's moved contracts and sdk
(MV1), node-tools' tests use mesh-sdk's gate, the duplicate node-engine claim
rule of the reader release gives way to G's, and the assigner names its first
watched branch, never a constant. The seat holders' AnswerSeat callers are
area 6's.

Builds: design 47 G join 11 (merge of fix round 11)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 10:41:44 +01:00
jschoubben 6457cf1eba Join 11: the indexer reads a validation's answer with StepEnded.ReadOutput (B5g6 piece 2b)
The validation run's answer is read from the step's end through steprun's
ReadOutput, whole or from the build seat's output object, and the indexer
invokes seat:node-build-go.output for it (A-254); the patch B5g6 left for
the join, applied on the merged heads.

Builds: design 47 G §712, §713; lead answers A-254, A-268

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 10:37:39 +01:00
jschoubben 31662c2af9 Merge branch 'feat/47-G-fix11-b5g7' into feat/47-G-join11 2026-11-12 10:37:21 +01:00
jschoubben 66fc450ae8 Merge branch 'feat/47-G-fix11-b5g6' into feat/47-G-join11 2026-11-12 10:37:21 +01:00
jschoubben 08d38f651b Merge branch 'feat/47-G-fix11-b5j' into feat/47-G-join11
# Conflicts:
#	modules/mesh-delivery-assigner/internal/assigngraph/graph_test.go
2026-11-12 10:37:21 +01:00
jschoubben 4e67d7e99f Merge branch 'feat/47-G-fix11-b5i' into feat/47-G-join11 2026-11-12 10:37:09 +01:00
jschoubben 967b636b74 Merge branch 'feat/47-G-fix11-b4e' into feat/47-G-join11
# Conflicts:
#	modules/mesh-grants/internal/buscompose/users.go
2026-11-12 10:37:09 +01:00
jschoubben 644aa8b46c Merge branch 'feat/47-G-fix11-b4b' into feat/47-G-join11
# Conflicts:
#	modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/graphkept.go
2026-11-12 10:36:56 +01:00
jschoubben 9fae9009c5 Merge branch 'feat/47-G-fix11-b3d' into feat/47-G-join11 2026-11-12 10:36:38 +01:00
jschoubben 9433140931 Merge branch 'feat/47-G-fix11-b2k' into feat/47-G-join11
# Conflicts:
#	modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/main.go
#	modules/mesh-delivery-assigner/manifest_test.go
#	modules/mesh-delivery-assigner/module.json
2026-11-12 10:36:38 +01:00
jschoubben 4c2d8f034c Merge branch 'feat/47-G-fix11-b2l' into feat/47-G-join11
# Conflicts:
#	modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/buildended.go
#	modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/graphkept.go
#	modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/main.go
#	modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/pass.go
#	modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/tools.go
#	modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/world.go
#	modules/mesh-delivery-assigner/internal/assign/wants_test.go
#	modules/mesh-delivery-assigner/manifest_test.go
#	modules/mesh-delivery-assigner/module.json
2026-11-12 10:36:04 +01:00
jschoubben c28d12330e Merge branch 'feat/47-G-fix11-b2f' into feat/47-G-join11 2026-11-12 10:32:18 +01:00
jschoubben d89a6bacc6 Merge branch 'feat/47-G-fix11-b1g' into feat/47-G-join11
# Conflicts:
#	modules/mesh-delivery-contracts/seats/mesh-pipeline-runner/seat.json
#	modules/mesh-delivery-pipeline/cmd/mesh-delivery-pipeline/main.go
#	modules/mesh-delivery-pipeline/cmd/mesh-delivery-pipeline/steps.go
#	modules/mesh-delivery-pipeline/cmd/mesh-delivery-pipeline/verbs.go
#	modules/mesh-delivery-pipeline/cmd/mesh-delivery-pipeline/verbs_test.go
#	modules/mesh-delivery-pipeline/cmd/mesh-delivery-pipeline/views.go
#	modules/mesh-delivery-pipeline/internal/pipeline/start.go
#	modules/mesh-delivery-pipeline/manifest_test.go
#	modules/mesh-delivery-pipeline/module.json
2026-11-12 10:32:18 +01:00
jschoubben 5db642e161 Merge branch 'feat/47-G-fix11-b1f' into feat/47-G-join11
# Conflicts:
#	modules/mesh-delivery-pipeline/cmd/mesh-delivery-pipeline-tools/main.go
#	modules/mesh-delivery-pipeline/cmd/mesh-delivery-pipeline-tools/main_test.go
#	modules/mesh-delivery-pipeline/cmd/mesh-delivery-pipeline/findingwriter.go
#	modules/mesh-delivery-pipeline/cmd/mesh-delivery-pipeline/main.go
#	modules/mesh-delivery-pipeline/cmd/mesh-delivery-pipeline/views.go
#	modules/mesh-delivery-pipeline/go.mod
#	modules/mesh-delivery-pipeline/internal/pipeline/read_test.go
#	modules/mesh-delivery-pipeline/internal/pipeline/start.go
#	modules/mesh-delivery-pipeline/manifest_test.go
#	modules/mesh-delivery-pipeline/module.json
2026-11-12 10:30:22 +01:00
jschoubben 4aaa805f2a Merge branch 'feat/47-G-fix11-b1e' into feat/47-G-join11 2026-11-12 10:28:34 +01:00
jschoubben 2bb1b273fe Merge branch 'feat/47-G-fix11-b6b' into feat/47-G-join11 2026-11-12 10:28:34 +01:00
jschoubben 2551d13cf3 Merge branch 'feat/47-G-fix11-b7' into feat/47-G-join11
# Conflicts:
#	.gitignore
2026-11-12 10:28:26 +01:00
jschoubben 1e00430eef Merge remote-tracking branch 'origin/main' into feat/47-G-join11
# Conflicts:
#	modules/mesh-delivery-indexer/judge/rules.go
#	modules/mesh-delivery-indexer/judge/rules_test.go
2026-11-12 10:28:05 +01:00
jschoubben cfa02ea26e Join 11: refuse a committed program anywhere in the repository
A compiled program reached a commit a second time (the view's 18 MB program at
its module's root, which the command-folder pattern did not cover): the sdk's
nobinaries test refuses every tracked executable, as the catalogue's
checks/nobinaries does, and .gitignore covers a module's root.

Builds: design 47 G join (the kind's guard, fix-a-bug-met-twice)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 10:22:17 +01:00
jschoubben 88285ad5e2 B5g7-2: the indexer takes a pushed message alike with a merged one
Its head stands where a merged message's merge stands: forgeKind, pending refs, the newest load and the revision's head.

Builds: design 47 G §509, §714, A-269

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 10:18:01 +01:00
jschoubben 5355f4826a B5g7-1: the validation's job names no Go module; a Go bundle carries no package
Reverts the Go-bundle package of 53caa3ba; the run's program is the directory ./cmd/mesh-judge under the go.mod the build reads.

Builds: design 47 G §712, §676, §491, A-268

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:58:09 +01:00
jschoubben b58b3a9f6a AS5-5: the whole composition step against a stand-in node-engine and Go build seat
The assigner started whole takes the runner's composition step of a module on three machines, one away: it asks the two others'
engines for their inputs, puts one run ask per machine under its name, the stand-in build seat reads each request by mesh-wants'
input in chunks and says its step-ended with the composer's verdict, and the step's end fails naming the machine that does not
compose, warns of the one away, and keeps no input. The assigner says in its journal when it serves the step and when a machine
goes away or comes back.

Builds: design 47 G §354, §22, §63, §64, §389, A-240, A-252, A-254

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:57:26 +01:00
jschoubben 0d98108bc4 AS5-4: a running composition step says step-progress once a minute
A ticker inside the running step, stopped at its end, says the seat mesh-wants' step-progress.<node> with the ask, the asker
runner, the phase the run is in (fetch while its revision and inputs are read, run while its run asks run, report) and the time.

Builds: design 47 G §496, §603, A-262, A-267

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:54:12 +01:00
jschoubben 4f7206702f AS5-3: the composition step runs one composer request per machine as a run ask and reads its verdict from step-ended
Each machine placing the module on the step's branch is asked compose-candidate for its input; one composer.Request per machine
(depth compose, the one machine, one case change) carries it with the manifests, verdicts and seat definitions of the step's
catalog revision read through mesh-catalog's revision; the request is kept under its run ask (refused at the inputs state's
64 MiB cap, naming the store); one run ask per machine on node-build-go's check queue under the assigner's name, naming no head,
its program the node-engine build's catalog entry (the build each machine runs as its running says, read through entry, or the
revision's where it differs from the trunk's) with the composer's package. The run's end is heard on the build seat's step-ended
and its verdict read through buildstep.StepEnded.ReadOutput; a machine the watchman said away passes with a warning. The step
is served from main.

Builds: design 47 G §354, §22, §63, §64, §389, A-226, A-238, A-240, A-243, A-252, A-254, A-261

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:52:14 +01:00
jschoubben bacb663469 Merge commit 'b4eb78c2' into feat/47-G-fix11-b5g6 2026-11-12 09:50:37 +01:00
jschoubben fb62b14512 B5g6-2: the indexer validates every pending revision before its take-in
The program puts the validation's run ask on node-build-go's check queue
under its own asker and hears its end on step-ended; the manifest invokes
seat:node-build-go.accept.check. The revision validated is the branch its
merges landed on (the merged message's base, else the trunk), never the pull
request's branch. take-in.pending may name a refusal or why the revision
could not validate instead of the build it waits for. The whole case runs a
stand-in build seat: an accepted revision is taken in as before, by one ask
whose job names the indexer entry's repository, path and the revision's
head and no heads; a merge whose changed manifest gains a problem stays
pending, refused naming it.

Builds: design 47 G §712, §713, §714, A-231, A-232, A-247, A-254

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:50:37 +01:00
jschoubben 722d3a03b7 B5g6-2a: a Go bundle's entry carries the Go module its go.mod names
The validation's program is read under the Go module the indexer entry's Go
artifact names; the indexer's artifacts are bundles, which carried no
package, so every validation could not be asked.

Builds: design 47 G §676, §712, A-263

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:50:37 +01:00
jschoubben cd51fec81a B2l AS17 (4): §298's three order edges are acting waits of the assigner under order.
The new node-backup and bus module holders run before a module whose kept data's form changes moves; at a revert the node-engine goes
back last on its node; the reverted assigner and gate are wanted only once take-in.taken names the trunk's head (A-260). Kept in the
state waits, said as wait-held and wait-ended, read and released by assigner_waits and assigner_release. The manifest consumes the
indexer's take-in.taken and its version is 0.3 (A-245).

Builds: design 47 G §298, A-245, A-258, A-259, A-260
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:49:25 +01:00
jschoubben 12c213eb4c Merge commit 'b4eb78c2' into feat/47-G-fix11-b2k 2026-11-12 09:47:17 +01:00
jschoubben 9a83736411 Merge commit '5c58120d' into feat/47-G-fix11-b5g6 2026-11-12 09:44:18 +01:00
jschoubben 5094abded9 C1c-3: the delivery SDK gives askers one reader of a run's answer from a step-ended
StepEnded.ReadOutput takes the inline `output`, else asks the seat's verb output on the node that ran the ask for the object
`output-object` names (the runtime hands the chunks as the member `file`, A-249); a step-ended with both is refused.

Builds: design 47 G A-254, A-240, A-247

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:40:36 +01:00
jschoubben 7125a9f92f C1c-2a: the step runner says a run's answer in step-ended, inline or as an object, and serves it
The puller's end of a run carries the run's program's last line of standard output as `output` up to StepEndedInlineMost, else keeps
it with KeepOutput and names the object in `output-object`; a program that exits other than 0 ends failed. OutputTool serves the
seat's verb `output` from the kept object, as the whole file the tool runner sends in chunks; OutputsStore names the store.

Builds: design 47 G A-254, A-257, §602

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:37:51 +01:00
jschoubben 63a35b8817 B5g6-1: indexer_validate_again asks a revision that could not validate again
The tool (class act) records its hand act through mesh-hand-acts first and
asks the indexer through takeins; the indexer asks the revision's validation
under its next try and answers the validation's state. A revision accepted,
refused or whose ask is out is asked nothing.

Builds: design 47 G §713

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:35:28 +01:00
jschoubben f06c9cf5fd C1c-1: the three build seats' verb output answers a run's answer in chunks
The part build-step gains the verb `output` (the ask and the call in, the ask and the chunk count out, marked chunks, read by the
askers of a run), and the fields output and output-object of step-ended name the run's answer inline or as an object the holder
keeps. The three seats' fixtures carry the verb; the generated Go and TypeScript follow.

Builds: design 47 G A-254, A-139, §712, §354

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:34:48 +01:00
jschoubben 1e48d04077 B2h AS17 (3): the pass asks about a held revert, and writes live into the want
A have held with restore point missing or damaged, for a want the
assignment graph tells a revert (Reverted) across a kept data's form
(FormChanges of the running entry and the want's, read through the catalog
seat's verb entry), gets the revert ask and the finding revert-held; backups
leaves it. Live writes the want with revert live and its words, hold writes
nothing; the finding clears once the reverted build runs, and a newer want
takes the ask and the finding away.

Builds: design 47 G §710, §300, §298; A-217

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:34:13 +01:00
jschoubben 0930d57546 AS5-2b: the composition step's machines and their inputs, asked by compose-candidate and kept
The machines of a step are the nodes whose placement names its branch (none named is the trunk; an unwatched branch takes the
trunk's nodes); each is asked compose-candidate with the step's candidate key (run-<id>, or <branch>.<revision>) and input true,
and its input is kept under the ask named for it. Not yet called by a run (AS5-3).

Builds: design 47 G §354, §22, A-226, A-243, A-252

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:33:52 +01:00
jschoubben 103174e44c FB2: the forge bridge says the finding branch-unprotected
A move of a watched branch whose protection was removed writes nothing and is said as the
finding branch-unprotected (scope merge, id the repository and branch as a key, warning) through
mesh-sdk's held finding writer into the bound state findings; a move that finds the protection
back clears it. The findings state is bound by the Binding with performed.

Builds: design 47 G §17, §131, §387, A-251
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:32:36 +01:00
jschoubben 36b893c523 AS5-2a: the assigner keeps a step's input of any size and answers the verb input in chunks
The seat mesh-wants' verb input is marked chunks (call in, chunks out); the program answers it with the sdk's SeatChunks.Send from
the state inputs and its objects store, deletes an input at the build seat's step-ended of its ask or a day after its write, and
assigner_inputs reads them. The verb is no longer a tool. Mirrors the indexer's run_inputs.go (owed to mesh-sdk).

Builds: design 47 G §354, §712, §681, A-237, A-243, A-139

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:32:03 +01:00
jschoubben 6cbaa84c52 Merge branch 'feat/47-G-fix11-c1b' into feat/47-G-fix11-c1c 2026-11-12 09:31:16 +01:00
jschoubben 86af4c29c4 AS6: assigner_delivered_again asks a version said delivered again, heard at once in delivered-again
The tool records its hand act, writes the ask {module, version, by, why} into the state
delivered-again and answers that it is asked; the process's watch of that state wakes a pass at once,
which says version-delivered again when every present machine placing the module runs that version
healthy and takes the ask away, else keeps it with why, which assigner_waits lists.

Builds: design 47 G §376, A-250

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:29:57 +01:00
jschoubben fea9de98eb AS6: assigner_release with step delivery releases a dependent's delivery wait; assigner_waits lists them
The hand act is recorded first, then the release is written on the wait in delivery-waits, which the
process ends released at its next pass, writing the dependent's want.

Builds: design 47 G §376, A-246 (G-5's row "delivery of a dependency")

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:27:59 +01:00
jschoubben b29d7b89c2 §713: a pending revision names its validation ask and resumes on its end
The take-in puts the validation's run ask and ends there; the revision's
newest pending value keeps validation {ask, asked, input, seq, try,
failed, accepted}. The build seat's step-ended of that ask resumes it:
accepted takes it in as before and is never asked again, refused keeps it
pending with refused, and an end that could not validate keeps it pending
with failed, said in take-in.pending, never a refusal and never passed.
An end of a replaced ask is dropped, written in the journal. The answer
is read from the event's own output or output object. The wiring in the
indexer's program comes with the whole-module case (IX5).

Builds: design 47 G §713, A-232, A-247, §712

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:27:52 +01:00
jschoubben 87edff67ee B5g5-1: the indexer sends the input's chunks with buscalls.SeatChunks.Send, so its Subscribe exception goes
The acknowledgement subscription is the SDK's; the indexer's inputs.go holds none, and the test that forbids a subscription in
the program no longer excepts it.

Builds: design 47 G §712, §681, A-237, A-139

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:27:01 +01:00
jschoubben 8597083493 AS6: the assigner says version-delivered and holds a dependent for its dependency's delivery
At its start it reads whole, from the first message, version-released, its own version-delivered and
the watchman's machine-away and machine-back (process.FromFirst), then hears them; it reads the
watchman's presence state no more, a machine being present unless said away. A module's newest
released version is said version-delivered once every present machine placing it on its release
branch runs healthy the want naming it, the machines away named, none when every one is away. A
dependent whose want changes fingerprint waits, by an edge of kind 2, 4 or 6, for its dependency's
newest released version on its branch not yet said delivered: wait-held step delivery, bound 60
minutes from the release, kept in the state delivery-waits, ended ran on the delivery or released
once assigner_release writes it.

Builds: design 47 G §376, §389, §498, §374, A-189, A-233, A-246

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:26:49 +01:00
jschoubben c8e1c8b40d AS5-1: the assigner takes the composition step and says its step-ended
The seat mesh-wants' accepted kind step is taken for the composition step and its end said as step-ended.<node>
under the ask's id; it is wired with its run in AS5-3.

Builds: design 47 G §22, §354

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:24:54 +01:00
jschoubben b316489b93 B2h AS17 (2b): the revert ask's words, options and its finding revert-held
RevertAsk asks hold or live, naming the reverted build, the kept data, its
form and the node's words; it expires leaving the newer build running.
RevertHeldFinding is delivery.<node>.<module>.revert-held, a warning that
needs nothing, so the ask is the operator's one message.

Builds: design 47 G §710, §300

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:24:24 +01:00
jschoubben 42c3db1d5b B2h AS17 (2a): the assigner's ask of a held revert has its kind and key
The asks state gains the kind revert, keyed revert.<node>.<module>.<hex>
after the reverted build's fingerprint; like the backup ask it needs no
proof of who answered, so the view may answer it, and an asking that ends
unanswered while the hold stands is written again.

Builds: design 47 G §710, §300

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:24:04 +01:00
jschoubben ad561e485f FB7, FB8: the forge bridge asks its findings state and finding stream in the template form
The manifest's requires gain findings (state, history 5) and finding-events (events, 7 days,
16 MiB) and its consumes mesh-conditions.findings-asked, as every part but a foundation part
declares them; the bridge gains the finding branch-unprotected (next commit).

Builds: design 47 G §387, §529, §383
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:21:51 +01:00
jschoubben b05502fa9a Merge commit '7633a2fe' into feat/47-G-fix11-b5g4 2026-11-12 09:21:45 +01:00
jschoubben ffc4b88859 A-248: buildrun.Asker puts under the asker its subject names
The indexer's validation ask rides accept.<queue>.<asker> under its own
name (§712, A-232); an asker that names none still puts under the builder's.

Builds: design 47 G A-248, A-247, §712

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:21:11 +01:00
jschoubben 2aed3151af B5g3-3: the indexer keeps an input of any size and answers input in chunks
Builds: design 47 G §712, §354, §681, A-237, A-139

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:20:34 +01:00
jschoubben c4ba9eb23e B2h AS17 (1): a want carries the operator's answer live to a held revert
The seat mesh-wants' want gains `revert`, enum live, beside `backup`; the
wants codec refuses any other answer. The assigner's state form changes, so
its manifest's version moves to 0.2 once (A-245).

Builds: design 47 G §710, §300; A-245

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:19:54 +01:00
jschoubben a600090fcd G-715: the forge bridge says a group's end once per base
ForgeGroupEnd gains base; the bridge reads each member's base from the seat's
verb groups (Member.base is already in the contract and seatgen's output),
keeps groups.<group>.<base>, says one end per base from that base's members,
and bridge_group_end_again takes the base.

Builds: design 47 G §715, A-236
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:19:46 +01:00
jschoubben 06e5980898 VW2: the view's waits are the parts' wait-held, kept in its state waits
The view's process hears wait-held and wait-ended of every part (seats and modules; waits.go, manifest consumes) and keeps them in
its state waits under owner.step.node.module (viewstate/waits.go); view_tiers reads them through the tools bundle and names each
module's waits in the sayer's own words, {owner, step, node, on, bound, since, words} (tiers.go waitsHeld), beside the indexer's
pending revisions as the seat mesh-catalog's step take-in. No state of another module is read for a tier's waits.

Builds: design 47 G §512, §376, §498, A-242
2026-11-12 09:19:18 +01:00
jschoubben 9e4ced8274 B5g3-2: the mesh-catalog seat's input verb answers in chunks
Builds: design 47 G §712, §354, §681, A-237, A-139

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:18:18 +01:00
jschoubben 2879e78481 B5g3-1: a run's input is any size, RunInputBound goes
Builds: design 47 G §712, §354, A-237

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:18:18 +01:00
jschoubben f0c4d564d2 GR16 §554: the recovery module's account is granted the bus names of kept data
The account of the module claiming the seat mesh-recovery is granted the stream snapshot and
restore subjects with their chunk subjects, a stream's deletion and a durable consumer's
creation, only for the bus names of every kept data of every manifest the part holds and of
every restore point or aside kept-points names; never a stream of the mesh's own (CONTROL,
NODES, EVENTS, DEAD_LETTER*, PROV_APPLIED, CHECKS_*, SEAT_*, a seat's KV_). The writers table
names the account as a deleter of kept data's streams (ADR 0672 §4).

Builds: design 47 G §554, §565, A-230

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:17:07 +01:00
jschoubben 9e02d6234b A-238: a run ask whose program reads only its input names no head
The indexer's validation runs its manifest validator over its input alone
(design 47 G §712: heads none); the holder lays an empty MESH_RUN_HEADS.

Builds: design 47 G §712, A-238

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:16:19 +01:00
jschoubben 316af50da3 VW3: the view's tiers are the assigner's difference of a source revision's kept revision
view_tiers compares the kept assignment revision whose catalog carries the source revision with the one kept before it,
through the seat mesh-wants' verbs revision and difference (view/difference.go, tiers.go Tiers), and reads the tiers and each
module's after (module and edge kind) from the answer; the view orders nothing. The manifest invokes the two verbs.

Builds: design 47 G §512, §186, A-242
2026-11-12 09:15:40 +01:00
jschoubben 3cc4cb9392 GR16 §565: the grants part reads the restore points' names through kept-points
The part calls seat:mesh-recovery.kept-points as a kept call at its start and again on the seat's
ended (outcome done), point-removed and expiry-ended, reads points[].names and asides[].names,
keeps them in its state memberships (kept-names.mesh-recovery) and grants the names it kept until
the call first answers; grants_first_views says the wait. A name leaves only by an answer.

Builds: design 47 G §565, §554, A-230

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:15:27 +01:00
jschoubben 1448f85b15 A-241: the validation's seats are the revision's definitions with the merges' laid over
A revision that touches no seat definition was judged against no seats at
all; it is now judged against the whole seat list, the trunk's definitions
standing in for the revision's until A-234 keeps them.

Builds: design 47 G §712, A-241, A-234

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:15:11 +01:00
jschoubben dce4d01a58 FB1, FB9, FB10: the forge bridge writes one message per move of every watched branch
The bridge watches the registrations' branches by origin (a first view of registrations, then registration-changed),
before the first registration the gate's source's (source-moved); no branch is named in its code, Trunk goes. Every
move is heard on the seat git's branch-moved through the bridge's durable on SEAT_git_branch-moved, its head read by
the seat's verb branch, never the event's: merged with its pull request and `base` (the watched branch) when the
seat's pull names the head a pull request's merge, else `pushed` with branch, head and `before`, both with the
take-in inputs at the head. The last head written per watched branch is kept in the state heads under
branch.<owner>.<name>.<escaped branch>, so a move heard twice writes once, and each watched branch's head is read at
the start and when a branch is registered. A move of an unprotected branch writes nothing. pull.merged into a watched
branch writes nothing (its message is the move's); the forge-made merge's trunk filter goes.

Builds: design 47 G §4, §7, §11, §20, §41, §507, §509, §532, §714, A-227, A-236

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:15:04 +01:00
jschoubben d5676ee4b3 AS12: the assigner keeps a run's candidate assignment graph, dropped on the run's group-ended
A run's candidate catalog-revision (meshcatalogclient's candidates hook) is read whole through the
catalog seat's revision verb; the assignment graph is computed from it in place of its branch's half
and kept apart from trunk's under candidate.<group>.<heads>, the group run-<id>. revision, entry and
difference serve it (a candidate against trunk). The runner's group-ended of the run drops it and
writes no want; the gate's heads-replaced drops nothing; its entries stay while it is kept.

Builds: design 47 G §189, §190, §186, §187, §359, A-201, A-235, A-160

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:14:45 +01:00
jschoubben ccbefc5653 B5g3-2: the mesh-catalog seat's input verb answers in chunks
Builds: design 47 G §712, §354, §681, A-237, A-139

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 09:14:28 +01:00
jschoubben c8d842b924 VW2: the assigner's difference fills Tiers and each change's after
assigngraph.Compare (verbs.go:80, new order at verbs.go:112) orders the changes by the edges of their entries: each change
names the changes it is ordered after with the edge's kind (meshwants.Change.after, seat.json, regenerated), and Tiers holds
them in that order, so the view orders nothing itself.

Builds: design 47 G §512, §186, §378, A-242
2026-11-12 06:28:02 +01:00
jschoubben b7e251a463 B5g3-1: a run's input is any size, RunInputBound goes
Builds: design 47 G §712, §354, A-237

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:27:42 +01:00
jschoubben c76d8ef381 IX5: the validation's request, run and verdict over the change and trunk cases
The running indexer's validation before take-in asks its own manifest
validator (cmd/mesh-judge under the indexer entry's Go module, at the
revision's head) over two cases and refuses only what the revision causes;
mesh-judge reads the file MESH_RUN_INPUT names, where a run writes its input.

Builds: design 47 G §712, A-213, A-232

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:24:19 +01:00
jschoubben e586c0a05c A-238: a run ask whose program reads only its input names no head
The indexer's validation runs its manifest validator over its input alone
(design 47 G §712: heads none); the holder lays an empty MESH_RUN_HEADS.

Builds: design 47 G §712, A-238

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:23:13 +01:00
jschoubben ff2f90ec18 GR13 purge: the named asks go at the first revision that leaves them, or by grants_named_purge
While no entry of the revision invokes a queue of a build seat (seat:<seat>.accept.<queue>,
read by catalogue.QueueInvoke), the part composes no named worker, and at the first such
pass it purges accept.<queue>.* of each build seat's stream and deletes the named workers,
saying each in its journal; a failed read of the catalog half purges nothing. Its account
alone is granted the stream's purge and the named workers' delete. The hand tool
grants_named_purge records its hand act first, then asks the process to do it.

Builds: design 47 G §544, §600, §601, A-231

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:22:54 +01:00
jschoubben da8384d10e VW5: the view takes each watched branch's source from the gate's verb source, per branch
The view read the gate's state source and its history, fixed to the branch main. Each watched branch's source is now
the seat mesh-delivery's verb source given that branch, asked again on its source-moved; the source row and the event
delivered are per branch, a repository's reach is from the source of its modules' registration's first branch, laid
over the reach the view's own state kept at its start, and view_tiers given no revision answers per branch. The
manifest drops its read of mesh-delivery-gate.source and names the source answer's fields it relies on.

Builds: design 47 G §507, §512, §532, §558, A-173, A-225

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:21:49 +01:00
jschoubben 019a7ab9f7 A-233 (grants): a hearer of a seat's kept event is granted the ordered consumer of its whole read
As STREAM.INFO is, for every heard SEAT_ stream whatever its keep, so a part hearing an event kept by age
reads it whole from its first message at each start (mesh-sdk process.FromFirst); no manifest word.

Builds: design 47 G A-233, A-189

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:21:30 +01:00
jschoubben 611fafb58e AM-D4: the real bus delivers no marked call to a runtime denied the marks
A deny composed into the user list must hold on the server itself: the
runtime keeps its allow of the module's tools, and neither the tool's subject
nor the caller-named subject process.Call sends on first reaches it.

Builds: design 46 7 §6 (integration, the grants part's real-bus test)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:20:21 +01:00
jschoubben 642a0ad2f9 AS14 (b, c): a requirement points first to the named seat's holder, and a contributed one carries a contribution edge
The seat whose definition delivers a requirement, among those the entry's
catalog graph revision names, is resolved first: its holder from the
placements' holds, as seat-holders keeps them; a delivering seat no
placement holds holds the entry, naming the seat. A hold now names the
requirement, the seat and each candidate {node, module}; an optional
requirement nothing provides is left absent. The catalog entry gains
contributes, filled by the indexer, and requires names every requirement
as Wants lists them, optional ones included (the module graph and the
assigner's halves leave the optional ones out by the entry's manifest).
A contributed requirement gives a contribution edge to the same provider.

Builds: design 47 G §708, §709, §357; lead answers A-167, A-229

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:19:53 +01:00
jschoubben bff7b402e7 B1g-5: the catalog's revision verb answers a candidate's group alone and a branch's source revision
Builds: design 47 G A-205, A-222
2026-11-12 06:19:07 +01:00
jschoubben 7bc4836eb0 AM-D3: a runtime whose tool runner does not honour the mark is denied every marked subject
The grants part follows the assignment half, reads each node's reading and the
runner its node-engine says running, and where the runner does not state
approval-mark/1 or the reading is not the running runner's, composes the
subscribe deny of every marked tool and verb the runtime carries, named in
grants_user_list's withheld and answered by the seat's verb withheld.

Builds: design 46 7 §6 (the deny's subjects, its cases, withheld in grants_user_list and the verb withheld), design 47 G §195, §309, lead answer A-203 (the assignment half followed by revision and assignment-revision; withheld's forms, keyed by node in the user list's state as the lead confirmed)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:17:59 +01:00
jschoubben ef28ac17f4 Merge commit '66df2aef' into feat/47-G-fix11-b1g 2026-11-12 06:17:52 +01:00
jschoubben 8e7b8ab1d1 B1g-4: an unanswered drop is said call-unanswered on its five-minute bound key's expiry
Builds: design 47 G A-222, A-77, §350
2026-11-12 06:17:05 +01:00
jschoubben dcb7ba016c FB12: the forge bridge opens its state performed by its binding
The state performed is a requires entry, so the bridge reaches it by mesh-sdk's process.Binding: the seat mesh-broker's
show asked at the start as a kept call and again on its recreated and dropped, the bucket opened by the name show
answers. Until it answers, nothing owed is performed and the bridge says it waits, naming the entry. The old name
<module>_performed goes. mesh-sdk's Binding is cherry-picked on feat/47-G-fix11-b3c from feat/47-G-fix11-a7 (fa0a107).

Builds: design 47 G §577

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:17:01 +01:00
jschoubben b925457262 B5i: the indexer fills each entry's acts and writes the kind-5 edges an acting rule gives
Builds: design 47 G §711 (and §203: the contract's step names pipeline)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:16:08 +01:00
jschoubben 121d6f24a9 Merge commit '5dec3dff' into feat/47-G-fix11-b2f 2026-11-12 06:16:03 +01:00
jschoubben cbb678f42e B1g-3: a run's rerun asks with the candidate's catalog half, not the branch's
Builds: design 47 G A-222, A-193, A-205
2026-11-12 06:15:38 +01:00
jschoubben 0cd1ab79e4 B1g-2: the runner at its start places each run's lost pipelines from its candidate's newest revision
Builds: design 47 G A-222, A-193, A-180, A-205
2026-11-12 06:15:01 +01:00
jschoubben 5a7747f2bf GR8: a seat's verb is granted to its users only where its effective callers name them
Step 4 of a module's permissions granted every user of a seat every verb the seat
serves, so a kept-artifact call was composed for any module using a build seat. The
compiled Seat now carries each verb's effective callers (seatdef EffectiveCallers, the
class defaults), filled where the askers of its queues are, and a user is granted a
verb's call subject only where those callers name it: invokers that invoke it, its
module, or a seat it holds. A seat whose definitions are unread grants its users no verb.

Builds: design 47 G §610, §336, §271 (test 60), A-165, A-179

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:12:51 +01:00
jschoubben a8314676c9 RN10 (widens): a pipeline's end names what its change widens, from the catalog's revisions and the grants part
The candidate (the pipeline's own revision) against the branch's newest through mesh-catalog's revision; serving parts by the holder of the runner's, catalog's, steps' and composer's seats; acting rules, credentials; grants through grants-for. A read that fails says could not run. Touches steps.go (Hearer.Widens field, say's pipeline-ended), main.go (hearer.Widens), module.json invokes.

Builds: design 47 G §71, §275, §335, §441, A-207, A-215, A-220

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:11:47 +01:00
jschoubben 248d09ec14 Merge feat/47-G-fix11-b4c (GR12: the grants part claims mesh-grants and serves grants-for) into feat/47-G-fix11-b4b 2026-11-12 06:11:34 +01:00
jschoubben d9dcb3ef36 Teller answers: the assigner follows the teller's views.answers, never its bucket
The assigner's read of mesh-delivery-teller_answers goes: its process reader
follows the teller's answers by their first view (teller_read_answers) and the
views family views.answers, and the pass watches that picture as it watched the
bucket, without gating the first pass on it.

Builds: design 47 G A-175, A-178

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:10:47 +01:00
jschoubben 5125feabe6 AM-D3 path: the assignment half carries each node's readings with the runner's fingerprint
The grants part reads a node's capability readings and the runner that
announced them from the assignment half; the assigner reads both from the
node record it already holds, the digest over all of it.

Builds: design 46 7 §6 (the assignment half carries, for each node, its capability readings, each with the fingerprint of the runner that announced it), design 47 G §194, lead answer A-203 (readings, fingerprint)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:08:16 +01:00
jschoubben 50f3dde9f5 RN17 (show/kept fill): show and kept carry each store's fill, read through the bundle's calls
Builds: design 47 G §366, §623, A-214

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:07:59 +01:00
jschoubben 298f26bb4c Merge commit '68c87cc3' into feat/47-G-fix11-b2c 2026-11-12 06:07:49 +01:00
jschoubben d9a9da921a RN12: the runner runs on request, its pipelines placed from the run's candidate revision
run writes each member's pipeline at once under the run's random id and its named branch and says
run-started; the candidate run-<id>'s catalog-revision, handed to the runner by meshcatalogclient's
candidates hook, is read whole through the revision verb and places each member's steps and a pipeline
of each entry the members change, saying pipeline-started once each.

Builds: design 47 G §64, §373, §420, A-160, A-180, A-185, A-193, A-199

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:07:38 +01:00
jschoubben 12e1fd4403 AS17 (a, b): a revert is a want going back to an earlier fingerprint by the assignment revisions' numbers; a kept data's form change is read from the entries' manifests
Builds: design 47 G §298, §300, §303, §213; lead answer A-217

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:07:19 +01:00
jschoubben 2e9bd2bd7b Merge branch 'feat/47-G-fix11-b3b' into feat/47-G-fix11-b2c
# Conflicts:
#	modules/mesh-delivery-assigner/cmd/mesh-delivery-assigner/main.go
#	modules/mesh-delivery-assigner/manifest_test.go
2026-11-12 06:06:43 +01:00
jschoubben a5cafab0e8 AS20 (§558): the assigner's invokes name the fields it relies on of the catalog seat's revision
Builds: design 47 G §558, §530

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:06:42 +01:00
jschoubben 9fed8edb50 A-206: the held wait's clock is the build.ended of the awaited runner, heard from the builder's stream
The runner hears the builder's stream of build ends (kept last per subject, read whole at its start, A-181: consumes
`mesh-delivery-builder.build.ended.**`) and keeps when each build ended, the stream's own time. wait-held carries it as
`clock-from`, the bound of the wait is armed from it (30 minutes less what passed), and a bound whose build has not ended is armed
when its end is heard, with wait-held said again. A failed end starts no clock.

Builds: design 47 G §266, §269, §703, A-181, A-206

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:05:29 +01:00
jschoubben eb45c3c67c GR14: the keeper hears either finding stream form, each module publishing its own node's
A * emitter before a finding event reaches the stream a part asked for by the
template events (its finding-events) beside the old stream; a part's finding
stream is published on its own node's subjects alone.

Builds: design 47 G §386, §529, §515

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:05:07 +01:00
jschoubben 84db958110 AS13 (§181): the assignment graph store says filling, full and room; a full store keeps the last revision and writes no new want
Builds: design 47 G §181, §579

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:04:49 +01:00
jschoubben 00cc0f8ff2 IX4: the indexer names the trunk main once
trunkLike takes TrunkBranch where it named the string again, so the first watched branch changes in one place.

Builds: design 47 G §7, A-93

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:04:27 +01:00
jschoubben d3e555e2f4 A-204: the assigner keeps the put waits it said in its state put-waits
A put that ends while the assigner is stopped now gets its wait-ended at the
next start: the said waits are read from the bus, not seeded from the puts
that wait now.

Builds: design 47 G §498, A-204, A-211

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:03:58 +01:00
jschoubben bbd872f519 AS21: the assigner follows the watched branches the gate's source and the registrations name, reads no gate bucket and names no branch
The assigner follows the catalog half through meshcatalogclient's branch follower (the registrations' branches, before the first
registrations those of the gate's verb `source` and its event `source-moved`, §507, §532): its trunk is the first watched branch,
never a fixed "main" (§7). It reads neither the gate's `source` nor `merges` (§431); the Approve of a release is no yes to a move
(the release lookup goes). The follower tells a part of each branch it adopts (Branches.Adopted).

Builds: design 47 G §507, §532, §431, §7

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:03:49 +01:00
jschoubben 2940df27b1 VW5: the view follows the catalog half per watched branch through meshcatalogclient's branch follower
The process and the tools bundle read the catalog half through Branches
(FollowBranchesProcess, FollowBranches) and Branches.Entry instead of one
view of a branch named in code; the module's value carries the entry's
manifest-digest bare and computes none. The manifest consumes
registration-changed and source-moved and invokes registrations, and
revision, entry and source in the long form with the fields relied on.
The built binary committed at the module's root goes.

Builds: design 47 G §532, §614, §558, §506, §578, A-103

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:03:48 +01:00
jschoubben 144f05a099 IX8: a module built on a package that calls the tool runner is ordered after the artifact that states the words
For each package a module's entry builds against whose artifact takes `calls`, an edge of kind 6 names each word and runs
from the artifact whose manifest entry `states` it, so no manifest names the tool runner's module.

Builds: design 47 G §605, §545 (A-208)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:03:48 +01:00
jschoubben 0892f112bc IX8: a kind-6 edge names the fields a long-form invoke relies on
The entry's manifest is read by the second reader release (RR2-4), and an invoked verb given as {verb, fields} puts the
fields in its edge's `why`.

Builds: design 47 G §558 (A-208)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:03:20 +01:00
jschoubben 03ee0930e1 RN17 (unlogged): a step's end and its log entry are one write, appended after the end is said
The pipeline gains `unlogged`: a step's end is written in its key with its step-log entry in one compare-and-set, said as
step-ended, then appended to the step log and cleared; a log that refuses an append ends no step, says full and starts no new
pipeline; at its start the runner appends every unlogged entry in order after reading back the log's last entry of that
pipeline, and once a minute while the log is full. The tools runner_unlogged and runner_unlogged_append (a hand act).

Builds: design 47 G §486, §606, §549
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:03:08 +01:00
jschoubben ca4aa88583 IX8: the indexer writes each entry's edges of kinds 1, 2, 3, 4 and 6 into the revision it keeps
An entry's edges run between artifact references, from the artifact that comes first: kind 1 from the publisher of a
package it builds against, 2 from an artifact its `needs` names, 3 from its build module and its bases, 4 from the
provider of a provision a want of it waits for, 6 from the server of a verb it invokes (none on a cycle). Kind 5 waits
on a design line (A-212).

Builds: design 47 G §47, §48, §49, §50, §121, §122, §378, §432 (A-208, A-212)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:02:58 +01:00
jschoubben a4fcf3de51 GR12: the seat mesh-grants claims its seat and serves grants-for
The part claims mesh-grants, serving grants-for: a run by its group run-<id> or a
source revision by the branch and the new optional source of mesh-catalog's
revision (contract regenerated), compared with the branch's newest by the
permissions the composed accounts gain and lose with the candidate's entries in.

Builds: design 47 G §401, §441, §449, A-205

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:02:44 +01:00
jschoubben 9fd2066711 A-206: the wait's on gains the value runner version
A pipeline held for the runner's new version says its wait-held and wait-ended on `runner version`, no longer on `build node`.
Contract (seat.json, regenerated by seatgen) gains the value.

Builds: design 47 G §534, §696, A-206

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:02:35 +01:00
jschoubben de06949121 AS10: the assignment graph finds a cycle among the waits within one step and says it
Builds: design 47 G §272, §356

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:02:18 +01:00
jschoubben d44c45c9b9 A-206: the bound's expiry writes the finding pipeline-waits through the runner's finding writer
ReleaseExpired says each pipeline it started through the starter's Late, and the process writes the finding pipeline-waits
(scope module, id the pipeline's key `<branch>.<id>.<module>`) naming the awaited runner and since when.

Builds: design 47 G §266, §269, A-206

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:02:16 +01:00
jschoubben 56c45eb7d6 RN8: a newer commit or publish supersedes the older running pipeline, its asks dropped where they stand
A step keeps the node whose holder said ask-taken; a superseded step's drop is asked of that node's holder, an
untaken ask's of any holder, as kept calls; steps on mesh-builds and mesh-wants are only ended superseded. A
pipeline a publish started says that publish (published), so a newer publish of the package supersedes it.

Builds: design 47 G §31, §119, §350, A-182, A-202

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:01:44 +01:00
jschoubben 6ce46884d5 AS9: an entry waits for its acting part's new version in composing and placing; assigner_waits lists the wait, assigner_release now lets it go
Builds: design 47 G §266, §268, §276, §269 (the assigner's part: wait-held with bound and clock-from, wait-ended; acting-part-late is the watchman's)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:01:38 +01:00
jschoubben 6635dda18f A-206: the seat verb release and the tool runner_release start the held pipelines by hand
The seat mesh-pipeline-runner gains the act verb `release` (why; answers how many it started) beside start and ask-again, its
hand act written first through mesh-hand-acts; each released wait ends `released` and its bound is dropped. The tool
runner_release asks the verb. Contract regenerated with seatgen.

Builds: design 47 G §276, §534, A-206 (A-195)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:01:22 +01:00
jschoubben e163aab3d1 AM-D3 deny: a user's subscribe deny is written, compared and kept
The grants part composes a subscribe deny where a node's tool runner does not
honour the approval mark; the user list must carry it to the bus, and an added
deny is a narrowing the user-list guard lets pass as no right lost.

Builds: design 46 7 §6 (Permissions.SubscribeDeny, User subscribe_deny, comparison and differences, the guard's narrowing)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:01:01 +01:00
jschoubben 2a46134d14 RN22: a recovery's steps are asked on the build seats' stream delivery
The runner keeps each commit the seat mesh-delivery says a recovery merged in its state recoveries; a pipeline whose commit is
named there has its go, node and image steps asked on delivery.step, ahead of the first round, at its start, its resume and a
rerun; a recovery heard after its pipeline started asks nothing again.

Builds: design 47 G §81, §86, §415, A-207
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 06:00:36 +01:00
jschoubben 41ecd473da GR5: a module's sent store is read by the callers and consumers it is for
Derived at every pass from the catalog graph's manifests and the seat definitions'
callers, never from a manifest field.

Builds: design 47 G §59, §124, §442

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:59:54 +01:00
jschoubben 3eb07835f7 GR6: a state's <state>-objects store is granted to the state's owner alone
Builds: design 47 G §58, §91

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:59:50 +01:00
jschoubben edc8bbd9ab §7, §428 (watchman): a bus user is said by its module's name, the tool runner's no differently
signals.go BusUserWords: the node-tools special word is gone (the node-engine's node.<node> user stays, a bus account form, not a
module name). The watchman's ControlNodeModule (signals.go:591, nats) and builderModule (names.go:17) went with A-197 and WM13.

Builds: design 47 G §7, §428

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:59:49 +01:00
jschoubben e0b4f73c9e RN17 (fill): the runner says its stores' fill and a full store refuses a start
The seat gains the events filling, full and room; at each step's end and each start the runner reads the fill of pipelines,
step-outputs, kept and step-log against their caps, says filling past 80 %, full at the cap and room below 70 %, and a start
while a store is full is refused, said in the journal and heard again by the bus.

Builds: design 47 G §366, §181
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:59:18 +01:00
jschoubben 3eca094c5c A-197: the watchman reads no node-engine state: have and health go, running ends a want's pulse
Removed with the reads of node-engine.have and mesh-host.health: the findings module-unhealthy (module <module>.<node>, token
unhealthy, urgent after four hours), kept-as-it-runs (module <module>.<node>, token kept), apply-failing from a have that failed
(machine <node>; the provisioner clients' half stays), machine-network, network-rewritten, network-unreachable, machine-units,
relogin-needed, directory-used-as-found, node-account-fallback, and the urgency of a silent control node. A want's pulse now ends on
the node-engine's running event (consumes node-engine.running).

Builds: design 47 G A-197, A-192, §541

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:58:55 +01:00
jschoubben 6182730923 GR2: grants_callers and grants_why_refused
The first reads the callers each verb and accepted kind of the seat definitions
admits, the second says which call subject an account lacks (the bus's own
nats_user_can) beside the definition's callers.

Builds: design 47 G §83, §391, §395

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:58:25 +01:00
jschoubben c2950e332f A-194: indexer_runs reads the state runs and the run candidates, indexer_run_drop drops one by hand
The drop is a hand act recorded through mesh-hand-acts before it is asked; the indexer, the state's owner, drops the
run's candidate and its key.

Builds: design 47 G §64; A-194

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:57:11 +01:00
jschoubben e053605e82 RN19, RN21: the pipelines of a change to the runner are held until its new version runs healthy
The seat's pipeline record gains `held` (since, the fingerprint awaited). A take-in giving the runner's own module a new
fingerprint holds every pipeline it starts, and a later take-in's while any is held; wait-held (step pipeline) is said, the
30-minute bound is a key of the state bounds. The node-engine seat's running of the runner's module at the awaited
fingerprint, healthy, or the bound's expiry, releases them: steps placed and asked, wait-ended and pipeline-started said. A
runner starting at the awaited fingerprint releases at its start. runner_waits lists the held pipelines.

Builds: design 47 G §65, §266, §276, §534, §19 (lead answer A-195)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:57:05 +01:00
jschoubben d68e6b877d RN16: the runner ages its own kept data by its own deletes, in the step log's order
Three step-log sequences in the state aged, one per retention (7, 30, 90 days); at each step's end up to 20 entries per
sequence past their retention delete the output and the pipeline (7 days), a kept result not read for 30 days (30 days) and a
passed pipeline (90 days), never a pipeline that is its branch's newest; each delete is a journal line. The step log is
written to and read from the log's stream (design 47 G §470); a log entry names the kept results it wrote or carried and a
kept result its last read.

Builds: design 47 G §330, §410, §470
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:56:54 +01:00
jschoubben 161d6e6451 WM16: a record is covered only by what is late for the entries of its own revision
record-opened is joined to the take-in.taken of its milestone, <branch>.<source revision>, whose entries name the modules; the
record-open finding is left unwritten only while one of those modules is held by an acting-part-late wait (or a store says full),
no longer while any wait is late. A record whose revision is not known taken is covered by a standing take-in-waits.

Builds: design 47 G §502, A-200

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:56:33 +01:00
jschoubben f8bae4bee8 GR13: a build seat's queues take named asks beside main's, each asker granted its own
Each queue gets a named worker filtered to accept.<queue>.*; an asker is granted
accept.<queue>.<its seat> for the queues of the kinds it is a caller of, read from
the definitions' callers lists; main's accept.<queue> is the checker's and the
builder's alone. The purge of named subjects and workers (grants_named_purge) is
not in this commit.

Builds: design 47 G §543, §544, §600, §601, A-163, A-170, A-184

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:56:06 +01:00
jschoubben 0c6c5d20d6 Merge feat/47-G-fix11-b5a into feat/47-G-fix11-b5d
# Conflicts:
#	modules/mesh-delivery-indexer/internal/index/pending_test.go
#	modules/mesh-delivery-indexer/internal/index/takein.go
#	modules/mesh-delivery-indexer/manifest_test.go
#	modules/mesh-delivery-indexer/module.json
2026-11-12 05:55:24 +01:00
jschoubben 1abc5ae6d9 WM9, WM15: the manifest findings are the indexer's verdicts heard as events
manifest-refused raises manifest-refused; manifest-accepted, which carries problems, raises manifest-outgrown or clears it
and any refusal; the start seeds both from indexer_verdicts. The indexer's modules view (ModuleVerdict, views.modules,
indexer_read_modules) is no longer followed, and manifest-waits is no longer written (§500).

Builds: design 47 G §500, §196, §668

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:55:02 +01:00
jschoubben f86ccc378c AS14 (a): an assignment entry held for want of a provider names the candidates
A requirement neither bound nor pinned points to the provider on the
consumer's node, else the only provider; otherwise the entry carries the
new field held (seat mesh-wants' AssignmentEntry, generated by seatgen),
naming each placed provider as a candidate, and nothing is guessed. The
named seat's holder and the contribution edge wait for their design line.

Builds: design 47 G §357; lead answer A-167

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:54:38 +01:00
jschoubben 5b13cc7ab1 IX24: the indexer's four kept calls are asked again only while their ask is open
messageVia, stepsVia, sourceVia and versionsVia go through CallKeptWhileOpen: open while the commit's take-in
is pending, the candidate is held, the branch is watched, the module is in the newest view. A call that ends
with its ask closed is index.ErrAskClosed, not an unanswered call.

Builds: design 47 G §351, §367, §460, §531; A-190

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:53:45 +01:00
jschoubben faec6b5333 WM13 (watchman half): the builder's builds are no longer read; a package wait is heard as wait-held
The watchman's read of mesh-delivery-builder.builds (Build in mirror.go, the bucket, its manifest reads) goes; it hears the
builder's wait-held and wait-ended on the builder's stream, naming a package as their part, and times them as an acting
part's wait. A toolchain wait (no part) is left to the builder's own finding. The node-engine's have and mesh-host.health
reads stay: no event carries a have's phase, kept data, node record or a node's health report (asked of the lead).

Builds: design 47 G A-192, §484, §496, §602, §548

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:53:23 +01:00
jschoubben 267bd0a9cb RN11: the runner says a failed head as the finding pipeline-failed
A required step that failed or could not run writes the finding of its commit, owned by the commit's author as the forge
records it (read through the seat git's pull); one with no known author has no owner and says why, written at the next step
end of that commit; a newer revision passing the steps clears it. The runner's finding writer is the held writer.

Builds: design 47 G §33, §540, A-191
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:53:20 +01:00
jschoubben 6676b42dab RN5: an empty approval status is no step and asks the operator nothing
Builds: design 47 G §553, §23, §26 (lead answer A-196)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:53:07 +01:00
jschoubben 9cd38f59ff A-181: the assigner reads the builder's build ends from their stream, kept last per subject, and reads no builder bucket
The builder's `build.ended` stream declares last-per-subject; the grants part composes it one message per subject and its readers read
whole; the assigner reads it whole at its start then follows it (consumes `build.ended.**`), so what was built and a failed build's error
survive its restart. world.built, buildNeeds, manifestOf and the put verbs read the ends; the manifest reads no builder bucket;
assigner_put's fingerprint-prefix form goes.

Builds: design 47 G A-181, A-162, §556, §703

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:53:02 +01:00
jschoubben 0f4a33ce48 TL5: the teller carries the assigner's asks only, follows the view's answers and says its own on views.answers
The merge-ask path goes whole with the Approve per merge: the reads of
mesh-delivery-gate.asks and mesh-delivery-view.answers, OnAsk, OnAskGone, the
gate branches of Answer and the room list, and the merge words. The teller
follows the view's answers through view_read_answers and views.answers, says
its state answers as views.answers from its state teller-marks, and serves the
read tool teller_read_answers. The room list stays for the assigner's asks
(the lead's answer). viewstate gains the names the view's own commit gives it
(the same hunk, so the two merge cleanly).

Builds: design 47 G §653, §431, §512; lead answers A-172, A-175, A-178

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:52:42 +01:00
jschoubben 524fbb02ef WM13 (builder half): a key queued behind a package says wait-held and wait-ended in the one wait form
The builder says wait-held for a key queued behind a package, the package as its part and on (package:<ref>), on its
stream waits, and wait-ended published once the key is claimed; a toolchain wait never ends by that, and a package wait
never by a toolchain's end. Files: internal/build/waits.go (Package, On, WaitPublished), internal/build/run.go (Hold at
the queued result, End at the claim), cmd/mesh-delivery-builder/waits.go (Part in the body, the End rule).

Builds: design 47 G A-192, §499

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:52:10 +01:00
jschoubben e5c864c246 RN9: pipeline-ended carries test counts and over-budget; group-ended says a group's end
pipeline-ended carries the module's test counts (the sum of its steps') and over-budget
past 500 unit or 50 integration tests; once every member of a group on a watched branch's
source revision ended, group-ended is said under the group.

Builds: design 47 G §24, §73, §332, §419

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:51:33 +01:00
jschoubben 00c888546a §498: the assigner says a put without hold as a wait, and assigner_puts answers since and bound
A put without hold whose want is written is said as wait-held on the seat
mesh-wants (step put, node, module, fingerprint, since, bound 30 minutes)
and wait-ended when it runs, is released or is put again, so the watchman
times it; a held put is no wait.

Builds: design 47 G §498; main file *A put without hold that stands*

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:51:26 +01:00
jschoubben 8953adad88 RN5: a step whose status a policy leaves empty is optional and runs
A step neither the artifact's nor the module's policy names is placed as an optional step
(Status returns optional), no longer no step; a failure of it holds nothing.

Builds: design 47 G §553, §23, §32, §535

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:50:24 +01:00
jschoubben 0772e6dc23 IX14: a run on request's candidate from the runner's run-started, dropped once every member's pipeline ended
The indexer hears the runner's run-started and pipeline-ended on their own streams and writes candidates.run-<id>:
one pull per member, its repository and directory from its registration, its manifest and fingerprint from a take-in
of its commit read through the seat git, over its branch's revision view when its registration watches the branch,
else the trunk's. The state runs keeps each run's members and ended modules, so a restart between two ends still
drops the candidate. The try candidates, the checker's checks consumer, checker_tries and the three try tools go;
IsTryGroup takes run-<id> beside try-<digits>.

Builds: design 47 G §64, §190, §321, §66, A-160, A-174
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:50:15 +01:00
jschoubben 0fba15e32c VW5: the view says its answers on its views family
The teller follows the view's answers by view_read_answers and
views.answers instead of reading the view's state; the view emits from
its marks state view-marks, as the other owners do.

Builds: design 47 G §431; lead answers A-175, A-178

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:49:52 +01:00
jschoubben 62de8d0bb8 WM4, WM5: the watchman hears the node-engine's wait-held and wait-ended
A hold of the composition standing past 30 minutes is delivery-waits (node, module, reason), a wait for a kept build
past 60 minutes is kept-build-waits; each clears on wait-ended. The node-engine's version is not yet named in them
(it needs the catalog entry of the fingerprint running.<node>.<node-engine's module> names).

Builds: design 47 G §499, §541, §271, §376

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:49:48 +01:00
jschoubben f3c35722d9 AM-D2: the grants part's own copy of the wire pattern goes
A reader turns a stream's events into the bus's subjects with mesh-sdk's
buscompose.WirePattern; the grants part's copy goes. The catalog graph
entry already carries the validated manifest whole, its needs-approval,
emits and streams with their grant among it (design 47 G §443).

Builds: design 46 7-approval-mark §5

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:48:49 +01:00
jschoubben 464206d2de WM1 (step half): a head behind a pending revision of its branch raises no pipeline-stands
The watchman keeps the watched branch each open take-in wait names (take-in.pending's branch) and times a head only
while its branch has none; once the revision is taken in the head is timed again from its own move. The head on a
branch whose branch-unprotected stands (§497's second sentence) is not built: nothing the watchman hears says it
(the forge bridge writes that finding, no event).

Builds: design 47 G §12, §75, §497

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:48:30 +01:00
jschoubben 3c38f9c468 IX31: the whole test judges the indexer's manifest against a seat list holding the assigner seat's view
The indexer consumes the seat mesh-module-assigner's views.assignments in the seat's form, which the validator accepts only
where the seat list holds the seat and offers the state as a view; TestIndexerWhole seeds that definition.

Builds: design 47 G §616, §699, A-119, A-131
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:48:20 +01:00
jschoubben 58e4a737d5 AM-D5: a per-machine state reaches its machine's keys below it
A per-machine state's account reaches its machine's key and the keys
below it (mesh-sdk PerMachineKeys), no other machine's, so the tool
runner's approvals keep <node>.ask.<id> and <node>.act.<digest>; the
membership names the machine's key in the same form.

Builds: design 46 7-approval-mark §13

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:48:17 +01:00
jschoubben 5788fbb5d6 VW5: the view reads neither the gate's asks nor the teller's answers
The Approve per merge goes with G, so the gate's merge asks are no asks of
the view's; the teller's answers are followed by their views family
(teller_read_answers, then views.answers), never read from its state.

Builds: design 47 G §512, §431; lead answers A-172, A-175

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:46:41 +01:00
jschoubben 558a93c25b AM-D1: the validator refuses a mark nothing enforces
A manifest marking a tool its tools do not list, a verb its claims do not
serve or an event it does not carry, one name both a tool and an event, a
marked tool or verb (or a held seat verb its seat marks) without
operator-channel in uses, or a marked tool or verb while every bundle it
builds is run by its own process, is refused by both paths, naming the
entry and the rule. The login shell's captured manifest is copied at
AM-K1, which gives it operator-channel.

Builds: design 46 7-approval-mark §4, §7, §21; design 34 every-event §32; lead answers A-177, A-183

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:46:16 +01:00
jschoubben b90e767529 IX17, IX18: the indexer keeps the records pinning each catalog graph revision and removes a revision only on an event
State pins (4 MiB; one key per revision <branch>.<revision>, made, pins-stated) applied from a durable consumer of mesh-delivery's
pinned, freed, heads-replaced and pins-stated, acknowledged after the apply; a revision is removed when no record pins it and it
is not current, only while the consumer has nothing pending and after a pins-stated later than made; finding pin-missing; tools
indexer_pins, indexer_unpin, indexer_consumer (the state consumers, written by mesh-sdk's process.ConsumerLedger).

Builds: design 47 G §153, §178, §189, §215, §216, §579, A-169, A-171, A-176
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:45:50 +01:00
jschoubben 7033d5e80d BG2, BG3: the puller refuses a kind its asker may not ask and pulls the named worker
An ask's asker is the last token of its accept subject; the holder checks the kind against the callers the build seat's
definition lists (Puller.Callers, CallersFromDefinitions), refuses an ask of another kind answering error naming the kind
and the asker and ending it failed, takes only a build and a run on main's subject, and gives back an ask the seat list
does not judge yet. A second worker per queue (AskNamedWorker, filtered to accept.<queue>.*) is pulled after main's; the
holder says `named worker not bound` while its membership lists none.

Builds: design 47 G §543, §544, §481, A-163, A-170

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:44:38 +01:00
jschoubben 8f43d0ecdf AS23: build.ended says a failed end too; a hold under rule 1 says how the build stands
The builder's build.ended is said for a failed build as well (outcome, error whole);
the assigner's rule-1 hold reads "the build of M at F failed: <error>" from it and
"is being built" while none is heard. The assigner's reads of the builder's builds
bucket stay (see the report: a restarted assigner holds no ends heard).

Builds: design 47 G §575, §568, A-162 (survey AS23)
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:43:15 +01:00
jschoubben d6c1e27259 Merge branch 'feat/47-G-fix11-b5b' into feat/47-G-fix11-b7 2026-11-12 05:43:07 +01:00
jschoubben 4b47e88369 RN25: runner_health reads the consumer facts mesh-sdk's ledger writes
The runner's own writer of its consumer's oldest unacknowledged delivery is
replaced by mesh-sdk's consumer ledger: each message the hub hands a handler is
noted delivered, and applied when the handler acknowledges or ends it; one it
asks again stays unacknowledged. The key form is the same, a key per consumer
by its name in the state consumers. A runner that heard no event yet is healthy.

Builds: design 47 G §76, §468, §495; lead answers A-166, A-176

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:42:33 +01:00
jschoubben cbfea2f961 AS22: the assigner reads a build's health from the node-engine's running alone
Rules 3, 4 and 5 (canary, healthy elsewhere, a hold's lift) and the outside-cause
judge read `running.healthy` (a running with none reads healthy, nothing heard
reads not healthy); no fallback to the have. Phase and failed-health reads of the
have stay where `running` says nothing of them.

Builds: design 47 G §520, §556 (survey AS22)
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:42:25 +01:00
jschoubben 0178fc86a8 AS13: the assigner keeps the pins of its assignment graph revisions
A delivery record's pinned and freed reach the assigner on its durable
consumer, kept per revision in its old state pins by compare-and-set
before the event is acknowledged; a revision neither pinned nor current
is removed only while the consumer is caught up and after a pins-stated
said since the state was made, never on a timer and never by reading
the gate's state. assigner_pins reads it, assigner_unpin frees a lost
freed by hand, recorded in the hand-act log first.

Builds: design 47 G §153, §178, §179, §216, §579; A-169
Left of AS13: §181's filling, full and room.

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:41:40 +01:00
jschoubben 459c03933c TL1: the teller's integration bed grants and creates the state widens-said
Builds: design 47 G §335
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:41:38 +01:00
jschoubben 9199bb20f4 RN14: the runner serves start and ask-again
start starts by hand the pipeline of a watched branch's head from the runner's
catalog half, refusing a head already started; ask-again asks a declined
approval once more under an ask of its own, its id following from when it was
asked again so the ask rebuilt for its warrant is the same. Each is recorded in
the hand-act log first; the process answers both beside review, rerun, accept
and cancel.

Builds: design 47 G §30, §39, §306, §36, §394

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:41:03 +01:00
jschoubben 893f425c56 WM14: a put without hold that stands is the finding put-stands
A wait held with step put (no part) raises put-stands once its bound has run from its clock, and wait-ended ends it; a pipeline's
wait raises nothing for it. The seed from assigner_puts waits on that tool answering since and bound (assigner's, not built here).

Builds: design 47 G §498
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:39:03 +01:00
jschoubben 7ce80ce590 EE-D4: the validator has no rule about the waits list
The manifest no longer carries what a session waits on (mesh-sdk EE-S2), so
the rule judging it and its token form go; a manifest still carrying waits
is a field the validator does not know, refused by Shelf and set aside by
ShelfWaiting, and the tool runner's manifest without it is accepted.

Builds: design 34 every-event §10

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:38:52 +01:00
jschoubben 05b0385805 WM8: watchman_views answers the condition keeper's view-waits by part, node and view
Builds: design 47 G §83, §501, §609
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:38:23 +01:00
jschoubben cce99f2802 IX17: the pinned event's catalog entries name their branch
Pins.catalog is a list of {branch, revision} in the mesh-delivery seat's definition (revisions are numbered per watched branch),
the Go and TypeScript contracts regenerated, the fixtures follow.

Builds: design 47 G §579, A-169, A-171
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:38:16 +01:00
jschoubben 8f09aa223b RN25: the runner's health check is its tool runner_health
The process writes, in its state consumers, when its durable consumer's oldest
unacknowledged message was delivered, at each delivery and acknowledgement; the
bundle's runner_health reads it and the pipelines state, and names a consumer
five minutes or more behind. The process resource's health is that tool.

Builds: design 47 G §76, §468, §495; lead answers A-164, A-166

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:37:55 +01:00
jschoubben f913d85e66 EE-D3: the real bus holds the tool runner's hearing of every event
The grants part's real-bus test gains a case: the tool runner's composed
account hears a module's event, a module stream's and a restricted
stream's whose grant names no tool runner, still after that grant changes
and the accounts are composed again; it publishes none, hears no accept
or proof, and gets no consumer or acknowledgement on the restricted stream.

Builds: design 34 every-event §9, §27

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:37:08 +01:00
jschoubben 7ba95ac07f TL2, TL3: the teller tells a recovery and a merge made at the forge on every channel
recovery-merged gains module and branch, and a forge-made record-opened gains repository, pull, commit and branch (seat
definition, generated Go and TypeScript, fixtures); the teller hears both events and tells them through operator-channel's notify
with every-channel, in the operator's words of §522.

Builds: design 47 G §81, §82, §170, §514, §522 (lead answer A-161)
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:36:47 +01:00
jschoubben 820f7c2351 IX31: the indexer follows the seat mesh-module-assigner's assignments through its holder, no assigner module named
The holder is asked through mesh-sdk's seatlist.HolderOf, its first view and views family followed as the builder's and the
checker's are; the module consumes the seat's views.assignments and invokes the seat's verb assignments alone.

Builds: design 47 G §7, §428, §556, A-119, A-126, A-131
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:35:57 +01:00
jschoubben a489c738b3 TL1: the teller tells a pipeline's widening on every channel, once per commit
The teller hears pipeline-ended, tells each end that carries widens through the seat operator-channel's notify with every-channel,
one line per entry, and keeps the last commit said per module and watched branch in its state widens-said (read by
teller_widens_said); registration-changed drops the branches no longer watched.

Builds: design 47 G §71, §335, §514, §522
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:34:43 +01:00
jschoubben fc4ce1cd79 RN25: the runner's stores declare their caps, its sent store, tools named runner_
The pipelines state is capped at 256 MiB and kept at 128 MiB in the old state
section, the sent store sent-objects is declared at 256 MiB, and the first-view
tools carry the runner's tool prefix.

Builds: design 47 G §469, §85, §477, §533, §539

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:34:01 +01:00
jschoubben 00b52e3c1f BG4, BN4, BI4: the puller says ask-taken, step-progress and the end of any ask
A holder says ask-taken when an ask starts, step-progress every minute while it runs (phase fetch, build or run) and
step-ended for an ask outside a pipeline, each on the seat's subject of its node (SayOn); the asker is the last token of
the subject the ask came on (Pulled.Subject).

Builds: design 47 G §496, §602, §603, §481

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:33:26 +01:00
jschoubben 69a0004fe6 EE-D2: the tool runner's runtime hears every event subject
Where the runtime's permissions are composed, a runtime carrying the tool
runner subscribes mesh-sdk's EveryEvent (every seat's, module's and module
stream's events) and nothing else for it, replacing the per-family list.

Builds: design 34 every-event §6, §8, §25, §27

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:32:04 +01:00
jschoubben 9a28de8ab0 CK9: the checker follows the seat list through mesh-sdk's seatlist.Part, its own seatlist.go goes
Builds: design 47 G §204, §264, §320

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:30:45 +01:00
jschoubben 54a9159b25 EE-D1: the grants part computes nothing from the waits list
The tool runner's manifest no longer names the event families it may wait
on (mesh-sdk EE-S2), so the grants part's copy of that list goes whole:
its subjects, its membership field and its record reading.

Builds: design 34 every-event §5, §7

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:30:36 +01:00
jschoubben b4155cc5a2 gofmt: the six files the delivery review named, and three import blocks
The assigner's asks.go, tools.go, seat_tools_test.go and assign/wants.go,
the builder's builds.go and the indexer's candidate_values.go, and the
import blocks of three tests the step runner's move reordered.

Builds: delivery review round 1, the gofmt finding

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:21:48 +01:00
jschoubben e6ae282b88 Finding 6: every module requires the mesh modules it builds with
The SDK, the assigner, the builder's buildrun, the indexer, the
pipeline, the watchman, mesh-enrolment and mesh-grants (and through the
SDK the checker's checkermsg and mesh-tools' node-tools) imported
packages of modules their go.mod did not require at the zero version;
the placement's go.work over the whole repository hid it, and a build
of the module alone with -mod=readonly refused it. Each now requires
them (beside a relative replace where the module keeps its siblings so),
and the indexer's and watchman's duplicated lines go.

Builds: design 47 G §427 (the group's check builds every importer); delivery review round 1, finding 6

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:21:14 +01:00
jschoubben 3e61b70517 SD5, BG11, BLD10: the build modules' shared code moves into the delivery SDK
All of mesh-build-go's buildstep Go module leaves mesh-catalog for
modules/mesh-delivery-sdk: the step run, fetch and release and the
regenerate-and-compare step as the package steprun, the CPU share as
steprun/buildcpu, the conformance kit as steprun/conformance, the seat
generator as seatgen with cmd/seatgen, and cmd/mesh-pack. The three
build modules and the builder's and checker's tests import the SDK and
keep no copy; the SDK requires nothing of mesh-catalog. Code the build
modules share is the delivery domain's SDK, not one module's package.
It carries the build-module round's two new files of that package
(dropdetected.go 247c422f, storedbuilds.go 904b8aed).

Builds: design 47 G §464, §680, §327, §420, §495

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:18:34 +01:00
jschoubben 71a35a6376 MV1: move contracts and sdk under modules/, importers follow
The delivery repository's contracts and SDK live under modules/ as
mesh-delivery-contracts and mesh-delivery-sdk, their Go module paths
renamed to match the folders (the TypeScript names already did), and
every importer in mesh-delivery, mesh-catalog, mesh-host, mesh-tools
and mesh-sdk follows in the same group: a design as it should be, one
path per module, checked by the group's check building every importer.

Builds: design 47 G §427, §88

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 05:09:56 +01:00
jschoubben 512bb3c75c Join 10: the assigner reads its outside-wait settings from the files its manifest declares
The validator refused the manifest: a process's env is not filled from config. As A-112 says, a process reads each
setting from a file with the content ${config:<key>}, read at its start (the builder's form); a missing or empty file is
the default, a content that is no positive whole number stops the start, naming the file.

Builds: design 47 G §633, §706, A-112

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 02:50:38 +01:00
jschoubben 9b3cc53db9 Join 10: the validator takes a seat's accepted kind on a stream in invokes at parse, as its seat rule does
The per-manifest invokes rule refused seat:<seat>.<stream>.<kind> (the pipeline's seat:node-build-go.check.step) before
the seat rule that accepts it was reached; the test now runs both rules on each row.

Builds: design 47 G A-102

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 02:49:04 +01:00
jschoubben 6563094d20 Merge branch 'feat/47-G-fix10-flake' into feat/47-G-join10 2026-11-12 02:39:12 +01:00
jschoubben 21540afaac Merge branch 'feat/47-G-fix10-validator' into feat/47-G-join10 2026-11-12 02:39:12 +01:00
jschoubben b5074699da Fix 10: the catalog client imports no other seat: the key codec and the source-branches follower move into mesh-delivery's sdk
Builds: design 47 G §614, §670 (ADR 0625 §4; lead answer A-144)
2026-11-12 02:26:55 +01:00
jschoubben fd3788c517 Fix 10: the indexer's source catch-up and trunk directories are answered in name order, not a map's
Kind: an order asserted or acted on that came from ranging a map.
Builds: design 47 G §15, §115, §362
2026-11-12 02:21:03 +01:00
jschoubben 5f3410cd24 Fix 10: the node-build-image acting-rule test lives beside the other hand-written tests; the pipeline's go.mod drops an unused require
Item 3: seatgen -check no longer names go/seats/nodebuildimage/acts_test.go (not written by the generator); the
test moves to the domain SDK's buildstep, which already reads the build seats' definitions. mesh-delivery-pipeline
no longer imports meshmoduleassigner.

Builds: design 47 G §324, §397

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 02:19:06 +01:00
jschoubben e6f91ed349 Watchman: time a build seat's ask from its step-progress, not from the holders' steps (fix 10, A-136)
Builds: design 47 G §483, §496, §602, A-136
2026-11-12 02:18:50 +01:00
jschoubben 91b1719af9 Fix 10: the validator accepts a consumed view of a seat and an invoke of a seat's accepted kind
Items 1 and 2 of the round: a consumes seat:<seat>.views.<state> is accepted where the seat offers the state as a view,
an invokes seat:<seat>.<kind> or seat:<seat>.<stream>.<kind> where the seat accepts it.

Builds: design 47 G §616, §699, A-102, A-131

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 02:17:45 +01:00
jschoubben ac153497f6 Join 9: the builder reads the build seats' steps in seat form, at the seat's holder (A-116, A-128)
module.json reads seat:node-build-<language>.steps as the checker and the watchman do; the
tools bundle reads <holder>.steps, the holder found by seatlist.HolderOf where it is read.

Builds: design 47 G A-116, A-126, A-128

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 02:06:19 +01:00
jschoubben bce3c96acb Join 9: the indexer, teller and pipeline name no seat list verb in their operatorask contract (A-126)
operatorask finds the holder through seatlist.HolderOf, so Contract.Lists and ListBody are gone.

Builds: design 47 G A-126

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:51:54 +01:00
jschoubben 4ed1f4c451 Merge branch 'feat/47-G-fix9-routeproxy' into feat/47-G-join9 2026-11-12 01:46:51 +01:00
jschoubben fed8acb376 Merge branch 'feat/47-G-fix9-catalog' into feat/47-G-join9 2026-11-12 01:46:51 +01:00
jschoubben f684304ca1 Merge branch 'feat/47-G-fix9-grants' into feat/47-G-join9 2026-11-12 01:46:51 +01:00
jschoubben 0655c45a27 Merge branch 'feat/47-G-fix9-serves' into feat/47-G-join9 2026-11-12 01:46:51 +01:00
jschoubben 529729f21b Merge branch 'feat/47-G-fix9-delivery' into feat/47-G-join9
The view's holderOf keeps the seatlist.HolderOf form of builder2 (A-126) over fix9-delivery's own assignments read.

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:46:51 +01:00
jschoubben 7428711d94 fix9-10: TestTheGrantsPartWhole: one reader of the part's durable on the stream running, and an ack settled before a consumer is read
The loop opening the part's own membership's streams bound the part's durable on SEAT_node-engine_running beside hearRunning, so the event running went to either reader and the state running stayed empty at random (about 1 run in 15 under load). The loop now leaves that stream to hearRunning. The subtest that compares a consumer's ack floor before and after acked asynchronously and failed 1 run in 30; it now waits for the ack's reply. The failure of an until in the whole-part test also names what the part said of running.

Builds: design 47 G §556, A-19

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:40:25 +01:00
jschoubben 6d9a7b8aae Checker follows the assignments of the holder of the seat mesh-module-assigner found at run time; FollowAssignments, AssignerModule and AssignmentsBucket go
buildrun gains AssignerHolder, AssignmentsOf and SleepFor (moved from the builder's program, which uses them), so
the builder and the checker follow the holder's first-view tool, views family and state alike; the checker's
manifest consumes the seat's views assignments and reads its assignments state, its composition reads the
picture once followed. The assigner's callers list for the first view gains the checker.

Builds: design 47 G A-82, A-119, A-126, A-131
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:38:34 +01:00
jschoubben 9a3af4a44b buildstep: BuildModuleOf goes, a build module is the holder of its build seat on the seat list
No caller is left (the checker, the watchman and the view find the holders; the builder's reader looks a step up by its seat).

Builds: design 47 G A-82
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:38:34 +01:00
jschoubben 565a90c71d Merge branch 'feat/47-G-fix9-builder2' into feat/47-G-fix9-checker 2026-11-12 01:34:16 +01:00
jschoubben 316cf8a3be The steps of the build seats are watched and read by their holders: no caller of BuildModuleOf is left but the view's
The watchman asks the seat that places modules who holds each build seat (seatlist.HolderOf) and watches that
holder's steps; its manifest reads the seats' steps and invokes the seat's assignments. The builder's stuck
reader looks a step up by its seat, the tests find the holders on their test seat list, the watchman's
integration bed answers who holds a seat. Its manifest tests take the manifest's requires.

Builds: design 47 G A-82, A-126
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:34:12 +01:00
jschoubben 9757688f56 fix9b2-1b: FollowAssignmentsIn takes the bucket; FollowAssignments keeps the fixed one for the checker, which another change owns
Builds: design 47 G A-119
2026-11-12 01:32:40 +01:00
jschoubben bd20ba5b8f Checker: the build modules are the holders of the build seats on the seat list, never a name
The checker's fixed names of the build modules (buildmodules.go in its program, rules and check) go: the
Examiner finds each build module by the language its seat's acting rule builds (buildrun.BuildSeats over
the seat list's definitions and the holders the indexer's modules name by their manifests' claims), the facts
carry the language where a level counts by it, and the program's manifest reads the steps and toolchains of
the seats and hears their toolchain-reported. The tools read the steps of each holder and follow the seat
list as the view does. Timers stay (A-118).

Builds: design 47 G A-82, A-118, §204
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:31:24 +01:00
jschoubben f299a1a8b9 fix9b2-6: the publish queue sends in the order it queued, whatever the clock says between two versions
Builds: design 47 G §588 (newest first)
2026-11-12 01:31:19 +01:00
jschoubben a5bb2ba5b5 fix9b2-2: the builder's process answers the seat mesh-builds' verb reserved; the tools bundle no longer serves it
serves beside the process in the manifest (no bus), the catalog half's carriers and seat mesh-catalog.versions used in the process; builder_build stays the bundle's.

Builds: design 47 G A-115, A-127, A-87
2026-11-12 01:30:37 +01:00
jschoubben 6034559dc2 fix9b2-1: the builder follows the assigner's view in seat form, its holder found at run time
consumes seat:mesh-module-assigner.views.assignments, reads seat:mesh-module-assigner.assignments; the holder is asked of the seat list (seatlist.HolderOf), the first view is the holder's first-view tool (A-131), the assigner's callers list gains the builder; FollowAssignments takes the bucket.

Builds: design 47 G A-119, A-116, A-131
2026-11-12 01:28:12 +01:00
jschoubben 89bbd20b5a fix9b2-3: the builder's operator asker names no list of the seat holders (operatorask finds the holder itself)
Builds: design 47 G A-126
2026-11-12 01:25:50 +01:00
jschoubben 418bf4f54f fix9b2-4: the view's build usage finds a seat's holder with mesh-sdk's seatlist.HolderOf, no lookup of its own
Builds: design 47 G A-126, A-82 (the view part of fix9-6 70e5845b taken in with the manifest tests' reader of fix9-1 09839e5d, which the view's tests need)
2026-11-12 01:23:47 +01:00
jschoubben e69f55468c fix9-1: the teller, view and watchman manifest tests' reader takes requires, and hold the findings as requires
Builds: design 47 G §383, §387; A-30
2026-11-12 01:23:28 +01:00
jschoubben fba07cba40 fix9-serves-3: the indexer validator's process-bus test follows A-127 (serves beside bus accepted, inside bus refused)
Builds: design 47 G A-115, A-127

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:19:59 +01:00
jschoubben ce8ab8b4aa fix9-serves-2: the grants part reads a process's serves beside its bus; a bus-less process's serves are the module's own account's
Builds: design 47 G A-115, A-127

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:19:38 +01:00
jschoubben af8de82d59 Fix 9.7d: the judge accepts a read of a seat's state where the seat declares it
Builds: design 47 G A-128 (A-116)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:19:33 +01:00
jschoubben bc1857ec73 fix9-9: the grants part composes the node-engine's state bounds (key write with a time to live, delete, watch) for every node's engine
Builds: design 47 G §560, A-77, A-92

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:18:52 +01:00
jschoubben 1eb481ccc8 Builder: the manifest names no other module, the floor reads the seat git and the catalog half
The floor's tags are the seat git's verb tags and its requirements what the catalog half's entries
name for the package (indexer_requirements and the forge bridge's bridge_tags go from code and
manifest); a catalog revision the builder hears wakes a silent floor (the forge stream's consume
and its wake go). The guard test says A-107 relaxes ADR 0437 section 8 for a seat's verbs and
accepted kinds. The integration bed creates the state bounds the step bounds are kept in.
The assignments view's seat form (A-119 (3)) is not built here.

Builds: design 47 G §7, A-82, A-107, A-119
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:18:40 +01:00
jschoubben fd8f019751 Builder: a step bound already past ends at once, a key's time to live is at least a second
Builds: design 47 G A-77, A-101, A-118
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:18:40 +01:00
jschoubben b8abf3ed3b Fix 9.7a: the grants part resolves a read naming a seat to its holder
Builds: design 47 G A-116 (§636, §616)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:16:54 +01:00
jschoubben 8fc1997b1b fix9-8: the grants part composes the node-engine's grants for the seat mesh-recovery and for a module's catch-up tool
The node-engine of a node hears the kept events ended and restored through an ordered consumer, and calls the catch-up tool of a module placed on its node (its manifest's kept data name it); the verbs snapshot-kept, restore-kept and kept-points were granted already as the engine's invokes. No nodegrant mirror lives in mesh-delivery (it is mesh-host's).

Builds: design 47 G §406, §554, §631, A-108
2026-11-12 01:13:03 +01:00
jschoubben 90718ba7a3 fix9-7: a module that hears a seat's kept event is granted that stream's info (process.HearSeatEvents reads it); the forge bridge's bed holds the grant
Cause of the five forge bridge integration failures: HearSeatEvents (G §641) asks STREAM.INFO of the kept stream, which the grants part never composed.

Builds: design 47 G §641, A-19, §556
2026-11-12 01:10:17 +01:00
jschoubben 46b5d409bf Fix 9.4b: meshcatalogclient: Ready and Entry over the branch follower, the entries rows, the entry-not-found finding and the entry_again tool, built once
Builds: design 47 G A-103, A-15, §614

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:09:46 +01:00
jschoubben eaa578a4b9 Builder: an ask's step bounds are keys with their own time to live
buildrun.Asker takes optional Bounds and Expiry: the stand-still bound and the cap of three bounds are
the keys stand.<ask> and cap.<ask> of the builder's state bounds, whose expiry the builder's watch of
that state tells the Expiry, and Wait ends then; no timer of the process. With no Bounds (the checker's
Asker, which the lead's A-118 leaves as it is) Wait keeps its timers.

Builds: design 47 G A-77, A-101, A-118
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:07:35 +01:00
jschoubben 13c5433c0d fix9-6: the view's build usage finds the build seats and their holders, never a build module's name
build_usage reads each build seat's steps and pauses through the seat; the view's tools follow the seat list (view_seat_list, view_seat_list_again) and ask the holder of each seat of the seat mesh-module-assigner.

Builds: design 47 G A-82, A-74, §204
2026-11-12 01:07:00 +01:00
jschoubben b3f7054345 Builder: the operator's ask uses mesh-sdk's operatorask asker
The builder's own lookup of the seat holder and read of the router's record (routerBucket, recordVia in
cmd/mesh-delivery-builder/retake.go) are deleted: the ask is published and the router's decided heard
through operatorask.Asker, and each warrant is held to its ask and acted on once by the operator-channel
client's Take.

Builds: design 47 G A-101 (one operator-channel asker in mesh-sdk), §700, A-74
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:05:42 +01:00
jschoubben 62e56af786 Builder: the dead candidate machinery goes
Builder.Candidate, ForgetCandidate, considerCandidate, trunkHead, TrunkMoved, the cands and via
maps, the package-member wait that read via.Members (memberBuilds, memberEnded, MemberBoundEnded,
the member bound key) and the committed build output modules/mesh-delivery-builder/mesh-delivery-builder
are removed. Nothing fed Candidate in the process: the builder follows no candidate and learns a
run's builds from the build step ask. Their tests go with them.

Builds: design 47 G A-84 (the builder follows no candidate), §194, §348, §473
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:04:23 +01:00
jschoubben a8601f5a5c fix9-5: the indexer, the runner and the teller read the router's record through mesh-sdk's operatorask; no copy of the seat-holder lookup, no messenger_asks constant
Builds: design 47 G A-101, A-74, §700
2026-11-12 01:03:31 +01:00
jschoubben e1bf32b9fb Builder: the start's sweep keeps a key of a fingerprint a followed half's picture holds
The follower closes Ready before it tells its entries, so the sweep at ready could close a building key
whose entry was not taken in yet and the entry then asked again (four asks where two). The sweep now
takes the fingerprints of the halves' pictures as current.

Builds: design 47 G §348, §479 (the builder reads the catalog half per watched branch), issue 1660's sweep
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:02:27 +01:00
jschoubben 9c70fa6599 Fix 9.5: the seat node-build-image's build acting rule acts on kind:image
Builds: design 47 G §324, §397

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 01:02:09 +01:00
jschoubben d260113d51 fix9-4: the mesh-wants wanted stream keeps each want's last word with no age limit
The generated contract is unchanged by seatgen (the keep is read from the definition).

Builds: design 47 G A-114 (§693, A-61)
2026-11-12 01:01:30 +01:00
jschoubben 1e2091fcba fix9-3: the indexer judge's process-bus rule accepts serves, read whole by the grant composition
Builds: design 47 G A-107, A-109, A-110
2026-11-12 01:00:31 +01:00
jschoubben 6d94262f8c fix9-2: the enrolment's manifest test holds its findings as requires (two states, the findings state and the finding stream)
Builds: design 47 G §383, §387; A-30
2026-11-12 00:59:48 +01:00
jschoubben 6d423fb3dc fix9-1: the teller, view and watchman manifest tests' reader takes requires, and hold the findings as requires
Builds: design 47 G §383, §387; A-30
2026-11-12 00:59:22 +01:00
jschoubben 3a2b6f4a9c Join 8: the first-branch reserve test expects the entry's fingerprint on the reservation (A-76)
Builds: design 47 G join of rounds 4-8
2026-11-12 00:28:51 +01:00
jschoubben 938531cb10 Join 8: one-line join mismatches (builder stuck steps, republish test Built, indexer judge CatchUp pointer)
Builds: design 47 G join of rounds 4-8
2026-11-12 00:17:24 +01:00
jschoubben fcd849be7a Merge branch 'feat/47-G-judge5' into feat/47-G-join8
# Conflicts:
#	modules/mesh-delivery-pipeline/manifest_test.go
2026-11-12 00:14:13 +01:00
jschoubben f79ef33b4b Merge branch 'feat/47-G-buildfix6' into feat/47-G-join8 2026-11-12 00:14:02 +01:00
jschoubben 26eb65e0a2 Merge branch 'feat/47-G-recover-runner' into feat/47-G-join8 2026-11-12 00:14:02 +01:00
jschoubben bf610ec08a Merge branch 'feat/47-G-builder6y' into feat/47-G-join8
# Conflicts:
#	modules/mesh-delivery-builder/buildrun/asks_test.go
#	modules/mesh-delivery-builder/cmd/mesh-delivery-builder-tools/main.go
#	modules/mesh-delivery-builder/cmd/mesh-delivery-builder/main.go
#	modules/mesh-delivery-builder/internal/build/numbers.go
#	modules/mesh-delivery-builder/internal/build/run.go
#	modules/mesh-delivery-builder/internal/build/stuck.go
#	modules/mesh-delivery-builder/internal/versions/publish.go
#	modules/mesh-delivery-builder/internal/versions/reserve.go
#	modules/mesh-delivery-builder/manifest_test.go
#	modules/mesh-delivery-builder/module.json
2026-11-12 00:13:58 +01:00
jschoubben 4f056485f2 Merge branch 'feat/47-G-builder6' into feat/47-G-join8 2026-11-12 00:12:54 +01:00
jschoubben 3524c880ea Merge branch 'feat/47-G-indexer6b' into feat/47-G-join8
# Conflicts:
#	modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer-tools/main.go
#	modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer/integration_test.go
#	modules/mesh-delivery-indexer/cmd/mesh-delivery-indexer/main.go
#	modules/mesh-delivery-indexer/internal/index/pending.go
#	modules/mesh-delivery-indexer/internal/index/pending_test.go
#	modules/mesh-delivery-indexer/manifest_test.go
2026-11-12 00:12:54 +01:00
jschoubben 150acc753e Merge branch 'feat/47-G-indexer6a' into feat/47-G-join8
# Conflicts:
#	contracts/seats/mesh-wants/seat.json
2026-11-12 00:12:14 +01:00
jschoubben d4e82c8aff Merge branch 'feat/47-G-kepton7' into feat/47-G-join8 2026-11-12 00:11:54 +01:00
jschoubben ef6eb0023a Merge branch 'feat/47-G-outside5' into feat/47-G-join8 2026-11-12 00:11:54 +01:00
jschoubben 56cfbb757a Merge branch 'feat/47-G-teller5' into feat/47-G-join8 2026-11-12 00:11:54 +01:00
jschoubben a2dfbec30d The builder no longer watches the gate's source for candidate base merges
A candidate comes by the runner's build step ask (A-97), so the builder's trunkSource watch of the gate's source, its
sourceHeads, the wake it gave a floor, its read mesh-delivery-gate.source and the bed's source bucket go.

Builds: design 47 G A-97, A-84
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 00:10:29 +01:00
jschoubben 8160dc8d26 A-97: the builder takes the runner's build step ask on mesh-builds and answers its end
The seat mesh-builds' accepted kind step (cherry-picked contract 0dc8c723 of feat/47-G-recover-runner) names an entry by
fingerprint; the builder reads it through the catalog half or the seat mesh-catalog's entry, builds it through its one claim, plan
and lanes (a build per fingerprint, no pull request number) and says the end as step-ended.<node> under the ask's id, naming each
entry as asked. A build already done is passed at once; the end of a build wakes its waiting step through the log entry.

Builds: design 47 G §230, §194, §473, A-84, A-91, A-97, A-99
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 00:07:53 +01:00
jschoubben 009c4c6e73 A-97: the seat mesh-builds accepts the build step and says its end
The accepted kind step (body StepRun: the pipeline, the branch, the source revision and each entry by module and
fingerprint) and the event step-ended.<node> (StepEnded: the same entries, the outcome), as mesh-wants has for its
composition step.

Builds: design 47 G A-97 (§230, §194, §473)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 00:04:41 +01:00
jschoubben 84bcdb687a BL18: build modules found through their build seats' holders on the seat list
The builder finds a build module as the indexer's seed does: the build seat whose acting rule
`build` has an `on` matching the artifact's language or kind:image, and that seat's holder, read
from the seat list's definitions and the claims of the catalog half's manifests. Task.Module, every
lane key, the unpublished modules, the toolchain sources, the ends watched, the sayer and
builder_stuck (through `<seat>.steps`) derive from it; the floor's sources are the holders of the
seats git and mesh-catalog. buildrun.GoBuildModule, NodeBuildModule, LanguageOf,
buildstep.BuildModuleOf use, build.ImageBuildModule and StuckBuildModules are gone from the builder
(the checker keeps its own names in two small files until its part reads them from the list).

Builds: design 47 G §7, §428, §704, §204, A-82
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 00:04:34 +01:00
jschoubben 5bed0cd831 grants-serve: a process's serves compose its call and tool subscribes and, for a chunked verb, its chunk publish and ack subscribe
Replaces A-60's grant of chunk subjects to the bundle's principal.

Builds: design 47 G A-107, A-109, A-110
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-12 00:00:23 +01:00
jschoubben 224d57fbcf RN5: the runner's whole-module integration test against the embedded bus
Starts the program, takes a take-in.taken, sees the pipeline placed and its build asked, takes the build's step-ended and
answers a session's review through the seat, the proven caller recorded; the pipeline then ends passed.

Builds: design 47 G §22, §44, §54, §70, §482, A-106, A-107

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:57:16 +01:00
jschoubben 88699377d2 RN4: the runner's process answers review, rerun, accept and cancel
A review ends a placed review step with its proven caller; rerun asks a step again under a new ask saying it is a rerun
and by whom; accept takes a failed optional step; cancel ends a running pipeline cancelled and drops its asks' bounds.
Each writes `pipelines` by compare-and-set, says step-ended, step-started or pipeline-ended, and records its hand act
first, through AnswerSeat.

Builds: design 47 G §22, §70, §482, §30, §325, §394, A-107

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:54:26 +01:00
jschoubben 960c8e104a §416, §25, A-104: a step ask carries the kept results of its package and the toolchain of its language
The asking half reads, in one pass for all a pipeline's asks, the kept entries whose package is the artifact's package from
the catalog entry or lies beneath it, and the runner's own toolchain per language, kept in the new state toolchains as
heard from toolchain-agreed.

Builds: design 47 G §25, §416, A-104

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:43:35 +01:00
jschoubben 160961a1f4 §535, §647, A-77, A-104: an ask no build seat holder takes within five minutes ends its step
The runner arms, before it puts an ask on a build seat's work queue, a key of its new state bounds (key-ttl) for five
minutes, deletes it when the holder's ask-taken is heard, and ends the step could not run naming the seat when the bus's
marker of the key's expiry is heard: no timer, and no look at the seat list.

Builds: design 47 G §32, §535, §602, §647, A-77, A-104

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:42:12 +01:00
jschoubben db942e9204 §88: a restarted runner asks the steps placed and not yet asked
Starter.Resume asks again each running step of a branch's running pipelines under the id it was placed under; the branch
view tells Views.OnReady once when it holds its first half, and the runner resumes that branch then.

Builds: design 47 G §22, §24, §88

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:40:22 +01:00
jschoubben f067f2cdb0 A-104: an optional step still waiting does not hold a pipeline's end
Only a required step still waiting or running holds endPipeline; a code review nobody gave on an optional policy no
longer keeps the pipeline open. The review verb itself is not built: see the report.

Builds: design 47 G §22, §70, §482, A-104

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:39:07 +01:00
jschoubben 53db5c8dd9 A-102: the runner names the accepted kinds it puts steps on in invokes, and build joins the step inputs
The manifest's invokes names seat:mesh-builds.step, seat:mesh-wants.step and each build seat's check.step; the seat's
definition gives rerun, accept and why-carried inputs and the started pipeline's steps the value build, as the result's
step enum has it.

Builds: design 47 G §22, §24, A-97, A-99, A-102

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:38:37 +01:00
jschoubben 977b69ce07 RN3: the runner asks the seat mesh-wants for the composition step and hears its step-ended
Place puts composition running, asked of mesh-wants at its accepted kind step with the pipeline's commit,
fingerprint, revision and source; the hearer takes mesh-wants' step-ended as the build seats' ends.

Builds: design 47 G §22, §24

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:37:55 +01:00
jschoubben 92ce8c777c A-99: the build is every pipeline's first step, asked of mesh-builds for the module's own entry
The runner's step enum gains build; Place puts the build first, required whatever the policy names, and asks it of the
seat mesh-builds naming the module's own entry by fingerprint; the hearer takes mesh-builds' step-ended as the other
seats' ends, held to its one entry.

Builds: design 47 G §230, A-91, A-97, A-99

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:34:17 +01:00
jschoubben dc024ae552 BL17e: the read of an ask's steps is a kept call: a fault ends no key, the watch is taken up again from its last revision, past five minutes unanswered it is call-unanswered on a bound key
JetStreamAsks.WatchAsk opens the watch as a kept call and takes a closed watch up after the last revision heard; the first
fault arms a key of the state bounds with its own time to live (StepsBoundKey), whose end while the read is unanswered raises
call-unanswered about the ask, and the answer ends it.

Builds: design 47 G §568, A-77
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:33:20 +01:00
jschoubben 6bd156e4a6 A-97: the seat mesh-builds accepts the build step and says its end
The accepted kind step (body StepRun: the pipeline, the branch, the source revision and each entry by module and
fingerprint) and the event step-ended.<node> (StepEnded: the same entries, the outcome), as mesh-wants has for its
composition step.

Builds: design 47 G A-97 (§230, §194, §473)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:32:53 +01:00
jschoubben 6c852a8eea Assigner: hears build.ended and version-released, reads no build log; a want's version and parts come from them
A kept build's or another branch's build names its parts and keeping node from build.ended; the trunk's entry names its version and parts from the version-released whose source is the kept assignment graph revision's. The parts' contract comment says <module>:<artifact>.

Builds: design 47 G §379, §525, §526, A-94, A-96, A-67

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:32:50 +01:00
jschoubben b3cd0ef661 indexer: a watched branch other than the first is taken in from its source into its own revision, a pure computation from its heads' merged messages
sourceFollow takes source.<branch> for every branch the seat lists (the answer with no branch), ApplyBranchSource computes each module's
fingerprint, inputs and graph node over a view in memory seeded from the branch's newest revision, and keeps it with KeepBranchEntries;
the trunk's modules, manifests, taken state, graph and packages are not written. The trunk branch is named once (index.TrunkBranch).

Builds: design 47 G §13, §14, §291, ADR 0666 §6, A-85, A-90, A-93
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:31:30 +01:00
jschoubben fdf7387b8e §610: the runner's seat definition drops every verb's named callers
Builds: design 47 G §610, A-75

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:31:26 +01:00
jschoubben d1357239e2 Builder: says build.ended itself on its own stream mesh-delivery-builder-builds
Each done build's end is published as build.ended.<module>.<fingerprint> (escaped) with the module, fingerprint, made digests, kept-on and branch, where the log entry is written.

Builds: design 47 G §379, A-96

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:30:47 +01:00
jschoubben 8ea78f709a BL1: the whole package-published per artifact on the registry seat's published, from the reservation and the step result
When a registry seat says published, the builder says the seat mesh-builds' package-published once per artifact the reservation
newly marks: the artifact reference, version and digest published, the watched branch and the source revision kept on the
reservation from the entry the build came from (A-57), and the dependencies of kind 1 (resolved) and 3 (toolchain) the step result
named (§466, §673), their parts the artifact references the entry's edges name. The reservation keeps the dependencies from the
build's end until the publication.

Builds: design 47 G §52, §334, §349, §371, §466, §673, A-57
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:30:45 +01:00
jschoubben cdd1169bd4 RN3 (asking half): the runner places a pipeline's steps from the policy and asks each build seat for its step
A step the module's policy does not name is no step (A-91); a bypassed step is asked of no one; an artifact no
build seat names ends its step could not run naming it; an approval due at the start is asked there. The hearer is
named by the runner's own module, the asker the router's decided names.

Builds: design 47 G §22, §24, §26, §44, §54, §103, §323, §476, A-91

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:30:41 +01:00
jschoubben 088f55f94c BL5 (watched-branch half): a build carries the branch and source revision of its catalog revision, and only the first watched branch reserves
An entry the builder takes from the catalog half carries its origin: the watched branch, the source revision of the catalog revision it
came from and whether the branch is the first of the module's registration. A build of another branch reserves no version and is
built and delivered by its fingerprint; a reservation of the first branch keeps the branch and the source revision for the
publication.

Builds: design 47 G §371, A-57
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:28:11 +01:00
jschoubben 12e3f2dc48 BL17d: builder_build answers a module's build keys whole; builder_builds_since takes module; builder_stuck's fingerprint pinned whole
builder_build reads the builds and asked states, and the tools bundle follows the catalog half itself (registrations for the
watched branches, revision per branch) for `newest`; the manifest names the tool and the two seat verbs.

Builds: design 47 G §589, A-87
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:28:08 +01:00
jschoubben 5524cfa8d8 BL6: the builder follows the catalog half per watched branch through the shared branch follower
The builder adopts meshcatalogclient's branch follower on its views reader (A-5, A-15): the modules, their manifests (kept from the
entry that holds them, by its digest), their packages and each package's name in its ecosystem are read from the catalog half's
entries, never the indexer's modules, manifests, candidates and packages views; an entry of a branch other than the module's first
builds its fingerprint and supersedes only its own branch's older one; the start's sweep runs once every followed half's first view
is in; the builder's tools bundle reads package names through the same follower. A run's candidate is no input of the builder
(A-84): its read of the indexer's candidates view goes, and the entry point for a run's build ask is not built (no line gives the
ask's form). The seats' events the builder's own handler takes are named per seat so the follower's events have one taker.

Builds: design 47 G §348, §479, §614, A-5, A-15, A-84
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:27:01 +01:00
jschoubben 457b08ce15 Assigner: hears the builder's build log and writes a kept build's parts and keeping node into the want
The want names parts (by <module>:<artifact>) and kept-on from the build's end, only for a node whose engine states want-parts.

Builds: design 47 G §526, §379, §525, §671
2026-11-11 23:26:52 +01:00
jschoubben 56a6c64586 A-89: the runner asks its approval and reads the warrant from the router's record through the seat holder
Builds: design 47 G §37, §700, A-74, A-89 (routerRecordOf copied from the indexer's b0d2841f, to move into mesh-sdk)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:26:22 +01:00
jschoubben 7ee394b7d9 A-D10, A-D12, A-D13: the runner takes a step's end only as asked, keeps its results, and asks the approval step last, ended by its warrant
The hearer (internal/pipeline/steps.go) takes a build seat's step-ended only from the subject of the node that ran it, for an ask
the runner made of that seat, at the pipeline's commit and fingerprint; a taken end is written by compare-and-set, logged, its
output kept in step-outputs and its passing results in kept. A pipeline ends once every step ended, passed only when every
required step passed or was carried. The approval step is asked as operator-channel's accepted kind ask once every other required
step passed, and ended by the warrant read from the router's record (A-89), the decided event only waking the runner. The program
hears step-ended; the approval's Asker and decided handler wait for the answer on where a process finds the seat holder (A-74).

Builds: design 47 G §24, §26, §27, §37, §700 (A-89, A-74); recovers 18e10200 and 89687404 in today's form

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:25:28 +01:00
jschoubben 50cca4309f BL17c: the operator is asked once a key's event builds are spent; Build once more builds it as a person's build, Leave it nothing
The builder's asker on the seat operator-channel (level approve, about the key, state asked), the teller's three bus
adapters (publish, the router's record through the seat's holder on the seat list, decided heard through the hub's
events handler); the manifest uses the seat and consumes decided.

Builds: design 47 G §568, A-74
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:25:00 +01:00
jschoubben e27160571a indexer: go.mod requires the nodeengine seat directly, which its code imports
Builds: design 47 G A-86 (handover item 3: go mod tidy of the nodeengine require; tidy cannot run offline, the one line is made by hand)
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:24:51 +01:00
jschoubben 31792235e6 indexer: the build-edges state for builds of another watched branch, pruned on registration-changed, outdated kind 1 against the branch's newest build
BuildEdges.fp is the entry's fingerprint in the branch's revision whose source the build names; the branch's newest build
is kept as heard in heard as branch-build.<module>.<branch>.

Builds: design 47 G §374, §375, A-83, A-80, A-85
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:24:41 +01:00
jschoubben a245c2f1e9 Contract: the seat mesh-wants' want names the node that keeps a kept build in kept-on
Builds: design 47 G §526, §379, §271
2026-11-11 23:23:30 +01:00
jschoubben 13550328a6 indexer: a catalog revision per watched branch, branch.<branch>.<n> beside trunk.<n>, and revision answering per branch
The first watched branch's revisions stay trunk.<n>; catalog-revision names its branch, escaped. Nothing yet takes a
non-first branch's source revision in (KeepBranchEntries has no caller).

Builds: design 47 G §291, §614, A-85
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:22:34 +01:00
jschoubben 2c8dff86b5 RN3 (take-in half): the runner starts one pipeline per entry of a take-in.taken, a second start writing nothing
Builds: design 47 G §44, §54, §103, §476 (recovers the start of d8dfc557 in the form the design has today)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:20:32 +01:00
jschoubben 64def921ea indexer: an input is also keyed by its run ask's id and deleted at the build seat's step-ended of that ask
KeepInput takes the ask's id. It has no caller yet: the indexer publishes no run ask for its validation in this tree.

Builds: design 47 G §354, A-78 d
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:19:29 +01:00
jschoubben 2339eb60b8 BL17b: a key failed on a transport fault is built again on the events that say its cause passed, counted in event-builds
Builds: design 47 G §568

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:19:08 +01:00
jschoubben bdc9a61524 indexer: the first fill's edge entries, marked filled, from the placement and the stream running read whole
VersionEdge gains filled (mesh-catalog seat contract, regenerated).

Builds: design 47 G §377, A-78 c, A-62, §556
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:17:28 +01:00
jschoubben 381b55ef53 BL17a: a key failed on a transport fault says it as 'transport fault: <class>, <seat> <node>, <cause>'; drops a committed binary
Builds: design 47 G §568, A-76

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:16:40 +01:00
jschoubben c6af94fe58 indexer: outdated for kinds 3, 5 and 6; the acts of wait-ended kept as heard
Builds: design 47 G A-78 a, b, A-80, §374, §375
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:13:38 +01:00
jschoubben 5b6175714b BL12 / G-16 §588: the builder publishes reserved versions again, on an event by stream sequence and by builder_publish_again
The reservation keeps the fingerprint of the catalog entry it was made from (versions.Source, A-76). The state sections
publish-queue (max-mib 4) and acted (max-mib 1); a consumer acting once per message of the node-engine seat's running and
manifest-reads-changed (why returned) by its stream sequence, the running of every subject read at the start with
lastPerSubject; one queue per holder sent one at a time as the registry seat's publish with the digest and no parts, the
seat and the package name read from the entry (A-73, A-76); builder_publish_queue and the new builder_publish_again, a
hand act. The old form goes: build.NewPublishAgain / ModePublishAgain, versions.Acts.PublishAgain and the
Again* decision, and the integration step that refused it.

Builds: design 47 G §588, §369, §695, A-73, A-76 (G-16, G-18, G-20)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:12:32 +01:00
jschoubben 260a16181c BL7: reserved by name from the catalog half's view, builder_versions calls it
The builder's tools bundle serves reserved given a package's name: it follows the catalog half's packages view itself, finds the
module from the name, answers the reserved version, or for a version no reservation holds asks the seat mesh-catalog's versions
and answers released with the release's digests; a name no entry carries, two entries carry, or a version neither reserved nor
released is answered error. builder_versions by name calls reserved through its invokes. The builder's process serves no call.

Builds: design 47 G §572, §582 (A-70)
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:12:27 +01:00
jschoubben bec5e063bc indexer: what it heard (steps-since, call-since, toolchain, delivered, pending) lives in the state heard, each key part escaped
The own-build state keeps its one key.

Builds: design 47 G A-80, §73, §375
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:10:36 +01:00
jschoubben efcc8125af BL9: a group run's build names each package member's build by its digest
A candidate's module is fetched against each package member of its group by the digest of the member's build (fetch `builds`),
the member out of the fetched packages; a member not built holds it with wait-held naming the member, its bound a key of the
builder's bounds state with its own time to live (A-77), a failed member or one missing past the bound fails the step naming it.

Builds: design 47 G §373, §465 (A-77)
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:09:33 +01:00
jschoubben d9066aa1c6 indexer: the release's edge entries, outdated for kinds 1, 2 and 4, toolchain-agreed and version-delivered kept as heard, the verb input and its state
Kind 3, kinds 5 and 6, the first fill's edge entries (§377) and the deletion of an input at its ask's step-ended are not built.

Builds: design 47 G §374, §375, §354, A-68

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:07:45 +01:00
jschoubben 1a234ccea9 §484: the status view reads the oldest waiting ask in both forms of the accept subject
Builds: design 47 G §484, §600

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:06:11 +01:00
jschoubben ee30209040 §706 (grants part's unit case): the assigner is granted the conditions it reads and nothing of the watchman's findings
A module that invokes the seat mesh-conditions' verb conditions and consumes condition-raised, condition-changed and
condition-cleared is composed exactly those subjects, and no read of another module's findings.

Builds: design 47 G §706
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:05:15 +01:00
jschoubben 2992b08a11 §469 (GR, A-8 line of G): a bucket composed from an old state section takes its maximum size from its max-mib
The grants part's composer gains Bucket.MaxMiB and Bucket.MaxBytes() (as mesh-sdk's buscompose has them): the bucket's stream is
created with that cap and an assertion raises a held one to it; an entry naming none keeps the mesh's cap, so no bucket of today
changes.

Builds: design 47 G §469, §695
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:05:15 +01:00
jschoubben 626a824e65 indexer, mesh-catalog contract: an unwatch of a branch a placement names is refused as placed
The indexer asks the seat mesh-module-assigner's verb placement (input {module}, answer {placements: [{branch, nodes}]}, A-62)
before an unwatch is proposed and refuses one whose branch a placement names, with the reason placed (new in the seat
mesh-catalog's contract) naming the placement; its manifest invokes the verb.

Builds: design 47 G §704 (unwatch), A-62
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:04:51 +01:00
jschoubben 844a2443a5 Assigner: says wanted in the same write as each want, kept last per node and module
Each want the assigner writes (the rules' wants, a backup answer's, a put's) and each removing want is said `wanted` on
the subject of its node and module, each escaped as a name, with the revision and source of the kept assignment graph
revision; a removal carries the fingerprint last wanted. A put that wrote nothing says nothing; with no revision kept the
journal says wanted was not said.

Builds: design 47 G A-61 (§693, §683, §556), A-67

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:04:51 +01:00
jschoubben e9d2997760 indexer: the first fill of the versions from builder_versions, then versions-filled
Filled once, as released, with each module's highest published version; an unanswered builder_versions holds it and, after
five minutes, is call-unanswered. The edge entries of the first fill (§377) wait for answers.

Builds: design 47 G §372

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:04:14 +01:00
jschoubben 5d33692d7f Assigner: the pass keeps an assignment graph revision per catalog revision taken in, first
The pass computes the assignment graph revision (assigngraph.Compute) from the catalog halves it follows, the placements,
the first branch of each registration and each node's capability reading, keeps it in the objects assignment-revisions
through a bus adapter modelled on the indexer's, says assignment-revision, and holds the kept revision and its catalog
source for the wants.

Builds: design 47 G A-67, §292, G-5 "the wants follow the trunk's assignment graph"

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:04:14 +01:00
jschoubben 676d4bace4 indexer: the router's record of an ask is read through the seat operator-channel's state asks, under the indexer's own name
routerRecordUnread is replaced by routerRecordOf: operatorchannelclient's Record is a get of the key (<module>.<id>) on the
process's own bus connection (process.Conn.Ask), in the bucket formed from the seat's holder on the seat list (the seat
mesh-module-assigner's verb assignments with seats) and the contract's StateAsks, no module's name in the program. The manifest
uses operator-channel and invokes that verb.

Builds: design 47 G §700, A-74
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:04:04 +01:00
jschoubben 60b1479e8a A-71 (builder): toolchain-wait-minutes reaches the builder as a file the manifest declares, read at its start, never its environment
The manifest gains the file resource toolchain-wait (content ${config:toolchain-wait-minutes}) and names its path in
MESH_BUILDER_TOOLCHAIN_WAIT_FILE; main.go's toolchainWaitOf reads it.

Builds: design 47 G §672, A-71 (G-20)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:03:11 +01:00
jschoubben a2ac794e7a GR-chunks (A-60, §681): the chunk subjects of a chunks verb go to the principal that answers it, the reverse to an account naming it; the keeper's standing restore of restricted streams
The seat list's verbs saying `chunks: true` (ChunkVerbsOf, as KeptEventsOf) give the principal that answers the verb (a module's
own account for a seat it holds, the tool runner's for a carried module's) the publish of the chunk subjects and the
subscription to the acks, and an account naming the verb by name in `invokes` the reverse; a `*` entry none. The bus module's
keeper holds a standing grant of the restore subjects of the restricted streams, and only those.

Builds: design 47 G §681, A-45, A-60
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:03:05 +01:00
jschoubben e85432c9f6 indexer: hear package-published, release a version once every artifact is published, say version-released; the verb versions
The state versions (64 MiB), a late older version recorded and not said, the newest 100 kept per module and never the
highest of a MAJOR.MINOR; the artifacts published so far are kept as pending.<module>.<version> in the own-build state.

Builds: design 47 G §349, §369, A-69

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:02:12 +01:00
jschoubben 5bbd78ad66 JUDGE: the runner's manifest test reads step-log as an old logs section, the indexer's foundation test lists the node-engine's module
Builds: design 47 G §470, §627

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:00:47 +01:00
jschoubben 9f65ca98d3 GR9/GR10 (A-5, A-52, §684, §444, §614): the grants part follows the catalog half through the branch follower on a views reader, and composes a want's account from its entry
The part adopts meshcatalogclient's branch follower on a views.ProcessReader holding its held finding writer (so its
view-waits is the reader's); the manifest of the build a want or a have names is the catalog graph's entry of that
fingerprint, not a builder's build (the `builds` read is gone); until every first view of the catalog half is in, the pass
keeps the list in force and only adds, says so in its log and in grants_first_views.

Builds: design 47 G §684, §444, §614, §191, A-5, A-52
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:00:41 +01:00
jschoubben d2441d5fcc indexer: a wanted that says the want removed empties that member from named
A member a running put in a set leaves it also when the want of that node and module is removed (the node left or the module was
unplaced), whatever that node last said running; a running or a wanted older than the removal does not bring it back, so a
restart that reads the two streams in either order reaches the same sets.

Builds: design 47 G §675, §693
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 23:00:14 +01:00
jschoubben 86bae053b6 indexer: kept while named, the state named of the wants and running builds that name a fingerprint
The indexer consumes the seat mesh-wants' wanted (on wanted.<node>.<module>, kept last per subject: the seat's definition gains
the two tokens and the keep) and the node-engine seat's running, each read whole at its start and followed; it keeps in the
old state section named (max-mib 4) one key per fingerprint with its set of <node>.<module>, written by compare-and-set. An
entry object is removed only when no kept revision lists it and its set is empty, and not before both streams were read and the
sets reconciled; its entry-index key goes with it. indexer_entries reads the set, indexer_named_drop removes one member by
hand (class act, said in the hand-act log first).

Builds: design 47 G §675, §695, A-61
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:59:59 +01:00
jschoubben 5906cecf19 BL16 (integration bed): the test bed's build seat workers take both forms of an accept subject, and the stale ask is put as the builder's
Builds: design 47 G §600, §481
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:59:28 +01:00
jschoubben c2a3f3553f Assigner: serves the seat mesh-module-assigner's verb placement
Builds: design 47 G A-62 (§704, §402)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:59:03 +01:00
jschoubben 940889c2a2 indexer: the seed's steps fetch carries the entry's packages; the time a seat is unanswered is kept in the own-build state
Builds: design 47 G §704, A-66

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:58:21 +01:00
jschoubben 9493d0d289 Contract: the seat mesh-wants' wanted is said per node and module, kept last per subject
Builds: design 47 G A-61 (§693, §683, §556, §73)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:57:31 +01:00
jschoubben c0e2621bba indexer: the seed asks steps of each artifact's build seat from the newest trunk entry
The seat list's build seat per artifact (language or kind), a kept call
<seat>.steps with {module, artifact, fingerprint, fetch}, and the finding
call-unanswered (scope call, id <seat>.steps) after five minutes, cleared on an answer.

Builds: design 47 G §704

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:56:06 +01:00
jschoubben 6cec46cc77 Assigner: the outside wait's settings are read from the program's environment, and the bed has a keeper
Builds: design 47 G §706, §633

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:53:42 +01:00
jschoubben 0f62358fb0 indexer: the findings registration-history-filling past 80 % and seed-waits kept until the warrant
Builds: design 47 G §704 (registration-history, seed findings), §8

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:49:57 +01:00
jschoubben e089fd9c3c indexer, mesh-catalog contract: manifest-accepted carries problems, the validator's strings
Builds: design 47 G §692, §668

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:48:51 +01:00
jschoubben 00ec7af34e Assigner: serves the seat mesh-wants' verb input and reads the kept inputs
Builds: design 47 G §354, §338

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:48:43 +01:00
jschoubben aa34cd20dd indexer: entry-index and proposals declare their max-mib caps (8 and 4)
named is not declared: the section is not built yet.

Builds: design 47 G §695, §469

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:48:04 +01:00
jschoubben 661b735060 D-29 (builder half, waits): the builder's old state waits declares max-mib 4
publish-queue 4 and acted 1 come with BL12, which makes the sections.

Builds: design 47 G §695, §672
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:47:54 +01:00
jschoubben 6530702037 JUDGE (§469, §695): an old state section entry takes max-mib, bounded as the objects section's
The judge reads the field through mesh-sdk's catalogue (feat/47-G-maxmib6, 1dc848d7): rows in the G words test accept 128 and refuse 0 and 9000 (they fail without that sdk), and the unknown-field message test names max-mib in the state form. The whole judge package needs this sdk and the bus5 sdk (ab3e7a7) together: with either alone one test of the other's change fails.

Builds: design 47 G §469, §695

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:47:51 +01:00
jschoubben 28cb212030 BL16: the builder puts its asks on accept.<queue>.builder, and a step key neither form parses is named in builder_stuck's journal
The delivery SDK's buildstep gains AskerBuilder, AskSubjectBy and ParseAskSubjectBy (an ask's subject names its
asker as the last token, main's form names none; ParseAskSubject reads both). The builder's put and its held-ask
reads use the builder's subject. Not built here: §543's refusal (the build modules'), the grants (grants part).

Builds: design 47 G §481, §484, §543, §600
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:47:40 +01:00
jschoubben 2b37238b30 JUDGE (§627): the node-engine's module is a foundation part, its findings stay in the old sections
Foundation gains mesh-host, the holder of the seat node-engine (§627, ADR 0619 §1); a row in the G words test accepts its old state and stream mesh-host-findings (fails without it).

Builds: design 47 G §627, §529, A-30

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:47:18 +01:00
jschoubben 48dfe36084 Assigner: a moved module's failing check on an outside cause is a wait that ends by itself
The wait (step outside, on, bound, clock-from, the settle, conditions-unread), its events, finding and ask,
assigner_waits and assigner_release with how, the settings, and a machine's own open network holding its wants.

Builds: design 47 G §706 (assigner), §498, §276, §633, §700

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:46:58 +01:00
jschoubben b46da94f50 indexer, mesh-catalog contract: a branch named candidate or entry is refused as reserved branch name
Builds: design 47 G §704 (branch named candidate or entry)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:46:36 +01:00
jschoubben 78825dc580 GR11 (A-51, §388): the grants part's first-view-unanswered, first-view-empty and binding-unlisted through the held finding writer
The part's state `findings`, its finding stream `mesh-grants-findings` and the consume of `mesh-conditions.findings-asked`
are declared in module.json; the process makes mesh-sdk's held writer (Asked from the contract) and starts it once its
state is bound. Its other conditions stay said to the operator channel. gofmt of bus.go and grants_test.go.

Builds: design 47 G §388 (G-8), §529 (G-12), A-51 (G-20)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:45:48 +01:00
jschoubben efce28c996 JUDGE (§584, A-54): every stream of a foundation part is a predefined form, its old sections kept for good
keptUntilMoved passes the streams of a Foundation module (the findings stream <module>-findings, distribution-events); a row in caseTwoModulesCannotDeclareOneStream names distribution-events (fails without the change).

Builds: design 47 G §584, A-54, A-30

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:45:40 +01:00
jschoubben 0dec003660 indexer: an image artifact's package is {image, module/artifact}
Builds: design 47 G §694

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:44:38 +01:00
jschoubben dcaf4d4084 JUDGE (§470): the runner's step-log is an old logs section kept 100 days of 128 MiB
The manifest declared step-log as a stream; §470 amends §85 to a logs section (max-age-days 100, max-mib 128), the form the judge's predefined-forms rule accepts.

Builds: design 47 G §470, §486

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:44:34 +01:00
jschoubben df82ca5959 JUDGE (A-30, §529, §387): the teller, the view, the watchman and the enrolment ask their findings in requires
Each drops its old state findings and stream <module>-findings for the requires entries findings (state, history kept) and finding-events (the three finding events, 7 days, 16 MiB); none is a foundation part (§529, A-30).

Builds: design 47 G §387, §529, §577, A-30

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:44:34 +01:00
jschoubben 1dcb310184 indexer: revision answers none-yet with no trunk revision (G holder)
Builds: design 47 G §530

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:44:09 +01:00
jschoubben 395c53e63f JUDGE (A-30, §529): a foundation part's own findings stream <module>-findings is a predefined form; the bus fixture serves §681's snapshot verbs
rules.go keptUntilMoved: the stream FindingStreamOf(module) of a foundation module is not refused as outside the predefined forms (the judge's own gwords.go requires it of a foundation part, A-30 says it stays in the old streams section). rules_test.go: rows in caseTwoModulesCannotDeclareOneStream (fails without the change), and caseTheMeshsOwnSeatsAreStillClaimable names snapshot-get, snapshot-restore, snapshot-restore-cancel, snapshot-remove (§681) instead of snapshot-kept and restore-kept (§554, mesh-recovery's).

Builds: design 47 G §529, §681, A-30

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:41:39 +01:00
jschoubben 81d6d548aa GR9 fix: findings-asked from the contract, the start read by HearSeatEvents, kept events known before the seat list is read
The definitions of definedEventsOf name mesh-sdk's three finding events and the seat mesh-conditions's findings-asked
(its generated contract's SubjectFindingsAsked). readRunningWhole is deleted: the part's durable on running is heard through
process.Account.HearSeatEvents with process.OnRead. The bootstrapped definitions name the kept events before the seat list is
read, so the part's first durable never filters running on EVENTS (a held consumer only gains filters).

Builds: design 47 G §556, §641, §644, A-3, A-13, A-17, A-19

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:40:07 +01:00
jschoubben 24d8e4e987 Contract: the seat mesh-wants' wait gains the step outside
Builds: design 47 G §706 (step outside added to §498's list), §498

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:39:00 +01:00
jschoubben 1cad83bad7 VERSION (A-46, §368, §411): every manifest of mesh-delivery says its version MAJOR.MINOR
0.1 for the 6 manifests that said "1" (builder_versions answers none for any name asked); the others already said 0.1.

Builds: design 47 G §368, §411, A-46

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:38:49 +01:00
jschoubben 9e762ec638 G teller: an ask the router refused (the client's Refused with its words) is the ended ask the teller waits on or says
Builds: design 47 G §570, §638
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:36:03 +01:00
jschoubben 0def1a70d7 Watchman: list the machines failing toward x in also of machine.x.network and machine.x.silent
Builds: design 47 G §706 (the watchman's change)

Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:35:25 +01:00
jschoubben 52241e7a17 Merge branch 'feat/47-G-findings4c' into feat/47-G-dev4-join 2026-11-11 22:25:53 +01:00
jschoubben c8fb62c3ad Merge branch 'feat/47-G-findings4' into feat/47-G-dev4-join 2026-11-11 22:25:53 +01:00
jschoubben 598359ff36 Merge branch 'feat/47-G-grants4' into feat/47-G-dev4-join 2026-11-11 22:25:52 +01:00
jschoubben b815b54bff G findings4 indexer: the indexer's findings are the seat's generated finding written through views.NewHeldWriter, its assignments followed through the views reader
The indexer's CAS Findings store is the held writer through the small FindingWriter interface (Write, Clear, Held): the
unread-call, accepted-unsaid, seat-definition and out-of-step findings are raised and cleared through it, the unsaid ones
read from Held. followAssignments follows the assigner's assignments through the module's ProcessReader (the reader raises and
clears the first view's finding), the emitter and the family-not-heard finding write through the same writer, and the
view-waits finding of the seat git is written by hand through Write and Clear (A-28). The old resolved words go (A-22).
The integration bed has the findings stream and the test sees finding-written said on it.

Builds: design 47 G A-29, A-26, A-28, A-22, A-3, A-14, A-17, A-30, A-37, A-38, §689, §687, §461
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:19:57 +01:00
jschoubben 00f5c1b821 G findings4 mesh-enrolment: the enrolment's reader writes its findings through views.NewStdioHeldWriter
Builds: design 47 G §639, A-37, A-29
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:19:39 +01:00
jschoubben 84d1a5b156 G findings4 builder: the builder's findings are the seat's generated finding written through views.NewHeldWriter, its findings stream in manifest and bed
Builds: design 47 G A-29, A-30, A-17, A-26, A-3, §689, §686, §383
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:18:58 +01:00
jschoubben 99b05bbb2e G findings4 buildrun: the checker's and the indexer's reads of the build modules' toolchains keep the gate over the assignments, which BL8 took out with the builder's
BL8 (8255eb28) replaced buildrun's ToolchainGate, ToolchainSet.Put and ToolchainsBucket by PlacedNodes and ToolchainSet.Set for the builder
(§546, §604); no design line removes the checker's and the indexer's toolchain reads, so the three come back beside them, and
FollowAssignments feeds either.

Builds: design 47 G §492, §604, §546, §472, §574
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:17:09 +01:00
jschoubben 813963a35a G findings4 buildrun: the checker's and the indexer's reads of the build modules' toolchains keep the gate over the assignments, which BL8 took out with the builder's
BL8 (8255eb28) replaced buildrun's ToolchainGate, ToolchainSet.Put and ToolchainsBucket by PlacedNodes and ToolchainSet.Set for the builder
(§546, §604); no design line removes the checker's and the indexer's toolchain reads, so the three come back beside them, and
FollowAssignments feeds either.

Builds: design 47 G §492, §604, §546, §472, §574
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
2026-11-11 22:16:37 +01:00
jschoubben 77772056bd G findings4 assigner: the assigner's findings are the seat's generated finding written through views.NewHeldWriter, its catalog halves adopted through the views reader
Builds: design 47 G A-29, A-26, A-22, A-3, A-14, §689, §687, §461
2026-11-11 22:13:03 +01:00
jschoubben f531d5524d G findings4 watchman: the watchman's findings go through views.NewHeldWriter and its own copy of the held writer goes
Builds: design 47 G A-29, §689, §461
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 22:03:27 +01:00
jschoubben 08fcdac0f8 G findings4: each writer is given the seat's findings-asked subject from the generated contract
Builds: design 47 G §383, §390, A-13, A-17
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:59:17 +01:00
jschoubben 0fdf56f4bb G findings4: the readers' findings go through the part's writer as views.WireWriter; the pipeline runner adopts each branch's catalog view through its reader
Builds: design 47 G §689, §687, A-22, A-26
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:58:50 +01:00
jschoubben 7310af36e6 G findings4 watchman: a finding's id keeps the safe key parts its condition's key had
Builds: design 47 G §689, A-14
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:56:38 +01:00
jschoubben 8cbb86dfbd G findings4 watchman: the watchman's findings are the seat's generated type, written through mesh-sdk's finding writer; the resolved words go
Builds: design 47 G §689, §686 (A-3), §461, §384, A-13, A-14, A-22
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:55:43 +01:00
jschoubben c87fc4e6cf G findings4 checker: the checker's check-could-not-run and its views reader's findings go through mesh-sdk's finding writer, which observes the raised ones
Builds: design 47 G §689, §686 (A-3), §639, §384, A-13
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:50:39 +01:00
jschoubben 8e4039a618 G findings4 view: the status view's views reader writes its findings through mesh-sdk's finding writer
Builds: design 47 G §689, §686 (A-3), §639, A-13
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:49:16 +01:00
jschoubben cd6e0ef317 G findings4 pipeline: the runner's views reader writes its findings through mesh-sdk's finding writer
Builds: design 47 G §689, §686 (A-3), §639, A-13
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:48:49 +01:00
jschoubben 67cec41b9c G findings4 teller: the teller's views reader writes its findings through mesh-sdk's finding writer
Builds: design 47 G §689, §686 (A-3), §639, A-13
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:48:23 +01:00
jschoubben 8b41346466 GR4 (§386, §644): the grants part tells catalogue.Hearing which events are defined
A seat definition's events of the seat list, and mesh-sdk's four finding events (views.FindingSubjects), so a `*` emitter before one reaches each declaring module's own stream; any other `*` entry stays the shared stream's.

Builds: design 47 G §386, §474, §644

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:46:19 +01:00
jschoubben 95e2427553 WM6 (§269): the watchman consumes the seat mesh-grants' wait-held and wait-ended, so a granting wait past its bound is acting-part-late
Its handler already takes any seat's wait events; the manifest's consumes gain the two. Not run here: the watchman does not build
against mesh-contracts' meshconditionsclient as it stands (the findings writer's migration is another developer's).

Builds: design 47 G §266, §269, G-20 A-12

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:45:10 +01:00
jschoubben c1a1b027b3 GR10 (A-12, A-10): the grants part says wait-held and wait-ended as its seat's events, and a release ends the wait as released
A release writes an ask to compose; the pass says wait-ended how released once, and a wait whose grant came says how ran. The events go through Conn.EmitSeat.
The late finding is the watchman's (design 47 G §269), not written here.

Builds: design 47 G §276, §266, §269, G-20 A-10, A-12

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:45:03 +01:00
jschoubben 9c68e42c44 A-5 (§614): meshcatalogclient follows the branches once for every part: registrations, the gate's source, views adopted and dropped, entries by fingerprint
Builds: design 47 G §614, A-5 (G-20)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:44:21 +01:00
jschoubben e635f7ba8f CT15 (take-in bodies, none-yet): the seat mesh-catalog's bodies give take-in.taken and take-in.pending; revision answers none-yet in a field
The seat's bodies hold TakeInTaken (branch, source, entries with repository and pull) and TakeInPending (branch); revision's
answer gains none-yet and its revision is optional; meshcatalogclient reads the field, never the error's words. The holders'
and readers' uses of the answer follow (a pointer revision).

Builds: design 47 G §476, §493, §530, §454, §648

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:44:21 +01:00
jschoubben 7574848c5f §702 the seat mesh-wants' wait gains owner, on and words, and its module is optional
The builder's toolchain wait is said with this type, step build; how may be superseded. Fixtures and generated code follow.

Builds: design 47 G §702, §629, §512

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:44:21 +01:00
jschoubben d637a89b5e §690 the seat mesh-delivery's source takes no branch and answers the branches it keeps
source's input branch is optional; given none it answers branches, the branch of each source key the gate keeps.
Fixtures and generated code follow.

Builds: design 47 G §690, §614

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:44:21 +01:00
jschoubben 7024df820a §693 / A-6: the seat mesh-wants' wanted event gains removed
Builds: design 47 G §693, A-6 (G-20)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:42:07 +01:00
jschoubben 0c28d6a716 A-5 (§614): meshcatalogclient follows the branches once for every part: registrations, the gate's source, views adopted and dropped, entries by fingerprint
Builds: design 47 G §614, A-5 (G-20)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:41:28 +01:00
jschoubben 847ab4e1fb GR10: the grants part holds each entry left without a grant as a granting wait, read and released by its tools
Kept in its own state, clock-from the start of this version's first pass, the bound 10 minutes. The seat's wait-held and
wait-ended events and acting-part-late are not built (see the report).

Builds: design 47 G §276, §266, §269 (G-20 A-7); A-6 needs no change: the part reads the wants view and consumes no wanted

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:39:36 +01:00
jschoubben 97e990c8f8 §556: a reader of a stream kept last per subject is granted its ordered consumer
Builds: design 47 G §556 (G-20 A-4)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:37:12 +01:00
jschoubben aac39f1326 G findings4: gofmt of the indexer's and watchman's manifest_test.go
Builds: design 47 G (lead's handover, round 4: gofmt only, no design line)
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:34:20 +01:00
jschoubben cad384d483 GR9: the grants part reads the stream running whole at each start, then follows its durable
Until the read ends the part acts on none of running and grants_first_views names the stream waiting; an event older by at
than the one held changes nothing. The ordered consumer's grants are not built (a question to the lead).

Builds: design 47 G §556, §199

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:34:08 +01:00
jschoubben 0b81504139 §616: the grants part resolves a consumed seat view to the seat's holder on record
Builds: design 47 G §616

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:32:42 +01:00
jschoubben 33c6fc4f7f CT15 (take-in bodies, none-yet): the seat mesh-catalog's bodies give take-in.taken and take-in.pending; revision answers none-yet in a field
The seat's bodies hold TakeInTaken (branch, source, entries with repository and pull) and TakeInPending (branch); revision's
answer gains none-yet and its revision is optional; meshcatalogclient reads the field, never the error's words. The holders'
and readers' uses of the answer follow (a pointer revision).

Builds: design 47 G §476, §493, §530, §454, §648

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:32:40 +01:00
jschoubben 92d938dd8c §702 the seat mesh-wants' wait gains owner, on and words, and its module is optional
The builder's toolchain wait is said with this type, step build; how may be superseded. Fixtures and generated code follow.

Builds: design 47 G §702, §629, §512

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:31:18 +01:00
jschoubben f0d041b8dc GR9: the grants part follows today's catalogue contracts and reads a stopped running as stopped
SeatsToPassOn takes what each node-engine's running said and a reader of entries, Assignment names the module and its
branch, Hearing takes the defined-events function (nil here: GR4's). HearRunning keeps a stopped running with no
fingerprint and no manifest, and a stopped module claims nothing on its node.

Builds: design 47 G §404, §459, §199, §386 (nil defines none)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:31:10 +01:00
jschoubben f9df426396 §690 the seat mesh-delivery's source takes no branch and answers the branches it keeps
source's input branch is optional; given none it answers branches, the branch of each source key the gate keeps.
Fixtures and generated code follow.

Builds: design 47 G §690, §614

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:30:49 +01:00
jschoubben f8e509ce56 The assigner and the indexer use the catalog key's codec meshcatalogkey; meshcatalogclient's two wrappers go
BL6 (ba43e400) kept KeyPart and ParseKeyPart in meshcatalogclient until the callers moved; they have, so the wrappers and their duplicate test go.

Builds: design 47 G §670

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:18:40 +01:00
jschoubben 4dc67a98fa The pipeline part and the assigner read the runner's events and pipeline by fingerprint, as CT14 names it
The join with CT14 (08812c7f) renames fp to fingerprint in the runner's Pipeline, PipelineStarted, PipelineEnded; the readers follow.

Builds: design 47 G §534, §550, §585, §646

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:17:19 +01:00
jschoubben 497f87176b The builder, checker, view and watchman read a step key as SD4 has it: ParseStepKey answers asker, node and id
The join with CT-SD4 (6351e988) gives ParseStepKey four values (G §484, §649); the callers that read only the node or the id follow.

Builds: design 47 G §484, §649

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 21:16:18 +01:00
jschoubben 57a4397c90 Merge branch 'feat/47-G-indexer-dev2' into feat/47-G-dev2-join 2026-11-11 21:06:21 +01:00
jschoubben 02f3d8c208 Merge branch 'feat/47-G-builder-2' into feat/47-G-dev2-join 2026-11-11 21:06:16 +01:00
jschoubben ad0282d5e9 IX25: the indexer's manifest declares its findings stream and the keeper's findings-asked, and TestIndexerWhole counts only a views event as a wake
The manifest validator refuses a module that declares the state findings without its stream and the consume (§387), so the
whole test's own manifest was refused; the waiter counted every manifest-accepted, which the indexer says for each manifest it
accepts, as a wake of the views family.

Builds: design 47 G §387, §639, §580

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:54:42 +01:00
jschoubben 21c97051c8 IX1-3: the registrations, the proposals that wait for their warrant, the seed, and the indexer's verbs and tools of them
The seat mesh-catalog's registrations, register, policy, watch and unwatch (each asks the operator, naming every value it
moves, with the change's digest, and writes only on the warrant), the state proposals with an ask id and a digest per key,
the consumer of operator-channel.decided, a restart that reads each open key, indexer_proposals, indexer_proposal_drop and
indexer_seed_again, the seed as one ask. The router's record of an ask is one injected read that fails loudly until the design
says how the program reads it (D-37); the seed's steps call is not wired.

Builds: design 47 G §667, §2, §3, §4, §5, §8, §9, §10, §342, §343, §482

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:53:23 +01:00
jschoubben b584af3f61 BL14: the builder holds an entry whose fingerprint names another toolchain, in its state waits, with wait-held and wait-ended
An entry whose fingerprint names a toolchain version of its language other than
the agreed one is held in the state waits (one key <module>.<fingerprint>), says
wait-held and wait-ended (ran when the agreed toolchain names the version,
released by builder_release) on its stream waits, says wait-held again for every
key at its start; builder_waits and builder_release; its setting
toolchain-wait-minutes. Not built: the bound's finding toolchain-waits (its
scope is not in the design).

Builds: design 47 G §672, §267, §276, §633
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:53:19 +01:00
jschoubben 18f978e852 BL8: the builder hears the build seats' toolchain-reported, keeps them in toolchains-heard and says toolchain-agreed with digests
The builder agrees a language's toolchain from the three build seats'
toolchain-reported, kept in its state toolchains-heard (read back at its start),
forgets a node's on the node-engine seat's running with no fingerprint (stopped)
and never on a placement, says toolchain-agreed with its digests list only when
the agreed version changes; builder_toolchains and builder_toolchains_drop;
the manifest's reads of the build modules' toolchains are gone. The gate over
the assignments is now PlacedNodes, which only counts nodes.

Builds: design 47 G §492, §604, §546, §472, §574
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:49:02 +01:00
jschoubben 1aeccdfb01 IX-numbered: the indexer consumes no version.numbered, so its series fill from the registry seats' published alone
Builds: design 47 G §413

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:41:59 +01:00
jschoubben 69524c6489 IX29 (part 1): the seat mesh-catalog's verb entry finds an entry by its fingerprint through the state entry-index
Each revision kept writes, before it is kept, the digest of the object of every entry that has a fingerprint under that
fingerprint's key; the verb entry (the tools bundle) reads the key and then the object; indexer_entries reads a key and
whether its object is kept. The named set (a want or a running build keeping an entry) is not built: the event wanted
carries no form for a removed want.

Builds: design 47 G §675 (By fingerprint, Its tools in part), §443
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:36:51 +01:00
jschoubben f5b11e1aa0 SD4 (step key parser): ParseStepKey reads both forms and answers the asker
<asker>.<node>.<id> and main's <node>.<id> (no asker); a third form is refused. sdk/buildrun follows.

Builds: design 47 G §484, §649

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:36:06 +01:00
jschoubben 1ddc26087d CT16 (approval carried, pins stated): the seat mesh-delivery says approval-carried and pins-stated
approval-carried.<repository>.<pull> is kept 90 days; pins-stated has the keep of pinned, which is the seat's family.

Builds: design 47 G §542, §579, §652

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:35:40 +01:00
jschoubben 0e67e56c7c CT17 (tag-wanted out): the checker's definition holds no tag-wanted
Builds: design 47 G §528, §645, §321

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:35:24 +01:00
jschoubben bd3727a900 BL10: tagged versions and version.numbered go from the builder
The state tag-asks and its bounds, builder_tag, builder_tag_asks and builder_untag, the checker's tag-wanted
consumer, the branch end's removal of tagged versions, the numbering of a check's build under a tag and the
event version.numbered (its contract in builds, its emit, its manifest line) are removed; a forge message still
wakes a floor. builder_publish_again refuses a held build, since nothing says a version numbered.

Builds: design 47 G §373, §321, §349, §413

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:35:04 +01:00
jschoubben 01be023d26 CT14 (runner bodies): the runner's bodies name fingerprint, a wait may be of the step pipeline, a pipeline keeps its version
Pipeline, PipelineStarted, PipelineEnded, StepEvent and Wait name the build-input fingerprint fingerprint, not fp; Wait.step
takes pipeline; Pipeline gains version. Fixtures and generated code follow. What a pipeline wait says in on is not given by
a line (reported).

Builds: design 47 G §534, §550, §585, §646

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:34:40 +01:00
jschoubben 78c680ce1e SD-fetch (the build ask's forms): fetch names builds, a built artifact its resolved packages, the toolchain its digest
Fetch.Builds, AskBuilt.Resolved and ToolchainUsed.Digest follow the build seats' part, which already names them.

Builds: design 47 G §465, §466

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:33:56 +01:00
jschoubben 28da5e08c3 CT13b (dependency part): package-published's dependency names its part
Each item of dependencies is {kind, part, version, digest}: kind 1 a resolved package's artifact reference, kind 3 the
toolchain's part. Its field artifact is part.

Builds: design 47 G §673, §466, §374

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:33:26 +01:00
jschoubben 02a4ef3497 CT13 (reserved's answers and its client): reserved answers released or error, and meshbuildsclient asks it
reserved answers module, version, artifacts and released (a boolean), or error alone; module, version and artifacts are
read as required only without error. contracts/go/clients/meshbuildsclient (artifact go-meshbuildsclient) has Reserved,
which answers the reservation or release, a Refusal for the error and an error for an answer that is not one.

Builds: design 47 G §679, §582, §586, §650

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:33:08 +01:00
jschoubben 9b6f886577 IX30 (§491, D-15): each entry carries its artifacts' package names, and a name two modules carry is refused
The entry's artifact gains package {ecosystem, name} (the seat mesh-catalog's definition, regenerated), read at take-in
from the revision's own files (go.mod, package.json) through the forge; the validator's PackageNameProblems refuses
every module sharing one name in one ecosystem, naming them, in the trunk's judge pass. An image's name is not written:
the design does not say what it is.

Builds: design 47 G §676, §491, §478, §504, §412
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:30:49 +01:00
jschoubben 848c2b035e BL3: the build seat's ask carries the version the build reserved, empty for a build reserving none
Builds: design 47 G §573, §370

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:28:23 +01:00
jschoubben 7ecae5a6dd CT12: the build seats' ask carries its version, every ask says ask-taken and step-ended (issue 1966)
The builder's reserved version reaches the build in the ask; a holder says when it takes and ends
any ask, a builder's build included, so the watchman times every ask; the toolchains key names its
program's digest; the checker may drop its own asks until its removal. step-progress and ask-taken
name no keep and go on the shared events stream. The delivery SDK's neutral forms follow the part.

Builds: design 47 G §472, §548, §549, §552, §573, §602, §603

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:27:39 +01:00
jschoubben c7ad2477f0 BL6 (key codec): the catalog key's codec is meshcatalogkey, so the builder's builds package reaches no bus
meshcatalogclient imports the new package and keeps two one-line wrappers for the callers of the other parts until
they move to it.

Builds: design 47 G §670, §614 (wiring unchanged)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:26:55 +01:00
jschoubben 996b15cb45 BL13: build.ended names the node that keeps a kept build in kept-on
A build the build node kept, which answers its digest and no reference, is done; its end carries
kept-on once for the build.

Builds: design 47 G §671, §379, §271, §526

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 20:26:55 +01:00
jschoubben 7fca7f0ac8 CT12: the build seats' ask carries its version, every ask says ask-taken and step-ended (issue 1966)
The builder's reserved version reaches the build in the ask; a holder says when it takes and ends
any ask, a builder's build included, so the watchman times every ask; the toolchains key names its
program's digest; the checker may drop its own asks until its removal. step-progress and ask-taken
name no keep and go on the shared events stream. The delivery SDK's neutral forms follow the part.

Builds: design 47 G §472, §548, §549, §552, §573, §602, §603

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 16:01:17 +01:00
jschoubben 2312b05bb5 IX30 (part 2): a revision's one claim of the seat node-engine is accepted, a second and none are refused
Builds: design 47 G §508, §527 (IX30)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 15:51:15 +01:00
jschoubben 268d2be034 IX30 (part 1): the validator's foundation list gains the forge and image registry modules, and a part's findings are judged in its part's form
Builds: design 47 G §529, §577, §584 (IX30)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 15:49:32 +01:00
jschoubben 2c8d3f5b40 BL5 (version half): a build whose catalog entry's version is not MAJOR.MINOR reserves nothing and says so in the journal
The first-watched-branch half (§371) waits for BL6's revision view, which names a build's branch.

Builds: design 47 G §505

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 15:48:04 +01:00
jschoubben 689947bec5 BL11: a build whose published packages cannot be read is refused, naming the unread state
Taken from f051de32 (the old numbering's refusal); the tests of D-B2 to D-B6 it sat on are left out.

Builds: design 47 G §55 (and its check line §56, test 70)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 15:47:42 +01:00
jschoubben fdc482d512 IX28: the entry's manifest-digest carries sha256: and the digits, the module's value the bare digits
Builds: design 47 G §578, §609 (IX28; §500's problems wait on a design question)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 15:47:16 +01:00
jschoubben a3d4e0d8ad IX26: the taken judge row names its version as MAJOR.MINOR
Builds: design 47 G §368, §295, §299
2026-11-11 14:53:05 +01:00
jschoubben e7ef3f3a78 Take out StepRun.names: the step ask no longer carries the registrations' names for a lint scan
The part build-step.json, its generated Go and TypeScript (seatgen, check clean), the three build seats' fixtures and sdk/buildstep lose StepNames and the ask's required names.

Builds: design 47 G §7, §328, §329
2026-11-11 14:51:56 +01:00
jschoubben f366225135 The checker reads the forge through the seat git's verb file, never a module's tool (milestone 47/G W6.14)
The forge read named the forge module's tools (gitea_get_file, and four more never
called), which ADR 0656 §1 and the operator's (d) forbid: whichever module holds the
seat git answers. An absent file is the seat's absent, an error its error, and a call
that reaches nobody stays not heard, so the check says it could not run.
The compare captures no test reads any more go with the commit trees read nothing called.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §252, §312, §317
2026-11-11 14:50:02 +01:00
jschoubben fe025a3b73 A check that could not run is asked again on the node-engine seat's running of its part (milestone 47/G W6.9b, issue 1373)
The checker consumes node-engine.running (kept last per subject) through its durable
consumer and hands each running.<node>.<module> to PartRunning; a body naming no part
asks nothing and is said. Naming the not-heard part by its module (the seat git's holder,
a build seat's holder) waits on the catalog half's claims (W3.6): until then the part is
unnamed and the first running asks the check again.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §253, §315
2026-11-11 14:49:20 +01:00
jschoubben 0b7cec27e8 A check that could not run says so, releases its claim and waits for its part to run (milestone 47/G W6.9, issue 1373)
A check that failed for a part of the mesh not heard was judged again at
every change of the nodes. It now says could not run, naming the part,
and is kept in the checker's own state could-not-run; only the running of
that part asks it again, once per heads and part at one fingerprint
(PartRunning). Not asked again within an hour it is the finding
check-could-not-run, which clears when the heads are checked again,
replaced, or their pull request closes. checker_status reads the state.
The node-engine seat's running event is wired once its definition lands.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §253, §315
2026-11-11 14:49:02 +01:00
jschoubben 99e35b74e6 TL: the teller says answered and reads its answers through teller_answers; the view says reached with each reach it writes (abdf11be)
Builds: design 47 G §431
2026-11-11 14:48:31 +01:00
jschoubben c48c7e723a WM6: the watchman hears an acting part's wait-held and wait-ended and writes acting-part-late once the wait's bound has run from clock-from
Taken from 2d796fe8 (its wait half only; the store and record halves are WM7's, built). The body is the seat mesh-wants' contract Wait.

Builds: design 47 G §266, §269, §277
2026-11-11 14:47:47 +01:00
jschoubben f288270513 W7.3: the toolchain gate takes its placements from the assignment half (design 47 lines 1466-1471, 1487-1490; issue 1966)
Design 47 *Each part acts on its own entries* and *Every part takes a first view, then
follows the events*: the builder reads its placements through the seat mesh-wants'
view, never the assigner's state. The seat's client gets Placed over assignment graph
revisions (ADR 0625 §4: the logic the gate's three callers share), and the gate a
Revision feed; the first revision settles it, a pair new in a later one stands since
that revision's time, as the state's write time did (issue 1940).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §348, §195, §200
2026-11-11 14:43:55 +01:00
jschoubben 05494e7bb9 W5.1, W5.2, W5.5: the assignment graph computed per branch, kept as objects, and served by mesh-wants' verbs
Design 47 at hq main b229f5c4, lines 1353-1366 (each entry one module version
on a node, its edges provisioning and acting; each revision naming its inputs,
kept as objects in the old section with its cap, served by the seat's verbs),
1385-1388 (under 256 KiB for 120 modules on four nodes; a 512 MiB cap), 1416-1418
and 522-525 (a node's entries from the catalog graph of the branch its placement
names, by default the registration's first), 909-914 (the placement's build is
the version), 1835-1836 (an edge from the acting part's version to each version
its rule names), and the Reverted table (assignment graph revisions as objects,
form 1).

internal/assigngraph computes a revision from the halves held per branch, the
placements and the capability readings; keeps it numbered after the newest
when it differs, each entry once by its digest; and answers revision, entry
and difference from the kept objects only. The manifest serves the three verbs
and declares the objects assignment-revisions. A placed module whose entry
cannot be computed is named in Uncomputed, never left out in silence.

Not built here (the design does not say, or held): contribution edges;
provisioning to a provider no binding or pin names; tiers; a candidate's
revision (W5.9); removal of a revision no record pins (pins are W5.9's).
The process does not compute and keep yet: that needs the registrations'
first view and a catalog half per branch (handover).

Milestone 47/G, issue 1966. Tests: TestTheAssignmentGraphIsComputedFromItsInputsAndKept,
TestARevisionOf120ModulesOnFourNodesFitsOneValue, TestTheSeatsVerbs/1953/D4-D6
(failed before), TestManifest's objects row (failed with the old manifest).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §173, §175, §176, §180, §194, §209, §223, §263, §346
2026-11-11 14:43:17 +01:00
jschoubben ac2c4d3e20 W8.2: the seat-list wiring is mesh-sdk's seatlist.Part; seatlist.go is deleted
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §204
2026-11-11 14:42:03 +01:00
jschoubben 58b3b030db GR7: test that a seat's events are published by its holder alone (the holder half of 24149354; its node-backup grant is left out)
Builds: design 47 G §24, §227, §383, §260
2026-11-11 14:42:03 +01:00
jschoubben 9efc402a06 GR3: a kept seat event's stream is made from the definition's keep object: its age (0 for none), its cap, 90 days and 16 MiB where unnamed, dropping its oldest at the cap
Builds: design 47 G §396, §331, §260
2026-11-11 14:41:42 +01:00
jschoubben 4a61381ff1 W8.7 rest, W8.6 (node place): the grants part keeps what each node-engine runs (running, grants_running) and reads seat holders from its digest; a machine's place in an event's subject is the definition's <node>
The part binds its own durable on the node-engine's kept stream (HearKept, tried at every wake until the pass has made it),
the seat's holders are read from the manifest of the digest each node says it runs, and a node-engine's account is granted its
own node at the part its definition names (running.<node>.*) and its durable on the kept stream by name.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §199, §249, §309
2026-11-11 14:40:26 +01:00
jschoubben 28ebd45863 W8.7 (kept events): the grants part makes each kept seat event's stream, sourced from the events stream, and each consuming module's durable on it from the last message per subject
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §260, §331, §396
2026-11-11 14:39:23 +01:00
jschoubben c4a8590671 W1.5, W1.6 (judge): a kept data's form is from 0 and its catch-up tool the module's own
The node agent calls a restored kept data's catch-up tool from the
restore point, so the judge refuses a form below 0 and a catch-up tool
the module does not declare; a foundation part keeps its new objects in
the old section with their cap and form (ADR 0619 §2).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §295, §299
2026-11-11 14:39:10 +01:00
jschoubben 5d3c2c680e B-D14b (judge half): a build seat's toolchain stream is kept by the seat its module claims, not by its name
Design 47 at b229f5c4, *A module's registration*, lines 482-485 ("No part fixes a name": every module name a
part needs is read from the catalog graph; ADR 0666 §5): the validator kept the build modules' toolchain streams
(toolchains-go, toolchains-node) until they move by the modules' names. It now keeps them for the module that
claims node-build-go or node-build-node, whichever module that is. The other entries of the list, the node-engine's
module (engineModule) and the indexer's own toolchain watch are not in this commit. Rows in
TestRulesBus/TwoModulesCannotDeclareOneStream (fail without it). Issue 1966.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §364, §428, §535
2026-11-11 14:37:18 +01:00
jschoubben c16e07ba0e B-D14b/W4.8: the toolchain gate takes the build modules a part finds, as it finds them (issue 1966)
Design 47 *A module's registration*, "No part fixes a name" (b229f5c4 lines 482-485): the indexer finds
the build modules from the seat list's acts and the manifests, after the gate is made, so the gate takes
them by UseModules and passes its reports on again. Row in TestToolchainGate: a module given later passes
on at the assignments only once given (fails without UseModules).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §364, §428, §535
2026-11-11 14:37:17 +01:00
jschoubben 1dd48d81a0 B-D14b/W4.8: the indexer's integration fixtures hold the build seats with their acts and the holders' manifests (issue 1966, design 47:482-485)
The six integration tests that broke when a language's build module became the module claiming the seat whose acts is step build on that language now keep node-build-go and node-build-node as the seat definitions have them, and mesh-build-go and mesh-build-node as the catalog's manifests claim them; no indexer code changes.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §364, §428, §535
2026-11-11 14:37:17 +01:00
jschoubben 371b1a98f6 B-D14b/W4.8 (indexer half, integration fixtures left): build modules from the build seats' acts and their holders' manifests (issue 1966)
Design 47 *A module's registration*, "No part fixes a name" (b229f5c4 lines 482-485), and *What ADR 0656
leaves to this design*, "The indexer reads it [acts] into the catalog graph" (line 1583): ToolchainModules,
ToolchainStreams, BuildGoModule and BuildNodeModule go. The build module of a language is the module whose
manifest claims the seat whose acting rule is step build on it (index.BuildModulesOf), its stream the one of
its manifest carrying toolchain.reported, its bucket <holder>_toolchains as before. Found again at start, at
every change of the seat list and at every catalog revision; the watch, the gate and the hearing follow.
A language with no build module found reads as no toolchain reported.

Rows: TestAgreedToolchainChangesAGoModulesReasonWithNoMerge/the build module of a language is the holder...
(fails without: no BuildModulesOf, and go-builds' report refused); TestToolchainWatch's later build module.
Left: six integration tests of cmd/mesh-delivery-indexer hold no build seat with acts nor a holder manifest
and fail (TestIndexerWhole, TestIndexerWritesAGoModuleAgain..., TestIndexerGivesACandidateItsFingerprint...,
TestIndexerJudgesAnUnreadableVerdictAgainAtStart, TestIndexerCountsOnlyThePlacedBuildNodesToolchains,
TestAMeshSDKMergeMovesOnlyTheModulesImportingAChangedPackage): their fixtures are to be given both.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §364, §428, §535
2026-11-11 14:36:48 +01:00
jschoubben 7a7b504836 W5.10 (base): the module graph's node of a catalog entry is read in the domain SDK's graph, for every reader of the catalog half
graph.NodeOf moves from the indexer's own package to sdk/graph, since the assigner reads its verb edges from the catalog
half too (a second reader).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §47 to §50, §121, §122, §378
2026-11-11 14:36:24 +01:00
jschoubben 941af88086 The indexer follows its seat list through the wiring every part shares, seatlist.Part, not a copy of its own (milestone 47/G W4.10, W1.9)
Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §204
2026-11-11 14:36:10 +01:00
jschoubben 86d13a41a3 W4.15: a commit the forge does not have is the seat git's kind not-found, never a 404 in the error's words (milestone 47/G)
askGit wraps the kind not-found as index.ErrNotFound; order.go's notFound reads only that. Needs feat/47-G-seats'
seat git at 3b355a35 at the join.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §310, §317
2026-11-11 14:36:10 +01:00
jschoubben 91791fdabd The indexer reads the forge through the seat git alone: trees, file, contains and open-pulls, an answer's error a failure (milestone 47/G W4.15a)
The forge module's own tools leave the program and its invokes. The seat's Go contract is feat/47-G-seats' (contracts/go/seats/git); this branch builds against it at the join.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ

Builds: design 47 G §310, §312, §317, §428
2026-11-11 14:32:33 +01:00
jschoubben 42785f6fa2 Merge origin/main into feat/47-G-build 2026-11-11 14:31:52 +01:00
jschoubben b4a512e627 Merge branch 'feat/47-G-build' into feat/47-G-build-indexer 2026-11-11 14:14:12 +01:00
jschoubben 3cdecff518 IX26: the indexer's manifest says version 0.1 (none published), checked as MAJOR.MINOR
Builds: design 47 G §368, §299, §295

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 14:11:08 +01:00
jschoubben 5009bb9256 IX23: the indexer keeps no mesh-wide hold, serves no tool or view of modules, and hears no engine's manifest reads
Builds: design 47 G §196, §185, §364

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 14:09:55 +01:00
jschoubben 83b5275fe2 IX22: a test that a merged revision naming a newer indexer is the previous catalog graph revision with only the indexer's entry replaced
Builds: design 47 G §273, §237

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 14:05:04 +01:00
jschoubben 1425374d27 Merge branch 'feat/47-G-build' into feat/47-G-build-watchman 2026-11-11 14:04:20 +01:00
jschoubben ad6c793a2f CK10 (tags): the checker asks no group build through tagged versions
The checker built from G's heads makes no tag-wanted and waits on no published
of a tagged version: tagwanted.go and tags.go go (the verdict sayer stays, in
verdictsay.go), with st.tagged, groupVersions, Case.Tagged, TagAsks, the
PublishedHeard wiring, the group path's tagged Node package and Go packages,
the manifest's two published consumes and the tag-wanted event of asks.

Builds: design 47 G §528, §373, §321

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 14:04:15 +01:00
jschoubben ae8a6f1a6d IX16: the indexer's manifest test lets the assigner's invoke of modules stand until the assigner's own subtask moves it to revision
Builds: design 47 G §263

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 14:03:28 +01:00
jschoubben bcca6028db Merge branch 'feat/47-G-build' into feat/47-G-build-indexer 2026-11-11 14:03:01 +01:00
jschoubben 6a14c1c0af Take out the stand-in for CatalogEntry.ManifestDigest: the contracts developer's field replaces it
Builds: design 47 G §506

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 14:02:47 +01:00
jschoubben 5f64c25935 Merge branch 'feat/47-G-build' into feat/47-G-build-builder 2026-11-11 13:58:44 +01:00
jschoubben f30c54faa1 IX16: the catalog graph revisions as objects (the research 085 half joined), an entry carrying its manifest whole and the digest of its bytes, a full store holding the take-in's merges
Builds: design 47 G §173, §174, §175, §176, §177, §178, §179, §180, §181, §194, §200, §209, §210, §263, §443, §506

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 13:58:09 +01:00
jschoubben 3442b7af37 TEMPORARY stand-in for CT: CatalogEntry.ManifestDigest in the Go contract only (design 47 G §506); the contracts developer's field replaces it, take theirs at the merge
Builds: design 47 G §506

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 13:58:08 +01:00
jschoubben cb6dc7c320 BL4: the git tag go/vMAJOR.MINOR.PATCH is written on the catalog's version-released, at the commit the version was reserved from
The reservation keeps the repository and commit of the build and whether the module has a Go package; version-released writes
the tag through the seat git's verb tag before the key goes, and a tag the forge did not write leaves the release to be heard again.

Builds: design 47 G §370

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 13:57:54 +01:00
jschoubben aa1ebee3cc Merge branch 'feat/47-G-build' into feat/47-G-build-contracts 2026-11-11 13:57:11 +01:00
jschoubben 73d15c08f2 CT3 (answers): the catalog graph entry carries manifest-digest
Builds: design 47 G §506 (the entry gains manifest-digest, the sha256: digest of the manifest's bytes as the forge answered them, set by the indexer at take-in). Regenerated by seatgen (-check clean).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 13:57:00 +01:00
jschoubben 83ff5c747d Merge branch 'ix16-wip' into feat/47-G-build-indexer 2026-11-11 13:55:20 +01:00
jschoubben fbe34bcf07 Merge branch 'feat/47-G-build' into feat/47-G-build-watchman 2026-11-11 13:54:53 +01:00
jschoubben 9f43e927e4 WM7 (store-filling): a store clears below 80 % of its cap, not 70 %
Builds: design 47 G §181, §263

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 13:53:50 +01:00
jschoubben 9d79964487 CT2 (answers): mesh-builds' reserved takes a package's name, toolchain-agreed carries digests with their nodes
Builds: design 47 G §478 (reserved takes module or name, with version; an unknown or doubled name answered error, §491), §472, §495 (toolchain-agreed carries digests, each with the nodes reporting it, in place of one digest). Regenerated by seatgen (-check clean).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 13:53:17 +01:00
jschoubben 33d9e942f2 Merge branch 'feat/47-G-build' into feat/47-G-build-assigner 2026-11-11 12:37:06 +01:00
jschoubben 846340c553 AS4: the assigner computes a node's entries from the catalog half of the branch its placement names
The indexer's first views of manifests, modules and graph are replaced by one meshcatalogclient.Catalog per watched branch
(the trunk's from the start, each branch a registration names from then on); the world keeps each branch's modules, graph nodes
and manifests, and a pass splits a module's nodes by the branch their placements name and computes each group's wants from that
branch's half. Not built: AC2 (a composition step on beta only), which is AS5's step.

Builds: design 47 G §14, §184, §191, §194, §195
Tests: TestACommitOnBetaMovesOnlyTheNodeThatChoseBeta (failed with the groups on the trunk alone), TestTheCatalogHalfIsTakenInPerBranch

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:37:06 +01:00
jschoubben 38a2492394 RN3 (publish half): a pipeline starts by compare-and-set on its key, and a package-published starts one per dependent behind
A start writes the pipeline's key (watched branch, source revision, module) only when it is absent and says
pipeline-started; a second start of the same revision and module writes nothing. A package-published asks the
catalog's outdated for that package on that branch, a kept call, and starts a pipeline for each dependent behind
by kind 1, keyed by the publication's branch and source revision. The start on take-in.taken, and a gathered
group's one pipeline per branch, wait for take-in.taken's body (design 47 G §476, in review).

Builds: design 47 G §54, §103, §334, §53, §75

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:34:26 +01:00
jschoubben 68c10c5664 RN24: the runner's manifest says version 0.1, declares its finding stream and hears the keeper's ask
Builds: design 47 G §368, §383, §387

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:31:58 +01:00
jschoubben 7fcf1ce9ee Merge branch 'feat/47-G-build' into feat/47-G-build-runner 2026-11-11 12:28:08 +01:00
jschoubben 2b052791da RN2: the runner reads its policy from the registrations and each watched branch's catalog half, and says when it waits for a view
The runner follows the registrations (a first view, then registration-changed) and, for each watched branch
they name, that branch's catalog half (a first view, then catalog-revision of that branch), each in its state
first-views, read by pipeline_first_views and asked again by hand with pipeline_first_view_again; past five
minutes without a view it writes view-waits. A step's status is read per module and artifact from the
registration, and the build seat of an artifact from the acting rule build naming its language.

Builds: design 47 G §21, §23, §323, §77, §195, §200
Open: design questions Q-RN7 (where a build seat's holder is read, §323) and Q-RN8 (a status left empty, §23).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:28:00 +01:00
jschoubben 8688e62cd8 Merge branch 'feat/47-G-build' into feat/47-G-build-contracts 2026-11-11 12:21:56 +01:00
jschoubben e1499f0617 CT4: a wait names its clock and its kind: clock-from, step of the acting steps, a put's fingerprint, a delivery wait's machines; regenerated
mesh-wants' Wait gains clock-from, the step enum of section 203 with put, delivery, kept-build and backup,
fingerprint and machines, and requires step, module and since only (a put's wait has no part);
the runner's wait body gains clock-from. The runner's `step` already names pipeline steps: see the report.

Builds: design 47 G §498, §266, §269

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:21:56 +01:00
jschoubben de66361014 Merge branch 'feat/47-G-build' into feat/47-G-build-teller 2026-11-11 12:21:37 +01:00
jschoubben 2c1f5a4033 VW1: the view reads the modules from the catalog half of the trunk, by meshcatalogclient.Catalog
The view's process follows the trunk's catalog half (first view of the seat mesh-catalog's verb revision, then each
catalog-revision of branch main) and hands each changed entry to its model in the form of the value it always kept; its tools
read the newest trunk revision through the verb. The manifest invokes seat:mesh-catalog.revision and consumes
mesh-catalog.catalog-revision instead of the indexer's modules read tool and views family.

Builds: design 47 G §196, test 61

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:21:20 +01:00
jschoubben 940d42c659 CT5: the build seats' steps takes drop and why, fetch gains builds, a build names what it resolved, steps are keyed by asker, toolchain-reported and step-progress; regenerated
steps callers: the runner, the indexer, the operator and sessions (D-18); BLD12 builds in the fetch;
BLD13 resolved and the toolchain digest; BLD14 the step key <asker>.<node>.<id> beside main's
<node>.<id>; the events toolchain-reported and step-progress on the three build seats, and
step-progress on mesh-wants.

Builds: design 47 G §463, §480, §465, §466, §467, §481, §483, §492, §496

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:20:54 +01:00
jschoubben ce286795e0 CT10: a branch with no revision yet is a ready, empty catalog view
Builds: design 47 G §479, §495

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:17:16 +01:00
jschoubben dd8c4d405a Merge branch 'feat/47-G-build' into feat/47-G-build-contracts 2026-11-11 12:15:39 +01:00
jschoubben 5e0c04c3cf CT10: meshcatalogclient follows the catalog half per watched branch, a first view then each catalog-revision of that branch
The view of a branch is named mesh-catalog.catalog-revisions.<branch>; two branches give two views.
A revision heard and not held asks revision once more, said in the log.

Builds: design 47 G §358, §196, §479, §495

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:15:39 +01:00
jschoubben 8cfc24fc2e Remove a binary built by mistake in the checker's folder
Builds: none (housekeeping of CK2)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:14:50 +01:00
jschoubben 1ec1e0a224 Merge branch 'feat/47-G-build' into feat/47-G-build-watchman 2026-11-11 12:14:30 +01:00
jschoubben 5fc1dbd264 WM11, CK12, EN1 (manifest half): finding stream, the keeper's ask and MAJOR.MINOR version in the manifests of the watchman, the checker and enrolment
Builds: design 47 G §383, §387, §368 (the findings writer half waits for the generated writer of §439)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:14:24 +01:00
jschoubben c3068b15e1 CK1: the checker reads no merge turn of the gate and claims a new check at once
Builds: design 47 G §278, §197 (test 52)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:10:49 +01:00
jschoubben 21195a06be CK2: the checker takes the trunk heads from the catalog half's revision and catalog-revision, not the gate's source (repairs the checker against the new contracts)
Builds: design 47 G §197, §195, §200

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:08:09 +01:00
jschoubben 190fdef8b3 AS19 (the seat list): the assigner wires its seat list reader through mesh-sdk's seatlist.Part
Its hand-wired seatGate goes; the reader, its tools assigner_seat_list and assigner_seat_list_again and the
re-read when the events are live are the SDK's Part. A test searches the code for a wiring of its own.
Left of AS19: the indexer's views and the gate's reads, which wait for AS4's catalog half.

Builds: design 47 G §204
Test: TestTheSeatListIsWiredByTheSDKAlone

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:07:39 +01:00
jschoubben 60937e2526 Merge branch 'feat/47-G-build' into feat/47-G-build-assigner 2026-11-11 12:05:11 +01:00
jschoubben ec14823429 AS15, AS16: a provider counts healthy by the node-engine seat's running, and a put ends on it
The assigner hears running.<node>.<module> through its durable consumer on the seat's stream (last message per
subject), counts a provider healthy while its running build is not stopped whatever a newer want of it waits for,
and ends a put when running names the put's fingerprint (a running without one, or stopped, ends none); the have
no longer ends a put. With the stream not heard, rule 5 reads the have as before.

Builds: design 47 G §199, §309; main file "A provider before its consumers" and "Until milestone G, from the have; from G, from running"
Tests: TestAProviderRunsHealthyByItsRunning, the put rows of TestTheBusMovesByTheRulesAndItsUserListRevisionIsWrittenAtOnce, TestAnAnswerCountsOnlyForTheAskingItAnswered (running ends the put)
Manifest: consumes node-engine.running; validator: no finding new against trunk.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 12:05:11 +01:00
jschoubben fdc2cec328 Merge branch 'feat/47-G-build' into feat/47-G-build-watchman 2026-11-11 11:59:01 +01:00
jschoubben cbbb971d35 WM12: the watchman's manifest says its version as MAJOR.MINOR
Builds: design 47 G §368, §372 (0.1 for a module with none published)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:58:33 +01:00
jschoubben 7d1ce3296d Merge branch 'feat/47-G-build' into feat/47-G-build-assigner 2026-11-11 11:58:00 +01:00
jschoubben b1fcabcebe AS3: a placement's branch and build, set by a proposal, bound by the ask, and its build a held put
A proposal sets a module's watched branch and build (a re-place keeps them), the changes digest an ask binds to
carries both, and a placement's build is a held put of that build, released when the placement drops it while a
person's put stays. Taken over from 6bc6fe53 and b8e50fff.

Builds: design 47 G §14, §78, §114, §360, §361
Tests: TestAssignments (place change branch, build, digest rows), aPlacementsBuildIsPut. Test 77 (§79) covered by the put row.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:57:53 +01:00
jschoubben 5fcd76a9f9 WM7: the watchman raises record-open 24 hours after a merge unless another condition covers it, and store-filling from the seats' filling, full and room
Builds: design 47 G §148, §160, §181, §218, §263

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:56:50 +01:00
jschoubben 51e34d5369 Merge branch 'feat/47-G-build' into feat/47-G-build-bridge 2026-11-11 11:56:06 +01:00
jschoubben 4866f7097a Merge branch 'feat/47-G-build' into feat/47-G-build-teller 2026-11-11 11:55:32 +01:00
jschoubben 91a9c41290 gofmt 2026-11-11 11:55:02 +01:00
jschoubben 0b597eb417 FB3, FB4, FB5: the bridge performs what the gate owes through the seat git and says each outcome, reads groups from the seat, and its owed tools
Taken over from the join (6ada2089, f1417ab0, 6e162a60, 3a4e62b0, 73fb42d7, ee15a280, a5476f62, 94a4e62a, 33907a81, e519cc87, e8f268c1) and fitted to the final
contracts: the seat's events are pull-updated, pull-merged, pull-closed, forge-delete; OwedEnded keeps only the fields §164 names; merge-pull
takes no ask. A merge act is performed only as a switched act (§169); from G the gate owes none (§167).

Builds: design 47 G §43, §45, §157, §161, §162, §163, §164, §167, §168, §169, §171, §250

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:54:56 +01:00
jschoubben d7c8fdd0ed Merge branch 'feat/47-G-build' into feat/47-G-build-assigner 2026-11-11 11:54:50 +01:00
jschoubben 1778888acc AS2: the wants keep the trunk-only form until the first registration, and follow the pipelines' ends from it
Builds: design 47 G §95, §130, §353, §352

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:54:50 +01:00
jschoubben a227e061ec Merge branch 'feat/47-G-build' into feat/47-G-build-indexer 2026-11-11 11:53:52 +01:00
jschoubben ee34487126 Merge branch 'feat/47-G-build' into feat/47-G-build-teller 2026-11-11 11:53:45 +01:00
jschoubben 61277b6b9b VW4: the view's manifest says version 0.1, declares its finding stream and hears the keeper's ask
Builds: design 47 G §383, §387, §368, §411

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:53:41 +01:00
jschoubben 55d8e9e73d Merge branch 'feat/47-G-build' into feat/47-G-build-assigner 2026-11-11 11:53:07 +01:00
jschoubben 3b31e6df05 AS1: a want follows a passed pipeline, by compare-and-set per module and watched branch
The assigner hears pipeline-ended and group-ended, keeps the newest end per module and branch in the state written (tool assigner_written), and writes a want only from an end whose required steps passed.

Builds: design 47 G §29, §35, §102, §120, §291, §325, §352, §85

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:53:07 +01:00
jschoubben 43bebef626 WM3: the watchman says machine-away and machine-back of the seat mesh-watchdogs when a machine's presence expires and when it is heard again
Builds: design 47 G §389, §436

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:52:13 +01:00
jschoubben e7bd54e67b IX19: the indexer reads every contracts module's trunk definitions at its start before judging, waits for the seat git at most two minutes, says view-waits past five and judges again once it answers
Taken from the join base (6ce86c96, ff6e74f9) onto the build branch.

Builds: design 47 G §198, §248, §316, §255, §57 (tests 54, 57)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:51:07 +01:00
jschoubben 799241364f VW0: the view reads the trunk's source by the branch key and the per-branch value
Builds: design 47 G §305 (the state source is kept per watched branch), §431

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:50:04 +01:00
jschoubben 69aeb817e2 WM2: the watchman raises build-capacity-waits for a build seat whose oldest queued step has waited 60 minutes
Builds: design 47 G §86

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:49:32 +01:00
jschoubben 07832b1a2c The indexer's whole-module test proves a merge kept as one catalog graph revision, said on the seat, and the recompute and the drop answered by the running indexer (milestone 47/G W4.13)
Rows in TestIndexerWritesModulesAtAMerge; the pin rows come with W4.5.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:48:46 +01:00
jschoubben a217a44f05 The indexer's catalog graph revisions are read and steered by its tools: one revision, every revision with the store's fill, the candidates' halves, a recompute compared with the kept one, and a drop by hand that says room (milestone 47/G W4.12)
Pins and the consumer of the gate's events come with W4.5, which makes them.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:48:46 +01:00
jschoubben 0f618f1998 WM1 (head half): the watchman raises pipeline-stands for a watched branch's head with no pipeline within five minutes
Builds: design 47 G §12, §75, §112 (the head half; the step half waits on a design question)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:48:38 +01:00
jschoubben 3a4768ab43 FB6a: the forge bridge reads trees, files, pulls and tags through the seat git and hears its pull and delete events
Taken over from the join's 473f9323, 5f40d230, 159a679b; the events are the seat's pull-updated, pull-merged, pull-closed and forge-delete.

Builds: design 47 G §252, §310, §312, §317

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:48:36 +01:00
jschoubben 9b9e9f68bb TL4: the teller's manifest says version 0.1, declares its finding stream and hears the keeper's ask
Builds: design 47 G §383, §387, §368, §411

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:48:34 +01:00
jschoubben b2b449c913 The indexer says filling, full and room of its catalog graph revisions and holds a merge while they are full (milestone 47/G W4.6)
Design 47, Two graphs: a keep that would pass the store's cap refuses
the next revision and says full, naming the source revision held pending
with the reason objects full (Pending.Held, which indexer_pending shows);
a keep crossing 80 % says filling; once something removes revisions,
RoomAgain says room below the filling mark and evaluates pending again
(no timer). Each event is said once by its duplicate id.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:48:20 +01:00
jschoubben deb88b17b9 The indexer answers the seat mesh-catalog's verb revision in its own runtime, to exactly the parts that declare it; modules ends as a first view (milestone 47/G W4.4)
ADR 0663: the catalog half is read through revision, answered by the
tools bundle from the catalog graph revisions before it asks anything,
to the parts whose entry in the newest trunk revision declares
seat:mesh-catalog.revision in invokes, the holder refused too; none kept,
every reader waits. The first view modules, its callers list and its
tool leave the manifest; the assigner declares revision instead (its
code moves in W5.10); the grants part keeps its read of modules until W8.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:48:09 +01:00
jschoubben 5595403215 The indexer opens its catalog graph revisions under the module its account runs as, not a fixed name (milestone 47/G W4.2)
A module's name in its own code logic is a fixed name the runtime already
says: the bus account the process runs as names it.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:47:26 +01:00
jschoubben 64afa00457 The indexer's catch-up tool takes no arguments and is named beside its catalog graph revisions (milestone 47/G W4.14)
The node agent calls a restored part's catch-up tool with no arguments, so
indexer_take_in with neither module nor repository takes in the head the
gate's source names for every repository, as the first start's catch-up
does, and keeps the view as the next revision when an entry moved. The
manifest names it beside the catalog graph revisions, form 1 (design 47,
Reverted).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:47:04 +01:00
jschoubben a732cb0cb2 The indexer declares no modules or graph state: its view of the trunk is the catalog graph revisions (milestone 47/G W4.3, the manifest)
The states modules and graph leave the manifest and the names the indexer keeps; their first views and read tools are
answered from the newest revision, whose changes catalog-revision says. The contract keeps the modules type until its
readers moved (the lead's ruling). The manifest validator, built at mesh-delivery's trunk, accepts the indexer in both
cases, change and trunk, and no verdict differs.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:46:55 +01:00
jschoubben 66dd7b3a3f The indexer's tools answer the modules and the module graph from the newest catalog graph revision and wait while none is kept (milestone 47/G W4.3, the graph state's readers)
The tools bundle reads the objects catalog-revisions through its runtime (index.TrunkStates over busstate): the first
views, read tools and seat verbs of modules and graph, indexer_config_readers, indexer_bus_state and
indexer_package_users; the marks of modules and graph are the revision's number, and a view asked before the first
revision says view-waits, never an empty catalog.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:46:55 +01:00
jschoubben 80bc3a4084 The indexer runs on its view of the trunk read from the newest catalog graph revision, keeps it after every write and takes the trunk in at a first start (milestone 47/G W4.3, the view wired)
main.go reads the view and the module graph's nodes (NodeOf) from the newest trunk revision instead of the modules and
graph states; every write outside a recompute (the judge pass's verdicts, a build's imports, the source stamp, the
modules the trunk dropped, the indexer's own entry a held revision writes) ends in KeepView, so a restart loses nothing;
a revision lists every module the view holds, one whose manifest cannot be read too. At a first start whose objects keep
no trunk revision the indexer takes in the head the gate's source names for every repository by the forge bridge's
merged message and keeps revision 1 (the lead's ruling A). The whole-module tests read the view from the revisions.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:46:33 +01:00
jschoubben e0d5488138 The indexer reads its view of the trunk from the newest trunk revision (milestone 47/G W4.3, second part: the view's read)
The lead's ruling on finding 1: modules becomes an in-memory view of the newest
trunk revision read from catalog-revisions at start, one form of the fact
(ADR 0656 §6). TrunkView gives that view as a store in memory and the revision
it was read at; an empty bucket is an empty view. Not yet wired in main.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:45:56 +01:00
jschoubben 9ab20f14f8 The catalog graph entry carries what the next revision is computed from and its package versions (milestone 47/G W3.1, inputs)
The lead's ruling on finding 1: an entry gains inputs (what its fingerprint is
computed from, the toolchains used, problems, warnings, named paths, the source
revisions it was taken in and its fingerprint moved at) and packages becomes
name to version, so the indexer's view of the trunk can be read back from the
newest trunk revision alone (ModuleValueOf). A revision's entries are the values
the recompute wrote, not the values it started from.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:45:56 +01:00
jschoubben 735724899b Merge branch 'feat/47-G-build' into feat/47-G-build-contracts 2026-11-11 11:45:50 +01:00
jschoubben 18c954ddcd CT10: meshwantsclient holds a part's view of the assignment half, a first view then assignment-revision
The typed first view and the following of each half sit in the seats' client packages, built on go/views
(design 47 G §245), so no part follows the assignment half by a follower of its own: a newer trunk revision
heard is waited for, said in the status, asked and held; a candidate's, or one held, asks nothing.

Builds: design 47 G §245, §365

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:45:50 +01:00
jschoubben 04c260bb22 Merge branch 'feat/47-G-build' into feat/47-G-build-assigner 2026-11-11 11:45:37 +01:00
jschoubben 154505f451 Assigner: repair against the new contracts (source key per branch, want with digests, seat verbs not yet served)
Builds: design 47 G §15, §95, §353, §379

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:45:37 +01:00
jschoubben 6ff7aeb5cf The indexer fills the catalog graph entry's main from the module's manifest (milestone 47/G W3.1's main, W4.3)
The entry's main is the from of the Go artifact the module's process runs, which the check's first tier builds when
the module acts.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:45:25 +01:00
jschoubben 6d53c3987a Merge branch 'feat/47-G-build' into feat/47-G-build-bridge 2026-11-11 11:45:19 +01:00
jschoubben d813ce7e39 FB4a: the forge message forms of an owed act's outcome (owed.ended)
The gate's developer needs OwedEnded and its outcomes; fields are the ones §164 and §168 name (id, outcome, words, the seat that said the act, time).

Builds: design 47 G §164, §168

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:45:19 +01:00
jschoubben bd067ae779 The indexer keeps a catalog graph revision at each merge and each moved fingerprint, and says catalog-revision (milestone 47/G W4.3, its writing part)
Design 47 (Two graphs) keeps a catalog graph revision for each source revision taken in and for a fingerprint moved
with no merge. The recompute that writes the module graph now keeps the revision it makes, numbered after the newest
kept trunk revision, and says the seat mesh-catalog's event catalog-revision naming the changed modules; a recompute
that moves no entry keeps none, and objects not yet on the bus keep none, said in the log.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:45:07 +01:00
jschoubben f0b51bfc29 The indexer keeps its catalog graph revisions in its object bucket catalog-revisions, each entry once by digest (milestone 47/G W4.2)
Design 47 (Two graphs) keeps each revision as the list of its entries' digests and each entry as one object, so an
unchanged entry is stored once. The bucket is declared in the old objects section with a 512 MiB cap (ADR 0619 §2:
the indexer is the foundation), opened at its first use; a revision's list is written only after its entries, and a
revision read back with an entry lost is an error naming the module.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:45:07 +01:00
jschoubben ab87109ec5 The indexer forms a catalog graph entry per module and a revision as a list of entry digests (milestone 47/G W4.1, W4.2 form)
The entry is the seat mesh-catalog's CatalogEntry filled from the module graph's
node a recompute computes (build edges, provisions, verbs, the edges left out on a
cycle) with where the trunk holds the module and its manifest's digest; a revision
lists one entry per module by the sha256 of its bytes, so an entry two revisions
share is one object (design 47, an unchanged entry is stored once). Rows in the
graph test: one entry per module, and only a moved entry's digest changes. Kept
as objects, numbered and said with W4.2's store and W4.3.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:44:56 +01:00
jschoubben e00232dcfb Merge branch 'feat/47-G-build' into feat/47-G-build-builder 2026-11-11 11:44:53 +01:00
jschoubben 74da8116db BL2: the build reserves its version at its start; reserved state, tools, verb and findings
The builder keeps one key per module and MAJOR.MINOR in its state reserved, written by compare-and-set when a trunk
build is claimed; nothing is reserved, and the build says wait-held, before the catalog says versions-filled; the key goes
on version-released; a built reservation unpublished past ten minutes is the finding version-unreleased; builder_reserved,
builder_reserved_drop (hand act, recorded) and the seat mesh-builds' verb reserved.

Builds: design 47 G §369, §372, §52, §85 (reserved)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:44:47 +01:00
jschoubben 839bc4a6e5 TL0: the teller's test follows the contracts, the settle ask gone with the verb settle
Builds: design 47 G §431 (the settle ask goes with the verb settle)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:44:42 +01:00
jschoubben 0d24af4e5b Merge branch 'feat/47-G-build' into feat/47-G-build-contracts 2026-11-11 11:44:06 +01:00
jschoubben 496989ccfb CT10: meshcatalogclient follows the registrations, a first view then each registration-changed
The assigner and the forge module's merge switch on their first registrations (design 47 G §353), so the
seat's client carries the typed follower on go/views: a first view asked of the verb registrations, a newer
version heard asked again until the picture holds it, an answer read before the change asked once more.

Builds: design 47 G §353, §245

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:43:53 +01:00
jschoubben bcd0888928 Merge branch 'feat/47-G-build' into feat/47-G-build-indexer 2026-11-11 11:41:25 +01:00
jschoubben 042800cb2a IX15: the indexer reads a branch's source revision through the seat mesh-delivery's verb source and its event source-moved
The catch-up of the heads the source names runs before a source-moved is read, once per branch; the gate's source bucket is no longer read.
internal/index compiles against the new contracts again (SourceByMainValue is gone); tests of earlier subtasks that
the broken compile hid are fixed (the validator's MAJOR.MINOR version in their manifests).

Builds: design 47 G §15, §115, §362

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:41:21 +01:00
jschoubben fc0cb1873a RN15: the runner's read verbs show, list, stands, why-carried and kept, from its own states (issue 1966)
The runner's tools bundle serves the seat mesh-pipeline-runner's read verbs as tools named
<seat>.<verb>, answered from its own states pipelines and kept, never another part's: show one
pipeline whole with its steps and their outputs' names, list by module, branch, commit or run newest
first, stands every step started and not ended with what it waits on and since when, why-carried the
pipeline a carried step came from, kept the kept results by level, digest or package.

Builds: design 47 G §83, §306, §75 (stands), §25 (why-carried)
Not built, waiting on design answers: show's step log (Q-RN6, the step log's section form) and each
store's fill against its cap in show and kept (Q-RN2, where the caps are declared).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:37:51 +01:00
jschoubben 5b0f155116 Merge branch 'feat/47-G-build' into feat/47-G-build-runner 2026-11-11 11:32:31 +01:00
jschoubben cafff10266 RN1: the pipeline runner's module, a foundation part with its kept data in old sections (issue 1966)
The module mesh-delivery-pipeline claims the seat mesh-pipeline-runner, serving its twelve verbs,
asks no template, keeps pipelines, kept, aged, findings and its first views in old state sections,
its step log on an old stream (128 MiB) and its step outputs in an old objects section (1 GiB),
hears the events its pipelines start and end on, and needs the assigner's program delivered first.
Its program stops when its state pipelines cannot be read; its own module is its account's.

Builds: design 47 G §1, §21, §27, §59, §85, §95, §101, §130, §333
Not built, waiting on design answers: §76's health check (its tool's name), §85's caps of the old
state sections (no size field on an old state), step-log's 100 days (the validator's 30-day bound),
and §59's sent-objects (the objects template's cap the design names has no default).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:32:31 +01:00
jschoubben 1ba1c487c7 Merge branch 'feat/47-G-build' into feat/47-G-build-indexer 2026-11-11 11:32:10 +01:00
jschoubben 540b88a946 IX21: the validator reads a manifest's version MAJOR.MINOR and the finding stream and ask of a findings state
The refusal of a status in a manifest (IX20) relies on strict decoding: a manifest
field naming a status is an unknown field and is refused. The `*` emitter of
consumes (design 47 G §386) is held for the design writer's answer on model-usage's
`*.usage.*`.

Builds: design 47 G §89, §368, §387

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:32:05 +01:00
jschoubben 337e620cf1 Merge branch 'feat/47-G-build' into feat/47-G-build-contracts 2026-11-11 11:31:16 +01:00
jschoubben eca4320d1c CT1: the runner's step outcome not asked, a pipeline's end count, and the step log kept 100 days; regenerated
An approval step after a failed required step ends not asked, naming that step (the
fixture of a failed pipeline said waiting before); Pipeline and PipelineEnded carry
end-count, one higher at each end again after a passing rerun. The fixture rows fail
against the contract before (end-count dropped on read).

Builds: design 47 G §24, §325 (not asked), §29, §85, §325 (the end count), §85 (step-log,
100 days).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:31:09 +01:00
jschoubben 0ae849b1df Merge branch 'feat/47-G-build' into feat/47-G-build-builder 2026-11-11 11:30:12 +01:00
jschoubben ab9b8d3471 CT5: the build seats accept step on check and on delivery, and run on check, each kind by its stream; regenerated
A kind's subject is <stream>.<kind>: check.step, delivery.step (a recovery's steps, the
runner alone) and check.run (node-build-go). Regenerated with seatgen at mesh-catalog
b5aebbbe (GEN4); its fixture rows for the three subjects fail to compile against the
contract before.

Builds: design 47 G §415, §455, §22, §206, §86, §338.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:29:13 +01:00
jschoubben bc77fabdad BL15: the gate's source is watched by every watched branch's key; SourceMainKey retired
Builds: design 47 G §15 (source.<branch> in place of source.main), §431 (readers of the source move off the main key)

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:28:36 +01:00
jschoubben 6b85c9045e IX20: the validator's tests hold a step's status out of a manifest and read the build seats' new accepts
A manifest naming a status is refused as an unknown field (strict decoding); the
two seat-table tests read the seat definitions as contracts now answer them.

Builds: design 47 G §6, §21, §23, §28, §101, §95 test

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:26:51 +01:00
jschoubben 6bbbceb55f A-D29: a template in the runner's manifest is refused, as in every part on the validator's list (issue 1966)
Design 47 *A module's registration* (b229f5c4 lines 480-481): a unit test of the manifest validator
refuses a template in the manifest of every part on its list, the runner's included. The row of
TestTheIndexerJudgesEveryManifestOnce now judges mesh-delivery-pipeline beside mesh-config; it fails
with the list as it stood before 0ad243c1.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:25:45 +01:00
jschoubben 86eb29f243 A-D29: the pipeline runner joins the validator's foundation list (ADR 0666 §4; issue 1966)
Builds ADR 0666 §4 (the runner is a foundation part: the bus module's own delivery waits on its
pipeline), changing ADR 0619 §1 and §3: judge.Foundation, the one list in code, gains
mesh-delivery-pipeline, so its manifest keeps its state in the old sections and a request of
new-form bus state by it is refused.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:25:45 +01:00
jschoubben c77e747f4e SD2, SD3: the kept-artifact judgement and the neutral pipeline step ask and its end, shared by the runner and the three build modules
Ported from the dev branch (192f6ab2, 4f013f44, dc0df1b5) into the package sdk/buildstep where
they were built; the package is not named by a design line (see below).

Builds: design 47 G §271 (a module claiming oci-artifact-registry but not its holder in the seat
list is refused), §24 (a step's end is published on its node's subject), §416 (the step ask carries
the kept results), §370 (the version).

Not decided: the package of SD2 and SD3. G-9 §420 names sdk/steprun only for the step-run code
(SD1); no line places the kept-artifact judgement or the step ask.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:06:27 +01:00
jschoubben 349a3519ef CT10: meshdeliveryclient reads the source per watched branch; SourceMainKey and the removed-verb rows retire
Builds: design 47 G §15, §305 (a reader names a branch's source revision: SourceKey, the
value SourceByBranchValue), §431 (the five verbs of release 6 leave the definition, so the
list RemovedVerbs and its test go; the settle ask goes with the verb settle).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:05:56 +01:00
jschoubben e1df6af536 CT7: the seat mesh-delivery keeps the state turns, and asks until their last users go; regenerated
Left in the definition: no line of the contracts part removes the state turns, and the
state asks is read by the teller, the forge bridge, the view and the indexer, whose rows
remove their reads; it is removed in the head where its last reader goes (design 47 G §431).

Builds: design 47 G §305, §431.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 11:05:56 +01:00
jschoubben 3883667254 CT10: meshwantsclient compares wants that now carry their parts by value
The want gained the released version and each part's digest (CT4), so two wants are
compared by value; a table row writes and reads one back. Failed to compile before.

Builds: design 47 G §379, §308.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 10:56:59 +01:00
jschoubben 90b8ba6461 CT10: the client meshpipelinerunnerclient: the runner's event subjects built and parsed, its bodies decoded
Builds: design 47 G §73, §74, §332 (every subject built and parsed back; group-ended
under branch and group with no module part). The rule Passed of the dev branch is not
built: no line of the contracts part names it.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 10:50:30 +01:00
jschoubben 72ac9b09cb CT11: regenerate the Go and TypeScript contracts from CT1 to CT9; each TypeScript contract as index.js with index.d.ts
Generated by seatgen (mesh-catalog, GEN1 and GEN2 on its worktree) from the
definitions of CT1 to CT9; module.json names the artifacts of the new seats
mesh-builds, mesh-pipeline-runner and git. seatgen -check is clean; every seat
package's generated fixture test passes.

Builds: design 47 G §341 (a TypeScript contract is emitted as index.js with
index.d.ts), §196, §339 (the generator refuses an unknown callers entry),
§260, §331.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 10:48:56 +01:00
jschoubben 15c065d2bb CT8: the seat mesh-delivery-checker: the events owed per repository and number, and checked
Builds: design 47 G §162, §164, §260 (owed on mesh.seat.mesh-delivery-checker.event.owed.<repository>.<number>, kept 7 days and 64 MiB per §396; checked).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 10:47:35 +01:00
jschoubben 71afa10f4d CT7: the seat mesh-delivery: source, recovery, groups with acts, owed and the record events; table, recheck, close and the milestone events removed
Builds: design 47 G §304, §305 (verbs source with a branch, recovery; groups; events
owed, pinned, freed, heads-replaced, record-opened, record-ended, filling, full, room,
source-moved, recovery-merged; table, recheck, close and the three milestone events
removed), §15, §162 (owed per repository and number, 7 days, 64 MiB), §431 (asks,
turns and the five verbs of release 6, checks and settle leave the definition),
§394 (recovery is of class act: the operator and sessions), §391 (class).

Open, left as the dev branch built it: the state merges is kept (no line says the
merge states of the gate go whole).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 10:47:13 +01:00
jschoubben 0c37cd6402 CT6: the seat git: its verbs with callers and error answers, tag, its events with hyphens, branch-moved kept
Builds: design 47 G §310, §311, §312 (an error answer fixture per verb), §313
(status, comment, view, note the forge bridge alone; merge-pull persons and
sessions; the reads invokers), §370 (tag, callers the builder), §396 (event names
with hyphens), §331 (branch-moved 64 MiB, 90 days), §11, §39 (state failed-steps),
§129, §111 (statuses, status), §391 (class).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 10:46:26 +01:00
jschoubben cbaa9a35e9 CT4: the seat mesh-wants: input, version-delivered, the accepted step, the want's version and parts, the step place
Builds: design 47 G §308, §22, §24, §116, §338 (accepted kind step from the runner
alone; step-ended.<node>), §331 (step-ended 32 MiB, version-delivered 64 MiB, 90
days), §376, §379 (version-delivered; the want names the released version and each
part's digest), §354 (verb input, callers the holders of the build seats; state
inputs), §184 (assignment revision per watched branch), §398 (the step place
declared here), §400 (no verb optional).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 10:45:40 +01:00
jschoubben 17517b9f4e CT5: the build seats' accepted kinds step and run, and the state detected-steps
Builds: design 47 G §22, §338 (accepted kinds step, runner alone; run, node-build-go,
callers the runner, the indexer, the assigner and the checker), §326, §414 (state
detected-steps, one key per artifact, apart from today's step keys steps).

Not built: §415's kind names check.step, check.run, delivery.step (the definition
reader refuses a dotted accepted-kind name); stopped on that question.

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 10:44:58 +01:00
jschoubben 6acad9425d CT9: the registry seats' text callers become lists of the forms of §336
Builds: design 47 G §68, §127, §336, §392 (seat:<seat>, invokers).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 10:44:02 +01:00
jschoubben 94f8d3a48c CT5: the build seats: steps, drop, kept-artifact with callers, step-ended on the node, the accepted step
Builds: design 47 G §22, §116, §206, §271, §326, §338 (callers: steps the runner
and the indexer, drop the runner and the builder, kept-artifact the node-engines),
§24, §331 (step-ended.<node>, 128 MiB), §370, §373 (the ask carries the version and
each package member's digest), §203, §324 (acts build on the language).

Not yet in this commit, left as the dev branch built them and not read against the
lines: the accepted kind names (dev's 'step'; G-9 §415 names check.step, check.run,
delivery.step), the state rename detected-steps (G-9 §414).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 10:44:02 +01:00
jschoubben c8b11baf04 CT3: the seat mesh-catalog: registrations, versions, outdated, input, entry, version-released, versions-filled, entries with languages
Definition and fixtures; the generated contracts come with CT11 (their fixture
test is the proof: it fails on a fixture the definition does not read).

Builds: design 47 G §2, §3, §4, §100, §108, §394 (registrations read; register,
policy, watch, unwatch act, callers operator and sessions), §349, §372, §375,
§354, §443 (versions, outdated, input, entry; version-released, versions-filled
with no age limit; layouts versions, build-edges, inputs), §307, §260
(catalog-revision.<branch>), §47, §323, §365, §374, §378 (entry: artifacts with
language, edges with stale/order, word and part, the events the streams declare),
§331, §396 (keep objects), §400 (no verb optional), §391 (class).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 10:44:02 +01:00
jschoubben 7f0fbf15ae CT2: the seat mesh-builds, held once for the mesh: package-published, toolchain-agreed, reserved
Definition and fixtures; the generated contracts come with CT11.

Builds: design 47 G §52, §307 (seat held once, event package-published), §334
(artifact reference, version, digest, branch, source revision), §374 (resolved
dependencies with version and digest), §376 (toolchain-agreed: language, version,
toolchain digest), §369 (verb reserved, callers the registry seats' holders),
§331, §396 (keep: package-published 128 MiB, toolchain-agreed 16 MiB, 90 days),
§391 (class read).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 10:35:25 +01:00
jschoubben 04270ef754 CT1: the seat mesh-pipeline-runner, its twelve verbs with callers and class, its kept events and acts
Definition and fixtures only: the generated Go and TypeScript contracts and the
module.json artifacts come with CT11, once the reader of G-9's forms and the
generator read them (seatgen refuses these forms today).

Builds: design 47 G §306, §394, §391 (verbs, callers, class), §73, §332 (event
subjects; group-ended under branch and group), §331, §396 (each event's keep
object: 90 days and its cap), §65, §203, §266 (acts pipeline, bound 30m), §261
(fixtures name each subject), §419 (pipeline-ended: tests, over-budget yes/no),
§441 (widens says could not run).

Claude-Session: https://claude.ai/code/session_01JG73KEq4zoDfM9WtYpcQgZ
2026-11-11 10:34:52 +01:00