# Phase 29ai: Plan/Frag single-planner (Facts SSOT) Goal: pattern 名による分岐を外部APIから消し、Facts(事実)→ Plan → Frag の導線を 1 本に収束させる(仕様不変)。 ## P0: LoopFacts SSOT + Single Planner skeleton - 指示書: `docs/development/current/main/phases/phase-29ai/P0-LOOPFACTS-SSOT-SINGLE-PLANNER-INSTRUCTIONS.md` - 追加される骨格(未接続・仕様不変): `src/mir/builder/control_flow/plan/{facts,normalize,planner,emit}/` ## P1: Planner candidate-set + Freeze SSOT - 指示書: `docs/development/current/main/phases/phase-29ai/P1-PLANNER-CANDIDATES-FREEZE-SSOT-INSTRUCTIONS.md` - ねらい: `Ok(None)` / `Err(Freeze)` の境界と “候補集合→一意化” をSSOT化(未接続のまま、仕様不変) ## P2: SSOT Registry + Freeze Taxonomy(docs-only) - 指示書: `docs/development/current/main/phases/phase-29ai/P2-SSOT-REGISTRY-FREEZE-TAXONOMY-INSTRUCTIONS.md` - ねらい: “真実の所在” と Freeze 分類を1枚に固定して、後続実装の迷子を防ぐ(仕様不変) - SSOT Registry: `docs/development/current/main/design/planfrag-ssot-registry.md` - Freeze taxonomy: `docs/development/current/main/design/planfrag-freeze-taxonomy.md` ## P3: Typed Freeze + CandidateSet implementation(code) - 指示書: `docs/development/current/main/phases/phase-29ai/P3-TYPED-FREEZE-CANDIDATESET-IMPLEMENTATION-INSTRUCTIONS.md` - ねらい: Planner の契約を型/候補集合で固定(Facts 未実装の間は未到達、仕様不変) ## P4: First LoopFacts(Pattern6 scan-with-init) - 指示書: `docs/development/current/main/phases/phase-29ai/P4-FIRST-LOOPFACTS-PATTERN6-SCAN_WITH_INIT-INSTRUCTIONS.md` - ねらい: Facts→Planner を 1 ケースだけ前進(未接続のまま、仕様不変) ## Verification (SSOT) - `cargo build --release` - `./tools/smokes/v2/run.sh --profile quick` - `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`