Phase 63-4: infer_type_from_phi を『JoinIR 型ヒント優先+従来ロジックフォールバック』に縮退する仕様を設計(実装は Phase 63-5+)
## Changes
### Documentation Updates
- **README.md**: Added complete Phase 63-4 design (63-4.1 through 63-4.5)
- 63-4.1: Current state analysis (definition location, callsites, role, JoinIR preparation)
- 63-4.2: Degradation spec (type_hint priority + fallback pattern)
- 63-4.3: Representative cases and A/B testing strategy (P1/P2/P3)
- 63-4.4: Deletion conditions (5 conditions, current: 2/5 = 40%)
- 63-4.5: Phase 63-5 handoff (infer_type_from_phi_with_hint() implementation tasks)
- **PHI_BOX_INVENTORY.md**: Updated if_phi.rs entry with Phase 63-4 deletion plan
- Added: "Phase 63-4完了: infer_type_from_phi の JoinIR type_hint 優先への縮退案を設計(実装は Phase 63-5+)"
- **CURRENT_TASK.md**: Added Phase 63-4 section with summary of design work
## Design Highlights
### Degradation Pattern
```rust
pub fn infer_type_from_phi_with_hint(
function: &MirFunction,
ret_val: ValueId,
types: &BTreeMap<ValueId, MirType>,
type_hint: Option<MirType>,
) -> Option<MirType> {
if let Some(hint) = type_hint {
return Some(hint); // Route B: JoinIR priority (SSOT)
}
infer_type_from_phi(function, ret_val, types) // Route A: Fallback
}
```
### Representative Cases
- **P1**: IfSelectTest.simple/local (Phase 63-5 target)
- **P2**: read_quoted_from (Phase 63-6+ target)
- **P3**: MethodCall/Box constructors (Phase 64+ expansion)
### Deletion Conditions (2/5 achieved)
1. ✅ JoinIR has type_hint field (Phase 63-3)
2. ✅ Type hints populated for representative cases (Phase 63-2)
3. ⏳ Degraded to type_hint priority (Phase 63-5)
4. ⏳ P1 cases determined by type_hint only (Phase 63-5)
5. ⏳ All functions use type hints (Phase 64+)
## Files Changed
- docs/private/roadmap2/phases/phase-63-joinir-type-info/README.md
- docs/private/roadmap2/phases/phase-30-final-joinir-world/PHI_BOX_INVENTORY.md
- CURRENT_TASK.md
## Next Steps
Phase 63-5: Implement degradation for P1 cases (IfSelectTest.simple/local)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
20 KiB
20 KiB
Current Task — JoinIR / PHI 削減スナップショット(2025-11-29 時点)
このファイルは「今どこまで終わっていて、次に何をやるか」を 1000 行以内でざっくり把握するためのスナップショットだよ。
過去の詳細ログはdocs/private/roadmap2/CURRENT_TASK_2025-11-29_full.mdや各 Phase の README/TASKS を見てね。
0. 現在地ざっくり
-
最終ゴール
- 制御構造と PHI の意味論は JoinIR(+LoopScopeShape/IfPhiContext 等の薄い箱) に一本化する。
- 実行の SSOT は VM / LLVM ラインとし、JoinIR→MIR→VM/LLVM は「構造 SSOT → 実行 SSOT」への変換として扱う。
- 既存の PHI 箱(if_phi.rs / PhiBuilderBox / conservative.rs / Trio 等)は、JoinIR 側のカバレッジが十分になったところから順に削っていく。
-
JoinIR ライン
- Phase 27–31: Loop→JoinIR lowering(skip_ws / trim / append_defs / Stage‑1 minimal)で、ループの制御構造を関数+継続だけで表現できることを実証済み。
- Phase 33–34: IfSelect / IfMerge / JoinIR Frontend(If/Loop/Break/Continue)実装。AST→JoinIR→MIR→VM まで tiny ケースが通る。
-
PHI 削減ライン
- Phase 35–36: HIGH/MEDIUM 安全度の PHI 箱(if_body_local_merge / phi_invariants / LoopSnapshotMergeBox)の削除・縮退で 537 行削減。
- Phase 37–40: If 側 PHI(if_phi.rs / conservative.rs)の Level 1/2 相当まで設計+一部削減。array_ext.filter については JoinIR Frontend + JoinFuncMeta に移行し、collect_assigned_vars を削除済み。
-
これから
- Phase 41: If 側 PHI Level 3(本体ロジック)の代表ケースを JoinIR 経路に載せる設計と最初の実装。
- 以降: If 側 PHI 本体削減 → Classifier Trio → AST→JoinIR Frontend 本線化 → LLVM / ny-llvmc の JoinIR 統合。
1. 最近の主戦場(Phase 33–41)
1-00a. Phase 33 — IfSelect / IfMerge + PHI 設計原則
- IfSelect / IfMerge lowering 実装(simple/local, 2–3 変数パターン)。
- VM ラインへの If lowering ドライランを
IfLoweringDryRunnerに箱化し、VM パイプラインと解析ロジックを分離。 - 「JoinIR は PHI 生成器(SSOT)、既存 PHI の変換器にはしない」原則をコード+docs で固定。
- docs:
docs/private/roadmap2/phases/phase-33-joinir-if-phi-cleanup/if_joinir_design.md
1-00b. Phase 34 — JoinIR Frontend(AST→JoinIR)
- 目的: AST(Program JSON v0)→ JoinIR Frontend を設計・実装し、「PHI 意味論の SSOT を JoinIR 側に寄せる」。
- 実績:
- If: simple/local/json_shape パターンを Select に正規化(同じ JoinIR 出力)。
- Loop: tiny while / break / continue を 3 関数構造(entry/loop_step/k_exit)+ Jump/Call/Select で表現。
- MethodCall: substring などを JoinInst::MethodCall として構造化し、JoinIR→MIR Bridge で BoxCall に変換。
- docs:
docs/private/roadmap2/phases/phase-34-joinir-frontend/README.md
1-00c. Phase 35–36 — PHI 箱削減(HIGH/MEDIUM)
- Phase 35(HIGH):
if_body_local_merge.rs/phi_invariants.rs削除(合計 430 行)。- PHI_BOX_INVENTORY.md で PHI 箱の一覧と削除順を整理。
- Phase 36(MEDIUM):
- LoopSnapshotMergeBox を「Exit PHI マージ専用の純粋静的ユーティリティ」に縮退(470→363 行)。
- PhiBuilderBox に Loop/If/Common/Stub の責務マーカー追加(実装本体削減は Phase 38+)。
- docs:
docs/private/roadmap2/phases/phi-reduction-series/INDEX.mddocs/private/roadmap2/phases/phase-36-phi-midrange/README.md
1-00d. Phase 37–39 — If 側 PHI Level 1/2 設計と準備
- Phase 37: If 側 PHI 全体設計(docs-only)。
- if_phi.rs / conservative.rs の責務表、12 callsite の難易度分類。
- 削除基準(Level 1/2/3)の定義。
- Phase 38: if_phi.rs Level 1 削除(90 行)。
merge_modified_with_control(dead code)とextract_assigned_var(JoinIR AST lowering で代替)を削除。
- Phase 39: Level 2 準備(array_ext.filter 選定と JoinIR 拡張設計)。
- array_ext.filter を代表 if-in-loop パターンに選定。
- JoinIR Frontend / JoinFuncMeta / Bridge 拡張と削除条件を設計。
- docs:
docs/private/roadmap2/phases/phase-37-if-phi-reduction/README.mddocs/private/roadmap2/phases/phase-38-if-phi-level1/README.mddocs/private/roadmap2/phases/phase-39-if-phi-level2/README.md
1-00e. Phase 40 — If 側 PHI Level 2 実装(array_ext.filter)
- 目的: array_ext.filter の if‑in‑loop PHI を JoinIR Frontend + JoinFuncMeta + Bridge 経由に移し、collect_assigned_vars を削除する。
- 実績:
- JoinFuncMeta / JoinFuncMetaMap / convert_join_module_to_mir_with_meta 実装。
- AST→JoinIR Frontend で if‑in‑loop の modified 変数集合を解析し、JoinIR→MIR Bridge で PHI 生成。
- loop_builder.rs に HAKO_JOINIR_ARRAY_FILTER 経路を追加し、Route B(JoinIR 経路)をデフォルト化。
collect_assigned_varsを削除し、JSON ベースのcollect_assigned_vars_via_joinirに置き換え(Phase 40-4.1)。- デッドな env フラグ等をクリーンアップ(40-4.1.1)。
- 削減実績(Phase 40 時点):
- 35 行(collect_assigned_vars)+16 行(デッドコード)= 51 行純減。
- docs:
docs/private/roadmap2/phases/phase-40-if-phi-level2/README.mddocs/private/roadmap2/phases/phi-reduction-series/INDEX.md
1-00f. Phase 41 — If-Side PHI Level 3 Reduction ✅ 完了(2025-11-28)
- 目的:
- if_phi.rs / conservative.rs に残る「Level 3 本体ロジック」を JoinIR 経路に移すための設計と代表ケース実装。
- 実績:
- Level 3 関数の再インベントリとデッドコード 147 行削除。
- 代表 If 関数として
ParserControlBox.parse_loop()を選定。 - NestedIfMerge JoinInst 設計+実装(mod.rs, json.rs)。
- AST→JoinIR Frontend に
lower_nested_if_pattern()追加(dev flag:HAKO_JOINIR_NESTED_IF=1)。 - JoinIR→MIR Bridge に NestedIfMerge 展開ロジック追加(多段 Branch + Copy)。
- Route B(NestedIfMerge 経由)の A/B テスト 7 ケース全 PASS(parse_loop 代表ケース)。
- 実削除(if_phi.rs / conservative.rs 本体の縮退・削除)は Phase 42 に繰り越し。
- docs:
docs/private/roadmap2/phases/phase-41-if-phi-level3/README.mddocs/private/roadmap2/phases/phase-41-if-phi-level3/TASKS.md
1-00g. Phase 45 — read_quoted_from JoinIR 実装 ✅ 完了(2025-11-28)
- 目的:
MiniJsonCur.read_quoted_from(s, pos)を JoinIR Frontend/Bridge で実装し、Guard if + Loop with break + accumulator パターンの PHI 削減を実証。
- 実績:
- 45-1: フィクスチャ
apps/tests/phase45_read_quoted_fixture.hako作成(T1-T4 Route A で PASS)。 - 45-2: AST→JoinIR Frontend
lower_read_quoted_pattern()実装(ast_lowerer.rs)。 - 45-3: JoinIR→MIR Bridge 確認(既存 bridge で変更不要)。
- 45-4: Route B E2E テスト
test_read_quoted_from_route_b_e2e()追加、T1-T4 全 PASS。 - 45-5: PHI_BOX_INVENTORY.md / CURRENT_TASK.md 更新。
- 45-1: フィクスチャ
- 既知の制限:
- T5(エスケープ処理): 変数再代入 inside if-block が PHI を生成しない問題 → Phase 46 で解決済み。
- Dev Flag:
HAKO_JOINIR_READ_QUOTED=1 - JoinIR 構造: entry → k_guard_fail / loop_step → k_exit(4 関数構造)
- docs:
docs/private/roadmap2/phases/phase-30-final-joinir-world/PHI_BOX_INVENTORY.md(Phase 45 セクション)
1-00h. Phase 46 — IfMerge 拡張(ループ内 if での変数再代入 PHI 問題)✅ 完了(2025-11-28)
- 目的:
- ループ内の
if (cond) { x = expr; }パターンで、if-body での変数再代入が merge ブロックで PHI に反映されない問題を修正。
- ループ内の
- 実績:
- 46-1: 現状 MIR の問題点を CFG 図で固定(T5 専用)。
- 46-2: JoinIR レベルでの「正しい形」を IfMerge で設計(Option A 採用)。
- 46-3:
lower_read_quoted_pattern()に IfMerge 拡張を設計・実装。 - 46-4: Route B E2E テスト T1-T5 全 PASS。
- テスト結果:
- T1-T4: ✅ PASS(Phase 45 と同じ)
- T5(エスケープ処理): ✅ PASS(
"a\"b"→a"b)
- Dev Flag:
HAKO_JOINIR_READ_QUOTED_IFMERGE=1(Phase 46 IfMerge 拡張有効化) - 修正ファイル:
src/mir/join_ir/frontend/ast_lowerer.rs: IfMerge による escape 処理追加src/mir/join_ir_vm_bridge.rs: T5 テストケース追加
- docs:
docs/private/roadmap2/phases/phase-46-ifmerge-loop-reassign/README.md
1-00i. Phase 49–56 — JoinIR Frontend 本線統合(print_tokens / filter)✅ 完了
- Phase 49–52:
cf_loopに JoinIR Frontend ルートを追加し(dev フラグ付き)、LoopFrontendBinding/ JSON v0 / expr タイプ(Field/NewBox)を整備。HAKO_JOINIR_PRINT_TOKENS_MAIN/HAKO_JOINIR_ARRAY_FILTER_MAINで対象ループだけを Frontend 経由にルーティング。merge_joinir_mir_blocksで JoinIR→MIR のブロック/値 ID リマップと制御フロー接続を実装。
- Phase 53–55: statement lowering(Local/Assignment/Print/Method/If)と AST→JSON の
"type"/"expr"整備により、JsonTokenizer.print_tokens/1が JoinIR Frontend→Bridge→VM 経由で最後まで実行可能に(Route A/B 等価、dev フラグ ON 限定)。 - Phase 56:
ArrayExtBox.filter/2向けにLoopFrontendBinding::for_array_filterを MethodCall ベース(arr.size())に修正し、外部参照arr/predを Binding 経由で渡す構造に統一。- JoinIR に
ConditionalMethodCall/ Unary / Call を追加し、filter の「pred が true のときだけ push する」パターンを 4 ブロック構造で表現。 HAKO_JOINIR_ARRAY_FILTER_MAIN=1で Route B(JoinIR Frontend 経路)がフォールバックなし完走(テスト済み、既定は従来ルート)。
- JoinIR に
1-00j. Phase 57–61 — If 側 PHI Level 3 本体(conservative/if_phi 残り)✅ 仕上げ中
- Phase 57 では、新しい抽象を増やさずに既存の Conservative/IfPHI 本体のうち安全な部分を薄くした。
phi.rsでの冗長なConservativeMerge::analyze呼び出しを 2 回→1 回に削減し、軽量化。PhiMergeOpstrait と loop_builder.rs 側の実装を完全削除し、Loop 側の PHI 生成責務を JoinIR+LoopScopeShape 側に寄せた。infer_type_from_phiには「レガシー型推論箱であり、JoinIR 型情報導入後の削減候補」であることをコメントで明示し、将来の削除条件をドキュメント化。
- Phase 58 では ConservativeMerge 本体を
phi_merge.rs::merge_all_varsにインライン化し、conservative.rsの多くをドキュメントコメント+最小限の補助関数だけに縮退。- conservative.rs: 149 行 → 57 行(約 92 行削減、約 62% 削減)。
- ConservativeMerge struct 定義と付随テストコードを削除し、挙動差分がないことを phi_core / JoinIR テストで確認。
- Phase 61-1〜61-3 では If-in-loop 専用の箱化を進め、JoinIR 側に PHI 生成の SSOT を寄せた。
- IfPhiContext でループ内 If の CFG と変数スナップショットをまとめ、IfInLoopPhiEmitter で pre/then/else の snapshot と carrier 集合から必要な φ を構成する thin box を追加。
- dev フラグ
HAKO_JOINIR_IF_IN_LOOP_ENABLE=1有効時には、JoinIR パターンマッチ成功した if-in-loop について JoinIR + IfPhiContext + IfInLoopPhiEmitter 経路で PHI を生成できるようになった(Route A/B 互換、既定はまだ legacy)。
- Phase 61-4: If Toplevel PHI (Fallthrough-Join) 実装 ✅ 完了(2025-11-29)
- ループ外 If の「then 直後に結合点がない」パターン(toplevel_return)を JoinIR で表現。
- IfInLoopPhiEmitter が IfPhiContext::pure_if() でループ外 If もサポート(統一インターフェース)。
toplevel_if_ret_explicit.hakoテストで toplevel_return パターン動作確認済み。- docs:
docs/development/current/main/phase61-4-toplevel-if-design.md
- Phase 61-5: If PHI 削減計画策定 ✅ 完了(2025-11-29)
- 61-5.1: If PHI 関数リスト作成(26関数、3カテゴリ)
- 61-5.2: JoinIR カバレッジ調査(in_loop/partial/none)
- 61-5.3: 優先度表作成(P1: 18関数、P2: 5関数、P3: 3関数)
- 61-5.4: Phase 61-6 候補選定(3個: set_if_context, dev フラグ, A/B テスト削除)
- docs:
docs/development/current/main/phase61-5-*.md
- Phase P1: If Handler 箱化モジュール化 ✅ 完了(2025-11-29)
- ループ内 If 処理の 5 パターン(Empty/SingleVarThen/SingleVarBoth/ConditionalEffect/Unsupported)を
IfInLoopPatternenum で分類。 if_in_loop/モジュール(9 ファイル、~480 行)を新設し、stmt_handlers.rsから 154 行削減(40% 削減達成)。- 全 56 JoinIR tests PASS(回帰なし)、保守性・拡張性向上(新パターン追加が容易に)。
- docs:
docs/development/refactoring/p1-if-handler-boxification-plan.md
- ループ内 If 処理の 5 パターン(Empty/SingleVarThen/SingleVarBoth/ConditionalEffect/Unsupported)を
1-00g. Phase 61-6 — If PHI JoinIR 化 第2弾(薄いラッパー削減)
- 目的: If 側 PHI ラインから JoinIR と二重管理になっていた薄いラッパー/観察専用ユーティリティを取り除き、PHI 仕様の SSOT を JoinIR 側に寄せる。
- 実績:
set_if_context薄いラッパーを削除し、callsite から直接IfPhiContextを構築するよう統一。IfPhiContext の入口が一本化され、文脈箱(IfPhiContext)と emitter 箱(IfInLoop/Toplevel)の責務分離がより明確になった。- PhiBuilderBox ベースの PhiSpec 観察用関数(
extract_phi_spec_from_builder,compare_and_log_phi_specsなど)を削除し、PHI 仕様計算を JoinIR 起点のcompute_phi_spec_from_joinirに一本化。 - 合計約 97 行削減(予想 76 行を超過)。If 側 PHI の「観察・比較」は JoinIR 情報から復元する経路のみとなり、if_phi/PhiBuilderBox は本番ロジックに専念する構造に整理された。
1-00h. Phase 62 — PHI Core Cleanup(phi_core 小箱クリーンアップ)
-
目的: PHI 箱のうち、既に機能が JoinIR/loopform/phi_merge 側に移っていて「殻だけ残っていた」小箱を片付け、phi_core 直下の実コードをさらに減らす。
-
実績:
phi_core/phi_input_collector.rsを削除。Phase 59/59b で loopform_builder.rs / loop_builder.rs へのインライン化が完了しており、外部依存 0 であることを PHI_BOX_INVENTORY ベースで確認済み。phi_core/conservative.rsを 57 行すべてコメントのみの「歴史メモ」ファイルに縮退(実コードは Phase 58 でphi_merge.rs::merge_all_vars側にインライン済み)。将来的に docs/ への移設候補として扱う。- PHI_BOX_INVENTORY.md / phi-reduction-series/INDEX.md / CURRENT_TASK.md を更新し、「PhiInputCollector 削除済み」「ConservativeMerge 本体は inline 済みで conservative.rs は docs 専用」という現状を明示。
-
JoinIR/phi_core 関連テストは全て PASS。既知の
localキーワード問題を除き、新たな退行はなし。
1-00i. Phase 63-3 — JoinIR 型ヒントの最小配線
- 目的: infer_type_from_phi を削る前に、「JoinIR 側で MirType をどこに持てばよいか」を決め、そのための schema 変更と最小限のコード更新を行う。
- 実績:
JoinInst::SelectとMergePairにtype_hint: Option<MirType>を追加し、If PHI に関わる値まわりに型ヒントをぶら下げる足場を用意した。- Select / MergePair を生成する全サイト(if_select.rs / if_merge.rs / nested_if.rs / read_quoted.rs など 13 ファイル)を更新し、新フィールドを一旦
type_hint: Noneで埋めてビルドが通る状態に統一。 - JoinIR 関連テスト(IfSelect/IfMerge/Frontend 系)はすべて PASS。挙動は従来どおりだが、今後 AST/Frontend/Bridge から型ヒントを流し込む準備が整った。
1-00j. Phase 63-4 — infer_type_from_phi 縮退設計(設計のみ)
- 目的: infer_type_from_phi を『JoinIR 型ヒント優先+従来ロジックフォールバック』に縮退する仕様を docs に固定(実装は Phase 63-5+)。
- 実績:
- 63-4.1: infer_type_from_phi の現状整理(定義場所 / 呼び出し元 / 役割 / JoinIR 準備状況)を文書化。
- 63-4.2: 縮退後の仕様設計(type_hint がある場合は優先、ない場合は従来ロジックへフォールバック)。
- 63-4.3: 代表ケースと A/B テスト方針(P1: IfSelectTest.simple/local, P2: read_quoted_from, P3: MethodCall/Box コンストラクタ)を整理。
- 63-4.4: 削除条件の明確化(5条件、現時点達成率 2/5 = 40%)。
- 63-4.5: Phase 63-5 への引き継ぎ(infer_type_from_phi_with_hint() 実装タスク定義)。
- docs:
docs/private/roadmap2/phases/phase-63-joinir-type-info/README.md,PHI_BOX_INVENTORY.md更新済み
2. 中期 TODO(ざっくり)
- Phase 42: PHI Workaround 条件付きスキップ ✅ 完了(2025-11-28)
- ✅ 42-1: PHI workaround 内容の文書化完了(README.md に記録)
- ✅ 42-2:
parser_control_box.hako:85-139に条件付きスキップ実装- Route A(default): workaround 使用(後方互換性維持)
- Route B(
HAKO_JOINIR_NESTED_IF=1): workaround スキップ - Route B テスト 3/3 PASS、Route A テスト 13/13 PASS
- ✅ 42-3: callsite 再分析・Phase 43 候補リスト作成完了
- if_phi.rs: 4残存関数(全て parse_loop 以外からも呼ばれる)
- conservative.rs: ConservativeMerge::analyze が phi_merge.rs/phi.rs から使用中
- Phase 43 推奨: NestedIfMerge 適用範囲拡大 → phi_merge.rs JoinIR 移行
- docs:
docs/private/roadmap2/phases/phase-42-if-phi-level3-removal/README.md
- Phase 43+: If 側 PHI 本体削除
- if_phi.rs / conservative.rs の残存関数は全て parse_loop 以外からも呼ばれている
- 他の関数(print_tokens 等)も JoinIR 経路に乗せてから本体削除
- Phase 61-7+: If PHI 大型統合(P2 候補)
compute_modified_names_if: 変更変数検出を JoinIR の modified 変数集合解析に統合(~75行)get_conservative_if_values: incoming 値解決を PhiSpec に移行、void fallback 削除(~70行)- 期待削減: 合計 145行
- Classifier Trio
- LoopVarClassBox / LoopExitLivenessBox / LocalScopeInspectorBox を LoopScopeShape に吸収し、JoinIR lowering / LoopForm 側から直接 LoopScopeShape を見る構造に整理。
- Mir 決定性(小フェーズ予定)
- 一部テスト(
loop_with_continue_and_break_edge_copy_merge/nested_loop_with_multi_continue_break_edge_copy_merge)で、MirFunction.blocks: HashMap/BasicBlock.predecessors: HashSetに起因する非決定的な predecessor 順のフラッキーテストが残っている。 - 将来の小フェーズで Phase 25.1 と同様のパターン(
BTreeMap/BTreeSetなど決定的な順序構造、もしくはテスト側で sort 比較)に寄せて解消する予定。
- 一部テスト(
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 27–32 — JoinIR 初期実験〜汎用化
- LoopToJoinLowerer / LoopScopeShape / JoinIR VM Bridge を minimal ケースから Stage‑1 / Stage‑B へ広げていくライン。
- docs:
docs/private/roadmap2/phases/phase-27-joinir*,phase-31-looptojoin-lowerer,phase-32-joinir-complete-migrationなど。
CURRENT_TASK.md 自体は「いまどこを触っているか」と「次に何をやるか」を
1 画面で把握できる軽さを維持する方針だよ。***