diff --git a/docs/development/current/main/phases/phase-125/FEEDBACK.md b/docs/development/current/main/phases/phase-125/FEEDBACK.md new file mode 100644 index 00000000..6f1f4ae0 --- /dev/null +++ b/docs/development/current/main/phases/phase-125/FEEDBACK.md @@ -0,0 +1,132 @@ +# 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 の完全な機能が動作する見込み。