From 0e78122129a0f7d4505279dc518f7e269f95bbc7 Mon Sep 17 00:00:00 2001 From: tomoaki Date: Tue, 30 Dec 2025 04:05:49 +0900 Subject: [PATCH] docs(phase29ao): add p1 composer api bridge roadmap --- CURRENT_TASK.md | 3 + docs/development/current/main/10-Now.md | 7 +- docs/development/current/main/30-Backlog.md | 2 +- .../design/coreplan-migration-roadmap-ssot.md | 17 +++ ...REPLAN-COMPOSER-API-BRIDGE-INSTRUCTIONS.md | 107 ++++++++++++++++++ .../current/main/phases/phase-29ao/README.md | 18 ++- 6 files changed, 146 insertions(+), 8 deletions(-) create mode 100644 docs/development/current/main/phases/phase-29ao/P1-COREPLAN-COMPOSER-API-BRIDGE-INSTRUCTIONS.md diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index 16364b96..0b7a1c6b 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -21,6 +21,9 @@ Scope: Repo root の旧リンク互換。現行の入口は `docs/development/cu **Next implementation (CorePlan composition scaffold)** `docs/development/current/main/phases/phase-29ao/P0-COREPLAN-COMPOSER-SCAFFOLD-INSTRUCTIONS.md` +**Next implementation (Phase 29ao P1)** +`docs/development/current/main/phases/phase-29ao/P1-COREPLAN-COMPOSER-API-BRIDGE-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/10-Now.md b/docs/development/current/main/10-Now.md index d5d4b080..1b50fbca 100644 --- a/docs/development/current/main/10-Now.md +++ b/docs/development/current/main/10-Now.md @@ -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` diff --git a/docs/development/current/main/30-Backlog.md b/docs/development/current/main/30-Backlog.md index 51618f7e..55489059 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(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` diff --git a/docs/development/current/main/design/coreplan-migration-roadmap-ssot.md b/docs/development/current/main/design/coreplan-migration-roadmap-ssot.md index 8fc21c54..cf95b06c 100644 --- a/docs/development/current/main/design/coreplan-migration-roadmap-ssot.md +++ b/docs/development/current/main/design/coreplan-migration-roadmap-ssot.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 を縮退 diff --git a/docs/development/current/main/phases/phase-29ao/P1-COREPLAN-COMPOSER-API-BRIDGE-INSTRUCTIONS.md b/docs/development/current/main/phases/phase-29ao/P1-COREPLAN-COMPOSER-API-BRIDGE-INSTRUCTIONS.md new file mode 100644 index 00000000..a18744b7 --- /dev/null +++ b/docs/development/current/main/phases/phase-29ao/P1-COREPLAN-COMPOSER-API-BRIDGE-INSTRUCTIONS.md @@ -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, 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” を追加し、徐々に採用へ移る。 diff --git a/docs/development/current/main/phases/phase-29ao/README.md b/docs/development/current/main/phases/phase-29ao/README.md index 309c5691..3a9fc80f 100644 --- a/docs/development/current/main/phases/phase-29ao/README.md +++ b/docs/development/current/main/phases/phase-29ao/README.md @@ -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 から)