refactor(normalization): Phase 135 P0 - Extend plan to zero post-loop assigns

Generalize NormalizationPlan suffix detection to accept zero post-loop assignments:

Goal: Improve entry point consistency by allowing `loop + assign* + return` (N >= 0)

Implementation:
- Modified plan_box.rs detection logic (only file changed)
- Removed `post_assign_count >= 1` requirement
- Unified Phase 131 (loop + return) and Phase 132-133 (loop + assign+ + return) paths

Changes:
- src/mir/builder/control_flow/normalization/plan_box.rs:
  - Removed assignment count constraint
  - Unified pattern detection: `loop + assign* + return` (N >= 0)
- apps/tests/phase135_loop_true_break_once_post_empty_return_min.hako (new fixture)
- tools/smokes/v2/profiles/integration/apps/phase135_*.sh (new smoke tests)

Pattern support:
- Phase 131/135: loop + return only (consumed: 2, post_assign_count: 0) 
- Phase 132: loop + 1 assign + return (consumed: 3, post_assign_count: 1) 
- Phase 133: loop + N assigns + return (consumed: 2+N, post_assign_count: N) 

Design principles maintained:
- **Minimal change**: Only plan_box.rs modified (execute_box unchanged)
- **SSOT**: Detection logic centralized in plan_box.rs
- **Box-First**: Responsibility separation preserved (Plan/Execute)

Test results:
- Unit tests (plan_box): 9/9 PASS (2 new tests added)
- Phase 135 VM/LLVM EXE: PASS (exit code 1)
- Phase 131 regression: 2/2 PASS (path now unified)
- Phase 133 regression: 2/2 PASS
- cargo test --lib: PASS

Benefits:
- Unified entry point for all loop + post patterns
- Easier maintenance (single detection logic)
- Future extensibility (easy to add new patterns)
- Clear separation of Phase 131 and Phase 132-135 paths

Default behavior unchanged: Dev-only guard maintained

Related: Phase 135 normalization pattern consistency improvement

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-12-18 22:46:32 +09:00
parent f4ab5ca5f4
commit 91c7dfbf0b
6 changed files with 217 additions and 44 deletions

View File

@ -1,5 +1,35 @@
# Self Current Task — Now (main)
## 2025-12-18Phase 135 P0 完了 ✅
**Phase 135 P0: Normalization Plan Suffix Detection Generalization**
- 目的: NormalizationPlanBox の suffix 検出を一般化し、post-loop assign が 0 回でも OK に
- 背景:
- Phase 133 までは `loop + assign+ + return`assign 1回以上必須
- Phase 131 は `loop` のみreturn なし)
- ギャップ: `loop + return`0 assignが別経路
- 改善:
- `loop + assign* + return`N >= 0 assignmentsを統一パターンとして検出
- Phase 131 と Phase 132-133 を `LoopWithPost { post_assign_count }` enum で統一
- Phase 131 (loop-only, no return) は `PlanKind::LoopOnly` として独立維持
- 実装:
- `src/mir/builder/control_flow/normalization/plan_box.rs`(検出ロジック修正のみ)
- `post_assign_count >= 1` チェックを削除 → `>= 0` を許容
- `execute_box.rs` は変更なし(既存ロジックが 0 assigns を自然にサポート)
- Fixture: `apps/tests/phase135_loop_true_break_once_post_empty_return_min.hako`(期待: exit code 1
- Smoke tests:
- `phase135_loop_true_break_once_post_empty_return_vm.sh` PASS
- `phase135_loop_true_break_once_post_empty_return_llvm_exe.sh` PASS
- Regression:
- Phase 131: 2/2 PASSVM + LLVM EXE
- Phase 133: 2/2 PASSVM + LLVM EXE
- Unit tests: 9/9 PASSplan_box module
- 設計原則:
- **最小変更**: plan_box.rs の検出条件のみ変更
- **SSOT 維持**: 検出ロジックは plan_box.rs に集約
- **Box-First**: PlanBoxwhatと ExecuteBoxhowの責任分離維持
- 入口: `src/mir/builder/control_flow/normalization/README.md`Phase 135 セクション追加)
## 2025-12-18Phase 133 完了 ✅
**Phase 133: loop(true) break-once + multiple post-loop assignsdev-only**