diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md
index 8517a07a..bacac628 100644
--- a/CURRENT_TASK.md
+++ b/CURRENT_TASK.md
@@ -18,8 +18,8 @@ Scope: Repo root の旧リンク互換。現行の入口は `docs/development/cu
**CorePlan migration 道筋 SSOT**
`docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` が移行タスクの Done 判定の入口。
-**Next implementation (Phase 29ao P3)**
-`docs/development/current/main/phases/phase-29ao/P3-CORELOOP-SKELETON-COMPOSE-INSTRUCTIONS.md`
+**Next implementation (Phase 29ao P4)**
+`docs/development/current/main/phases/phase-29ao/README.md`
**2025-12-29: Phase 29am P0 COMPLETE (CorePlan If/Exit lowerer/verifier)**
CorePlan の If/Exit を lowerer/verifier で扱えるようにして、CorePlan 移行の土台を作った。
diff --git a/docs/development/current/main/10-Now.md b/docs/development/current/main/10-Now.md
index 08bf9417..124fa64c 100644
--- a/docs/development/current/main/10-Now.md
+++ b/docs/development/current/main/10-Now.md
@@ -2,7 +2,7 @@
## Current Focus: Phase 29ao(CorePlan composition)
-Next: Phase 29ao P3(CoreLoop skeleton → CorePlan)
+Next: Phase 29ao P4(ExitMap presence → Frag/ExitMap)
運用ルール: integration filter で phase143_* は回さない(JoinIR 回帰は phase29ae pack のみ)
運用ルール: phase286_pattern9_* は legacy pack (SKIP) を使う
移行道筋 SSOT: `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md`
@@ -22,6 +22,11 @@ Next: Phase 29ao P3(CoreLoop skeleton → CorePlan)
- 変更: `src/mir/builder/control_flow/plan/composer/mod.rs` / `docs/development/current/main/phases/phase-29ao/README.md` / `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md` / `CURRENT_TASK.md`
- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
+**2025-12-30: Phase 29ao P3 完了** ✅
+- 目的: `CanonicalLoopFacts` から `CorePlan::Loop`(skeleton)を direct 生成(Pattern1 subset のみ)
+- 変更: `src/mir/builder/control_flow/plan/normalizer/skeleton_loop.rs` / `src/mir/builder/control_flow/plan/normalizer/mod.rs` / `src/mir/builder/control_flow/plan/composer/mod.rs` / `docs/development/current/main/phases/phase-29ao/README.md` / `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md` / `CURRENT_TASK.md`
+- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
+
**2025-12-29: Phase 29an P15 完了** ✅
- 目的: P0–P14 の成果を closeout 形式でまとめ、次フェーズ(Phase 29ao)入口を固定
- 変更: `docs/development/current/main/phases/phase-29an/README.md` / `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md` / `CURRENT_TASK.md`
diff --git a/docs/development/current/main/30-Backlog.md b/docs/development/current/main/30-Backlog.md
index 096dcba3..08ce8d32 100644
--- a/docs/development/current/main/30-Backlog.md
+++ b/docs/development/current/main/30-Backlog.md
@@ -15,7 +15,7 @@ Related:
- **Phase 29ao(active): CorePlan composition from Skeleton/Feature**
- 入口: `docs/development/current/main/phases/phase-29ao/README.md`
- - 状況: P0/P1/P2 ✅ 完了 / Next: P3
+ - 状況: P0/P1/P2/P3 ✅ 完了 / Next: P4
- **Phase 29af(✅ COMPLETE): Boundary hygiene / regression entrypoint / carrier layout SSOT**
- 入口: `docs/development/current/main/phases/phase-29af/README.md`
diff --git a/docs/development/current/main/phases/phase-29ao/README.md b/docs/development/current/main/phases/phase-29ao/README.md
index 56b4dae2..fff0b205 100644
--- a/docs/development/current/main/phases/phase-29ao/README.md
+++ b/docs/development/current/main/phases/phase-29ao/README.md
@@ -33,10 +33,13 @@ Gate(SSOT):
- 指示書: `docs/development/current/main/phases/phase-29ao/P2-COREPLAN-COMPOSER-VIA-NORMALIZER-INSTRUCTIONS.md`
- ねらい: `CanonicalLoopFacts → DomainPlan → PlanNormalizer → CorePlan` の橋渡しを未接続で固定
+## P3: CoreLoop skeleton を CorePlan で直接生成(未接続・仕様不変)✅
+
+- 指示書: `docs/development/current/main/phases/phase-29ao/P3-CORELOOP-SKELETON-COMPOSE-INSTRUCTIONS.md`
+- ねらい: `CanonicalLoopFacts` から `CorePlan::Loop`(skeleton)を direct 生成(Pattern1 subset のみ)
+
## Next(planned)
-- P3: CoreLoop skeleton を `CorePlan` 語彙で直接生成(DomainPlan 非依存・未接続)
- - 指示書: `docs/development/current/main/phases/phase-29ao/P3-CORELOOP-SKELETON-COMPOSE-INSTRUCTIONS.md`
- P4: ExitMap presence を `Frag/ExitMap` と結ぶ(break/continue/return を feature 合成へ寄せる)
- P5: Cleanup presence を ExitKind 単位で wire(effect/cleanup SSOT に従う、観測差分なし)
- P6: ValueJoin presence を post-phi SSOT に沿って wire(局所 verify から)
diff --git a/src/mir/builder/control_flow/plan/composer/mod.rs b/src/mir/builder/control_flow/plan/composer/mod.rs
index 6aa40651..bd4b3c36 100644
--- a/src/mir/builder/control_flow/plan/composer/mod.rs
+++ b/src/mir/builder/control_flow/plan/composer/mod.rs
@@ -41,6 +41,15 @@ pub(in crate::mir::builder) fn try_compose_core_plan_via_normalizer(
Ok(Some(core))
}
+#[allow(dead_code)]
+pub(in crate::mir::builder) fn try_compose_core_plan_direct(
+ builder: &mut MirBuilder,
+ facts: &CanonicalLoopFacts,
+ ctx: &LoopPatternContext,
+) -> Result