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 set | settable? |
|---|---|
doc | no — an alias of content, not a member |
spike | no — an alias of research, not a member |
human | no — an EXECUTOR, not a type |
chore | missing 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
pnpm vitest run tests/planningRuleConservation.test.tsis run and quoted BEFORE any edit, on a pristineorigin/mainworktree: it PASSES, which is what makes the red it goes in criterion 3 attributable to this card's edit and nothing else.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 insrc/llm/planningRulePacks.tsis edited.- 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 surfaceMOTIR-2967built 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. - 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. pnpm vitest run tests/planningRuleConservation.test.ts tests/planningRulePacks.test.ts tests/treeGeneration.test.tspasses and is quoted. The full-suite number is CI's to report, not this card's.work-item-type-taxonomy.mdAmendment 1's follow-up table gains aSHARED_PLANNING_RULESrow naming this card — or the PR says why the ADR is left alone (it is inmotir-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.ts—PLAN_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-coredocs/decisions/work-item-type-taxonomy.mdAmendment 1 (§1 member list, the canonical-order table, the follow-up table this is missing from);motir-metaprompts/plan-rules/kind-story.md's corrected rule andfixtures/kind-story.md#complete-set-pre-taxonomy, which holds the mirror's current text as a superseded span.