docs(phase29ai): add P1 planner freeze/candidates SSOT

This commit is contained in:
2025-12-29 07:05:58 +09:00
parent c9456646c6
commit 3e13d16a00
4 changed files with 91 additions and 1 deletions

View File

@ -2,7 +2,7 @@
## Current Focus: Phase 29aiPlan/Frag single-planner
Next: `docs/development/current/main/phases/phase-29ai/P0-LOOPFACTS-SSOT-SINGLE-PLANNER-INSTRUCTIONS.md`
Next: `docs/development/current/main/phases/phase-29ai/P1-PLANNER-CANDIDATES-FREEZE-SSOT-INSTRUCTIONS.md`
**2025-12-29: Phase 29ag P1 完了**
- 目的: coordinator の ValueId(idx) 前提を撤去し、boundary.join_inputs を SSOT 化(仕様不変)

View File

@ -19,6 +19,7 @@ Related:
- **Phase 29aicandidate: Plan/Frag single-plannerFacts SSOT**
- 入口: `docs/development/current/main/phases/phase-29ai/README.md`
- Next: P1Planner candidate-set + Freeze SSOT
- **Phase 29ae P1✅ COMPLETE: JoinIR Regression Pack (SSOT固定)**
- 入口: `docs/development/current/main/phases/phase-29ae/README.md`

View File

@ -0,0 +1,84 @@
# Phase 29ai P1: Planner “candidate-set” + Freeze SSOT — Instructions
Status: Ready for execution
Scope: Plan/Frag 導線の「判定/失敗」のSSOT化docs-first, 仕様不変)
## Goal
P0 の骨格を “一本道のパイプライン” として完成させるために、Planner の契約を先に固定する。
- 外部APIは **常に1本**: `build_plan(...) -> Result<Option<Plan>, Freeze>`
- “pattern名で入口分岐” をしない(候補推論は planner 内部に閉じる)
- `Ok(None)` / `Err(Freeze)` の境界を SSOT 化して、後続の Facts 実装が迷わない土台を作る
## Non-goals
- 既存 JoinIR/Pattern 実装の置換P1では未接続のまま
- 仕様変更(挙動変更)/ 既存のエラー文言変更
- 新しい env 変数 / トグルの追加
## Contract (SSOT)
### `Ok(None)` の意味NotApplicable
「この region は plan 化の対象ではない」。既存経路へ委譲して良い。
- 例: 特殊なCFG構造がない / plan を挟む必要がない / 入口条件が揃っていない
### `Err(Freeze)` の意味Fail-Fast
「対象っぽいが、契約違反/曖昧/禁止形で plan を作れない」。silent fallback 禁止。
- 例: loop header が一意に定まらない、exit が曖昧、step/cond が複数解釈できる、shape契約を破っている
### `Ok(Some(plan))`
「一意に plan が確定し、emit に必要な情報が揃っている」。
## Target Structure (P1)
```
src/mir/builder/control_flow/plan/planner/
mod.rs
build.rs # build_plan, build_plan_from_facts
freeze.rs # Freeze SSOTtag + message + hint
candidates.rs # PlanCandidate / CandidateSet0/1/Many の一意化)
```
Note: ファイル分割は必須ではないが、Freeze と候補集合は “再利用される契約” なので build.rs から分離する。
## Implementation Steps (P1)
1) `Freeze``type Freeze = String` から構造体へ昇格
- `Freeze { tag: &'static str, message: String, hint: Option<String> }`
- 文字列表現(`Display`)は SSOT として安定化する(例: `"[plan/freeze:{tag}] {message}"`)。
- `Freeze::ambiguous(...)` / `Freeze::contract(...)` など、生成ヘルパーを用意する。
2) “候補集合 → 一意化” の小さな仕組みを追加
- `PlanCandidate { kind: PlanKind, rule: &'static str }` 程度で良い公開APIに pattern 名を漏らさない)。
- `CandidateSet::finalize()`:
- 0件 → `Ok(None)`
- 1件 → `Ok(Some(plan))`
- 2件以上 → `Err(Freeze::ambiguous(...))`
3) `planner::build_plan_from_facts` を candidate-set 方式に置き換え
- まだ Facts が `Ok(None)` なので、ここは **未到達でもコンパイルできる** 状態にする。
- `todo!/unreachable!` で落とすのは避け、`Err(Freeze::not_implemented(...))` のように “将来のFail-Fast” をSSOT化しておく。
4) docs / 道筋の更新
- `docs/development/current/main/phases/phase-29ai/README.md` に P1 を追加(指示書リンク+目的)。
- `docs/development/current/main/10-Now.md` の Next を P1 指示書へ更新。
- `CURRENT_TASK.md` に Phase 29ai P0 完了 + P1 次の作業を追記(入口/コマンドも固定)。
## Verification (SSOT)
- `cargo build --release`
- `./tools/smokes/v2/run.sh --profile quick`
- `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
## Acceptance Criteria
- 仕様不変quick/回帰パックが緑)
- `Ok(None)``Err(Freeze)` の境界が SSOT として文章・型で固定される
- Planner が “候補集合→一意化” で一本道化され、入口に pattern 名分岐が増えない

View File

@ -7,6 +7,11 @@ Goal: pattern 名による分岐を外部APIから消し、Facts事実
- 指示書: `docs/development/current/main/phases/phase-29ai/P0-LOOPFACTS-SSOT-SINGLE-PLANNER-INSTRUCTIONS.md`
- 追加される骨格(未接続・仕様不変): `src/mir/builder/control_flow/plan/{facts,normalize,planner,emit}/`
## P1: Planner candidate-set + Freeze SSOT
- 指示書: `docs/development/current/main/phases/phase-29ai/P1-PLANNER-CANDIDATES-FREEZE-SSOT-INSTRUCTIONS.md`
- ねらい: `Ok(None)` / `Err(Freeze)` の境界と “候補集合→一意化” をSSOT化未接続のまま、仕様不変
## Verification (SSOT)
- `cargo build --release`