phase29ao(p24): strict/dev adopt pattern7 from facts

This commit is contained in:
2025-12-30 10:34:31 +09:00
parent 314231d6ea
commit e122c9a7d6
8 changed files with 184 additions and 4 deletions

View File

@ -18,10 +18,13 @@ Scope: Repo root の旧リンク互換。現行の入口は `docs/development/cu
**CorePlan migration 道筋 SSOT**
`docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` が移行タスクの Done 判定の入口。
**Next implementation (Phase 29ao P24)**
**Next implementation (Phase 29ao P25)**
- 目的: TBD
- 指示書: TBD
**2025-12-30: Phase 29ao P24 COMPLETE (Pattern7 strict/dev adopt from facts)**
Pattern7SplitScanを strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。
**2025-12-30: Phase 29ao P23 COMPLETE (Pattern3 strict/dev adopt from facts)**
Pattern3IfPhiを strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。

View File

@ -2,12 +2,17 @@
## Current Focus: Phase 29aoCorePlan composition
Next: Phase 29ao P24TBD
Next: Phase 29ao P25TBD
指示書: TBD
運用ルール: 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 P24 完了**
- 目的: Pattern7 を strict/dev で Facts→CorePlan に寄せ、DomainPlan とのズレを早期検知
- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern_split_scan.rs` / `src/mir/builder/control_flow/joinir/patterns/router.rs` / `docs/development/current/main/phases/phase-29ao/README.md` / `docs/development/current/main/10-Now.md` / `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`
**2025-12-30: Phase 29ao P23 完了**
- 目的: Pattern3 を strict/dev で Facts→CorePlan に寄せ、DomainPlan とのズレを早期検知
- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs` / `src/mir/builder/control_flow/joinir/patterns/router.rs` / `docs/development/current/main/phases/phase-29ao/README.md` / `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md` / `CURRENT_TASK.md`

View File

@ -15,7 +15,7 @@ Related:
- **Phase 29aoactive: CorePlan composition from Skeleton/Feature**
- 入口: `docs/development/current/main/phases/phase-29ao/README.md`
- 状況: P0P23 ✅ 完了 / Next: P24TBD
- 状況: P0P24 ✅ 完了 / Next: P25TBD
- Next 指示書: TBD
- **Phase 29af✅ COMPLETE: Boundary hygiene / regression entrypoint / carrier layout SSOT**

View File

@ -31,6 +31,11 @@ Related:
- `Facts → Planner → (DomainPlan) → CorePlan → lowerer/emit → merge` が主経路
- `DomainPlan` は意図/recipe として残ってもよいが、最終の verify/emit 契約は CorePlan 側で固定されている
## 1.1 Current (active)
- Active phase: `docs/development/current/main/phases/phase-29ao/README.md`
- Next step: TBD
## 2. すでに固めた SSOT再発防止の土台
- Skeleton/Feature: `docs/development/current/main/design/coreplan-skeleton-feature-model.md`

View File

@ -0,0 +1,117 @@
---
Status: Ready
Scope: code+tests+docsstrict/dev のみ、仕様不変)
Related:
- docs/development/current/main/phases/phase-29ao/README.md
- tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh
- tools/smokes/v2/profiles/integration/apps/phase29ab_pattern7_splitscan_ok_min_vm.sh
- src/mir/builder/control_flow/joinir/patterns/router.rs
- src/mir/builder/control_flow/plan/normalizer/pattern_split_scan.rs
- src/mir/builder/control_flow/plan/facts/loop_facts.rs
---
# Phase 29ao P24: strict/dev Pattern7 (SplitScan) を Facts→CorePlan で shadow adopt
Date: 2025-12-30
Status: Ready for execution
Goal: Pattern7SplitScanも strict/dev では “Facts→CorePlan” を通し、DomainPlan 経路のズレfallback/近似マッチを早期に検知できるようにするrelease 既定挙動は不変)。
## 背景
- P17/P23 で Pattern1/3 を strict/dev のみ Facts→CorePlan へ寄せた。
- Pattern7 は ValueJoinblock_params → PHI実装の代表で、回帰ゲートにも含まれているため、ここを shadow adopt 対象にすると効果が大きい。
## 非目的
- release 既定経路の変更
- Pattern7 の対応範囲拡張facts subset の拡張)
- 新しい env var/ログ追加
- DomainPlan の撤去(段階移行中)
## 実装方針
### 1) Facts→CorePlan の入口を PlanNormalizer に追加Pattern7専用・薄い変換
対象:
- `src/mir/builder/control_flow/plan/normalizer/mod.rs`
- `src/mir/builder/control_flow/plan/normalizer/pattern_split_scan.rs`(または隣接の新ファイルを追加して mod.rs に登録)
追加:
- `pub(in crate::mir::builder) fn normalize_pattern7_split_scan_from_facts(...) -> Result<Option<CorePlan>, String>`
仕様:
- `CanonicalLoopFacts.facts.split_scan``Some` のときだけ `Some(CorePlan)` を返す
- それ以外は `Ok(None)`fallback維持
- 実装は “薄い変換” のみ:
- `SplitScanFacts -> SplitScanPlan` を機械的に詰め替える
- 既存の `normalize_split_scan(builder, SplitScanPlan, ctx)` を呼ぶ
- SplitScan のロジックを再実装しないSSOTを増やさない
擬似コード:
```rust
pub(in crate::mir::builder) fn normalize_pattern7_split_scan_from_facts(
builder: &mut MirBuilder,
facts: &CanonicalLoopFacts,
ctx: &LoopPatternContext,
) -> Result<Option<CorePlan>, String> {
let Some(split) = facts.facts.split_scan.as_ref() else { return Ok(None); };
let parts = SplitScanPlan {
s_var: split.s_var.clone(),
sep_var: split.sep_var.clone(),
result_var: split.result_var.clone(),
i_var: split.i_var.clone(),
start_var: split.start_var.clone(),
};
Ok(Some(Self::normalize_split_scan(builder, parts, ctx)?))
}
```
### 2) router の strict/dev shadow adopt を Pattern7 に拡張
対象:
- `src/mir/builder/control_flow/joinir/patterns/router.rs`
方針:
- 既存の Pattern1/3 strict/dev adopt と同じ方針で、Pattern7 も strict/dev では adopt を “強制” する
- `DomainPlan::SplitScan(_)` を選んだのに facts が無い/矛盾する場合は `Err(...)`strict/dev のみ)
擬似コード:
```rust
if strict_or_dev && matches!(domain_plan, DomainPlan::SplitScan(_)) {
let facts = outcome.facts.as_ref().ok_or("pattern7 strict/dev adopt failed: facts missing")?;
if facts.facts.split_scan.is_none() {
return Err("pattern7 strict/dev adopt failed: facts mismatch".to_string());
}
let core = PlanNormalizer::normalize_pattern7_split_scan_from_facts(builder, facts, ctx)?
.ok_or("pattern7 strict/dev adopt failed: compose rejected")?;
PlanVerifier::verify(&core)?;
return PlanLowerer::lower(builder, core, ctx);
}
```
注意:
- “新ログ” は増やさないroute ログも既存のまま)
- adopt は strict/dev のみrelease 既定は従来どおり `lower_via_plan(builder, domain_plan, ctx)`
## 回帰ゲートSSOT
Pattern7 の integration smokes は既に strict で実行されているため、追加の smoke は不要。
- `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
- filter `phase29ab_pattern7_` が P24 adopt 経路のゲートになる
## テスト(必須)
- `cargo build --release`
- `./tools/smokes/v2/run.sh --profile quick`
- `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
## docs 更新
- `docs/development/current/main/phases/phase-29ao/README.md`P24 を追記、Next を更新)
- `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md` / `CURRENT_TASK.md`
## コミット
- `git add -A`
- `git commit -m "phase29ao(p24): strict/dev adopt pattern7 split-scan from facts"`

View File

@ -142,6 +142,11 @@ GateSSOT:
- 指示書: `docs/development/current/main/phases/phase-29ao/P23-STRICT-ADOPT-PATTERN3-IFPHI-FROM-FACTS-INSTRUCTIONS.md`
- ねらい: Pattern3 を strict/dev で Facts→CorePlan に寄せ、DomainPlan とのズレを早期検知
## P24: strict/dev Pattern7 adopt from factsSplitScan
- 指示書: `docs/development/current/main/phases/phase-29ao/P24-STRICT-ADOPT-PATTERN7-SPLITSCAN-FROM-FACTS-INSTRUCTIONS.md`
- ねらい: Pattern7 を strict/dev で Facts→CorePlan に寄せ、fallback/近似マッチによるズレを早期検知(既定挙動は不変)
## Nextplanned
- P24: TBD
- Next: P25TBD

View File

@ -379,6 +379,25 @@ pub(crate) fn route_loop_pattern(
return PlanLowerer::lower(builder, core_plan, ctx);
}
if strict_or_dev
&& matches!(
domain_plan,
crate::mir::builder::control_flow::plan::DomainPlan::SplitScan(_)
)
{
let facts = outcome
.facts
.as_ref()
.ok_or_else(|| "pattern7 strict/dev adopt failed: facts missing".to_string())?;
if facts.facts.split_scan.is_none() {
return Err("pattern7 strict/dev adopt failed: facts mismatch".to_string());
}
let core_plan = PlanNormalizer::normalize_split_scan_from_facts(builder, facts, ctx)?
.ok_or_else(|| "pattern7 strict/dev adopt failed: compose rejected".to_string())?;
PlanVerifier::verify(&core_plan)?;
return PlanLowerer::lower(builder, core_plan, ctx);
}
return lower_via_plan(builder, domain_plan, ctx);
}

View File

@ -4,6 +4,8 @@ use crate::mir::builder::control_flow::edgecfg::api::{
compose, BlockParams, BranchStub, EdgeStub, ExitKind, Frag,
};
use crate::mir::builder::control_flow::joinir::patterns::router::LoopPatternContext;
use crate::mir::builder::control_flow::plan::facts::loop_facts::SplitScanFacts;
use crate::mir::builder::control_flow::plan::normalize::CanonicalLoopFacts;
use crate::mir::builder::MirBuilder;
use crate::mir::join_ir::lowering::inline_boundary::JumpArgsLayout;
use crate::mir::{BinaryOp, CompareOp, ConstValue, Effect, EffectMask, MirType};
@ -11,6 +13,20 @@ use std::collections::BTreeMap;
use super::common::empty_args;
impl super::PlanNormalizer {
pub(in crate::mir::builder) fn normalize_split_scan_from_facts(
builder: &mut MirBuilder,
facts: &CanonicalLoopFacts,
ctx: &LoopPatternContext,
) -> Result<Option<CorePlan>, String> {
let Some(split_scan) = facts.facts.split_scan.as_ref() else {
return Ok(None);
};
let parts = plan_from_facts(split_scan);
let core_plan = Self::normalize_split_scan(builder, parts, ctx)?;
Ok(Some(core_plan))
}
/// SplitScan → CorePlan 変換
///
/// Expands split-specific semantics into generic CorePlan:
@ -452,3 +468,13 @@ impl super::PlanNormalizer {
Ok(CorePlan::Loop(loop_plan))
}
}
fn plan_from_facts(facts: &SplitScanFacts) -> SplitScanPlan {
SplitScanPlan {
s_var: facts.s_var.clone(),
sep_var: facts.sep_var.clone(),
result_var: facts.result_var.clone(),
i_var: facts.i_var.clone(),
start_var: facts.start_var.clone(),
}
}