From d9afc803ef2aae832919fa5195a5d0b2511a832f Mon Sep 17 00:00:00 2001 From: tomoaki Date: Tue, 30 Dec 2025 13:34:29 +0900 Subject: [PATCH] docs(phase29ao): add p27 pattern6 subset strict adopt instruction --- CURRENT_TASK.md | 4 +- docs/development/current/main/10-Now.md | 4 +- docs/development/current/main/30-Backlog.md | 4 +- .../design/coreplan-migration-roadmap-ssot.md | 2 +- ...WITHINIT-SUBSET-FROM-FACTS-INSTRUCTIONS.md | 92 +++++++++++++++++++ .../current/main/phases/phase-29ao/README.md | 9 +- 6 files changed, 107 insertions(+), 8 deletions(-) create mode 100644 docs/development/current/main/phases/phase-29ao/P27-STRICT-ADOPT-PATTERN6-SCANWITHINIT-SUBSET-FROM-FACTS-INSTRUCTIONS.md diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index b377609d..438a4e29 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -19,8 +19,8 @@ Scope: Repo root の旧リンク互換。現行の入口は `docs/development/cu `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` が移行タスクの Done 判定の入口。 **Next implementation (Phase 29ao P27)** -- 目的: TBD -- 指示書: TBD +- 目的: Pattern6(ScanWithInit) のうち planner subset(Facts由来)だけを strict/dev で Facts→CorePlan に寄せ、variant(reverse/matchscan 等)は fallback 維持(既定挙動は不変) +- 指示書: `docs/development/current/main/phases/phase-29ao/P27-STRICT-ADOPT-PATTERN6-SCANWITHINIT-SUBSET-FROM-FACTS-INSTRUCTIONS.md` **2025-12-30: Phase 29ao P25 COMPLETE (Pattern5 strict/dev adopt from facts)** Pattern5(Infinite Early-Exit)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。 diff --git a/docs/development/current/main/10-Now.md b/docs/development/current/main/10-Now.md index 18e6ea70..f699dd2b 100644 --- a/docs/development/current/main/10-Now.md +++ b/docs/development/current/main/10-Now.md @@ -2,8 +2,8 @@ ## Current Focus: Phase 29ao(CorePlan composition) -Next: Phase 29ao P27(TBD) -指示書: TBD +Next: Phase 29ao P27(Pattern6 subset strict/dev adopt from facts) +指示書: `docs/development/current/main/phases/phase-29ao/P27-STRICT-ADOPT-PATTERN6-SCANWITHINIT-SUBSET-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` diff --git a/docs/development/current/main/30-Backlog.md b/docs/development/current/main/30-Backlog.md index f274a760..196487c8 100644 --- a/docs/development/current/main/30-Backlog.md +++ b/docs/development/current/main/30-Backlog.md @@ -15,8 +15,8 @@ Related: - **Phase 29ao(active): CorePlan composition from Skeleton/Feature** - 入口: `docs/development/current/main/phases/phase-29ao/README.md` - - 状況: P0–P26 ✅ 完了 / Next: P27(TBD) - - Next 指示書: TBD + - 状況: P0–P26 ✅ 完了 / Next: P27(Pattern6 subset strict/dev adopt from facts) + - Next 指示書: `docs/development/current/main/phases/phase-29ao/P27-STRICT-ADOPT-PATTERN6-SCANWITHINIT-SUBSET-FROM-FACTS-INSTRUCTIONS.md` - **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 9d82b0e2..9ae11864 100644 --- a/docs/development/current/main/design/coreplan-migration-roadmap-ssot.md +++ b/docs/development/current/main/design/coreplan-migration-roadmap-ssot.md @@ -34,7 +34,7 @@ Related: ## 1.1 Current (active) - Active phase: `docs/development/current/main/phases/phase-29ao/README.md` -- Next step: TBD (Phase 29ao P27) +- Next step: `docs/development/current/main/phases/phase-29ao/P27-STRICT-ADOPT-PATTERN6-SCANWITHINIT-SUBSET-FROM-FACTS-INSTRUCTIONS.md` ## 2. すでに固めた SSOT(再発防止の土台) diff --git a/docs/development/current/main/phases/phase-29ao/P27-STRICT-ADOPT-PATTERN6-SCANWITHINIT-SUBSET-FROM-FACTS-INSTRUCTIONS.md b/docs/development/current/main/phases/phase-29ao/P27-STRICT-ADOPT-PATTERN6-SCANWITHINIT-SUBSET-FROM-FACTS-INSTRUCTIONS.md new file mode 100644 index 00000000..91d2e9e0 --- /dev/null +++ b/docs/development/current/main/phases/phase-29ao/P27-STRICT-ADOPT-PATTERN6-SCANWITHINIT-SUBSET-FROM-FACTS-INSTRUCTIONS.md @@ -0,0 +1,92 @@ +--- +Status: Ready +Scope: code+tests+docs(strict/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_pattern6_scan_with_init_ok_min_vm.sh + - src/mir/builder/control_flow/joinir/patterns/router.rs + - src/mir/builder/control_flow/plan/normalizer/pattern_scan_with_init.rs + - src/mir/builder/control_flow/plan/facts/loop_facts.rs +--- + +# Phase 29ao P27: strict/dev Pattern6(ScanWithInit) “planner subset” を Facts→CorePlan で shadow adopt + +Date: 2025-12-30 +Status: Ready for execution +Goal: Pattern6 のうち **planner が Facts から一意に作れる ScanWithInit subset** だけを strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分(facts/extractor/normalize のズレ)を早期検知する(release 既定挙動は不変)。 + +## 背景 + +- Pattern6 は OK/contract/variant(reverse/matchscan 等)が混在している。 +- 現状の Facts(`scan_with_init`)は “最小 subset” に寄せてあり、すべての variant を表現できるわけではない。 +- そこで P27 は P26 と同様に **planner 由来のときだけ** strict/dev shadow adopt を行う: + - planner が作れない variant は従来どおり extractor(fallback)経路で維持 + - planner subset は Facts→CorePlan で通し、ズレを fail-fast で検知 + +## 非目的 + +- Pattern6 の reverse/matchscan など、Facts 未対応 variant を adopt 強制すること +- Facts subset の拡張(別Pで扱う) +- 新しい env var/恒常ログ追加 +- release 既定経路の変更 + +## 実装方針 + +### 1) Facts→CorePlan の入口を PlanNormalizer に追加(ScanWithInit subset) + +対象: +- `src/mir/builder/control_flow/plan/normalizer/mod.rs` +- `src/mir/builder/control_flow/plan/normalizer/pattern_scan_with_init.rs` + +追加: +- `pub(in crate::mir::builder) fn normalize_scan_with_init_from_facts(...) -> Result, String>` + +仕様: +- `CanonicalLoopFacts.facts.scan_with_init` が `Some` のときだけ `Some(CorePlan)` を返す +- それ以外は `Ok(None)`(fallback維持) +- 実装は “薄い変換” のみ(SSOT増殖禁止): + - `ScanWithInitFacts -> ScanWithInitPlan` を機械的に詰め替える + - `early_return_expr` / `not_found_return_lit` / `scan_direction` / `dynamic_needle` は planner の既定(subset)に合わせる + - 例: `early_return_expr = Variable(loop_var)`, `not_found_return_lit = -1`, `dynamic_needle = false` + - 既存の `normalize_scan_with_init(builder, ScanWithInitPlan, ctx)` を呼ぶ + +### 2) router の strict/dev shadow adopt を Pattern6 subset に追加(planner 由来のみ) + +対象: +- `src/mir/builder/control_flow/joinir/patterns/router.rs` + +方針: +- strict/dev でも Pattern6 全体には強制しない(P26と同様) +- 条件: + - 選ばれた `domain_plan` が `DomainPlan::ScanWithInit(_)` + - かつ `outcome.plan` が `Some(DomainPlan::ScanWithInit(_))`(planner が作った subset) +- 上記を満たすときだけ adopt: + - `facts.facts.scan_with_init` が `Some` であることを assert(fail-fast) + - `PlanNormalizer::normalize_scan_with_init_from_facts(...)` を呼び、`Some(CorePlan)` を要求(fail-fast) +- 上記以外(fallback extractor 由来)の `DomainPlan::ScanWithInit` は従来経路のまま: + - `lower_via_plan(builder, domain_plan, ctx)` + +これにより、reverse/matchscan 等の variant で facts が無い場合も strict/dev で無駄に落ちない(互換維持)。 + +### 3) 回帰ゲート(SSOT) + +Pattern6 の integration smokes は既に strict で実行されている(例: `phase29ab_pattern6_scan_with_init_ok_min_vm.sh`)。 +よって新しい smoke 追加は不要で、`phase29ae_regression_pack_vm.sh` の `phase29ab_pattern6_` がそのまま 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`(P27 追加、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(p27): strict/dev adopt pattern6 scan_with_init subset from facts"` diff --git a/docs/development/current/main/phases/phase-29ao/README.md b/docs/development/current/main/phases/phase-29ao/README.md index 9623c20c..e30bf50e 100644 --- a/docs/development/current/main/phases/phase-29ao/README.md +++ b/docs/development/current/main/phases/phase-29ao/README.md @@ -157,6 +157,13 @@ Gate(SSOT): - 指示書: `docs/development/current/main/phases/phase-29ao/P26-STRICT-ADOPT-PATTERN2-BREAK-SUBSET-FROM-FACTS-INSTRUCTIONS.md` - ねらい: Pattern2 のうち Facts が表現できる subset を strict/dev で Facts→CorePlan に寄せ、段階的に CorePlan 合成へ収束(既定挙動は不変) +## P27: strict/dev Pattern6(ScanWithInit) subset adopt from facts + +- 指示書: `docs/development/current/main/phases/phase-29ao/P27-STRICT-ADOPT-PATTERN6-SCANWITHINIT-SUBSET-FROM-FACTS-INSTRUCTIONS.md` +- ねらい: Pattern6 のうち planner subset(Facts由来)だけを strict/dev で Facts→CorePlan に寄せ、reverse/matchscan 等の variant は fallback 維持(既定挙動は不変) + ## Next(planned) -- Next: P27(TBD) +- Next: P27(実装) + - 指示書: `docs/development/current/main/phases/phase-29ao/P27-STRICT-ADOPT-PATTERN6-SCANWITHINIT-SUBSET-FROM-FACTS-INSTRUCTIONS.md` +- After P27: P28(TBD)