Fleet protocol
The contract. A lane's brief says what it works on; this says how it behaves.
Everything fleet-specific — repo names, lane names, paths, bases, hands-off
sets — lives in fleet.config.json (see references/configuration.md). This
file names no repository.
The protocol is a tool, not a reading assignment. Every ritual below has a
one-command form in ${CLAUDE_PLUGIN_ROOT}/scripts/fleet.mjs, and the
evidence rule that governs it is built into the command so it cannot be
skipped. Prefer the command to the hand-written version every time — the
hand-written versions are what cost the source run hours.
| Ritual |
Command |
| register + first heartbeat, one action |
fleet register <lane> <session> |
| heartbeat, validated on write, read back before success |
fleet hb <lane> <state> <task> [note] |
| what am I waiting on, has it cleared |
fleet blockers <lane> |
| every lane's state and age |
fleet census |
| a PR's check state, read properly |
fleet checks <owner/repo> <pr> |
| which posted verdicts have gone stale |
fleet verdicts <owner/repo> |
| who a merge unblocks and whose green it broke |
fleet unblocks <owner/repo> <pr> |
| CI load in jobs, not runs |
fleet queue-depth <owner/repo> |
| the router's digest |
fleet digest |
| a run directory from a config |
fleet init <run-id> · fleet doctor |
(fleet = node "${CLAUDE_PLUGIN_ROOT}/scripts/fleet.mjs"; --self-test
proves the pure logic on fixtures, including the double-run and mixed-type
check cases.)
Session mode. Each lane is its own session, not a subagent. A
foreground Agent call blocks the caller's turn: it cannot heartbeat and
cannot read messages until the call returns. Subagents are for bounded work
inside a lane's turn, never for a lane itself.
1. Registration and addressing
On start, resolve your own identity (ListAgents — its first line names
this session) and append one row to the run's registry.md:
| <UTC> | <lane-name> | <session-name> |. The session name is the
sidebar title and changes when a human renames it; the registry is
append-only, and the last row for a lane is its current address.
Resolve every address from the file at send time, never from memory.
Read the last registry row for that lane, then send. If a send fails to
resolve, run ListAgents once, match the row whose title fits the
role, append a fresh registry row, retry once. A role with no registry row
is not online — send to the dispatch router instead.
This is a rule about the reader, not the file. Two sessions independently
addressed a session that had been ruled hung hours earlier, in the same
hour, from memory — while the registry was correct the entire time.
One was caught by accident, the other by the first's confession, and no
process caught either. A correct, authoritative artifact that nobody
consults is the hardest instrument failure to fix, because there is
nothing to repair.
Never poll. Messages enqueue at the receiver and are processed on its
next turn, so a message wakes an idle session. A polling loop over
ListAgents burns turns and proves nothing.
Route through the dispatch router. All acks, reports, "PR ready"/"merged"
notices, blocked notices and escalations go to one comms role, which fans
out, collects acknowledgements, keeps the registry current, and sends the
orchestrator digests, not a stream. Nobody else messages tier 0 directly.
Two rules the router itself is bound by, both learned the hard way:
- Relay verbatim; a relay that sharpens is a relay that falsifies.
Paraphrase silently drops hedges. Adding a location, number or name the
source never supplied destroys the source's uncertainty while looking like
comprehension.
- Carry provenance across every hop ("per
<lane>, unverified"). A
router multiplies confidence without adding evidence: a claim that travels
lane → router → planner → back to its own origin arrives wearing two hops
of apparent independent corroboration it never had.
2. Heartbeats and standby
You own exactly one file: heartbeats/<your-lane-name>.md. Append one line:
<UTC> | <state> | <task> | <note>
state ∈ start working waiting blocked delivered standby. The
note is optional; the other three fields are not, and no field may contain an
unescaped newline. The line is not just a convention — validate it with
${CLAUDE_PLUGIN_ROOT}/scripts/validate-heartbeat.mjs. Three sessions
produced three different malformations of this format in one evening, and one
of them — a leading |, copied from a table — shifted every field so a
tombstone for a dead session made the monitor report it alive.
Append at start, at every milestone, before and after any command
expected to run long, and at least every heartbeat.intervalMinutes
(default 15) while active.
- A heartbeat older than
heartbeat.staleMinutes (default 25) whose state is
not standby is treated as hung — see the heartbeat-monitor skill for
what the monitor must read before acting on that.
- About to block on a foreground call? Heartbeat first:
waiting | <task> | foreground worker, expect silence. The monitor reads
it as intended rather than as a hang.
waiting and standby are different states, and only one has a
counterparty. waiting | <specific next action> | <why> is reserved for
something genuinely pending on someone else, and it names what — so the
monitor, and you, can check whether that thing is still pending.
standby | <next action when work arrives> | is genuinely idle. Collapsing
them makes a blocked lane and an idle lane identical in a census; a lane
once sat blocked for two hours after its blocker had cleared.
- Whatever you are waiting on, measure it yourself each heartbeat:
fleet blockers <your-lane>. It reads the refs in your own waiting
heartbeats and asks the forge whether each has cleared — exit 1 means
move. The merger telling you is the other half of that rule and it is
unauditable — it leaves no trace, so nobody can verify it was sent,
including the merger. Your own measurement leaves one, and it caught 3 of 3
idle-on-done-work cases that no monitor saw.
- Idle with nothing queued: write
standby and end your turn. A message
wakes you. Standby is not death.
- Your predecessor (a replaced session of the same lane name) left its last
state in that file. Resume from it; do not restart its work.
Appending: these files are written by many sessions at once. Use fleet hb.
It prints on every branch and reads the line back before reporting
success, because a shared helper that no-ops quietly is worse than twenty
lanes appending by hand — it fails them all in the same silent way, and a
silent heartbeat skip reads as HUNG and gets a producing lane replaced.
"Not written", "denied" and "skipped" leave identical bytes; only the
read-back tells them apart. If you must append by hand: on Windows,
[IO.File]::Open($p,'Append','Write','ReadWrite') or Add-Content; POSIX
>> and tail against a file another session holds open can block until the
tool timeout — and read your own line back afterwards. See
docs/platform-notes.md.
3. ASSERTED vs DELIVERED
Every statement a session makes is ASSERTED until a link promotes it to
DELIVERED.
A promoting link is a PR URL, an issue number, a merge SHA, a re-run of the
exact command by a different agent, or a check state read at a named head.
Not promoting: "done", "implemented", "should be fine", a worker's report of
its own success, a plan, or an intention.
- A worker's "done" is a claim until a verifier re-runs the stated command.
- A count produced by a pattern match over a file is not a measurement of the
thing counted.
- The claim state is recorded in the run's logs — the queue, the ack log and
the review log each carry it — so a later reader can tell which claims were
ever checked.
This is the single highest-value rule in the protocol. Everything in the
evidence-rules skill is a corollary of it.
4. Git discipline
Full text with the incident behind each rule: references/git-discipline.md.
The short form, all of it load-bearing:
- One repo per lane, exclusive scope, from
fleet.config.json. Never
edit another lane's repo. Honour the configured hands-off repo list.
- Never switch a shared checkout's HEAD, never commit in it, never stash
it. Work in a per-task worktree. If a predecessor's worktree already holds
your branch, continue there — one writer per branch.
- Push and open the PR in ONE action. A pushed branch with no PR is a
parking spot that hides work. Draft is the parking spot; a bare branch is
not.
- Prove on the committed tree, not the worktree:
git diff HEAD --stat
must be empty when the proof runs.
- Conventional commits, with a
Co-Authored-By: trailer naming the
model. No authorship headers inside source files.
- Never
--force, reset --hard, clean, or worktree remove --force.
Never delete a branch holding unique content. --force-with-lease is
permitted only on a lane-owned branch and only in the form
--force-with-lease=<ref>:<sha> with the SHA written out — a bare lease
reads a remote-tracking ref that a background fetch may already have
moved, which makes it a guard-shaped no-op.
- Fix root causes. Never weaken, skip, quarantine or retry-loop a test to
get green. A green test that enshrines the defect is a defect.
- No machine-absolute paths and no time estimates in committed files.
Sequence by dependency.
- Verify the issue's symptom before building. Open state is not evidence
the defect exists — and presence of the file, script or component is not
presence of the defect. Absent → close the issue with the evidence.
- Do not act on a PR you merely discovered by scanning. In a fleet
sharing one credential,
author cannot discriminate between lanes; it
answers "is this ours", and the branch answers "which lane". Read
authorship from the branch, never from the PR.
5. Review and merge-readiness discipline
Review routing. Mechanical changes — docs, templates, link fixes, and
anything whose correctness is decided by a gate the author already ran — go
to a peer lane, preferably one that has run the same gate. Management
review is reserved for product behaviour, security, permissions, gates
themselves, and anything on a release path. The peer reviewer is bound by
every rule that binds a management reviewer. Never route a lane to review its
own branch: self-approval wearing a peer's clothes.
Every PR body states four things — this is the shape that makes reviewer
attention go further, because the claims arrive already scoped:
|
|
| WHAT was verified |
the claim |
| THE EXACT COMMAND or gate |
so the claim is re-runnable |
| THE FALSIFIER |
the input that would have turned it red |
| THE SET or COUNT |
what the claim ranges over |
Plus: what was intentionally not run, and the rejected "fixes" that would
have hidden the problem rather than solved it.
Before merging (references/merge-discipline.md for the mechanics):
- Re-read the checks as the literal last action. Run the unfiltered
pending-check query immediately before the merge command. Never reuse a
result from earlier in the same turn. Stop on any contradiction between
two reads. Incident: a merge went through with two checks still queued
because a filtered query returned empty while an unfiltered list in the
same message showed both pending.
- A SHA handed to another session is read fresh from the remote
immediately before handing it on, never from the last local push. The
verdict, the merge and the last look are all scoped to that SHA; a stale
one silently scopes all three to a tree nobody read.
- A squash merge makes a new SHA, so the merge commit legitimately
carries no checks. The verdict lives on the PR head. "The merge commit has
no checks" is never itself evidence of a gap.
- A structural readiness verdict is not CI. Whatever your merge-gate
tool reports about mergeability, absorption or worktree cleanliness, it
read no check conclusions unless it says it did.
6. Escalation
Some decisions are not a session's to make: money, production, tenants, the
trust chain, repository or organisation settings, abandoning work. Configure
the list in fleet.config.json under founderClass.
- An escalation parks a decision, never a lane. Append one line to
escalations.md — <UTC> | <lane> | <decision needed> | MEANWHILE: <what proceeds> — notify the dispatch router, and continue with the next task.
- Reaching the human means a ready-to-merge PR with proofs, not a
question that parks the work.
- Never ask the human a blocking question mid-run.
7. Behaviour
- Minimum verbosity in every message and report: facts, numbers,
path:line.
- Delegate. Spend your own turns on judgement, routing and verification.
Bounded edits go to a mid-tier worker; verification to a cheap verifier.
Every dispatch names its model — see the
fleet-roles skill.
- Spawn workers in the background and heartbeat while they run.
- Loop until the planner says the queue is empty, then write
reports/<lane>.md (PRs opened and merged, issues closed, blocked items,
exact proofs) and finish with heartbeat standby.
Run directory
One directory per run, machine-local, never committed. Layout, ownership and
the append rule: references/run-directory.md.
References
| File |
Contents |
references/configuration.md |
Every configurable name, and the config file shape |
references/git-discipline.md |
The full git rules with the incident behind each |
references/merge-discipline.md |
The merge gate, step by step |
references/run-directory.md |
Log files, who owns which, the append rule |
1---2name: fleet-protocol3description: The contract every session in a multi-session Claude Code fleet reads first. Use when starting, joining, or running a fleet of parallel sessions on one codebase - heartbeats and standby, addressing other sessions through a dispatch router, ASSERTED vs DELIVERED claim states, git discipline (one repo per lane, push-and-open-PR as one action, never rewrite shared history), and merge-readiness discipline (re-read the checks as the literal last action before a merge). Triggers on "start a fleet", "orchestration protocol", "lane", "heartbeat", "dispatch", "PR ready", "merge gate", "who owns this repo", or any question about how parallel sessions coordinate.4---5
6# Fleet protocol
7
8The contract. A lane's brief says what it works on; this says how it behaves.
9Everything fleet-specific — repo names, lane names, paths, bases, hands-off
10sets — lives in `fleet.config.json` (see `references/configuration.md`). This
11file names no repository.
12
13**The protocol is a tool, not a reading assignment.** Every ritual below has a
14one-command form in `${CLAUDE_PLUGIN_ROOT}/scripts/fleet.mjs`, and the
15evidence rule that governs it is built into the command so it cannot be
16skipped. Prefer the command to the hand-written version every time — the
17hand-written versions are what cost the source run hours.
18
19| Ritual | Command |
20|---|---|
21| register + first heartbeat, one action | `fleet register <lane> <session>` |
22| heartbeat, validated on write, **read back before success** | `fleet hb <lane> <state> <task> [note]` |
23| what am I waiting on, has it cleared | `fleet blockers <lane>` |
24| every lane's state and age | `fleet census` |
25| a PR's check state, read properly | `fleet checks <owner/repo> <pr>` |
26| which posted verdicts have gone stale | `fleet verdicts <owner/repo>` |
27| who a merge unblocks and whose green it broke | `fleet unblocks <owner/repo> <pr>` |
28| CI load in jobs, not runs | `fleet queue-depth <owner/repo>` |
29| the router's digest | `fleet digest` |
30| a run directory from a config | `fleet init <run-id>` · `fleet doctor` |
31
32(`fleet` = `node "${CLAUDE_PLUGIN_ROOT}/scripts/fleet.mjs"`; `--self-test`
33proves the pure logic on fixtures, including the double-run and mixed-type
34check cases.)
35
36**Session mode.** Each lane is its **own session**, not a subagent. A
37foreground `Agent` call blocks the caller's turn: it cannot heartbeat and
38cannot read messages until the call returns. Subagents are for bounded work
39*inside* a lane's turn, never for a lane itself.
40
41## 1. Registration and addressing
42
431. On start, resolve your own identity (`ListAgents` — its first line names
44 this session) and append one row to the run's `registry.md`:
45 `| <UTC> | <lane-name> | <session-name> |`. The session name is the
46 sidebar title and changes when a human renames it; the registry is
47 append-only, and the **last** row for a lane is its current address.
482. **Resolve every address from the file at send time, never from memory.**
49 Read the last registry row for that lane, then send. If a send fails to
50 resolve, run `ListAgents` **once**, match the row whose title fits the
51 role, append a fresh registry row, retry once. A role with no registry row
52 is not online — send to the dispatch router instead.
53
54 This is a rule about the reader, not the file. Two sessions independently
55 addressed a session that had been ruled hung hours earlier, in the same
56 hour, from memory — while the registry was **correct the entire time**.
57 One was caught by accident, the other by the first's confession, and no
58 process caught either. A correct, authoritative artifact that nobody
59 consults is the hardest instrument failure to fix, because there is
60 nothing to repair.
613. **Never poll.** Messages enqueue at the receiver and are processed on its
62 next turn, so a message *wakes* an idle session. A polling loop over
63 `ListAgents` burns turns and proves nothing.
64
65**Route through the dispatch router.** All acks, reports, "PR ready"/"merged"
66notices, blocked notices and escalations go to one comms role, which fans
67out, collects acknowledgements, keeps the registry current, and sends the
68orchestrator **digests, not a stream**. Nobody else messages tier 0 directly.
69
70Two rules the router itself is bound by, both learned the hard way:
71
72- **Relay verbatim; a relay that sharpens is a relay that falsifies.**
73 Paraphrase silently drops hedges. Adding a location, number or name the
74 source never supplied destroys the source's uncertainty while looking like
75 comprehension.
76- **Carry provenance across every hop** ("per `<lane>`, unverified"). A
77 router multiplies confidence without adding evidence: a claim that travels
78 lane → router → planner → back to its own origin arrives wearing two hops
79 of apparent independent corroboration it never had.
80
81## 2. Heartbeats and standby
82
83You own exactly one file: `heartbeats/<your-lane-name>.md`. Append one line:
84
85```
86<UTC> | <state> | <task> | <note>
87```
88
89`state` ∈ `start` `working` `waiting` `blocked` `delivered` `standby`. The
90note is optional; the other three fields are not, and no field may contain an
91unescaped newline. **The line is not just a convention — validate it** with
92`${CLAUDE_PLUGIN_ROOT}/scripts/validate-heartbeat.mjs`. Three sessions
93produced three different malformations of this format in one evening, and one
94of them — a leading `|`, copied from a table — shifted every field so a
95tombstone for a dead session made the monitor report it **alive**.
96
97Append at start, at every milestone, **before and after** any command
98expected to run long, and at least every `heartbeat.intervalMinutes`
99(default 15) while active.
100
101- A heartbeat older than `heartbeat.staleMinutes` (default 25) whose state is
102 not `standby` is treated as hung — see the `heartbeat-monitor` skill for
103 what the monitor must read before acting on that.
104- About to block on a foreground call? Heartbeat **first**:
105 `waiting | <task> | foreground worker, expect silence`. The monitor reads
106 it as intended rather than as a hang.
107- **`waiting` and `standby` are different states, and only one has a
108 counterparty.** `waiting | <specific next action> | <why>` is reserved for
109 something genuinely pending on someone else, and it names what — so the
110 monitor, and you, can check whether that thing is still pending.
111 `standby | <next action when work arrives> |` is genuinely idle. Collapsing
112 them makes a blocked lane and an idle lane identical in a census; a lane
113 once sat blocked for **two hours** after its blocker had cleared.
114- **Whatever you are waiting on, measure it yourself each heartbeat:**
115 `fleet blockers <your-lane>`. It reads the refs in your own `waiting`
116 heartbeats and asks the forge whether each has cleared — exit 1 means
117 move. The merger telling you is the other half of that rule and it is
118 unauditable — it leaves no trace, so nobody can verify it was sent,
119 including the merger. Your own measurement leaves one, and it caught 3 of 3
120 idle-on-done-work cases that no monitor saw.
121- Idle with nothing queued: write `standby` and **end your turn**. A message
122 wakes you. Standby is not death.
123- Your predecessor (a replaced session of the same lane name) left its last
124 state in that file. Resume from it; do not restart its work.
125
126Appending: these files are written by many sessions at once. Use `fleet hb`.
127It prints on **every** branch and **reads the line back** before reporting
128success, because a shared helper that no-ops quietly is worse than twenty
129lanes appending by hand — it fails them all in the same silent way, and a
130silent heartbeat skip reads as HUNG and gets a producing lane replaced.
131"Not written", "denied" and "skipped" leave identical bytes; only the
132read-back tells them apart. If you must append by hand: on Windows,
133`[IO.File]::Open($p,'Append','Write','ReadWrite')` or `Add-Content`; POSIX
134`>>` and `tail` against a file another session holds open can block until the
135tool timeout — and read your own line back afterwards. See
136`docs/platform-notes.md`.
137
138## 3. ASSERTED vs DELIVERED
139
140> Every statement a session makes is **ASSERTED** until a link promotes it to
141> **DELIVERED**.
142
143A promoting link is a PR URL, an issue number, a merge SHA, a re-run of the
144exact command by a different agent, or a check state read at a named head.
145Not promoting: "done", "implemented", "should be fine", a worker's report of
146its own success, a plan, or an intention.
147
148- A worker's "done" is a claim until a verifier re-runs the stated command.
149- A count produced by a pattern match over a file is not a measurement of the
150 thing counted.
151- The claim state is recorded in the run's logs — the queue, the ack log and
152 the review log each carry it — so a later reader can tell which claims were
153 ever checked.
154
155This is the single highest-value rule in the protocol. Everything in the
156`evidence-rules` skill is a corollary of it.
157
158## 4. Git discipline
159
160Full text with the incident behind each rule: `references/git-discipline.md`.
161The short form, all of it load-bearing:
162
1631. **One repo per lane**, exclusive scope, from `fleet.config.json`. Never
164 edit another lane's repo. Honour the configured hands-off repo list.
1652. **Never switch a shared checkout's HEAD**, never commit in it, never stash
166 it. Work in a per-task worktree. If a predecessor's worktree already holds
167 your branch, continue **there** — one writer per branch.
1683. **Push and open the PR in ONE action.** A pushed branch with no PR is a
169 parking spot that hides work. Draft is the parking spot; a bare branch is
170 not.
1714. **Prove on the committed tree**, not the worktree: `git diff HEAD --stat`
172 must be empty when the proof runs.
1735. **Conventional commits**, with a `Co-Authored-By:` trailer naming the
174 model. No authorship headers inside source files.
1756. **Never** `--force`, `reset --hard`, `clean`, or `worktree remove --force`.
176 Never delete a branch holding unique content. `--force-with-lease` is
177 permitted only on a lane-owned branch and only in the form
178 `--force-with-lease=<ref>:<sha>` with the SHA written out — a bare lease
179 reads a remote-tracking ref that a background fetch may already have
180 moved, which makes it a guard-shaped no-op.
1817. **Fix root causes.** Never weaken, skip, quarantine or retry-loop a test to
182 get green. A green test that enshrines the defect is a defect.
1838. **No machine-absolute paths and no time estimates** in committed files.
184 Sequence by dependency.
1859. **Verify the issue's symptom before building.** Open state is not evidence
186 the defect exists — and presence of the file, script or component is not
187 presence of the defect. Absent → close the issue with the evidence.
18810. **Do not act on a PR you merely discovered by scanning.** In a fleet
189 sharing one credential, `author` cannot discriminate between lanes; it
190 answers "is this ours", and the branch answers "which lane". Read
191 authorship from the **branch**, never from the PR.
192
193## 5. Review and merge-readiness discipline
194
195**Review routing.** Mechanical changes — docs, templates, link fixes, and
196anything whose correctness is decided by a gate the author already ran — go
197to a **peer lane**, preferably one that has run the same gate. Management
198review is reserved for product behaviour, security, permissions, gates
199themselves, and anything on a release path. The peer reviewer is bound by
200every rule that binds a management reviewer. Never route a lane to review its
201own branch: self-approval wearing a peer's clothes.
202
203**Every PR body states four things** — this is the shape that makes reviewer
204attention go further, because the claims arrive already scoped:
205
206| | |
207|---|---|
208| WHAT was verified | the claim |
209| THE EXACT COMMAND or gate | so the claim is re-runnable |
210| THE FALSIFIER | the input that would have turned it red |
211| THE SET or COUNT | what the claim ranges over |
212
213Plus: what was intentionally **not** run, and the rejected "fixes" that would
214have hidden the problem rather than solved it.
215
216**Before merging** (`references/merge-discipline.md` for the mechanics):
217
2181. **Re-read the checks as the literal last action.** Run the *unfiltered*
219 pending-check query immediately before the merge command. Never reuse a
220 result from earlier in the same turn. Stop on any contradiction between
221 two reads. Incident: a merge went through with two checks still queued
222 because a filtered query returned empty while an unfiltered list in the
223 same message showed both pending.
2242. **A SHA handed to another session is read fresh** from the remote
225 immediately before handing it on, never from the last local push. The
226 verdict, the merge and the last look are all scoped to that SHA; a stale
227 one silently scopes all three to a tree nobody read.
2283. **A squash merge makes a new SHA**, so the merge commit legitimately
229 carries no checks. The verdict lives on the PR head. "The merge commit has
230 no checks" is never itself evidence of a gap.
2314. **A structural readiness verdict is not CI.** Whatever your merge-gate
232 tool reports about mergeability, absorption or worktree cleanliness, it
233 read no check conclusions unless it says it did.
234
235## 6. Escalation
236
237Some decisions are not a session's to make: money, production, tenants, the
238trust chain, repository or organisation settings, abandoning work. Configure
239the list in `fleet.config.json` under `founderClass`.
240
241- **An escalation parks a decision, never a lane.** Append one line to
242 `escalations.md` — `<UTC> | <lane> | <decision needed> | MEANWHILE: <what
243 proceeds>` — notify the dispatch router, and continue with the next task.
244- Reaching the human means a **ready-to-merge PR with proofs**, not a
245 question that parks the work.
246- Never ask the human a blocking question mid-run.
247
248## 7. Behaviour
249
250- **Minimum verbosity** in every message and report: facts, numbers,
251 `path:line`.
252- **Delegate.** Spend your own turns on judgement, routing and verification.
253 Bounded edits go to a mid-tier worker; verification to a cheap verifier.
254 Every dispatch names its model — see the `fleet-roles` skill.
255- **Spawn workers in the background** and heartbeat while they run.
256- **Loop** until the planner says the queue is empty, then write
257 `reports/<lane>.md` (PRs opened and merged, issues closed, blocked items,
258 exact proofs) and finish with heartbeat `standby`.
259
260## Run directory
261
262One directory per run, machine-local, never committed. Layout, ownership and
263the append rule: `references/run-directory.md`.
264
265## References
266
267| File | Contents |
268|---|---|
269| `references/configuration.md` | Every configurable name, and the config file shape |
270| `references/git-discipline.md` | The full git rules with the incident behind each |
271| `references/merge-discipline.md` | The merge gate, step by step |
272| `references/run-directory.md` | Log files, who owns which, the append rule |