# Phase 273 P3 — “Plan Lowering SSOT Finalize” (Claude Code Instructions)

目的:
- Phase 273 P2 で導入した generalized CoreLoopPlan を SSOT として固定し、legacy fallback を撤去して収束を完成させる。

前提:
- Extractor は pure（builder 触り禁止）
- Pattern知識は Normalizer に閉じる
- Lowerer は CorePlan のみを処理（pattern-agnostic）
- terminator SSOT は `Frag → emit_frag()` のみ

## Scope

P3 でやる:
1. Pattern6 を generalized CoreLoopPlan（`frag/block_effects/phis/final_values`）へ移行
2. `lower_loop_legacy()` を撤去し、generalized 経路を SSOT 化（Fail-Fast）
3. CoreLoopPlan の `Option<...>` を必須化して “揺れ” を構造で消す（可能なら）

P3 でやらない:
- Pattern8/その他 pattern の Plan 化（別フェーズ）
- CorePlan の vocabulary 増殖（variant追加禁止）

## Tasks

### Task 1: Pattern6 を generalized CoreLoopPlan へ移行

対象:
- `src/mir/builder/control_flow/plan/normalizer.rs`

やること:
- ScanWithInit の normalize で以下を構築する:
  - `block_effects`: header/body/step の効果（ValueId は normalizer で生成・型登録）
  - `phis`: header の loop-carrier PHI
  - `frag`: header/body の BranchStub + wires（step→header, found→Return(i), after→Return(-1) など現行仕様に合わせる）
  - `final_values`: `i` の最終値（after で使うならその ValueId）
- legacy field（`header_effects/body/step_effects/carriers/cond_*` など）を空/未使用にするか、最終的に削除する。

注意:
- ScanWithInit は “return” を含むので、Frag wires に Return を含める（emit_frag SSOT）。
- `ensure_block_exists` が必要なブロック（after/found 等）は Lowerer で担保する。

### Task 2: Lowerer の legacy fallback を撤去

対象:
- `src/mir/builder/control_flow/plan/lowerer.rs`

やること:
- `lower_loop_legacy()` を削除
- `lower_loop()` は generalized フィールドを必須として扱い、欠落時は Err（Fail-Fast）
  - 例: `block_effects/phis/frag/final_values` が None なら `[lowerer] missing generalized loop fields` で Err

狙い:
- Lowerer から `emit_scan_with_init_edgecfg()` 等の pattern 参照を完全に消す。

### Task 3: CoreLoopPlan の “必須化”（可能な範囲で）

対象:
- `src/mir/builder/control_flow/plan/mod.rs`

やること:
- `block_effects/phis/frag/final_values` を `Option` から非Optionへ変更（できるなら）
- legacy fields を削除（この時点で Pattern6/7 が generalized を使っていることが前提）

### Task 4: Verifier の拡張（generalized 専用の不変条件）

対象:
- `src/mir/builder/control_flow/plan/verifier.rs`

例:
- `phis` が空でないこと（carrierがある場合）
- `frag.entry` が header_bb に一致すること（loopのentry SSOT）
- `block_effects` に header/body/step が含まれること（最低限）

### Task 5: 回帰テスト

VM:
- `bash tools/smokes/v2/profiles/integration/apps/phase254_p0_index_of_vm.sh`
- `bash tools/smokes/v2/profiles/integration/apps/phase256_p0_split_vm.sh`
- `bash tools/smokes/v2/profiles/integration/apps/phase258_p0_index_of_string_vm.sh`

LLVM（必ず harness で、mock禁止）:
- `cargo build --release --features llvm`
- `bash tools/smokes/v2/profiles/integration/apps/phase256_p0_split_llvm_exe.sh`
- `bash tools/smokes/v2/profiles/integration/apps/phase258_p0_index_of_string_llvm_exe.sh`

注意:
- `NYASH_LLVM_USE_HARNESS=1` で `--features llvm` が無い場合は fail-fast する（mock禁止）。

## Acceptance Criteria

- Lowerer から `emit_scan_with_init_edgecfg()` 等の pattern 固有参照が消えている
- Pattern6/7 が generalized CoreLoopPlan を使用している
- legacy fallback が撤去され、欠落時は Err（Fail-Fast）
- 上記 smokes がすべて PASS（VM/LLVM）

