### Changes
#### 1. UpdateKind Extension (skeleton_types.rs)
- Added `ConditionalStep { then_delta: i64, else_delta: i64 }` variant
- Enables P5b patterns with conditional numeric deltas
- Used for escape sequence handling (i.e., +2 vs +1 based on escape char)
#### 2. Canonicalizer Integration (canonicalizer.rs)
- Added P5b pattern detection after existing patterns
- Routes to Pattern2Break (same as skip_whitespace, reflects has_break=true)
- Builds LoopSkeleton with ConditionalStep update
- Position: AFTER skip_whitespace (Pattern2Break refinement, not separate choice)
#### 3. AST Recognizer Enhancement (ast_feature_extractor.rs)
- Updated `find_escape_in_if` to handle both:
- `if ch == '\\' { i += 2 }` (no else)
- `if ch == '\\' { i += 2 } else { i += 1 }` (with else)
- Added `extract_delta_pair_from_if` for clean delta extraction
- Extracts counter_name, escape_delta, normal_delta from single if-else statement
#### 4. Comprehensive Unit Test (canonicalizer.rs)
- Test: `test_escape_skip_pattern_recognition`
- Verifies full P5b pattern recognition
- Confirms ConditionalStep with escape_delta=2, normal_delta=1
- Validates skeleton structure and exit contract (has_break=true)
### Results
✅ Build: 1062/1062 tests PASS (+1 new P5b test)
✅ No regressions
✅ P5b pattern now recognized and routed correctly
### Next Steps
- Step 2-E: Parity verification with strict mode
- Step 2-F: Documentation updates
Phase 91 P5b implementation on track!
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
MIR Builder (src/mir/builder/)
このディレクトリは Rust 側の MIR 生成(AST → MIR)を担う。
JoinIR の merge もここ(control_flow/joinir/merge/)が入口。
原則(SSOT / Box-First)
- 状態は Context が SSOT:
MirBuilderの状態は Context(箱)に分割され、二重管理をしない。 - ValueId 発行は SSOT: 関数内の ValueId は
MirBuilder::next_value_id()を唯一入口にする。 - 境界は Fail-Fast: JoinIR merge は
contract_checks.rsで契約違反を早期検出する(debug-only)。
Context 構成(責務マップ)
core_context.rs- ID 生成器(ValueId/BlockId/BindingId 等)と最小の共通コア状態。
type_context.rs- ValueId → 型/種別/起源(NewBox 由来など)の追跡。
scope_context.rs- lexical scope / loop/if/try のスタックと、
current_function/current_blockの実行文脈。
- lexical scope / loop/if/try のスタックと、
binding_context.rs- 変数名 ↔ BindingId の対応(shadowing の復元を含む)。
variable_context.rs- 変数解決(variable_map 等)。
metadata_context.rs- span/source_hint/region(観測)などのメタ情報。
compilation_context.rs- コンパイル全体のレジストリ(Box/型レジストリ、reserved ids 等)。
context.rs- 上記 Context を束ねる入れ物(
MirBuilderはここを介して状態へアクセスする)。
- 上記 Context を束ねる入れ物(
主要エントリポイント
- ValueId/BlockId
src/mir/builder/utils.rs(MirBuilder::next_value_id()など)
- AST → MIR の基本道
src/mir/builder/stmts.rssrc/mir/builder/exprs.rs
- JoinIR merge(契約検証を含む)
src/mir/builder/control_flow/joinir/merge/mod.rssrc/mir/builder/control_flow/joinir/merge/contract_checks.rs
追加ルール(将来の変更者向け)
- 新しい状態を追加する場合は、まず「どの Context の責務か」を決めてから追加する(
MirBuilder直下に増やさない)。 - 変更後に最低限確認する:
tools/smokes/v2/profiles/integration/apps/phase135_trim_mir_verify.sh(MIR verify の回帰防止)