Finding
docs/MANIFEST.toml's entry for docs/design/rendering-completeness.md still describes the doc as the "R10.2/D17.9 rendering-completeness floor". #47 (commit 74f6622) established that R10.2 is the operator-facing-GUI requirement, has never described the rendering floor, and rewrote every other citing file (rendering-completeness.md itself, docs/design/topology.md, README.md) to cite D17.9 alone. docs/MANIFEST.toml carries the same stale pairing #47 fixed everywhere else, because it was never in scope for that sweep to find.
Evidence
docs/MANIFEST.toml:44:
description = "Measurement contract for the R10.2/D17.9 rendering-completeness floor over the origin corpus."
Compare docs/design/rendering-completeness.md:3 (fixed by #47): "This note defines the measurement contract for D17.9." and README.md:28 (fixed by #47): "D17.9 evidence floor".
Root cause: ci/check-doc-refs.py, the CI stage (doc-refs-check) that exists specifically to catch this identifier-citation class, only scans root.rglob("*.md"). docs/MANIFEST.toml is a .toml file, so its own description prose — despite carrying the exact same R<n>/D17.<n> citation shape the script's JOINED_IDS_RE is built to check — is invisible to it. ci/check-doc-manifest.py (docs-manifest-check) validates that manifest paths exist/are complete and that each file passes kanon lint --writing; it never inspects a manifest entry's own description text for citation accuracy either. So no stage in .kanon-ci.toml can currently catch this class of drift in docs/MANIFEST.toml itself.
Why this matters
docs/MANIFEST.toml is documented as the authoritative doc inventory ("makes docs/MANIFEST.toml the authoritative CI input set" per check-doc-manifest.py's own docstring) and is the first thing a reader or an agent consults to learn what each canonical doc is for. A stale citation there re-teaches the exact wrong pairing #47 spent an issue correcting everywhere else, and nothing in CI will catch a repeat of this specific failure mode (a citation fix that updates every .md file but not the manifest's own prose).
Desired correction
- Immediate: fix the one stale description (drop
R10.2/, matching the D17.9-only wording used everywhere else #47 touched).
- Systemic: extend
ci/check-doc-refs.py (or check-doc-manifest.py) so docs/MANIFEST.toml's description fields are checked by the same dangling/mismatch logic as every other canonical doc. Note this is not a trivial glob-widening: docs/MANIFEST.toml:33 describes docs/design/decisions.md as covering "D17.x technical decisions" — the bare-ref scanner would need to treat D17.x the way RANGE_CONTEXT_RE already treats D17.*, or a naive glob change introduces a false-positive dangling report on that entry. Add a case to check-doc-manifest.py --self-test (or an equivalent fixture) proving a re-injected stale citation in the manifest is caught, mirroring the existing self-test pattern.
Done when: docs/MANIFEST.toml:44 cites D17.9 only, and a CI stage exists that would fail if that citation regressed.
Finding
docs/MANIFEST.toml's entry fordocs/design/rendering-completeness.mdstill describes the doc as the "R10.2/D17.9 rendering-completeness floor".#47(commit74f6622) established thatR10.2is the operator-facing-GUI requirement, has never described the rendering floor, and rewrote every other citing file (rendering-completeness.mditself,docs/design/topology.md,README.md) to citeD17.9alone.docs/MANIFEST.tomlcarries the same stale pairing#47fixed everywhere else, because it was never in scope for that sweep to find.Evidence
docs/MANIFEST.toml:44:Compare
docs/design/rendering-completeness.md:3(fixed by #47): "This note defines the measurement contract for D17.9." andREADME.md:28(fixed by #47): "D17.9 evidence floor".Root cause:
ci/check-doc-refs.py, the CI stage (doc-refs-check) that exists specifically to catch this identifier-citation class, only scansroot.rglob("*.md").docs/MANIFEST.tomlis a.tomlfile, so its owndescriptionprose — despite carrying the exact sameR<n>/D17.<n>citation shape the script'sJOINED_IDS_REis built to check — is invisible to it.ci/check-doc-manifest.py(docs-manifest-check) validates that manifest paths exist/are complete and that each file passeskanon lint --writing; it never inspects a manifest entry's owndescriptiontext for citation accuracy either. So no stage in.kanon-ci.tomlcan currently catch this class of drift indocs/MANIFEST.tomlitself.Why this matters
docs/MANIFEST.tomlis documented as the authoritative doc inventory ("makes docs/MANIFEST.toml the authoritative CI input set" percheck-doc-manifest.py's own docstring) and is the first thing a reader or an agent consults to learn what each canonical doc is for. A stale citation there re-teaches the exact wrong pairing#47spent an issue correcting everywhere else, and nothing in CI will catch a repeat of this specific failure mode (a citation fix that updates every.mdfile but not the manifest's own prose).Desired correction
R10.2/, matching the D17.9-only wording used everywhere else#47touched).ci/check-doc-refs.py(orcheck-doc-manifest.py) sodocs/MANIFEST.toml'sdescriptionfields are checked by the same dangling/mismatch logic as every other canonical doc. Note this is not a trivial glob-widening:docs/MANIFEST.toml:33describesdocs/design/decisions.mdas covering "D17.x technical decisions" — the bare-ref scanner would need to treatD17.xthe wayRANGE_CONTEXT_REalready treatsD17.*, or a naive glob change introduces a false-positive dangling report on that entry. Add a case tocheck-doc-manifest.py --self-test(or an equivalent fixture) proving a re-injected stale citation in the manifest is caught, mirroring the existing self-test pattern.Done when:
docs/MANIFEST.toml:44citesD17.9only, and a CI stage exists that would fail if that citation regressed.