diff --git a/.claude/skills/hq-new-issue/SKILL.md b/.claude/skills/hq-new-issue/SKILL.md index 4bd3bc42..6835a356 100644 --- a/.claude/skills/hq-new-issue/SKILL.md +++ b/.claude/skills/hq-new-issue/SKILL.md @@ -51,7 +51,7 @@ Decide the shape first: ``` then `# NNN. The title`, the title given to the tracker. **No status key**: the issue's status, owner and fix - live in the tracker (ADR 0275), and `cycle.py` refuses `status:`, `located-in:`, `fixed-by:`, + live in the tracker (ADR 0275), and the cycle test refuses `status:`, `located-in:`, `fixed-by:`, `amended-design:`, `replay:` or `replay-none:` in any report. Notes and links go to the tracker. 4. Write the symptom **as observed**, in plain terms, with the evidence that it happened. diff --git a/.claude/skills/hq-status/SKILL.md b/.claude/skills/hq-status/SKILL.md index 92425c3d..4c452678 100644 --- a/.claude/skills/hq-status/SKILL.md +++ b/.claude/skills/hq-status/SKILL.md @@ -44,6 +44,6 @@ generated on demand and never written back to disk. always generated, always ephemeral. This includes the ADR index — the hand-written one had already drifted after a single addition, which is why it was removed, and the generated one written into `02-DECISIONS/README.md` made every two open decisions conflict (issue 297), which - is why that went too. `index.py` fails if the list is stored there again. + is why that went too. the index test fails if the list is stored there again. - Do not infer status from prose. Trust only a design's frontmatter, the tracker for an issue and the knowledge base for a record; if one is wrong, flag it. diff --git a/00-META/checks/README.md b/00-META/checks/README.md index de1cb680..a22a7a34 100644 --- a/00-META/checks/README.md +++ b/00-META/checks/README.md @@ -41,24 +41,24 @@ named in its refusal: `knowledge-base.propose` refuses a record that breaks one record, naming every reason at once, and the four rules that judge the whole record set run after every acceptance and raise a condition when one fails (mesh-knowledge's `rules.go`, one table-test case per rule). -| Rule here until issue 426 | Where it lives now | +| Rule here until issue 426 (the Python checks, deleted with issue 1296) | Where it lives now | |---|---| -| The records test's `rests-on`, for a record's `extends:` | the knowledge base's `rests-on` at propose, and the whole-set rule `rests-on-live` | -| The records test's `rests-on`, for a design's `decisions:` naming an accepted record | **nowhere yet**: this repository cannot read the knowledge base. The reviewer checks each new entry with `knowledge-base.get`. Designs become the knowledge base's own kind under issue 428 | -| The records test's `live-citation`, in a record | the knowledge base's `live-citation` | -| The records test's `live-citation`, in `00-META/` and `03-DESIGN/01-to-be/` | **nowhere yet**, as above: the reviewer checks a cited record's status with `knowledge-base.get`; issue 428 | -| The records test's `supersession` | the knowledge base's `supersedes-accepted` and `self-link`, and the whole-set rule `supersession` | -| The records test's `partial-supersession` | the knowledge base's `changes` link to a clause, `changes-in-force` and `supersedes-accepted`, and the whole-set rule `partial` | -| The records test's `clauses` | the knowledge base's `has-clause`, `clause-numbering`, `clause-lead` and `clause-size` | -| The records test's `numbering` | the knowledge base's `title` and `reserved` | -| The records test's `topics`, The index test's (a record's topic) | the knowledge base's `topic`, against the reading order The index test's still checks | -| The records test's `insights` | the knowledge base's `insight-form`; an accepted record changes by a new version marked as a progressive insight | +| `records.py` `rests-on`, for a record's `extends:` | the knowledge base's `rests-on` at propose, and the whole-set rule `rests-on-live` | +| `records.py` `rests-on`, for a design's `decisions:` naming an accepted record | **nowhere yet**: this repository cannot read the knowledge base. The reviewer checks each new entry with `knowledge-base.get`. Designs become the knowledge base's own kind under issue 428 | +| `records.py` `live-citation`, in a record | the knowledge base's `live-citation` | +| `records.py` `live-citation`, in `00-META/` and `03-DESIGN/01-to-be/` | **nowhere yet**, as above: the reviewer checks a cited record's status with `knowledge-base.get`; issue 428 | +| `records.py` `supersession` | the knowledge base's `supersedes-accepted` and `self-link`, and the whole-set rule `supersession` | +| `records.py` `partial-supersession` | the knowledge base's `changes` link to a clause, `changes-in-force` and `supersedes-accepted`, and the whole-set rule `partial` | +| `records.py` `clauses` | the knowledge base's `has-clause`, `clause-numbering`, `clause-lead` and `clause-size` | +| `records.py` `numbering` | the knowledge base's `title` and `reserved` | +| `records.py` `topics`, `index.py` (a record's topic) | the knowledge base's `topic`, against the reading order the index test still checks | +| `records.py` `insights` | the knowledge base's `insight-form`; an accepted record changes by a new version marked as a progressive insight | | `index.py --print` | `knowledge-base.holds` with a topic | -| the cycle test research: a known status, `became:` when graduated | the knowledge base's `research-status`, `overview` and `became` | -| the cycle test no two decision records share a number | the knowledge base's `reserved`, and the issue tracker's counter behind `knowledge-base.reserve` | -| the cycle test an accepted decision cited by nothing | the knowledge base's whole-set rule `cited`: a record accepted there is cited by another record or names a home (`homes` at propose) | -| the cycle test a deferral names the issue that tracks it | the knowledge base's `deferral` | -| the words test over research efforts from 2026-10-07, and `kept` in `words-allowed.md` | the knowledge base's `retired-word` and `daemon-line`, from this glossary | +| `cycle.py` research: a known status, `became:` when graduated | the knowledge base's `research-status`, `overview` and `became` | +| `cycle.py` no two decision records share a number | the knowledge base's `reserved`, and the issue tracker's counter behind `knowledge-base.reserve` | +| `cycle.py` an accepted decision cited by nothing | the knowledge base's whole-set rule `cited`: a record accepted there is cited by another record or names a home (`homes` at propose) | +| `cycle.py` a deferral names the issue that tracks it | the knowledge base's `deferral` | +| `words.py` over research efforts from 2026-10-07, and `kept` in `words-allowed.md` | the knowledge base's `retired-word` and `daemon-line`, from this glossary | ## What is deliberately not checked diff --git a/02-DECISIONS/README.md b/02-DECISIONS/README.md index 4401ab32..a42353f9 100644 --- a/02-DECISIONS/README.md +++ b/02-DECISIONS/README.md @@ -14,7 +14,7 @@ the commit the knowledge base's records name as their source (issue 426). This folder keeps one thing: the six topics of the reading order, in the order somebody would learn the system. Each record names its own topic, and the knowledge base reads these lines through the records module -and refuses a record whose topic is not one of them. `index.py` checks that they are written. +and refuses a record whose topic is not one of them. the index test (`00-META/checks/`) checks that they are written. 1. **What the mesh is** — `topic: the mesh`. What it is for, and the parts it is made of. 2. **Its tiers, from the bottom up** — `topic: the tiers`. The foundation, the node and the controller, and diff --git a/03-DESIGN/00-as-is/04-delivery.md b/03-DESIGN/00-as-is/04-delivery.md index bce6942d..88141b40 100644 --- a/03-DESIGN/00-as-is/04-delivery.md +++ b/03-DESIGN/00-as-is/04-delivery.md @@ -17,6 +17,11 @@ decisions: - "ADR 0382" - "ADR 0395" - "ADR 0398" + - "ADR 0524" + - "ADR 0525" + - "ADR 0527" + - "ADR 0528" + - "ADR 0529" --- # Delivery — from a merge to the nodes, as it runs @@ -31,15 +36,15 @@ build agent, the build queue and the two statuses `mesh/merge-gate` and `mesh/re ## Who does what - **The parts of `mesh-delivery`** are modules of one repository, each a process with its own bus credential that - watches keys and writes keys (design 47, ADR 0429). Running now: the forge bridge (`mesh-delivery-forge-bridge`, - novox), the indexer (novox), the builder (`mesh-delivery-builder`, shanks), the checker (novox), the gate - (`mesh-delivery-gate`, which holds the seat `mesh-delivery`, novox), the teller (novox), the watchman (novox), the - status view (shanks) and the assigner (`mesh-delivery-assigner`, ace). + watches keys and writes keys (design 47, ADR 0429). Running now: the forge bridge (`mesh-delivery-forge-bridge`), + the indexer, the checker, the gate (`mesh-delivery-gate`, which holds the seat `mesh-delivery`), the teller and + the watchman on the control-node; the builder (`mesh-delivery-builder`) and the status view on the workstation; + and the assigner (`mesh-delivery-assigner`) on the home server (ADR 0524, ADR 0528). - **The forge bridge** turns the forge's events into stream messages and is the only part that calls the forge. The - forge module (`gitea`, novox) still announces them through the forge's system webhook. + forge module (`gitea`, on the control-node) still announces them through the forge's system webhook. - **The indexer** computes each module's fingerprint at the merge preview; **the builder** claims a build once per fingerprint and orders it as an ask on the stream of the artifact's language. -- **The build modules** (`mesh-build-go` and `mesh-build-node` on three machines, `mesh-build-image` on one) hold the +- **The build modules** (`mesh-build-go` and `mesh-build-node` on three machines, `mesh-build-image` on one; ADR 0525) hold the node seats `node-build-go`, `node-build-node` and `node-build-image`. Each pulls asks from the bus's work-queue streams (deliveries first, then checks, then re-checks) while its node has a free slot of build capacity; no part chooses the node. The seat `node-build-agent` and the module `build-agent` have no holder any more, and the seat @@ -49,10 +54,10 @@ build agent, the build queue and the two statuses `mesh/merge-gate` and `mesh/re **try** (`checker_try`, `checker_try_read`): the same check on a pushed branch, before a pull request. `checker_status` shows the steps in flight by node and the candidates still without a verdict. - **The gate** merges a delivery group's pull requests once the check, the review and the operator's Approve agree on - the same heads. The forge requires no status on any repository (ADR 0534). + the same heads. The forge requires no status on any repository (ADR 0534). The scripts `merge-check.sh` are gone from every repository (ADR 0529). - **The assigner** composes the machines a change touches (the composition check the checker reads) and writes which fingerprint each node should want, by its six rules; it only compares wants with what the controller sends. -- **The controller** (`mesh-controller`, novox) plans, orders, sends and judges. It computes a delivery plan for the +- **The controller** (`mesh-controller`, on the control-node) plans, orders, sends and judges. It computes a delivery plan for the files a merge changes, moves only modules whose build source changed with their build dependents, and writes the chain's links it owns. On 2026-10-24 the seat still lists 64 verbs, `queue` and `replay` among them; whether those still do work was not read here, and the build agent they served has no holder. @@ -65,7 +70,7 @@ build agent, the build queue and the two statuses `mesh/merge-gate` and `mesh/re - A merge is made by the gate on the operator's Approve; the controller then makes a delivery plan, tiered along the module graph, and sends it. `mesh-controller.plans` lists the plans and the delivery plans' tiers; a plan that fails on a node says so and is retried by hand. -- **hq** builds no module: the checker runs hq's Go tests (`go test ./...`) as its check. +- **hq** builds no module: the checker runs hq's Go tests (`go test ./...`) as its check (ADR 0527). ## Where the record of what runs lives diff --git a/03-DESIGN/00-as-is/13-the-console.md b/03-DESIGN/00-as-is/13-the-console.md index 2099495e..1412a7a5 100644 --- a/03-DESIGN/00-as-is/13-the-console.md +++ b/03-DESIGN/00-as-is/13-the-console.md @@ -4,6 +4,8 @@ status: implemented code: [mesh-tools, mesh-host, mesh-controller] updated: 2026-10-24 decisions: + - "ADR 0524" + - "ADR 0525" - "ADR 0152" - "ADR 0175" - "ADR 0195" diff --git a/AGENTS.md b/AGENTS.md index c5c49bba..333da38f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -56,8 +56,8 @@ in running prose; a quotation keeps its words. ## Ground rules - **Markdown only** — but for the four checks, Go tests in the package `00-META/checks/` with `go.mod` at the - root and no other Go code (ADR 0527), which the checker runs on every pull request as `mesh/check`; - until they replace them, `00-META/process/playbooks.html`, a drawn overview of the playbooks kept for a later docs site (the operator, + root and no other Go code (ADR 0527), which the checker runs on every pull request as `mesh/check`; and + `00-META/process/playbooks.html`, a drawn overview of the playbooks kept for a later docs site (the operator, 2026-10-19); a change to a playbook's steps updates it in the same pull request. Nothing checks that yet: issue 1222 asks for the check. A to-be design may also keep its reference mockup, the static HTML page the operator picked, in a