docs(phase29ao): add p25 pattern5 strict adopt instruction

This commit is contained in:
2025-12-30 10:50:21 +09:00
parent e122c9a7d6
commit 7556ffd8ec
6 changed files with 149 additions and 8 deletions

View File

@ -2,8 +2,8 @@
## Current Focus: Phase 29aoCorePlan composition
Next: Phase 29ao P25TBD
指示書: TBD
Next: Phase 29ao P25Pattern5 strict/dev adopt from facts
指示書: `docs/development/current/main/phases/phase-29ao/P25-STRICT-ADOPT-PATTERN5-INFINITE-EARLY-EXIT-FROM-FACTS-INSTRUCTIONS.md`
運用ルール: integration filter で phase143_* は回さないJoinIR 回帰は phase29ae pack のみ)
運用ルール: phase286_pattern9_* は legacy pack (SKIP) を使う
移行道筋 SSOT: `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md`

View File

@ -15,8 +15,8 @@ Related:
- **Phase 29aoactive: CorePlan composition from Skeleton/Feature**
- 入口: `docs/development/current/main/phases/phase-29ao/README.md`
- 状況: P0P24 ✅ 完了 / Next: P25TBD
- Next 指示書: TBD
- 状況: P0P24 ✅ 完了 / Next: P25Pattern5 strict/dev adopt from facts
- Next 指示書: `docs/development/current/main/phases/phase-29ao/P25-STRICT-ADOPT-PATTERN5-INFINITE-EARLY-EXIT-FROM-FACTS-INSTRUCTIONS.md`
- **Phase 29af✅ COMPLETE: Boundary hygiene / regression entrypoint / carrier layout SSOT**
- 入口: `docs/development/current/main/phases/phase-29af/README.md`

View File

@ -34,7 +34,7 @@ Related:
## 1.1 Current (active)
- Active phase: `docs/development/current/main/phases/phase-29ao/README.md`
- Next step: TBD
- Next step: `docs/development/current/main/phases/phase-29ao/P25-STRICT-ADOPT-PATTERN5-INFINITE-EARLY-EXIT-FROM-FACTS-INSTRUCTIONS.md`
## 2. すでに固めた SSOT再発防止の土台

View File

