Compare commits

..
Author SHA1 Message Date
jschoubben 6dcfa2226e Merge pull request 'Playbooks 01 and 02: place research in the domains; its words reach the glossary at graduation' (#382) from playbooks/01-place-it-in-the-domains into main
Reviewed-on: #382
2026-10-16 12:24:26 +00:00
jschoubben 1ddc2f5cbf Merge pull request 'Design 41: every file on a node is managed through node-files (WP9, ADR 0394)' (#380) from design/41-node-files into main
Reviewed-on: #380
2026-10-16 12:24:18 +00:00
jschoubben 06998cc8d9 Merge pull request 'Playbooks 07 and 08: the five rules from the delivery-time audit' (#375) from playbooks/07-08-time-sinks into main
Reviewed-on: #375
2026-10-16 12:24:07 +00:00
jschoubben 300be92814 Design 41 WP9: readlink and the account and group lookup are node-files verbs too (ADR 0394 §1; review)
mesh/merge-gate head 300be928144e merged into trunk b9af4e373dc0 — pass: the change touches no module of the mesh's graph
mesh/repo-check head 300be928144e merged into trunk b9af4e373dc0 — pass: its merge-check.sh passed
mesh/delivery delivered
2026-10-16 13:31:45 +02:00
jschoubben 427fe4c9c5 Playbooks 01 and 02: place research in the domains before its direction, and carry its words into the glossary at graduation (ADR 0244)
mesh/merge-gate head 427fe4c9c58b merged into trunk b9af4e373dc0 — pass: the change touches no module of the mesh's graph
mesh/repo-check head 427fe4c9c58b merged into trunk b9af4e373dc0 — pass: its merge-check.sh passed
mesh/delivery delivered
The operator, 2026-10-16: research defines the modules a feature lands in and the domain extensions and
reductions that come with it.
2026-10-16 12:38:59 +02:00
jschoubben 1efa37957d Playbooks 07 and 08: is the coast clear? Hold a push while a release branch in flight shares its files; the glossary's release branch
mesh/merge-gate head 1efa37957db2 merged into trunk b9af4e373dc0 siblings unknown — pass: the change touches no module of the mesh's graph
mesh/repo-check head 1efa37957db2 merged into trunk b9af4e373dc0 siblings unknown — pass: its merge-check.sh passed
mesh/delivery delivered
The operator, 2026-10-16: the file module waited for feature 57's release branch, which changes four of the
same controller files.
2026-10-16 11:28:32 +02:00
jschoubben 26073f30b0 Design 41: node-reads goes in the delivery after node-files is held on every node (ADR 0394 §9)
mesh/merge-gate head 26073f30b0de merged into trunk b9af4e373dc0 — pass: the change touches no module of the mesh's graph
mesh/repo-check head 26073f30b0de merged into trunk b9af4e373dc0 — pass: its merge-check.sh passed
mesh/delivery superseded: a newer head of the same pull request
2026-10-16 11:14:01 +02:00
jschoubben 1f5a12e07e Design 41: WP8's node-reads is replaced by WP9's node-files (ADR 0394 supersedes ADR 0310)
mesh/merge-gate head 1f5a12e07e42 merged into trunk b9af4e373dc0 — pass: the change touches no module of the mesh's graph
mesh/repo-check head 1f5a12e07e42 merged into trunk b9af4e373dc0 — pass: its merge-check.sh passed
mesh/delivery superseded: a newer head of the same pull request
2026-10-16 11:11:53 +02:00
jschoubben 7ac5194bcb Design 41 WP9: mesh-files runs as the operator account with sudo where needed, and replaces node-reads (ADR 0394)
mesh/merge-gate head 7ac5194bcbdc merged into trunk b9af4e373dc0 — pass: the change touches no module of the mesh's graph
mesh/repo-check head 7ac5194bcbdc merged into trunk b9af4e373dc0 — pass: its merge-check.sh passed
mesh/delivery superseded: a newer head of the same pull request
2026-10-16 11:06:32 +02:00
jschoubben 330d341618 Design 41 WP9: node-files is held by a module of its own, mesh-files, beside mesh-reads
mesh/merge-gate waiting in the build queue since 11:01
mesh/delivery superseded: a newer head of the same pull request
2026-10-16 11:01:43 +02:00
jschoubben cf56649845 Design 41: every file on a node is managed through node-files (WP9, ADR 0394, issue 900)
mesh/merge-gate waiting in the build queue since 11:01
mesh/delivery superseded: a newer head of the same pull request
2026-10-16 11:00:46 +02:00
mesh-tools b9af4e373d Merge pull request 'Feature 57 (config and provisioning): release hq's record' (#378) from release/57-config-and-provisioning into main 2026-10-16 08:41:58 +00:00
mesh-tools e7417cf124 Feature 57 (config and provisioning): release hq's record (glossary words, release notes) on top of main
mesh/merge-gate head e7417cf1248c merged into trunk c22b58143b74 beside mesh-host#116@bff1ac14 — pass: the change touches no module of the mesh's graph
mesh/repo-check head e7417cf1248c merged into trunk c22b58143b74 beside mesh-host#116@bff1ac14 — pass: its merge-check.sh passed
mesh/delivery delivered
mesh/delivery-group group release/57-config-and-provisioning delivered: every member is delivered
2026-10-16 08:24:14 +00:00
jschoubben 47f7321c05 Playbooks 07 and 08: integration tests only in the merge check, no try before it, no lab and no end-to-end tests yet (the operator, 2026-10-16)
mesh/merge-gate out of date: judged against trunk c22b58143b74, the trunk is now b9af4e373dc0; judged again on a recheck or when it is merged
mesh/repo-check out of date: judged against trunk c22b58143b74, the trunk is now b9af4e373dc0; judged again on a recheck or when it is merged
mesh/delivery superseded: a newer head of the same pull request
2026-10-16 10:15:31 +02:00
jschoubben f95043e379 Playbooks 07 and 08: a module's acceptance is an integration test the forge runs, and try runs on the builder (ADR 0391)
mesh/merge-gate head f95043e3797e merged into trunk c22b58143b74 — pass: the change touches no module of the mesh's graph
mesh/repo-check head f95043e3797e merged into trunk c22b58143b74 — pass: its merge-check.sh passed
mesh/delivery superseded: a newer head of the same pull request
2026-10-16 10:14:42 +02:00
jschoubben cb98a08384 Playbooks 07 and 08: prove a module whole on a throwaway bus and store, not in the lab while its runs are too slow (the operator, 2026-10-16) 2026-10-16 10:14:25 +02:00
jschoubben 4e822c56a0 Playbooks 07 and 08: checks for every new rule, the ready mark's bound in both, the lead marks an unreviewed edit (review round 1) 2026-10-16 10:14:25 +02:00
jschoubben c5fa1de264 Playbooks 07 and 08: review asks only what makes a change wrong, try before opening, mark ready on approval, prove a module whole first, hand back stopped issues
From the delivery-time audit of 2026-10-16: seven review rounds on issue 704, a feature branch's first
check failing on 29 problems, mesh-catalog #300 waiting 12 h unmarked, the mail modules failing live,
98 issues held in fixing.
2026-10-16 10:14:25 +02:00
jschoubben ea359ea4e6 Try a small fix's branch before its pull request, since local runs miss the check's toolchain (playbook 08) 2026-10-16 10:14:25 +02:00
mesh-tools c22b58143b Merge pull request 'Test levels and time budgets in how-we-build and playbooks 07 and 08 (issue 891, ADR 0391)' (#374) from fix/891-test-levels-and-budgets into main 2026-10-16 08:13:26 +00:00
mesh-tools d9dd8a63d8 Say ADR 0391's test levels and time budgets in how-we-build and playbooks 07 and 08 (issue 891)
mesh/merge-gate head d9dd8a63d83b merged into trunk 08d6476e5287 — pass: the change touches no module of the mesh's graph
mesh/repo-check head d9dd8a63d83b merged into trunk 08d6476e5287 — pass: its merge-check.sh passed
mesh/delivery delivered
2026-10-16 08:09:33 +00:00
mesh-tools 08d6476e52 Merge pull request 'Playbooks 01, 02 and 04: settle decisions before versions, test at the cheapest level, acceptance tests through to milestones' (#371) from playbooks/01-settle-before-versions into main 2026-10-16 00:15:00 +00:00
jschoubben 80b647a2ed Name the acceptance tests in the milestone table and say what the review returns (review round 2)
mesh/merge-gate head 80b647a2ed66 merged into trunk f8c0676b3a1d — pass: the change touches no module of the mesh's graph
mesh/repo-check head 80b647a2ed66 merged into trunk f8c0676b3a1d — pass: its merge-check.sh passed
mesh/delivery delivered
2026-10-16 02:12:17 +02:00
jschoubben a4c5ef69bb Give the build's acceptance tests a home in the design and milestones, and answer review round 1
The research playbook named acceptance tests the milestones carry, which
playbooks 02 and 04 did not know; its pre-check also disagreed with the
knowledge base's deferral rule.
2026-10-16 02:11:27 +02:00
jschoubben ada703e790 Write a graduation's records side by side, from the confirmed direction (playbook 02)
Proposing records one after another serialises their reviews and the
operator's asks; retyping the effort's findings into each record makes them
long and gives the review more to send back.
2026-10-16 02:09:57 +02:00
jschoubben 2a61c57258 Settle research decisions before proposing versions, and test on the cheapest bed (playbook 01)
Research 053's identity part took six versions and about two hours: options
that broke the mesh's own rules were offered and argued back, a version was
proposed after every answer, and reviews returned findings a pre-check
would have caught. A lab run was planned where an in-process test answered.
2026-10-16 02:09:22 +02:00
mesh-tools f8c0676b3a Merge pull request 'Cite ADR 0382 in the delivery design (issue 867)' (#370) from fix/867-group-siblings into main 2026-10-15 23:52:50 +00:00
mesh-toolsandClaude e4a55051cc Cite ADR 0382 in the delivery design: a group's member is checked beside its siblings (issue 867)
mesh/merge-gate head e4a55051cc3b merged into trunk 9bfd57174fab — pass: the change touches no module of the mesh's graph
mesh/repo-check head e4a55051cc3b merged into trunk 9bfd57174fab — pass: its merge-check.sh passed
mesh/delivery delivered
mesh/delivery-group group fix/867-group-siblings delivered: every member is delivered
Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-15 23:27:14 +00: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
6 changed files with 154 additions and 18 deletions
+4
View File
@@ -434,6 +434,9 @@ planner, the rollout). **Downstream of** Module, Core, Health and repair and Dat
- **delivery group** — two or more deliveries sharing a pull request head branch name across the mesh's
repositories, delivered as one unit in an order declared (`after:`) or inferred by the planner. One
level: a group holds deliveries, never groups. Its state is derived from its members, never set.
- **release branch** — a branch other than `main`, shared by name across repositories, that collects a feature's
merged work and is brought into `main` as one delivery (design 57's `feat/57-config-and-provisioning`). While it
is in flight, a change that touches its files waits for it (playbook 07, *Is the coast clear?*).
- **delivery plan** — what a delivery does to the mesh: its **build plan** (the modules it moves and
their dependents, in tiers), its **deploy plan** (per node, what it receives and what waits for a
person) and its verdict (the composed nodes, the replays). Computed by the controller's planner from a
@@ -752,6 +755,7 @@ renaming one sense, the old sense moves to a *Not:* line and becomes mechanical.
| release | a person letting a held delivery go on | **release** | Change and delivery |
| | taking a consumer off a licence | **unbind** (verb `release`, to rename) | Identity and access |
| | a copy of a work an engine can fetch | **media release** | Media |
| | a branch brought into `main` as one delivery | **release branch** | Change and delivery |
| gate | the judgement on a delivery's first node | **first-node gate** | Change and delivery |
| | the pull request status | **merge gate** | Change and delivery |
| | a failed step stopping its module's later steps (ADR 0136) | *a failed step holds its module* | Placement |
+12 -4
View File
@@ -63,13 +63,20 @@ An idea arrives in one of two forms, and the first step differs:
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
put-off work: it is what the build proves, step 7); 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`:
6. **Place it in the domains.** Before the direction, write `03-domains.md`: the domain or domains the idea
belongs to (the glossary's sections, ADR 0244); the modules and seats it lands in, each new, changed or
retired; what it does to each domain's words, each word added (with its domain and a one-line meaning),
changed or retired, and none on a *Not:* line or already meaning something else (the glossary's homonyms);
and whether a domain grows or shrinks, a concept moving between domains included. The direction names its
decisions in those words. Asked when the idea is set up, too: an option that lands a concept in the wrong
domain is offered with that cost named, like one that breaks a rule.
7. **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
@@ -84,7 +91,8 @@ An idea arrives in one of two forms, and the first step differs:
| reading and the setup questions (1, 2) | 30 minutes | the session's own, larger |
| proposing (3, 4) | 15 minutes | larger |
| each experiment or reading task (5) | 30 minutes | smaller, one agent at a time unless the operator allows more |
| the direction (6) | 30 minutes | larger |
| placing it in the domains (6) | 15 minutes | larger |
| the direction (7) | 30 minutes | larger |
A step past its bound is said to the operator at once, with what is being done about it. The lead reports
as playbook 07 does: every ten minutes and at once when something is found, stops or needs the operator,
@@ -124,7 +132,7 @@ 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
after every acceptance and raise a condition when one fails. The habits of steps 2, 5, 6 and 7 (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
+6 -1
View File
@@ -13,7 +13,7 @@ clauses in force for a topic or a record).
## Graduating research
The effort's `05-direction.md`, confirmed by the operator (playbook [01](01-research.md), step 6), is what
The effort's `05-direction.md`, confirmed by the operator (playbook [01](01-research.md), step 7), is what
graduates. The lead writes the records and the design on the larger model; it is one sitting, bounded at
about an hour, and said to the operator if it runs past.
@@ -48,6 +48,11 @@ 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.
The words of the effort's `03-domains.md` go into the glossary in the same change, each in its domain: a
word added gets its entry, a word whose meaning changed gets its entry rewritten, and a retired word moves to
its replacement's *Not:* line. A word that already means something else in another domain is named as a
homonym with the qualified form each domain uses.
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
+68 -7
View File
@@ -21,6 +21,16 @@ A small fix (one repository, one issue, about an hour of work) follows
undelivered for a day: an issue done at 21:09 was still not on the machines at 15:00 the next day.
- **Work that waits and nobody notices.** Most lost time was not work at all, but a check, a delivery plan
or an agent waiting on something that had stopped, unseen.
- **Review that keeps hardening.** One fix went through seven review rounds in five and a half hours, each
asking for more hardening than its issue asked (issue 704, 2026-10-14). A round is for what makes the
change wrong; everything else is an issue of its own.
- **The first check after the whole branch is written.** A feature's catalogue branch, pushed once after
hours of local work, met its first check on 2026-10-16 and failed on 29 problems, TypeScript errors among
them, that a unit suite run continuously while working finds at once.
- **A green pull request nobody marks.** An approved, green pull request that was not marked ready waited
12 h 17 min for someone to merge it (mesh-catalog #300, 2026-10-14).
- **A module proven only after it reached the machines.** The mail modules were delivered with unit tests
only, then failed live three times (issues 859, 865, 868) and took five more hours of fixes.
## The shape
@@ -104,13 +114,40 @@ never into the running one, unless it blocks the running one.
It says which round it is in ("round 1 of at most 3").
3. **The report goes to the same fixing agents** that wrote the code, continued by their ids, so they fix
with the context they already hold. Each answers the reviewer: what it changed, per finding, or why not.
4. **The reviewer reads the answers and the new commits**, and approves or reports again. From round 2 it
asks changes only for a finding that makes the feature wrong; smaller points become issues of their own.
After round 3 the lead stops and brings the operator what is left, with a recommendation.
4. **The reviewer reads the answers and the new commits**, and approves or reports again (step 5 says what a round
may ask). After round 3 the lead stops and brings the operator what is left, with a recommendation.
5. **A finding outside the issues' done-when is never a change asked, in any round.** More hardening, a
further case, a nicer form: the reviewer opens it with `issue-tracker.open` and names the number in its
report, and the round does not wait for it. What a round asks is only what makes the change wrong against
its issues and its decisions.
## Is the coast clear?
Before the push of phase 3 (and of a small fix, playbook [08](08-small-fixes.md) step 5), the lead checks, for every
repository the change touches, whether a **release branch** is in flight there: a branch other than `main` that
collects a feature's merged work to bring it into `main` as one delivery.
1. **Look for one.** A pull request into `main` whose head is a release branch (`gitea.gitea_open_pulls`), a
release branch holding merged work that `main` does not have yet (`git log origin/main..origin/<branch>`), or
a delivery plan of that release branch still running (`mesh-controller.plans`).
2. **Compare the files.** `git diff --name-only origin/main...origin/<release branch>` against the files the
change touches.
3. **Overlap: hold.** If the release branch touches a file the change touches, nothing is pushed into that repository
until the release branch's delivery plan is done. Then the feature branch is brought up to the new `main`, the unit
tests run again, and the push follows. The hold is on the wait list (its bound: the release branch's delivery plan),
and is said to the operator with what the change waits for.
4. **No overlap: go on.** A release branch in another repository, or one that shares no file with the change, does not
hold it; its merge joins the merge window as any other (ADR 0276).
Merging beside a release branch still in flight would make its lead resolve someone else's conflicts in the
middle of it, and could send part of the change with its delivery (2026-10-16: the file module's
controller part touched four files feature 57's release branch also changed).
## Phase 3 — Check (no review)
1. **Push every feature branch and open one pull request per repository, together.** Pull requests in two or
1. **Push every feature branch and open one pull request per repository, together, once the coast is clear**
(above). The integration tests
run only in the merge check (the operator, 2026-10-16), never before. Pull requests in two or
more repositories that share the branch name are one delivery group (ADR 0239 §2).
Where a session pushes through the forge tool `gitea_commit` (one commit on the forge's current base), the
reviewer first confirms that commit's tree equals the reviewed one.
@@ -118,8 +155,14 @@ never into the running one, unless it blocks the running one.
second review: phase 2 reviewed this tree.
3. **A check that fails** goes back to the reviewer with the failure, for **one more cycle** of phase 2 with
the same fixing agents; then push once again.
4. **Mark each pull request ready** (`mesh/ready` and a comment `ready at <full sha>`) once the operator's word
for the feature is given; mesh-delivery merges it when its checks pass (ADR 0364).
4. **The step's acceptance is proven before it is marked ready.** A step that adds or changes a module
carries an integration test that starts the module whole, its process against the real bus and store, and
shows the step's acceptance sentence; the forge's checks run it (ADR 0391 §1, §6). Unit tests alone are not
that proof; the mesh has no end-to-end tests yet, and the lab is not used (the operator, 2026-10-16).
5. **The reviewer marks each pull request ready as soon as the acceptance is shown** (`mesh/ready` and a
comment `ready at <full sha>`, the head it approved); mesh-delivery merges it when its checks pass
(ADR 0364). The operator's word is waited for only when the step changes what the operator sees, removes
data, or needs a step only the operator's terminal can take; the lead says which before the step starts.
**One exception: a catalogue change that uses a new manifest word.** The catalogue's merge check reads
manifests with the controller the mesh runs, so the controller's pull request is merged and delivered first;
@@ -127,7 +170,8 @@ then `mesh-delivery.recheck` the catalogue's and merge it on the new verdict. Pl
## Phase 4 — Deliver
The merge starts the delivery plan: build, publish, send. The lead follows it to done
The merge starts the delivery plan: build, publish, send. A merge into a branch other than `main` is not a
delivery: no machine receives it (issue 889 while it still starts one). The lead follows it to done
(`mesh-controller.plans` with `wait` and `until: done`), then resolves the feature's issues with `fixed-by`
naming its pull requests, and removes what is left: no `feat/<slug>` branch and no `.work/<slug>` worktree
survive.
@@ -156,6 +200,8 @@ on, with when it started and its bound.
| a fixing agent's issue | 30 minutes | ask it where it stands; split or take over |
| the review | 15 minutes a round | ask the reviewer; stop at round 3 |
| a merge check | 15 minutes | read the build queue (`mesh-controller.queue`) and the check's log |
| the ready mark | 15 minutes after the acceptance is shown | the reviewer marks it, or the lead does |
| a release branch in flight that shares files | its delivery plan done | report it every ten minutes; bring the branch up to `main` after |
| a merge after ready | 5 minutes after the checks pass | read `mesh-delivery.show` for the delivery |
| a delivery plan | its class's budget (`mesh-delivery.times`), at most 30 minutes | read `mesh-controller.plans`, then `mesh-delivery.stalled` |
@@ -200,6 +246,13 @@ lead prepares a `/clear` as the mesh's instruction "prepare before clear" says:
feature's phase, its branches and heads, the context files' paths, the agents' ids, the wait list and the
next action; then the prompt the operator pastes. The context files make the feature resumable after a clear.
## Issues that stop
An issue stays in `fixing` only while an agent works on it. A step that stops, for a wait past its bound, a
hand-over, or the session's end, moves each of its issues not delivered back to `open` with
`issue-tracker.move` and a note saying how far it got (its branch, its last commit, what is left). A list of
issues in `fixing` that nobody works on reads to the operator as stuck work.
## How it is checked
- A feature's issues show their commits on the feature branch (`git log --grep 'issue <n>'`), and no pull
@@ -209,6 +262,14 @@ next action; then the prompt the operator pastes. The context files make the fea
- After a feature's delivery, `git branch -r | grep feat/<slug>` and `git worktree list` return nothing for it.
- More than one open pull request in a repository that share no feature name, or a feature step whose issues
stay in `fixing` for more than a working day, is the smell: stop and bring it to the operator.
- A review report that asks a change outside the issues' done-when, or a fourth round, is the failure of the
review rules; `issue-tracker.list` with `flag: abandoned` lists issues left in `fixing` with nobody on them.
- A pull request reviewed and green but not marked ready for more than 15 minutes is a lead that did not
mark it.
- A pull request opened into a repository whose release branch was in flight and shared a file with it is the failure of
*Is the coast clear?*; the lead's report names the check it made before the push.
- A step that adds or changes a module marked ready with no integration test that starts the module whole is
the failure of phase 3's fourth step.
- A bed run from `.work/<slug>/mesh-lab` that fails naming a `.work/<slug>/<repo>/…` path it cannot find is a
missing sibling worktree, not a mesh fault.
+22 -5
View File
@@ -31,22 +31,34 @@ one delivery**. Everything before the push is local and fast.
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
model; at most 3 rounds, as playbook 07; from round 2 only what is wrong; a finding outside the issue's
done-when is opened as an issue of its own, never asked as a change). 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
operator's word on the pull request is its review, and the lead marks it ready on that word.
5. **Push once and open the pull request, once the coast is clear** (playbook [07](07-feature-branches.md), *Is
the coast clear?*: no release branch in flight in the repository that shares a file with the fix). The forge's merge
check runs the integration tests, the only
place they run (the operator, 2026-10-16). 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.
6. **The reviewer marks it ready at once** (for an edit that skipped the reviewer, the lead, on the
operator's word) (`mesh/ready` and `ready at <full sha>`, the head it approved);
mesh-delivery merges it when its checks pass. A fix to a module that changes how it runs carries an
integration test starting the module whole against the real bus and store, run by the forge's checks
(ADR 0391 §1, §6); unit tests alone are not that proof, and the lab is not used. The operator's word is waited for only when the fix changes what the operator sees, removes data,
or needs the operator's terminal.
7. **Follow its delivery plan to done** (`mesh-controller.plans` with `wait` and `until: done`), prove the fix on
the mesh (the symptom gone, measured), and resolve the issue with `located-in` and `fixed-by` the same hour.
A fix that stops before its delivery moves its issue back to `open` with a note saying how far it got
(branch, last commit, what is left), as playbook [07](07-feature-branches.md) says.
## Bounds
| Waiting on | Bound | Past the bound |
|---|---|---|
| building the fix | 1 hour | it is a feature: stop and plan it under playbook 07 |
| the review | 15 minutes | ask the reviewer where it stands |
| the ready mark | 15 minutes after the review approved | the reviewer marks it, or the lead does |
| the merge check | 15 minutes | read `mesh-controller.queue` and the check's log |
| the merge after ready | 5 minutes after the checks pass | read `mesh-delivery.show` for the delivery |
| the delivery plan | its class's budget (`mesh-delivery.times`), at most 30 minutes | read `mesh-controller.plans`, then `mesh-delivery.stalled` |
@@ -63,3 +75,8 @@ reading itself and uses one subagent only for the review.
- A small fix has one pull request with one or few commits naming its issue, opened after its review: a pull
request with many heads is a fix reviewed after its push.
- Its issue moves to `resolved` within the hour its delivery plan ends.
- A pull request reviewed and green but unmarked
for more than 15 minutes, a fix to a module's running marked ready with no integration test of the module whole, or a review report
asking a change outside the issue's done-when, is the failure of steps 4 to 6.
- An issue in `fixing` with nobody on it shows in `issue-tracker.list` with `flag: abandoned`; a stopped fix
moves it back to `open` with its note.
@@ -2,8 +2,9 @@
layer: to-be
status: in-progress
code: [mesh-host, mesh-controller, mesh-catalog]
updated: 2026-10-12
updated: 2026-10-16
decisions:
- "ADR 0394"
- "ADR 0310"
- "ADR 0268"
- "ADR 0252"
@@ -90,6 +91,7 @@ WP5 assign and prove (operator-gated) needs WP
WP6 a module puts the account in a group (mesh-host, mesh-controller, mesh-catalog) issue 247
WP7 the control-node withholds execute (mesh-controller, mesh-catalog) ADR 0268
WP8 a node's files and accounts are read (mesh-sdk, mesh-catalog, mesh-controller) ADR 0310, issue 418
WP9 every file on a node is managed (mesh-catalog, mesh-controller) ADR 0394, issue 900
```
WP1, WP2 and WP4 are independent, and are built in parallel on one feature branch per repository
@@ -341,6 +343,10 @@ out, the control-node's value is set to `withhold` and zsh is pushed to it. Then
*`mesh-sdk`, `mesh-catalog`, `mesh-controller`. ADR 0310, extending ADR 0268; tracked by issue 418.*
**Replaced by WP9.** ADR 0394 supersedes ADR 0310: `node-files` takes over every read below, with the same
bounds, content rule and refusal of secret places; once `node-files` is held on every node, the next delivery
removes `node-reads` and `mesh-reads`.
ADR 0268 §5 has narrow read tools take the common reads over from `execute`, so that an approval is asked for an
act and not for a read, and ADR 0286 §44 sets the approval mark on `execute` only once those reads have a tool on
every node. Two had none: reading or searching a file, and looking up an account or a group.
@@ -366,3 +372,38 @@ under the same issue.
`mesh-sdk` test of the content rule and one in each of its users; `mesh_search` for `cat`, `grep` and
`getent passwd` finding the verbs. Live, the kernel's RAID status file is read through the seat on the home
server, and the agent's credentials file on the laptop is refused.
## WP9 — Every file on a node is managed through `node-files`
*`mesh-catalog`, `mesh-controller`. ADR 0394; tracked by issue 900.*
`node-reads` only reads, and as an account that cannot open a person's home, so nothing in the mesh could copy,
move, write or delete a file, and a cleanup needed a shell on the machine. Most files belong to no module: homes,
project folders, downloads, logs, scratch.
- **A node seat, `node-files`, on every node**, held by a module of its own, `mesh-files`, beside `mesh-reads`
in the catalogue; the controller holds the seat's definition beside the other node seats. It has a verb for each file action: list,
stat, readlink, read, search, write, copy, move, delete, make a folder, change mode, change owner, account and group
lookup, and the trash's list and restore. Each says what it replaces (ADR 0245): `ls`, `stat`, `readlink`, `cat`,
`grep`, `cp`, `mv`, `rm`, `mkdir`, `chmod`, `chown`, `getent passwd`, `getent group`, `id`, and `ssh <node> cp` for a
copy between nodes.
- **It may touch every file.** It declares no account of its own: the tool runner starts it as the node's
operator account, which has sudo without a password, and it uses `sudo -n` only where that account's own rights
do not reach. It keeps each file's owner and modes as well as it can: a copy or a move keeps them, a new file
takes its folder's owner. Which files to touch is the caller's responsibility; it judges no permission.
- **Nothing is lost at once.** A file deleted or overwritten goes to the node's trash with who asked and why, is
restorable for 7 days, and is emptied after.
- **A path a module owns is refused**, naming the module and its tool, unless the call says `override` with a
reason; an override is recorded and said to the operator.
- **It replaces `node-reads`.** Its reads keep WP8's bounds, content rule and kernel reads. Every node is
assigned `mesh-reads`, so `node-reads` and `mesh-reads` are removed by the next delivery, once `mesh-files`
holds `node-files` on every node.
- **No Approve is asked**; every act is recorded with its caller. Read and search never return the content
of a known credential file or a secret place (the mesh never prints a token); copying or moving one is
allowed.
**Proof.** The module's tests: each verb against a temporary tree keeps owner and modes, a new file takes its
folder's owner, a delete is restorable from the trash and gone after 7 days, an owned path is refused and an
override recorded, a credential file's content is never returned. Live: the operator's `~/.claude` on a workstation is listed, a file in `/etc` is read through sudo, and a file copied from one node to another
arrives with its owner and modes.