Files
hakorune/CURRENT_TASK.md
nyash-codex 13ce9e6888 docs(phase71): Phase 71 初回観測完了 - SSA/selfhost 根本原因特定
## Phase 71 観測成果 (2025-12-02)

###  完了項目
- Phase 70完了直後にPhase 71代表パス実行成功
- RAW観測レイヤ活用成功 (707K log)
- SSA undef根本原因特定 (4件)
- dev verify問題特定 (1件)
- JoinIR/プラグイン正常動作確認

### 🔍 特定した根本原因

**SSA undef (4件)**:
1. ParserCommonUtilsBox.trim/1 - ValueId(272)未定義
2. ParserBox.trim/1 - ValueId(272)未定義
3. Main._parse_number/1 - ValueId(12)未定義
4. ParserBox.parse_block2/2 - ValueId(440)未定義

**dev verify警告 (1件)**:
- StageBDriverBox NewBox直後にbirth()未呼び出し

**重要な気づき**:
- JoinIR経路は正常動作 (問題なし)
- プラグイン初期化は成功 (問題なし)
- 真の問題はSSA/Stage-B MIR生成時のValueId未定義

### 📊 実行結果
```
rc_stageb=0        (Stage-B実行成功)
extract_ok=0       (Program JSON抽出失敗)
Program JSON行: 0件 (emit失敗)
```

### 📝 ドキュメント追加
- phase71-findings-20251202.md: 詳細観測レポート
- CURRENT_TASK.md L112-128: Phase 71完了記録

### 🎯 次のステップ
Phase 71-SSA-debugへ引き継ぎ:
- trim系関数 SSA undef修正 (4件 → 0件)
- StageBDriverBox birth警告解消 (1件 → 0件)
- Program JSON emit復活 (0件 → 1件以上)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-02 10:19:07 +09:00

16 KiB
Raw Blame History

Current Task — JoinIR / PHI 削減スナップショット2025-11-29 時点)

このファイルは「今どこまで終わっていて、次に何をやるか」を 1000 行以内でざっくり把握するためのスナップショットだよ。
過去の詳細ログは docs/private/roadmap2/CURRENT_TASK_2025-11-29_full.md や各 Phase の README/TASKS を見てね。


0. 現在地ざっくり

  • JoinIR ラインは Phase 68 で一旦 Chapter Close

    • Phase 27-67 で JoinIR の「第1章構造 + PHI + 型ヒント SSOT」が完了。
    • 4つの柱Structure / Scope / JoinIR / Type Hintsが確立。
    • Trio 削除ラインPhase 70 完了を経て、wasm/Web デモラインと最適化ラインに分岐。
    • 詳細: phase-30-final-joinir-world/README.md
  • 最終ゴール

    • 制御構造と PHI の意味論は JoinIRLoopScopeShape/IfPhiContext 等の薄い箱) に一本化する。
    • 実行の SSOT は VM / LLVM ラインとし、JoinIR→MIR→VM/LLVM は「構造 SSOT → 実行 SSOT」への変換として扱う。
    • 既存の PHI 箱if_phi.rs / PhiBuilderBox / conservative.rs / Trio 等は、JoinIR 側のカバレッジが十分になったところから順に削っていく。
  • Stage-3 parser デフォルトON化Phase 30.1 完了): config::env::parser_stage3_enabled() で NYASH_FEATURES=stage3 をSSOT化し、legacy env は明示OFF専用の互換に縮退。

  • JoinIR Strict 着手Phase 81: NYASH_JOINIR_STRICT=1 で代表パスのフォールバックを禁止JoinIR失敗は即エラー。dev/trace は観測のみ継続。

  • これからPhase 69+

    • wasm/Web デモライン: JoinIR ベースの軽量デモ実装。
    • 最適化ライン: JoinIR の最適化パスと LLVM/ny-llvmc 統合。
    • Trio 削除ライン: 完了Phase 70、LoopScopeShape SSOT
    • JoinIR Strict ラインPhase 81: 代表 If/Loop/VM ブリッジについては NYASH_JOINIR_STRICT=1 で常に JoinIR 経路のみを通すようにし、レガシー if_phi / LoopBuilder / 旧 MIR Builder は「未対応関数専用」に縮退。

