--- 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 last resort for Pattern2/4/9 only. - Guardrails: - No change to logs or error strings. - Legacy routing remains a last-resort fallback. ## Next (planned) - P5: Router pattern-name branching reduction (planner outcome + composer SSOT) - P6: Facts/Feature expansion if needed