D: CLAUDE.md still prescribes the touch that the stamp fix made unnecessary
Owner's file — flagged, not edited. CLAUDE.md's gating section is the single source of truth for the per-fix loop and no agent rewrites it on its own initiative. This ticket exists so the correction is not lost.
The stale instruction
CLAUDE.md, "THE PER-FIX LOOP", after describing the copied-in-seed no-op:
So when you seed a tree from outside,
touchthe sources after the copy (ortouch -d '2000-01-01'the seed), and do not accept the build until you have seenconverged after N round(s)and confirmed the binary's sha256 differs frompinned.
The first clause is no longer true. The rest of the sentence still is, and should stay.
The measurement
The hole it describes was real: cp stamps the seed newer than every source, so
make declared the target up to date and printed
make: 'compiler/pascal26' is up to date. where converged after N round(s)
belonged — a success message in the wrong dialect, with no error to wait for.
bug-a-the-selfhost-rule-is-a-no-op-when-the-seed-is-newer-than-its-sources
closed it by moving the recipe onto $(COMPILER_STAMP)
(compiler/.pascal26.fixedpoint), which a cp cannot create. Verified
2026-08-30 on plexus:
$ cp stable_linux_amd64/default/pinned compiler/pascal26 # seed now newest
$ rm -f compiler/.pascal26.fixedpoint
$ ls -l --time-style=+%s compiler/pascal26 compiler/compiler.pas
1788082622 compiler/pascal26 <- newer
1788078221 compiler/compiler.pas
$ make compiler/pascal26
converged after 2 round(s)
self-host fixedpoint: verified — 2 round(s), 6319b892f517
The build ran, and the stamp guard also catches the opposite case: replacing the binary without rebuilding now fails with "Something replaced the binary without rebuilding" rather than passing silently.
Why this is worth a ticket rather than a shrug
The instruction is harmless to follow and that is exactly the problem — it will never be discovered by failing. It costs a reader nothing to do and costs the next author of a seeding script the belief that mtime still matters, in the one section other docs are told to defer to. A defensive step that no longer defends anything is indistinguishable from one that does, until someone measures.
Found while rewriting the Makefile's seed-missing message ([[decide-forwardlint-in-the-per-fix-loop]]'s resolution): the message was about to repeat the same advice, and checking first is what turned it up.
The fix
Strike the touch clause; keep "do not accept the build until you have seen
converged after N round(s) and confirmed the binary's sha256 differs from
pinned", which is still exactly right and is the load-bearing half. A
sentence on the stamp replacing the mtime dependency would be worth one line —
readers who learned the old rule need to know why it went.
Gate
Docs only. The claim is already measured above; re-run those five lines if it needs re-confirming.