Feedback summary: - 単一責任: EnvLayout / lower_return_value - SSOT: reads ∩ available_inputs - Fail-Fast: 構造化エラー + hint - 段階的投入: 構造のみ(P3 で完成) Good: - Single responsibility principle maintained - SSOT approach for env layout - Fail-Fast with structured errors - Graceful degradation (Ok(None)) Improvement proposals: - P3 wiring clarification - EnvLayout responsibility scope - Error hint context-awareness - Fixture completeness after P3 Next: Phase 125 P3 (available_inputs wiring) Ref: docs/development/current/main/phases/phase-125/FEEDBACK.md
4.8 KiB
4.8 KiB
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: PASStest_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
箱化モジュール化の観点でのフィードバック
良い点
-
単一責任の原則
- EnvLayout: env レイアウト決定のみ
- from_contract: 入力から決定的に導出(idempotent)
- lower_return_value: return 値の lowering のみ
-
SSOT 化
- EnvLayout.from_contract: reads ∩ available_inputs が SSOT
- AST から推測しない(Phase 100 の pinned と混同しない)
- BTreeMap で決定的順序保証
-
Fail-Fast 原則
- env に無い変数は即座にエラー
- 構造化エラー tags: [phase125/return/var_not_in_env]
- Hint 必須("Pass as param, add to pinned capture, or define before if")
-
段階的投入
- P2-P5: 構造のみ実装(available_inputs は空)
- P3: 配線(別 Phase として分離可能)
- 既定挙動不変(dev-only)
改善提案
-
P3 配線の明確化
- 現状: available_inputs は空 BTreeMap(stub)
- 提案: P3 で明示的に配線点を文書化
- SSOT: function params + CapturedEnv (pinned/captured)
- Phase 121/122 の配線と同じ場所
-
EnvLayout の責務拡大の懸念
- 現状: writes + inputs の決定のみ
- 将来: outputs, side_effects なども追加される可能性
- 提案: EnvLayout を "環境レイアウト決定" の SSOT として明確化
- 別の Box(EnvLayoutBuilder など)への分離も検討
-
Error hint の改善可能性
- 現状: 固定文字列 hint
- 提案: 文脈に応じた hint(例: "x is in reads but not in function params")
- Phase 109 の error_tags hints SSOT に統合
-
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 の完全な機能が動作する見込み。