@ -0,0 +1,134 @@
---
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/phase286_pattern5_break_vm.sh
- src/mir/builder/control_flow/joinir/patterns/router.rs
- src/mir/builder/control_flow/plan/normalizer/pattern5_infinite_early_exit.rs
- src/mir/builder/control_flow/plan/facts/pattern5_infinite_early_exit_facts.rs
---
# Phase 29ao P25: strict/dev Pattern5 (Infinite Early-Exit) を Facts→CorePlan で shadow adopt
Date: 2025-12-30
Status: Ready for execution
Goal: Pattern5loop(true) + early exitも strict/dev では “Facts→CorePlan” を通し、DomainPlan 経路との差分facts/extractor/normalize のズレを早期検知できるようにするrelease 既定挙動は不変)。
## 背景
- P17/P23/P24 で Pattern1/3/7 を strict/dev のみ Facts→CorePlan へ寄せた。
- Pattern5 は回帰ゲートphase29ae packに含まれているが、現状は strict/dev で Facts→CorePlan を踏んでいない。
- P16 で Pattern5 の exit join を `Frag.block_params + EdgeArgs` へ移しているため、ここを adopt 対象にすると “CorePlan化の実地” が進む。
## 非目的
- release 既定経路の変更
- Pattern5 の対応範囲拡張facts subset の拡張)
- 新しい env var/恒常ログの追加
- DomainPlan の撤去(段階移行中)
## 実装方針
### 1) Facts→CorePlan の入口を PlanNormalizer に追加Pattern5専用・薄い変換
対象:
- `src/mir/builder/control_flow/plan/normalizer/mod.rs`
- `src/mir/builder/control_flow/plan/normalizer/pattern5_infinite_early_exit.rs`
追加:
- `pub(in crate::mir::builder) fn normalize_pattern5_infinite_early_exit_from_facts(...) -> Result<Option<CorePlan>, String>`
仕様:
- `CanonicalLoopFacts.facts.pattern5_infinite_early_exit``Some` のときだけ `Some(CorePlan)` を返す
- それ以外は `Ok(None)`fallback維持
- 実装は “薄い変換” のみ:
- `Pattern5InfiniteEarlyExitFacts -> Pattern5InfiniteEarlyExitPlan` を機械的に詰め替える
- 既存の `normalize_pattern5_infinite_early_exit(builder, Pattern5InfiniteEarlyExitPlan, ctx)` を呼ぶ
- Pattern5 のロジックは再実装しないSSOTを増やさない
擬似コード:
```rust
pub(in crate::mir::builder) fn normalize_pattern5_infinite_early_exit_from_facts(
builder: &mut MirBuilder,
facts: &CanonicalLoopFacts,
ctx: &LoopPatternContext,
) -> Result<Option<CorePlan>, String> {
let Some(p5) = facts.facts.pattern5_infinite_early_exit.as_ref() else { return Ok(None); };
let parts = Pattern5InfiniteEarlyExitPlan {
loop_var: p5.loop_var.clone(),
exit_kind: p5.exit_kind,
exit_condition: p5.exit_condition.clone(),
exit_value: p5.exit_value.clone(),
carrier_var: p5.carrier_var.clone(),
carrier_update: p5.carrier_update.clone(),
loop_increment: p5.loop_increment.clone(),
};
Ok(Some(Self::normalize_pattern5_infinite_early_exit(builder, parts, ctx)?))
}
```
### 2) router の strict/dev shadow adopt を Pattern5 に拡張
対象:
- `src/mir/builder/control_flow/joinir/patterns/router.rs`
方針:
- `DomainPlan::Pattern5InfiniteEarlyExit(_)` を選んだとき、strict/dev では adopt を “強制” する
- facts が無い/矛盾する場合は `Err(...)`strict/dev のみ)
- release 既定は従来通り `lower_via_plan(builder, domain_plan, ctx)`
擬似コード:
```rust
if strict_or_dev && matches!(domain_plan, DomainPlan::Pattern5InfiniteEarlyExit(_)) {
let facts = outcome.facts.as_ref().ok_or("pattern5 strict/dev adopt failed: facts missing")?;
if facts.facts.pattern5_infinite_early_exit.is_none() {
return Err("pattern5 strict/dev adopt failed: facts mismatch".to_string());
}
let core = PlanNormalizer::normalize_pattern5_infinite_early_exit_from_facts(builder, facts, ctx)?
.ok_or("pattern5 strict/dev adopt failed: compose rejected")?;
PlanVerifier::verify(&core)?;
return PlanLowerer::lower(builder, core, ctx);
}
```
注意:
- 新ログは増やさないroute ログも既存のまま)
### 3) strict/dev gate を regression pack に追加(新 smoke 1 本)
現状の `phase286_pattern5_break_vm.sh` は strict を付けていないため、P25 の adopt 経路が回帰ゲートで踏まれない。
そこで “strict shadow adopt” 専用の smoke を追加して pack に組み込む。
追加ファイル:
- `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern5_strict_shadow_vm.sh`
内容:
- fixture: `apps/tests/phase286_pattern5_break_min.hako`
- `NYASH_DISABLE_PLUGINS=1` + `HAKO_JOINIR_STRICT=1` で VM 実行
- 期待: 出力が `3`(または `RC: 3`)を含む
pack へ追加:
- `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
`run_filter "pattern5_strict_shadow_vm" "phase29ao_pattern5_strict_shadow_vm"` を追加
docs 更新:
- `docs/development/current/main/phases/phase-29ae/README.md` に pack 項目として追記
## テスト(必須)
- `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`P25 を追記、Next を更新)
- `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md` / `CURRENT_TASK.md`
- (必要なら)`docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` の “Current/Next” も更新
## コミット
- `git add -A`
- `git commit -m "phase29ao(p25): strict/dev adopt pattern5 from facts"`

View File

@ -147,6 +147,13 @@ GateSSOT:
- 指示書: `docs/development/current/main/phases/phase-29ao/P24-STRICT-ADOPT-PATTERN7-SPLITSCAN-FROM-FACTS-INSTRUCTIONS.md`
- ねらい: Pattern7 を strict/dev で Facts→CorePlan に寄せ、fallback/近似マッチによるズレを早期検知(既定挙動は不変)
## P25: strict/dev Pattern5 adopt from factsInfinite Early-Exit
- 指示書: `docs/development/current/main/phases/phase-29ao/P25-STRICT-ADOPT-PATTERN5-INFINITE-EARLY-EXIT-FROM-FACTS-INSTRUCTIONS.md`
- ねらい: Pattern5 を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を早期検知(既定挙動は不変)
## Nextplanned
- Next: P25TBD
- Next: P25実装
- 指示書: `docs/development/current/main/phases/phase-29ao/P25-STRICT-ADOPT-PATTERN5-INFINITE-EARLY-EXIT-FROM-FACTS-INSTRUCTIONS.md`
- After P25: P26TBD