Context:
Identified during work on #7
PR: #8
Description:
.github/workflows/ci.yml runs formatting, a dependency-free module check, go vet, race-enabled tests, and the fixture self-checks. It does not look at documentation at all. This project treats docs/*.md, README.md, and AGENTS.md as versioned public contracts, so nothing currently defends them.
Three drifts survived multiple merges as a direct result, all found by reading rather than by a gate:
| Drift |
How long |
AGENTS.md referenced .github/workflows-staged/, removed in ee1d529 — including naming workflows-staged/ci.yml the authoritative source for the self-check command list, a path that no longer existed |
until #8 |
CHANGELOG.md still read ## 0.1.0 - Unreleased after v0.1.0 was tagged, released, and had binaries published — contrary to step 1 of this project's own release process in docs/versioning.md |
~3 weeks, until #8 |
docs/schema.md linked cli.md#matrix-compare-..., a dead anchor left over from the matrix → tracedoc rename in fd550ce |
until #8 |
The AGENTS.md case is the sharpest: its own tie-breaker rule ("if the two diverge, CI is correct") pointed at a file that had ceased to exist, so following the documented procedure led nowhere.
Rationale:
Every one of these is mechanically detectable and none needs a new dependency. A working link-and-anchor checker was written ad hoc while auditing #8 — roughly 25 lines of Python that parses Markdown headings into GitHub-style slugs, walks every [...](...) target, and reports missing files and dead anchors. It found all remaining link problems in one pass and can be lifted into a CI step or a small Go test.
Suggested checks, cheapest first:
Out of scope:
Prose linting, spelling, or style enforcement. This is about claims that are verifiably false, not about writing quality.
Acceptance Criteria:
Context:
Identified during work on #7
PR: #8
Description:
.github/workflows/ci.ymlruns formatting, a dependency-free module check,go vet, race-enabled tests, and the fixture self-checks. It does not look at documentation at all. This project treatsdocs/*.md,README.md, andAGENTS.mdas versioned public contracts, so nothing currently defends them.Three drifts survived multiple merges as a direct result, all found by reading rather than by a gate:
AGENTS.mdreferenced.github/workflows-staged/, removed inee1d529— including namingworkflows-staged/ci.ymlthe authoritative source for the self-check command list, a path that no longer existedCHANGELOG.mdstill read## 0.1.0 - Unreleasedafter v0.1.0 was tagged, released, and had binaries published — contrary to step 1 of this project's own release process indocs/versioning.mddocs/schema.mdlinkedcli.md#matrix-compare-..., a dead anchor left over from thematrix→tracedocrename infd550ceThe AGENTS.md case is the sharpest: its own tie-breaker rule ("if the two diverge, CI is correct") pointed at a file that had ceased to exist, so following the documented procedure led nowhere.
Rationale:
Every one of these is mechanically detectable and none needs a new dependency. A working link-and-anchor checker was written ad hoc while auditing #8 — roughly 25 lines of Python that parses Markdown headings into GitHub-style slugs, walks every
[...](...)target, and reports missing files and dead anchors. It found all remaining link problems in one pass and can be lifted into a CI step or a small Go test.Suggested checks, cheapest first:
#fragmentmatches a real heading in the target.workflows-stagedclass directly: extract backticked path-looking strings fromAGENTS.md/README.md/docs/and assert each exists.CHANGELOG.mdhas no dated section matching the tag. The release workflow already verifiestoolVersionagainst the tag (.github/workflows/release.yml), so this is the same idea applied to the changelog.Out of scope:
Prose linting, spelling, or style enforcement. This is about claims that are verifiably false, not about writing quality.
Acceptance Criteria:
AGENTS.md,README.md, ordocs/does not existgo vet ./...and the dependency-free module check must still pass)AGENTS.mddocuments how to run the check locally, alongside the existing "Validation" commands