D206 — D163 was a copied off-by-one, not a missing record¶
Status: resolved (2026-09-14).
Context. The gate added by D204 — every
D<n> cited in Go source must resolve to a file — found exactly one violation on
its first run: D163, referenced eight times across
internal/provisioning/provisioning.go,
internal/provisioning/provisioning_instructions_test.go, docs/sync.md and
D183, always as
an established decision and always for the same idea — "D163's metasyntax trap":
that a syntax Cartographer recognises inside a file the operator is also expected
to document must not fire on text that merely looks like it.
163 is a gap in the numbering, alongside 4, 6, 7 and 11. Nothing was ever
filed there. (This paragraph originally counted 130 among them, which was
wrong: three records depend on that number, so it got a record of its own —
see D130 and
D208.)
Decision. The eight references are renumbered to D162, whose second
defect and matching alternative are that decision: {{repo:<name>}} written to
show the generic form was indistinguishable from a real reference and produced
eleven warnings per sync, resolved with the authoritative escape {{\repo:...}}
plus a metasyntax heuristic that silences the warning for a key of the form
<name> or ... while leaving the text verbatim. internal/provisioning/expand_test.go
already labels that work "D162 WP3". No D163 record is written, and the number
stays a gap.
Alternatives rejected.
- Write the record from the citations. This was the plan until D162 was read
in full. The eight comments describe the trap consistently enough that a
plausible
D163could have been written — and it would have duplicated a decision that already exists, leaving two records for one choice and no way for a reader to tell which one the code meant. It is worth stating plainly: the citations were coherent, which is exactly what made the wrong fix look correct. - Retire the number the way D188 was retired. D188 was retired because nothing depended on it and nothing could be reconstructed. Here the dependency is real and the target exists, so retiring would have left eight comments pointing at a deliberate hole.
- Leave the references and allow-list the number. That is what the gate did for one commit, as the honest interim state. Kept, it would have normalised a reference that resolves to nothing.
Consequences. KnownDanglingDecisions is now empty, and it is checked in both
directions: a stale entry whose record exists fails the test, because an
allow-list nobody prunes is how a gate quietly stops meaning anything.
(D208 replaces that map
with two typed ones, GapDecisions and ReservedDecisions, for the reason this
paragraph gives: an untyped allow-list cannot distinguish "never existed" from
"not yet".) D163 must not be reused — the same reasoning as D188, weaker only in
degree: released CHANGELOG.md entries and the git history contain comments that
discussed "D163" as the metasyntax decision, and a future D163 about something
else would make them read as a description of it.
This is also the first thing the new gates caught, and it is the argument for them in one line: the reference had been wrong for weeks, was copied seven more times, survived a documentation refactor, and nothing anywhere reported it.