R-294: check-cited resolves derived figures against the rule, not a stored copy

c0 argued a baseline for the step-5 split would be a cache of the rule and a guard
over it would mostly assert that arithmetic has not changed. Right objection,
wrong conclusion: do not store it. ARTIFACTS now takes a { derive } entry as well
as a file path -- enumerated on this build, nothing stored, and no --update able
to silence a real disagreement between the document and the game.

tools/step5-split.mjs enumerates all 10,000 pairs through opposedContestFor with
its targets derived: 55 and 60 are the lowest POWx5 in the six and in the cut, 42
is applyDifficulty(85, "difficult"). Two different rules produce those three
numbers -- the accepted row is a named exception, not the lowest of anything -- and
a test fails if anyone unifies them. A tie in "the lowest POW in the room" is
fatal rather than silently resolved; it fired for real in testing.

Proved four ways, including raising Okonkwo's POW to 13: the lowest moves to
Braithwaite, refused.held goes 48.1 to 52.4, and the citation that was correct a
moment earlier fails. The figure follows the rule.

Landed unused -- the markers are c0's to place in their own file.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
slaguru666
2026-09-13 16:25:49 +01:00
co-authored by Claude Opus 5
parent 90cb251358
commit fb6e2cf321
4 changed files with 284 additions and 8 deletions
+46
View File
@@ -6930,3 +6930,49 @@ hypothetical until a skill nobody on the roster reaches proved it. And the first
new test ended in `assert.ok(… || true)` — a tautology that passes on anything, which is the
decoration this suite exists to refuse. Mutation-checked after removing it: making
`playableFiles` stop excluding records turns it red.
## R-294 — a citation that resolves against the rule, not against a stored copy of it
c0 asked whether the step-5 contest split should get a baseline, and argued against its own
suggestion: an artifact that is a pure function of `rules.mjs` is a cache of the rule, and a
guard over it mostly asserts that arithmetic has not changed. The objection is right. The
conclusion is not "do not guard it" but **"do not store it"**.
`check-cited`'s `ARTIFACTS` map now takes a `{ derive }` entry as well as a file path. A
string is a recorded baseline — sampled, seeded, noisy, expensive to re-run, and re-recorded
with `--update`. A derived source is enumerated on this build. Nothing is stored, so nothing
goes stale and **there is no `--update` able to silence a real disagreement between the
document and the game.** The document writes `**48.1%**<!-- cite: step5 refused.held -->` and
does not care which kind it is.
`tools/step5-split.mjs` is the first one: all 10,000 roll pairs against `opposedContestFor`,
no seed and no runs. **Targets derived, never written.** 55 and 60 are the lowest POW×5 in
the six and in the four-player cut; 42 is `applyDifficulty(85, "difficult")`.
**Two rules produce those three numbers and c0 caught me before I collapsed them.** The
refused rows are "the lowest POW in the room" over a population. The accepted row is not the
lowest of anything — it is a named exception that takes Ashcroft and drops him to Difficult.
One derivation covering both would be right today for the wrong reason, and there is now a
test that fails if someone unifies them.
**A tie is fatal**, also c0's: "the lowest POW in the room" stops being well-defined the
moment two agents share it, and answering anyway would hold the prose against an arbitrary
pick. This fired for real during testing — raising Okonkwo's POW by one ties him with
Braithwaite at 60, and the build stopped with both names.
**Proved four ways** in worktrees: a correct citation resolves (29 figures, 5 sources); a
wrong one fails with its own message, which says *nothing was re-recorded and nothing can
be*; a tie refuses; and raising Okonkwo's POW to 13 moves the lowest to Braithwaite, changes
`refused.held` from 48.1 to 52.4, and fails the citation that was correct a moment earlier.
That last one is the whole point — the figure follows the rule.
**Two errors of mine, both caught by measurement rather than review.** The blend was computed
from the rounded rows under a comment saying it used raw proportions, giving 43.7 where the
document correctly prints 43.6; a comment describing what code ought to do is the defect this
suite is named for, and this one lasted ninety seconds. And the first exhaustiveness test
asserted the displayed percentages sum to 100 — they need not: 40.7 + 48.1 + 11.3 is 100.1,
three independent round-ups, and the document's table carries the same harmless 0.1. The code
was right and the test was wrong.
**Landed unused, deliberately.** No citation markers were placed, because `CLEAN_GROUND.md` is
c0's and the markers are theirs to place. The mechanism is what this commit is.