op-replan / op-sprint — lesson rows, the mirror, and the op-sprint routing slot
The motir-ai half of the operation overlays, and the card that closes the third routing hole.
The hole, measured on origin/main: CORPUS_ORDER carries exactly one op-replan segment — RECONCILE_EXISTING_NOT_DONE_WORK, which holds the whole referrer-sweep family — and no op-sprint entry at all, so PLANNING_RULE_PACK_ORDER's twelve names include no sprint overlay. The re-validate-the-sprint post-condition that every motir plan pass runs on the manual side reaches the shipped planner nowhere.
Opening the slot means landing content in it. A pack name with no segments composes to an empty string — routing that asserts nothing while looking complete. So either lift the restated op-sprint.md rule into a segment tagged op-sprint and add the name to PLANNING_RULE_PACK_ORDER, or record in the PR body why the routing stays as it is — the two dispositions the story's criterion allows, and no third.
A judgement worth making explicitly rather than by default: the sprint post-condition is about a live sprint's blocker closure, which the shipped planner may or may not be positioned to evaluate. Read resolvePlanningRulePacks and the operation overlay before deciding, and write the reasoning down either way. "It didn't seem to apply" left unwritten is how the hole got here.
The rest is the standard family shape. Lesson rows and the mirror in one PR: for each migrate row in RESTATEMENT.md's op-replan and op-sprint sections, add a BASE_LESSONS row or record a MERGED line naming the covering row's sourceRef. The referrer-sweep family is the one most likely to already be in the store — it has recurred often enough to have several entries behind it — so probe before adding.
Same two constraints as every lesson card here: no new sourceRef may carry a #N above CORPUS_HEAD = 356, and title / body / howToApply may name no repository, file, symbol, card key or date. Run pnpm lessons:generate-migration and commit the emitted delta.
Then the mirror and the baselines: locate the destination by probing the constant for the restated wording; refresh sharedPlanningRules.baseline.txt and read its diff; delete any planningRulePacks.test.ts assertion pinning a migrated phrase; refresh planningRuleRouting.baseline.txt if the cells changed; and refresh the register ceiling DOWNWARD — this is the last card in the chain, so the number it leaves is the ceiling the corpus lives under.
blocked_by the previous link in the motir-ai chain as well as its own source card.
Acceptance criteria
RECONCILE_EXISTING_NOT_DONE_WORKcarries the restated sweep family, and every migrated phrase probes to zero in the composed constant.PLANNING_RULE_PACK_ORDERgainsop-sprintwith at least one segment tagged to it inCORPUS_ORDER, and every legal cell selecting the sprint overlay resolves to a non-empty pack — or the PR body records why the routing stays as it is, naming what was read to decide.- Every migrate row in
RESTATEMENT.md'sop-replanandop-sprintsections has a disposition here: a newBASE_LESSONSrow or a MERGED line with its coveringsourceRefand reason. - No new
sourceRefcarries a#Nabove 356;CORPUS_HEADis unchanged; the totality, uniqueness, generic-rewrite and date guards pass unweakened. pnpm lessons:generate-migrationis run and its delta migration committed; the PR body names the directory and row count.- No existing segment changes its pack tag or its position in
CORPUS_ORDER. sharedPlanningRules.baseline.txtrefreshed with removed-word and added-word counts reported;registerCeiling.jsonrefreshed with the ceiling FALLING and before/after figures quoted;planningRuleRouting.baseline.txtrefreshed or explicitly reported unaffected.- The PR body quotes the final
cautionaryCeilingandprescriptiveAtCeilingand states that this is the lastmotir-aicard in the chain, so the numbers are the corpus's resting values. pnpm typecheck,pnpm format:checkandpnpm testare green, all four planning-rule suites included.- No file outside
motir-aiis changed.
Context refs
motir-aisrc/llm/planningRulePacks.ts—RECONCILE_EXISTING_NOT_DONE_WORK,CORPUS_ORDER,PLANNING_RULE_PACK_ORDER,resolvePlanningRulePacks,legalPlanningRuleCells, and thePlanningRuleOperationoverlay.motir-aitests/planningRuleRouting.test.ts+tests/fixtures/planningRuleRouting.baseline.txt.motir-aisrc/seed/lessons.base.ts·tests/lessonsBaseSeed.test.ts·scripts/generate-lessons-migration.ts.motir-aitests/planningRuleConservation.test.ts·planningRuleRegister.test.ts·planningRulePacks.test.ts, and the threescripts/refresh-*.ts.motir-metaprompts/plan-rules/RESTATEMENT.md·op-replan.md·op-sprint.md— read-only inputs.- MOTIR-3311 — the card that built the register ratchet this one leaves at its final setting.