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.
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?
VERIFY_EVERY_PRECONDITION in src/llm/planningRulePacks.ts carries the lifecycle-verb limb — operation + row, the noun/verb asymmetry, the enumeration tell, and the defeat question.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.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.phase-deepen says, never which passes load it.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-meta half, which owns the exact wording. notes.html #301 and MOTIR-2944 — the incident and its planning bug.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.
VERIFY_EVERY_PRECONDITION carries the characterised-set limb — the two-measurements split, the group-by-carrier discharge, the "not classified" escape, and the exemplar/dominates asymmetry.treeGeneration.test.ts pin of AC 3 covers this limb's distinctive phrase too.