Novox Playbooks
How work is done on the mesh, from an idea or a symptom to a delivered change. Drawn from hq's 00-META/process/ at main f269e83, 2026-10-19, amended 2026-10-26 for ADR 0548 (one release, one check: no try).
The development cycle
Work enters as an idea or a symptom. An idea becomes a decision, a design and then milestones; a symptom becomes an issue. Both end as code delivered to the machines, and the as-is design is updated. No design without a decision; no development without a design or an issue that sends it.
A feature, step by step (playbook 07)
One milestone is one release: one branch name in every repository it touches, one worktree per repository, one fixing agent per repository kept for the whole milestone, one reviewer, and one pull request per repository, opened once. Nothing is pushed or tried before the review (ADR 0548): the branches are pushed once, after the review approves, and the one check runs the integration tests.
Step 0 · what the lead writes before any agent starts
- newThe milestone part of the design is the only input: the prepare maps each design line onto code (a build map per repository, each row citing its line) and lists every design question, what the design does not answer. It writes no findings or rulings of its own.
- newDesign complete: the operator answers each question, or the design writer one of internal form only (no change to what the operator sees, no permission, no data kept or removed), read by the reviewers by architectural domain; the answer is written into the milestone part, and only then does develop start. Nobody else answers one.
- newWhat exists today, read from the code and the live mesh, never from memory: every effect of a part removed or moved (bus writes, files, credentials, plans, processes, calls answered), every reader relying on each, what happens to each after the change and its test. It opens each build map; no code before it is complete, and the review refuses work without it.
- newSubtasks ordered so a user starts from the commit that adds its contract; one writer per file; one placement of the siblings for every agent.
- Into each issue: every file and test it touches (file:line), how it is checked and delivered, a group's merge order.
- newEvery other reader and writer of each value the change touches, each with a criterion.
- Acceptance criteria: given / when / then, each naming its test level and the design line it comes from.
- Every part the change reaches is an issue of the milestone; their order is the assigner's rules', never a cut.
- Fixtures copied from what the other side really writes, never from memory.
- An issue sized over an hour is split before work starts.
Step 1 · the fixing agent's brief
- newBuild each design line as written and nothing it does not say; every commit names its lines (
Builds: design NN M §n). - newA question the design does not answer stops that subtask and goes to the lead for the operator; never guessed or built around.
- One commit per subtask, naming its issue; tests cite their criterion (
// 1217/AC3). - newA test fails first on what the code does. A compile error is no failure: take out the change's effect and see an assertion fail.
- The whole unit suite before every commit; each test well under a second.
- newIntegration tests compiled whole; once per head reported, those of the touched packages and their importers run against an embedded bus (by name where the importers are many); never a whole module's run.
- Never push, open or merge; never move an issue; never ssh.
- Code that differs from the build map: stop that subtask and report, file:line.
- newStart a subtask only with room to finish it; stop between subtasks, never inside one.
When tests run
Two levels. Unit tests run all the time on the machine; integration tests (a bus, a store or a process started) are compiled there whole, and once per head reported only those of the touched packages and their importers run there, against an embedded bus, never a whole module's or level's: the checker's one merge check, asked by the one push after the review, runs them as the gate. There is no try (ADR 0548).
The review loop
What a round may ask
Only what makes the change wrong against its issues, their acceptance criteria and its decisions. Anything more (hardening, a further case, a nicer form) becomes a new issue, and the round does not wait for it.
What every round reads
- Every criterion against its test: a test at its level that would fail without the change.
- Every new integration test traced through the code by reading it: a local run of the touched packages shows only that it passed.
- That each integration test enters by the path the live trigger takes.
- Where each piece of state lives and how each seam travels: anything but bus state, a stream or a seat's verb is a finding, even if a record put it there.
- That no repository holds this mesh's setup (node names, placement, settings): repositories are mesh-agnostic.
An issue's life (playbook 03)
The issue tracker (seat issue-tracker) holds every issue's number, status, owner, fix and links. Its move refuses a wrong move at the write.
take-over with a reason. An issue about a condition is linked to it, so the alert names the issue.Where things live
| What | Lives in | Written with | Never |
|---|---|---|---|
| Decisions (ADRs) and research efforts | the knowledge base (seat knowledge-base) | reserve, then propose the record whole | a file in hq |
| Issues: status, owner, fix, links | the issue tracker | open, move, note, link | a status key in a report |
| An issue's narrative (design or governance only) | hq 04-ISSUES/NNN-…/ | a pull request | its status |
| Designs, as-is and to-be | hq 03-DESIGN/, status in frontmatter | a pull request | the two layers mixed |
| Playbooks, glossary, how-we-build | hq 00-META/ | a pull request | a copy in a session's memory |
| The rules every session keeps | instruction sections (module claude-code) | claude_code_instructions_propose, the operator's Approve | a hand-edited file |
All playbooks
Open a card for its steps, what it produces and how it is checked.