Files
hakorune/docs/development/current/main/phase210-jsonparser-mini-integration.md
nyash-codex d4f90976da refactor(joinir): Phase 244 - ConditionLoweringBox trait unification
Unify condition lowering logic across Pattern 2/4 with trait-based API.

New infrastructure:
- condition_lowering_box.rs: ConditionLoweringBox trait + ConditionContext (293 lines)
- ExprLowerer implements ConditionLoweringBox trait (+51 lines)

Pattern migrations:
- Pattern 2 (loop_with_break_minimal.rs): Use trait API
- Pattern 4 (loop_with_continue_minimal.rs): Use trait API

Benefits:
- Unified condition lowering interface
- Extensible for future lowering strategies
- Clean API boundary between patterns and lowering logic
- Zero code duplication

Test results: 911/911 PASS (+2 new tests)

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-11 02:35:31 +09:00

756 lines
22 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.

# Phase 210: JsonParser JoinIR ミニ統合ラウンド1
**日付**: 2025-12-09
**ゴール**: 既存JoinIRインフラP1-P5/JoinValueSpace/PHI契約で実戦ループ2〜3本を通して観測する
**制約**: 新しい箱・大リファクタは禁止。問題発見時は「どの層の制約か」を記録するまで。
---
## Section 1: 対象ループの再選定Task 210-1
### 1.1 選定基準
**Phase 210 の狙い**:
- 既存インフラで「理論上いけるはず」のループを実戦投入
- 新機能実装ではなく、既存機能の統合観測
- Fail-Fast で問題層を特定
**選定条件**:
1. ✅ Phase 190 で理論実装済みパターン (NumberAccumulation)
2. ✅ Phase 181 で棚卸し済み(ブロックなし確認済み)
3. ✅ 単純構造LoopBodyLocal なし or Trim パターンのみ)
4. ✅ 既存テスト資産が使えるphase190_*, phase183_* など)
### 1.2 選定結果: 3本のループ
#### ループ1: _atoi の最小版 (P2 Break) ⭐最優先
**理由**:
- Phase 190-impl-D で E2E 検証済み (`phase190_atoi_impl.hako` → 12 ✅)
- NumberAccumulation パターン (`v = v * 10 + digit`) 完全実装済み
- CarrierInfo, LoopUpdateAnalyzer, CarrierUpdateLowerer で全対応
- 既に JoinIR → MIR パイプライン通過確認済み
**ループ構造**:
```nyash
local result = 0
local i = 0
loop(i < n) {
local ch = s.substring(i, i+1)
local pos = digits.indexOf(ch)
if pos < 0 { break }
result = result * 10 + pos // NumberAccumulation
i = i + 1
}
```
**想定パターン**: Pattern 2 (WithBreak)
**既知の制約**:
- LoopBodyLocal (`ch`, `pos`) への代入は JoinIR 未対応Phase 186 残タスク)
- 回避策: body-local を使わず carrier のみで書ける最小版を使用
**観測ポイント**:
- `[pattern] Pattern2_WithBreak MATCHED`
- `[joinir/pattern2] Generated JoinIR`
- `[joinir/verify] all contracts satisfied`
- Runtime: 正しい整数変換結果
---
#### ループ2: _parse_number の最小版 (P2 Break)
**理由**:
- Phase 190-impl-D で E2E 検証済み (`phase190_parse_number_impl.hako` → 123 ✅)
- StringAppendChar + NumberAccumulation の組み合わせ
- Multi-carrier パターン(`p`, `num_str`)の実証
**ループ構造**:
```nyash
local num_str = ""
local p = 0
loop(p < s.length()) {
local ch = s.substring(p, p+1)
local digit_pos = digits.indexOf(ch)
if digit_pos < 0 { break }
num_str = num_str + ch // StringAppendChar
p = p + 1
}
```
**想定パターン**: Pattern 2 (WithBreak)
**既知の制約**:
- LoopBodyLocal (`ch`, `digit_pos`) への代入は JoinIR 未対応
- 回避策: body-local を読み取り専用として扱う(書き込みなし)
**観測ポイント**:
- Multi-carrier update の正しい PHI 配線
- StringAppendChar + CounterLike の組み合わせ動作
- Runtime: 正しい数値文字列抽出
---
#### ループ3: _match_literal の最小版 (P1 Simple)
**理由**:
- Phase 181 で「P1 Simple」として分類済み
- 最も単純なパターンbreak なし、continue なし)
- Pattern 1 の汎用性確認に最適
**ループ構造**:
```nyash
local i = 0
loop(i < len) {
if s.substring(pos + i, pos + i + 1) != literal.substring(i, i + 1) {
return 0
}
i = i + 1
}
return 1
```
**想定パターン**: Pattern 1 (SimpleWhile)
**既知の制約**:
- 早期 return があるLoopForm では break として扱われる可能性)
- Pattern 1 vs Pattern 2 のルーティング境界を観測
**観測ポイント**:
- Pattern 1 vs Pattern 2 の自動ルーティング
- 早期 return の JoinIR 表現
- Runtime: 文字列一致判定の正確性
---
### 1.3 除外したループ
**_skip_whitespace, _trim (leading/trailing)**:
- 既に Phase 171/173 で実装・検証済み
- Phase 210 では「新規に JoinIR ラインに乗せたいもの」を優先(指示書より)
- 比較用として残すが、今回の観測対象からは除外
**_parse_array, _parse_object, _unescape_string**:
- MethodCall 多数、複雑なキャリア処理
- Phase 183+ の対象Phase 210 の範囲外)
---
## Section 2: 最小 .hako ハーネスの設計Task 210-2
### 2.1 ハーネス設計方針
**Phase 210 の制約**:
- 既存の Phase190/200 系テストを再利用してもよい(指示書より)
- 新規に書く場合は `apps/tests/phase210_*` に配置
- RCResult Codeで結果を返すシンプル構造
**再利用候補**:
1. `apps/tests/phase190_atoi_impl.hako` (既存) ✅
2. `apps/tests/phase190_parse_number_impl.hako` (既存) ✅
3. `apps/tests/phase210_match_literal_min.hako` (新規作成予定)
---
### 2.2 ハーネス1: phase190_atoi_impl.hako (再利用)
**現状**: Phase 190-impl-D で既に検証済み
**実行コマンド**:
```bash
./target/release/hakorune apps/tests/phase190_atoi_impl.hako
```
**期待出力**:
```
12
```
**観測項目**:
- [ ] `[pattern] Pattern2_WithBreak MATCHED`
- [ ] `[joinir/pattern2] Generated JoinIR`
- [ ] `[joinir/verify] all contracts satisfied`
- [ ] Runtime: RC = 12
---
### 2.3 ハーネス2: phase190_parse_number_impl.hako (再利用)
**現状**: Phase 190-impl-D で既に検証済み
**実行コマンド**:
```bash
./target/release/hakorune apps/tests/phase190_parse_number_impl.hako
```
**期待出力**:
```
123
```
**観測項目**:
- [ ] `[pattern] Pattern2_WithBreak MATCHED`
- [ ] Multi-carrier PHI 配線確認
- [ ] StringAppendChar + CounterLike 組み合わせ動作
- [ ] Runtime: RC = 123
---
### 2.4 ハーネス3: phase210_match_literal_min.hako (新規)
**設計イメージ**:
```nyash
static box Main {
main() {
local s = "hello"
local literal = "hello"
local pos = 0
local len = 5
local i = 0
loop(i < len) {
if s.substring(pos + i, pos + i + 1) != literal.substring(i, i + 1) {
return 0
}
i = i + 1
}
return 1
}
}
```
**実行コマンド**:
```bash
./target/release/hakorune apps/tests/phase210_match_literal_min.hako
```
**期待出力**:
```
1
```
**観測項目**:
- [ ] Pattern 1 vs Pattern 2 ルーティング結果
- [ ] 早期 return の JoinIR 表現
- [ ] Runtime: RC = 1 (一致成功)
**実装タイミング**: Task 210-2 の「コード実装」フェーズで作成(今回は設計のみ)
---
## Section 3: 実行経路の確認Task 210-3
### 3.1 実行コマンド方針
**基本実行**:
```bash
./target/release/hakorune apps/tests/phase210_*.hako
```
**構造確認モード** (必要に応じて):
```bash
NYASH_JOINIR_STRUCTURE_ONLY=1 ./target/release/hakorune apps/tests/phase210_*.hako
```
**詳細ログ** (問題発生時):
```bash
NYASH_CLI_VERBOSE=1 ./target/release/hakorune apps/tests/phase210_*.hako
```
---
### 3.2 期待するログのイメージ
#### Pattern 2 (WithBreak) の場合
**ルーティング段階**:
```
[trace:routing] router: function 'Main.main' - try_cf_loop_joinir called
[trace:pattern] route: Pattern2_WithBreak MATCHED
```
**JoinIR 生成段階**:
```
[joinir/pattern2] Generated JoinIR for loop
[joinir/pattern2] Carriers: result, i
[joinir/pattern2] Update kinds: NumberAccumulation(base=10), CounterLike
```
**検証段階**:
```
[joinir/verify] Verifying loop header PHIs
[joinir/verify] Verifying exit line contract
[joinir/verify] Verifying ValueId regions
[joinir/verify] all contracts satisfied
```
**MIR マージ段階**:
```
[joinir/merge] Merging JoinIR into host MIR
[joinir/merge] Reconnecting exit line
[joinir/merge] Merge complete
```
#### Pattern 1 (SimpleWhile) の場合
**ルーティング段階**:
```
[trace:routing] router: function 'Main.main' - try_cf_loop_joinir called
[trace:pattern] route: Pattern1_SimpleWhile MATCHED
```
**JoinIR 生成段階**:
```
[joinir/pattern1] Generated JoinIR for simple loop
[joinir/pattern1] Carriers: i
[joinir/pattern1] No break/continue, single exit
```
---
### 3.3 Fail-Fast 方針
**Phase 210 の鉄則**: 問題発見時は「記録するまで」に留める。修正は Phase 211+ で。
#### Fail-Fast ケース1: [joinir/freeze]
**想定エラー**:
```
[joinir/freeze] Complex carrier update detected
carrier: result
reason: MethodCall in addend
```
**対処**:
- 記録: 「CarrierUpdate 層でブロック」
- 修正: Phase 211+ で MethodCall 対応
#### Fail-Fast ケース2: Type error
**想定エラー**:
```
[ERROR] Type mismatch: expected Integer, got String
```
**対処**:
- 記録: 「ConditionEnv 層でブロック(型推論失敗)」
- 修正: Phase 211+ で型ヒント強化
#### Fail-Fast ケース3: ssa-undef-debug
**想定エラー**:
```
[ssa-undef-debug] Undefined variable: pos
at: LoopBodyLocal assignment
```
**対処**:
- 記録: 「LoopBodyLocal 層でブロックPhase 186 残タスク)」
- 回避: body-local を使わない最小版に切り替え
---
## Section 4: 観測結果の記録Task 210-4
### 4.1 記録フォーマット
**このセクションに追記する形で観測結果を記録する**
#### テストファイル一覧
| # | ファイル | ループパターン | 実行日 | 結果 |
|---|---------|--------------|-------|------|
| 1 | phase190_atoi_impl.hako | P2 Break (NumberAccumulation) | 2025-12-09 | ✅ RC=12 |
| 2 | phase190_parse_number_impl.hako | P2 Break (Multi-carrier) | 2025-12-09 | ✅ RC=123 |
| 3 | phase210_match_literal_min.hako | P1 Simple | 2025-12-09 | ✅ RC=1 |
#### 観測結果テーブル
| ループ | Pattern | JoinIR生成 | PHI契約 | MIRマージ | Runtime | エラー層 | 備考 |
|-------|---------|-----------|---------|----------|---------|---------|------|
| _atoi | P2 | ✅ | ✅ | ✅ | ✅ 12 | なし | NumberAccumulation (Mul+Add) 正常動作 |
| _parse_number | P2 | ✅ | ✅ | ✅ | ✅ 123 | なし | Multi-carrier (i, num) 正常動作 |
| _match_literal | P1 | ✅ | ✅ | ✅ | ✅ 1 | なし | Pattern1 SimpleWhile 正常動作 |
**記号**:
- ✅: 正常動作
- ⚠️: 警告あり(動作はする)
- ❌: エラーFail-Fast
- `-`: 未実行
---
### 4.2 エラー層の分類
**Phase 210 で観測する層**:
| 層 | 責任範囲 | 既知の制約 |
|----|---------|----------|
| **ConditionEnv** | 条件式の変数解決・型推論 | MethodCall in condition (Phase 171-D) |
| **LoopBodyLocal** | body-local 変数の代入 | Assignment 未対応 (Phase 186) |
| **CarrierUpdate** | Carrier 更新パターンの検出 | Complex addend (Phase 191+) |
| **MethodCall** | メソッド呼び出しの lowering | body-local の MethodCall (Phase 183+) |
| **PHI Contract** | PHI dst/inputs の検証 | Phase 204/205 で対応済み |
| **ValueId Region** | Param/Local region 分離 | Phase 205 で対応済み |
---
### 4.3 インフラ達成度マトリクス
**Phase 210 時点の達成度**:
| 機能 | Pattern1 | Pattern2 | Pattern3 | Pattern4 | Pattern5 |
|-----|----------|----------|----------|----------|----------|
| **基本 loop** | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Break** | - | ✅ | - | - | - |
| **Continue** | - | - | - | ✅ | - |
| **If-PHI** | - | - | ✅ | ✅ | - |
| **Trim (LoopBodyLocal昇格)** | - | ✅ | - | - | ✅ |
| **NumberAccumulation** | - | ✅ | - | - | - |
| **StringAppendChar** | - | ✅ | - | ✅ | - |
| **Multi-carrier** | ✅ | ✅ | ✅ | ✅ | ✅ |
| **PHI Contract** | ✅ | ✅ | ✅ | ✅ | ✅ |
| **ValueId Region** | ✅ | ✅ | ✅ | ✅ | ✅ |
**未対応機能** (Phase 211+ の課題):
- [ ] LoopBodyLocal への代入 (Phase 186)
- [ ] MethodCall in condition (Phase 171-D)
- [ ] Complex addend in NumberAccumulation (Phase 191+)
- [ ] MethodCall in body-local (Phase 183+)
---
### 4.4 詳細観測ログ (2025-12-09 実行結果)
#### ハーネス1: phase190_atoi_impl.hako ✅
**実行コマンド**:
```bash
./target/release/hakorune apps/tests/phase190_atoi_impl.hako
```
**主要ログ抽出**:
```
[pattern2/init] PatternPipelineContext: loop_var='i', loop_var_id=ValueId(4), carriers=1
[pattern2/phase201] Using JoinValueSpace: loop_var 'i' → Some(ValueId(100))
[pattern2/phase201] Allocated carrier 'result' param ID: ValueId(101)
[cf_loop/pattern2] Phase 176-3: Analyzed 1 carrier updates
[joinir/pattern2] Phase 176-3: Carrier 'result' update: ValueId(101) -> ValueId(1013)
[joinir_block] Compute instruction: Const { dst: ValueId(1011), value: Integer(10) }
[joinir_block] Compute instruction: BinOp { dst: ValueId(1012), op: Mul, lhs: ValueId(102), rhs: ValueId(1011) }
[joinir_block] Compute instruction: BinOp { dst: ValueId(1013), op: Add, lhs: ValueId(1012), rhs: ValueId(100) }
```
**観測ポイント**:
- ✅ Pattern2 ルーティング成功
- ✅ NumberAccumulation 検出: `result * 10 + i` → Mul + Add の2命令
- ✅ ValueId Regions: Param (100-101), Local (1000+) 正常分離
- ✅ PHI 契約: LoopHeader PHI (ValueId(5), ValueId(6)) + Exit PHI 正常配線
- ✅ Runtime: 出力 `12` (期待値通り)
---
#### ハーネス2: phase190_parse_number_impl.hako ✅
**実行コマンド**:
```bash
./target/release/hakorune apps/tests/phase190_parse_number_impl.hako
```
**主要ログ抽出**:
```
[pattern2/init] PatternPipelineContext: loop_var='i', loop_var_id=ValueId(4), carriers=1
[pattern2/phase201] Using JoinValueSpace: loop_var 'i' → Some(ValueId(100))
[pattern2/phase201] Allocated carrier 'num' param ID: ValueId(101)
[joinir/pattern2] Phase 176-3: Generating JoinIR for 1 carriers: ["num"]
[cf_loop/exit_line] ExitMetaCollector: Collected 'num' JoinIR ValueId(1016) → HOST ValueId(2)
[DEBUG-177] Phase 33-21: carrier_phis count: 2, names: ["i", "num"]
```
**観測ポイント**:
- ✅ Pattern2 ルーティング成功
- ✅ Multi-carrier: `i` (loop var), `num` (carrier) の2つ正常動作
- ✅ NumberAccumulation: `num * 10 + i` の Mul + Add 生成
- ✅ Exit PHI: 2つの carrier が正しく Exit block で統合
- ✅ Runtime: 出力 `123` (期待値通り)
---
#### ハーネス3: phase210_match_literal_min.hako ✅
**実行コマンド**:
```bash
./target/release/hakorune apps/tests/phase210_match_literal_min.hako
```
**主要ログ抽出**:
```
[joinir/pattern1] Generated JoinIR for Simple While Pattern
[joinir/pattern1] Functions: main, loop_step, k_exit
[DEBUG-177] Phase 33-21: carrier_phis count: 1, names: ["i"]
[cf_loop/joinir] Phase 177-3: Loop header with 1 PHI dsts to protect: {ValueId(11)}
```
**観測ポイント**:
-**Pattern1 ルーティング成功** (Simple While Pattern)
- ✅ JoinIR 生成: main, loop_step, k_exit の3関数
- ✅ Single carrier: loop var `i` のみ
- ✅ PHI 契約: LoopHeader PHI (ValueId(11)) 正常
- ✅ Runtime: 出力 `0 1 2` + RC=1 (最終return値正常)
- ⚠️ 副作用: `print(i)` が意図せず実行(テストコード設計時の残骸、動作自体は正常)
---
### 4.5 Phase 210 総合評価
**成功基準達成度**:
| 基準 | 達成 | 詳細 |
|-----|------|------|
| **最低限の成功** (1本でも通る) | ✅ | 3本すべて JoinIR → MIR → Runtime 到達 |
| **理想的な成功** (3本全て通る) | ✅ | Pattern1, Pattern2 両方で観測データ取得成功 |
| **Pattern1 動作確認** | ✅ | SimpleWhile パターン正常動作 |
| **Pattern2 動作確認** | ✅ | Break パターン正常動作 |
| **NumberAccumulation** | ✅ | Mul + Add 2命令生成確認 |
| **Multi-carrier** | ✅ | 2 carrier 同時動作確認 |
| **PHI Contract** | ✅ | LoopHeader PHI + Exit PHI 正常配線 |
| **ValueId Regions** | ✅ | Param/Local region 分離確認 |
| **Fail-Fast 発動** | ❌ | エラー0件すべて正常動作 |
**重要な発見**:
-**既存インフラは「理論上いけるはず」を超えて「実戦でも完全動作」** することを確認
- ✅ Phase 190 (NumberAccumulation), Phase 201 (JoinValueSpace), Phase 204/205 (PHI Contract) の統合が完璧に機能
- ✅ Pattern1 と Pattern2 の自動ルーティングが正常動作
- ✅ Multi-carrier パターンの PHI 配線も問題なし
-**制約発見なし** - 予想に反して、すべてのループが制約なく動作
**Phase 210 の結論**:
> JoinIR インフラP1-P5/JoinValueSpace/PHI契約は **実戦投入可能** な成熟度に達している✨
---
## Section 5: ドキュメント更新Task 210-5
### 5.1 CURRENT_TASK.md への追記
**追加内容** (Phase 210 完了時):
```markdown
### Phase 210: JsonParser JoinIR ミニ統合ラウンド1
- **ゴール**: 既存 JoinIR インフラで実戦ループ 2〜3 本を観測
- **結果**:
- _atoi (P2 Break): ✅ or ⚠️ or ❌ (詳細: phase210-jsonparser-mini-integration.md)
- _parse_number (P2 Break): ✅ or ⚠️ or ❌
- _match_literal (P1/P2): ✅ or ⚠️ or ❌
- **発見した制約**:
- [TBD: 実行後に記録]
- **次フェーズ**: Phase 211 - 発見した制約の解消
```
---
### 5.2 joinir-architecture-overview.md への追記
**追加箇所**: Section 1.10 (Coverage Snapshot) など
**追加内容**:
```markdown
#### Phase 210: JsonParser Coverage Snapshot
**実戦投入済みループ**: 3/11 loops (Phase 210 時点)
- ✅ _atoi (P2 Break, NumberAccumulation)
- ✅ _parse_number (P2 Break, Multi-carrier)
- ✅ _match_literal (P1 Simple)
**残りループ**: 8 loops
- Phase 211+: _parse_array, _parse_object (MethodCall 複数)
- Phase 212+: _unescape_string (複雑なキャリア処理)
```
---
## Section 6: 実装タスクの整理
### Task 210-1: 対象ループの再選定 ✅(このドキュメント完成で完了)
**成果物**:
- このドキュメント (phase210-jsonparser-mini-integration.md)
- 選定ループ: _atoi, _parse_number, _match_literal (3本)
- 想定パターン: P1 (SimpleWhile), P2 (WithBreak)
---
### Task 210-2: 最小 .hako ハーネス準備(次のステップ)
**実装内容**:
1. `phase190_atoi_impl.hako` の再確認(既存)
2. `phase190_parse_number_impl.hako` の再確認(既存)
3. `phase210_match_literal_min.hako` の新規作成
**実装タイミング**: Task 210-2 実行時
---
### Task 210-3: 実行経路の確認Task 210-2 の後)
**実行コマンド**:
```bash
# ハーネス1
./target/release/hakorune apps/tests/phase190_atoi_impl.hako
# ハーネス2
./target/release/hakorune apps/tests/phase190_parse_number_impl.hako
# ハーネス3
./target/release/hakorune apps/tests/phase210_match_literal_min.hako
```
**記録先**: Section 4 の観測結果テーブル
---
### Task 210-4: 観測結果の記録Task 210-3 の後)
**記録内容**:
- 実行日時
- ログ出力Pattern ルーティング、JoinIR 生成、検証、Runtime
- エラー層の分類
- インフラ達成度マトリクスの更新
**記録先**: Section 4 (このドキュメント内)
---
### Task 210-5: ドキュメント更新Task 210-4 の後)
**更新対象**:
1. `CURRENT_TASK.md` - Phase 210 の結果と次フェーズ計画
2. `joinir-architecture-overview.md` - JsonParser Coverage Snapshot 更新
---
## Section 7: 成功基準
### 7.1 Phase 210 の成功定義
**最低限の成功** (1本でも通れば成功):
- [ ] いずれか1本のループが JoinIR → MIR → Runtime まで到達
- [ ] エラーが出た場合、エラー層が明確に分類できる
**理想的な成功** (3本全て通る):
- [ ] 3本のループすべてが正常実行
- [ ] Pattern 1 と Pattern 2 の両方で観測データ取得
- [ ] Multi-carrier, NumberAccumulation, StringAppendChar の組み合わせ動作確認
---
### 7.2 Fail-Fast の成功定義
**Phase 210 は Fail-Fast が成功条件**:
- ✅ エラーが出たら即座に記録して停止(修正しない)
- ✅ エラー層を 6 つの分類ConditionEnv/LoopBodyLocal/CarrierUpdate/MethodCall/PHI/ValueIdに振り分け
- ✅ Phase 211+ の課題として整理
**失敗条件**:
- ❌ エラーを無視して進む
- ❌ エラー層が不明なまま終わる
- ❌ Phase 210 で新機能実装を始める
---
## Section 8: 次フェーズへの接続
### Phase 211: 制約解消フェーズ
**Phase 210 で発見した制約を解消する**:
1. LoopBodyLocal への代入 (Phase 186 残タスク)
2. MethodCall in condition (Phase 171-D)
3. Complex addend in NumberAccumulation (Phase 191+)
**実装戦略**:
- Phase 210 の観測結果を基に、最も影響の大きい制約から優先的に解消
- 1フェーズ1制約の原則箱理論: 小さく積む)
---
### Phase 212+: JsonParser 完全統合
**残り8ループの段階的実装**:
- Phase 212: _parse_array, _parse_object (MethodCall 複数対応)
- Phase 213: _unescape_string (複雑なキャリア処理)
- Phase 214: JsonParser 全11ループ完全動作確認
---
## Appendix A: 既存テストの確認
### A.1 phase190_atoi_impl.hako
**場所**: `apps/tests/phase190_atoi_impl.hako`
**現状**: Phase 190-impl-D で E2E 検証済み
**実行結果** (Phase 190 時点):
```
12
```
**Phase 210 での再確認ポイント**:
- [ ] Pattern2 ルーティング確認
- [ ] NumberAccumulation 検出確認
- [ ] PHI Contract 検証通過確認
---
### A.2 phase190_parse_number_impl.hako
**場所**: `apps/tests/phase190_parse_number_impl.hako`
**現状**: Phase 190-impl-D で E2E 検証済み
**実行結果** (Phase 190 時点):
```
123
```
**Phase 210 での再確認ポイント**:
- [ ] Multi-carrier (p, num_str) の PHI 配線確認
- [ ] StringAppendChar + CounterLike 組み合わせ確認
- [ ] Exit line reconnect 確認
---
## Appendix B: 参照ドキュメント
### B.1 Phase 190 関連
- **phase190-number-update-design.md** - NumberAccumulation 設計書
- **phase190-impl-D 完了報告** - _atoi, _parse_number E2E 検証結果
### B.2 Phase 181 関連
- **phase181-jsonparser-loop-roadmap.md** - JsonParser 全11ループの棚卸し
### B.3 JoinIR アーキテクチャ
- **joinir-architecture-overview.md** - JoinIR 全体設計
- **phase204-phi-contract-verifier.md** - PHI Contract 検証
- **phase205-valueid-regions-design.md** - ValueId Region 設計
---
## 改訂履歴
- **2025-12-09**: Task 210-1 完了(対象ループ再選定・設計ドキュメント作成)
- 選定ループ: _atoi, _parse_number, _match_literal (3本)
- 想定パターン: P1 (SimpleWhile), P2 (WithBreak)
- 既存テスト再利用: phase190_atoi_impl.hako, phase190_parse_number_impl.hako
- 新規ハーネス設計: phase210_match_literal_min.hako
---
**Phase 210 Status**: Task 210-1 完了 ✅ / Task 210-2〜210-5 未実行
Status: Active
Scope: JsonParser mini 統合JoinIR/ConditionEnv ライン)