Repo: motir-meta. One PR. Type: content · Executor: coding_agent. Filed 2026-08-18 by the close-out of MOTIR-2977, the planning-bug record whose "The rule that would have prevented it" this card lands. The mirror half is the motir-ai card that is blocked_by this one.
⚠️ AMENDED 2026-08-18 by the close-out of MOTIR-2998 — the family's FOURTH instance (
notes.html#311 / MOTIR-2994), which arrived after this card was written. It raises the warrant to ×4 and contributes a THIRD tell the first three did not show: a card that records an earlier reading of its own evidence being wrong, then states the corrected reading in the same declarative voice. AC 1 and AC 3 are amended accordingly; the landing pack, the placement and the mirror split are unchanged. The run-side half #311 also argues for — a non-reproduction obliges the MATRIX, not the verdict — is out of this card's scope and is filed as MOTIR-3013 (W10) againstrun.md. That card NARROWS the Deliberately NOT in this PR disposition below rather than contradicting it — step 2 ofrun.md's reproduce rule does cover CLASSIFICATION, and is silent about OBLIGATION.⚠️ CO-LOCATED WRITE — read before editing
phase-deepen.md. This card's AC 2 adds a pointer to the NEGATIVE limb; W10's AC 2 adds a different clause to the SAME limb. Different writes, one paragraph — so no two cards own the same write, but whichever PR merges SECOND rebases its clause onto the other's and must not replace it. Recommended order: this card FIRST, so W10's clause can name the rule this one landed. Not wired as an edge in either direction: the order is a convenience, not a dependency.
This is a NEW rule in kind-bug.md, not a widening — the measurement below puts its key noun at 0 in all three homes, and the clause that comes closest fires on a different trigger and was COMPLIED WITH by the fixture.
The corpus already disciplines an under-warranted premise in two places, and a defect card sits under both:
| existing clause | its trigger | what it disciplines |
|---|---|---|
plan-rules/phase-deepen.md step 5, UNVERIFIABLE ⇒ the premise is a HYPOTHESIS (~line 50) | a precondition in a running system you have no read path to | the MOOD of the sentence, plus a first-step check with a named VERIFIED-NO-CHANGE exit |
plan-rules/phase-deepen.md's NEGATIVE limb (~line 124) | a card explaining a defect by what does not exist | the card must carry the SEARCH, not the verdict |
motir-ai/src/llm/planningRulePacks.ts — VERIFY_EVERY_PRECONDITION | the same two, in the shipped planner | the same two |
Neither reaches a defect card whose evidence is IN HAND, readable, correctly quoted — and consistent with more than one mechanism. Step 5's trigger is an unreachable premise; here the evidence was a CI failure the card printed verbatim. The NEGATIVE limb is the mirror case — a card explaining a defect by what is ABSENT; this is the POSITIVE one, a card explaining a defect by a MECHANISM. Measured on origin/main, 2026-08-18:
grep -rioE 'discriminat' prompts/plan-rules/*.md → 0. grep -c on prompts/run.md → 2, and neither is this subject (the targetRepo discriminator at line 283; the what-the-FIX-changes discriminator at line 137).grep -oiE 'discriminat' motir-ai/src/llm/planningRulePacks.ts (origin/main) → 0.also consistent with · alternative reading · candidate mechanism · which FIELD → 0 in all three homes.hypothes in planningRulePacks.ts → 4, every one the UNVERIFIABLE-premise / unfetched-artifact mood clause; falsif → 3, every one the NEGATIVE limb's decay clause.MOTIR-2280's standing discriminator refuses a new rule when a governing clause covers the case and merely was not performed. The fixture is the strongest available evidence that the governing clauses WERE performed. MOTIR-2971 labelled itself "an observation, not a diagnosis", recorded fifteen green local reproduction attempts, listed four candidate mechanisms to check before fixing, and explicitly forbade the compensating cleanup. That is step 5's mood clause, voluntarily, on a premise step 5 does not even reach — and the card still failed, because the hedge lived in the prose and the criteria were written from the mechanism. AC 4 required naming "which write escaped that transaction"; no write had escaped, so a run following the card faithfully had no legal exit at all. A rule that was read, exceeded, and stopped at the boundary of what it says is a TRIGGER gap, not a diligence miss — the same line MOTIR-2913's W5 and MOTIR-2962's W8 turn on.
And the promotion condition was set by the family's own first member, in writing. MOTIR-2964 closed as a LESSON rather than a rule and said why: "one occurrence, and the RULES tier moves only when a pattern recurs. A second instance of a card prescribing its own repair is what would promote it." There have since been three more, all inside thirty hours:
| lesson | card | the mechanism, and what refuted it |
|---|---|---|
notes.html #306 | MOTIR-2957 | "the 30 s derivation poll loses under load" — the executor was IDLE for the whole 30 s; the derivation was CANCELLED, a data-losing product race |
notes.html #308 | MOTIR-2966 | "every one is the MID-SENTENCE WIDENING" over three packs — measured per pack, one was; the other two fail different clauses for an unrelated reason |
notes.html #309 | MOTIR-2971 | "a refused session kept the lease it had already taken" — the fixed ascending lock order makes that impossible, and the two ids that prove it are printed in the card's own quoted failure |
notes.html #311 | MOTIR-2994 | "two same-key events close together make the second fail to SCHEDULE at all" — ~20 controlled trials against the same pinned scheduler produced the contracted run count every time and the error string 0 times; the real defect was one cell away in a matrix the card never drew |
#311 is the one that shows the cost is not wasted work. Its scope was right and shipped whole; what the falsified premise nearly bought was the OPPOSITE — a green probe invites "premise false, nothing here", and closing on that would have walked past a silent-work-loss defect one experiment away. #309 is the sharpest because of what it cost to falsify: nothing. No new measurement was needed — epic = cmsxxuiz9… sorts before other = cmsxxuj0e…, three lines above the sentence asserting the leak.
plan-rules/kind-bug.md)Place it after the repeat-defect trigger, as the pack's third rule. Wording, for the mirror to LIFT rather than re-derive:
⚠️ A DEFECT CARD'S MECHANISM IS A CLAIM ABOUT WHICH STORY ITS EVIDENCE SINGLES OUT — AND WHEN THE EVIDENCE ADMITS MORE THAN ONE, THE FIRST ACCEPTANCE CRITERION IS THE MEASUREMENT THAT DISCRIMINATES, NOT THE FIX (
notes.html#306 / #308 / #309). A bug report is the one card kind that arrives self-warranting: somebody SAW it, so the reader moves straight past did this happen to why, and the mechanism named in the answer inherits the credibility the observation earned — honestly earned. But an assertion, a counter, a red light or a wall-clock reports that two values DIFFERED. It does not report what made them differ, and it is silent about how many stories are consistent with the difference.
- Before writing a mechanism, finish this sentence: "this output is also consistent with …". If the alternative cannot be ruled out from what is ALREADY IN HAND, the mechanism is not yet a finding. Name the FIELD that would tell them apart — it is nearly always one more column, one more log line, one more
select— and make obtaining it acceptance criterion #1, with every criterion downstream of it stated as CONDITIONAL on its answer.- Three tells, all cheap, none needing domain knowledge. (i) A card that both DEMANDS a measurement and PRESCRIBES the repair has already answered the question it is asking — "decide between the two honest repairs" sitting one line under "state the root cause with a measurement first". One of the two is decoration, and it is always the measurement that gets skipped. (ii) A shape asserted over a SET is N claims and is usually backed by one — "every one is …", "the same failure in three places" — especially where the members were enumerated by a TOOL rather than read one at a time, because every rejected member prints the tool's VERDICT, never its reason. Quote the discriminating detail PER MEMBER, or carry the set without the shape.
- THE THIRD TELL, and the one that fires on a card which has ALREADY been careful once: a card that RECORDS an earlier reading of its evidence being WRONG, then states the corrected reading in the same declarative voice. A correction is the strongest credibility a card can carry — it proves the author went back and looked — and it is spent on the WRONG sentence: the second reading rests on the same single artifact the first one did, and inherits the standing the catch earned.
notes.html#311's fixture carries an explicit ⚠️ block explaining exactly why counting the happy log line proved the wrong thing, and then asserts the replacement mechanism in the indicative present with no new measurement behind it. The repair is one clause, not a rewrite: SAY WHICH READING IT IS. "Inferred from the log, unreproduced" costs nothing and hands the run the uncertainty instead of the conclusion — a log entitles a card to an OBSERVATION, never to a MECHANISM. Lexical form of the tell: a⚠️/ "the first reading was wrong" block, followed by an indicative-present mechanism sentence about the same artifact.- A HEDGE IN THE PROSE DOES NOT REACH THE CRITERIA — this is the half the mood rule cannot supply.
phase-deepen.mdstep 5 governs the MOOD of a premise you have no read path to; a defect card's evidence is in hand, so it never fires, and a card may call itself "an observation, not a diagnosis", record its failed reproductions, list its candidates — and still write every criterion from one of them. A run is measured against the CRITERIA. A card whose criteria are all downstream of an unfalsified mechanism has no legal exit when the mechanism is wrong, and the reflex on failing to find what it demands is the compensating patch such a card usually, and correctly, forbids. So the discipline is on the criteria, not the adjectives: carry a named FALSIFIED exit — "if the discriminator returns X, criteria 2–N are void and the card is amended on the record" — exactly as step 5's rewrite carries its VERIFIED-NO-CHANGE exit.- Why it is a gate and not advice: the cost is asymmetric. The discriminator is minutes; the mechanism it protects can absorb hours and end in a change that removes the evidence (#306's listed repair would have turned green a test whose subject — a user's Done being silently discarded — was still broken underneath it). And when the defect is a RACE, re-derive which interleavings are REACHABLE before hunting a mechanism: a fixed acquisition order, a sorted lock sequence, a deterministic id ordering each excludes whole families of interleaving, and reading one is minutes against a diagnosis that could otherwise absorb hours.
This is the POSITIVE mirror of
phase-deepen.md's NEGATIVE limb: a card explaining a defect by what does NOT exist owes the grep; a card explaining a defect by a MECHANISM owes the check that rules the alternatives out.
Warrant line, in COMPRESSION.md § Decision 1's printed two-line form:
Warrant: MOTIR-2971 · 2026-08-18 · a mechanism the card's own quoted ids already excluded, and MOTIR-2994 · 2026-08-18 · a mechanism read off one log line that ~20 controlled trials could not reproduce once — four of a family in thirty hours, on cards that complied with every mood clause the corpus has · ×4 → [fixtures/kind-bug.md#a-mechanism-owes-its-discriminator]
plan-rules/kind-bug.md carries the rule above, placed after the repeat-defect trigger, naming: the "also consistent with …" sentence, the FIELD-that-separates-them question, the first-criterion mandate, the three tells (demands-a-measurement-and-prescribes-the-repair; a shape over a SET is N claims; a card that corrected itself once and then re-asserted in the same voice), the "inferred, unreproduced" wording the third tell repairs to, the named FALSIFIED exit, and the reachable-interleavings clause. grep -c 'DISCRIMINAT' prompts/plan-rules/kind-bug.md ≥ 1 where it is 0 today.phase-deepen.md's NEGATIVE limb is written in BOTH directions — the new rule names it as its mirror (in the text above), and the NEGATIVE limb gains a one-clause pointer to it. A pointer naming the pack that holds a related rule is self-financing under COMPRESSION.md § Decision 3's derived cap; phase-deepen.md is not the capped file in any case.fixtures/kind-bug.md entry at anchor #a-mechanism-owes-its-discriminator records the four fixtures with the detail that falsified each — #306's idle executor, #308's per-pack measurement (1 of 3), #309's cmsxxuiz9… < cmsxxuj0e… ordering, and #311's ~20 trials at the contracted run count with the error string at 0 — and states that the fixture card had complied with the mood clause. #311 additionally records what the falsification nearly cost: the card's own scope was right and shipped whole, and the exposure was a run closing on "premise false, nothing to do" over a real defect one cell away. This is a NEW section, not a conserved span; say so in the PR body so the next conserve.py reader is not looking for a deletion that never happened.kind-bug.md's MANIFEST route already covers kind = bug, both phases, so no routing change is owed; state that in the PR body. If the rule lands anywhere other than kind-bug.md, MANIFEST.md is updated in the same PR.origin/main at merge. None reads on post-merge state, and none reads on the motir-ai mirror, which is a separate card in a separate repo.COMPRESSION.conserve.py, verify.py, COMPRESSION.measure.py) are run and their verdicts quoted in the PR body. A script that was red on origin/main before this diff is REPORTED, not chased — see Known traps.motir-ai mirror. ONE SUBTASK = ONE REPO = ONE PR; it is the sibling card blocked_by this one, and it LIFTS this wording rather than re-deriving it.run.md run-time backstop. Unlike W8's limb B there is no existing dispatch guard whose trigger set this widens — the check fires at AUTHORING time, on the person writing the criteria, and run.md's a bug card's FIRST deliverable is the REPRODUCTION rule already covers the RUN side (step 2's git log <base>..HEAD decides which of two opposite findings a non-reproduction is). This is a disposition, not a deferral: the run-time half exists and is cited; what is missing is only the authoring half.COMPRESSION.conserve.py and verify.py are RED on main for reasons unrelated to any diff — verify.py's VERBATIM invariant is expected red in every pack edited since the split (the generated header says so), and conserve.py carries the MOTIR-2969 / MOTIR-2980 marker-alignment class plus MOTIR-2934's count-numeral class. Quote what they say; do not patch the corpus to make them green.kind-bug.md is 78 lines; COMPRESSION.md § Decision 3's derived cap governs core.md alone (683 lines against it), which is one reason this rule lands in the kind pack rather than the always-on one.notes.html #309 (on origin/main, motir-meta PR #239): its Lesson + Prompt hint, which the wording above lifts.notes.html #306, and MOTIR-2966 / notes.html #308 — the family's first two members; #306's own Deliverable section states the promotion condition this card discharges.prompts/plan-rules/kind-bug.md (the landing pack) · prompts/plan-rules/phase-deepen.md ~50 (step 5, the mood clause) and ~124 (the NEGATIVE limb) · prompts/plan-rules/CORPUS-MAINTENANCE.md (RULES vs LESSONS; THE THIRD TIER — this rule's tells are structural, not lexical, so the mechanization trigger does not fire on it).