# Phase 29ae: JoinIR Regression Pack (docs-first)

Goal: JoinIR の最小回帰セットを SSOT として固定する。

## Regression pack (SSOT)

- Pattern2: `phase29ab_pattern2_*`
- Pattern2 (real-world): `phase263_pattern2_*`
- Pattern6: `phase29ab_pattern6_*`
- Pattern7: `phase29ab_pattern7_*`
- Merge/Phi代表: `apps/tests/phase1883_nested_minimal.hako`（RC=9）
- この pack が JoinIR 回帰の唯一の integration gate（phase143_* は対象外）
- phase143_* は LoopBuilder 撤去 / plugin disable 固定 / LLVM exe 期待が古いので除外
- phase286_pattern9_* は plugins disabled 経路の mismatch があるため legacy pack 側で SKIP（phase29ae pack には含めない）

## Header PHI Entry/Latch Contract (SSOT)

- Entry preds: `entry_incoming` のブロック + host entry block のみ
- Latch preds: header の preds から entry preds を引いた残り
- PHI inputs: entry preds は entry 値、latch preds は latch 値を流す
- 根拠: `src/mir/builder/control_flow/joinir/merge/README.md`（Phase 29ae セクション）
- 修正コミット: `11adec0ab`

## Commands

- `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`

## Status

- phase1883: PASS（RC=9 を成功扱い）
- pattern2: PASS（JoinIR main param remap を carrier_order に揃える） `cf95afbd8`
