Repo: motir-meta. One PR. Type: content · Executor: coding_agent. Filed 2026-08-18 by the close-out of MOTIR-2998, the planning-bug record whose run-side half this card lands. Its authoring-side half is MOTIR-2987 (W9), already filed and amended in the same pass.
No motir-ai mirror card is owed. That verdict is READ OFF THE REPO, not reasoned to — see The mirror decision below, which carries the greps.
Fold history
clause filed by region files W10 the close-out of MOTIR-2998, 2026-08-18 run.md's reproduce rule, between steps 2 and 3run.md·phase-deepen.mdW10b the close-out of MOTIR-3108, 2026-08-20 run.mdguard #4'sshape-advisory paragraph + its three restatementsrun.md·log-bug.mdFolded rather than filed fresh because the FILE overlaps (
prompts/run.md), and two cards on one file is two conflicting pull requests. Different regions of one file is a rebase, not a second card. Re-sized 2 → 3 pts / 30 → 50 min, still inside the estimation gate's agent-run ceiling.Each clause is independently droppable. W10 is criteria 1–2; W10b is criteria 6–8. Dropping either leaves the other coherent, and criterion 5 (ORDERING) covers both.
run.md's reproduce rule ends one step earlyrun.md's a bug card's FIRST deliverable is the REPRODUCTION rule is four steps. Step 2 is a classifier:
It will not reproduce ⇒ ONE command decides which of two opposite findings you have.
git log <their base>..HEAD -- <the path>— empty ⇒ … never reproduced; non-empty ⇒ read those commits before writing a line.
Step 3 then says a falsified premise is REPORTED, the standing scope shipped, the card amended, the planning bug filed. Every one of those is about DISPOSING of the premise. Nothing in the rule says what a non-reproduction OBLIGES you to do next, and the disposition steps read as a complete set precisely because they are exhaustive over the premise — which is not the same thing as exhaustive over the defect.
Measured on origin/main, 2026-08-18:
grep -ioc on prompts/run.md — matrix 2, widen 2, cell 1, dimension 0, vary 0. None of the five hits is this subject: line 415 is a permission MATRIX in the design-blocker fixture, line 988 the E2E matrix a docs branch skips, line 428 the inline-edit "own cell", and both widens are W1's advisory sentence.grep -ioc on prompts/plan-rules/*.md — matrix · dimension · vary all 0 outside the corpus-maintenance files.reproduc 9, premise 4, falsif 4, null hypothesis 1. The zero stands against a populated neighbourhood, which is what makes it a gap rather than an absence of the subject.MOTIR-2994 asserted a scheduler mechanism read off one CI log line. Its motir run built the probe the card asked for and it came back green on every cell the card named — 4–30 events, same key and distinct keys, serial / concurrent / batched, with and without timeout, ~20 trials, the error string 0 times — and step 2's git log excluded "fixed in between" cleanly (inngest-cli pinned at 1.27.0 on both sides, defineJob.ts byte-identical, no commits).
At that point the rule is fully discharged and the honest reading is "never reproduced". A run stopping there closes correctly by every step of the existing rule.
The real defect was one cell away, in a dimension the card never drew. An unresolvable debounce key does not skip the debounce, it MERGES: six events whose key expression names a field none of them carries produced ONE run, losing five silently. That is sufficient to explain the E2E's 3 runs where 4 required on its own, and MOTIR-2902 was using exactly such a key. The run found it only because it varied three dimensions the card had not named — delivery shape, key resolvability, inter-event gap — and two of the three returned findings.
So the cost this rule prevents is not wasted work; it is the opposite. A green probe invites "premise false, nothing to do", and that sentence is both defensible and, here, one experiment short of a silent-work-loss defect in shipped code. The most dangerous moment in a bug card's life is the minute after its premise is disproved, because that is when the card looks finished and the defect is still there.
prompts/run.md)Place it as a new step in the a bug card's FIRST deliverable is the REPRODUCTION rule — between the current steps 2 and 3, so it is read before the disposition steps rather than after them (a limb appended after "report it" is a limb nobody reaches). Renumber; the existing steps 3 and 4 are unchanged in wording.
⚠️ 3. A NON-REPRODUCTION OBLIGES THE MATRIX, NOT THE VERDICT — the card's premise names ONE cell, and you have just proved that cell empty (
notes.html#311; MOTIR-2994). Step 2 tells you WHICH non-reproduction you have; it does not tell you that you are finished, and the two feel identical from inside a green run. A card asserting a mechanism has, by asserting it, chosen the dimensions worth varying — and it chose them from the same evidence that turned out not to support the mechanism. So the dimensions it did NOT name are exactly the ones nothing has looked at, and they are unexamined because the card was confident, not despite it.
- Before concluding anything, WRITE DOWN the axes the card's premise implicitly fixes, and vary each one. They are cheap to enumerate because they are the parameters of the thing you just drove: for a scheduler — delivery shape (serial / concurrent / batched), key resolvability, inter-event gap, option presence; for a query — cardinality, null-ness, ordering, isolation level; for a UI — viewport, empty vs populated, first paint vs re-render. The card named the values it happened to observe; the axis is what generalises them.
- A green cell is a MEASUREMENT of that cell, never a verdict on the defect. The observation that produced the card is still unexplained — somebody saw a run go missing, a row settle wrong, a page 500 — and "the mechanism the card named is not it" explains none of it. Ship the finding that survives, but do not report the defect as absent until something else accounts for the original observation, or you say plainly that nothing does.
- Put the MATRIX in the PR body, with its zeros. The cells that returned the contracted result are what make the one that did not credible, and they are the evidence the next reader needs in order not to re-run them. A matrix reported as a sentence ("could not reproduce") is the same claim with the evidence deleted.
- The exit is honest either way. "Widened to N dimensions; the original observation remains unexplained" is a legitimate close and a good one — it hands the next run the axes already ruled out. What is not legitimate is a card closed as premise false whose original observation nobody has accounted for, because that is indistinguishable, at the next read, from a defect that was fixed.
And add a one-clause pointer from plan-rules/phase-deepen.md's NEGATIVE limb — its last bullet already ends "run.md's reproduce-at-the-reporter's-base rule is this limb's run-time half" — so that it names this step too. One clause, no restatement.
motir-ai card, and here is why, from the repo[[planning-rule-has-two-homes]]'s obligation is real and its own guidance is that "no mirror needed" is a verdict read off the repo, never reasoned to. Both checks were run against motir-ai origin/main:
src/llm/planningRulePacks.ts carries no run-execution rules at all — worktree 0, PR body 0, REPRODUCTION 0, does not reproduce 0, discriminat 0. Its single matrix hit is a design-structure sentence and its single reproduc hit is the artifact-obtainable limb, which is an AUTHORING obligation (a card asserting a defect in a published artifact must obtain it). The constant is composed into plan GENERATION and RE-PLAN prompts; there is no probe, no PR and no green cell for this rule's trigger to fire on.State this decision, with these greps, as a section of the PR body — a stated exclusion with evidence is auditable, silence is not.
shape advisory's remedy is not always a criterion CUT, and the family's FOURTH member is named nowherevalidate_work_item's kind: 'shape' family has four members on motir-core origin/main (9aca2850).
The corpus names three of them and disposes of all four with one sentence:
"A
shapeentry is a criterion to CUT at the 1-based index it returns." —prompts/log-bug.md:182,prompts/run.md:1096,prompts/run.md:1164; andrun.md:1017's longer form, "names a criterion of YOUR OWN card that is mis-shaped and returns the 1-based index to cut at".
Measured on motir-meta origin/main (75d550b), git grep -c -a … -- prompts/, against the code each
member actually implements:
| member | named in prompts/ | criterion indices in its payload | the remedy |
|---|---|---|---|
likely-ordering-violation | 3 files | 1 | CUT at that index |
likely-repo-straddle | 3 files | 1 | CUT at that index |
likely-self-blocking-design | 2 files | 2 | LIFT — the design criterion becomes its own card, the rest blocked_by it |
likely-over-gate-sizing | 0 | none | SPLIT the card — THE REPLAN ACTION, not a line to cut |
The zero stands against a populated control in the same sweep, which is what makes it a gap rather than an
absence of the subject. And the code says the distinction out loud — lib/dto/workItems.ts on the fourth
member: "The other criterion members report ONE number because their remedy is a cut … This one's remedy is a
LIFT." The corpus names one remedy where the product implements three.
run.md guard #4's THE FAMILY LIST IS NOT THE TEST — the QUESTION is paragraph (MOTIR-2878's W1) is
explicitly total: "An entry whose family you do not recognise is disposed of on that question and never
skipped for being off a list." But the question it asks partitions every entry two ways — "does it name
something the card CONSUMES, or something the card SAYS wrongly?", the first an edge to verify and the second
a criterion to cut. A sizing advisory is neither: it is about what the card IS, not what it says, and
there is no criterion to cut. A rule that claims totality and offers two arms for three cases sends a runner
confidently to the wrong remedy — the same failure class W1 was written to close, one grain finer.
In run.md guard #4's shape paragraph (:1009–1018), key the remedy on the PAYLOAD rather than on the
family:
A
shapeentry names a defect in what the card ITSELF says or is, and the entry's own payload says which remedy it carries — count its criterion indices, do not match its name against a list. ONE index ⇒ CUT there, in this run and on the record (likely-ordering-violation,likely-repo-straddle). TWO ⇒ LIFT: the first criterion becomes its own card and what is left isblocked_byit (likely-self-blocking-design). NONE ⇒ the defect is the card's SHAPE and not a line of it, and the remedy is to SPLIT — THE REPLAN ACTION, never a criterion cut (likely-over-gate-sizing, a childlesscoding_agentcard over the estimation gate). Ashapeentry is never a substrate to go looking for.
And the three short restatements (log-bug.md:182, run.md:1096, run.md:1164) point at that paragraph
instead of restating one arm of it — "a shape entry is a defect in the card itself; dispose of it by its
payload's index count, per run.md guard #4". One pointer each, no fourth copy to drift.
motir-ai card, read off the repoSame two checks as W10's, re-run against motir-ai origin/main on src/llm/planningRulePacks.ts:
likely-over-gate-sizing 0, likely-repo-straddle 0, likely-ordering-violation 0,
likely-self-blocking-design 1, shape 31. The pack carries no advisory-DISPOSITION rule for any
member — disposition is a run-time act on a card the planner has already authored — so there is nothing to
mirror. The single likely-self-blocking-design hit is an AUTHORING clause (do not seal a card as its own
design blocker), not a disposition one, and it is unaffected.
prompts/run.md's reproduce rule carries the step above, inserted BETWEEN the current steps 2 and 3 and renumbered, naming: the axes-the-premise-fixes enumeration, a green cell is a measurement not a verdict, the original-observation-still-unexplained test, the matrix-in-the-PR-body mandate, and the honest widened-and-still-unexplained exit. grep -c 'MATRIX' prompts/run.md ≥ 1 where the word appears 0 times in this sense today.prompts/plan-rules/phase-deepen.md's NEGATIVE limb names the new step in its existing run-time-half clause — one clause added, nothing restated. The cross-reference is written in BOTH directions (the new step already names the limb in its own text).motir-ai origin/main, and states that MOTIR-2989 carries the mirrorable half.prompts/plan-rules/COMPRESSION.conserve.py, verify.py, COMPRESSION.measure.py) are run and their verdicts quoted in the PR body. A script red on origin/main BEFORE this diff is REPORTED, not chased — see Known traps.motir-meta's origin/main at merge. None reads on post-merge state, none reads on MOTIR-2987's PR, and none reads on a motir-ai change.W10b (criteria 6–8, folded 2026-08-20):
prompts/run.md guard #4's shape paragraph keys the remedy on the entry's criterion-index count — one ⇒ CUT, two ⇒ LIFT, none ⇒ SPLIT — and names likely-over-gate-sizing as the no-index member whose remedy is THE REPLAN ACTION rather than a criterion cut.git grep -c -a 'criterion to CUT at the 1-based index it returns' -- prompts/ returns 0 afterwards, where it returns 3 today (log-bug.md:182, run.md:1096, run.md:1164).git grep -c -a 'likely-over-gate-sizing' -- prompts/ is ≥ 1, where it is 0 today against a populated control (likely-repo-straddle 3 files, likely-ordering-violation 3, likely-self-blocking-design 2). The PR body carries that before/after sweep.kind-bug.md change. The AUTHORING half — a defect card's mechanism owes the discriminating measurement — is MOTIR-2987's whole deliverable, in a different pack, and this card must not race it. The two touch different files in the same repo and can merge in either order.motir-ai mirror. Disposed of above with evidence, not deferred.plan-rules/ pack.blocked_by.prompts/run.md, in the decision-close-out region — a different paragraph, so a rebase rather than a dependency. Recommended order: whichever is ready first; the second rebases its clause on.run.md backstop by observing that step 2 "already covers the RUN side". That is correct about CLASSIFICATION and silent about OBLIGATION — this card narrows the disposition, it does not contradict it, and W9's own text was amended in the same pass to point here.validate_work_item, 2026-08-18) — no blocked_by is owed, and here is why per entryRun at creation per run.md guard #5's CREATE-time validate rule. Four reference advisories, disposed of individually — silence is not an exclusion:
likely-missing-edge from AC 5 — deliberate exclusion. AC 5 names it only to say this card's criteria do NOT read on its PR. The two land in DIFFERENT files of the same repo (plan-rules/kind-bug.md vs prompts/run.md) and neither consumes the other's output.
phase-deepen.md's NEGATIVE limb, and this card's criterion 2 adds a different clause to the same limb. They are different writes to one paragraph, not the same write, so op-replan.md's no two cards may own the same write is satisfied — but whichever merges SECOND rebases its one clause onto the other's, and must not replace it. Recommended order: W9 first (it is high, filed earlier, and the larger change); this card's clause then names the rule W9 landed. Not wired as blocked_by because the order is a convenience, not a dependency — either order produces the correct file after a rebase.likely-missing-edge from AC 3 — deliberate exclusion. AC 3 requires the PR body to state that 2989 carries the mirrorable half. That is a claim about 2989's SCOPE, which is verifiable today (it was amended on 2026-08-18 to name the third tell), not about its completion. Nothing here waits on that card shipping.run.md. Not consumed.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 (its 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.run.md is not the capped file. COMPRESSION.md § Decision 3's derived cap governs core.md; run.md is a command runbook and takes the step at full length.prompts/** Markdown only, and the card's targetRepo IS motir-meta — so docs/MOTIR-<id>-<slug>, and the id goes in the branch and the title (the narrowed PR-title rule: the PR is the deliverable, so the merge SHOULD flip the card).notes.html #311 (motir-meta PR #244, open at filing): its Lesson's second paragraph is the wording above's source.prompts/run.md — the a bug card's FIRST deliverable is the REPRODUCTION rule (Build/serve rules) is the insertion point; its steps 2–4 are quoted above.prompts/plan-rules/phase-deepen.md — the NEGATIVE limb and its existing run-time-half clause (criterion 2's target).run.md rather than a plan-rules/ pack.W10b's refs (added 2026-08-20):
likely-over-gate-sizing.likely-self-blocking-design's corpus limb, landed in plan-rules/kind-leaf.md the same week. That the fourth member got its limb and this one did not is what makes the zero a gap rather than a decision.motir-core lib/dto/workItems.ts :1488 / :1500+ — the two DTO comments distinguishing a CUT from a LIFT; lib/workItems/proseVsGraph.ts:756 — overGateSizing, which returns no criterion index. Read on origin/main 9aca2850.prompts/run.md:1009–1018 (guard #4's shape paragraph, the insertion point) · :1096 · :1164 · prompts/log-bug.md:182 — the three restatements.