phase29ao(p41): release adopt pattern5 subset

This commit is contained in:
2025-12-30 18:36:24 +09:00
parent eef061ad2b
commit 124c494738
15 changed files with 326 additions and 7 deletions

View File

@ -3,7 +3,7 @@
## Current Focus
- Phase: `docs/development/current/main/phases/phase-29ao/README.md`
- Next: TBD (see `docs/development/current/main/phases/phase-29ao/README.md`)
- Next: `docs/development/current/main/phases/phase-29ao/P42-STAGE3-CORELOOPCOMPOSER-V0-DESIGN-INSTRUCTIONS.md`
## Gate (SSOT)

View File

@ -5,7 +5,7 @@ Scope: 「次にやる候補」を短く列挙するメモ。入口は `docs/dev
## Active
- CorePlan migration: `docs/development/current/main/phases/phase-29ao/README.md`Next: TBD
- CorePlan migration: `docs/development/current/main/phases/phase-29ao/README.md`Next: P42
## Near-Term Candidates

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/P42-STAGE3-CORELOOPCOMPOSER-V0-DESIGN-INSTRUCTIONS.md`
## 2. すでに固めた SSOT再発防止の土台

View File

@ -14,6 +14,7 @@ Goal: JoinIR の最小回帰セットを SSOT として固定する。
- Pattern1 (subset reject, VM): `phase29ao_pattern1_subset_reject_extra_stmt_vm`
- Pattern5 (Break, VM): `phase286_pattern5_break_vm`
- Pattern5 (strict shadow, VM): `phase29ao_pattern5_strict_shadow_vm`
- Pattern5 (release adopt, VM): `phase29ao_pattern5_release_adopt_vm`
- Pattern6 (strict shadow, VM): `phase29ao_pattern6_strict_shadow_vm`
- Pattern6 (release adopt, VM): `phase29ao_pattern6_release_adopt_vm`
- Pattern6: `phase29ab_pattern6_*`

View File

