Files
hakorune/CURRENT_TASK.md
nyash-codex a0009d474d feat(mir): Loop Canonicalizer Phase 3 - skip_whitespace pattern recognition
## Summary
skip_whitespace パターンを Skeleton→Decision で認識可能に。
dev-only 観測で chosen=Pattern3IfPhi / missing_caps=[] を固定。

## Changes
- src/mir/loop_canonicalizer/mod.rs:
  - try_extract_skip_whitespace_pattern() 追加
    - loop(cond) { ... if check { p = p + 1 } else { break } } パターン認識
    - carrier name, delta, body statements を抽出
  - canonicalize_loop_expr() 拡張(skip_whitespace 対応)
    - Pattern3IfPhi 成功時は RoutingDecision::success 返却
    - Skeleton に HeaderCond, Body, Update ステップ追加
    - CarrierSlot に Counter role 設定
    - ExitContract に has_break=true 設定
  - Phase 3 unit tests 追加
    - test_skip_whitespace_pattern_recognition: 基本パターン
    - test_skip_whitespace_with_body_statements: body 付きパターン
    - test_skip_whitespace_fails_without_else: else なし失敗
    - test_skip_whitespace_fails_with_wrong_delta: 減算パターン失敗
  - Phase 2 obsolete tests 削除
- src/mir/builder/control_flow/joinir/routing.rs:
  - Debug 出力拡張(chosen pattern 表示)

## Tests
- cargo test --release --lib loop_canonicalizer::tests: PASS(11 tests)
- cargo test --release --lib: PASS(1044 tests, 退行なし)
- HAKO_JOINIR_DEBUG=1 test_pattern3_skip_whitespace.hako:
  - chosen=Pattern3IfPhi 
  - missing_caps=[] 

## Validation
-  dev-only 観測(HAKO_JOINIR_DEBUG=1)のときだけログ出力
-  フラグ OFF 時は完全不変
-  skip_whitespace パターンで SUCCESS 固定
-  unit tests で全パターン固定

Phase 137-3 complete
2025-12-16 05:38:18 +09:00