1. JoinIR 第1章完了までの道のりPhase 3367 簡潔版)

Phase 33-62: 構造 + PHI + スコープの基盤構築 完了

  • Phase 33-34: IfSelect/IfMerge lowering 実装、AST→JoinIR Frontend 設計・実装If/Loop/Break/Continue
  • Phase 35-36: PHI 箱削減 HIGH/MEDIUM537行削減: if_body_local_merge / phi_invariants / LoopSnapshotMergeBox 縮退)
  • Phase 37-40: If 側 PHI Level 1/2設計array_ext.filter 移行、collect_assigned_vars 削除)
  • Phase 41-46: If 側 PHI Level 3NestedIfMerge、read_quoted_from、IfMerge 拡張)
  • Phase 49-56: JoinIR Frontend 本線統合print_tokens / filter
  • Phase 57-62: If 側 PHI 本体削減conservative.rs 縮退、If Handler 箱化、PHI Core Cleanup

詳細: 各 Phase の README を参照(docs/private/roadmap2/phases/phase-*/README.md


Phase 63-67: 型ヒントライン完全実装 完了2025-11-30

Phase 63-3: JoinIR 型ヒント最小配線

  • JoinInst::SelectMergePairtype_hint: Option<MirType> 追加
  • 13ファイル更新、全 JoinIR テスト PASS

Phase 63-4: infer_type_from_phi 縮退設計

  • 型ヒント優先+従来ロジックフォールバック仕様を docs 化
  • 削除条件 5/5 を定義P1: IfSelectTest, P2: read_quoted/IfMerge, P3: Method/Box

Phase 63-5: infer_type_from_phi 縮退実装

  • infer_type_from_phi_with_hint() 実装(+44行
  • lifecycle.rs で呼び出し経路統一
  • 削除条件達成率: 3/560%

Phase 63-6: P1 ケース型ヒント完全実装

  • MirInstruction::Phitype_hint 追加21ファイル修正
  • JoinIR→MIR Bridge で型ヒント伝播実装
  • P1 ケースIfSelectTest.*)で JoinIR 型ヒントのみで型決定
  • 削除条件達成率: 4/580%

Phase 64: P2 型ヒント拡大

  • P2 ケースread_quoted_from, IfMerge型ヒント実装
  • is_type_hint_target() 箱化TypeHintPolicy 萌芽)
  • 削除条件達成率: 4.5/590%

Phase 65: P3-A/B 型ヒント実装

  • P3-A: type_inference.rs 新設、JoinInst::MethodCall に型ヒントStringBox メソッド)
  • P3-B: JoinInst::NewBox に型ヒントBox コンストラクタ)
  • 代表ケースベースで削除条件 5/5 達成

Phase 66: P3-C ジェネリック型推論箱化

  • generic_type_resolver.rs 新設180行
  • TypeHintPolicy::is_p3c_target() 追加
  • ArrayBox.get / MapBox.get 等のジェネリック型推論基盤確立

Phase 67: P3-C 実利用への一歩

  • phase67_generic_type_resolver.rs テスト追加3テスト全 PASS
  • lifecycle.rs に P3-C 経路フック追加GenericTypeResolver 優先使用)
  • A/B テストで旧経路との一致確認11 tests PASS

技術的成果:

  • JoinIR が構造 + PHI + 型ヒントの SSOT として確立
  • infer_type_from_phi は P3-C フォールバック専用に縮退
  • 4つの柱Structure / Scope / JoinIR / Type Hints完成