@ -0,0 +1,97 @@
---
Status: Ready
Scope: Stage-2release既定を Pattern5(Infinite Early-Exit) の “planner subset” へ拡張する(仕様不変)
Related:
- docs/development/current/main/phases/phase-29ao/README.md
- docs/development/current/main/phases/phase-29ae/README.md
- docs/development/current/main/design/coreplan-migration-roadmap-ssot.md
- docs/development/current/main/design/coreplan-shadow-adopt-tag-coverage-ssot.md
---
# Phase 29ao P41: Stage-2 — release adopt Pattern5(Infinite Early-Exit) subset (planner-derived only)
## 目的
- P36P40 で Pattern1/6/7/2/3 の planner subset を release 既定で composer 経由に寄せられた。
- P41 は同じ安全方針で、Pattern5(Infinite Early-Exit) のうち **planner subsetoutcome.plan が Pattern5InfiniteEarlyExit** を release 既定で `facts → composer → CorePlan` に寄せる。
- strict/dev の shadow adopt は引き続き「タグ必須」で回帰固定する(観測/Fail-Fast 維持)。
## 非目的
- Pattern5 の subset 拡張(誤マッチ防止のため、既存 subset のまま)
- 新しい env var 追加
- release でタグ出力(恒常ログ増加)
- エラー文字列の変更
## 実装P37/P38/P39/P40 と同型)
### Step 1: composer に Pattern5 release adopt 入口を追加
対象:
- `src/mir/builder/control_flow/plan/composer/shadow_adopt.rs`
- `src/mir/builder/control_flow/plan/composer/mod.rs`re-export
追加する関数(例):
- `try_release_adopt_core_plan_for_pattern5_infinite_early_exit(...) -> Result<Option<CorePlan>, String>`
採用条件(安全ゲート):
- `domain_plan``DomainPlan::Pattern5InfiniteEarlyExit(_)` のときだけ
- `outcome.plan``Some(DomainPlan::Pattern5InfiniteEarlyExit(_))` のときだけplanner 由来のみ採用)
- `outcome.facts` が存在し、`facts.facts.pattern5_infinite_early_exit``Some` のときだけ
合成:
- 既存の `compose_coreplan_for_pattern5_infinite_early_exit(builder, facts, ctx)` を再利用
失敗時release既定:
- `Ok(None)` または `Err(_)` はすべて `Ok(None)` に丸めて、従来経路へフォールバック(仕様不変)
### Step 2: router の非strict経路で Pattern5 release adopt を接続
対象:
- `src/mir/builder/control_flow/joinir/patterns/router.rs`
位置:
- `if !strict_or_dev { ... }` ブロック内Pattern1/6/7/2/3 の後)
- `lower_via_plan(...)` の前
処理:
- `PlanVerifier::verify(&core_plan)?; PlanLowerer::lower(...)`
- タグ出力はしないstrict/dev のみ tag
### Step 3: 非strict smoke を追加して gate に入れる
狙い:
- strict/dev の smoke は tag 検証に寄っており、release adopt 経路が踏まれない可能性がある。
- “strictを付けない” integration smoke を 1 本追加して、非strict 実行でも安定することを固定する。
追加:
- `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern5_release_adopt_vm.sh`
要件:
- `HAKO_JOINIR_STRICT=1` を設定しない(`env -u` で外す)
- fixture は既存 break-min を使用:
- `apps/tests/phase286_pattern5_break_min.hako`
- 期待:
- output が `3``RC: 3` も許容)
- タグ(`[coreplan/shadow_adopt:pattern5_infinite_early_exit]`は出ないreleaseでタグ出力禁止
配線:
- `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` に filter 1 行追加
- `docs/development/current/main/phases/phase-29ae/README.md` の pack 項目追記
### Step 4: docs 更新
- `docs/development/current/main/phases/phase-29ao/README.md`P41完了/Next
- `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md`
- `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md`
## 検証(必須)
- `cargo build --release`
- `./tools/smokes/v2/run.sh --profile quick`
- `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh`
## コミット
- `git add -A`
- `git commit -m "phase29ao(p41): release adopt pattern5 infinite early-exit subset"`

View File

@ -0,0 +1,79 @@
---
Status: Ready
Scope: Stage-3 の入口設計Skeleton+Feature → CoreLoopComposer v0 の SSOT 固定、実装は次ステップ)
Related:
- docs/development/current/main/phases/phase-29ao/README.md
- docs/development/current/main/design/coreplan-migration-roadmap-ssot.md
- docs/development/current/main/design/coreloop-exitmap-composition-ssot.md
- docs/development/current/main/design/post-phi-final-form-ssot.md
---
# Phase 29ao P42: Stage-3 design — CoreLoopComposer v0 (Skeleton+Feature)
## 目的
Stage-2P36P41で gate 対象の “planner subset” は release 既定でも `facts → composer → CorePlan` を採用できる状態になった。
しかし現在の composer/normalizer は **pattern ごとの from_facts 変換**が中心で、DomainPlan/PatternFacts の重なりが残っている。
P42 は Stage-3 の入口として、`CorePlan` の骨格を “pattern 列挙” ではなく **Skeleton + Feature の合成**で組み立てるための
`CoreLoopComposer v0` の SSOT を先に固めるdocs-first
## 非目的P42ではやらない
- 実経路の振る舞い変更release 既定は不変)
- 新しい env var 追加
- pattern subset の拡張(誤マッチ防止を優先)
- CorePlan の語彙拡張必要なら別Phaseへ
## 現状の整理(前提)
- `CanonicalLoopFacts``LoopFacts + skeleton_kind + exit_usage + presence projections` を持つprojection は既に SSOT 化済み)。
- `CorePlan` の join 入力は `Frag.block_params + EdgeArgs(layout)` を唯一の入口として PHI に落とすP9P14
- GateSSOT`phase29ae_regression_pack_vm.sh` で固定。
## P42 Deliverablesdocs-first
### D1: CoreLoopComposer v0 の責務境界SSOT
`CoreLoopComposer v0` は以下だけを行う:
- 入力: `CanonicalLoopFacts`(ただし skeleton_kind=Loop のみ対象)
- 出力: `CorePlan::Loop`Frag.exits は presence の合成規約に従う)
- 生成: emit/merge を助けるための “再解析” はしない(不足は Facts 側の責務)
### D2: v0 が扱う “定義域”(対象/対象外)を明文化
v0 の対象(最小):
- `skeleton_kind=Loop`
- `value_join_needed=false`join 値が必要なケースは v1+
- cleanup は presence のみ投影(実配線は ExitMap/cleanup SSOT に従う)
v0 の対象外Freeze/None の扱い方針も書く):
- non-reducible / multi-entry loop / 解析不能
- unwind/try/yield 等の拡張が必要な構造
### D3: Freeze taxonomy の適用境界
`Ok(None)` / `Err(Freeze)` の境界を、Stage-3 に合わせて固定する。
- `Ok(None)`: そもそも v0 の定義域外(未対象)
- `Err(Freeze::unstructured)`: 構造的に対象っぽいが骨格が一意化できない
- `Err(Freeze::inconsistent)`: Facts が矛盾している
- `Err(Freeze::unsupported)`: 将来の拡張待ちunwind 等)
- `Err(Freeze::bug)`: SSOT 不変条件違反(実装バグ)
※ release 既定で freeze を増やさないstrict/dev で検出可能にする)方針は維持。
## 次の実装P43候補、参考
P42 を固めたあと、最初の実装ターゲットは “最小で意味論不変” のものに限定する:
- P43: `CoreLoopComposer v0``composer` に scaffold 追加未接続、Ok(None) 既定)
- P44: Pattern6 planner subset だけを `CoreLoopComposer v0` で組み立てられるか検討(不足する Facts を洗い出し)
## 受け入れP42
- docs のみ(コード変更なし)でもよい
- `phase-29ao/README.md` / `10-Now.md` / `30-Backlog.md` / `coreplan-migration-roadmap-ssot.md` の Next が P42 を指す

View File

@ -226,6 +226,12 @@ GateSSOT:
- 指示書: `docs/development/current/main/phases/phase-29ao/P40-RELEASE-ADOPT-PATTERN3-IFPHI-SUBSET-INSTRUCTIONS.md`
- ねらい: Pattern3 planner subset を release 既定で Facts→CorePlan に採用し、非strict経路の回帰を追加仕様不変
## P41: Stage-2 expand — release adopt Pattern5 (Infinite Early-Exit) subset ✅
- 指示書: `docs/development/current/main/phases/phase-29ao/P41-RELEASE-ADOPT-PATTERN5-INFINITE-EARLY-EXIT-SUBSET-INSTRUCTIONS.md`
- ねらい: Pattern5 planner subset を release 既定で Facts→CorePlan に採用し、非strict経路の回帰を追加仕様不変
## Nextplanned
- Next: TBD
- Next: P42Stage-3 design: Skeleton+Feature → CoreLoopComposer v0
- 指示書: `docs/development/current/main/phases/phase-29ao/P42-STAGE3-CORELOOPCOMPOSER-V0-DESIGN-INSTRUCTIONS.md`