--- Status: Active Scope: Legacy extractor reduction (planner+composer SSOT) Related: - docs/development/current/main/design/coreplan-migration-roadmap-ssot.md - docs/development/current/main/design/coreplan-migration-done-criteria-ssot.md - docs/development/current/main/design/coreloop-composer-v0-v1-boundary-ssot.md - docs/development/current/main/phases/phase-29ae/README.md --- # Phase 29ap: Legacy extractor reduction (Step-E) Goal: Reduce legacy extractor fallbacks while keeping planner+composer as the SSOT path. Gate (SSOT): - `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` ## P0: Reduce legacy extractors (Pattern1/3) ✅ - Scope: - Remove Pattern1/3 extractor fallbacks in `single_planner`. - Remove Pattern3 JoinIR router entry so plan line is the only path. - Pattern1 JoinIR entry is retained for now (stdlib loops still rely on it). - Guardrails: - Outcome remains `Ok(None)` for non-matching cases. - No new logs or error strings. ## P1: Reduce JoinIR wrappers (Pattern6/7) ✅ - Scope: - Drop JoinIR-side Pattern6/7 wrapper modules (plan/composer is SSOT). - Keep routing through single_planner → composer adopt. - Guardrails: - No change to pattern selection or logs. ## P2: Pattern1 stdlib to_lower subset (Plan SSOT) ✅ - Scope: - Add char-map Facts/Planner/Normalizer path for StringUtils.to_lower (subset). - Add regression smoke for stdlib to_lower and wire it into JoinIR gate. - Keep Pattern1 in JoinIR legacy router table for stdlib join until a plan-based subset exists. - Guardrails: - No new logs or error strings. - Fallback remains `Ok(None)` when shape does not match. ## P3: Pattern1 stdlib join subset (Plan SSOT) ✅ - Scope: - Add array-join Facts/Planner/Normalizer path for StringUtils.join (subset). - Add regression smoke for stdlib join and wire it into JoinIR gate. - Remove Pattern1 from JoinIR legacy router table. - Guardrails: - No new logs or error strings. - Fallback remains `Ok(None)` when shape does not match. ## P4: JoinIR legacy table shrink (Pattern8 removal) ✅ - Scope: - Remove Pattern8 from `LOOP_PATTERNS` so plan/composer stays SSOT for normal loops. - Keep legacy table as a last resort for the remaining legacy entries. - Guardrails: - No change to logs or error strings. - Legacy routing remains a last-resort fallback. ## P5: Remove Pattern2 from JoinIR legacy table ✅ - Scope: - Remove Pattern2 (with break) from `LOOP_PATTERNS`. - Keep plan/composer as the only routing path for Pattern2. - Guardrails: - No change to logs or error strings. - Fallback remains `Ok(None)` for non-matching plan cases. ## P6: stdlib trim_start/trim_end subset (Pattern2BreakFacts) ✅ - Scope: - Add a conservative Pattern2BreakFacts subset for `trim_start`/`trim_end`. - Normalize `not is_whitespace(...)` into `is_whitespace(...) == false` in facts. - Restore quick smoke by ensuring stdlib loops are handled by plan/composer. - Guardrails: - No new logs or error strings. - Subset only: if shape deviates, return `Ok(None)`. ## P7: Pattern9 legacy table removal ✅ - Scope: - Pattern9 is not referenced by stdlib/quick/gate; only legacy pack SKIP remains. - Removed Pattern9 from JoinIR legacy table (plan/composer remains SSOT). - Guardrails: - No change to logs or error strings. ## P8: Remove Pattern4 legacy routing ✅ - Scope: - Remove Pattern4_WithContinue from `LOOP_PATTERNS`. - Add a minimal continue fixture + regression smoke under JoinIR gate. - Guardrails: - No change to logs or error strings. - Plan/composer remains the only routing path for Pattern4. ## P9: Pattern6_NestedLoopMinimal strict/dev gate ✅ - Scope: - Add nested-loop feature facts and project to canonical facts. - In strict/dev, emit a `Freeze::unstructured` tag to avoid legacy fallback. - Add a strict shadow smoke for nested minimal and wire it into the gate. - Guardrails: - Release/default behavior remains unchanged. - Gate stays green. ## P10: Pattern6_NestedLoopMinimal minimal CorePlan subset (strict/dev) ✅ - Scope: - Add nested minimal facts (outer+inner loop subset) and project into canonical facts. - Compose nested loop CorePlan v2 in strict/dev and emit shadow-adopt tag. - Update the strict smoke to require the new tag. - Guardrails: - Release/default behavior remains unchanged (legacy JoinIR path stays). - Gate stays green. ## P11: Pattern6_NestedLoopMinimal release adopt ✅ - Scope: - Non-strict/release adopts the nested minimal CorePlan v2 when facts are present. - Strict/dev tag and fail-fast behavior remain unchanged. - Legacy fallback remains for non-matches. - Guardrails: - No new logs/tags in release. - Gate stays green. ## P12: Remove JoinIR legacy loop table ✅ - Scope: - Delete legacy loop table routing from JoinIR router. - Remove legacy-only modules now that plan/composer is SSOT. - Guardrails: - No change to logs or error strings. - Gate stays green. ## Next (planned) - P13: Dead-code cleanup (warnings-only, no behavior change)