Phase 69: MIR 決定性 & Trio 経路の整理 一部完了2025-11-30

  • 目的: LoopSnapshotMergeBox / LoopForm 周辺の Inspector/Trio 依存を整理しつつ、MIR の predecessor 順を決定的にしてフラッキーテストを解消する。
  • 実績:
    • 69-1: LoopSnapshotMergeBox と Trio 経路の現状を確認し、merge_exit_with_classification が LocalScopeInspectorBox を引き回しているだけであり、情報自体は LoopScopeShape/ExitAnalysis 側に揃っていることを整理。
    • 69-2: merge_exit_with_classification から Inspector 引数を削除し、LoopScopeShape/ExitAnalysis 経由で必要な情報を取る形に縮退(約 42 行削減)。既存の 3 テストはすべて PASS。
    • 69-3: BasicBlock.predecessorsHashSetBTreeSet に変更するなど、MIR の predecessor イテレーションを決定的にし、これまで非決定性でフラッキーだった 2 つのループ系テストを安定化。loopform 14/14 / merge_exit 3/3 を含む関連テストはすべて PASS。
  • 未了:
    • 69-5: conservative.rs の docs/ 移設も今後の小フェーズとして残しておく。
  • 追加完了 (Phase 70):
    • 69-4: Trio 3 箱LoopVarClassBox / LoopExitLivenessBox / LocalScopeInspectorBoxを削除し、LoopScopeShape を SSOT とする構成に移行。2025-12-01 時点でコードベース再スキャン済みで、Trio 本体ファイルおよび Trio Box 直接参照は src/mir/ から完全に除去されていることを確認名称としての「Trio」は docs の歴史メモ内にのみ残存)。

2. 次の一手Phase 69+

直近の候補タスク

  • P3-C 拡大 / If PHI 本体削除Phase 70+ 候補)

    • GenericTypeResolver 経由で全 P3-C ケースをカバー
    • infer_type_from_phi 本体削除と if_phi.rs 大掃除
  • Phase 71: SelfHosting 再ブートストラップ(初回観測完了! 2025-12-02

    • docs/private/roadmap2/phases/phase-71-selfhost-reboot/README.md で代表パス 1 本Stage3 + JoinIR 前提)と ENV 方針を整理済み。
    • 代表パス(確定): NYASH_FEATURES=stage3 NYASH_USE_NY_COMPILER=1 NYASH_NY_COMPILER_EMIT_ONLY=1 NYASH_SELFHOST_KEEP_RAW=1 ./tools/selfhost/selfhost_build.sh --in apps/tests/stage1_run_min.hako --run
    • Phase 71初回実行成果 (2025-12-02):
      • Phase 70完了直後にPhase 71代表パス実行成功
      • RAW観測レイヤ活用成功 (logs/selfhost/stageb_20251202_101623_2665649.log 707K)
      • 根本原因特定: SSA undef (4件) + dev verify (1件) が Program JSON emit失敗を引き起こしている
      • JoinIR/プラグイン初期化は 問題なし (JoinIR経路正常動作、プラグイン成功確認)
    • SSA undef詳細 (4件):
      1. ParserCommonUtilsBox.trim/1 - ValueId(272)未定義
      2. ParserBox.trim/1 - ValueId(272)未定義
      3. Main._parse_number/1 - ValueId(12)未定義
      4. ParserBox.parse_block2/2 - ValueId(440)未定義
    • dev verify警告 (1件): StageBDriverBox NewBox直後にbirth()未呼び出し
    • 完了判定基準: 観測窓としてのPhase 71は完了。SSA修正はPhase 71-SSA-debugへ引き継ぎ。
    • 詳細レポート: docs/development/current/main/phase71-findings-20251202.md
    • quick プロファイルでは JoinIR/VM 系は緑維持を目標としつつ、selfhost_minimal / stageb_min_emit は「SSA ラインの観測窓」として赤許容。StageB/SSA 起因の赤は Phase 71-SSA 側でハンドルする。
  • Phase 72: JoinIR dev フラグ棚卸しdocs + env ポリシー整備済み、配線寄せ残)

    • config::env::joinir_core_enabled() / joinir_dev_enabled() を追加し、Core/DevOnly/Deprecated の区分を整理
    • docs/private/roadmap2/phases/phase-72-joinir-dev-flags/README.md に一覧表を追加済み
    • コード側のガード集約と smokes タイムアウト調整s3 backend 長尺の扱い)を残タスクとして追う
  • Phase 73: ENV 整理・不要フラグ削除JoinIRStage3 周辺)

    • docs/private/roadmap2/phases/phase-73-env-cleanup/README.md に Stage3 / JoinIR / その他 ENV の棚卸しと Dead/Alias/Keep の分類方針を追加
    • 実コードからは parser_stage3_enabled() / joinir_core_enabled() / joinir_dev_enabled() 経由で判定し、legacy/env 名は Alias-only 扱いとして段階的に削除候補へ寄せていく
    • Stage3 旧 ENV は tools/selfhost/hako_check + JoinIR/LoopForm/PHI テスト + Stage1/SSA 代表テストBatchCからは排除済みで、残りは dev/perf 用や一部 SSA/StageB 系テストと docs の歴史メモに限定されているPhase 7311 で現状を棚卸し済み)
  • Phase 73-7: Stage3 旧 ENV の縮退

    • tools/selfhost/hako_check から NYASH_PARSER_STAGE3 / HAKO_PARSER_STAGE3 を順次削除し、Stage3 gate を NYASH_FEATURES=stage3 ベースに移行開始
    • Rust tests 側の Stage3 alias は次フェーズでグループごとに NYASH_FEATURES=stage3 へ寄せる予定
  • Phase 73-8: Rust tests BatchA の Stage3 ENV 縮退

    • JoinIR/PHI 周辺の代表テストmir_loopform_* / mir_joinir_* の一部)を対象に、NYASH_PARSER_STAGE3 / HAKO_PARSER_STAGE3NYASH_FEATURES=stage3 に置き換え開始
  • Phase 73-9: Rust tests BatchB の Stage3 ENV 縮退

    • 残りの JoinIR 系テストjoinir_runner_min / mir_joinir_* / joinir_json_min / joinir_vm_bridge_* / joinir/mainline_phase49についても、Stage3 旧 ENV を廃止し NYASH_FEATURES=stage3 ベースに統一
  • wasm/Web デモラインPhase 71 候補)

    • JoinIR ベースの軽量デモ実装
    • ブラウザで動く最小構成
  • 最適化ラインPhase 72+ 候補)

    • JoinIR 最適化パス実装
    • LLVM/ny-llvmc 統合強化

