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
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
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
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
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
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
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 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
mesh/check checking 24d9c6cdf8d9 on a5d710863157 | novox/mesh-delivery#208 in group fix/checker-preview-after-failed-step
A member whose check step errored after its fetch merged was left unpreviewed,
so one failing level hid the manifest validator and the composition from the
check, and the words "its head does not merge or its fetch did not answer"
were wrong for it. The checker now reads the fetch a failed step answers
beside its error and previews the merge from it; only a head that does not
merge or a fetch that did not answer stays unpreviewed, and the check says
which of the two.
Builds: design 47 G A-286 (G-22-lead-answers-2.md at hq 41dd30fe; issue 1921; principle 3)
Quick: this checker on main; thorough: the same rule in G's checker (join 11, J15).
Claude-Session: https://claude.ai/code/session_01NcbgfGKaxw984XyAPfLm4h
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
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
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
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
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
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
mesh/check being carried to 104909817b70 on 76db40eb6be1 | from 983c46e2576c
A pull request's candidate is judged before its merge and its verdict written, said nowhere. At the merge the
digest becomes the module's trunk manifest, but the merge's judging pass finds the same verdict, writes nothing
and so said nothing: the bus module never heard the new manifest, and the grants part, which follows the
verdicts on manifest-accepted, held the module as having no verdict and wrote no grant for its new fingerprint
(claude-licence-manager, three times on 2026-11-12). The merge's pass now says a fresh trunk manifest's accepted
verdict from the verdict held, with its revision.
Builds: design 25 bus-state §1, §12.2 (the indexer says manifest-accepted for every newly accepted manifest; the
grants part follows the verdicts on it)
Builds: design 25 bus-state L1 (hq ff30ac16, the lead's answer: a merged candidate's manifest is newly accepted).
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
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
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
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
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
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
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
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