Compare commits

..
Author SHA1 Message Date
jschoubben ba7c9e7f17 Try a small fix's branch before its pull request, since local runs miss the check's toolchain (playbook 08)
mesh/merge-gate out of date: judged against trunk 9bfd57174fab, the trunk is now f8c0676b3a1d; judged again on a recheck or when it is merged
mesh/repo-check out of date: judged against trunk 9bfd57174fab, the trunk is now f8c0676b3a1d; judged again on a recheck or when it is merged
mesh/delivery stopped: the pull request closed unmerged
2026-10-15 23:33:20 +02:00
mesh-tools 9bfd57174f Merge pull request 'Playbook 08: a small fix may cover two or three related issues in one repository' (#368) from playbooks/08-related-issues into main 2026-10-15 20:38:39 +00:00
jschoubben a227f98bdd Let a small fix cover two or three related issues in one repository (playbook 08)
mesh/merge-gate head a227f98bddd4 merged into trunk 409fa9bbc979 — pass: the change touches no module of the mesh's graph
mesh/repo-check head a227f98bddd4 merged into trunk 409fa9bbc979 — pass: its merge-check.sh passed
mesh/delivery delivered
2026-10-15 22:37:12 +02:00
mesh-tools 409fa9bbc9 Merge pull request 'Playbook 08: a small fix gets three review rounds, as a feature does' (#367) from playbooks/08-three-rounds into main 2026-10-15 19:29:07 +00:00
jschoubben 747fc546c1 Allow a small fix three review rounds, as a feature has (playbook 08)
mesh/merge-gate head 747fc546c1df merged into trunk 046bbd3b308d — pass: the change touches no module of the mesh's graph
mesh/repo-check head 747fc546c1df merged into trunk 046bbd3b308d — pass: its merge-check.sh passed
mesh/delivery delivered
2026-10-15 21:28:29 +02:00
mesh-tools 046bbd3b30 Merge pull request 'Playbooks 01, 02 and 04: one cycle from idea to delivered milestones' (#366) from playbooks/01-02-04-the-cycle into main 2026-10-15 19:23:08 +00:00
jschoubben 99243ec47e Confirm milestones before opening their issues, name issue 845 for the check, keep 01's withdrawal and history lines
mesh/merge-gate head 99243ec47efa merged into trunk 5ff97ec3aa02 — pass: the change touches no module of the mesh's graph
mesh/repo-check head 99243ec47efa merged into trunk 5ff97ec3aa02 — pass: its merge-check.sh passed
mesh/delivery delivered
2026-10-15 21:19:01 +02:00
jschoubben 0d66edb24c Make playbooks 01, 02 and 04 one cycle from idea to delivered milestones
The operator found 04 odd on 2026-10-15: it went from a settled design straight to building,
with no work breakdown, and contradicted playbook 07 on pull requests. 01 now starts from the
operator's idea with setup questions, findings and a direction the operator confirms; 02
graduates that direction into one record per reversible choice and hands the design on; 04
breaks it into milestones usable on their own, one issue per repository part, each milestone
one feature step of 07. 01 notes the knowledge base's insight-only rule for an active effort
until issue 844 is delivered.
2026-10-15 21:18:15 +02:00
mesh-tools 5ff97ec3aa Merge pull request 'Say rollout, not walk (issue 646)' (#365) from fix/646-rollout-not-walk into main 2026-10-15 17:59:22 +00:00
jschoubben 75ac87c72b Merge remote-tracking branch 'origin/main' into fix/646-rollout-not-walk
mesh/merge-gate head 75ac87c72b6a merged into trunk 058d76ee8a4e — pass: the change touches no module of the mesh's graph
mesh/repo-check head 75ac87c72b6a merged into trunk 058d76ee8a4e — pass: its merge-check.sh passed
mesh/delivery delivered
2026-10-15 19:57:54 +02:00
jschoubben 437523554e Say rollout, not walk, for the sending of a batch across nodes (issue 646) 2026-10-15 19:57:20 +02:00
mesh-tools 058d76ee8a Merge pull request 'Playbook 07 as five bounded phases with reused context; playbook 08 for small fixes' (#364) from playbooks/07-08-fast-flow into main 2026-10-15 17:54:22 +00:00
jschoubben db6430ccbf Show the report's issues as a tree, and keep the agent's brief, the red-check rule and the forge-commit check, in playbook 07
mesh/merge-gate head db6430ccbf39 merged into trunk 99a9da095010 — pass: the change touches no module of the mesh's graph
mesh/repo-check head db6430ccbf39 merged into trunk 99a9da095010 — pass: its merge-check.sh passed
mesh/delivery delivered
2026-10-15 19:52:48 +02:00
jschoubben 458f248c05 Give the lead's ten-minute report a full and a short layout, in playbook 07 2026-10-15 19:52:31 +02:00
jschoubben 464833d0ef Rewrite playbook 07 as five bounded phases with reused context, and add playbook 08 for small fixes
mesh/merge-gate head 464833d0ef3f merged into trunk 99a9da095010 — pass: the change touches no module of the mesh's graph
mesh/repo-check head 464833d0ef3f merged into trunk 99a9da095010 — pass: its merge-check.sh passed
mesh/delivery superseded: a newer head of the same pull request
A feature waited a day for its last issue, each small issue paid for its context again, and
waits nobody saw cost the most time. The operator set the flow on 2026-10-15: prepared context
per repository, one to two hours of local development on unit tests, one review of at most three
rounds back to the same agents, one push for the integration checks, then the delivery plan;
steps for a larger feature; a separate playbook for small fixes; models per step; a wait list
with bounds; a prepared clear at each phase end.
2026-10-15 19:26:02 +02:00
mesh-tools 99a9da0950 Merge pull request 'Add three lessons from feature mail-hardening to playbook 07' (#363) from playbook-07-lessons into main 2026-10-15 15:14:16 +00:00
jochen de8a7176ab Add three lessons from feature mail-hardening to playbook 07
mesh/merge-gate head de8a7176abb8 merged into trunk a7d4c3953599 — pass: the change touches no module of the mesh's graph
mesh/repo-check head de8a7176abb8 merged into trunk a7d4c3953599 — pass: its merge-check.sh passed
mesh/delivery delivered
A temporary-directory quota failure, a delivery group's manifest-check
ordering, and an agent that stops or finishes without committing each cost
time during that feature because the playbook did not yet say what to do.
Writing them down so the next feature avoids the same detours.
2026-10-15 17:08:43 +02:00
mesh-tools a7d4c39535 Merge pull request 'Playbook 07: an issue is one repository and five to ten minutes; a long run says where it stands' (#362) from pb07-issue-size into main 2026-10-15 12:40:48 +00:00
mesh-toolsandClaude Opus 5.5 048f14540a Size an issue for one repository and five to ten minutes, and have a long run say where it stands, in playbook 07
mesh/merge-gate head 048f14540a50 merged into trunk c2ee44255e5b — pass: the change touches no module of the mesh's graph
mesh/repo-check head 048f14540a50 merged into trunk c2ee44255e5b — pass: its merge-check.sh passed
mesh/delivery delivered
On 2026-10-15 issues spanning one repository finished in two to four minutes, while those spanning two or
three ran for thirty to sixty, mostly merging the feature head and checking again as other agents landed.
The operator asked for agents that finish in five to ten minutes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 12:37:33 +00:00
mesh-tools c2ee44255e Merge pull request 'Playbook 07: the ready note and the brief a fixing agent follows' (#361) from pb07-agent-brief into main 2026-10-15 12:33:46 +00:00
mesh-toolsandClaude Opus 5.5 ddf23a7861 Put the ready note and the brief a fixing agent follows into playbook 07
mesh/merge-gate head ddf23a786101 merged into trunk f3bbfd4bf628 — pass: the change touches no module of the mesh's graph
mesh/repo-check head ddf23a786101 merged into trunk f3bbfd4bf628 — pass: its merge-check.sh passed
mesh/delivery delivered
They lived in a file on one machine that only one session's agents read. They are how every feature's
agents work, so they belong with the method; a feature keeps only its local facts (paths, branch, locks).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 12:33:00 +00:00
mesh-tools f3bbfd4bf6 Merge pull request 'Playbook 07: up to five Sonnet agents at once, at most two on the larger model' (#360) from pb07-five-agents into main 2026-10-15 12:02:56 +00:00
mesh-toolsandClaude Opus 5.5 893d90fb41 Allow up to five Sonnet agents at once and keep the larger model to two, in playbook 07
mesh/merge-gate head 893d90fb417e merged into trunk 1e577168bf0c — pass: the change touches no module of the mesh's graph
mesh/repo-check head 893d90fb417e merged into trunk 1e577168bf0c — pass: its merge-check.sh passed
mesh/delivery delivered
The operator, 2026-10-15: the smaller model is as good as free against the weekly allowance, so the
limit that matters is how many agents the lead can settle and follow (three to five); subagents on the
larger model stay at two at most and as rare as possible.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 12:00:09 +00:00
mesh-tools 1e577168bf Merge pull request 'Playbook 07: three to five review rounds, the reviewer told its round, and the allowance in every report' (#359) from pb07-review-rounds into main 2026-10-15 11:22:56 +00:00
mesh-toolsandClaude Opus 5.5 f349c940f0 Cap review rounds at three to five and report the allowance used, in playbook 07
mesh/merge-gate head f349c940f0fe merged into trunk 1699375476c1 — pass: the change touches no module of the mesh's graph
mesh/repo-check head f349c940f0fe merged into trunk 1699375476c1 — pass: its merge-check.sh passed
mesh/delivery delivered
A reviewer that does not know its round keeps finding the next smaller thing: one decision record went
through nine rounds on 2026-10-15, each spending the operator's shared weekly allowance. The operator
asked for three to five rounds, the round told to the reviewer, and the allowance in every report.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 11:21:37 +00:00
mesh-tools 1699375476 Merge pull request 'Playbook 07: the lead settles an issue's questions before a smaller-model agent builds it, two at a time' (#358) from pb07-builders into main 2026-10-14 23:26:01 +00:00
mesh-toolsandClaude Opus 5.5 912fd428fb Have the lead settle an issue's questions before a smaller-model agent builds it, two at a time
mesh/merge-gate head 912fd428fb89 merged into trunk a75faad88240 — pass: the change touches no module of the mesh's graph
mesh/repo-check head 912fd428fb89 merged into trunk a75faad88240 — pass: its merge-check.sh passed
mesh/delivery delivered
Five agents at once, each stopping on an undecided design question and restarting, spent a
week's allowance in a night. Also write down the lessons of feature 57: never land on a red
check, a new manifest word lands with the controller that reads it, and review the tree that
is pushed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 23:24:14 +00:00
mesh-admin a75faad882 Merge pull request 'To-be 42: the kernel module holds the kernel's run-time settings, huge pages first (ADR 0369, issue 746)' (#357) from design/42-kernel-module-holds-runtime-settings into main 2026-10-14 21:52:48 +00:00
jschoubben 9f4757a8e4 Let the kernel module hold the kernel's run-time settings, huge pages first (ADR 0369, issue 746)
mesh/merge-gate head 9f4757a8e49d merged into trunk 93f8bbfc8eaf — pass: the change touches no module of the mesh's graph
mesh/repo-check head 9f4757a8e49d merged into trunk 93f8bbfc8eaf — pass: its merge-check.sh passed
mesh/delivery delivered
Huge pages at always flooded the control-node's spinning disks with journal
write-back and cost the controller its lease; the setting needs an owner,
and the kernel module is the one to-be 42 already names for the kernel.
2026-10-14 23:48:35 +02:00
mesh-admin 93f8bbfc8e Merge pull request 'To-be 48: cite ADR 0368, the resolver restarts itself for that module alone' (#356) from design/48-cites-adr-0368 into main 2026-10-14 21:29:04 +00:00
jschoubben 58edc4b4fb Cite ADR 0368 in design 48: the resolver restarts itself, for that module alone
mesh/merge-gate head 58edc4b4fb90 merged into trunk 010a34cc33e8 — pass: the change touches no module of the mesh's graph
mesh/repo-check head 58edc4b4fb90 merged into trunk 010a34cc33e8 — pass: its merge-check.sh passed
mesh/delivery delivered
Redoes the design-48 edit of the unmerged pull request 284, which cited the
record under its file number 0280; the record now lives in the knowledge base
as ADR 0368.
2026-10-14 23:18:38 +02:00
mesh-admin 010a34cc33 Merge pull request 'To-be 08: the five connectivity contexts walked through the network layers' (#275) from design/connectivity-through-the-layers into main 2026-10-14 21:14:49 +00:00
mesh-admin 35d5b2814f Merge pull request 'Playbook 07: review the local commits before anything is pushed' (#355) from playbook-07-review-before-push into main 2026-10-14 21:12:20 +00:00
jschoubben 3c5edc3879 Cite decisions by number now that they live in the knowledge base, and date the design today
mesh/merge-gate head 3c5edc387955 merged into trunk 35d5b2814f09 — pass: the change touches no module of the mesh's graph
mesh/repo-check head 3c5edc387955 merged into trunk 35d5b2814f09 — pass: its merge-check.sh passed
mesh/delivery delivered
2026-10-14 23:12:18 +02:00
jochen ab5025d508 Connectivity: walk the five contexts through the network layers, so a reader can see which layer each one acts at and read a failure from the bottom up 2026-10-14 23:11:53 +02:00
mesh-adminandClaude Opus 5.5 6c8532ce70 Review the local commits before anything is pushed
mesh/merge-gate head 6c8532ce7090 merged into trunk c032cae10030 — pass: the change touches no module of the mesh's graph
mesh/repo-check head 6c8532ce7090 merged into trunk c032cae10030 — pass: its merge-check.sh passed
mesh/delivery delivered
A push starts the forge's checks, which build the modules and run every
test for up to a quarter of an hour, so a review finding fixed after the
push costs another full run (the operator, 2026-10-14).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 20:03:11 +00:00
mesh-admin c032cae100 Merge pull request 'Playbook 07: how several agents work one feature on one branch' (#354) from playbook-07-parallel-issues into main 2026-10-14 19:55:30 +00:00
mesh-adminandClaude Opus 5.5 071fc1c29d Name the lead, and have it take over a finished issue
mesh/merge-gate head 071fc1c29dce merged into trunk 21b79a04a283 — pass: the change touches no module of the mesh's graph
mesh/repo-check head 071fc1c29dce merged into trunk 21b79a04a283 — pass: its merge-check.sh passed
mesh/delivery delivered
A finished issue's agent is gone, so left in fixing it goes stale; the lead
takes it over until the feature is delivered. One repository is one
delivery, not a group; readiness comes from depends-on links (review
comment 12466).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 19:53:20 +00:00
mesh-adminandClaude Opus 5.5 c2d5323dea Say how several agents work one feature on one branch
mesh/merge-gate head c2d5323dea5a merged into trunk 21b79a04a283 — pass: the change touches no module of the mesh's graph
mesh/repo-check head c2d5323dea5a merged into trunk 21b79a04a283 — pass: its merge-check.sh passed
mesh/delivery superseded: a newer head of the same pull request
Feature 57 was first worked as a pull request per issue into protected
branches and lost most of a day waiting on merge checks. Record the issue
as the unit, a review and checks once at the end, landing by fast-forward
under a lock, and the lessons met on the way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 19:50:14 +00:00
mesh-admin 21b79a04a2 Merge pull request 'Fit design 57 to walks with no first-machine gate (ADR 0360, ADR 0362)' (#353) from design/57-adr-0360 into main 2026-10-14 18:15:22 +00:00
mesh-adminandClaude Opus 5.5 bafc7b7d05 A silent machine is caught up by the backlog walk, not fixed forward
mesh/merge-gate head bafc7b7d05dd merged into trunk dcb5d5ce3883 — pass: the change touches no module of the mesh's graph
mesh/repo-check head bafc7b7d05dd merged into trunk dcb5d5ce3883 — pass: its merge-check.sh passed
mesh/delivery delivered
A machine that says nothing is often asleep; its builds wait for the
backlog walk (ADR 0360 clause 10), so no new pull request is needed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:12:52 +00:00
mesh-adminandClaude Opus 5.5 5e493934a5 Say the rehearsal is the only live check, and that a fix goes into main
mesh/delivery superseded: a newer head of the same pull request
mesh/merge-gate head 5e493934a583 merged into trunk dcb5d5ce3883 — pass: the change touches no module of the mesh's graph
mesh/repo-check head 5e493934a583 merged into trunk dcb5d5ce3883 — pass: its merge-check.sh passed
The pull requests' checks still run before the walk, and by then the
release's branches have reached main. Name the silent machine too, and
list ADR 0360, which the passages rest on (review comment 12348).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:11:52 +00:00
mesh-adminandClaude Opus 5.5 c957fcc6d7 Fit design 57 to walks with no first-machine gate
mesh/merge-gate head c957fcc6d751 merged into trunk dcb5d5ce3883 — pass: the change touches no module of the mesh's graph
mesh/repo-check head c957fcc6d751 merged into trunk dcb5d5ce3883 — pass: its merge-check.sh passed
mesh/delivery superseded: a newer head of the same pull request
ADR 0360 sends a merge's builds to every machine at once, so release 57
has no first node to hold it and P6 can no longer wait at a gate. ADR 0362
moves the wait for the provisioner to the walk's end.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:09:02 +00:00
mesh-admin dcb5d5ce38 Merge pull request 'To-be 45: the bus module says every user's slow consumer, and S9 raises it (issue 270, ADR 0357)' (#352) from design/270-the-bus-module-says-every-users-slow-consumer into main 2026-10-14 07:00:14 +00:00
jochen bb8075b37b Give ADR 0357 a home in design 45: the bus module says every user's slow consumer, and S9 raises it (issue 270)
mesh/merge-gate head bb8075b37bc1 merged into trunk 40a39c860278 — pass: the change touches no module of the mesh's graph
mesh/repo-check head bb8075b37bc1 merged into trunk 40a39c860278 — pass: its merge-check.sh passed
mesh/delivery delivered
2026-10-14 08:42:54 +02:00
mesh-admin 40a39c8602 Merge pull request 'To-be 57: building config and provisioning, as 37 packages each an issue (ADR 0348, ADR 0349)' (#350) from design/57-building-config-and-provisioning into main 2026-10-13 23:57:18 +00:00
mesh-adminandClaude Opus 5.5 e5b98e3b0a Design 57: answer the second review of hq#350
mesh/merge-gate head e5b98e3b0a42 merged into trunk fd416cef91bf — pass: the change touches no module of the mesh's graph
mesh/repo-check head e5b98e3b0a42 merged into trunk fd416cef91bf — pass: its merge-check.sh passed
mesh/delivery delivered
The word setting waits for R2, P3 waits for F3, the group's order is declared with after: lines, and a stop's fix is a new merge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 23:53:59 +00:00
mesh-adminandClaude Opus 5.5 2f3e6e6641 Design 57: answer the review of hq#350
mesh/merge-gate head 2f3e6e6641d0 merged into trunk fd416cef91bf — pass: the change touches no module of the mesh's graph
mesh/repo-check head 2f3e6e6641d0 merged into trunk fd416cef91bf — pass: its merge-check.sh passed
mesh/delivery superseded: a newer head of the same pull request
Role names instead of node names, the failure rule as ADR 0276 and 0299 have it, readiness and adoption of existing credentials said exactly, and the counts and refusals corrected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 23:47:32 +00:00
mesh-adminandClaude Opus 5.5 1405dd39e8 Design 57: ship the packages as one release, rehearsed in the lab
mesh/merge-gate head 1405dd39e8bb merged into trunk fd416cef91bf — pass: the change touches no module of the mesh's graph
mesh/repo-check head 1405dd39e8bb merged into trunk fd416cef91bf — pass: its merge-check.sh passed
mesh/delivery superseded: a newer head of the same pull request
The operator chose one delivery over one per package; the packages meet on one branch per repository and reach main as one delivery group.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 23:40:15 +00:00
mesh-adminandClaude Opus 5.5 11294372b7 Design 57: the work of ADR 0348 and ADR 0349 as packages, each an issue, in dependency order
mesh/delivery superseded: a newer head of the same pull request
mesh/merge-gate head 11294372b769 merged into trunk fd416cef91bf — pass: the change touches no module of the mesh's graph
mesh/repo-check head 11294372b769 merged into trunk fd416cef91bf — pass: its merge-check.sh passed
So config and provisioning are built in small, provable steps with at most five worked at once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 23:12:23 +00:00
9 changed files with 48 additions and 201 deletions
+25 -99
View File
@@ -69,8 +69,7 @@ is listed under [Homonyms](#homonyms), with the qualified form each domain uses.
**Recorded in** the catalogue, one manifest per module. **Upstream of** every other domain; its words
are a published vocabulary, fixed by the manifest's schema. **Decided by** ADR 0040, 0126, 0174, 0188,
0207, 0236, 0262.
**Uses:** module, seat, config value (Config), provision (Provisioning), data class (Data), health (Health
and repair).
**Uses:** module, seat, provision (Provisioning), data class (Data), health (Health and repair).
- **manifest** — the file a module is defined by (`module.json`): what it is, what it provides and
requires, the seats it claims, the resources it declares, its tools, its data and its health. Say
@@ -84,9 +83,18 @@ and repair).
it guards: the `mesh-controller`, `postgres` and `nats` modules claim the `mesh-controller`,
`mesh-store` and `mesh-broker` seats (ADR 0079,
ADR 0116).
- **setting** — a value a manifest declares and an assignment gives, one of the two ways a node varies
a module (ADR 0174).
What a "flavor" once varied is a setting or a separate module.
*Not:* ~~flavor~~
- **preference** — a setting whose manifest gives it a default, because its value is true of the
software and only tuned per node: a font size, a width
(ADR 0262).
A setting with no default is the operator's own value: a domain, an identity.
*Not:* ~~tunable~~ (hq)
- **kept region** — a marked block in a managed file the mesh writes *into*, where the operator's own
lines survive every send and are given back when the module goes (ADR 0174). The other way a node
varies a module, besides a config value; a **managed** file's marked block is one (Provisioning).
varies a module.
- **bundle** — the artifact a module's own code is built into — its tools, a seat's implementation, a
daemon — in any language the mesh has a toolchain for; never an image. A **tools bundle** speaks MCP to
the tool runner. One module may declare several
@@ -103,55 +111,6 @@ and repair).
(ADR 0236).
The controller's verb `upgrade` shows it.
## Config — the values someone may change
**Purpose.** To hold, check and resolve every value a module reads that someone may change, and to say
where each resolved value came from. **Recorded by** the `mesh-config` module, in its buckets on the bus,
with its store as the history behind them. **Upstream of** Provisioning, which places the values;
downstream of Module and Placement. **Decided by** ADR 0262, 0277, 0348.
**Uses:** module, node, manifest (Module), assignment (Placement), provision (Provisioning), proposal
(Operator and conversation).
- **config value** — anything a module reads that someone may change: a font size, a domain, an address.
A module declares every one it reads under `config` in its manifest, with a type, a description,
validation, whether it is trusted, optionally the predefined key it falls back to, and a default or
`required`; it lands in a template file as `${config:<key>}` or is read by the module's code at runtime.
It resolves from four sources, the most specific winning: the default in the manifest; **mesh config**,
the value of the predefined key it falls back to for the whole mesh; **node config**, that key's value
on one node; and **module-assignment config**, the module's own value on one node. There is no module
value for the whole mesh. *Config* is the concept, the verb (`config`) and the manifest field
(ADR 0348). Mesh config is a source level, the value set for the whole mesh; `mesh-config` is the module
that keeps every level. The controller holds, mirrors and resolves no config value (ADR 0348 §9).
Older records and documents say "setting" for a config value and "settings" for the concept; new writing
says config value and config. The word goes on this entry's *Not:* line once the documents in force that
still use it in running prose are reworded, which is issue 683; until then it is checked by review. The
manifest field and the verb "settings" are kept as aliases until every module has moved (ADR 0348 §1,
issue 630), and are named on the line below with the rest once issue 683 is done.
*Identifier until renamed:* `takes-settings`, `${setting:}` — manifest forms kept as aliases until every
module has moved to their config names (ADR 0348 §1, issue 630).
What a "flavor" once varied is a config value or a separate module.
*Not:* ~~flavor~~
- **predefined key** — a key of the catalogue's `predefined.json`, the fixed list of keys for which mesh
config and node config hold values, each with its type, description, validation and whether it is
trusted, such as `font-size`. A config value may name the predefined key it falls back to, of its own
type; one that names none resolves from its default and the module's own value only. The list is the
catalogue build's: a change to it is validated with every manifest naming a key, and removing a key still
named or still holding a value is refused (ADR 0348).
- **trusted** — said of a config value that decides what runs or who can reach what. At every level it is
set only at the controller's terminal or through `config` with propose, on the operator's Approve; a
module value that falls back to a trusted predefined key is itself trusted (ADR 0277, ADR 0348 §8). Not
the trusted sender of an operator message (see [Homonyms](#homonyms)).
- **preference** — a config value whose manifest gives it a default, because its value is true of the
software and only tuned per node: a font size, a width
(ADR 0262).
A config value with no default is `required`: the operator's own value, such as a domain or an
identity, and while nothing sets it the module's files are not written (ADR 0348).
*Not:* ~~tunable~~ (hq)
- **`mesh-config`** — the module that owns every config value, and not the source level mesh config: it
holds the seat `mesh-config` once for the mesh, validates, takes a trusted value only from the
controller's terminal or the operator's Approve, keeps the history with who set it and why, and resolves
the four sources (ADR 0348).
## Core — the mesh's own machinery
**Purpose.** To keep the controller, the bus, the store and every node's engine running and agreed, so
@@ -231,10 +190,9 @@ every other domain has something to run on. **Recorded by** the controller and t
**Purpose.** To decide, send and apply what each node runs, and to say why.
**Recorded by** the controller's `inventory` database. **Upstream of** Provisioning, Connectivity, Data
and Health and repair. **Decided by** ADR 0100, 0126, 0176, 0181, 0207, 0221, 0252, 0261.
**Uses:** node, machine, module, seat, manifest (Module), config value (Config).
**Uses:** node, machine, module, seat, setting (Module), manifest (Module).
- **assignment** — a module put on a node. Its config values on that node (module-assignment config,
Config) are `mesh-config`'s, never part of what the controller records (ADR 0348 §9).
- **assignment** — a module put on a node, with the settings that node gives it.
- **pending assignment** — an assignment of a module whose build is still running, kept, and made by the
controller when that build registers the module, or ended with why when it does not
(ADR 0261).
@@ -269,7 +227,7 @@ and Health and repair. **Decided by** ADR 0100, 0126, 0176, 0181, 0207, 0221, 02
(ADR 0181).
Not a name a manifest carries.
- **agent account** — the login every coding agent on a node runs as, when the node names one of its own;
stated on the node record at the controller's terminal, never by a verb or a config value. Empty means agents
stated on the node record at the controller's terminal, never by a verb or a setting. Empty means agents
run as the operator account. It cannot become root without a person, and the node-engine judges that on
every look (ADR 0266).
- **account group** — a group of the machine's group database that a module puts an account in, by
@@ -280,21 +238,15 @@ and Health and repair. **Decided by** ADR 0100, 0126, 0176, 0181, 0207, 0221, 02
## Provisioning — one module serving another
**Purpose.** To resolve which module serves a provision for which consumer, to wire the two, and to
place every value a module needs into its files on its node. **Recorded by** the controller and
`mesh-provisioner`. **Upstream of** Data; downstream of Module, Placement, Config and Identity.
**Decided by** ADR 0027, 0084, 0138, 0225, 0230, 0263, 0349.
**Uses:** module, seat, node-engine (Core), declaration (Placement), config value (Config), credential
and vault (Identity and access).
**Purpose.** To resolve which module serves a provision for which consumer, and to wire the two.
**Recorded by** the controller. **Upstream of** Data; downstream of Module, Placement and Identity.
**Decided by** ADR 0027, 0084, 0138, 0225, 0230, 0263.
**Uses:** module, seat, credential (Identity and access).
- **provision** — a service one module `provides` and others `require`; the mesh resolves a provider
and wires the two with an endpoint and a credential. A provision is a service you offer, a seat is a
role you occupy, and the two meet where a seat delivers a provision: occupying the seat is what makes
a module *the* provider of it.
Every value a module needs is a provision from the domain that owns it: placement from the controller,
config values from `mesh-config`, shared secrets from the vault, a consumer's values from the module
providing it, an item of a collection from its contributor. A module says only what it needs and where
it lands (ADR 0349).
- **provider** and **consumer** — the module that provides a provision, and the module that requires
it. Which of several providers serves a consumer is resolved
(ADR 0084).
@@ -312,28 +264,6 @@ and vault (Identity and access).
node seat `node-mounts`, as a mount unit and an automount unit, mounted on access (ADR 0263).
- **occasional source** — a share on a device that is not a node and comes and goes, such as a USB disk;
its absence is a state, *not present*, never a fault (ADR 0263).
- **mesh-provisioner** — the module that places provisions on the nodes: it holds the seat
`mesh-provisioner` once for the mesh, keeping which domain answers which kind of placeholder, what each
module on each node needs, what is applied where and the items of every collection, and the seat
`node-provisioner` on every node, which its provisioner client serves (ADR 0349).
- **provisioner client** — mesh-provisioner's part on one node. For each module there it reads the
placeholders of its template files, records the needs, watches each owner's values for the node, fills a
template only once every value is there, has the node-engine write the file through a narrow local verb,
makes the program take the change as the file declares (`restart-on`, `reload-on`, `read-on-use`), and
reports `prov.applied`. It runs as a service with a bus account of its own, never in the tool runner
(ADR 0349).
- **collection** — a provision with many providers. The **collector**, a module that takes additions from
others (a shell's snippets, a bar's blocks), requires it; each **contributor** ships its **item** as a
template in its own repository and provides it. The provisioner client fills the collector's template
from the items of the contributors placed on its node, and an item goes when its contributor leaves the
node (ADR 0349).
- **owned** — a placed file that is the mesh's whole: the provisioner writes it back whenever it differs.
It is one of three answers a manifest gives for each file it places (`owner-at-runtime`): **owned**,
**seed** or **managed**. Whichever it is, the file has one writer: the node-engine writes it only on the
provisioner client's word (ADR 0349).
- **seed** — a placed file the provisioner writes once; from then on it is the program's.
- **managed** — a placed file of which only its named keys or a marked block (a kept region, Module) are
the mesh's; the program keeps the rest.
## Identity and access — who may do what
@@ -348,7 +278,7 @@ and the operator act. **Recorded by** the controller's `identity` and `licences`
- **secret** — a credential or other value the vault keeps sealed and the node-engine unseals into a
file at apply (ADR 0085).
- **secret family** — a module's own secrets declared as one name ending in `-*`; each member is the prefix
and a name (`smb-password-<source>`, one per source the module's config values name), given by its full name
and a name (`smb-password-<source>`, one per source the module's settings name), given by its full name
and never made by the mesh
(ADR 0283).
- **vault** — the module that owns every secret (`mesh-vault`,
@@ -492,7 +422,7 @@ becomes a message). **Decided by** ADR 0227, 0231, 0240, 0252, 0283.
running session, started before, does not have that group yet. Said by the node-engine as the module's
resource of kind `account`; it clears at the first look after a new login (ADR 0252).
- **waiting** — a resource's health when its module's tool check says it waits for the operator: a named own
secret or config value of the module, not given yet, without which a part cannot work. Not a fault: the
secret or setting of the module, not given yet, without which a part cannot work. Not a fault: the
controller checks it and says it as the condition `needs-operator`, naming the act, and the first-node gate
reads it as *waits for a person*
(ADR 0283).
@@ -616,7 +546,7 @@ asking, never the act. **Decided by** ADR 0152, 0175, 0234, 0259, 0272.
published for that asker alone. The only thing an asker acts on (ADR 0259).
- **proposal** — a change an agent, or anyone the bus admits, puts forward through a verb and that takes
effect only on the operator's warrant, bound to the exact thing shown: a shared instruction section (ADR
0274), a trusted config value (ADR 0277, ADR 0348).
0274), a trusted setting's layer (ADR 0277).
A proposal changes nothing by itself; declined, expired or refused, it is discarded.
- **approval mark** — a tool's or verb's declaration in its manifest (`needs-approval`) that each call to it runs
only on the operator's warrant for that one call, with its exact arguments; the tool runner that serves it, or
@@ -633,7 +563,7 @@ asking, never the act. **Decided by** ADR 0152, 0175, 0234, 0259, 0272.
build seat's holder, whose seat name `node-build-agent` is an identifier to rename.
- **instruction section** — one named section of the managed instruction file, which every agent session on the
nodes it is for reads first, as the mesh's word: set at the controller's terminal in the agent module's
config, or **proposed** by an agent and made active on each node only by the operator's warrant, which that node
settings, or **proposed** by an agent and made active on each node only by the operator's warrant, which that node
proves itself (ADR 0274). A hand-over between sessions is one.
- **personal rule** — one short text in the operator's own words about how the operator wants their agent
to work with them, registered for the operator (the **operator scope** of the agent module) and rendered
@@ -648,10 +578,10 @@ asking, never the act. **Decided by** ADR 0152, 0175, 0234, 0259, 0272.
## Media — what a person watches, listens to and reads
**Purpose.** To find, fetch and file copies of the works a person watches, listens to and reads, each in
the library its kind names. **Recorded by** the `media-importer` module's config values and its memory of what
the library its kind names. **Recorded by** the `media-importer` module's settings and its memory of what
it was told, and the servarr apps' own libraries. **Upstream of** nothing. **Decided by** ADR 0295, 0296,
0302.
**Uses:** module, seat, config value (Config).
**Uses:** module, seat, setting (Module).
- **content** — a work a person watches, listens to or reads: a film, an album and its tracks, an
episode, a book, a session of a sport event. It is known by an identity from a catalogue outside the
@@ -662,7 +592,7 @@ it was told, and the servarr apps' own libraries. **Upstream of** nothing. **Dec
- **media release** — one copy of a work an engine can fetch, such as an NZB or a video. Downloaded, it
sits in the downloads folder, not yet filed. ADR 0302 says *release*.
- **library** — one folder of one kind, filed by one importer: the media-importer's, named in its
config, or a servarr app's. Several libraries may hold one kind, as TV Shows and Anime both hold
settings, or a servarr app's. Several libraries may hold one kind, as TV Shows and Anime both hold
series.
- **media file** — a file on disk together with its metadata: its kind, the fields that identify the
work, and what part of the work the file is. It is what the media-importer takes.
@@ -782,10 +712,6 @@ renaming one sense, the old sense moves to a *Not:* line and becomes mechanical.
| | a question someone must answer | **issue** | The record |
| deploy | the per-node part of a delivery plan | **deploy plan** | Change and delivery |
| | a wrapped program's own deploy | its own word | — |
| managed | a placed file of which only named keys or a marked block are the mesh's | **managed** (`owner-at-runtime`) | Provisioning |
| | a file the mesh writes, such as the agent's instruction file or `managed_settings` | the file's own name, or *a file the mesh places* | — |
| trusted | a config value that decides what runs or who can reach what | **trusted** config value | Config |
| | a sender on the operator's own list | **trusted** sender, its message an **operator message** | Operator and conversation |
## How this page is kept
+1 -26
View File
@@ -1,10 +1,9 @@
---
status: canonical
updated: 2026-10-16
updated: 2026-10-11
derives: the constitution page
decisions:
- "ADR 0020"
- "ADR 0391"
---
# How we build
@@ -173,30 +172,6 @@ quietly stop being true, and nobody will learn that from a document.
Not test-driven development as a blanket rule — a test written first against undiscovered
behaviour asserts a guess. The obligation is that every decision has a defender.
### Tests run at the lowest level that proves them, within a time budget
Three levels, by how much real system a test uses (ADR 0391):
| Level | Uses | Budget | Runs |
|---|---|---|---|
| **Unit** | one piece of logic alone: no database, network, bus, running service or other process | well under a second per test | locally, the tests of what changed, while working; and in the forge's checks |
| **Integration** | the real thing beside it: a database, the bus, a catalogue tree | the repository's whole suite in seconds, never over sixty | only in the forge's checks, once per push |
| **End to end** | the whole mesh, or a lab mesh, from the outside | — | only when the operator asks |
- **Test each behaviour at the lowest level that can prove it.** A defect found higher up gets a test at the
lowest level that reproduces it, before its fix.
- **A test that needs longer than a second, or a database, the network or a service, is not a unit test.**
- **A suite over sixty seconds is a defect with its own issue**: it is made faster or split, not accepted.
- **Never run a merge check, a throwaway database or an integration suite locally.** The forge's checks do,
on the builder.
- **A report names its tests and how long they took**, so a test over its budget is seen when it is added.
### Tests within a time budget — how it was earned
On 2026-10-16 a feature's fixing agents ran the catalogue's whole merge check (about ten minutes), a
throwaway database and a locally built gate during local development. Each round cost tens of minutes and
caught neither real failure; the forge's checks found both.
### A report is read from the system, never from what asked for it
The same rule as the two above, pointed at reporting rather than at verification. **Anything
+6 -33
View File
@@ -30,15 +30,6 @@ An idea arrives in one of two forms, and the first step differs:
2. **Ask the operator to set it up.** A few questions, one at a time, each answerable with a choice and
carrying a recommendation: what comes first, what is out of scope, which options must be tried, what
done looks like. Three to five questions is usual; the answers are the effort's first findings.
- **Check every option against the mesh's own rules before offering it.** An option that breaks one
(the core values in [`mission.md`](../mission.md), among them *the mesh owns the truth* and
*sovereignty: external dependencies are deliberate and few*; the rules in
[`how-we-build.md`](../how-we-build.md); and everything between modules over the bus, research 036) is
dropped, or offered only with the rule it breaks named. A recommendation the operator has to argue back
costs a version.
- **Explain each question with a concrete picture** in the operator's words: what they would see, do or
lose under each option. No internal names (a record number, a verb, a word the glossary lacks) without
what it is beside it.
3. **Take a number.** `knowledge-base.reserve` with `kind: research` and `for`: the effort's title. The number
is spent whether or not the effort is ever proposed; one never proposed is withdrawn after a week. Never
pick one by hand.
@@ -57,25 +48,10 @@ An idea arrives in one of two forms, and the first step differs:
lists them and gives the difference between two. Until issue 844 is delivered, the knowledge base
takes a new version of an accepted, active effort only as a progressive insight: give `insight`, saying
what the effort held before the new finding, and mark the finding in the text with its date.
- **Propose a version per settled set, not per answer.** While the operator answers a run of questions,
or while experiments run, keep the answers and findings in the session's save point and propose once
when the set is settled. Each version is reviewed and resent whole, so a version per answer multiplies
the reviews.
- **Pre-check before proposing**, against what the review sends back most: every record, issue or design
the text names is in `links`; work put off names the issue that tracks it (an acceptance test is not
put-off work: it is what the build proves, step 6); each figure is given as measured (a range, not a
rounded claim); no word on a glossary *Not:* line.
- **Try at the cheapest level that answers the question.** A program's own behaviour (a library, a
server, a protocol) is tried in process, on the machine's loopback, in minutes. Lab runs (about 12 to
16 minutes fresh) are for the mesh's own code; before that code exists, a lab run tests nothing an
in-process test does not, and its lab scenario is written as the build's acceptance test instead.
6. **Settle the direction with the operator.** When the questions are answered, write `05-direction.md`:
the proposed decisions in a few lines each, the options rejected and why, and the build's acceptance
tests: what the build must prove before it is done, carried by its milestones (playbook
[04](04-build-handoff.md)). Nothing else is left open: each question closes by a test, by a decision the
effort records with its reason (a small design limit is the lead's), or by the operator. Ask the
operator to confirm or change the direction, one point at a time, then propose it once. Then the effort
graduates through playbook [02](02-graduation.md).
the proposed decisions in a few lines each, the options rejected and why, what is left open. Ask the
operator to confirm or change it, one point at a time. Then the effort graduates through playbook
[02](02-graduation.md).
## Bounds and models
@@ -124,9 +100,6 @@ and why, is the more expensive half to rediscover.
The rules on an effort are the knowledge base's: `propose` refuses one that breaks a rule that judges one
record (the module's table test holds one case per rule), and the rules that judge the whole record set run
after every acceptance and raise a condition when one fails. The habits of steps 2, 5 and 6 (options checked
against the rules, one version per settled set, the cheapest level, nothing left open) are the lead's, read by
the reviewer; of the pre-check, `propose` refuses a link to nothing and a retired word, and the review returns
a record named but not linked, an untracked deferral and a figure not as measured. That this repository holds
no effort is `records.py`'s `no-records` check, on every pull request. An active effort with no new version
for seven days is the smell of research left behind: its lead closes or continues it.
after every acceptance and raise a condition when one fails. That this repository holds no effort is
`records.py`'s `no-records` check, on every pull request. An active effort with no new version for seven
days is the smell of research left behind: its lead closes or continues it.
+1 -15
View File
@@ -23,16 +23,6 @@ about an hour, and said to the operator if it runs past.
say which, in writing, before proceeding.
2. **Record the decisions** (below, *Writing a decision record*): one record per choice that could be
reversed on its own, not one record for the whole effort.
- **Write them together, not one after another.** Reserve every number first, then propose each record
as soon as it is written, without waiting for the review of the one before; the reviews run side by
side, and the operator's asks for the records that need them arrive together. A record that
`rests-on` or `extends` a sibling is proposed once that sibling is accepted.
- **Take the clauses from the confirmed direction** and cite the effort (`cites`, `"research NNN"`) for
the evidence instead of retyping its findings: a record's Context holds the few facts its decision
rests on, with the effort named for the rest.
- **Pre-check each record before proposing it**, as for research (playbook [01](01-research.md), step
5): every record, issue or design it names is in `links`; each deferral names its issue; each figure
is given as measured; no word on a glossary *Not:* line.
3. **Write the design.** Create the document under `03-DESIGN/01-to-be/` with frontmatter:
```yaml
@@ -46,8 +36,6 @@ about an hour, and said to the operator if it runs past.
---
```
The design lists the direction's acceptance tests: what the build proves before it is done.
4. **Hand it to the work breakdown.** The design goes on through playbook [04](04-build-handoff.md):
milestones, issues, and each milestone built as one feature step (playbook [07](07-feature-branches.md)).
5. **Close the effort.** `knowledge-base.propose` the effort again, whole, with `status: graduated` and a
@@ -153,6 +141,4 @@ record (its module's table test holds one case per rule), and the four rules tha
changes, an accepted record extending a superseded one) run after every acceptance and raise a condition
when one fails. In this repository, `records.py` checks that a design's `decisions:` entries and every
"ADR NNNN" in the text are well formed, and that no record is written here; `index.py` checks the reading
order's six topics, which the knowledge base reads. The three habits of graduating step 2 (side by side, clauses
from the direction, the pre-check) are the lead's, read by the reviewer; `propose` refuses a link to nothing,
a deferral no issue tracks and a retired word, and the review returns a record named but not linked.
order's six topics, which the knowledge base reads.
+6 -7
View File
@@ -28,11 +28,10 @@ A design becomes **milestones**, and each milestone becomes **issues**:
there; if it is not, write it before changing it. Building against an undocumented as-is is how a shipped
behaviour gets lost.
4. **Break it into milestones.** Write them into the design, in a section *Milestones*: for each, its number,
its one-sentence outcome, the acceptance tests of the design it proves, the repositories it touches, and
what it depends on. Order them so each is usable as soon as it is delivered, the smallest useful one
first.
5. **Ask the operator to confirm the milestones**, in a short table: number, outcome, the acceptance tests it
proves, repositories, the parts each repository builds. Change what they change.
its one-sentence outcome, the repositories it touches, and what it depends on. Order them so each is
usable as soon as it is delivered, the smallest useful one first.
5. **Ask the operator to confirm the milestones**, in a short table: number, outcome, repositories, the
parts each repository builds. Change what they change.
6. **Open the issues.** For each confirmed milestone, `issue-tracker.open` one issue per repository part, its
title the symptom or capability in plain words, its report naming the design, the milestone and the
decisions it builds with; link the order with `depends-on`. Write the issue numbers into the milestone's
@@ -62,5 +61,5 @@ Read by the lead and the reviewer today; a check in hq's merge-check is tracked
issues; an in-progress design without one is the smell of building without a breakdown.
- Every issue a milestone names exists in the tracker (`issue-tracker.get`), and an issue in `fixing` names
its milestone in its report.
- A milestone whose issues are all `resolved` has had its delivery plan done; its outcome sentence and
acceptance tests are proven on the mesh before the next milestone starts.
- A milestone whose issues are all `resolved` has had its delivery plan done; its outcome sentence is proven on
the mesh before the next milestone starts.
+2 -4
View File
@@ -61,8 +61,7 @@ never into the running one, unless it blocks the running one.
hold, and the patterns to copy (file:line);
- what not to touch, and what lands beside it in other repositories;
- the local facts: the worktree, the branch, the check commands, a temporary directory for tests outside
the home (`TMPDIR`), and the unit tests to run (never a database server: tests that need one are
integration tests, which the forge's checks run).
the home (`TMPDIR`), a throwaway database server if the store tests need one.
When the reading is large, a read-only agent on the smaller model answers the lead's exact questions with
file:line, and the lead writes the file from its answers.
5. **Move the issues to `fixing`**, `by` naming the feature's agent for that repository.
@@ -73,8 +72,7 @@ never into the running one, unless it blocks the running one.
issues one after another, committing each locally with a message naming the issue ("Keep the assignments
on the bus (issue 652)"). It is not replaced per issue: the lead continues the same agent (by its id) with
the next instruction, so its context is paid for once.
- **Unit tests only, of what changed, each well under a second** (how-we-build §5, ADR 0391). Each issue's
first test fails before its change and passes after; `gofmt`, `go vet`
- **Unit tests only.** Each issue's first test fails before its change and passes after; `gofmt`, `go vet`
and the repository's unit tests stay green. The integration tests (`merge-check.sh` with the store and the
bus) wait for phase 3.
- **Nothing is pushed** and no pull request is opened in this phase. Never land on a red check: run the
+6 -3
View File
@@ -26,15 +26,18 @@ one delivery**. Everything before the push is local and fast.
need a decision or a second repository stops here and becomes a feature.
2. **Move the issue to `fixing`** with `by` as who@node.
3. **Build on a local branch** `fix/<issue>-<slug>`, in a worktree of its own branched from `main`. Write the
test that fails today first; make the change; keep `gofmt`, `go vet` and the unit tests of what changed green
(each well under a second; never a merge check or a database locally: how-we-build §5, ADR 0391).
test that fails today first; make the change; keep `gofmt`, `go vet` and the repository's unit tests green.
Commit, naming the issue. For a playbook or design edit, run the repository's own checks (in hq,
`sh merge-check.sh`).
4. **One review of the local commit, before anything is pushed** (a reviewer that did not write it, larger
model; at most 3 rounds, as playbook 07; from round 2 only what is wrong). The reviewer's findings go back to the same agent that wrote the fix, continued by
its id, so the fix keeps its context. A playbook or design edit of a few lines may skip the reviewer: the
operator's word on the pull request is its review.
5. **Push once and open the pull request.** The forge's merge checks run the integration tests. A failed check
5. **Push the branch, try it, then open the pull request.** `mesh-controller.try` with the repository and the
branch runs the merge check in the check's own toolchain before any status is set; open the pull request
only once it passes. A local run never stands in for it: the check's containers carry other tools than the
nodes (a test that called util-linux `flock -E` passed on a node and failed on BusyBox's in the check). The
forge's merge checks run the integration tests. A failed check
goes back to the same agent with the failure, and the reviewer reads only the change it makes.
6. **Mark it ready** (`mesh/ready` and `ready at <full sha>`) once the operator's word is given; mesh-delivery
merges it when its checks pass.
@@ -2,9 +2,8 @@
layer: to-be
status: in-progress
code: [mesh-controller, mesh-catalog modules/mesh-delivery]
updated: 2026-10-16
updated: 2026-10-13
decisions:
- "ADR 0382"
- "ADR 0350"
- "ADR 0335"
- "ADR 0323"
@@ -372,12 +371,6 @@ only once it is built.
group's members puts the composed check out of date: the group reads `checking` with the reason, and the
composed check runs again once a member is judged again. Checked by mesh-delivery's
`TestAGroupsComposedCheckGoesOutOfDateOnAMergeThatIsNotItsMember` and `TestARebasedMemberIsComposedAgainNotHeld`.
- **Each member's own check reads its siblings** (ADR 0382): the group's other open members into a base of
the same name are read beside a member's own check at their head merged onto their base, and a mesh-controller
sibling's merge judges it, so changes that are only consistent together pass their own checks. The controller
learns the siblings from mesh-delivery's `groups`; the verdict names each one. A sibling's new head, close or
base move puts that verdict out of date, and the merge tool merges such a member only when
`mesh/delivery-group` passed at the heads read and every sibling head read is reviewed.
- **Delivering**: in order. A member waits in `published` until the one before is `delivered` or `covered`.
A member published while its group's composed check is asked and not answered waits there for the answer;
one held because that check had not passed is *lifted* back to `published` once it passes or warns for the
-6
View File
@@ -1,6 +0,0 @@
# Release 57: config and provisioning
This branch carries the work of design 57 (ADR 0348, ADR 0349) in this repository. Each package
merges here through its own reviewed pull request; the branch reaches main as one pull request, in one
delivery group with the branch of the same name in mesh-controller, mesh-host, mesh-sdk, mesh-catalog
and hq, after a rehearsal in the lab. This file is deleted by the last commit before that pull request.