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
144
planned
1,362
shipped

Motir · Work items

MOTIR-2972Done

The hosted planner still sweeps the PRE-taxonomy work-type list — `SHARED_PLANNING_RULES` offers `doc`/`spike`/`human`, which are unsettable, and never offers `chore`

Repo: motir-ai. One PR. Surfaced 2026-08-18 by the motir run MOTIR-2966 execution, under notes.html #27. This is the first MEASURED instance of the cross-repo drift MOTIR-2967 predicted — its "Why this is not covered by the other home" section says "nothing compares the two" and defers a cross-repo equality check (its disposition 2) as "worth its own card". This card is not that check; it is the drift that check would have caught.

The defect

src/llm/planningRulePacks.ts, const PLAN_ALL_SUBTASK_TYPES_AND_COMPOSITION (routed to the kind-leaf pack) carries, verbatim on origin/main @ d37fc53:

PLAN ALL SUBTASK TYPES — sweep the COMPLETE set, never just `code`. The set:
`code` · `design` · `test` · `manual`/`human` · `decision` · `doc`/`content` ·
`research` · `spike` · `review` · `deploy` · `copy` · `translate` · `legal` ·
`verification`.

That is byte-identical to the superseded span recorded at motir-meta's fixtures/kind-story.md#complete-set-pre-taxonomy — the list as it stood before MOTIR-2630 (5ba5c68, 2026-08-11) corrected it. Against the enum the product actually accepts (create_work_item's type parameter, and work-item-type-taxonomy.md Amendment 1's "As one list, for downstream code to be read against verbatim"):

in the mirror's setsettable?
docno — an alias of content, not a member
spikeno — an alias of research, not a member
humanno — an EXECUTOR, not a type
choremissing from the mirror — settable since 2.7.3

The consequence is the one the corrected rule states in its own words, and the one the ADR wrote Amendment 1 to fix: "A name that is not on this list cannot be set on a card, so a sweep that reaches for one plans work with nowhere to file it." A hosted planner sweeping this set can conclude a story needs a spike and then have nowhere to file it; it will never plan a chore at all. Nothing fails visibly — the card becomes content or research, and the authoring bar written for that work never applies to it.

Why it was missed — a referrer the ADR's own sweep did not list

work-item-type-taxonomy.md Amendment 1 closes with a table of every downstream consumer that owed an update — the Prisma enum (MOTIR-2632), the presentation map, tokens, i18n, the surfaces (MOTIR-2633), the design (MOTIR-2631), and "The playbook — chore's bar; doc and spike re-expressed as aliases" (MOTIR-2630). SHARED_PLANNING_RULES is not a row in that table. The sweep covered motir-core's surfaces and motir-meta's playbook and did not reach the hosted mirror, which is the copy a customer's planner is actually handed.

The compile-time guard the ADR relied on does not reach here either: workItemTypeMeta.ts is a total Record so the build fails until it covers the new members, and this list is prose inside a template literal — no type, no test, no guard.

Deliberately NOT decided here

Whether the mirror should carry the "This list is the ENUM, exactly" sentence MOTIR-2630 added alongside the list ("doc is an alias of content and spike an alias of research (two names, not two types), and human is an EXECUTOR, not a type. A name that is not on this list cannot be set on a card…"). It is what makes the correction self-explaining rather than a silent re-order, and it is a whole ADDED sentence, so it costs no baseline refresh. But the mirror is a selection (~13.6 % of the packs), deliberately terser than the packs, and COMPRESSION.measure.py-style rationing does not exist on this side to price it. Read the surrounding constants' density and decide; say which you chose and why.

Acceptance criteria

  1. pnpm vitest run tests/planningRuleConservation.test.ts is run and quoted BEFORE any edit, on a pristine origin/main worktree: it PASSES, which is what makes the red it goes in criterion 3 attributable to this card's edit and nothing else.
  2. PLAN_ALL_SUBTASK_TYPES_AND_COMPOSITION's set is replaced with the fourteen settable members in the ADR's canonical order — code · design · test · content · copy · translate · research · review · verification · decision · deploy · manual · legal · chore — and no other rule text in src/llm/planningRulePacks.ts is edited.
  3. The conservation baseline is refreshed on purpose via pnpm tsx scripts/refresh-planning-rules-baseline.ts, and the fixture's own diff is quoted in the PR body — old list above, new list below. That diff is the review surface MOTIR-2967 built the check to produce; a refresh whose diff is not read is the one use of that script its docstring names as defeating its purpose.
  4. A test asserts the corrected membership on the CONSTANT, not on the file: every one of the fourteen enum members appears in SHARED_PLANNING_RULES, and none of `doc`/, `spike`, `manual`/`human` appears in that rule's set. It must fail against the pre-fix text — show it failing, or write it so the failure is obvious by construction.
  5. pnpm vitest run tests/planningRuleConservation.test.ts tests/planningRulePacks.test.ts tests/treeGeneration.test.ts passes and is quoted. The full-suite number is CI's to report, not this card's.
  6. work-item-type-taxonomy.md Amendment 1's follow-up table gains a SHARED_PLANNING_RULES row naming this card — or the PR says why the ADR is left alone (it is in motir-core, so a row there is a SECOND repo and therefore a second card; naming it in the PR body and filing that card is the compliant answer).

Context refs

  • src/llm/planningRulePacks.tsPLAN_ALL_SUBTASK_TYPES_AND_COMPOSITION, and the /** lines 54–64 of the pre-split constant → kind-leaf */ comment above it.
  • tests/planningRuleConservation.test.ts + tests/helpers/corpusConservation.ts + tests/fixtures/sharedPlanningRules.baseline.txt + scripts/refresh-planning-rules-baseline.ts — the check this edit will trip, and the deliberate act that clears it (MOTIR-2967, PR moooon-B-V/motir-ai#243).
  • READ-ONLY, in other repos: motir-core docs/decisions/work-item-type-taxonomy.md Amendment 1 (§1 member list, the canonical-order table, the follow-up table this is missing from); motir-meta prompts/plan-rules/kind-story.md's corrected rule and fixtures/kind-story.md#complete-set-pre-taxonomy, which holds the mirror's current text as a superseded span.