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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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