phase29ai(p10): move pattern2 extractor into plan layer

This commit is contained in:
2025-12-29 09:44:04 +09:00
parent 9abc726394
commit 4d26133d6a
10 changed files with 1216 additions and 1094 deletions

View File

@ -2,7 +2,12 @@
## Current Focus: Phase 29aiPlan/Frag single-planner
Next: `docs/development/current/main/phases/phase-29ai/P10-MOVE-PATTERN2-EXTRACTOR-TO-PLAN-LAYER-INSTRUCTIONS.md`
Next: `docs/development/current/main/phases/phase-29ai/P11-PLANNER-PATTERN2-BREAK-SUBSET-WIRE-INSTRUCTIONS.md`
**2025-12-29: Phase 29ai P10 完了**
- 目的: Pattern2 extractor を plan 層へ移設して依存方向を固定(仕様不変)
- 実装: `src/mir/builder/control_flow/plan/extractors/pattern2_break.rs` / `src/mir/builder/control_flow/joinir/patterns/extractors/pattern2.rs` / `src/mir/builder/control_flow/plan/single_planner/legacy_rules/pattern2.rs`
- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS
**2025-12-29: Phase 29ai P9 完了**
- 目的: Pattern7 split-scan subset を Facts→Planner→DomainPlan まで到達させ、single_planner の Pattern7 で planner-first を開始(仕様不変)

View File

@ -19,7 +19,7 @@ Related:
- **Phase 29aicandidate: Plan/Frag single-plannerFacts SSOT**
- 入口: `docs/development/current/main/phases/phase-29ai/README.md`
- Next: P10Move Pattern2 extractor → plan layer
- Next: P11Planner: Pattern2 break subset
- **Phase 29ae P1✅ COMPLETE: JoinIR Regression Pack (SSOT固定)**
- 入口: `docs/development/current/main/phases/phase-29ae/README.md`

View File

