Planning bug: MOTIR-3076 named one of its rule's two homes — mirror the mechanism/criterion check into `SHARED_PLANNING_RULES`
Repo: motir-ai (stated here rather than pinned — the project's pin domain currently refuses every connected repo; see MOTIR-3078 / MOTIR-3086).
MOTIR-3076 asked for a RULES-tier check and named its homes as plan-rules/kind-bug.md (or plan-rules/core.md) and notes.html #319. A standing planning RULE has two homes: this corpus, and SHARED_PLANNING_RULES in motir-ai/src/llm/planningRulePacks.ts, composed by BOTH fresh generation and re-planning (src/jobs/handlers/replan.ts). A rule that lands in one home teaches the manual planner and leaves the shipped planner planning the old way.
MOTIR-3076 shipped in motir-meta PR #276 (plan-rules/kind-bug.md's new final rule + core.md gate 17). This card is its mirror.
The gap is real, and it was measured
On motir-ai@origin/main (e06af92, 507-line planningRulePacks.ts), probes against a POPULATED baseline — criterion 69 · acceptance criterion 14 · mechanism 23 · hypothes 4 · defect 34:
owed under 0 · defensive 0 · whatever the cause 0 · only one mechanism 0 · only one candidate 0 · came back the other way 0 · worth satisfying 0 · menu of allowed 0 · permitted fixes 0.
The mirror is owed UNWEAKENED
Both checks from the narrowing rule pass: the shipped planner can EXPRESS the thing (it authors the hypothesis prose and the acceptance criteria that are this check's whole input, on both the generate and the re-plan path), and the trigger has no different door there. No clause needs excluding.
Where it goes
A NEW bare const in src/llm/planningRulePacks.ts tagged ['kind-bug', …] in CORPUS_ORDER, beside A_BUG_IS_PARENTED_BY_ITS_FINDING_STORY (the pack's only current member; the repeat-defect trigger sits in NO_SHORTCUTS, tagged phase-deepen — the packs may legitimately disagree with motir-meta about placement, so carry the WORDS and keep the mirror's own placement). The constants carry no PLANNING_RULE_ prefix and are not individually exported — do not name a symbol that does not exist.
Acceptance criteria
src/llm/planningRulePacks.tscarries a new rule constant, taggedkind-buginCORPUS_ORDER, stating: when a card says its mechanism is unknown and must be MEASURED, no acceptance criterion may name a repair that only ONE candidate mechanism implies — asked as a question of each criterion in turn (is this owed under every hypothesis I listed?), with the two dispositions (a follow-up card, or an explicitly non-gating defensive heading) and neither of them "drop it".- The text carries the TRIGGER and the TELL and no warrant: it must not match
/motir-core|motir-ai|open-core|notes\.html|MOTIR-\d/i(the per-rule guard attests/treeGeneration.test.ts:463) nor/plan-procedure|plan-rules|notes\.html|_shared\.md/(the corpus guard attests/treeGeneration.test.ts:616), nor any repo name (tests/planningRulePacks.test.ts§ GENERICITY, per pack AND over the whole corpus). The two guards live in DIFFERENT files; cite each where it is. - A test asserts the rule REACHES every cell that carries its host pack — the shape
tests/planningRulePacks.test.tsalready uses for the TERMINAL-card / TAKER-INHERITS / PROSPECTIVE limbs (cellsCarryingHost), not merely that the constant contains a string. - BOTH baselines are refreshed the deliberate way, and both diffs are read and reported.
the conservation baseline— AMENDED 2026-08-20, on the record, while running this card. This criterion originally namedscripts/refresh-planning-rules-baseline.tsalone. That is the TEXT axis; a rule ADDITION also moves the ROUTING axis, andscripts/refresh-planning-rule-routing-baseline.ts's own header states it "needs running when a rule is added, when a rule's pack tag inCORPUS_ORDERchanges, or whenresolvePlanningRulePackschanges which packs a cell loads." Naming one of two was the same shape of miss this card exists to correct, one level down. Measured: the text baseline red only onBASELINE.length === SHARED_PLANNING_RULES.length(the ADDED verdict passes), the routing baseline red on the cell-delivery comparison and the byte-identity check. - Invariant B still holds (packs re-joined = the corpus, no line in two packs, every non-blank line reachable from some cell).
Context refs
motir-ai/src/llm/planningRulePacks.ts—CORPUS_ORDER, the 33 rule constants,A_BUG_IS_PARENTED_BY_ITS_FINDING_STORY.motir-ai/tests/planningRulePacks.test.ts·motir-ai/tests/treeGeneration.test.ts·motir-ai/tests/planningRuleConservation.test.ts·motir-ai/tests/planningRuleRouting.test.ts.motir-ai/scripts/refresh-planning-rules-baseline.ts(text axis) ·motir-ai/scripts/refresh-planning-rule-routing-baseline.ts(routing axis).- motir-meta PR #276 — the wording to LIFT (
prompts/plan-rules/kind-bug.md, final section). - MOTIR-3076 — the motir-meta half.