D142 - Seventeen decisions were sharing thirteen numbers, and nothing was checking. The log now gates its own numbering

D102 through D114 each headed two or three unrelated decisions. Two numbering streams - one from the GPU and protocol work, one from the corpus and census work - each appended from where it had last looked, and neither noticed the other. A hundred citations across the tree pointed at numbers that no longer identified anything.

This is a worse failure than a dangling reference, and quieter. A broken link announces itself; a duplicate number does not. Every see D105 still finds an entry, still reads as a working citation, and is wrong roughly half the time - and the only way to notice is to follow one and recognise that the decision you landed on is not the one being talked about. The log looked completely intact.

Which entry keeps a contested number is decided by citation count, not by date. The entry with the most references elsewhere in the tree keeps it; the others are renumbered from D125 up. That is the assignment where the fewest existing citations become wrong - three source references, against the thirty-odd that would have broken under first-come. All three were repointed, along with seven in this file, ten in WORKLOG.md and two in COMPATIBILITY.md, each resolved by reading what the citing sentence claims and matching it to the entry that says it.

The gate lives in doccheck.py. DECISIONS.md is exempt from that script's other checks because it is a dated record rather than a description of the tree - but a number is not prose, and uniqueness is the one property the log has to hold for any citation to work. It also resolves citations the other way: a D<n> naming no entry is the ordinary dangling link.

Two things had to be got right for the check to mean anything, and the first was wrong:

Shown to reject before it was believed: a deliberate duplicate heading, which it named. That is D125's rule applied to the gate enforcing D125's file.