MotirBuilding in public
MOTIR · moooon
onMotir
You’re viewing a public project. Anyone can view it — no account needed. Sign in to submit, upvote, or comment on requests.View-only — you can’t edit work items
MOTIR-2687

Planning bug: MOTIR-2659's AC 5 set a line target from a corpus-wide warrant share, and the region's own measurement puts the floor at 204

Done
Description

The correction is already appliedMOTIR-2659's AC 5 was amended on the card during its run, the compression shipped, and notes.html #258 carries the lesson. This card is the telemetry, filed at the planner-bug home; nothing is scheduled and nothing is blocked.

⚠️ This defect has a SIBLING filed the same day: MOTIR-2686 (notes.html #257, from the MOTIR-2569 run). Both are an acceptance criterion stated as a number that was never checked, and the two halves are different: there the number was measured correctly and the card excluded by name the work that would move it; here the number was never measured on the thing it names. So the family is not "numbers are risky"a threshold has TWO preconditions: it must be measured on the criterion's OWN scope, AND that scope must be work the card is allowed to do. MOTIR-2686 fails the second, this one the first, and a card can fail either while satisfying the other. Per gate 9 that is two; a third makes the re-shape mandatory — see AC 3.

What the card asked for, and why it cannot happen

AC 5 read: "python3 prompts/plan-rules/COMPRESSION.measure.py reports the checklist region below 200 lines, down from 307." — a 35% cut, demanded of one region, under a rule (COMPRESSION.md § Decision 1, compress the WARRANT, never the TRIGGER) that cannot deliver it.

COMPRESSION.md measures the corpus-wide warrant share at three grains and takes the SENTENCE grain as its working figure: 29.9%. AC 5 carried that proportion across to a region it had never been measured on. Running the record's own classifier scoped to core.md lines 31–337 — same code, same grain, one invocation — returns 103 lines of 307:

grainlines of the 307region after the cut
clause52255
sentence — the record's working grain103204, before one tag line
block25849 — cuts triggers with the evidence

307 − 103 = 204. The criterion is unreachable before a single evidence tag is inserted, and § Decision 1 mandates one tag per compressed rule. The only grain that reaches under 200 is the BLOCK grain, which is a whole bullet at a time — precisely what § Decision 4 forbids: "the target gives way, not the rule."

And 103 over-counts what can MOVE: it marks any sentence carrying a citation, sweeping in pure triggers that happen to cite (gate 6's "The tell: a conjunction in the card's OWN summary…", gate 14's "Its tell is purely lexical too…", gate 8's "Before sizing it, grep every caller…"). The attributable warrant that moved is 4 258 characters — 29 lines, landing the region at 278.

The mechanism

COMPRESSION.md (MOTIR-2642) merged at 14:29; MOTIR-2659 was created 14:00, last edited 14:07. The card was authored against a record still in review, so the number came from the record's prose rather than from COMPRESSION.measure.py — which shipped in the same PR and was runnable the moment it landed. The run-time calendar check fired exactly as run.md describes it: the blocker merged after the card, so the record outranks the card, and the contradicted clause is an amendment to make on the record rather than a feature to build.

What would have caught it

Per-card gate 2 already forbids asserting a code fact that was not grepped. A quantity is the same kind of fact and reads as far more checked, because a figure carried from a real measurement is arithmetically true of something — just not of the thing the criterion names. The general shape is a denominator swap: "29.9% of the corpus" and "35% of this region" look like one claim at two zoom levels and are two measurements, only one of them taken. Same non-entailment as notes.html #253's X ∈ mainX ∈ <tag>, on a ratio instead of a git ref.

Acceptance criteria

  1. No code or plan change is owed for the MOTIR-2659 instance — that correction shipped with the card. This card is the record, closed by the reader who has read it.
  2. notes.html #258 exists and states the lesson (a number in an acceptance criterion is a claim about a measurement, discharged by running that measurement scoped the way the criterion scopes it) and the prompt hint (run the tool while authoring the card; prefer a criterion naming the RULE over one naming an inferred number), and cross-links #257 as the sibling instance.
  3. The repeat-defect trigger is at TWO of three (this card + MOTIR-2686). A third instance of a numeric acceptance criterion that was never checked makes gate 2's claim-vs-pointer limb owe a QUANTITY clause — a number in a criterion is discharged by naming the tool, its scope, and the reading it returned. One card covering both halves, not one per instance.

Context refs

  • prompts/plan-rules/COMPRESSION.md — § Decision 1 (the grains, the warrant rule), § Decision 4 (the target gives way, not the rule).
  • prompts/plan-rules/COMPRESSION.measure.py — the classifier; scoping it to a line range is the check that was never run.
  • prompts/plan-rules/core.md — the region, now 278 lines; gate 2's claim-vs-pointer limb is where AC 3's clause would land.
  • notes.html #258 (this instance) and #257 (MOTIR-2686 / MOTIR-2569, the sibling).