今後の優先タスク順selfhost + hack_check 観点の整理)

  1. Phase 71-SSA/selfhost 再ブートストラップの収束
    • StageB/SSA ラインを「観測窓」として整えつつ、selfhost_build + stage1_run_min.hako が JSON v0 emit まで通るかどうかを確認する。
    • この段階では JoinIR Strict は代表 if/loop/VM ブリッジに限定し、selfhost_minimal/stageb_min_emit の赤は SSA 側の課題として扱う。
  2. Phase 7273: ENV / JoinIR dev フラグの集約完了
    • joinir_core_enabled() / joinir_dev_enabled() / parser_stage3_enabled() を SSOT として使い切り、tools/selfhost/hako_check/tests から旧 ENV を整理する。
    • ここまでで「selfhost / hack_check / tests が同じ Stage3 + JoinIR/ENV ポリシー上に乗る」状態を目指す。
  3. Phase 80: VM/LLVM 本線の JoinIR 統一
    • VM/LLVM ランナーで、ループ/if の代表ケースskip_ws/trim/resolve/print_tokens/filter 等)が JoinIR→MIR→VM/LLVM を本線として通ることを確認する。
    • quick プロファイルでは NYASH_JOINIR_CORE=1 を既定としつつ、レガシー経路は JoinIR 未対応ケース専用とする。
  4. Phase 81: selfhost 用 JoinIR Strictfail-fast の確立
    • selfhost 実行系・スクリプト側で NYASH_JOINIR_CORE=1 NYASH_JOINIR_STRICT=1 NYASH_FAIL_FAST=1 を既定とし、
      代表パスskip_ws / trim / resolve / print_tokens / filter / Stage1/StageB 代表)が JoinIR 経由でのみ通ることを確認する。
    • hack_check ラインは引き続き「Stage3 + 旧 MIR Builder + VM」の安定ルートとして維持し、Strict の影響を受けないようにしておく。
  5. Phase 82-if-phi-retire: P3-C 完了if_phi.rs 削除
    • P3-C 代表ケースを含む型決定を GenericTypeResolver で食い切り、lifecycle.rs から infer_type_from_phi* 呼び出しを排除する。
    • collect_assigned_vars_via_joinir を JoinIR/AST 側の分析モジュールに移し、phi_core::if_phi への参照をゼロにした上で if_phi.rs を削除する。
    • 必要であれば、後続フェーズで hack_check 側も JoinIR/型ヒントラインに徐々に寄せていくただし現時点では「selfhost を先に Strict 化、hack_check は安定 VM ライン維持」を優先)。

