origin-doc-update
Treat docs/ as persistent AI context. Keep each fact in one layer only.
| Path |
Owns |
docs/00_index.md |
Small routing index; read first |
docs/specs/ |
Intent, requirements, and design policy |
docs/workstreams/ |
Multi-issue autonomous work between human gates |
docs/issues/ |
Standalone one-off work only |
docs/guides/ |
Current implemented behavior; source of truth |
docs/adrs/ |
Decision rationale, alternatives, and consequences; historical decision record |
*/archive/ |
Historical work context, not current truth |
Do not copy implementation history into guides or current behavior into workstreams. Keep decision rationale in an ADR and link to it from the relevant spec, workstream/issue, or guide.
Start every task
- Read
docs/00_index.md if present.
- Read the active workstream or issue.
- Read only its related specs, guides, and ADRs when present.
- Choose one work unit:
- Use a workstream when multiple vertical-slice issues can run under the same authorization envelope until the same next human gate.
- Use a standalone issue for one bounded change, an unrelated blocker, or work with an independent lifecycle.
- Use docs only when no implementation changes.
- Reuse the recorded branch or worktree. Do not create a second branch for resumed work.
Default to one workstream file with embedded issue blocks. Split it only when independent branches, parallel ownership, or file size makes one file materially harder to resume.
Create a workstream
Do not create the file immediately when the user asks for a workstream. First establish the human boundary.
- Inspect the code and existing docs. Answer anything discoverable without asking the user.
- Identify decisions that change authorization or the path of work.
- Ask one question at a time, in dependency order, and include a recommended answer.
- Confirm these items before writing the workstream:
- goal, success criteria, and out-of-scope work;
- actions the agent may take autonomously;
- actions requiring confirmation, especially external writes, sends, submissions, deploys, destructive changes, data migrations, auth/secrets, dependencies, network access, and metered services;
- cost or usage ceiling when metered work is possible;
- test and quality gates;
- merge policy: continuous delivery is the default — a PR whose recorded quality gates pass (CI when present, otherwise the recorded local gates) is merged autonomously. Record a human merge gate only as a named exception with its reason (e.g. live/production impact, spend, new dependencies); an unexplained merge gate silently kills autonomous runs downstream. The template's
- Merge policy: line in the Authorization Envelope carries the choice;
- the next human checkpoint and early stop conditions.
- Classify runnability for every planned issue and fill its block's
runnability: field: ready (completable with only current permissions and currently available information) or gated on <the human decision, missing input, or new permission>. Surface every gated point as a question now, during creation — a question asked here costs one interview turn, while the same question discovered mid-execution stops an entire autonomous run. As part of the same pass, judge whether each issue's acceptance is machine-verifiable (counts, thresholds, passing tests) or needs human review, and fill the - verify: line under its #### Acceptance: machine — <command and expected result> or human-review — <who reviews what>. Push subjective acceptance toward a quantifiable restatement; where human judgment is genuinely required, human-review records that the issue ends at a review gate — an agent cannot self-verify a subjective goal and will either stall or overclaim. These fields are not optional prose: validate_repo_docs.py rejects a missing or malformed value, because executors (origin-goal, origin-ws-loop) treat an unrecorded runnability as gated and stop the whole run at a gate nobody set.
- State that
origin-doc-update is pausing creation until these boundaries are confirmed.
- After confirmation, create from
references/workstream.template.md or run create_workstream.py with the confirmed boundary fields.
Record only decisions that are hard to reverse or surprising without context. Do not create ADRs for routine implementation choices, temporary investigation notes, or ordinary history already captured by the workstream/issue.
Do not audit or revoke IAM roles, API scopes, bucket bindings, or other session-granted access here. origin-permission-audit owns that lifecycle; origin-close-session invokes it before this skill when applicable and passes the verified outcome into the documentation slice.
Record an ADR
Use the repository-level docs/adrs/ directory for both kinds of decision:
scope: spec — intent, requirements, architecture, design policy, security posture, or other decisions that change what the system is meant to be. Update the related docs/specs/ document with the current policy and link back to the ADR.
scope: development — implementation, integration, migration, operational, dependency, or tooling tradeoffs made while delivering a workstream or issue. Link the ADR from that work unit and update a guide when the resulting behavior is user-, operator-, integrator-, or agent-visible.
Create the record when the decision is made, not only at session close. Use references/adr.template.md or scripts/create_adr.py <slug> --scope <spec|development> --status <proposed|accepted|rejected>. The generated filename is ADR-YYYYMMDD-<slug>.md. Keep accepted and rejected records in docs/adrs/; when a decision changes, create a new ADR and mark the old one superseded with a link instead of rewriting its decision history.
An ADR must state the context/problem, the decision, alternatives considered, consequences, and links to its source workstream/issue and affected specs/guides. Use status: proposed while a human gate is pending and status: accepted or rejected after the decision is settled. Record only the rationale here; current policy belongs in specs and current behavior belongs in guides.
Improvement issues
An improvement issue is a standalone issue in docs/issues/ that records a friction observation from development work — a stuck point, a repeated manual step, an inefficiency worth fixing later — rather than a requested change. Name it ISSUE-YYYYMMDD-improve-<slug> when the improvement targets the repository itself, and ISSUE-YYYYMMDD-improve-loop-<slug> when it targets the development-loop machinery (skills canonical under ~/.agents/skills/). The two scopes have different owners and approval paths, so the name must reveal the scope at a glance. Autonomous runs (e.g. origin-ws-loop) file observations here instead of interrupting their work; humans triage them later. Create with create_issue.py as usual.
Boundary with origin-trouble-log: an improvement issue is an actionable change request against this repository or the loop machinery. An observation about how the agent itself worked wrong — a silent no-op, a false completion report, a vacuous check, guidance friction — must ALSO be recorded as one origin-trouble-log entry, and when it is only an observation (no concrete change to implement yet) it goes ONLY there; a repo issue filed instead of a trouble entry is invisible to the cross-repo triage and was measured to get lost (2026-08-10 observation-filed-to-wrong-corpus).
Implement a workstream or issue
For each issue, complete one vertical slice:
Set guide_impact before implementation:
required: name every guide that must describe the resulting behavior.
none: write a concrete reason, such as internal refactor with unchanged behavior.
Define acceptance criteria and dependencies. The - verify: line under Acceptance is the executable form: run the recorded machine check, or route to the recorded reviewer.
Capture each qualifying decision in docs/adrs/ during the slice and link it from the issue/workstream. Mark a human-gated decision as proposed until the gate is resolved.
Implement and test, preferring red-green-refactor where practical.
Update the target guide in the same slice, before marking the issue complete.
Update current status and next actions. An issue's status must be exactly
one of pending, in_progress, blocked, complete — validate_repo_docs.py
rejects anything else, and plausible words like done are the usual way to
find that out the hard way.
Continue automatically while inside the authorization envelope.
Stop at the next human gate or any recorded stop condition.
Never defer all guide work to workstream close. A guide is part of the definition of done for the issue that changed behavior.
Guide contract
Update or create a guide when behavior observable by a user, operator, integrator, or future agent changes, including:
- commands, configuration, schemas, APIs, supported workflows, and defaults;
- operational procedures, safety constraints, failure handling, and known limitations;
- behavior needed to use, maintain, debug, or extend the implementation correctly.
Do not update a guide for a pure internal refactor with identical behavior. Record guide_impact: none and why.
Write guides as current truth, not as a changelog. Include what the system does, how to use it, guarantees or constraints, maintenance/verification notes, and known limitations. Add the source workstream or issue ID in front matter.
Update specs and history
- Update a spec only when intent, requirements, architecture, or design policy changes.
- When that change follows a qualifying decision, update the related spec with the current policy and link the ADR; do not duplicate the full rationale in the spec.
- Keep chronological investigation and abandoned approaches in the active work unit, then archive it.
- Keep
docs/00_index.md as links plus one-line routing descriptions. Do not add a second progress dashboard unless ordering across many workstreams cannot fit in the index.
Complete work
Before archive:
- Verify every issue acceptance criterion.
- Verify every issue has
guide_impact: required or none.
- Verify required guides describe the implemented behavior and reference the source work.
- Verify qualifying decisions have an ADR in
docs/adrs/, with a settled status or an explicit proposed human gate, and that related specs/guides/work units link to it.
- Update specs if direction changed.
- Reach the recorded human gate or record why the workstream stopped.
- Run
validate_repo_docs.py <repo path>. Name the repository rather than
relying on the current directory: reached through an orchestrator, the current
directory is a different repository, whose docs would validate clean and be
reported as this one's result. Check the validated: line it prints.
- Archive the work unit and update
docs/00_index.md. The archive scripts accept an issue/
workstream id, .md filename, or path, stage the document/index changes before applying them,
and roll back both files if a later replacement fails. They print the removal count plus the
exact index lines they changed. Treat a zero or unexpected count as a stop condition and
inspect the diff before continuing.
- Hand merged branch cleanup to
origin-git-cleanup.
Resume and onboard
When resuming, follow docs/00_index.md to the active work unit, reuse its branch, then continue from Next Actions without rescanning the repository.
When onboarding scattered docs, initialize the scaffold, classify each file by the ownership table, preserve history with git mv, confirm ambiguous removals, update cross-references, and validate.
Hooks
Keep hooks best-effort and non-blocking:
session_start.sh may inject only docs/00_index.md.
stop_nudge.sh may emit one short reminder when non-doc changes lack docs changes.
- Do not force-load this full skill from a hook and do not block commits or task completion from a semantic guess.
Use template fields and validate_repo_docs.py for deterministic enforcement. Hooks cannot reliably infer whether behavior changed and hard enforcement creates false positives and repeated token cost.
Resources
Templates in references/:
00_index.template.md
workstream.template.md
issue.template.md
guide.template.md
adr.template.md
spec.template.md
Scripts in scripts/:
init_repo_docs.py [repo]
create_workstream.py <slug> --issue <slug> --scope <text> --confirmed-at YYYY-MM-DD --next-human-gate <name> --autonomous <text> --confirm-first <text> (--verify-machine <text> | --verify-human <text>) (--guide <GUIDE-id> | --no-guide-reason <text>) [--merge-policy <text>] [--gated-on <text>] [--repo <repo>]
The interview's confirmed boundaries are required arguments: envelope
(--autonomous, --confirm-first), acceptance (--verify-*), and — when the
initial issue is not immediately runnable — --gated-on <reason>. A file created
without them validates red, and executors treat the missing record as a gate.
create_issue.py <slug> (--verify-machine <text> | --verify-human <text>) (--guide <GUIDE-id> | --no-guide-reason <text>) [--title <title>] [--repo <repo>]
Pass a slug, not a full issue id — the ISSUE-<date>- prefix is added for you.
The guide decision and the acceptance decision are required, as they are for
create_workstream.py: name the guide this issue must update (or why not), and
state how acceptance is verified. Without them the generated file cannot pass
validate_repo_docs.py.
create_adr.py <slug> --scope <spec|development> [--status <proposed|accepted|rejected>] [--title <title>] [--repo <repo>]
archive_workstream.py <workstream> [--repo <repo>]
archive_issue.py <issue> [--repo <repo>]
archive_transaction.py: stage and atomically roll back archive/index file updates
validate_repo_docs.py <repo> (prints the repository it validated)
It also resolves every relative link under docs/**/*.md and fails on any
that does not exist — archiving moves a file one level deeper and leaves its
referrers behind, and that breakage is otherwise invisible until someone
follows a link. Only inline code spans are excluded — write an unresolvable
path as `[x](../placeholder.md)` and it is ignored. A link inside a
fenced block or an HTML comment is reported: block-level parsing was tried
and removed, because across 26 repositories using this convention it cost 5
loud false positives in 2 of them and never found a link the simpler rule
misses, while repeatedly opening regions it never closed and silently deleting
every link to the end of a document. A repository adopting the check
with existing rot can record it as debt in docs/validator-link-baseline.txt
(one path<TAB>target per line, preferring the target-scoped form); the list
only shrinks, so an entry that is now resolvable is itself an error.
Read the matching template before creating a file manually. Keep legacy archives in place; promote useful current knowledge into a guide or spec instead of renaming history.
1---2name: origin-doc-update3description: Keep repository documentation aligned with implementation during development, including recording architectural and implementation decisions as ADRs. Use when starting or resuming features, bugs, refactors, API/schema/config/command changes, docs work, workstream or issue creation, unfinished work, docs reorganization, or a hard-to-reverse or surprising design/development decision. Trigger especially when the user asks to create a workstream, when implemented behavior may require docs/guides updates, when an ADR should be created or superseded, or when docs/00_index.md exists. Do not use for pure operational checks, log inspection, status reporting, or read-only explanations with no behavior or documentation change.4---56# origin-doc-update78Treat `docs/` as persistent AI context. Keep each fact in one layer only.910| Path | Owns |11| ------------------- | ------------------------------------------------------------------------------ |12| `docs/00_index.md` | Small routing index; read first |13| `docs/specs/` | Intent, requirements, and design policy |14| `docs/workstreams/` | Multi-issue autonomous work between human gates |15| `docs/issues/` | Standalone one-off work only |16| `docs/guides/` | Current implemented behavior; source of truth |17| `docs/adrs/` | Decision rationale, alternatives, and consequences; historical decision record |18| `*/archive/` | Historical work context, not current truth |1920Do not copy implementation history into guides or current behavior into workstreams. Keep decision rationale in an ADR and link to it from the relevant spec, workstream/issue, or guide.2122## Start every task23241. Read `docs/00_index.md` if present.252. Read the active workstream or issue.263. Read only its related specs, guides, and ADRs when present.274. Choose one work unit:28 - Use a **workstream** when multiple vertical-slice issues can run under the same authorization envelope until the same next human gate.29 - Use a **standalone issue** for one bounded change, an unrelated blocker, or work with an independent lifecycle.30 - Use **docs only** when no implementation changes.315. Reuse the recorded branch or worktree. Do not create a second branch for resumed work.3233Default to one workstream file with embedded issue blocks. Split it only when independent branches, parallel ownership, or file size makes one file materially harder to resume.3435## Create a workstream3637Do not create the file immediately when the user asks for a workstream. First establish the human boundary.38391. Inspect the code and existing docs. Answer anything discoverable without asking the user.402. Identify decisions that change authorization or the path of work.413. Ask one question at a time, in dependency order, and include a recommended answer.424. Confirm these items before writing the workstream:43 - goal, success criteria, and out-of-scope work;44 - actions the agent may take autonomously;45 - actions requiring confirmation, especially external writes, sends, submissions, deploys, destructive changes, data migrations, auth/secrets, dependencies, network access, and metered services;46 - cost or usage ceiling when metered work is possible;47 - test and quality gates;48 - merge policy: continuous delivery is the default — a PR whose recorded quality gates pass (CI when present, otherwise the recorded local gates) is merged autonomously. Record a human merge gate only as a named exception with its reason (e.g. live/production impact, spend, new dependencies); an unexplained merge gate silently kills autonomous runs downstream. The template's `- Merge policy:` line in the Authorization Envelope carries the choice;49 - the next human checkpoint and early stop conditions.505. Classify runnability for every planned issue and fill its block's `runnability:` field: `ready` (completable with only current permissions and currently available information) or `gated on <the human decision, missing input, or new permission>`. Surface every gated point as a question now, during creation — a question asked here costs one interview turn, while the same question discovered mid-execution stops an entire autonomous run. As part of the same pass, judge whether each issue's acceptance is machine-verifiable (counts, thresholds, passing tests) or needs human review, and fill the `- verify:` line under its `#### Acceptance`: `machine — <command and expected result>` or `human-review — <who reviews what>`. Push subjective acceptance toward a quantifiable restatement; where human judgment is genuinely required, `human-review` records that the issue ends at a review gate — an agent cannot self-verify a subjective goal and will either stall or overclaim. These fields are not optional prose: `validate_repo_docs.py` rejects a missing or malformed value, because executors (`origin-goal`, `origin-ws-loop`) treat an unrecorded runnability as `gated` and stop the whole run at a gate nobody set.516. State that `origin-doc-update` is pausing creation until these boundaries are confirmed.527. After confirmation, create from `references/workstream.template.md` or run `create_workstream.py` with the confirmed boundary fields.5354Record only decisions that are hard to reverse or surprising without context. Do not create ADRs for routine implementation choices, temporary investigation notes, or ordinary history already captured by the workstream/issue.5556Do not audit or revoke IAM roles, API scopes, bucket bindings, or other session-granted access here. `origin-permission-audit` owns that lifecycle; `origin-close-session` invokes it before this skill when applicable and passes the verified outcome into the documentation slice.5758## Record an ADR5960Use the repository-level `docs/adrs/` directory for both kinds of decision:6162- `scope: spec` — intent, requirements, architecture, design policy, security posture, or other decisions that change what the system is meant to be. Update the related `docs/specs/` document with the current policy and link back to the ADR.63- `scope: development` — implementation, integration, migration, operational, dependency, or tooling tradeoffs made while delivering a workstream or issue. Link the ADR from that work unit and update a guide when the resulting behavior is user-, operator-, integrator-, or agent-visible.6465Create the record when the decision is made, not only at session close. Use `references/adr.template.md` or `scripts/create_adr.py <slug> --scope <spec|development> --status <proposed|accepted|rejected>`. The generated filename is `ADR-YYYYMMDD-<slug>.md`. Keep accepted and rejected records in `docs/adrs/`; when a decision changes, create a new ADR and mark the old one `superseded` with a link instead of rewriting its decision history.6667An ADR must state the context/problem, the decision, alternatives considered, consequences, and links to its source workstream/issue and affected specs/guides. Use `status: proposed` while a human gate is pending and `status: accepted` or `rejected` after the decision is settled. Record only the rationale here; current policy belongs in specs and current behavior belongs in guides.6869## Improvement issues7071An improvement issue is a standalone issue in `docs/issues/` that records a friction observation from development work — a stuck point, a repeated manual step, an inefficiency worth fixing later — rather than a requested change. Name it `ISSUE-YYYYMMDD-improve-<slug>` when the improvement targets the repository itself, and `ISSUE-YYYYMMDD-improve-loop-<slug>` when it targets the development-loop machinery (skills canonical under `~/.agents/skills/`). The two scopes have different owners and approval paths, so the name must reveal the scope at a glance. Autonomous runs (e.g. `origin-ws-loop`) file observations here instead of interrupting their work; humans triage them later. Create with `create_issue.py` as usual.7273Boundary with `origin-trouble-log`: an improvement issue is an actionable change request against this repository or the loop machinery. An observation about how the agent itself worked wrong — a silent no-op, a false completion report, a vacuous check, guidance friction — must ALSO be recorded as one `origin-trouble-log` entry, and when it is only an observation (no concrete change to implement yet) it goes ONLY there; a repo issue filed instead of a trouble entry is invisible to the cross-repo triage and was measured to get lost (2026-08-10 observation-filed-to-wrong-corpus).7475## Implement a workstream or issue7677For each issue, complete one vertical slice:78791. Set `guide_impact` before implementation:80 - `required`: name every guide that must describe the resulting behavior.81 - `none`: write a concrete reason, such as internal refactor with unchanged behavior.822. Define acceptance criteria and dependencies. The `- verify:` line under Acceptance is the executable form: run the recorded machine check, or route to the recorded reviewer.833. Capture each qualifying decision in `docs/adrs/` during the slice and link it from the issue/workstream. Mark a human-gated decision as `proposed` until the gate is resolved.844. Implement and test, preferring red-green-refactor where practical.855. Update the target guide in the same slice, before marking the issue complete.866. Update current status and next actions. An issue's `status` must be exactly87 one of `pending`, `in_progress`, `blocked`, `complete` — `validate_repo_docs.py`88 rejects anything else, and plausible words like `done` are the usual way to89 find that out the hard way.90917. Continue automatically while inside the authorization envelope.928. Stop at the next human gate or any recorded stop condition.9394Never defer all guide work to workstream close. A guide is part of the definition of done for the issue that changed behavior.9596## Guide contract9798Update or create a guide when behavior observable by a user, operator, integrator, or future agent changes, including:99100- commands, configuration, schemas, APIs, supported workflows, and defaults;101- operational procedures, safety constraints, failure handling, and known limitations;102- behavior needed to use, maintain, debug, or extend the implementation correctly.103104Do not update a guide for a pure internal refactor with identical behavior. Record `guide_impact: none` and why.105106Write guides as current truth, not as a changelog. Include what the system does, how to use it, guarantees or constraints, maintenance/verification notes, and known limitations. Add the source workstream or issue ID in front matter.107108## Update specs and history109110- Update a spec only when intent, requirements, architecture, or design policy changes.111- When that change follows a qualifying decision, update the related spec with the current policy and link the ADR; do not duplicate the full rationale in the spec.112- Keep chronological investigation and abandoned approaches in the active work unit, then archive it.113- Keep `docs/00_index.md` as links plus one-line routing descriptions. Do not add a second progress dashboard unless ordering across many workstreams cannot fit in the index.114115## Complete work116117Before archive:1181191. Verify every issue acceptance criterion.1202. Verify every issue has `guide_impact: required` or `none`.1213. Verify required guides describe the implemented behavior and reference the source work.1224. Verify qualifying decisions have an ADR in `docs/adrs/`, with a settled status or an explicit proposed human gate, and that related specs/guides/work units link to it.1235. Update specs if direction changed.1246. Reach the recorded human gate or record why the workstream stopped.1257. Run `validate_repo_docs.py <repo path>`. Name the repository rather than126 relying on the current directory: reached through an orchestrator, the current127 directory is a different repository, whose docs would validate clean and be128 reported as this one's result. Check the `validated:` line it prints.1298. Archive the work unit and update `docs/00_index.md`. The archive scripts accept an issue/130 workstream id, `.md` filename, or path, stage the document/index changes before applying them,131 and roll back both files if a later replacement fails. They print the removal count plus the132 exact index lines they changed. Treat a zero or unexpected count as a stop condition and133 inspect the diff before continuing.1349. Hand merged branch cleanup to `origin-git-cleanup`.135136## Resume and onboard137138When resuming, follow `docs/00_index.md` to the active work unit, reuse its branch, then continue from `Next Actions` without rescanning the repository.139140When onboarding scattered docs, initialize the scaffold, classify each file by the ownership table, preserve history with `git mv`, confirm ambiguous removals, update cross-references, and validate.141142## Hooks143144Keep hooks best-effort and non-blocking:145146- `session_start.sh` may inject only `docs/00_index.md`.147- `stop_nudge.sh` may emit one short reminder when non-doc changes lack docs changes.148- Do not force-load this full skill from a hook and do not block commits or task completion from a semantic guess.149150Use template fields and `validate_repo_docs.py` for deterministic enforcement. Hooks cannot reliably infer whether behavior changed and hard enforcement creates false positives and repeated token cost.151152## Resources153154Templates in `references/`:155156- `00_index.template.md`157- `workstream.template.md`158- `issue.template.md`159- `guide.template.md`160- `adr.template.md`161- `spec.template.md`162163Scripts in `scripts/`:164165- `init_repo_docs.py [repo]`166- `create_workstream.py <slug> --issue <slug> --scope <text> --confirmed-at YYYY-MM-DD --next-human-gate <name> --autonomous <text> --confirm-first <text> (--verify-machine <text> | --verify-human <text>) (--guide <GUIDE-id> | --no-guide-reason <text>) [--merge-policy <text>] [--gated-on <text>] [--repo <repo>]`167 The interview's confirmed boundaries are required arguments: envelope168 (`--autonomous`, `--confirm-first`), acceptance (`--verify-*`), and — when the169 initial issue is not immediately runnable — `--gated-on <reason>`. A file created170 without them validates red, and executors treat the missing record as a gate.171- `create_issue.py <slug> (--verify-machine <text> | --verify-human <text>) (--guide <GUIDE-id> | --no-guide-reason <text>) [--title <title>] [--repo <repo>]`172 Pass a slug, not a full issue id — the `ISSUE-<date>-` prefix is added for you.173 The guide decision and the acceptance decision are required, as they are for174 `create_workstream.py`: name the guide this issue must update (or why not), and175 state how acceptance is verified. Without them the generated file cannot pass176 `validate_repo_docs.py`.177- `create_adr.py <slug> --scope <spec|development> [--status <proposed|accepted|rejected>] [--title <title>] [--repo <repo>]`178- `archive_workstream.py <workstream> [--repo <repo>]`179- `archive_issue.py <issue> [--repo <repo>]`180- `archive_transaction.py`: stage and atomically roll back archive/index file updates181- `validate_repo_docs.py <repo>` (prints the repository it validated)182183 It also resolves every relative link under `docs/**/*.md` and fails on any184 that does not exist — archiving moves a file one level deeper and leaves its185 referrers behind, and that breakage is otherwise invisible until someone186 follows a link. Only inline code spans are excluded — write an unresolvable187 path as `` `[x](../placeholder.md)` `` and it is ignored. **A link inside a188 fenced block or an HTML comment is reported**: block-level parsing was tried189 and removed, because across 26 repositories using this convention it cost 5190 loud false positives in 2 of them and never found a link the simpler rule191 misses, while repeatedly opening regions it never closed and silently deleting192 every link to the end of a document. A repository adopting the check193 with existing rot can record it as debt in `docs/validator-link-baseline.txt`194 (one `path<TAB>target` per line, preferring the target-scoped form); the list195 only shrinks, so an entry that is now resolvable is itself an error.196197Read the matching template before creating a file manually. Keep legacy archives in place; promote useful current knowledge into a guide or spec instead of renaming history.