diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md
index 6fb85beb..8517a07a 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 (CorePlan composition, P3 planned)**
-`docs/development/current/main/phases/phase-29ao/README.md`
+**Next implementation (Phase 29ao P3)**
+`docs/development/current/main/phases/phase-29ao/P3-CORELOOP-SKELETON-COMPOSE-INSTRUCTIONS.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/phases/phase-29ao/P3-CORELOOP-SKELETON-COMPOSE-INSTRUCTIONS.md b/docs/development/current/main/phases/phase-29ao/P3-CORELOOP-SKELETON-COMPOSE-INSTRUCTIONS.md
new file mode 100644
index 00000000..41ed2bad
--- /dev/null
+++ b/docs/development/current/main/phases/phase-29ao/P3-CORELOOP-SKELETON-COMPOSE-INSTRUCTIONS.md
@@ -0,0 +1,117 @@
+---
+Status: Ready
+Scope: code(未接続・仕様不変)
+Related:
+ - docs/development/current/main/phases/phase-29ao/README.md
+ - docs/development/current/main/design/coreplan-migration-roadmap-ssot.md
+ - docs/development/current/main/design/coreplan-skeleton-feature-model.md
+ - docs/development/current/main/phases/phase-29ae/README.md
+---
+
+# Phase 29ao P3: CoreLoop skeleton を CorePlan で直接生成(DomainPlan 非依存・未接続)
+
+Date: 2025-12-30
+Status: Ready for execution
+Scope: 仕様不変(未接続のまま)、CorePlan 合成を “DomainPlan 経由” から 1段剥がす
+
+## 目的
+
+- composer が `CanonicalLoopFacts` から `CorePlan::Loop`(CoreLoop skeleton)を直接生成できる導線を作る。
+- P2 までの `CanonicalLoopFacts → DomainPlan → PlanNormalizer → CorePlan` から、DomainPlan 依存を 1つ減らす。
+- まだ Skeleton+Feature 合成の完成形へ飛ばず、まずは **Pattern1 subset のみ**で “direct CorePlan” を SSOT として固定する。
+
+## 非目的
+
+- 既存ルーティングの切替(P3 は未接続)
+- Pattern2/3/4/5/6/7/8/9 の direct 化(P4+)
+- 新 env var / 恒常ログ追加
+- by-name 分岐の追加(Facts の Option を使うだけ)
+
+## 重要な設計判断(P3の境界)
+
+- `BasicBlockId/ValueId/Frag` の allocation は **Tier 1(Normalizer)側**に置いたままにする。
+ - composer が builder を直接触って “独自の allocation 規約” を作らない(SSOTが割れるのを防ぐ)。
+- “direct” の意味は **DomainPlan enum に依存しない**こと(Pattern固有 knowledge は最小化し、将来は Skeleton+Feature 合成へ寄せる)。
+
+## 実装手順
+
+### Step 1: Normalizer に skeleton builder を追加(Pattern1 subsetのみ)
+
+追加(推奨):
+- `src/mir/builder/control_flow/plan/normalizer/skeleton_loop.rs`
+
+配線:
+- `src/mir/builder/control_flow/plan/normalizer/mod.rs` に `mod skeleton_loop;` を追加
+
+実装:
+- `impl PlanNormalizer { pub(in crate::mir::builder) fn normalize_loop_skeleton_from_facts(builder: &mut MirBuilder, facts: &CanonicalLoopFacts, ctx: &LoopPatternContext) -> Result