113 lines
6.0 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/` 以下の各 Phase 文書と、JoinIR の SSOT である
`docs/development/current/main/joinir-architecture-overview.md` を参照してね。
最終更新: 2025-12-15
過去ログ(肥大化した旧 CURRENT_TASKはここに退避したよ:
- `docs/development/current/main/CURRENT_TASK_ARCHIVE_2025-12-13.md`
---
## 今の状態Phase 7490 まで到達)
- Scope/BindingId の段階移行dev-onlyは Pattern2/3/4 まで配線済みdual-path 維持)。
- Pattern2 の promoted carriersDigitPos/Trimについて ExitLine 契約ConditionOnly を exit PHI から除外)を E2E で固定済み。
- debug flag SSOT / DebugOutputBox 移行 / error tags 集約 / carrier init builder まで整備済み。
- **LLVM exe line SSOT 確立**: `tools/build_llvm.sh` を使用した .hako → executable パイプライン標準化完了。
- **LLVM AOTPython llvmliteループ復旧**: `apps/tests/loop_min_while.hako` が EMIT/LINK/RUN まで到達Phase 131-3..10)。
- Case C`loop(true)` + break/continueは Phase 131-11 で Pattern/shape guard を整備し、Phase 132-P2 で LLVM EXE まで parity`Result: 3`)を確認。
- **Phase 132 完了**: ループ exit 値exit PHI / boundaryの VM/LLVM parity を根治。
- JoinIR/Boundary: exit 値を境界に明示的に渡す
- LLVM Python: PHI を落とす/上書きする経路を除去PHI SSOT を保護)
- JoinIR merge: exit PHI dst の allocator を function-level に統一ValueId 衝突を排除)
- debug-only: Exit PHI collision を早期検出する verifier を追加LLVM 実行時に壊れる前に Fail-Fast
- **Phase 133 完了**: Promoted carrier の `join_id` 解決Trimを SSOT に寄せて根治smoke は compile-only
- **Phase 134 完了**: Plugin loader best-effort loading決定的順序 + failure 集約 + 継続)を導入。
- **Phase 135 完了**: ConditionLoweringBox allocator SSOTP0: 根治修正 + P1: contract_checks Fail-Fast 強化)。
- **Phase 136 完了**: MirBuilder Context SSOT 化(+ ValueId allocator 掃討)。
- **Phase 137-2 完了**: Loop Canonicalizerdev-only 観測)まで完了(既定挙動は不変)。
- **Phase 88 完了**: continue + 可変ステップi=i+const 差分)を dev-only fixture で固定、StepCalculator Box 抽出。
- **Phase 89 完了**: P0ContinueReturn detector+ P1lowering 実装)完了。
- **Phase 90 完了**: ParseStringComposite + `Null` literal + ContinueReturn同一値の複数 return-ifを dev-only fixture で固定。
- `cargo test --release --lib` は PASS を維持993 passed、退行なし
参照:
- `docs/development/current/main/10-Now.md`
- `docs/development/current/main/phase86-90-loop-frontends-summary.md`
- `docs/development/current/main/phase73-scope-manager-design.md`
- `docs/development/current/main/phase80-bindingid-p3p4-plan.md`
- `docs/development/current/main/phase81-pattern2-exitline-contract.md`
- `docs/development/current/main/phase78-85-boxification-feedback.md`
- `docs/development/current/main/phase87-selfhost-llvm-exe-line.md`
- `docs/development/current/main/phase131-2-box-resolution-map.md`
- `docs/development/current/main/phase131-3-llvm-lowering-inventory.md`
- `docs/development/current/main/phase131-5-taglink-fix-summary.md`
- `docs/development/current/main/phases/phase-132/README.md`
- `docs/development/current/main/investigations/phase132-llvm-exit-phi-wrong-result.md`
- `docs/development/current/main/investigations/phase132-case-c-llvm-exe.md`
---
## 次の指示書(優先順位)
### P0: Loop Canonicalizer の Phase 3Skeleton→Decision の精密化)
**状態**: ✅ Phase 2 まで完了、Phase 3 へ
**目的**: `LoopSkeleton` から `RoutingDecision`chosen/missing_caps/notesを安定に計算し、代表ケース`skip_whitespace`)で “期待する選択” をテストで固定する(既定挙動は不変)。
SSOT:
- `docs/development/current/main/design/loop-canonicalizer.md`
実装:
- `src/mir/loop_canonicalizer/mod.rs`
**次に触るSSOT**:
- Loop系の設計: `docs/development/current/main/joinir-architecture-overview.md`
注意:
- 既定挙動は変えないdev-only で観測→段階投入)
- 新しい環境変数は増やさない(`joinir_dev_enabled()` の範囲で観測する)
### P1: JoinIR / Selfhost depth-2 の前進(実装可能 - Phase 91 候補)
**状態**: ✅ 実装可能
目的:
- JsonParserBox の残り複合ループを JoinIR 対応する。
- または selfhost .hako コンパイラの他部分Lexer/ASTBuilder 等)で JoinIR 適用範囲を拡大する。
**次に触るSSOT**:
- Loop系: `docs/development/current/main/joinir-architecture-overview.md`
- VM Box系: `docs/development/current/main/phase131-2-box-resolution-map.md`
やること(設計→実装の順):
1. 候補ループの抽出JsonParserBox or Lexer/ASTBuilder
2. Pattern 判定Pattern 1-4 のいずれか、または新 Pattern 提案)
3. JoinIR lowering 実装 + E2E テスト
受け入れ基準:
- 代表ケースが 1 コマンドで再現可能CI は増やさない、quick を重くしない)。
### P2: Ownership/Relay runtime 対応の再開Phase 92 候補)
目的:
- multihop/merge relay を “runtime でも” 受理できるところまで契約を伸ばすFail-Fast の段階解除)。
受け入れ基準:
- dev-only 既定OFF のまま、既存ラインを壊さない。
### Done: Phase 8690Loop frontends
- まとめSSOT: `docs/development/current/main/phase86-90-loop-frontends-summary.md`
- MirBuilder の入口Context 分割): `src/mir/builder/README.md` + `docs/development/current/main/01-JoinIR-Selfhost-INDEX.md`
---
## すぐ走らせる確認コマンド
- `cargo test --release --lib`
- `NYASH_JOINIR_NORMALIZED_DEV_RUN=1 cargo test --features normalized_dev --test normalized_joinir_min -- --nocapture`