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-3013

(motir-meta) W10 + W10b — a NON-REPRODUCTION obliges the MATRIX not the verdict, and a `shape` advisory's remedy is not always a criterion CUT (`run.md` + `log-bug.md`)

To Do
Description

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

clausefiled byregionfiles
W10the close-out of MOTIR-2998, 2026-08-18run.md's reproduce rule, between steps 2 and 3run.md · phase-deepen.md
W10bthe close-out of MOTIR-3108, 2026-08-20run.md guard #4's shape-advisory paragraph + its three restatementsrun.md · log-bug.md

Folded 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.

The gap — run.md's reproduce rule ends one step early

run.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.mdmatrix 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/*.mdmatrix · dimension · vary all 0 outside the corpus-maintenance files.
  • Baseline that the file is otherwise populated on this topic: 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.

The fixture, and why the near-cost is the argument

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.

The text to land (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.

The mirror decision — NO 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:

  1. Can the shipped planner EXPRESS the thing? src/llm/planningRulePacks.ts carries no run-execution rules at allworktree 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.
  2. Does the trigger have a DIFFERENT door in that home? The nearest candidate is a re-plan driven by a run reporting a falsified premise — but the widening decision is made by the runner before that report exists, so the planner sees the outcome of this rule, never its input.
  3. The half that DOES mirror is already carrieda card whose premise is inferred rather than watched says so is W9's third tell, and MOTIR-2989 was amended in the same pass to lift it. This card is the residue after that split, not an un-mirrored rule.

State this decision, with these greps, as a section of the PR body — a stated exclusion with evidence is auditable, silence is not.

W10b — a shape advisory's remedy is not always a criterion CUT, and the family's FOURTH member is named nowhere

The gap

validate_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 shape entry 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; and run.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:

membernamed in prompts/criterion indices in its payloadthe remedy
likely-ordering-violation3 files1CUT at that index
likely-repo-straddle3 files1CUT at that index
likely-self-blocking-design2 files2LIFT — the design criterion becomes its own card, the rest blocked_by it
likely-over-gate-sizing0noneSPLIT 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.

Why the existing widening does not reach it

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.

The text to land

In run.md guard #4's shape paragraph (:1009–1018), key the remedy on the PAYLOAD rather than on the family:

A shape entry 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 is blocked_by it (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 childless coding_agent card over the estimation gate). A shape entry 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.

The mirror decision for W10b — no motir-ai card, read off the repo

Same 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.

Acceptance criteria

  1. 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.
  2. 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).
  3. The PR body carries the mirror decision of The mirror decision above with its five grep counts against motir-ai origin/main, and states that MOTIR-2989 carries the mirrorable half.
  4. The corpus scripts (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.
  5. ORDERING: criteria 1–4 and 6–8 are all checkable on THIS card's own PR diff against 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):

  1. 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.
  2. The three short restatements point at that paragraph rather than restating one arm. 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).
  3. 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.

Deliberately NOT in this PR

  • Any 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.
  • A motir-ai mirror. Disposed of above with evidence, not deferred.
  • (W10b) Any restatement of the estimation gate itself. MOTIR-3108 settled that in its own explanation — "the fix cannot be a sharper sentence" — and the check shipped. W10b changes how a runner DISPOSES of the advisory, and touches no plan-rules/ pack.
  • (W10b) Waiting on MOTIR-3271. That card moves the minutes THRESHOLD; it does not change the payload's shape or the member's remedy, so this clause is true before and after it. Not wired as blocked_by.
  • (W10b) A co-located write worth naming: MOTIR-2962 (W8) also edits 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.
  • Re-opening W9's Deliberately NOT in this PR section. That section disposed of a 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.

Advisory disposition (validate_work_item, 2026-08-18) — no blocked_by is owed, and here is why per entry

Run at creation per run.md guard #5's CREATE-time validate rule. Four reference advisories, disposed of individually — silence is not an exclusion:

  • MOTIR-2987 (W9), likely-missing-edge from AC 5deliberate 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.
    • ⚠️ But they DO make CO-LOCATED writes, and that is worth naming rather than discovering in a conflict: W9's criterion 2 adds a pointer to 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.
  • MOTIR-2989, likely-missing-edge from AC 3deliberate 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.
  • MOTIR-2962 (W8) — context only, cited as the shape precedent for a W card landing in run.md. Not consumed.
  • MOTIR-2998 — the planning-bug record that filed this card. Provenance, not an input.

Known traps

  • COMPRESSION.conserve.py and verify.py are RED on main for reasons unrelated to any diffverify.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.
  • Branch prefix by DIFF: this diff is 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).

Context refs

  • MOTIR-2998 — the planning-bug record this lands, and notes.html #311 (motir-meta PR #244, open at filing): its Lesson's second paragraph is the wording above's source.
  • MOTIR-2994 — the fixture card, now amended on the record with the falsification; motir-core #2122 (merged 2026-08-18T14:15Z) carries the probe, the matrix table and the class guard.
  • 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).
  • MOTIR-2987 (W9) + MOTIR-2989 (its mirror) — the authoring half of the same planning bug, and the precedent for a W card's shape.
  • MOTIR-2962 (W8) — the nearest precedent for a W card landing in run.md rather than a plan-rules/ pack.

W10b's refs (added 2026-08-20):

  • MOTIR-3108 — the planning record whose close-out found the gap, with the full derivation; and MOTIR-3110, the card that shipped likely-over-gate-sizing.
  • MOTIR-3271 — the product bug in that member's minutes threshold. Independent of this clause; named so a reader does not fold the two.
  • MOTIR-3179 — the precedent: 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:756overGateSizing, 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.