バックログ

  • StageB/selfhost smokes の扱い整理Phase 30.1 フォロー)

    • quick プロファイルで stage1_launcher_* / phase251* 系が Stage3 デフォルト環境で不安定。今後、quick では SKIP にするか、StageB emit 抽出ロジックを安定化するかを決める。
    • MirFunction.blocks: HashMapBTreeMap で非決定的テスト解消
    • Phase 25.1 同様のパターン適用
  • Phase 71-SSA: StageB / selfhost ラインは「SSA デバッグ用の観測窓」として切り出し、
    代表パスselfhost_build + stage1_run_min.hakoが JSON v0 emit まで通るかどうかを別フェーズで追う。
    詳細: docs/private/roadmap2/phases/phase-71-ssa-debug/README.md

  • Phase 81-JoinIR-Strict: JoinIR を「if/loop/PHI の真」として扱い、
    JoinIR 対象関数では if_phi / LoopBuilder / 旧 MIR Builder にフォールバックしない Strict モードを導入する。
    代表 If/Loopmir_joinir_if_select / mir_stage1_staticcompiler_receiver / mir_joinir_stage1_using_resolver_min
    NYASH_JOINIR_CORE=1 NYASH_JOINIR_STRICT=1 で全て green を確認済みStrict で lowering 失敗なし)。
    代表パスskip_ws / trim / resolve / print_tokens / filter / read_quoted / Stage1/StageB 代表)では、
    JoinIR lowering / VM ブリッジ失敗を即エラー扱いとし、レガシー経路は「未対応関数専用」に縮退させる。

  • Phase 82-if-phi-retire予定: P3-C ジェネリック型推論ラインを拡張し、
    lifecycle.rs から infer_type_from_phi* 呼び出しを完全に排除するP3-C まで GenericTypeResolver で食い切る)。
    あわせて collect_assigned_vars_via_joinir を JoinIR/AST 側の分析モジュールに移動し、
    phi_core::if_phi への実コードからの参照をゼロにした上で if_phi.rs 本体を削除する(歴史メモは docs 側にのみ保持)。


3. 旧フェーズ(過去ログへのポインタ)

古いフェーズの詳細な経緯やログは、以下のドキュメントと
docs/private/roadmap2/CURRENT_TASK_2025-11-29_full.md を見てね。

  • Phase 21.7 — Static Box Methodization
    • StaticMethodId / NamingBox で BoxName.method/arity 名前解決の SSOT 化。
    • docs: docs/development/current/main/phase-21.7-naming-ssot-checklist.md など。
  • Phase 25.x / 26.x — LoopForm v2 / LoopSSA v2 / Exit PHI / ExitLiveness
    • LoopForm v2 / LoopSSA v2 の整備と Exit PHI / ExitLiveness まわりの 4 箱構成。
  • Phase 2732 — JoinIR 初期実験〜汎用化
    • LoopToJoinLowerer / LoopScopeShape / JoinIR VM Bridge を minimal ケースから Stage1 / StageB へ広げていくライン。
    • docs: docs/private/roadmap2/phases/phase-27-joinir*, phase-31-looptojoin-lowerer, phase-32-joinir-complete-migration など。

CURRENT_TASK.md 自体は「いまどこを触っているか」と「次に何をやるか」を
1 画面で把握できる軽さを維持する方針だよ。***