@ -0,0 +1,114 @@
# Phase 29ai P11: Planner support + wiringPattern2 break subset
Date: 2025-12-29
Status: Ready for execution
Scope: Pattern2breakを Facts→Planner の subset として吸収し、single_planner で planner-first を開始する(仕様不変)
Goal: 「入口は一本Facts→Planner→DomainPlan」を維持しつつ、Pattern2 を段階的に plan 系へ寄せる
## Objective
Pattern2 は現在でも `DomainPlan::Pattern2Break` を持っているが、抽出の多くは legacy JoinIR lowering に残っている。
P11 では “PoC subset” の Pattern2break-only, 単純形)だけを Facts→Planner で `Ok(Some(DomainPlan::Pattern2Break))` まで到達させ、
`single_planner` の Pattern2 rule でも planner-first を開始する。
既存の Pattern2LoopBodyLocal promotion / NotApplicable / Freeze 等の挙動は変えず、planner が `Ok(None)` を返す限り従来経路に落とす。
## Non-goalsこの P11 ではやらない)
- Pattern2 の全網羅LoopBodyLocal promotion / derived slot / real-world seg 等)
- NotApplicable/Freeze の契約変更
- 既存 fixture の期待値RC/ログ/エラー文字列)変更
- 新しい env var / debug トグル追加
- by-name ルールや特定 Box 名での分岐追加(禁止)
## Target SubsetPoC
`plan/extractors/pattern2_break.rs` が扱っている最小形(例):
```hako
loop(i < N) {
if (break_cond) { [carrier = expr;] break }
carrier = carrier + expr
i = i + 1
}
```
この形だけを Facts→Planner に吸収し、それ以外は `Ok(None)` で従来経路にフォールバックする。
## Implementation StepsCritical Order
### Step 1: Pattern2BreakFacts を追加Facts層
ファイル(推奨):
- `src/mir/builder/control_flow/plan/facts/pattern2_break_facts.rs` ✨ NEW
- `src/mir/builder/control_flow/plan/facts/mod.rs`
- `src/mir/builder/control_flow/plan/facts/loop_facts.rs`(接続)
方針:
- Facts は “構造的事実” だけを保持し、推測はしない(抽出できない場合は `Ok(None)`)。
- `DomainPlan` を直接作らないplanner の責務)。
最低限必要な情報(例):
- `loop_var`, `carrier_var`
- `break_condition`AST clone
- `carrier_update_in_break`Option<AST clone>
- `carrier_update_in_body`AST clone
- `loop_increment`AST clone
### Step 2: planner で DomainPlan::Pattern2Break を生成
ファイル:
- `src/mir/builder/control_flow/plan/planner/build.rs`
やること:
- `facts.facts.pattern2_break``Some` のとき、CandidateSet に `DomainPlan::Pattern2Break(...)` を push。
- 0/1/2+ の境界は CandidateSet の finalize に委譲candidate-set 方式を崩さない)。
### Step 3: single_planner で Pattern2 を planner-first に
ファイル:
- `src/mir/builder/control_flow/plan/single_planner/rules.rs`
やること:
- Pattern6/7 と同様に、Pattern2 rule でも先頭で `planner::build_plan(ctx.condition, ctx.body)` を試す。
- `Ok(Some(DomainPlan::Pattern2Break(_)))` のときだけ採用。
- `Ok(Some(other))` は採用せず(将来拡張用に一旦 skip`Ok(None)` は従来どおり legacyplan/extractor 経由)へ。
- planner の `Ok(None)` で新規ログを出さない(観測差分を抑える)。
### Step 4: SSOT fixture/smoke を追加PoC subset 固定)
追加(推奨):
- `apps/tests/phase29ai_pattern2_break_plan_subset_ok_min.hako`
- `tools/smokes/v2/profiles/integration/apps/phase29ai_pattern2_break_plan_subset_ok_min_vm.sh`
方針:
- 既存 Pattern2 の複雑系 fixture は変えない(回帰パック維持)。
- P11 は “subset が planner で採用される” ことだけを固定する。
### Step 5: Docs / Tracking 更新
更新:
- `docs/development/current/main/phases/phase-29ai/README.md`
- `docs/development/current/main/10-Now.md`
- `docs/development/current/main/30-Backlog.md`
最低限:
- P11 完了の記録(目的/影響/検証コマンド)。
- NextP12候補を 1 行(例: Pattern2 LoopBodyLocal promotion の Facts 仕様化)。
## Verification ChecklistAcceptance
- `cargo build --release`
- `./tools/smokes/v2/run.sh --profile quick`
- `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
- `./tools/smokes/v2/run.sh --profile integration --filter "phase29ai_pattern2_break_plan_subset_ok_min"`
期待:
- quick/regression は既定挙動不変で PASS
- subset fixture は PASSplanner-first で採用される)
## Risk Notes
- Pattern2 は複雑なので、P11 は “subset のみ” を厳密にする(疑わしければ `Ok(None)`)。
- 既存の Pattern2 実運用LoopBodyLocal など)に影響を与えないことが最優先。

View File

@ -60,6 +60,13 @@ Goal: pattern 名による分岐を外部APIから消し、Facts事実
- 指示書: `docs/development/current/main/phases/phase-29ai/P10-MOVE-PATTERN2-EXTRACTOR-TO-PLAN-LAYER-INSTRUCTIONS.md`
- ねらい: Pattern2 の抽出pattern固有知識を plan 側へ寄せて依存方向を一方向に固定(仕様不変)
- 完了: plan/extractors へ移設、JoinIR 側は wrapper 化、legacy_rules を plan 側へ統一
- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
## P11: Planner support + wiringPattern2 break subset
- 指示書: `docs/development/current/main/phases/phase-29ai/P11-PLANNER-PATTERN2-BREAK-SUBSET-WIRE-INSTRUCTIONS.md`
- ねらい: Pattern2breakの PoC subset を Facts→Planner に吸収し、single_planner で planner-first を開始(仕様不変で段階吸収)
## Verification (SSOT)