## Phase 188.3 進捗: Phase 2 完了 (6/13 tasks) ### 実装完了 ✅ **Phase 1: Fixture作成** - apps/tests/phase1883_nested_minimal.hako 追加 - Add/Compare のみ(乗算なし) - 期待 exit code: 9 (3×3 nested loops) - 既存 lowering で fallback 動作確認 **Phase 2: 選択ロジック (SSOT)** - LoopPatternContext に step_tree_max_loop_depth フィールド追加 - choose_pattern_kind() に Pattern6 選択ロジック実装: 1. Cheap check (has_inner_loop) 2. StepTree 構築 (max_loop_depth 取得) 3. AST validation (is_pattern6_lowerable) - pattern6_nested_minimal.rs モジュール作成 (stub) - LOOP_PATTERNS に Pattern6 entry 追加 - **検証**: Pattern6 が正しく選択される ✅ ### 設計原則 (確認済み) 1. **Fail-Fast**: Pattern6 選択後は Ok(None) で逃げない 2. **outer 変数 write-back 検出 → validation false** (Phase 188.4+) 3. **最小実装**: inner local だけ、Pattern1 モデル二重化 4. **cfg! 依存なし**: production で動作 ### 検証結果 ``` [choose_pattern_kind] has_inner_loop=true [choose_pattern_kind] max_loop_depth=2 [choose_pattern_kind] is_pattern6_lowerable=true ✅ Pattern6 SELECTED! ``` Stub からの期待エラー: ``` [ERROR] ❌ [Pattern6] Nested loop lowering not yet implemented ``` ### 次: Phase 3 (Lowering 実装 - 推定4時間) 残りタスク: - Phase 3-1: AST 抽出ヘルパー - Phase 3-2: Validation ヘルパー - Phase 3-3: Continuation 生成 (outer_step, inner_step, k_inner_exit) - Phase 3-4: fixture が exit=9 を返すことを検証 ### 変更ファイル **新規**: - apps/tests/phase1883_nested_minimal.hako - src/mir/builder/control_flow/joinir/patterns/pattern6_nested_minimal.rs - docs/development/current/main/phases/phase-188.{1,2,3}/README.md **変更**: - src/mir/builder/control_flow/joinir/routing.rs (Pattern6 選択) - src/mir/builder/control_flow/joinir/patterns/router.rs (Context 拡張) - src/mir/builder/control_flow/joinir/patterns/mod.rs (module 宣言) 🎯 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Smokes v2 — Minimal Runner and Policy
Profiles
quick
- Purpose: Fast feedback for development
- Target: ~45 seconds, ~400 tests (Phase 287 P2: 45.85s / 413 tests ✅)
- Contents: Minimal gate tests - basic syntax, using resolution, essential control flow
- Excluded: Heavy selfhost/Stage-B, crate exe, S3/LLVM integration, long-running tests (>0.4s)
integration
- Purpose: Integration and heavier tests
- Contents: Selfhost canaries, Stage-B, crate exe, S3/LLVM, phase-specific comprehensive tests
- Run:
./tools/smokes/v2/run.sh --profile integration
full
- Purpose: Complete regression coverage
- Contents: All tests (network of quick + integration + additional)
- Run:
./tools/smokes/v2/run.sh --profile full
plugins
- Purpose: Plugin-specific tests (dynamic loading, etc.)
- Run:
./tools/smokes/v2/run.sh --profile plugins
Policy
- Use [SKIP:] prefix for environment/host dependent skips.
- Examples: [SKIP] hakorune not built, [SKIP:env] plugin path missing
- Keep reasons short and stable to allow grep-based canaries.
- Prefer JSON-only output in CI: set
NYASH_JSON_ONLY=1to avoid noisy logs. - Diagnostics lines like
[provider/select:*]are filtered by default inlib/test_runner.sh.- Toggle: set
HAKO_SILENT_TAGS=0to disable filtering and show raw logs.HAKO_SHOW_CALL_LOGS=1also bypasses filtering.
- Toggle: set
Helpers
tools/smokes/v2/lib/mir_canary.shprovides:extract_mir_from_output— between [MIR_BEGIN]/[MIR_END]assert_has_tokens,assert_skip_tag,assert_order,assert_token_count
tools/lib/canary.shprovides minimal, harness-agnostic aliases:extract_mir_between_tags— same asextract_mir_from_outputrequire_tokens token...— fail if any token missing
Notes
- Avoid running heavy integration smokes in CI by default. Use
--profile quick. - When a test depends on external tools (e.g., LLVM), prefer
[SKIP:<reason>]over failure. - Stage‑B/selfhost canaries(
stage1_launcher_*,phase251*など)は Stage‑3 デフォルト環境で安定しないため、quick プロファイルでは[SKIP:stageb]として扱い、必要に応じて別プロファイル(integration/full)で個別に実行する。 - Selfhost quick カバレッジは最小 1 本(
core/selfhost_minimal.sh)に絞り、Stage‑3 + JoinIR 前提で Stage‑B→VM を通るかだけを確認する。 - S3 backend 向けの長尺テスト群も quick 向きではないため、timeout を短く保ちたい場合は
[SKIP:slow]にして別途ローカルで回すことを推奨する。
Quick tips
- EXE-heavy cases (e.g.,
phase2100/*) may take longer. When running quick with these tests, pass a larger timeout like--timeout 120. - Smokes v2 auto-cleans temporary crate EXE objects created under
/tmp(pattern:ny_crate_backend_exe_*.o) after the run.
Developer Notes
- JoinIR If/Select (Phase 33): A/B test with
NYASH_FEATURES=stage3 HAKO_JOINIR_IF_SELECT=1 ./target/release/hakorune apps/tests/joinir_if_select_simple.hako(dev-only、CI対象外。NYASH_JOINIR_CORE は deprecated/無視)