docs: Phase 103 plan (if-only parity baseline)

This commit is contained in:
nyash-codex
2025-12-17 17:39:12 +09:00
parent 733b4fa950
commit 935d475882
5 changed files with 97 additions and 8 deletions

View File

@ -59,6 +59,8 @@ JoinIR の箱構造と責務、ループ/if の lowering パターンを把握
- `docs/development/current/main/phases/phase-100/README.md` - `docs/development/current/main/phases/phase-100/README.md`
13. Phase 102: real-app read_quoted loop regressionVM + LLVM EXE 13. Phase 102: real-app read_quoted loop regressionVM + LLVM EXE
- `docs/development/current/main/phases/phase-102/README.md` - `docs/development/current/main/phases/phase-102/README.md`
14. Phase 103: if-only regression baselineVM + LLVM EXE / plan
- `docs/development/current/main/phases/phase-103/README.md`
6. MIR BuilderContext 分割の入口) 6. MIR BuilderContext 分割の入口)
- `src/mir/builder/README.md` - `src/mir/builder/README.md`
7. Scope/BindingIdshadowing・束縛同一性の段階移行 7. Scope/BindingIdshadowing・束縛同一性の段階移行

View File

@ -1,5 +1,11 @@
# Self Current Task — Now (main) # Self Current Task — Now (main)
## 2025-12-17Phase 100 P3 完了 ✅
**Phase 100 P3: String Accumulator Captures**
- String accumulator`out = out + ch`を最小形で固定し、VM/LLVM EXE parity を smoke で検証
- LLVM EXE 側の stringish 伝播PHI/copy/binopを修正し、concat の意味論を安定化
## 2025-12-17Phase 100 P2 完了 ✅ ## 2025-12-17Phase 100 P2 完了 ✅
**Phase 100 P2: Mutable Accumulator Captures** **Phase 100 P2: Mutable Accumulator Captures**
@ -23,9 +29,8 @@
- escape 末尾バックスラッシュを best-effort として固定(`hello\` そのまま出力) - escape 末尾バックスラッシュを best-effort として固定(`hello\` そのまま出力)
- VM+LLVM EXE parity 完全対応、integration smoke で検証済み - VM+LLVM EXE parity 完全対応、integration smoke で検証済み
Next設計メモ: 関連(設計/実装の入口:
- Phase 100: Pinned ReadOnly Capturesループ外 local を loop 内 receiver として解決): `docs/development/current/main/phases/phase-100/README.md` - Phase 100: `docs/development/current/main/phases/phase-100/README.md`
- 段階投入: P1=readonlyPinned→ P2=mutable は LoopStatecarrier/env
## 20251215Phase 132 完了 ✅ ## 20251215Phase 132 完了 ✅

View File

@ -8,13 +8,19 @@ Related:
## 直近JoinIR/selfhost ## 直近JoinIR/selfhost
- **Phase 103: if-only regression baselineVM + LLVM EXE**
- ねらい: loop が無い `if`merge/return を含む)を VM/LLVM EXE parity で固定し、ループ系の回帰を早期検知する。
- 入口: `docs/development/current/main/phases/phase-103/README.md`
- **real-app loop regression の横展開VM + LLVM EXE**
- ねらい: 実コード由来ループを 1 本ずつ最小抽出して fixture/smoke で固定する(段階投入)。
- 現状: Phase 102read_quotedまで固定済み。
- 次候補: `parse_object` / `parse_array` の key/value ループ、read_digits 系。
- 入口: `docs/development/current/main/phases/phase-102/README.md`
- **P5b “完全E2E”**escape skip の実ループを end-to-end で固定) - **P5b “完全E2E”**escape skip の実ループを end-to-end で固定)
- 現状: Phase 94 で VM E2E まで固定済み。次は selfhost 実コード(`apps/selfhost-vm/json_loader.hako`)へ横展開して回帰を減らす。 - 現状: Phase 94 で VM E2E まで固定済み。次は selfhost 実コード(`apps/selfhost-vm/json_loader.hako`)へ横展開して回帰を減らす。
- 入口: `docs/development/current/main/phases/phase-94/README.md` - 入口: `docs/development/current/main/phases/phase-94/README.md`
- **Pinned ReadOnly CapturesPhase 100**
- ねらい: loop 外 local動的式でも可を loop 内 receiver として解決できるようにする(`receiver not found` を潰す)。
- 段階投入: P1=readonlyPinned→ P2=mutable は LoopStatecarrier/envへ昇格。
- 入口: `docs/development/current/main/phases/phase-100/README.md`
- **制御の再帰合成docs-only → dev-only段階投入** - **制御の再帰合成docs-only → dev-only段階投入**
- ねらい: `loop/if` ネストの “構造” を SSOTControlTree/StepTreeで表せるようにする - ねらい: `loop/if` ネストの “構造” を SSOTControlTree/StepTreeで表せるようにする
- 注意: canonicalizer は観測/構造SSOTまでValueId/PHI配線は Normalized 側へ) - 注意: canonicalizer は観測/構造SSOTまでValueId/PHI配線は Normalized 側へ)
@ -22,6 +28,10 @@ Related:
## 中期(ループ在庫の残り) ## 中期(ループ在庫の残り)
- **loop(true) + break-onlydigit scan など)**
- ねらい: bounded ではない実ループを段階的に飲み込むfixture + shape guard + Fail-Fast
- 方針: “新パターン増殖”よりも Pattern5 系infinite loop familyとして扱う設計を先に固める。
- **P5guard-bounded**: 大型ループを “小粒度” に割ってから取り込む(分割 or 新契約) - **P5guard-bounded**: 大型ループを “小粒度” に割ってから取り込む(分割 or 新契約)
- **P6nested loops**: capability guard で Fail-Fast 維持しつつ、解禁時の契約を先に固定 - **P6nested loops**: capability guard で Fail-Fast 維持しつつ、解禁時の契約を先に固定

View File

@ -11,6 +11,9 @@
- **Phase 136**: MirBuilder Context SSOT 化(+ ValueId allocator 掃討) - **Phase 136**: MirBuilder Context SSOT 化(+ ValueId allocator 掃討)
- **Phase 137141**: Loop Canonicalizer前処理 SSOT導入Phase 137 フォルダに統合して記録) - **Phase 137141**: Loop Canonicalizer前処理 SSOT導入Phase 137 フォルダに統合して記録)
- **Phase 9192**: Selfhost depth2 coverageP5b escape recognition → lowering - **Phase 9192**: Selfhost depth2 coverageP5b escape recognition → lowering
- **Phase 94100**: P5b escape E2E / Trim policy / pinned + accumulatorVM/LLVM EXE parity
- **Phase 102**: real-app read_quoted loop regressionVM + LLVM EXE
- **Phase 103**: if-only regression baselineVM + LLVM EXE / plan
## Phase フォルダ構成(推奨) ## Phase フォルダ構成(推奨)
@ -46,4 +49,4 @@ phases/phase-131/
--- ---
**最終更新**: 2025-12-15 **最終更新**: 2025-12-17

View File

@ -0,0 +1,69 @@
# Phase 103: if-only regression baselineVM + LLVM EXE
Status: Active
Scope: loop を含まない `if` の lowering/merge を、VM と LLVM EXE で同一出力に固定する。
Related:
- 入口: `docs/development/current/main/10-Now.md`
- 地図: `docs/development/current/main/design/joinir-design-map.md`
- 既存の LLVM EXE smoke / plugin gating: `docs/development/current/main/phases/phase-97/README.md`
## 目的
- 「loop が無い `if`」でも JoinIR 経路if lowering + mergeが壊れないことを、**VM/LLVM EXE parity** で固定する。
- ループ系の変更Pattern2/4/derived/pinned/mutable accumulatorの回帰を、if-only で早期検知できるようにする。
- CI は最小のまま(`tools/smokes/v2``integration` にのみ追加)。
## P0: Fixture + integration smokes最小
### 1) fixture
- 追加: `apps/tests/phase103_if_only_merge_min.hako`
- 要件:
- `if { ... } else { ... }` で同一変数へ代入し、mergePHI 相当)が必要になる形にする。
- nested if を 1 段だけ入れて「if の中の if」も踏む。
- 出力は **数値 1 行**(例: `2`に固定exit code には依存しない)。
### 2) VM smoke
- 追加: `tools/smokes/v2/profiles/integration/apps/phase103_if_only_vm.sh`
- 実行:
- `HAKO_JOINIR_STRICT=1 ./target/release/hakorune --backend vm apps/tests/phase103_if_only_merge_min.hako`
- 先頭 `[` のデバッグ行は除外して数値行のみを比較するPhase 97 方式)。
- 受け入れ:
- stdout の数値行が `2` と一致。
### 3) LLVM EXE smoke
- 追加: `tools/smokes/v2/profiles/integration/apps/phase103_if_only_llvm_exe.sh`
- 方針:
- Phase 97/98 と同様に、必要 plugin の `.so``ctypes.CDLL` で確認し、必要時のみ `tools/plugins/build-all.sh` を実行。
- `tools/build_llvm.sh` で exe を生成して実行し、数値行のみを比較する。
- 受け入れ:
- stdout の数値行が `2` と一致。
## 受け入れ基準P0
- `bash tools/smokes/v2/profiles/integration/apps/phase103_if_only_vm.sh` が PASS
- `bash tools/smokes/v2/profiles/integration/apps/phase103_if_only_llvm_exe.sh` が PASS前提不足は SKIP
- 回帰確認:
- `bash tools/smokes/v2/profiles/integration/apps/phase94_p5b_escape_e2e.sh` が PASS
- `bash tools/smokes/v2/profiles/integration/apps/phase97_next_non_ws_llvm_exe.sh` が PASS前提不足は SKIP
- 新しい環境変数は追加しない(既存の `HAKO_JOINIR_STRICT` などで制御)。
## P1任意: if-only early return
if 文の then/else 内で return する形merge 不要 or merge 途中で returnを 1 本追加して、Boundary/ExitLine の退行を拾いやすくする。
## Next別フェーズ候補
### loop(true) + break-onlydigit scan など)
現状の Pattern 群では、`loop(true)` で **continue なし / break 複数**の実ループが取りこぼされやすい。
- 実在例:
- `apps/libs/json_cur.hako:29``read_digits_from`
- `apps/selfhost-vm/json_loader.hako:25``read_digits_from`
- 進め方(箱理論):
- “新パターン増殖” ではなく、**Pattern5 系infinite loop family**として扱う方針を先に決める。
- まずは fixture + shape guard + Fail-Fast で段階投入し、VM/LLVM parity を固めてから lowering を広げる。