diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index 94ca3ee4..6e6be0c9 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -27,6 +27,9 @@ CorePlan の If/Exit を lowerer/verifier で扱えるようにして、CorePlan **2025-12-29: Phase 29am P1 COMPLETE (CoreLoopPlan.body Seq flatten)** CoreLoopPlan.body の `Seq([Effect...])` を再帰で flatten して emit できるようにした(Effect-only制約は維持)。 +**2025-12-29: Phase 29am P2 COMPLETE (Verifier: Loop.body Effect-only)** +Loop.body に If/Exit/Loop が混入したら PlanVerifier で fail-fast([V12])。Seq-of-effects は許可。 + **PlanRuleOrder SSOT** single_planner の順序/名前 SSOT は `src/mir/builder/control_flow/plan/single_planner/rule_order.rs` に固定。PlannerContext で Pattern1 facts の抑制を開始し、残りの guard/filter は段階移行。 diff --git a/docs/development/current/main/10-Now.md b/docs/development/current/main/10-Now.md index a7371a47..66aad1af 100644 --- a/docs/development/current/main/10-Now.md +++ b/docs/development/current/main/10-Now.md @@ -2,11 +2,16 @@ ## Current Focus: Phase 29am(CorePlan Step-A implementation) -Next: Phase 29am P2(Verifier: Loop.body Effect-only) +Next: Phase 29am P3(ExitMap/CoreExitPlan alignment) 運用ルール: integration filter で phase143_* は回さない(JoinIR 回帰は phase29ae pack のみ) 運用ルール: phase286_pattern9_* は legacy pack (SKIP) を使う 移行道筋 SSOT: `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` +**2025-12-29: Phase 29am P2 完了** ✅ +- 目的: Loop.body の語彙制約(Effect-only + Seq許可)を verifier に前倒しして fail-fast を局所化 +- 変更: `src/mir/builder/control_flow/plan/verifier.rs`([V12]) +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` + **2025-12-29: Phase 29am P1 完了** ✅ - 目的: CoreLoopPlan.body で `Seq([Effect...])` を flatten して emit(Effect-only制約は維持) - 変更: `src/mir/builder/control_flow/plan/lowerer.rs` diff --git a/docs/development/current/main/30-Backlog.md b/docs/development/current/main/30-Backlog.md index 97155a1d..da5beb7b 100644 --- a/docs/development/current/main/30-Backlog.md +++ b/docs/development/current/main/30-Backlog.md @@ -37,9 +37,8 @@ Related: - **Phase 29am(candidate): CorePlan Step-A implementation (lowerer/verifier)** - 入口: `docs/development/current/main/phases/phase-29am/README.md` - - 状況: P0 ✅ 完了 - - 状況: P0/P1 ✅ 完了 - - Next: P2(Verifier: Loop.body Effect-only) + - 状況: P0/P1/P2 ✅ 完了 + - Next: P3(ExitMap/CoreExitPlan alignment) - Gate: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` - **Phase 29ai(candidate): Plan/Frag single-planner(Facts SSOT)** diff --git a/docs/development/current/main/phases/phase-29am/P3-EXITMAP-COREEXIT-ALIGNMENT-INSTRUCTIONS.md b/docs/development/current/main/phases/phase-29am/P3-EXITMAP-COREEXIT-ALIGNMENT-INSTRUCTIONS.md new file mode 100644 index 00000000..14e9a0c6 --- /dev/null +++ b/docs/development/current/main/phases/phase-29am/P3-EXITMAP-COREEXIT-ALIGNMENT-INSTRUCTIONS.md @@ -0,0 +1,57 @@ +--- +Status: Active +Scope: design-first + minimal code(仕様不変) +Related: +- docs/development/current/main/phases/phase-29am/README.md +- docs/development/current/main/design/post-phi-final-form-ssot.md +- docs/development/current/main/design/exitkind-cleanup-effect-contract-ssot.md +--- + +# Phase 29am P3: ExitMap/CoreExitPlan alignment(design + minimal code) + +Date: 2025-12-29 +Status: Ready for execution +Scope: Exit の表現を “Frag/ExitMap SSOT” に寄せる(CorePlan 側の Exit を増やさない) + +## Why + +CorePlan 移行を進めると、`CorePlan::Exit` をどこに置けるかが問題になる。 + +- body_bb は Effect-only(P1/P2 で固定) +- Exit は Control を含むため、無制限に Seq/If の中へ置くと CFG/Frag の SSOT が崩れる + +したがって、Exit は “CorePlanの任意の位置” ではなく、**Frag/ExitMap が SSOT**として保持する方向へ寄せる。 + +## Objective + +- CorePlan で `Exit` を表現する責務境界を明確化する +- “Exit = Frag/ExitMap の語彙” を前提に、CorePlan 側の Exit 乱用を防ぐ + +## Non-goals + +- unwind を実装する(別フェーズ) +- 既存の JoinIR/PlanFrag ルーティング変更 + +## Implementation(最小) + +### Step 1: verifier の禁止を明文化(docs + optional stricter checks) + +- `CoreExitPlan::Break/Continue` は Loop 内でのみ許可(既存 V3 を維持) +- `CoreExitPlan::Return` を loop body に入れない(V12 で禁止済み) + +必要なら: +- “CorePlan::Exit は Seq/If の最後にのみ許可” を強化(V11 の運用を If/else まで徹底) + +### Step 2: Normalizer/Composer の方針(design) + +- Exit は `Frag.exits` / `ExitMap` に乗せる(emit_frag SSOT) +- CorePlan は “exit へ向かう条件値/edge_args” を生成するだけに寄せる + +## Verification + +- `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` + +## Commit + +- `git add -A && git commit -m "phase29am(p3): align core exit with frag exitmap"` + diff --git a/docs/development/current/main/phases/phase-29am/README.md b/docs/development/current/main/phases/phase-29am/README.md index ed038a8a..df8a37b4 100644 --- a/docs/development/current/main/phases/phase-29am/README.md +++ b/docs/development/current/main/phases/phase-29am/README.md @@ -30,3 +30,8 @@ SSOT 道筋: `docs/development/current/main/design/coreplan-migration-roadmap-ss - 指示書: `docs/development/current/main/phases/phase-29am/P2-VERIFY-CORELOOP-BODY-EFFECTONLY-INSTRUCTIONS.md` - ねらい: lowerer の “Non-Effect plan in Loop body” エラーを、PlanVerifier の fail-fast で先に検出して局所化する(仕様不変) + +## P3: ExitMap/CoreExitPlan alignment (design + minimal code) + +- 指示書: `docs/development/current/main/phases/phase-29am/P3-EXITMAP-COREEXIT-ALIGNMENT-INSTRUCTIONS.md` +- ねらい: CorePlan 内で `Exit` を “独立ノード” として増やさず、Frag/ExitMap と整合する表現へ寄せる(仕様不変)