(motir-meta) Every pack's generated header still claims "VERBATIM … verify.py proves it" — false in four packs, and the split's own DO-NOT-EDIT banner blocks fixing it by hand
Repo: motir-meta. One PR. Found by motir run MOTIR-2630, which added the corpus's first genuinely NEW rule text and so became the fourth pack to falsify its own header. Logged, not absorbed (notes.html #27) — 2630's AC 5 bounds its diff to the type packs and the type list.
What happens
Every one of the fifteen packs opens with the same two lines, emitted by split.py:
<!-- GENERATED BY prompts/plan-rules/split.py — DO NOT EDIT THIS HEADER BY HAND. -->
<!-- The rule text below is VERBATIM from the pre-split plan-rules.md; verify.py proves it. -->
Both sentences of the second line are now false in four packs:
| pack | what falsified it |
|---|---|
core.md | MOTIR-2659 + MOTIR-2660 (compression) |
phase-deepen.md | MOTIR-2661 (compression) |
kind-leaf-deepen.md | MOTIR-2661 (compression) |
type-bars.md | MOTIR-2630 (new rule text — the chore bar + the alias collapses) |
and MOTIR-2662 is in flight to falsify six more. verify.py does not prove it either — on main today it exits 1 with 2 176 diff lines and 3 problems.
Why it is not MOTIR-2711, and not "just let it expire"
MOTIR-2711 is the mirror case and settles the part that is fine. It records that verify.py's red is honest — "its claim really did expire" — and fixes COMPRESSION.conserve.py, whose red is not. Neither card touches the HEADER, which is the only place a reader is TOLD the claim holds. So the corpus now ships a machine-generated assertion of verbatimness, in the file the assertion is about, that is false and that the reader has no way to date.
And it will not age out. The header is regenerated by split.py, so a future re-run reinstates the false line over compressed and newly-authored text alike. It also carries DO NOT EDIT THIS HEADER BY HAND, so the honest fix is in the generator, not in the packs.
The failure mode is specific. The verbatimness claim is what makes the split trustworthy — DECISION.md invariant B, proved by reassembly. A reader who runs verify.py on the strength of the header gets a 2 176-line diff and cannot tell from anything in the tree whether the split broke or the compressions superseded the proof. The right answer (the latter) exists only inside COMPRESSION.md § Consequences and MOTIR-2711's description.
Acceptance criteria
split.pyemits a header whose claim is TRUE for the file it is writing — e.g. the verbatim line becomes a dated statement scoped to the split (verbatim as of the split at <ref>; later cards may amend — see COMPRESSION.md), or is dropped in favour of a pointer. The exact wording is the implementer's call; the criterion is that no pack asserts a property it does not have.- The fifteen packs on disk are re-emitted with the corrected header, and the rule text below each header is byte-identical to before — this card changes headers only. Prove it with a diff filtered to the body (
verify.py's ownbody()helper strips the header; reuse it). verify.py's own docstring andMANIFEST.md's "Not packs" row for it say what it proves and as of when, so a reader who runs it and sees red knows within one file that the red is expected.- No pack's rule text, no
fixtures/file, and noDECISION.md/COMPRESSION.mddecision text is edited. - Sequenced AFTER MOTIR-2662, or rebased onto it — a header sweep touching all fifteen packs conflicts with an in-flight compression of twelve of them.
Context refs
prompts/plan-rules/split.py— the header emitter.prompts/plan-rules/verify.py—body()(the header-stripping helper AC 2 reuses), and the docstring AC 3 amends.prompts/plan-rules/COMPRESSION.md§ Consequences — where the "the proof expired" fact currently lives, unreachable from the packs.MOTIR-2711— the same expiry hazard inCOMPRESSION.conserve.py; that card fixes the checker, this one fixes the claim.