# Phase 29af P0: Pattern2 Boundary Hygiene (SSOT) Goal: Pattern2 の boundary 情報の歪みを SSOT で整理し、将来の回帰を防ぐ(仕様不変)。 ## Boundary Contract (SSOT) - Header PHI 対象: - `carrier_info` の carriers(LoopState + ConditionOnly + LoopLocalZero) - Exit reconnection 対象: - LoopState のみ(ConditionOnly は exit_bindings に入れない) - Host binding 対象: - `CarrierInit::FromHost` のみ(BoolConst / LoopLocalZero は host slot 不要) ## Fail-Fast Rules - exit_bindings の `carrier_name` 重複は禁止(debug_assert) - `CarrierInit::FromHost` の `host_id=0` は Fail-Fast ## Entry Points - boundary 構築: `src/mir/builder/control_flow/joinir/patterns/pattern2_steps/emit_joinir_step_box.rs` - header PHI 事前構築: `src/mir/builder/control_flow/joinir/merge/header_phi_prebuild.rs` - exit_bindings 収集: `src/mir/builder/control_flow/joinir/merge/exit_line/meta_collector.rs` - latch 記録: `src/mir/builder/control_flow/joinir/merge/rewriter/{tail_call_policy,latch_incoming_recorder}.rs` ## Verification - `cargo build --release` - `./tools/smokes/v2/run.sh --profile quick` - `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern2_"` - `./tools/smokes/v2/run.sh --profile integration --filter "phase1883_"` ## Notes - Merge 側の Header PHI Entry/Latch contract は Phase 29ae で SSOT 化済み: `docs/development/current/main/phases/phase-29ae/README.md`