Skip to content

moooon

Motir

Vibe your whole project. Bring an idea — Motir's three AI layers plan it, track it, and ship it, end to end. You're looking at Motir, built in Motir.

  • Vibe Project
  • Open Source
  • AI Agent
  • AI Loop
1
requests
0
upvotes
145
planned
1,361
shipped

Motir · Work items

MOTIR-3186Done

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

  1. src/llm/planningRulePacks.ts carries a new rule constant, tagged kind-bug in CORPUS_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".
  2. 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 at tests/treeGeneration.test.ts:463) nor /plan-procedure|plan-rules|notes\.html|_shared\.md/ (the corpus guard at tests/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.
  3. A test asserts the rule REACHES every cell that carries its host pack — the shape tests/planningRulePacks.test.ts already uses for the TERMINAL-card / TAKER-INHERITS / PROSPECTIVE limbs (cellsCarryingHost), not merely that the constant contains a string.
  4. BOTH baselines are refreshed the deliberate way, and both diffs are read and reported. the conservation baselineAMENDED 2026-08-20, on the record, while running this card. This criterion originally named scripts/refresh-planning-rules-baseline.ts alone. That is the TEXT axis; a rule ADDITION also moves the ROUTING axis, and scripts/refresh-planning-rule-routing-baseline.ts's own header states it "needs running when a rule is added, when a rule's pack tag in CORPUS_ORDER changes, or when resolvePlanningRulePacks changes 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 on BASELINE.length === SHARED_PLANNING_RULES.length (the ADDED verdict passes), the routing baseline red on the cell-delivery comparison and the byte-identity check.
  5. 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.tsCORPUS_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.