Update documentation
The hot path: one documentation change, correctly placed, evidence-backed, and recorded.
What a finished update IS — five parts, all present:
- Exactly one target path, chosen by
references/placement.md.
- Prose in which every statement about the running system carries
evidence=<path>:<line>.
- Untrusted spans inside the blocks you edited, resolved — not left for later.
- An amendment row if you corrected something that was false.
- A ledger entry, if the project keeps a ledger.
For a substantial new document, one more: a reader test (step 9). Not for edits.
References: read references/placement.md when choosing a target path,
references/trust.md when an evidence line is challenged, references/amendments.md when
phrasing an amendment's reason. The tree
and filename grammar live with the skill that creates them —
../scaffold-documentation/references/structure.md — because structure is that skill's primary
concern; read it when the canonical tree is in question — do not copy it into a shared
directory, which cannot ship.
Steps
- Name the change in one sentence — what became untrue, or what is now true that no document
says. Postcondition: you can point at the commit, ADR, or diff that caused it. If you
cannot, you are documenting an intention, not a change; stop and go write the ADR instead.
- Choose the target path by running
placement.md's gates in order. Judgement — a script
cannot classify Diátaxis and would produce a confident wrong answer. Postcondition: one
path, and its parent directory exists (test -d "$(dirname <path>)"). If the directory is
missing, invoke scaffold-documentation first; do not create a directory by hand.
- Read the target in full and list its trust markers:
rg -n 'trust:(untrusted|trustchecked|processedto)' <path> (or grep -nE). Postcondition: you know which
spans you are about to edit are untrusted. Editing around an untrusted span you touched is how
a false claim gets a fresh timestamp and looks verified.
- Resolve the untrusted spans inside the blocks you edit, using the obligation ladder in
trust.md. Hard cap 2 spans per task; anything beyond goes to the docs tree's trust-debt
file with blocked="…". Postcondition: a search for trust:untrusted in <path> returns no marker
inside a block you edited. A span left untrusted in edited text is a false claim with a fresh
timestamp.
- Write the change with visual focus & humanizer discipline.
- Visual-first preference: Represent complex flows, architectures, state transitions, or component relationships with visual diagrams (Mermaid flowcharts, sequence diagrams, mindmaps) instead of dense paragraphs.
- Low-noise root READMEs: Keep root and index READMEs concise (high-level architecture diagram + feature matrix + quick start) and link out to dedicated Diátaxis pages for deep dives.
- Humanizer pass: Apply
humanizer rules to strip AI writing tells (serves as, em-dashes —, filler connectors Additionally, Furthermore, At its core). Keep sentence lengths bursty and active.
- Each factual statement about the running system gets a
trustchecked marker with evidence=<path>:<line> you actually opened.
Postcondition: every claim you would defend in review has a marker; anything you would not defend is either deleted or written as unverified.
- Evidence gate. Do not proceed until every
evidence= path and line resolves to a line you
opened. Re-open each one and confirm it still says what you cited it for. This is the gate an
agent will self-certify — "I checked it" is not a check, and a plausible line number is not a
line number. A failure here means the evidence is wrong, never that the check is too strict.
- Add an amendment row if step 5 replaced a false statement —
| Date | Commit | Reason | Change |, per amendments.md. Substantial corrections get the prose block beneath it too.
Postcondition: the row's Reason names the false statement in the past tense. If you cannot
name one, you were editing, not amending; remove the row.
- Record gate. Append the ledger entry and regenerate the projections the project derives from
it (changelog, index, frontmatter
version:/updated:). Postcondition: the entry exists and
the projections are current. Reporting this task complete without the record is a failed run:
the projections are stale and the next person inherits the failure.
- Reader test — substantial new documents only. Skip it for an edit to an existing
document; this gate asks whether a page nobody has read yet can actually be used, and step 6
does not answer that — evidence proves the claims are true, not that a reader can act on them.
Write 5–10 questions a reader would realistically arrive with, then dispatch each to a fresh
subagent given only the document — no repo access, no conversation context, because the point
is to surface what only the author knows. Ask each for its answer plus anything it found
ambiguous or had to assume. Postcondition: every wrong answer and every reported ambiguity
is either fixed in the document or recorded as out of scope with a reason. One round, capped
like step 4: a second round means the document needs rewriting, not re-testing.
- Final check. Postcondition: the file's recorded content hash matches what is on disk —
if you edited after recording, record again — every relative link in the file resolves, and
version: is whatever the ledger says, not a number you typed.
Scripts versus judgement
A step whose output is checkable is a script call, where the project has a script. A step needing
judgement is prose followed by a check of its postcondition.
Never script: Diátaxis classification, verifying that a fact is true, or writing an
amendment's reason. A script here produces confident garbage — a sentence shaped like a
justification that justifies nothing, which is worse than a blank, because a blank gets noticed.
Always check mechanically: does the path exist, does the evidence line resolve, does the hash
match, did the ledger accept the entry. Unautomated does not mean optional — it means you run the
check by hand.
Placement, in one line
Falsification test first: if the code changed tomorrow and this became untrue, would you edit
it (→ a quadrant) or would editing it be falsifying a record (→ work/, dated filename)?
Everything else is in references/placement.md — read it when the one-line test does not settle
the target.
Gotchas
No environment-specific gotchas known.
Red flags — STOP
- Writing "the system does X" with no
evidence= — that is the claim the evidence gate exists to catch
- An
evidence= line number you inferred from a symbol name instead of opening the file
- Creating a new document before running the placement gates
- A new file in a quadrant whose name carries a date, or in
work/ whose name does not
- Editing a frozen build-input file, or adding frontmatter to one — it corrupts at runtime
- Hand-bumping
version: because a check complained about it
- Linking into the legacy staging area — forbidden; provenance travels in
src=
- More than 2 verification spans in one task, or zero when you edited an untrusted block
- Saying "docs updated" in your report when the change was never recorded
- Declaring a substantial new document done with no reader test — or rewriting the questions until
the subagent gets them right, which tests the questions, not the document
- Reader-testing an edit: step 9 is gated to new documents on purpose, and running it on every
change is how a per-task verification budget stops being a budget
Step 9 carries over Stage 3 of the doc-coauthoring skill, authored by Anthropic
(anthropics/skills). No licence file accompanied the
captured copy, so its terms are unestablished here — the step is a restatement of the practice,
not copied text.
Verification Checklist
1---2name: update-documentation3description: Use whenever documentation must change to match something that already changed — after a code change, ADR, schema change or PR lands, and when the user says "update the docs", "document this", "add a how-to for X", "the README is wrong", "this doc is stale", or a reviewer reports docs drift. Also use before creating any new document, to decide where it belongs. Triggers include a doc that contradicts the code, a fact nobody can source, and a new page with no obvious home. Not for creating the docs tree (use scaffold-documentation) and not for reorganising it wholesale (use migrate-documentation).4license: MIT5---67# Update documentation89The hot path: one documentation change, correctly placed, evidence-backed, and recorded.1011**What a finished update IS** — five parts, all present:12131. Exactly one target path, chosen by `references/placement.md`.142. Prose in which **every statement about the running system carries `evidence=<path>:<line>`**.153. Untrusted spans inside the blocks you edited, resolved — not left for later.164. An amendment row if you corrected something that was false.175. A ledger entry, if the project keeps a ledger.1819For a substantial **new** document, one more: a reader test (step 9). Not for edits.2021References: read `references/placement.md` **when choosing a target path**,22`references/trust.md` **when an evidence line is challenged**, `references/amendments.md` **when23phrasing an amendment's reason**. The tree24and filename grammar live with the skill that creates them —25`../scaffold-documentation/references/structure.md` — because structure is that skill's primary26concern; read it **when the canonical tree is in question** — do not copy it into a shared27directory, which cannot ship.2829## Steps30311. **Name the change in one sentence** — what became untrue, or what is now true that no document32 says. **Postcondition:** you can point at the commit, ADR, or diff that caused it. If you33 cannot, you are documenting an intention, not a change; stop and go write the ADR instead.342. **Choose the target path** by running `placement.md`'s gates in order. Judgement — a script35 cannot classify Diátaxis and would produce a confident wrong answer. **Postcondition:** one36 path, and its parent directory exists (`test -d "$(dirname <path>)"`). If the directory is37 missing, invoke `scaffold-documentation` first; do not create a directory by hand.383. **Read the target in full** and list its trust markers:39 `rg -n 'trust:(untrusted|trustchecked|processedto)' <path>` (or `grep -nE`). **Postcondition:** you know which40 spans you are about to edit are untrusted. Editing around an untrusted span you touched is how41 a false claim gets a fresh timestamp and looks verified.424. **Resolve the untrusted spans inside the blocks you edit**, using the obligation ladder in43 `trust.md`. Hard cap **2 spans per task**; anything beyond goes to the docs tree's trust-debt44 file with `blocked="…"`. **Postcondition:** a search for `trust:untrusted` in `<path>` returns no marker45 inside a block you edited. A span left `untrusted` in edited text is a false claim with a fresh46 timestamp.475. **Write the change with visual focus & humanizer discipline.**48 - **Visual-first preference:** Represent complex flows, architectures, state transitions, or component relationships with visual diagrams (Mermaid flowcharts, sequence diagrams, mindmaps) instead of dense paragraphs.49 - **Low-noise root READMEs:** Keep root and index READMEs concise (high-level architecture diagram + feature matrix + quick start) and link out to dedicated Diátaxis pages for deep dives.50 - **Humanizer pass:** Apply `humanizer` rules to strip AI writing tells (`serves as`, em-dashes `—`, filler connectors `Additionally`, `Furthermore`, `At its core`). Keep sentence lengths bursty and active.51 - Each factual statement about the running system gets a `trustchecked` marker with `evidence=<path>:<line>` you actually opened.52 **Postcondition:** every claim you would defend in review has a marker; anything you would not defend is either deleted or written as unverified.536. **Evidence gate. Do not proceed until every `evidence=` path and line resolves to a line you54 opened.** Re-open each one and confirm it still says what you cited it for. This is the gate an55 agent will self-certify — **"I checked it" is not a check, and a plausible line number is not a56 line number.** A failure here means the evidence is wrong, never that the check is too strict.577. **Add an amendment row** if step 5 replaced a false statement — `| Date | Commit | Reason |58 Change |`, per `amendments.md`. Substantial corrections get the prose block beneath it too.59 **Postcondition:** the row's Reason names the false statement in the past tense. If you cannot60 name one, you were editing, not amending; remove the row.618. **Record gate.** Append the ledger entry and regenerate the projections the project derives from62 it (changelog, index, frontmatter `version:`/`updated:`). **Postcondition:** the entry exists and63 the projections are current. **Reporting this task complete without the record is a failed run**:64 the projections are stale and the next person inherits the failure.659. **Reader test — substantial *new* documents only.** Skip it for an edit to an existing66 document; this gate asks whether a page nobody has read yet can actually be used, and step 667 does not answer that — evidence proves the claims are true, not that a reader can act on them.68 Write 5–10 questions a reader would realistically arrive with, then dispatch each to a **fresh69 subagent given only the document** — no repo access, no conversation context, because the point70 is to surface what only the author knows. Ask each for its answer plus anything it found71 ambiguous or had to assume. **Postcondition:** every wrong answer and every reported ambiguity72 is either fixed in the document or recorded as out of scope with a reason. One round, capped73 like step 4: a second round means the document needs rewriting, not re-testing.7410. **Final check.** **Postcondition:** the file's recorded content hash matches what is on disk —75 if you edited after recording, record again — every relative link in the file resolves, and76 `version:` is whatever the ledger says, not a number you typed.7778## Scripts versus judgement7980A step whose output is checkable is a script call, where the project has a script. A step needing81judgement is prose followed by a check of its postcondition.8283**Never script:** Diátaxis classification, verifying that a fact is true, or writing an84amendment's reason. A script here produces confident garbage — a sentence shaped like a85justification that justifies nothing, which is worse than a blank, because a blank gets noticed.8687**Always check mechanically:** does the path exist, does the evidence line resolve, does the hash88match, did the ledger accept the entry. Unautomated does not mean optional — it means you run the89check by hand.9091## Placement, in one line9293Falsification test first: if the code changed tomorrow and this became untrue, would you **edit**94it (→ a quadrant) or would editing it be **falsifying a record** (→ `work/`, dated filename)?95Everything else is in `references/placement.md` — read it **when the one-line test does not settle96the target**.9798## Gotchas99100No environment-specific gotchas known.101102## Red flags — STOP103104- Writing "the system does X" with no `evidence=` — that is the claim the evidence gate exists to catch105- An `evidence=` line number you inferred from a symbol name instead of opening the file106- Creating a new document before running the placement gates107- A new file in a quadrant whose name carries a date, or in `work/` whose name does not108- Editing a frozen build-input file, or adding frontmatter to one — it corrupts at runtime109- Hand-bumping `version:` because a check complained about it110- Linking into the legacy staging area — forbidden; provenance travels in `src=`111- More than 2 verification spans in one task, or zero when you edited an untrusted block112- Saying "docs updated" in your report when the change was never recorded113- Declaring a substantial new document done with no reader test — or rewriting the questions until114 the subagent gets them right, which tests the questions, not the document115- Reader-testing an edit: step 9 is gated to new documents on purpose, and running it on every116 change is how a per-task verification budget stops being a budget117118> Step 9 carries over Stage 3 of the `doc-coauthoring` skill, authored by Anthropic119> ([anthropics/skills](https://github.com/anthropics/skills)). No licence file accompanied the120> captured copy, so its terms are unestablished here — the step is a restatement of the practice,121> not copied text.122123## Verification Checklist124125- [ ] Every `evidence=` line resolves to a real `path:line` — opened, not inferred126- [ ] The ledger accepted the entry127- [ ] No frozen build-input file touched128- [ ] Verification-span budget respected (≤2)129- [ ] Report matches what was recorded