docs(phase29ao): add p30 move shadow adopt composer ssot instruction

This commit is contained in:
2025-12-30 14:15:24 +09:00
parent ac5231555f
commit a352e7e800
6 changed files with 125 additions and 8 deletions

View File

@ -2,8 +2,8 @@
## Current Focus: Phase 29aoCorePlan composition
Next: Phase 29ao P30TBD
指示書: TBD
Next: Phase 29ao P30Shadow adopt composer SSOT
指示書: `docs/development/current/main/phases/phase-29ao/P30-MOVE-SHADOW-ADOPT-COMPOSER-SSOT-INSTRUCTIONS.md`
運用ルール: integration filter で phase143_* は回さないJoinIR 回帰は phase29ae pack のみ)
運用ルール: phase286_pattern9_* は legacy pack (SKIP) を使う
移行道筋 SSOT: `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md`

View File

@ -15,8 +15,8 @@ Related:
- **Phase 29aoactive: CorePlan composition from Skeleton/Feature**
- 入口: `docs/development/current/main/phases/phase-29ao/README.md`
- 状況: P0P29 ✅ 完了 / Next: P30TBD
- Next 指示書: TBD
- 状況: P0P29 ✅ 完了 / Next: P30Shadow adopt composer SSOT
- Next 指示書: `docs/development/current/main/phases/phase-29ao/P30-MOVE-SHADOW-ADOPT-COMPOSER-SSOT-INSTRUCTIONS.md`
- **Phase 29af✅ COMPLETE: Boundary hygiene / regression entrypoint / carrier layout SSOT**
- 入口: `docs/development/current/main/phases/phase-29af/README.md`

View File

@ -34,7 +34,7 @@ Related:
## 1.1 Current (active)
- Active phase: `docs/development/current/main/phases/phase-29ao/README.md`
- Next step: TBD (Phase 29ao P30)
- Next step: `docs/development/current/main/phases/phase-29ao/P30-MOVE-SHADOW-ADOPT-COMPOSER-SSOT-INSTRUCTIONS.md`
## 2. すでに固めた SSOT再発防止の土台

View File

@ -0,0 +1,110 @@
---
Status: Ready
Scope: code+tests+docs仕様不変
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
- src/mir/builder/control_flow/plan/composer/mod.rs
- src/mir/builder/control_flow/joinir/patterns/router.rs
---
# Phase 29ao P30: Shadow adopt の “Facts→CorePlan” 入口を composer に集約SSOT
Date: 2025-12-30
Status: Ready for execution
Goal: 現在 Normalizer に散っている `*_from_facts`shadow adopt 用の Facts→CorePlan 入口)を `plan/composer` へ移し、**Facts→CorePlan の SSOT 入口を1箇所**に収束させる。挙動は不変strict/dev も含む)。
## 背景
- 現状:
- DomainPlan→CorePlan の SSOT は `PlanNormalizer::normalize(domain_plan, ...)`
- strict/dev shadow adopt は `router.rs` から `PlanNormalizer::*_from_facts(...)` を直接呼んでいるPattern2/3/5/6/7 など)
- しかし “Facts→CorePlan” は本来 Normalizer の責務ではなく、`composer`(合成入口)に寄せた方が構造が綺麗になる。
P30 は **責務位置を正すリファクタ**で、意味論は一切変えない。
## 非目的
- DomainPlan の撤去
- Facts の拡張
- strict/dev の採用条件変更
- ログ/タグの追加変更(既存タグは維持)
## 実装方針(構造で解く)
### 1) composer に “shadow adopt 専用 API” を追加
対象:
- `src/mir/builder/control_flow/plan/composer/mod.rs`
追加(推奨):
- `src/mir/builder/control_flow/plan/composer/shadow_adopt.rs`
API 方針:
- 文字列による by-name 分岐は禁止
- router 側は `DomainPlan` variant を既に持っているので、**patternごとの関数**で受ける(曖昧さ排除)
例:
```rust
pub(in crate::mir::builder) fn compose_coreplan_for_pattern7_split_scan(
builder: &mut MirBuilder,
facts: &CanonicalLoopFacts,
ctx: &LoopPatternContext,
) -> Result<Option<CorePlan>, String>
```
実装:
- “薄い変換” + `PlanNormalizer::normalize` の再利用だけにする(ロジック再実装禁止)
- facts から対応する `DomainPlan::*` を組み立てる
- `PlanNormalizer::normalize(builder, domain_plan, ctx)` を呼ぶ
- facts 不在なら `Ok(None)`
対象パターン(現状の shadow adopt 対象):
- Pattern1: 既に `normalize_loop_skeleton_from_facts` があるが、router 側の入口を composer 側に寄せてもよい
- Pattern2 subset: `facts.facts.pattern2_break`
- Pattern3: `facts.facts.pattern3_ifphi`
- Pattern5: `facts.facts.pattern5_infinite_early_exit`
- Pattern6 subset: `facts.facts.scan_with_init`
- Pattern7: `facts.facts.split_scan`
### 2) router の shadow adopt は composer を呼ぶだけにする
対象:
- `src/mir/builder/control_flow/joinir/patterns/router.rs`
変更:
- `PlanNormalizer::*_from_facts` の呼び出しを、composer の `compose_coreplan_for_*` 呼び出しに差し替える
- strict/dev の fail-fast 条件・タグ出力・planner由来ゲート条件はそのまま維持
### 3) Normalizer から `*_from_facts` を撤去or 最小 shim
対象:
- `src/mir/builder/control_flow/plan/normalizer/pattern*.rs`
方針(どちらか):
- A: `*_from_facts` を削除し、router/composer に集約(推奨)
- B: 互換のため残すが、中身は composer を呼ぶだけshimにする
この時点で「Facts→CorePlan の SSOT 入口」は composer として明確になる。
## テスト(必須)
- `cargo build --release`
- `./tools/smokes/v2/run.sh --profile quick`
- `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
任意composer の境界ユニットテスト:
- facts が `None` のとき `Ok(None)`
- facts が `Some` のとき `Ok(Some(_))` まで到達builder の variable_map を最小で埋める)
## docs 更新(追跡)
- `docs/development/current/main/phases/phase-29ao/README.md`P30追加、Next更新
- `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md` / `CURRENT_TASK.md`
- `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md`Current/Next更新
## コミット
- `git add -A`
- `git commit -m "phase29ao(p30): move shadow adopt composer ssot"`

View File

@ -172,6 +172,13 @@ GateSSOT:
- 指示書: `docs/development/current/main/phases/phase-29ao/P29-SHADOW-ADOPT-TAGS-COVERAGE-ALL-GATE-PATTERNS-INSTRUCTIONS.md`
- ねらい: regression gate に含まれる全パターンで “shadow adopt を踏んだ” をタグ必須として固定(仕様不変)
## P30: Shadow adopt composer SSOTFacts→CorePlan入口を集約
- 指示書: `docs/development/current/main/phases/phase-29ao/P30-MOVE-SHADOW-ADOPT-COMPOSER-SSOT-INSTRUCTIONS.md`
- ねらい: Facts→CorePlan の入口を `plan/composer` に集約し、Normalizer の責務を DomainPlan→CorePlan に縮退(挙動不変)
## Nextplanned
- Next: P30TBD
- Next: P30実装
- 指示書: `docs/development/current/main/phases/phase-29ao/P30-MOVE-SHADOW-ADOPT-COMPOSER-SSOT-INSTRUCTIONS.md`
- After P30: P31TBD