Planning bug: a card's "what must NOT change" clause described a sibling's behaviour the sibling had already reversed
Filed by motir run MOTIR-3088 on 2026-08-19, about the planner-runbook card (MOTIR-3092). The correction is already applied — the card was amended in place and the runbook edit implements the corrected version; this record exists so the class is countable, not because anything is outstanding.
What the card said
MOTIR-3092's "What must NOT change" section opened with:
"The direct-write split stays. The in-run corrections — THE REPLAN ACTION, bug filing, status flips, the dispatch claim — remain DIRECT
create_work_item/update_work_item, becauserun.md's never-ask contract forbids a run that stops for approval."
Why it is false, read at origin/main
Every clause of it is a statement about Motir's own planner PROPOSES (MOTIR-3047), a sibling under the same epic — and that card is done. The shipped runbook reverses the claim in as many words:
prompts/_shared.md§ A PLANNING PASS PROPOSES: "⚠️ AND A RUN CREATES NO WORK ITEM DIRECTLY EXCEPT Abug", and "THE REPLAN ACTION run AUTONOMOUSLY bymotir run… PROPOSE, then STOP".prompts/run.md's ⚠️ block: "This REVERSES an earlier draft of this section, which said every write in this file stays on the direct tools. It does not."
The corrected split is three-way, not two: the non-creating writes stay direct (transition_status, add_comment, link_work_items between existing cards, move_to_sprint, the dispatch claim); a bug is the one creation a run still makes directly; everything else a run wants to ADD is a proposal, and the run stops.
Why nothing caught it
The grammar disarms the precondition check. The precondition-verification rule fires on phrases that ASSERT something exists. A "must NOT change" bullet is the same assertion in the opposite grammar: it asks the runner for nothing, so there is no precondition that presents itself as one. It reads as a fence.⚠️ SUPERSEDED 2026-08-20 at close-out — the bullet above overstates the gap, and the correction is the opposite verdict. The rule's presupposition limb fires on this clause verbatim: "a phrase that merely PRESUPPOSES X instead of asserting it … The definite article is a precondition claim" (
plan-rules/phase-deepen.mdstep 1, landed8b47f82on 2026-08-04), and the bullet opened "The direct-write split stays" — a definite article on a mechanism, followed by an indicative-present verb ("remain DIRECT") about a layer onegrepreads. Step 1 also enumerates "a SIBLING subtask's shipped output" by name, since5613440(2026-06-19). The limb is fifteen days older than the card (authored 2026-08-19T10:02Z) and sits in a pack every leaf deepen loads. So the check was loaded, applicable and lexically triggered, and was not run — a diligence miss, not a missing trigger. What the corpus genuinely lacked is only the bullet below: the DIRECTION of the failure.- The failure is silent and inverted. A falsified positive precondition stops a run — the surface it names is absent. A falsified negative one lets the run finish, having faithfully rebuilt what a sibling just removed, with the card's own words as the warrant.
donemade the sibling MORE invisible. MOTIR-3092 isblocked_byMOTIR-3090, not MOTIR-3047, and a satisfied edge holds nothing out of the ready set.readiness.readywastrueandvalidate_work_itemwas clean.- The window is the tell. MOTIR-3092 was authored at 10:00 on 2026-08-19 and claimed at 12:0x the same day — the window in which a sibling's landed change is least likely to have reached a card's prose.
Disposition (all done)
- The clause is amended in place on MOTIR-3092, with the date, the evidence, the corrected three-way split, and the original wording quoted inside the amendment.
- A comment on MOTIR-3092 records the finding.
notes.html#322 carries the lesson: a card's NEGATIVE clauses are precondition claims and get the same rung-2 discharge as the positive ones; when one names a sibling, read the sibling atorigin/main, and read adoneone hardest.
Close-out verification (2026-08-20, motir run MOTIR-3120)
Every disposition claim re-executed. Three held exactly; one did not, and one sentence of the analysis was wrong in the flattering direction.
Held.
- The amendment is in MOTIR-3092's DESCRIPTION, not merely in a comment — the check that most often catches a record card out. The "What must NOT change" bullet carries the dated amendment, the original wording quoted inside it, and the corrected three-way split.
- The finding comment is on the card (2026-08-19T12:17Z).
notes.html#322 is onorigin/mainand the citation is EXACT — no renumber drift, which is rare enough to say plainly: 352 entries, gapless,#322really is this lesson.- The close condition is met. motir-meta PR #258 merged 2026-08-19T16:03:56Z (
64f8705), and the shippedplan-procedure.mdimplements the CORRECTED clause, not the card's own words: "PROPOSE, then STOP (Yue, 2026-08-18 — this REVERSES an earlier draft that made the autonomous form a direct-write exception)".
Did NOT hold — the amendment stopped at the fence and left the CRITERION standing. MOTIR-3092's acceptance criterion 1 still read "…with the direct-write exceptions listed unchanged" — the same falsified premise, in the half a runner actually implements from, on a done card whose description is now a historical record of what was delivered. Amended in place, dated, original quoted. Its criterion 3 was likewise disposed of only in a comment; that disposition is now promoted into the description, and its residue (a live rehearsal after deploy) recorded as MOOT — the deployed tenant serves the tool and later live passes surfaced MOTIR-3188 / MOTIR-3193 through it. No follow-up card is owed.
Wrong in the flattering direction — the "why nothing caught it" bullet above, and it is the half a future rule would have been written from. Corrected on this card, on notes.html #322 in place (motir-meta PR #296), and in this card's explanationMd.
Promote verdict — LESSON, and the ground is stronger than the count
No sharpening is owed, on four grounds, recorded so nobody re-opens it:
- The governing clause covers it AND predates it by 15 days, in a pack every leaf deepen loads — the standing diligence-vs-trigger discriminator.
- The 0-grep is not evidence here.
must NOT change/negative clause/prohibition/stays as it isreturn 0 acrossprompts/plan-rules/*.md,prompts/run.mdandmotir-ai/src/llm/planningRulePacks.ts— against populated controls in the same sweep. That is the gate existing under a different vocabulary, not a totality gap. - The W-series has no claimant. MOTIR-1464's open widenings — W6 (MOTIR-2929), W7/W7b (MOTIR-2953), W8 (MOTIR-2962), W9 (MOTIR-2987), W10/W10b (MOTIR-3013) — none touches step 1's precondition enumeration, and the series head is W10. Filing W11 for a limb that already reaches would widen a trigger that fired.
- Register. The one genuinely new observation — a falsified NEGATIVE precondition closes green, while a falsified positive one stops the run — needs the incident to make sense and has one occurrence. That is the LESSON tier by definition, and #322 already carries it.
The residue named honestly, and deliberately NOT promoted: nothing keys on a sibling named in a card's PROSE, done, whose change landed after this card was authored. run.md's calendar rule keys on blocked_by and on design cards (MOTIR-3092's blocked_by was MOTIR-3090, not MOTIR-3047), and validate_work_item's reference advisory enumerates only NOT-done referents, so a done sibling is invisible to both. It is still not a gate: the precondition rule already obliges a rung-2 read of every sibling a card leans on, whatever that sibling's status. Promote only if it recurs.
Acceptance
- Nothing to build. This card is closable once MOTIR-3092's PR merges — the amendment and the
notes.htmlentry are its whole content, and both ride that PR.