(motir-ai) Mirror W7 + W7b into `SHARED_PLANNING_RULES` — a lifecycle VERB is a precondition, and a characterised set owes its histogram
Opened by Zhu Yue ·
Repo: motir-ai. ONE PR. The second home of MOTIR-2953's clause. plan-rules/*.md ⟷ SHARED_PLANNING_RULES is a PINNED MIRROR, so the pair is a boundary contract (two coordinated PRs, one card each), not a straddle — and a rule that lands in only one home is half-landed: the written playbook governs a motir run, the constant governs the shipped planner.
blocked_by MOTIR-2953 — the meta side settles the exact wording, and this card transcribes it. Written defensively either merge order.
What to change
src/llm/planningRulePacks.ts, the VERIFY_EVERY_PRECONDITION constant (line ~177 on origin/main) — the mirror of plan-rules/phase-deepen.md's precondition rule. Add the shipped-code limb of the BEHAVIOUR / WORKFLOW discharge, compressed to the constant's register (it is one long uppercase-emphasis paragraph, not prose with headings):
A LIFECYCLE VERB IS A PRECONDITION. When a card says the product opens / submits / closes / cancels / abandons / hands off / expires something, each verb is a claim about a SHIPPED OPERATION — discharge it exactly as a symbol: name the operation that performs it and the row it writes, and put the mapping on the card. A verb with no answer is a missing precondition wearing the clothes of a design decision. A missing NOUN blocks you; a missing VERB does not — there is always some moment you can hang the behaviour on, so the card ships green against tests written from its own words. The tell is a criterion enumerating three or more trigger names in one breath; real systems rarely have five symmetrical events. Then ask the question the enumeration hides: WOULD FIRING HERE DEFEAT THE THING BEING PROTECTED?
Acceptance criteria (W7)
VERIFY_EVERY_PRECONDITIONinsrc/llm/planningRulePacks.tscarries the lifecycle-verb limb — operation + row, the noun/verb asymmetry, the enumeration tell, and the defeat question.- The wording is the same rule as the one MOTIR-2953 lands in
phase-deepen.md, compressed to this constant's register — same trigger, same discharge, same tell. A mirror that narrows or widens the trigger is a drift, not a mirror. - A test in
treeGeneration.test.ts(or wherever the pack constants are asserted today) pins the new limb's distinctive phrase, so a future edit to one home fails loudly rather than silently desyncing. - The pack's ROUTING is unchanged — this widens what
phase-deepensays, never which passes load it. - No other pack constant is edited, so this cannot collide with MOTIR-2879 (mirrors W2–W4) or MOTIR-2930 (mirrors W6).
Context refs
src/llm/planningRulePacks.ts—VERIFY_EVERY_PRECONDITION, the mirror sink.src/llm/treeGeneration.ts/treeGeneration.test.ts— where the pack constants are composed and asserted.- MOTIR-2953 — the
motir-metahalf, which owns the exact wording.notes.html#301 and MOTIR-2944 — the incident and its planning bug.
W7b (folded 2026-08-19 from MOTIR-3071) — a CHARACTERISED set owes its histogram
The second clause MOTIR-2953 lands, mirrored into the same constant. Independently droppable alongside its meta half: drop this section and ACs 6–8 if W7b is dropped there.
Add to VERIFY_EVERY_PRECONDITION, in the same register:
A CHARACTERISED SET IS A SECOND MEASUREMENT. A count comes from a tool; "dominated by X" / "mostly Y" / "largely legacy" / "half of these are…" comes from reading the clearest example — and written adjacently, at one confidence, the reader inherits the confidence of the half that earned it. Discharge the characterisation separately: GROUP THE FINDINGS BY WHATEVER CARRIES THEM — the class, the file, the rule, the owner — and record the top rows beside the count, or write "not classified". A NAMED EXEMPLAR IS EVIDENCE THE CLASS EXISTS, NEVER THAT IT DOMINATES. This matters most where a characterisation warrants a HOLE: an exemption is priced against compliance, and a structural marker is inherited, so an element that lands under it stops being ruled on silently.
Acceptance criteria (W7b)
VERIFY_EVERY_PRECONDITIONcarries the characterised-set limb — the two-measurements split, the group-by-carrier discharge, the "not classified" escape, and the exemplar/dominates asymmetry.- Same-rule test as AC 2: the wording is MOTIR-2953's bullet compressed to this register, not a narrowed or widened trigger.
- The
treeGeneration.test.tspin of AC 3 covers this limb's distinctive phrase too.
Discussion
No comments yet.
Adding to this discussion signs you in on app.motir.co and brings you back to this request.