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-3180Done

(motir-ai) Mirror the design gate's NON-SELF limb into `SHARED_PLANNING_RULES` — `THE_DESIGN_GATE`'s (b) may not be the card itself

Repo — motir-ai. ONE PR. The mirror half of the two-homes rule for the design gate's NON-SELF limb. blocked_by the motir-meta card, which carries the full evidence — read it there; this card deliberately does not restate the argument, so the two homes cannot drift into two different justifications for one rule.

plan-rules/SHARED_PLANNING_RULES is a pinned mirror: a boundary-CONTRACT pair, TWO coordinated PRs, not a straddle to re-plan (run.md guard #5, second check). Same shape as MOTIR-2878MOTIR-2879, MOTIR-2913MOTIR-2914, MOTIR-2953MOTIR-2954.

The edit target, verified on origin/main d089c4a

constantTHE_DESIGN_GATE, src/llm/planningRulePacks.ts:210
its packkind-leaf-deepen (CORPUS_ORDER, :292)
present?✅ the gate is there in full — "Design BEFORE code: a UI code subtask is blocked_by a type: design subtask producing the three-file asset… if none exists, that is the NONE-exists case and the card needs its own type: design subtask."
the limb?absent. The constant nowhere says the type: design subtask must be a DIFFERENT card, so the shipped planner has exactly the degenerate reading the motir-meta card closes.

src/llm/treeGeneration.ts only RE-EXPORTS SHARED_PLANNING_RULES (export { SHARED_PLANNING_RULES } from './planningRulePacks.js') — nothing to edit there. SHARED_PLANNING_RULES itself is DERIVED (CORPUS_ORDER.map(([, text]) => text).join('\n'), :313), so the limb is edited into the named CONSTANT, never appended to a blob.

⚠️ One placement mismatch to expect, not to fix here. The limb's home is plan-rules/kind-leaf.md, while the mirror files this constant under kind-leaf-deepen. The two homes already disagree about that rule's pack (the same mismatch MOTIR-2879 recorded for the QUANTITY clause). Carry the WORDS, keep the mirror's existing placement, and do not re-pack anything as a side effect.

Acceptance criteria

  1. THE_DESIGN_GATE in src/llm/planningRulePacks.ts carries the NON-SELF limb in the same words as the motir-meta card's landed text — quoted from that PR's diff, not paraphrased from this card.
  2. It carries the DESIGN-axis criterion sweep with it (name what each criterion PRODUCES; a design-asset column plus a rendered-surface column means the design criterion is a CHILD) — the two are one limb and must not be split across the mirror.
  3. Any clause DROPPED from the motir-meta card during its review is dropped here too, and this card's body records which — a mirror carrying a rejected clause is worse than no mirror, because it looks authoritative.
  4. THE_DESIGN_GATE keeps its existing CORPUS_ORDER pack tag (kind-leaf-deepen); no rule is re-packed.
  5. A test in tests/planningRulePacks.test.ts asserts the limb's distinctive phrase is present, in the existing style of that file's per-rule assertions. Check tests/treeGeneration.test.ts and tests/planningRuleConservation.test.ts first so no duplicate assertion is added.
  6. Written defensively about merge order. Either PR may merge first; neither depends on the other's runtime behaviour.

Context refs

  • The motir-meta half — the blocker — carries the gap, the MOTIR-3154 instance and the reasoning in full.
  • MOTIR-3158 — the planning-bug record both halves discharge.
  • src/llm/planningRulePacks.ts :210 (THE_DESIGN_GATE), :292 (its CORPUS_ORDER row), :313 (the derived SHARED_PLANNING_RULES). ~500 lines at ~272 characters per line — read it with python; a naive backtick scan mis-terminates, because the rule text contains markdown code spans.
  • src/llm/treeGeneration.ts — the RE-EXPORT only.
  • tests/planningRulePacks.test.ts · tests/treeGeneration.test.ts · tests/planningRuleConservation.test.ts · tests/planningRuleRouting.test.ts — the assertion styles to copy and the duplicates to avoid.
  • MOTIR-2879 — the template for this card, including the placement-mismatch note.

Mirror fidelity record (AC 3)

Nothing was dropped from the motir-meta half during its review. MOTIR-3179 landed as motir-meta PR #274 with a single commit (b2724a9, 2 files, +97) and no review commits; its close-out comment records all six of its own acceptance criteria discharged in that one PR. So there is no rejected clause to withhold here, and the limb is carried whole.

Three referent adaptations, recorded rather than applied silently — all in the class MOTIR-2879 established when it dropped "the readiness cascade below carries""the readiness cascade carries": a pointer whose referent does not exist in the target corpus.

  1. (b)THE ⟨type: design⟩ SUBTASK. plan-rules/kind-leaf.md states the gate with lettered limbs (a) the design asset / (b) the design subtask; THE_DESIGN_GATE has no lettering. Adding it would mean REWRITING shipped gate text, which the corpus-conservation classifier reports as a fatal replace rather than a permitted addition — so the referent is named instead.
  2. Gate 1 already says …THE REPO-PIN GATE already says …. Not cosmetic: SHARED_PLANNING_RULES already contains a GATE 1, and it is THE GATE's look-first check — a different rule entirely, so a literal carry would have mis-pointed the reader. The quoted fragment itself is verbatim, and the method it quotes really is in this corpus, under A CARD THAT DECLARES ITS OWN SPLIT IN PROSE HAS NOT SPLIT — which the limb's next sentence names in full, so the pointer resolves.
  3. validate_work_item's … advisory, read at dispatch by the whole-array rule → a non-blocking ⟨likely-self-blocking-design⟩ ⟨shape⟩ advisory on the card, read at dispatch. Two absent referents: the corpus names no MCP tool anywhere (zero occurrences of validate_work_item / create_work_item / link_work_items / transition_status / claim_next_ready across all ~30 constants — it speaks of readiness, the claim / dispatch path, the board), and the whole-array rule lives in run.md, which this corpus does not mirror at all — pinned by MOTIR-2879's own test that SHARED_PLANNING_RULES carries no dispatch-guard advisory language. The advisory's distinctive key survives so it stays greppable, and both load-bearing halves are untouched: do not restate the detector here, and a detector that has not spoken is not a licence to seal.

Delivered by motir-ai PR #252 (subtask/MOTIR-3180-design-gate-non-self-limb).