(motir-meta) Establish `plan-rules/fixtures/` + the evidence-tag form, and compress the per-card gate checklist
Repo: motir-meta. One PR. The first execution card under MOTIR-2642's COMPRESSION.md. It builds the mechanics the other three compression cards lift, and applies them to the single most expensive region of the corpus.
COMPRESSION.md decides the rule; it deliberately cuts nothing. This card cuts, and the region it cuts is the one where a line costs the most: core.md's per-card gate checklist — 307 lines, 43.9% of core.md, delivered to every planning pass of every phase, kind and type.
Three deliverables, and the first two are what the siblings lift
prompts/plan-rules/fixtures/— one file per pack, listed inMANIFEST.mdwith the dispositionCORPUS-MAINTENANCE.mdalready has: loaded by NO planning pass. A fixtures file a pass loads saves nothing; its reader is the rule-authoring path and anyone re-litigating a rule.- The evidence tag, in the fixed form
COMPRESSION.md§ Decision 1 states, applied to every one of the 16 numbered gates that carries warrant. - A guard on
split.py— see below. It is in this card because this card is the one that makes the hazard live.
⚠️ split.py becomes destructive the moment this card lands
split.py regenerates every pack from the pre-split corpus at f7d5723. Today that is a safe no-op — re-running it reproduces the packs byte-identically. After this card's compression it does not fail, it silently reverts the corpus and prints success. verify.py at least goes red; this one does not. Fixing it is part of this card because this card creates the exposure.
The rule being applied (do not re-derive it — read § Decision 1)
A rule is TRIGGER + DIRECTIVE + WARRANT. Only WARRANT moves. The discriminator is mechanical: delete the span and ask whether the rule still FIRES. Changes when it fires ⇒ trigger, it stays, whatever incident it cites. Changes only whether a reader BELIEVES it ⇒ warrant, it moves.
Gate 1's lexical tells ("a second repo's FILE or SYMBOL named anywhere inside an acceptance criterion") are TRIGGER and stay inline in full. Gate 1's "Three instances in two days … (MOTIR-2057, notes.html #215 … MOTIR-1983, #216)" is WARRANT and moves.
Acceptance criteria
prompts/plan-rules/fixtures/core.mdexists and holds, verbatim, every warrant span this card removes fromprompts/plan-rules/core.md, each under an anchor the inline tag points at.MANIFEST.mdlistsfixtures/in its "The files" table withloaded when= never — no planning pass loads these, in the same wordsCORPUS-MAINTENANCE.mdcarries. The row is added insplit.py, which generates that table — a hand-edit toMANIFEST.mdalone drifts on the next regeneration.- Every one of the 16 numbered gates that carried warrant carries exactly one evidence tag in
COMPRESSION.md§ Decision 1's four-slot form, and no gate's trigger or directive text is re-worded. - Gate numbering is untouched — 16 gates, same numbers, same order, one runnable list in
core.md. No gate moves to another pack (§ Decision 2 is settled; this card does not reopen it). AMENDED 2026-08-11 during this card's run — the number was unreachable under § Decision 1, and the target gives way, not the rule (§ Decision 4). The replacement: every attributable warrant span in the region is moved and the residue is REPORTED with its arithmetic —python3 prompts/plan-rules/COMPRESSION.measure.pyreports the checklist region below 200 lines, down from 307.COMPRESSION.measure.pyprints the region's new size, and the PR body states what stayed and why.- The evidence.
COMPRESSION.mdmeasures the corpus-wide warrant share and takes the SENTENCE grain as its working figure (29.9%). This criterion carried that proportion across to a region it had never been measured on. The record's own classifier, scoped tocore.mdlines 31–337, returns 103 lines of 307 — so 307 − 103 = 204, above 200 before one tag line is inserted, and § Decision 1 mandates one tag per compressed rule. The only grain that reaches under 200 is the BLOCK grain (258 lines), which removes triggers and directives along with the evidence. - Delivered: 307 → 278, 4 258 characters of warrant moved to
fixtures/core.mdin 19 spans across 5 gates. The gap to 103 is that the classifier marks any sentence containing a citation, which sweeps in pure triggers that happen to cite. - Amended per
run.md's calendar rule:COMPRESSION.mdmerged at14:29, this card was authored at14:00–14:07, so the record outranks the card and a contradicted clause is amended on the record rather than dropped. Planning bug: MOTIR-2687. Lesson:notes.html#258 — renumbered from #257 when motir-meta PR #170 merged first and took that number; #257 (MOTIR-2686) is the sibling instance of the same family, and #258 cross-links it.
- The evidence.
- WARRANT CONSERVATION is proved in the PR body (
COMPRESSION.md§ Decision 1, invariant C): the diff against the pre-compression tree contains only (a) deletions whose text appears verbatim infixtures/core.mdand (b) inserted tag lines matching the fixed form. Nothing else. split.pyrefuses to overwrite a compressed pack: it compares what it would write against what is on disk and exits non-zero naming the divergent packs, unless--forceis passed. Proved by running it and showing it declines.prompts/plan-rules.md,DECISION.mdandCLASSIFICATION.mdare not edited — they are records of what was measured and decided, not of the corpus's current line counts.
Context refs
prompts/plan-rules/COMPRESSION.md— § Decision 1 (the tag form + the deletion test), § Decision 2 (why the checklist is not split), invariant C, and thesplit.pyhazard in § Consequences.prompts/plan-rules/COMPRESSION.measure.py— the measurement, re-runnable;--checkasserts the caps.prompts/plan-rules/split.py— the generator; it authorsMANIFEST.mdand would revert the packs.prompts/plan-rules/core.mdlines 31–337 — the checklist.