# Phase 125 P2-P5 Implementation Feedback ## 完了状況 ### P0: docs-only ✅ - README.md 作成 - 方針固定(reads-only inputs を env に追加) ### P1: StepTreeContract に read_sources を追加しない(方針) ✅ - StepTree は "何を読むか(reads)" だけ - "それがどこから来るか" は builder 側で解決(ScopeManager の SSOT) - 実装変更なし、方針のみ確認 ### P2: Normalized builder の env を 2 レーン化 ✅ - EnvLayout 導入(writes + inputs) - from_contract: reads ∩ available_inputs で inputs を決定 - env_map: writes は ValueId 生成、inputs は参照 - 実装: `src/mir/control_tree/normalized_shadow/builder.rs` (186行追加) ### P3: dev-only 配線:available_inputs を渡す ⚠️ **未実装** - 配線点: routing.rs / lowering.rs - SSOT: function params + CapturedEnv (pinned/captured) - 現状: available_inputs は空の BTreeMap(stub) ### P4: Return(Variable) の解決を拡張 ✅ - lower_return_value: env (writes + inputs) から解決 - Fail-Fast with hint: env に無い変数は構造化エラー - Error tags: [phase125/return/var_not_in_env] - Graceful degradation: Phase 125 errors → Ok(None) ### P5: fixture + smoke(VM) ✅ - fixture: `apps/tests/phase125_if_only_return_readonly_input_min.hako` - smoke: `tools/smokes/v2/profiles/integration/apps/phase125_if_only_return_input_vm.sh` - 結果: PASS (exit code 7) - Note: 構造のみ(P3 実装後に完全動作) ### P6: docs 完了 ✅ - 10-Now.md 更新 - Phase 125 P2-P5 完了記録 ## テスト結果 ### Unit Tests - 全 18 tests PASS (normalized_shadow module) - 全 1160 tests PASS (lib全体) - 新規テスト: - `test_return_variable_from_inputs_stub`: PASS - `test_return_variable_out_of_scope`: PASS (Phase 125 対応更新) ### Integration Smoke - Phase 125: PASS (phase125_if_only_return_input_vm.sh) - Regression: 全 PASS - phase124_if_only_return_var_vm: PASS - phase123_if_only_normalized_semantics_vm: PASS - phase121_shadow_if_only_vm: PASS (3/3) - phase118_loop_nested_if_merge_vm: PASS ## 箱化モジュール化の観点でのフィードバック ### 良い点 1. **単一責任の原則** - EnvLayout: env レイアウト決定のみ - from_contract: 入力から決定的に導出(idempotent) - lower_return_value: return 値の lowering のみ 2. **SSOT 化** - EnvLayout.from_contract: reads ∩ available_inputs が SSOT - AST から推測しない(Phase 100 の pinned と混同しない) - BTreeMap で決定的順序保証 3. **Fail-Fast 原則** - env に無い変数は即座にエラー - 構造化エラー tags: [phase125/return/var_not_in_env] - Hint 必須("Pass as param, add to pinned capture, or define before if") 4. **段階的投入** - P2-P5: 構造のみ実装(available_inputs は空) - P3: 配線(別 Phase として分離可能) - 既定挙動不変(dev-only) ### 改善提案 1. **P3 配線の明確化** - 現状: available_inputs は空 BTreeMap(stub) - 提案: P3 で明示的に配線点を文書化 - SSOT: function params + CapturedEnv (pinned/captured) - Phase 121/122 の配線と同じ場所 2. **EnvLayout の責務拡大の懸念** - 現状: writes + inputs の決定のみ - 将来: outputs, side_effects なども追加される可能性 - 提案: EnvLayout を "環境レイアウト決定" の SSOT として明確化 - 別の Box(EnvLayoutBuilder など)への分離も検討 3. **Error hint の改善可能性** - 現状: 固定文字列 hint - 提案: 文脈に応じた hint(例: "x is in reads but not in function params") - Phase 109 の error_tags hints SSOT に統合 4. **fixture の完全性** - 現状: P3 未実装のため、fixture は構造のみ - 提案: P3 完了後、"真の reads-only input" fixture を追加 - 例: `local x=7; if flag==0 { /* no writes */ } return x` ## レガシー発見 なし(Phase 125 は新規機能のため) ## 次のステップ(Phase 125 P3 以降) ### P3: available_inputs wiring - 配線点: `src/mir/builder/control_flow/joinir/routing.rs` または `src/mir/builder/calls/lowering.rs` - SSOT: ScopeManager / CapturedEnv / function params - inputs が実際に env に載るようになる ### 将来の拡張 - 複雑な条件式(BinOp, MethodCall など)の reads 抽出 - loop との統合(loop 内の reads を継続的に追跡) - if-else merge で reads-only 変数の扱い ## 総評 Phase 125 P2-P5 は、箱化モジュール化の観点で良好な実装。 - **単一責任**: EnvLayout / lower_return_value - **SSOT**: reads ∩ available_inputs - **Fail-Fast**: 構造化エラー + hint - **段階的投入**: 構造のみ実装(P3 で完成) P3 の配線が完了すれば、Phase 125 の完全な機能が動作する見込み。