# Phase 122: StepTree→Normalized(if-only 実生成 / dev-only) ## 目的 - Phase 121 で導入した StepTree→Normalized の “shadow変換(contract-only)” を一段進め、if-only を対象に Normalized JoinModule(env+継続)を実生成する。 - 既定挙動は不変:`joinir_dev_enabled()` のときだけ生成・検証し、本番経路の出力/動作は変えない。 - mismatch は strict のときだけ Fail-Fast(`freeze_with_hint`、hint必須)。 ## Scope - 対象: if-only(loopなし) - 非対象(strictではcap不足でFail-Fast): - Loop / Break / Continue(Phase 112/121 の guard 方針に従う) ## 実装方針(SSOT) - 入力SSOT: `StepTree` + `StepTreeFacts` + `StepTreeContract` - facts/contract は再解析しない(変換箱が AST を再走査して “推測” しない) - 生成SSOT: “env + 継続” に統一し、PHI を直接扱わない - merge: `join_k(env)` への tail-call - env layout: `writes` で宣言された変数のみ - 失敗時: - dev-only: 理由ログ(タグ + 1行) - strict: `freeze_with_hint`(1行hint必須、空hintは禁止) ## 受け入れ基準 - `cargo test --lib` が PASS - Phase 121 の既存 smokes が退行しない - Phase 122 の dev-only 検証で mismatch が出ない(strict で Fail-Fast するなら、その時点で修正が必要) ## 関連 - Phase 119–121: StepTree SSOT + shadow parity - `docs/development/current/main/design/control-tree.md` - `docs/development/current/main/phases/phase-121/README.md` - StepTree 実装: - `src/mir/control_tree/step_tree.rs` - `src/mir/control_tree/step_tree_facts.rs` - `src/mir/control_tree/step_tree_contract_box.rs`