docs(phase40-2): CURRENT_TASK.md Phase 40-2セクション追加

Phase 40-2設計フェーズ完了記録:
- パイプライン移行設計(現状→目標)
- 対象関数確定(array_ext.filter)
- 経路切替ポイント(loop_builder.rs:1069, 1075)
- A/Bテスト方針
- 削除条件(3条件)

コード変更: なし(docs-only)
次のステップ: Phase 40-3マイグレーションフェーズ

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-11-28 10:13:53 +09:00
parent 88358a4086
commit aa0b3972b9
2 changed files with 129 additions and 1 deletions

View File

@ -126,6 +126,134 @@
--- ---
### 1-00m. Phase 40-2 — array_ext.filter JoinIR統合設計docs-only**完了** 2025-11-28
**目的**
- Phase 40-1インフラ完成を受け、旧AST→MIRパスをJoinIR経路に折り畳む設計を確定
- array_ext.filterに特化した経路切替ポイント・A/Bテスト方針・削除条件を明確化
- Phase 40-3実装フェーズへの具体的な橋渡し
**設計内容**
**パイプライン見取り図作成**:
- **現状パイプライン(レガシー経路)**:
```
AST → MIR Builder (loop_builder.rs)
→ collect_assigned_vars() (Line 1069, 1075)
→ PHI生成 → VM/LLVM
```
- **目標パイプラインJoinIR SSOT**:
```
AST → Program (JSON v0)
→ JoinIR Frontend (AstToJoinIrLowerer)
→ JoinModule + JoinFuncMetaMap
→ JoinIR→MIR Bridge (convert_with_meta)
→ VM/LLVM
```
- **利点**: JoinIR Frontendがif-in-loop変数追跡のSSOT、PHI生成がBridgeに集約、二重管理解消
**対象関数と経路マッピング**:
- **対象関数**: array_ext.filter唯一Phase 39選定済み、8/10点
- **パターン**: if-in-loop with conditional modification`if fn(v) { out.push(v) }`
- **経路切替ポイント**:
- loop_builder.rs:1069 (then body) → JoinFuncMeta.if_modified_vars
- loop_builder.rs:1075 (else body) → JoinFuncMeta.if_modified_vars
- **現状責務**: collect_assigned_vars(&then_prog, &mut vars)でHashSet<String>蓄積→exit PHI生成
- **目標責務**: JoinFuncMeta.if_modified_vars = {"out"}→convert_with_meta()でexit PHI生成
**JoinIR Frontend入口API設計**:
- **使用API**: Phase 40-1作成済みの`lower_loop_with_if_meta(program_json) → (JoinModule, JoinFuncMetaMap)`
- **JoinFuncMeta使い方**:
```rust
JoinFuncMeta {
if_modified_vars: Some(HashSet::from(["out".to_string()])),
// "out"はif文内で変更される変数
}
```
- **載せる変数**: `out`if文内で`out.push(v)`により変更)
- **載せない変数**: `i`if文内で変更なし、`v`local変数、exit不要
**二重管理防止ポリシー**:
- **SSOT宣言**: array_ext.filterについては
- if-in-loop modified変数集合のSSOT: `JoinFuncMeta.if_modified_vars`
- exit PHI生成のSSOT: `convert_with_meta()`
- `collect_assigned_vars`: 削除候補Phase 40-4
- **現時点**: 両経路併存A/Bテストのため
**JoinIR→MIR Bridge利用設計**:
- **切り分けロジック**:
```rust
if is_array_ext_filter(func_name) {
convert_with_meta(module, meta) // Route B
} else {
convert_join_module_to_mir(module) // Route A
}
```
**A/Bテスト設計**:
- **Route A**: AST → MIR Builder → collect_assigned_vars → PHI → VMレガシー
- **Route B**: AST → JoinIR Frontend → JoinFuncMeta → convert_with_meta → VMSSOT
- **比較対象**:
1. 実行結果: 入力`[1,2,3,4,5,6]`, predicate`x % 2 == 0` → 期待出力`[2,4,6]`
2. Exit PHI形状: dumpしたときのφの有無と形ソースブロック数・変数名一致
- **成功基準**: 実行結果一致 + Exit PHI形状一致 + 5回連続PASS
**array_ext.filter専用削除条件**:
1. **A/Bテスト安定PASS**: Route A == Route B、Exit PHI形状一致、5回連続PASS
2. **JoinIR経由のみでPHI生成**: array_ext.filterのループPHIはJoinIR→MIR bridgeだけで生成
3. **callsite unused確認**: `rg collect_assigned_vars`でarray_ext.filter絡みの分岐が完全にunused
**削除タイミング**:
- **Phase 40-3**: 経路切り替え実装、A/Bテスト実行
- **Phase 40-4**: 上記条件すべて満たした後に削除
**Phase 40-3での dev flag 案**:
```rust
// loop_builder.rs:1069, 1075
if std::env::var("NYASH_LEGACY_COLLECT_ASSIGNED_VARS").is_ok() {
collect_assigned_vars(&then_prog, &mut vars); // Route A
} else {
// JoinFuncMetaから取得 // Route B
}
```
**技術的成果**
1. **パイプライン移行設計確定**: 現状レガシー→目標JoinIR SSOTの具体的変換手順明確化
2. **二重管理防止ポリシー確立**: SSOT宣言により責務分離明確化
3. **A/Bテスト方針確定**: Route A vs Route B比較基準、成功基準、PASS回数5回
4. **array_ext.filter専用削除条件定義**: 3条件チェックリスト化
**成果物**
- ✅ README.md: パイプライン見取り図(~70行
- ✅ README.md: 対象関数と経路切替ポイント表(~60行
- ✅ README.md: JoinIR Frontend入口API設計~50行
- ✅ README.md: 二重管理防止ポリシー(~20行
- ✅ README.md: Bridge利用設計~30行
- ✅ README.md: A/Bテスト設計~50行
- ✅ deletion_criteria_checklist.md: array_ext.filter専用削除条件~50行
- ✅ PHI_BOX_INVENTORY.md: Phase 40-2更新~50行
**Rustコード変更**
- **ゼロ**docs-only、Phase 40-2完遂
**追加行数合計**: ~380行ドキュメント
**Phase 35-40-2 累計削減**: 605行Phase 35: 430行, Phase 38: 90行, Phase 39: 0行設計, Phase 40-2: 0行設計
**Phase 40-3/4 削減ポテンシャル**: 115行Level 2、MEDIUM安全度
**次のステップPhase 40-3**
- **経路切り替え実装**: loop_builder.rs:1069, 1075にdev flag追加
- **JoinIR Frontend拡張**: array_ext.filter向けif-in-loop variable tracking実装
- **A/Bテスト実行**: Route A vs Route B完全検証
- **callsite unused確認**: `rg collect_assigned_vars`で分岐unused確認
**関連ドキュメント**
- `docs/private/roadmap2/phases/phase-40-if-phi-level2/README.md` (Phase 40-2詳細、~330行追加)
- `docs/private/roadmap2/phases/phase-39-if-phi-level2/deletion_criteria_checklist.md` (Phase 40-2更新、~50行追加)
- `docs/private/roadmap2/phases/phase-30-final-joinir-world/PHI_BOX_INVENTORY.md` (Phase 40-2結論、~50行追加)
---
### 1-00l. Phase 39 — If側PHI Level 2削減準備設計中心、docs-only**完了** 2025-11-28 ### 1-00l. Phase 39 — If側PHI Level 2削減準備設計中心、docs-only**完了** 2025-11-28
**目的** **目的**