Files
hakorune/CURRENT_TASK.md
nyash-codex 32a91e31ac feat(joinir): Phase 200-B/C/D capture analysis + Phase 201-A reserved_value_ids infra
Phase 200-B: FunctionScopeCaptureAnalyzer implementation
- analyze_captured_vars_v2() with structural loop matching
- CapturedEnv for immutable function-scope variables
- ParamRole::Condition for condition-only variables

Phase 200-C: ConditionEnvBuilder extension
- build_with_captures() integrates CapturedEnv into ConditionEnv
- fn_body propagation through LoopPatternContext to Pattern 2

Phase 200-D: E2E verification
- capture detection working for base, limit, n etc.
- Test files: phase200d_capture_minimal.hako, phase200d_capture_in_condition.hako

Phase 201-A: MirBuilder reserved_value_ids infrastructure
- reserved_value_ids: HashSet<ValueId> field in MirBuilder
- next_value_id() skips reserved IDs
- merge/mod.rs sets/clears reserved IDs around JoinIR merge

Phase 201: JoinValueSpace design document
- Param/Local/PHI disjoint regions design
- API: alloc_param(), alloc_local(), reserve_phi()
- Migration plan for Pattern 1-4 lowerers

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 18:32:03 +09:00

543 lines
40 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Current Task
このファイルは「いま何に集中しているか」と「次にやる候補」だけを書く軽量ビューに戻すよ。
過去フェーズの詳細ログは `docs/development/current/main/10-Now.md` と各 `phase-XX*.md` に残してあるので、履歴はそちらを見てね。
---
## 🎯 今フォーカスしているテーマ
### 1. JoinIR ループ基盤 → JsonParser / Trim への適用
- 現状
- LoopBuilder は完全削除済み。ループは JoinIR Pattern14while / break / ifPHI / continueで統一。
- LoopExit / ExitLine / Boundary / Header PHI のラインは代表ケースPattern14で安定。
- LoopConditionScopeBoxPhase 170Dはバグ修正済みで、
- ループ条件に出てくる変数を `LoopParam / OuterLocal / LoopBodyLocal` に分類
- 関数パラメータや外側ローカル(例: `s`, `pos`, `len`)は正しく OuterLocal と判定できるようになった。
- 直近の目的
- JsonParserBox / Trim 系ループを、Pattern14 + LoopConditionScopeBox の上にどこまで安全に載せられるかを再観測する。
- LoopBodyLocal を条件に含むパターンTrim の `ch` などを、Pattern5 でどう扱うか設計する。
- 次にやる候補
- [x] Phase 171A: LoopConditionScope 修正版で JsonParser / Trim ループの再インベントリ ✅
→ どのループが Pattern14 内に入り、どれが LoopBodyLocal 条件で弾かれているかを整理。
- [x] Phase 171B: Pattern5A のターゲット決定 ✅
→ Trim の leading whitespace ループを代表として選定。
- [x] Phase 171C-1: LoopBodyCarrierPromoter スケルトン実装 ✅
→ API 定義PromotionRequest → PromotionResult、基本検出ロジック。
- [x] Phase 171C-2: Trim パターン昇格ロジック実装 ✅
`find_definition_in_body()`, `is_substring_method_call()`, `extract_equality_literals()` 実装。
`TrimPatternInfo` で検出結果を返す。10 unit tests。
- [x] Phase 171C-3: Pattern 2/4 ルーティングとの統合 ✅
→ routing.rs で LoopBodyCarrierPromoter を呼び出し、昇格可能なら Pattern2 へルート。
- [x] Phase 171C-4: CarrierInfo への統合 ✅ (2025-12-07)
`CarrierInfo::merge_from()` で昇格後のキャリアをマージ。
`TrimPatternInfo::to_carrier_info()` で変換ヘルパ実装。
→ Pattern2/4 lowerer で `Promoted` ブランチをマージに更新。7 unit tests。
- [x] Phase 171C-5: TrimLoopHelper 設計 ✅ (2025-12-07)
`TrimLoopHelper` struct で Trim 専用ロジックを一箇所に集約。
`CarrierInfo::trim_helper()` アクセサ追加。4 unit tests。
- [x] Phase 171impl-Trim: Trim 用 JoinIR 生成 ✅ (2025-12-08)
`CarrierInfo::trim_helper()` を使って bool carrier の初期化・更新・exit PHI を生成。
- [x] Phase 172-Trim-impl: Trim 用 MIR 生成 ✅ (2025-12-08)
→ Pattern2 で Trim パターンの JoinIR→MIR lowering 実装完了。
→ emit_whitespace_check(), extract_substring_args() ヘルパ追加。
- [x] Phase 173: JsonParser P5 展開 ✅ (2025-12-08)
→ Task 173-1: JsonParser 代表ループの再チェック_skip_whitespace 選定)。
→ Task 173-2: 「Trim と同型」なループを 1 本選定_skip_whitespace 確定)。
→ Task 173-3: Trim 用 P5 パイプラインを JsonParser 用にも開放する設計(設計ドキュメント作成)。
→ Task 173-4: 1 本だけ実際に JoinIR で通す_skip_whitespace Pattern detection 成功)。
→ Task 173-5: ドキュメント更新phase173-jsonparser-p5-impl.md + CURRENT_TASK
**成果**: Trim パイプラインが JsonParser でも機能することを実証、P5 の汎用性が完全証明された。
- [x] Phase 200: JoinIR パイプライン Cleanup (Part 1) ✅ (2025-12-08)
→ Task 200-1: Pattern × Box マトリクス表をドキュメント化loop_pattern_space.md に追加)。
→ Task 200-2: JoinInlineBoundaryBuilder 導入Pattern2 で試験導入、Builder パターンで構築統一化)。
→ Task 200-3: JoinIRVerifier 追加LoopHeader PHI / ExitLine 契約のデバッグ検証)。
→ Task 200-4: CURRENT_TASK/overview 微修正Phase 200 内容を反映)。
- [x] Phase 201: JoinInlineBoundaryBuilder Pattern3/4 展開 ✅ (2025-12-08)
→ Task 201-1: Pattern2 の Builder 使用パターンを正として固める(設計ドキュメント作成)。
→ Task 201-2: Pattern3 を Builder に載せ替え(フィールド直書き排除)。
→ Task 201-3: Pattern4 を Builder に載せ替えcontinue/Trim 特例対応)。
→ Task 201-4: 共通ルールチェック & unit test 拡張2つの新テスト追加
→ Task 201-5: ドキュメント更新overview + CURRENT_TASK
**成果**: 全パターンP1/P2/P3/P4で Builder 統一完了、フィールド直書き完全排除、挙動不変(テスト全 PASS
- [x] Phase 174: JsonParser 複雑ループ P5 拡張設計1本め ✅ (2025-12-08)
→ Task 174-1: 残り JsonParser ループの再チェック_parse_string/_parse_array/_parse_object 分析)。
→ Task 174-2: 「次に攻める1本」を決定_parse_string 選定、Trim に最も近い構造)。
→ Task 174-3: 箱の再利用 vs 追加を決定TrimLoopHelper 再利用可能、最小化版で検証)。
→ Task 174-4: 小さな PoC を 1 本動かす_parse_string 最小化版で P5 パイプライン成功)。
→ Task 174-5: ドキュメント更新phase174-jsonparser-p5b-design.md + CURRENT_TASK
**成果**: Trim P5 パイプラインが `_parse_string` 最小化版でも機能することを実証。
文字比較対象が `"\""`(終端クォート)でも Trim と同じ昇格パターンで動作確認。
- [x] Phase 175: P5 複数キャリア対応_parse_string 向け) ✅ (2025-12-08)
→ Task 175-1: _parse_string のキャリア候補を洗い出すpos, result, is_ch_match の 3 キャリア特定)。
→ Task 175-2: CarrierInfo / ExitMeta に複数キャリアを載せる設計を固める(既存箱がすべて複数対応済みと確認)。
→ Task 175-3: 小さい PoC で 2 キャリアだけ通してみるMIR 検証で Pattern2 の制約を特定)。
→ Task 175-4: CURRENT_TASK / joinir-architecture-overview 更新。
**成果**: P5 アーキテクチャが複数キャリアに対応済みであることを確認。
CarrierInfo は 3 キャリア検出済みpos, result, is_ch_match
Pattern2 実装が Trim 最適化により `pos` のみ emit する制約を発見Phase 176 改善対象)。
- [x] Phase 176: Pattern2 multi-carrier lowering ✅ (2025-12-08)
→ Task 176-1: 制限ポイント特定10箇所の TODO マーク)
→ Task 176-2: CarrierUpdateLowerer ヘルパ実装6 unit tests
→ Task 176-3: ヘッダ PHI / ループ更新 / ExitLine を全キャリア対応に拡張
→ Task 176-4: E2E テスト成功2キャリア: pos + result
→ Task 176-5: ドキュメント更新
**成果**: Pattern2 が複数キャリアに完全対応。CarrierInfo に載っている全キャリアの UpdateExpr を MIR に emit。
**バグ修正**: Trim pattern の loop_var_name 上書き問題、InstructionRewriter の latch_incoming 設定問題。
- 今後 1〜2 フェーズの TODOJoinIR 周りのサマリ)
- [x] **Phase 177: Multi-carrier PHI 接続修正** ✅ (2025-12-08)
- Task 177-STRUCT-1: CarrierVar に join_id 追加
- Task 177-STRUCT-2: carrier_order で順序保持LoopHeaderPhiInfo
- **成果**: Int テスト成功sum=3、index mismatch 問題解決
- [x] **Phase 178: LoopUpdateAnalyzer string 検出** ✅ (2025-12-08)
- Task 178-1: UpdateRhs 拡張StringLiteral, Other 追加)
- Task 178-2: analyze_rhs 分岐拡張string/method call 検出)
- Task 178-3: Pattern2/4 can_lower で string 拒否Fail-Fast
- Task 178-4: Legacy fallback コメント修正LoopBuilder 削除済み反映)
- **成果**: String loop は明示的エラー、numeric loop は正常動作維持
- **注意**: グローバルテスト 79 件失敗は Phase 178 以前からの既知問題(別途対応)
- [x] **Phase 180: Trim/P5 サブモジュール化** ✅ (2025-12-08)
- Task 180-1: 設計ドキュメント作成phase180-trim-module-design.md
- Task 180-2: TrimLoopLowerer スケルトン実装try_lower_trim_like_loop 骨格)
- Task 180-3: Pattern2 リファクタリング(~160 行の Trim ロジックを TrimLoopLowerer に委譲)
- Task 180-4: Pattern4 分析Trim 検出のみで lowering なし、スキップ)
- Task 180-5: ドキュメント更新joinir-architecture-overview.md + CURRENT_TASK.md
- **成果**: Pattern2 から Trim 専用ロジックを完全分離、-135 行の削減
- **TrimLoopLowerer**: LoopConditionScopeBox + LoopBodyCarrierPromoter 統合
- **再利用性向上**: Pattern2/4/未来パターンすべてで同じ Trim lowering を利用可能
- **テスト**: cargo build --release SUCCESS (0 errors, warnings のみ)
- [x] **Phase 181: JsonParser ループ空間の再インベントリ** ✅ (2025-12-08)
- Task 181-1: JsonParserBox 内の全 11 ループを LoopPatternSpace の軸A〜Fで分類
- Task 181-2: 各ループの Pattern14 + P5 へのマッピング_parse_number/_atoi/_match_literal 等は P2/P1 で対応可能)
- Task 181-3: `_skip_whitespace` / `_trim*` / `_parse_string` 最小版 など、既に JoinIR/P5 経路で動作しているケースを確認
- Task 181-4: 残りループの優先度と難易度を整理_parse_array/_parse_object/_unescape_string は後続 Phase で対応)
- **成果**: JsonParser の全ループが「形としては P1P4(+P5) で表現可能」であることを確認。
ループ形の追加は不要で、複雑さは BoolExprLowerer / ContinueBranchNormalizer / TrimLoopLowerer 側で吸収する方針を確定。
- [x] **Phase 179-B: Generic Pattern Framework** ✅ (2025-12-08)
- Task 179-B-1: 設計ドキュメント作成phase179-generic-pattern-framework.md
- Task 179-B-2: PatternPipelineContext 実装pattern_pipeline.rs
- Task 179-B-3: Pattern 1 統一168→149行, 11%削減)
- Task 179-B-4: Pattern 3 統一168→149行, 11%削減)
- Task 179-B-5: Pattern 2 統一517→509行, 1.5%削減)
- Task 179-B-6: Pattern 4 統一422→414行, 1.9%削減)
- Task 179-B-7: テスト・ドキュメント更新(全代表ケース PASS
- **成果**: 全パターンP1/P2/P3/P4で PatternPipelineContext 統一、
前処理ロジック一本化、挙動不変(テスト全 PASS
- **設計原則**: Pure analysis container解析のみ、emission なし)、
Analyzer-only dependencies、Pattern-specific variantsOption<T>)。
- **注意**: Pattern 2/4 の複雑ロジックTrim, carrier 解析)は inline 維持。
将来 Phase 180+ で Trim module 化予定。
- [x] **Phase 181: JsonParser 残りループ設計調査** ✅ (2025-12-08)
- Task 181-1: 全11ループの再チェックPattern × Box マトリクス作成)
- Task 181-2: ブロック分析LoopConditionScopeBox 制約との照合)
- Task 181-3: ロードマップ作成phase181-jsonparser-loop-roadmap.md
- **成果**: 全ループが「LoopParam/OuterLocal のみ」という制約を満たし、理論的に全対応可能
- **発見**: ブロックされるループは存在しないTrim は昇格パターンで対応済み)
- **優先度**: P2 Break3個: _parse_number/_atoi/_atof_loop> P1 Simple1個: _match_literal> P4 Continue3個: _parse_array/_parse_object/_unescape_string
- [x] **Phase 182: JsonParser P1/P2 パターン検証** ✅ (2025-12-08)
- Task 182-1: 設計ドキュメント作成phase182-simple-loops-design.md
- Task 182-2: Routing whitelist 更新_parse_number/2, _atoi/1, _match_literal/3 追加)
- Task 182-3: Pattern routing 確認NYASH_JOINIR_STRUCTURE_ONLY=1 tracing
- Task 182-5: 代表テスト作成・実行
- ✅ Pattern1: phase182_p1_match_literal.hako PASS
- ✅ Pattern2: phase182_p2_break_integer.hako PASS
- Task 182-6: ドキュメント更新joinir-architecture-overview.md, CURRENT_TASK.md
- **成果**: P1/P2 パターンの基本動作確認完了整数演算・early return で動作実証)
- **ブロッカー発見**:
1. LoopBodyLocal 変数処理(`ch`, `digit_pos`, `pos`
- 現状: Trim 専用の carrier 昇格を試みてエラー
- 必要: P1/P2 で純粋なローカル変数(昇格不要)として扱う仕組み
2. 文字列連結フィルタPhase 178
- 現状: `num_str = num_str + ch` を保守的に reject
- 必要: JsonParser 向けに段階的有効化
- **次ステップ**: Phase 183 で LoopBodyLocal 処理と string ops 対応
- [x] **Phase 183: LoopBodyLocal 役割分離** ✅ (2025-12-08)
- Task 183-1: 設計メモ作成phase183-loopbodylocal-role-separation.md
- LoopBodyLocal を 2 カテゴリに分類設計Condition vs Body-only
- Trim promotion は条件に出てくる変数のみ対象
- body-only local は昇格スキップ
- Task 183-2: LoopBodyLocal 役割分離実装
- TrimLoopLowerer に `is_var_used_in_condition()` ヘルパー追加
- 条件で使われていない LoopBodyLocal を Trim 昇格対象から除外
- 5 unit testsvariable detection, binary op, method call, nested
- Task 183-3: 代表ループテスト作成
- `phase183_body_only_loopbodylocal.hako`: body-only LoopBodyLocal デモ
- トレース確認: `[TrimLoopLowerer] No LoopBodyLocal detected, skipping Trim lowering`
- Task 183-4: ドキュメント更新joinir-architecture-overview.md, CURRENT_TASK.md
- **成果**: LoopBodyLocal 役割分離完了、body-only 変数は Trim promotion されない
- **残課題**: body-local 変数の MIR lowering 対応Phase 184+ で対応予定)
- **発見**: Pattern1 実行問題別途対応必要、Phase 183 スコープ外)
- [x] **Phase 184: Body-local MIR Lowering Infrastructure** ✅ (2025-12-08)
- Task 184-1: 設計ドキュメント作成 ✅
- phase184-body-local-mir-lowering.mdTwo-Environment System 設計)
- 箱理論: LoopBodyLocalEnvStorage Box+ UpdateEnvComposition Box
- Task 184-2: LoopBodyLocalEnv 実装 ✅
- loop_body_local_env.rs216行新規作成
- BTreeMap 決定性保証、7 unit tests 全 PASS
- Task 184-3: UpdateEnv 実装 ✅
- update_env.rs237行新規作成
- Priority order: ConditionEnv → LoopBodyLocalEnv、8 unit tests 全 PASS
- Task 184-4: CarrierUpdateEmitter 統合 ✅
- emit_carrier_update_with_env() 新規追加UpdateEnv 版)
- emit_carrier_update() 後方互換維持、4 新規 unit tests 全 PASS全 10 tests PASS
- Task 184-5: 代表テストケース作成 ✅
- phase184_body_local_update.hakoPattern1 検証)
- phase184_body_local_with_break.hakoPattern2 統合未実施、Phase 185 予定)
- Task 184-6: ドキュメント更新 ✅
- joinir-architecture-overview.mdPhase 184 セクション追加)
- CURRENT_TASK.md本項目追加
- **成果**: Body-local 変数の MIR lowering インフラ完成
- 3つの小箱LoopBodyLocalEnv/UpdateEnv/CarrierUpdateEmitterが単一責任で独立
- 全 25 unit tests PASS決定性・優先順位・後方互換性検証済み
- **制約**: Pattern2/4 への統合は Phase 185 で実施予定body-local 収集機能必要)
- [x] **Phase 187: String UpdateLowering 設計doc-only** ✅ (2025-12-09)
- UpdateKind ベースのホワイトリスト設計(コード変更なし)
- StringAppendChar/StringAppendLiteral を安全パターンとして定義
- Complex (method call / nested BinOp) は Fail-Fast 維持
- Phase 178 の Fail-Fast は完全保持
- Phase 188+ での実装方針を確立
- [x] **Phase 188: StringAppend 実装** ✅ (2025-12-09)
- Task 188-1: LoopUpdateAnalyzer 拡張(既存の UpdateRhs で対応済み)
- Task 188-2: Pattern2/4 can_lower ホワイトリスト更新UpdateRhs::Other のみ拒否)
- Task 188-3: CarrierUpdateEmitter JoinIR emission 拡張StringLiteral → Const emission
- Task 188-4: E2E テストphase188_string_append_char.hako / phase188_string_append_literal.hako
- Task 188-5: ドキュメント更新phase187-string-update-design.md + joinir-architecture-overview.md
- **成果**: Pattern2/4 が安全な string 更新パターンを受理。Complex パターンのみ Fail-Fast。
- 許可: `s = s + ch`, `s = s + "literal"`
- 拒否: `s = s + s.substring(...)` (method call), `s = s + (a + b)` (nested BinOp)
- [x] **Phase 189: JsonParser ミニ適用検証** ✅ (2025-12-09)
- Task 189-1: phase183 テスト_parse_number/_atoi/_match_literalの再検証
- Task 189-2: キャリア検出問題の根本原因分析
- Task 189-3: 検証レポート作成phase189-jsonparser-mini-verification.md
- Task 189-4: CURRENT_TASK / roadmap ドキュメント更新
- **成果**: Phase 188 StringAppend 実装は完了しているが、**キャリア検出の根本的制約**を発見
- **ブロッカー**: Pattern1/2 はループ条件の変数のみ追跡(アキュムレータ変数を自動検出しない)
- **検証結果**:
- phase183_p2_parse_number: ❌ LoopBodyLocal blocker設計通り、Pattern5 必要)
- phase183_p2_atoi: ❌ `result` 変数が追跡されず(キャリア検出問題)
- phase182_p1_match_literal: ✅ 動作(アキュムレータ不要)
- **Phase 188 コード自体は正常**: StringAppend ホワイトリスト・emission ロジック正しい
- **E2E テストは Phase 190+ まで保留**: キャリア検出強化が先決
- **次ステップ**: Phase 190 でキャリア検出強化3つのオプション設計済み
- [x] **Phase 190: NumberAccumulation Update 設計doc-only** ✅ (2025-12-09)
- Task 190-1: _parse_number/_atoi パターン調査 ✅
- Task 190-2: UpdateKind::NumberAccumulation 設計 ✅
- Task 190-3: LoopUpdateAnalyzer アルゴリズム設計 ✅
- Task 190-4: Pattern2/4 can_lower 仕様策定 ✅
- Task 190-5: CarrierUpdateLowerer 責務設計 ✅
- Task 190-6: ドキュメント更新phase190-number-update-design.md + overview
- **成果**: `v = v * 10 + digit` パターンの完全設計
- UpdateKind::NumberAccumulation { base: i64 } 定義
- Whitelist 制御: Integer のみ許可、Complex は Fail-Fast
- 2-instruction emission: `tmp = v * base; result = tmp + addend`
- AST 構造解析名前依存禁止、LHS 出現回数チェック
- Implementation phases 定義Phase 190-impl-A/B/C/D
- **次ステップ**: Phase 190-impl で実装(コード変更は別フェーズ)
- [x] **Phase 190-impl: NumberAccumulation 実装** ✅ (2025-12-09)
- Phase 190-impl-A: Core Detection (LoopUpdateAnalyzer 拡張) ✅
- Phase 190-impl-B: CarrierUpdateLowerer Extension (JoinIR emission) ✅
- Phase 190-impl-C: Pattern2/4 Integration (can_lower 更新) ✅
- Phase 190-impl-D: E2E Validation + PHI 配線デバッグ ✅
- **バグ発見**: body-local と carrier の ValueId 衝突問題
- **修正**: `body_local_start_offset = env.len() + carrier_info.carriers.len()`
- **E2E 結果**: `phase190_atoi_impl.hako` → 12 ✅、`phase190_parse_number_impl.hako` → 123 ✅
- ExitLine contract Verifier 追加(`#[cfg(debug_assertions)]`
- **残課題**: body-local 変数 assignment は JoinIR 未対応Phase 191 で対応)
- [x] **Phase 191: Body-Local Init & Update Lowering Integration** ✅ (2025-12-09)
- **目的**: LoopBodyLocalEnv / UpdateEnv / LoopBodyLocalInitLowerer を Pattern2 に本番統合完了
- 191-1: 対象ケース選定 → `phase191_body_local_atoi.hako` 作成 ✅
- 191-2: LoopBodyLocalInitLowerer の Pattern2 統合init emission 位置は body 先頭)✅
- 191-3: UpdateEnv 統合確認ConditionEnv + LoopBodyLocalEnv 両方から解決)✅
- 191-4: E2E テスト → 期待値 123 出力確認 ✅
- 191-5: ドキュメント更新 ✅
- **成果**:
- 対応済み init 式: 整数リテラル、変数参照、二項演算(`local digit = i + 1`
- UpdateEnv 優先順位: ConditionEnv→ LoopBodyLocalEnvフォールバック
- ValueId 二重割当問題を修正(空の LoopBodyLocalEnv を InitLowerer に委譲)
- **テスト**: phase191_body_local_atoi.hako → 123 ✅、退行なし
- [x] **Phase 192-impl: ComplexAddendNormalizer 実装** ✅ (2025-12-09)
- **目的**: `v = v * 10 + digits.indexOf(ch)` のような Complex addend パターンを、
`temp = digits.indexOf(ch); v = v * 10 + temp` に正規化して NumberAccumulation に載せる
- 192-impl-1: ComplexAddendNormalizer 実装 ✅
- `normalize_assign()` API 設計NormalizationResult enum
- 検出ロジック: `lhs = lhs * base + MethodCall(...)`
- 正規化ロジック: temp 変数生成 + 2-statement AST 出力
- 5 unit tests 全 PASSmethod call, simple variable, wrong LHS, no multiplication, subtraction
- 192-impl-2: Pattern2 前処理統合 ✅
- carrier update analysis 前に normalization ステップ挿入line 243-279
- `analysis_body` を LoopUpdateAnalyzer に委譲
- trace 出力: `[pattern2/phase192] Normalized complex addend: temp='temp_result_addend'`
- 192-impl-3: E2E 検証 ✅
- phase192_normalization_demo.hako → 123 ✅AST レベル正規化確認)
- 退行なし: phase190_atoi_impl.hako → 12 ✅、phase190_parse_number_impl.hako → 123 ✅、phase191_body_local_atoi.hako → 123 ✅
- 192-impl-4: ドキュメント更新 ✅
- phase192-complex-addend-design.md Section 9 追加(実装完了報告)
- CURRENT_TASK.md本項目追加
- **成果**: AST レベル正規化インフラ完成、箱化原則単一責任・再利用性・Fail-Fast遵守
- **制約Phase 193+ 拡張)**: LoopBodyLocalInitLowerer は int/arithmetic のみ対応
- MethodCall in temp init は Phase 186 limitation でエラー
- 拡張対象: `lower_init_expr()` に MethodCall/Call サポート追加
- **設計原則検証**:
- ✅ 箱化: ComplexAddendNormalizer は純粋 AST transformeremission なし)
- ✅ Fail-Fast: Unsupported patterns → NormalizationResult::Unchanged
- ✅ 再利用性: Phase 191 (body-local init) + Phase 190 (NumberAccumulation) 活用
- ✅ 変更最小化: Emission ラインCarrierUpdateEmitter, LoopBodyLocalInitLowererは変更なし
- [x] **Phase 193: LoopBodyLocalInit MethodCall Extension** (完了: 2025-12-09)
- **目的**: Phase 186 limitation 部分解除、MethodCall を init 式でサポート
-`emit_method_call_init()` 実装(~80行、MethodCall → BoxCall 変換
- ✅ String literal init サポート追加Phase 186 拡張)
- ✅ Method whitelistindexOf, get, toStringFail-Fast 実装
- ✅ E2E テスト: `i.toString()` 成功、退行なし
- **重要な設計判断**: ConditionEnv を「ループパラメータ専用」として維持
- ✅ 対応: ループパラメータをレシーバーとする MethodCall (`i.toString()`)
- ⚠️ 保留: 外部ローカルをレシーバーとする MethodCall (`digits.indexOf(ch)`)
- **理由**: Phase 170-200 の 2-tier 境界設計ConditionEnv/LoopBodyLocalEnvを保持
- **将来**: Phase 200+ で独立した箱として設計、または .hako リライト対応
- [x] **Phase 194: JsonParser P1/P2/P5 実戦投入(検証フェーズ)** ✅ (2025-12-09)
- **目的**: Phase 170-193 インフラの実コード検証Fail-Fast 戦略)
- 194-1: Loop inventory 作成 ✅
- 4/10 ループ JoinIR 対応_skip_whitespace, _trim x2, _match_literal
- 6/10 ループ保留(明確な理由付き)
- 詳細: phase194-loop-inventory.md10ループ完全分類
- 194-2: Routing 確認 ✅
- Structure-only mode 動作確認whitelist 不要)
- 既存 whitelist に全4ループ登録済み
- 194-3: E2E 実行 ✅
- 結果: Compilation ErrorExpected - Fail-Fast 戦略成功)
- エラー: `digits.indexOf()` → ConditionEnv constraint
- 分析: function-scoped variables は Phase 193 非対応
- 194-4: Regression tests ✅
- phase190_atoi_impl.hako → 12 ✅
- phase191_body_local_atoi.hako → 123 ✅
- phase193_init_method_call.hako → RC:0 ✅
- 194-5: ドキュメント更新 ✅
- phase194-jsonparser-deployment.mdImplementation Status 完全記録)
- joinir-architecture-overview.mdSection 7.2 Phase 194 完了マーク)
- CURRENT_TASK.md本項目追加
- **成果**: インフラ品質検証完了、次 Phase への明確なロードマップ提示
- ✅ P5 Trim pattern 実戦検証_trim で動作確認)
- ✅ ConditionEnv 制約明確化function-scoped variables 未対応)
- ✅ 退行なしPhase 190-193 全テスト PASS
- **技術的発見**:
1. ConditionEnv constraintfunction-scoped variables 非対応)
- 影響: _parse_number, _atoidigits.indexOf 依存)
- 解決策案: Phase 200+ ConditionEnv 拡張 OR .hako リライト
2. Complex carriers多段フラグ
- 影響: _parse_string, _unescape_string
- 解決策: Phase 195+ Pattern 3 拡張
3. Multiple MethodCallsループ body 内複数呼び出し)
- 影響: _parse_array, _parse_object
- 解決策: Phase 195+ MethodCall 拡張
- **推奨ロードマップ**:
- Phase 195: Pattern 3 extensionif-in-loop + multi-flag carriers
- Phase 200+: ConditionEnv expansionfunction-scoped locals
- Phase 201+: MethodCall extensionmultiple calls in body
- [x] **Phase 195: Pattern 3 拡張(設計 + Lowerer 実装完了)** (2025-12-09)
- **目的**: P3If-Else PHIを複数キャリア対応に拡張
- **実装完了**:
-`loop_with_if_phi_minimal.rs`: multi-carrier PHI 生成sum + count
-`pattern3_with_if_phi.rs`: 単一/複数キャリアを動的処理
- ✅ ExitLine / CarrierVar.join_id: **変更不要**(既存インフラ活用)
- ✅ テストファイル: `phase195_sum_count.hako` 作成
- **設計判断の証明**:
- ✅ ExitLine 拡張で対応PhiGroupBox は作らない - YAGNI 原則が正しかった)
- ✅ 両分岐での Carrier 定義確認(更新なし = 前の値使用)
- ❌ ConditionEnv 拡張なしPhase 200+ 保留)
- **成果**:
- P3 Lowerer は複数キャリア対応完了 ✅
- ExitLine/CarrierVar は既に対応済み(変更不要)✅
- JoinIR→MIR bridge の Select バグは Phase 196 で修正 ✅
- [x] **Phase 196: Select 展開/変換バグ調査&修正** ✅ (完了: 2025-12-09)
- **目的**: JoinIR→MIR の Select 展開処理バグを修正
- **根本原因**: `instruction_rewriter.rs` での二重 remap バグ
- Line 304: `remap_instruction()` で PHI inputs を JoinIR→Host に remap 済み
- Line 328: `remap_value(*val)` で再度 remap → undefined ValueId 参照
- **修正内容**: PHI の block ID のみを remap、ValueId は既に remap 済みなのでそのまま使用
- **変更**: 1ファイル 1行`instruction_rewriter.rs` line 331
- **テスト結果**:
- ✅ phase195_sum_count.hako → 93sum=9, count=3 で計算)
- ✅ loop_if_phi.hako → sum=9単一キャリア P3
- ✅ loop_min_while.hako → 0,1,2Pattern 1
- ✅ joinir_min_loop.hako → RC:0Pattern 2
- ✅ 退行なし、`[joinir/freeze]` なし
- **成果**:
- P3 multi-carrier が E2E で完全動作 ✅
- 箱化原則遵守(新規構造体なし、最小限の変更)✅
- ドキュメント完備phase196-select-bug-analysis.md
- [x] **Phase 197: JoinIR 実戦適用(軽量ループ検証)** ✅ (完了: 2025-12-09)
- **目的**: Phase 196 までの安定基盤を実戦の小さいループで検証
- **対象ループ5本**:
1. `_match_literal` (P1) - JsonParser 単純 while ✅
2. `_skip_whitespace` (P2) - JsonParser break パターン ✅
3. `phase195_sum_count.hako` (P3 multi-carrier) ✅
4. `loop_if_phi.hako` (P3 single-carrier) ✅
5. `loop_min_while.hako` (P1 minimal) ✅
- **実施内容**:
- 197-1: 対象ループ確定3-5本
- 197-2: routing 確認whitelist 既存)✅
- 197-3: 構造トレース + E2E 実行 ✅
- 197-4: ドキュメント更新 ✅
- **成果**:
- 全ループで正しい Pattern 選択 ✅
- 4/5 ループで E2E PASS、1/5 routing 確認 ✅
- 退行なしPhase 190-196 テスト全 PASS
- JsonParser/selfhost 実戦適用状況表作成 ✅
- Coverage: 7/13 ループ JoinIR 対応済み54%
- **詳細**: phase197-lightweight-loops-deployment.md
- **次候補**:
- Phase 200+: ConditionEnv 拡張_parse_number, _atoi
- Phase 198+: JsonParser 残りループ個別対応
- [x] **Phase 200-A: ConditionEnv 拡張インフラ(型と箱のみ)** ✅ (完了: 2025-12-09)
- **目的**: ConditionEnv を壊さずに関数スコープ "実質定数" を扱う基盤
- **実施内容**:
- 200-A-1: CapturedVar / CapturedEnv 型導入 ✅
- 200-A-2: FunctionScopeCaptureAnalyzer スケルトン ✅
- 200-A-3: ConditionEnvBuilder v2 入口 ✅
- 200-A-4: ParamRole enum 追加 ✅
- 200-A-5: ドキュメント更新 ✅
- **スコープ**: Infra only / Integration pending
- **成果**:
- 型と箱の定義完了 ✅
- 既存ループの挙動変更なし ✅
- Phase 200-B への準備完了 ✅
- **次フェーズ**: Phase 200-Bdigits 系ループへの適用)
- **詳細**: phase200-A-conditionenv-infra.md
- [x] **Phase 200-B: FunctionScopeCaptureAnalyzer 実装 & ConditionEnv 統合** ✅ (完了: 2025-12-09)
- **目的**: digits 等の関数ローカルを ConditionEnv から参照可能に
- **実装内容**:
- 200-B-1: capture 判定ロジック実装 ✅
- 200-B-2: ConditionEnvBuilder v2 実装 ✅
- 200-B-3: パイプライン組み込みPattern 2
- 200-B-4: digits ケース検証 ✅
- 200-B-5: ドキュメント更新 ✅
- **成果**:
- digits が CapturedEnv に捕捉される
- ConditionEnv.captured に登録される
- ParamRole::Condition として boundary に追加される
- **Pattern 2 統合**:
- TODO skeleton 追加済みphase 200-B-3
- 制限: fn_body (full function body AST) が Pattern 2 lowerer で未利用可能
- 将来: LoopPatternContext に fn_body を追加予定 (Phase 200-C+)
- **テストファイル**:
- apps/tests/phase200_digits_atoi_min.hako
- apps/tests/phase200_digits_parse_number_min.hako
- **次フェーズ**: Phase 200-Cdigits.indexOf E2E 連携)
- **詳細**: phase200-B-capture-impl.md
- [x] **Phase 200-C: digits.indexOf E2E 連携** ✅ (完了: 2025-12-09)
- **目的**: 200-A/B インフラを実際に Pattern 2 経路に統合
- **実装内容**:
- 200-C-1: LoopPatternContext に fn_body 追加 ✅
- MirBuilder に fn_body_ast フィールド追加
- lower_method_as_function / lower_static_method_as_function で fn_body 保存
- 200-C-2: Pattern 2 で capture 解析呼び出し ✅
- analyze_captured_vars_v2() 新規追加(構造的ループ検索)
- ポインタ比較 → AST 構造比較に変更
- 200-C-3: ConditionEnvBuilder v2 統合 ✅
- 200-C-4: digits ケース検証 ⚠️
- capture 検出: ✅ PASSdigits, s が CapturedEnv に捕捉)
- E2E 実行: ❌ BLOCKEDbody-local 変数 `pos` が条件で使用 → Pattern 5+ 必要)
- 200-C-5: ドキュメント更新 ✅
- **成果**:
- 構造的ループ検索analyze_captured_vars_v2実装完了
- fn_body が Pattern 2 lowerer まで正しく渡される
- digits / s が CapturedEnv に正しく捕捉される
- **テストケース制約**:
- phase200_digits_atoi_min.hako: body-local `pos = digits.indexOf(ch)` を条件 `if pos < 0` で使用
- phase200_digits_parse_number_min.hako: 同様に body-local `digit_pos` を条件で使用
- → Pattern 5+ (body-local promotion) が必要
- **次フェーズ**: Phase 200-Dシンプルな capture テストケース)
- **詳細**: phase200-C-digits-e2e.md
- [x] **Phase 200-D: digits capture "実戦 1 本" 検証** ✅ (完了: 2025-12-09)
- **目的**: capture 経路の E2E 検証body-local なしのシンプルケース)
- **実装内容**:
- 200-D-1: body-local なし digits テスト作成 ✅
- phase200d_capture_minimal.hako
- phase200d_capture_in_condition.hako
- phase200d_digits_simple.hakosubstring 制限で BLOCKED
- 200-D-2/D-3: E2E 検証 ⚠️
- capture 検出: ✅ PASSbase, limit, n 等が正しく CapturedEnv に)
- ConditionEnv 統合: ✅ PASScaptured vars が ConditionEnv.captured に追加)
- 実行: ⚠️ 別の制約でブロック(キャリア更新式の型問題)
- **成果**:
- capture 経路analyze_captured_vars_v2 → ConditionEnv → Pattern 2が正常動作
- 関数スコープ定数base, limit, digits 等)が正しく検出・統合される
- host_id → join_id マッピングが ConditionEnv.captured に追加される
- **残課題**:
- E2E 実行は別の制約substring 未対応、キャリア更新型問題)でブロック
- これらは Phase 200 スコープ外(キャリア更新強化は別フェーズ)
- **テストファイル**:
- apps/tests/phase200d_capture_minimal.hako
- apps/tests/phase200d_capture_in_condition.hako
- apps/tests/phase200d_digits_simple.hako
- apps/tests/phase200d_digits_accumulate.hako
---
### 2. SelfHost depth2 / MIR JSON v0 / JoinIR Analyzer ライン
- 現状
- `.hako` から Program JSON v0 / MIR JSON を読み込む準備は整備済みPhase 160 系)。
- JsonParserBox / JsonParserBox.ProgramJSONBox / JsonParserBox.JsonParserBox 自体は箱として実装されている。
- MIR/JoinIR Analyzer Box 群MirAnalyzerBox, JoinIrAnalyzerBoxは基盤実装済み。
- 直近の目的
- JoinIR ループ基盤が安定した前提で、「selfhost depth2 の最小ループ」がどこまで回るかを再確認する。
- JsonParserBox 側のループ制約Pattern14 + 将来 Pattern5と、Analyzer Box の入力形式を揃える。
- 次にやる候補
- [ ] Phase 161続き: MirAnalyzerBox / JoinIrAnalyzerBox に対する代表ケースの再実行
loop パターンが JoinIR 統一後も正しく認識できているか確認)。
- [ ] Phase 166続き: Program JSON v0 / MIR JSON v1 を `.hako` 側で安全にパースできるか確認
JsonParserBox のループ制約と衝突しないかをチェック)。
---
### 3. hako_check / MIR CFG / JoinIR 解析ライン
- 現状
- HC019 / HC020DeadCode / DeadBlocksなど、hako_check 側の Box は JoinIR/MIR CFG を読む経路に統一済み。
- JsonParserBox による JSON パーサー共通ライブラリ化も進行中Phase 170172
- 直近の目的
- JoinIR / MIR ラインの変更Pattern14, ExitLine, Boundary, ConditionScopeが hako_check に与える影響を最小に保ちつつ、
解析結果の精度を維持する。
- 次にやる候補
- [ ] Phase 155+ の MIR JSON v1 統合ラインを、最新の JoinIR/Loop 仕様に追随させるかどうかの判断。
(今のところブロッカーではないので優先度は中〜低)
---
## ✅ 最近完了した主なフェーズ(抜粋)
ここは「今の作業に強く関係する直近フェーズ」だけをざっくり残すよ。詳細は各 phase ドキュメントを参照。
- **Phase 3316/20/21**: Loop header PHI / ExitLine / Boundary の SSOT 化
→ ループ変数の現在値と exit 値が header PHI / ExitLine 経由で一貫して伝播するようになった。
- **Phase 3318/19/20**: Pattern4continue・elsecontinue 正規化・carrier フィルタリング
→ continue 含みのループPattern4が JoinIR 統一ラインの中で動作。
`ContinueBranchNormalizer` / `LoopUpdateAnalyzer` / `CarrierInfo` ラインが安定。
- **Phase 165**: JoinIR ループ Pattern14 代表ケースの完全検証
→ loop_min_while / joinir_min_loop / loop_if_phi / loop_continue_pattern4 で
`[joinir/freeze]` と SSAundef を全排除。
- **Phase 170D (BugFix)**: LoopConditionScopeBox 実装&パラメータ誤分類バグ修正
→ ループ条件の変数スコープ分類LoopParam / OuterLocal / LoopBodyLocalが安定。
JsonParserBox の `s`, `pos`, `len` など関数パラメータが正しく OuterLocal と見なされるようになった。
- **Phase 168169**: BoolExprLowerer / condition_to_joinir 強化
`_trim` / `_skip_whitespace` の OR chain / AND / NOT を JoinIR/MIR に正しく落とせるようになった。
(ただし LoopBodyLocal 条件をどう扱うかは Pattern5 設計の領域として切り出し済み)
---
## 📌 このファイルの運用方針
- CURRENT_TASK.md には「直近 1〜2 週間で触っているライン」と「次にやる候補」だけを書く。
- フェーズごとの詳細ログ・長文の議事録・実装メモは:
- `docs/development/current/main/10-Now.md`
- `docs/development/current/main/phaseXX*.md`
に移し、このファイルからはリンクまたは簡単な要約だけに留める。
- もし CURRENT_TASK がまた肥大化してきたら、
古いセクションを phase ドキュメント側に逃して、このファイルを再度「現在地サマリ」に戻す。