Status: Completed
Scope: Phase 252 (JoinIR Pattern2 break 条件: `this.methodcall(...)` 対応 + policy SSOT)
Related:
- docs/development/current/main/10-Now.md
- docs/development/current/main/phases/phase-251/README.md

# Phase 252: Pattern2 break 条件の `this.methodcall(...)` 対応

## 目的

- `--profile quick` の `json_lint_vm` で露出した JoinIR Pattern2 の回帰を潰す。
- 具体的には `if not this.is_whitespace(s.substring(i, i + 1)) { break }` のような
  `this.methodcall(...)` を break 条件として lowering できるようにする。

## 実装（P0/P1: 完了）

### 1) ユーザー定義メソッドの許可ポリシー（SSOT）

ファイル:
- `src/mir/join_ir/lowering/user_method_policy.rs`

要点:
- CoreMethodId（builtin）とは別に、`this.methodcall(...)` の「許可」を一箇所に集約する。
- by-name の if 分岐で散らさず、ポリシーテーブルとして SSOT 化する。

### 2) ConditionLowerer: `ASTNode::MethodCall(object: Me, ...)` の受理

ファイル:
- `src/mir/join_ir/lowering/condition_lowerer.rs`

要点:
- break 条件のトップレベルが `MethodCall(Me, ...)` の場合に lowering できる分岐を追加。
- `this` の所属 box 名は `current_static_box_name` を経由して受け取る（固定名分岐しない）。

### 3) `current_static_box_name` の配線（Pattern2 まで）

変更点:
- `ConditionContext` に `current_static_box_name` を追加
- Pattern2 lowering 入力（inputs）から break/header 条件 lowering まで `current_static_box_name` を伝搬

注:
- ここは “構造” による情報伝達であり、特定関数名での回避分岐（ハードコード）ではない。

### 4) 局所リファクタ（DebugOutputBox 統一）

ファイル:
- `src/mir/join_ir/lowering/loop_with_if_phi_if_sum.rs`

要点:
- 無条件/散在ログを追加しない方針を維持しつつ、出力 API を `DebugOutputBox` に統一する。
- デフォルトでは出力ゼロ（smoke の期待出力を壊さない）。

### 5) テスト/fixture の追加

- unit tests を追加（`this.methodcall(...)` 条件の lowering 回帰固定）
- v2 smoke fixture を追加（integration profile）

## 検証状況（Phase 252 終点）

- `cargo check` が通る（0 errors、warnings のみ）
- `--profile quick` の最初の FAIL は次に切り出し（Phase 253）:
  - `[joinir/mutable-acc-spec] Assignment form not accumulator pattern (required: target = target + x)`

## 次の作業（Phase 253）

次の SSOT: `docs/development/current/main/phases/phase-253/README.md`
