The PHASE axis, applied — the framing takes a phase, and `core` splits on what a session can DISCHARGE
MOTIR-3891 cut the rule corpus on SUBJECT and never on ACT. This story adds the second test and applies it to the two tiers that axis has never touched: the prompt FRAMING, and core.
The model, as decided
A rule belongs to the phase whose TOOL SURFACE can discharge it.
A DEEPEN session's whole surface is DEEPEN_PHASE_TOOLS — deepen_node, validate_plan, log_planning_mistake, log_planning_bug. It writes ONE body and stops. It cannot propose a card, split one, re-parent one, reconcile an existing one, or wire an edge. So a rule discharged by propose_node / modify_node / remove_node / link_work_items is unreachable at deepen whatever its subject — and the subject test cannot see that, because such a rule is usually about something every card has.
The evidence, measured on MOTIR-3891's own output
A translate deepen cell is 117,494 chars, of which 504 are about translation. The rest:
| tier | chars | share |
|---|---|---|
core | 51,715 | 44.0% |
phase-deepen | 65,271 | 55.6% |
type-translate | 504 | 0.4% |
1. The framing is not phase-aware at all. buildGenerationSystemPrompt takes a mode, not a phase, so every deepen session gets 5,161 chars of skeleton instruction — THE COMET SHAPE, the 5-step TITLES-FIRST SKELETON, THE FIRST LEVEL IS EPICS — naming propose_node, complete_level and drill_into, three tools the session does not have. The prompt contradicts the tool surface.
2. core is exempt from every axis, including phase. ≈27KB of it is skeleton-only: RECONCILE_EXISTING_NOT_DONE_WORK (15,383, discharged by modify_node / remove_node), THE_GATE (5,861, "BEFORE YOU PROPOSE ANYTHING"), A_CARD_THAT_DECLARES_ITS_SPLIT (5,376), AUTHOR_ONE_CARD_AT_A_TIME (510).
3. phase-deepen holds skeleton rules too. THE_DESIGN_GATE (5,292) is a card and an edge from end to end. It landed there because MOTIR-3897 needed the minimal superset available when kind-leaf-deepen was retired — correct under the subject test, and the reason the subject test is not enough.
⚠️ AMENDED 2026-08-29 (MOTIR-3918's own run) — the "5,161 chars" figure above is WRONG, and it UNDERSTATES the defect. It was measured by cutting the composed system message at the first occurrence of
SHARED PLANNING RULES— which is a CROSS-REFERENCE inside the framing ("…all in the SHARED PLANNING RULES below",RUNBOOK_PROMPToffset 5,217), not the start of the rule section. The command was right and the cut point was not: a denominator swap of exactly the shapecore.mdgate 2's QUANTITY limb names.Re-measured from the constants: the framing is 10,211 chars (the full deepen system message 127,705 minus the rule section 117,494), made of
RUNBOOK_PROMPT6,997 +GENERATION_FEWSHOT2,742 + the mode note and separators ≈472. Of that, the SKELETON-only portion is ≈8,416:
section chars RUNBOOK_PROMPT— THE COMET SHAPE610 RUNBOOK_PROMPT— THE ONBOARDING WORKFLOW (the 5-step TITLES-FIRST SKELETON)2,819 RUNBOOK_PROMPT— THE FIRST LEVEL IS EPICS747 RUNBOOK_PROMPT— THE ONBOARDING GROUNDING (the catalog epics are carved from)1,098 RUNBOOK_PROMPT— the RECONCILE half of YOUR RECONCILE + CAPTURE TOOLS≈400 GENERATION_FEWSHOT— "A level is authored skeleton-first (titles + edges, no prose)"2,742 The claim the figure supported is unchanged and is now larger: a deepen session is handed instructions it cannot follow. Planning bug MOTIR-3926.
Acceptance criteria
- A DEEPEN session's system message — framing INCLUDED — names no tool absent from
DEEPEN_PHASE_TOOLS, and carries no rule whose discharge requires one. Asserted over every legal deepen cell on the composed string, not reviewed by eye. - A SKELETON session's message carries the skeleton framing and the skeleton tiers unchanged; the phase split MOVES rules and deletes none.
- No rule stops firing: for every clause that moves, the routing baseline shows the cells carrying it are a superset of the cells where its situation can occur.
- The composed size of every cell is measured before and after and stated in the PR — BOTH directions. A deepen cell falling while a skeleton cell rises by the same amount is the expected shape of a phase cut, and a report showing only the fall has measured half of it.
- Text is unchanged except where a segment is DIVIDED; each division is proved by a word-diff over its parts showing zero runs lost, and the conservation and register baselines are refreshed deliberately with their diffs reviewed.
motir-metais NOT mirrored by this story. MOTIR-3907 carries this cut AND MOTIR-3891's outstanding SUM cut as one pass over the same two files,blocked_bythis story.
Context refs
motir-aisrc/llm/treeGeneration.ts—buildGenerationSystemPrompt,SKELETON_PHASE_TOOLS,DEEPEN_PHASE_TOOLS,runDeepenSession.motir-aisrc/llm/planningRulePacks.ts—CORPUS_ORDERand thecore/phase-*tiers.- MOTIR-3891 — the subject cut this completes; MOTIR-3892 — the SEGMENT unit that makes any of it addressable.
- MOTIR-3907 — the single
motir-metamirror, deliberately after this story.