docs(phase29ao): add p1 composer api bridge roadmap
This commit is contained in:
@ -2,11 +2,16 @@
|
||||
|
||||
## Current Focus: Phase 29ao(CorePlan composition)
|
||||
|
||||
Next: Phase 29ao P0(CorePlan composer scaffold)
|
||||
Next: Phase 29ao P1(Composer API決定 + bridge 実装)
|
||||
運用ルール: integration filter で phase143_* は回さない(JoinIR 回帰は phase29ae pack のみ)
|
||||
運用ルール: phase286_pattern9_* は legacy pack (SKIP) を使う
|
||||
移行道筋 SSOT: `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md`
|
||||
|
||||
**2025-12-30: Phase 29ao P0 完了** ✅
|
||||
- 目的: `CanonicalLoopFacts → CorePlan` 合成の入口(未接続)を 1 箇所に作る
|
||||
- 変更: `src/mir/builder/control_flow/plan/composer/mod.rs` / `src/mir/builder/control_flow/plan/mod.rs` / `docs/development/current/main/phases/phase-29ao/README.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`
|
||||
|
||||
@ -15,7 +15,7 @@ Related:
|
||||
|
||||
- **Phase 29ao(active): CorePlan composition from Skeleton/Feature**
|
||||
- 入口: `docs/development/current/main/phases/phase-29ao/README.md`
|
||||
- 状況: P0(Ready: composer scaffold)
|
||||
- 状況: P0 ✅ 完了 / Next: P1(Composer API決定 + bridge 実装)
|
||||
|
||||
- **Phase 29af(✅ COMPLETE): Boundary hygiene / regression entrypoint / carrier layout SSOT**
|
||||
- 入口: `docs/development/current/main/phases/phase-29af/README.md`
|
||||
|
||||
@ -64,6 +64,14 @@ Related:
|
||||
直近の入口(SSOT):
|
||||
- Phase 29an: `docs/development/current/main/phases/phase-29an/README.md`
|
||||
|
||||
### Step B.5: 合成入口(composer)を 1 箇所に固定(未接続)
|
||||
|
||||
狙い:
|
||||
- Facts→CorePlan 合成の入口を “1ファイル” に集約し、以後の実装を合成側へ閉じ込める
|
||||
|
||||
入口:
|
||||
- Phase 29ao: `docs/development/current/main/phases/phase-29ao/README.md`
|
||||
|
||||
### Step C: Planner を「骨格の一意化→特徴付与→Freeze」へ
|
||||
|
||||
狙い:
|
||||
@ -95,3 +103,12 @@ Related:
|
||||
- Facts が complete pattern を増やさず Skeleton+Feature に寄っている
|
||||
- DomainPlan は scan/split/predicate 等の “意図” 以外は CorePlan 合成へ吸収されている
|
||||
- Freeze taxonomy が運用でぶれず、strict/dev の診断が安定タグで追える
|
||||
|
||||
## 5. 次の実装順(SSOTの “安全順”)
|
||||
|
||||
この順で進めると、仕様不変を保ったまま “CorePlan で組み立てる” へ近づける。
|
||||
|
||||
1. Phase 29ao P1: composer の allocation 境界を固定(bridge で DomainPlan を生成、未接続)
|
||||
2. Phase 29ao P2: bridge→Normalizer で CorePlan を得る導線(未接続のまま、unit test で固定)
|
||||
3. Phase 29ao P3+: ExitMap/Cleanup/ValueJoin を CorePlan/Frag SSOT に寄せて “pattern を feature 合成” へ
|
||||
4. Phase 29ao closeout: 代表回帰(phase29ae pack)が “CorePlan 合成” 経路で通る範囲を増やし、fallback を縮退
|
||||
|
||||
@ -0,0 +1,107 @@
|
||||
---
|
||||
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/design/post-phi-final-form-ssot.md
|
||||
- docs/development/current/main/phases/phase-29ae/README.md
|
||||
---
|
||||
|
||||
# Phase 29ao P1: Composer API decision + bridge(Facts→CorePlan 合成の “allocation 境界” を固定)
|
||||
|
||||
Date: 2025-12-30
|
||||
Status: Ready for execution
|
||||
Scope: “未接続のまま” 合成の入口を育てる(既定挙動/ログ/エラー文字列は不変)
|
||||
|
||||
## 目的
|
||||
|
||||
- `CorePlan` が `BasicBlockId/ValueId/Frag` を要求するため、Facts→CorePlan 合成の設計で最大の論点である
|
||||
**「どこが allocation を持つか」** を、コード構造として SSOT に固定する。
|
||||
- まずは bridge として composer が `CanonicalLoopFacts` から `DomainPlan`(既存語彙)を組み立て、
|
||||
`PlanNormalizer::normalize()` を呼べる形まで整える(P1 では未接続)。
|
||||
|
||||
## 非目的
|
||||
|
||||
- 既存ルーティング/観測/エラー文字列の変更
|
||||
- composer の結果を本番経路で採用する(P1 は未接続)
|
||||
- 新 env var 追加(strict/dev を含む既存導線は OK)
|
||||
- by-name ハードコードの追加
|
||||
|
||||
## 設計(P1で固定する方針)
|
||||
|
||||
### 1) allocation は Normalizer に置く(現状維持)
|
||||
|
||||
- `BasicBlockId/ValueId/Frag` の生成は **Normalizer(Tier 1)** が担当する。
|
||||
- composer は Facts から “合成に必要な決定” を行い、必要なら `DomainPlan` を組み立てて Normalizer に渡す。
|
||||
|
||||
理由:
|
||||
- `CorePlan` は ValueId-only を維持する(String式禁止)。
|
||||
- Facts/Planner が builder を直接触り始めると、層境界が崩れやすい(将来の verify/observability も難化)。
|
||||
|
||||
### 2) bridge は「DomainPlan を生成するだけ」(未接続)
|
||||
|
||||
- P1 では composer は `CorePlan` を直接構築しない。
|
||||
- `CanonicalLoopFacts` から `DomainPlan` を “必要最小の subset” で組み立てる関数を用意する。
|
||||
|
||||
## 実装手順
|
||||
|
||||
### Step 1: composer に bridge API を追加
|
||||
|
||||
対象:
|
||||
- `src/mir/builder/control_flow/plan/composer/mod.rs`
|
||||
|
||||
追加する関数(案):
|
||||
|
||||
- `pub(in crate::mir::builder) fn try_compose_domain_plan_from_canonical_facts(facts: &CanonicalLoopFacts) -> Result<Option<DomainPlan>, Freeze>`
|
||||
|
||||
ルール(P1のsubset、誤マッチ防止を最優先):
|
||||
- `facts.skeleton_kind == SkeletonKind::Loop` のみ対象(それ以外は `Ok(None)`)
|
||||
- `facts.facts.pattern*_...` の **既存 facts が Some の場合のみ** DomainPlan を構築する(再解析しない)
|
||||
- `Ok(None)` と `Freeze` の境界は既存 planner と同じ運用(P1では Freeze を増やさない)
|
||||
|
||||
注意:
|
||||
- P0 の `try_compose_core_plan_from_canonical_facts()` は未接続の足場として残して OK(P2以降で置換/削除検討)。
|
||||
|
||||
### Step 2: bridge で作る DomainPlan(P1は 1個だけ)
|
||||
|
||||
最初のターゲットは Pattern1(SimpleWhile)推奨:
|
||||
- `facts.facts.pattern1_simplewhile.is_some()` のときだけ `DomainPlan::Pattern1SimpleWhile(...)` を構築
|
||||
- Pattern1 の fields は facts から “そのまま” 移す(構造条件は facts 抽出側が SSOT)
|
||||
|
||||
理由:
|
||||
- もっとも小さく、`PlanNormalizer` での割当/verify/emit が既に安定している。
|
||||
|
||||
### Step 3: unit test(bridge の境界を固定)
|
||||
|
||||
対象:
|
||||
- `src/mir/builder/control_flow/plan/composer/mod.rs`
|
||||
|
||||
追加テスト(例):
|
||||
- Pattern1 facts があると `Ok(Some(DomainPlan::Pattern1SimpleWhile(_)))`
|
||||
- pattern1 facts がないと `Ok(None)`(bridge が勝手に推論しない)
|
||||
|
||||
### Step 4: docs 更新(入口/Next を固定)
|
||||
|
||||
更新:
|
||||
- `docs/development/current/main/phases/phase-29ao/README.md`(P1 追加、Next を P2 へ)
|
||||
- `docs/development/current/main/10-Now.md`(Next を P1 に)
|
||||
- `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`
|
||||
|
||||
## コミット
|
||||
|
||||
- `git add -A`
|
||||
- `git commit -m "phase29ao(p1): composer domainplan bridge scaffold"`
|
||||
|
||||
## 次(P2の入口)
|
||||
|
||||
P2 では bridge で作った `DomainPlan` を Normalizer に通し、`CorePlan` を得る経路(未接続のまま)まで伸ばす。
|
||||
その後、strict/dev のみで “CorePlan equivalence selfcheck” を追加し、徐々に採用へ移る。
|
||||
@ -16,15 +16,21 @@ Goal: DomainPlan の “complete pattern” に寄り過ぎない形で、**Skel
|
||||
Gate(SSOT):
|
||||
- `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
|
||||
|
||||
## P0: Composer scaffold(未接続・仕様不変)
|
||||
## P0: Composer scaffold(未接続・仕様不変)✅
|
||||
|
||||
- 指示書: `docs/development/current/main/phases/phase-29ao/P0-COREPLAN-COMPOSER-SCAFFOLD-INSTRUCTIONS.md`
|
||||
- ねらい: `CanonicalLoopFacts`(projection済み)→ `CorePlan` 合成の入口を 1 箇所に作り、以後の実装を “合成だけ” に寄せる
|
||||
|
||||
## P1: Composer API決定 + bridge(未接続・仕様不変)
|
||||
|
||||
- 指示書: `docs/development/current/main/phases/phase-29ao/P1-COREPLAN-COMPOSER-API-BRIDGE-INSTRUCTIONS.md`
|
||||
- ねらい:
|
||||
- `CorePlan` が `BasicBlockId/ValueId/Frag` を要求するため、Facts→合成の段階で **どこが allocation を持つか**を SSOT として固定する
|
||||
- まずは “bridge” として、composer が `CanonicalLoopFacts` から `DomainPlan`(既存語彙)を構築して `PlanNormalizer` を呼べる形まで整える(未接続のまま)
|
||||
|
||||
## Next(planned)
|
||||
|
||||
- P1: CoreLoop skeleton(preheader/header/body/exit)を `CorePlan` 語彙で生成(effectsは空)
|
||||
- P2: ExitMap presence を `Frag/ExitMap` と結ぶ(break/continue/return の wire を “語彙だけ” 先に固定)
|
||||
- P3: Cleanup presence を ExitKind 単位で wire(実装は最小、観測差分なし)
|
||||
- P4: ValueJoin presence を post-phi SSOT に沿って wire(局所 verify から)
|
||||
|
||||
- P2: CoreLoop skeleton(preheader/header/body/exit)を `CorePlan` 語彙で生成(effects/phis/frag は “最小で正しい”)
|
||||
- P3: ExitMap presence を `Frag/ExitMap` と結ぶ(break/continue/return を feature 合成へ寄せる)
|
||||
- P4: Cleanup presence を ExitKind 単位で wire(effect/cleanup SSOT に従う、観測差分なし)
|
||||
- P5: ValueJoin presence を post-phi SSOT に沿って wire(局所 verify から)
|
||||
|
||||
Reference in New Issue
Block a user