Planning bug: the corpus's conservation check cannot express a RESTATEMENT, and its historical baseline cannot conserve post-baseline text — MOTIR-3293 leaves conserve.py permanently red on thirteen packs
Epic MOTIR-3293 restates every rule pack in positive form. Its story MOTIR-3297 named the motir-ai half of the guard problem exactly — MOTIR-3310's body says planningRuleConservation.test.ts "will turn red, and the refresh is the deliberate act the check exists to require" — and gave that card a refresh script to run. The motir-meta half has the same problem, no card, and no refresh to run.
COMPRESSION.conserve.py states invariant C as baseline == (pack on disk − tag lines − added sentences) + fixture spans: whole spans may be DELETED and whole sentences ADDED, and a word-level replace is fatal. A restatement is a replace-and-delete by construction, so the check goes red on every restated pack and stays red.
Measured on this run's own base, origin/main 2d3c93eee2c3:
python3 prompts/plan-rules/COMPRESSION.conserve.py phase-deepen # before MOTIR-3308
[PASS] phase-deepen.md baseline 36307c → 51854c (-15547 chars moved to fixtures in 16 spans …)
WARRANT CONSERVED — every deletion appears verbatim in fixtures/, and the surviving text is
the baseline word-for-word.
python3 prompts/plan-rules/COMPRESSION.conserve.py phase-deepen # after MOTIR-3308
[FAIL] phase-deepen.md baseline 36307c → 22446c (13861 chars moved to fixtures in 23 spans …)
1 pack(s) violate invariant C — a compression must DELETE and TAG, never re-word.
Two distinct defects, and the second was not visible until the first was hit.
-
No RESTATEMENT operation. MOTIR-2773 already widened the script once, from COMPRESSION to COMPRESSION + SHARPENING, for exactly this reason — "a check that is red for a benign reason on three packs and counting is a check nobody reads, which is how a real re-wording gets through." Restatement is the third operation and it arrived without that widening.
-
The per-pack baseline cannot conserve text that arrived AFTER it. The baseline is derived from history — the commit before that pack's first compression — and never moves. A fixture span appended today from
origin/mainis not in that baseline, so the subtraction cannot find it and the run reportsFIXTURE SPAN NOT IN THE BASELINEseven times over spans that were conserved correctly. Everything a pack gained since its first compression is therefore unconserveable by this mechanism, which is most ofphase-deepen's limbs.
Neither is fixable by refreshing, because there is nothing here to refresh: unlike motir-ai's committed fixture, this baseline is computed from git log.
Acceptance criteria
COMPRESSION.conserve.pyrecognises a THIRD operation, RESTATEMENT, alongside COMPRESSION and SHARPENING, in the shape MOTIR-2773 added the second — its verdict names which operation it classified the diff as.- A restated pack whose removed spans are all present in
fixtures/<pack>.mdreports PASS; one with a span missing from the fixture still reports FAIL, and a test proves both directions. - A fixture span taken from a ref LATER than the pack's derived baseline no longer reports
FIXTURE SPAN NOT IN THE BASELINEwhen that span is genuinely present in the pack at the ref it was taken from; the script states which ref it resolved each span against. - Running the script over the whole corpus with
phase-deepen.mdrestated reports no violation, and its output is quoted in the PR. - The script's own docstring records that restatement is now sanctioned and what evidence it substitutes for word-for-word survival.
Context refs
motir-metaprompts/plan-rules/COMPRESSION.conserve.py— the classifier, the per-pack baseline derivation, and the two operations it already knows.motir-metaprompts/plan-rules/COMPRESSION.md§ Decision 1, invariant C — the invariant being widened.motir-metaprompts/plan-rules/fixtures/phase-deepen.md— the seven restatement spans, appended under#restatement.motir-metaprompts/plan-rules/RESTATEMENT.md— the per-unit table, which records this finding at the point it was made.- MOTIR-3308 — the restated pack this is measured against; the substrate lives only on that card's branch until it merges.
- MOTIR-3298 — the twelve further packs that would each add another permanent red.