diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index 41e6d451..3566171d 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -5,228 +5,4 @@ Scope: Repo root の旧リンク互換。現行の入口は `docs/development/cu - Now: `docs/development/current/main/10-Now.md` - Backlog: `docs/development/current/main/30-Backlog.md` - ---- - -## Handoff (current) - -### 状況(SSOT) - -**JoinIR 回帰 SSOT** -`./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` が唯一の integration gate。phase143_* は対象外(legacy pack で隔離)。phase286_pattern9_* は legacy pack (SKIP) で運用。 - -**CorePlan migration 道筋 SSOT** -`docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` が移行タスクの Done 判定の入口。 - -**Next implementation (Phase 29ao P32)** -- 目的: Pattern2 real-world strict/dev shadow adopt -- 指示書: `docs/development/current/main/phases/phase-29ao/P32-STRICT-ADOPT-PATTERN2-REALWORLD-FROM-FACTS-INSTRUCTIONS.md` -- After P32: TBD - -**2025-12-30: Phase 29ao P31 COMPLETE (shadow adopt routing SSOT)** -shadow adopt の判定/Fail-Fast/タグを composer 側に集約し、router を薄くした(仕様不変)。 - -**2025-12-30: Phase 29ao P30 COMPLETE (Shadow adopt composer SSOT)** -Facts→CorePlan の入口を `plan/composer` に集約し、Normalizer の責務を DomainPlan→CorePlan に縮退した(挙動不変)。 - -**2025-12-30: Phase 29ao P25 COMPLETE (Pattern5 strict/dev adopt from facts)** -Pattern5(Infinite Early-Exit)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。 - -**2025-12-30: Phase 29ao P27 COMPLETE (Pattern6 subset strict/dev adopt from facts)** -Pattern6(ScanWithInit) の subset を strict/dev で Facts→CorePlan に寄せ、planner subset のズレを Fail-Fast で検知できるようにした。 - -**2025-12-30: Phase 29ao P28 COMPLETE (Shadow adopt observability tags + gate smokes)** -strict/dev shadow adopt が実際に踏まれていることを安定タグと回帰スモークで検証できるようにした(仕様不変)。 - -**2025-12-30: Phase 29ao P29 COMPLETE (Shadow adopt tag coverage)** -regression gate に含まれる全パターンで shadow adopt のタグを必須化した(仕様不変)。 - -**2025-12-30: Phase 29ao P26 COMPLETE (Pattern2 subset strict/dev adopt from facts)** -Pattern2(Break) の subset を strict/dev で Facts→CorePlan に寄せ、planner subset のズレを Fail-Fast で検知できるようにした。 - -**2025-12-30: Phase 29ao P24 COMPLETE (Pattern7 strict/dev adopt from facts)** -Pattern7(SplitScan)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。 - -**2025-12-30: Phase 29ao P23 COMPLETE (Pattern3 strict/dev adopt from facts)** -Pattern3(If‑Phi)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。 - -**2025-12-30: Phase 29ao P22 COMPLETE (Pattern1 CoreLoop dedup)** -Pattern1 の CoreLoop 構築を SSOT で 1 箇所に統一し、DomainPlan/Facts の二重化を解消した。 - -**2025-12-30: Phase 29ao P21 COMPLETE (Pattern1 subset step-only gate)** -Pattern1 subset を body=step のみに引き締め、strict/dev shadow adopt の誤マッチを遮断した。 - -**2025-12-30: Phase 29ao P20 COMPLETE (CoreLoop ExitMap composition SSOT)** -CoreLoop の ExitMap/Cleanup/ValueJoin 合成規約を SSOT 化し、合成境界と Fail-Fast ルールを固定した(docs-only)。 - -**2025-12-29: Phase 29am P0 COMPLETE (CorePlan If/Exit lowerer/verifier)** -CorePlan の If/Exit を lowerer/verifier で扱えるようにして、CorePlan 移行の土台を作った。 - -**2025-12-30: Phase 29ao P12 COMPLETE (Pattern7 SplitScan step join via block_params)** -Pattern7 SplitScan の step join を `Frag.block_params + EdgeArgs` で表現し、CorePhiInfo の step PHI を撤去した。 - -**2025-12-30: Phase 29ao P18 COMPLETE (single_planner outcome plumbing)** -single_planner が planner outcome を返す SSOT に寄せ、router の二重 planner 実行を撤去した。 - -**2025-12-30: Phase 29ao P17 COMPLETE (Pattern1 strict/dev shadow adopt)** -strict/dev のみ Facts→CorePlan(skeleton) を採用し、既定経路は維持した。 - -**2025-12-30: Phase 29ao P14 COMPLETE (Pattern2 Break exit join via block_params)** -Pattern2 Break の after join を `Frag.block_params + EdgeArgs` で表現し、CorePhiInfo の after PHI を撤去した。 - -**2025-12-30: Phase 29ao P16 COMPLETE (Pattern5 Break exit join via block_params)** -Pattern5 Infinite Early-Exit の after join を `Frag.block_params + EdgeArgs` で表現し、CorePhiInfo の exit PHI を撤去した。 - -**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 は許可。 - -**2025-12-29: Phase 29am P3 COMPLETE (Exit alignment: “Exit is last” rule)** -CorePlan 内の Exit の乱用を抑制し、Frag/ExitMap と整合する表現へ寄せた([V11])。 - -**PlanRuleOrder SSOT** -single_planner の順序/名前 SSOT は `src/mir/builder/control_flow/plan/single_planner/rule_order.rs` に固定。PlannerContext で Pattern1 facts の抑制を開始し、残りの guard/filter は段階移行。 - -**2025-12-29: Phase 29aj P6 COMPLETE (JoinIR regression gate SSOT)** -JoinIR 回帰の integration gate を phase29ae pack に固定し、phase143_* を legacy pack で隔離。 - -**2025-12-29: Phase 29aj P7 COMPLETE (Pattern8 planner-first)** -Pattern8 BoolPredicateScan の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。 - -**2025-12-29: Phase 29ak P0 COMPLETE (PlanRuleOrder + PlannerContext plumbing)** -PlanRuleOrder を SSOT 化し、PlannerContext を配線(未使用)。single_planner の手書きテーブルを撤去。 - -**2025-12-29: Phase 29ak P1 COMPLETE (Pattern1 facts guard via planner)** -Pattern1 以外のループで pattern1_simplewhile facts 抽出を抑制。single_planner 側の guard は安全策として維持。 - -**2025-12-29: Phase 29ak P2 COMPLETE (Pattern8 static box filter via planner)** -static box では Pattern8 facts 抽出を抑制。single_planner 側の filter は安全策として維持。 - -**2025-12-29: Phase 29ak P3 COMPLETE (remove Pattern8 filter in single_planner)** -Pattern8 static box filter を single_planner から撤去し、planner/facts 側 SSOT に一本化。 - -**2025-12-29: Phase 29ak P4 COMPLETE (remove Pattern1 guard in single_planner)** -Pattern1 guard を single_planner から撤去し、planner/facts 側 SSOT と fallback 抑制に統一。 - -**2025-12-29: Phase 29ak P5 COMPLETE (planner candidate ctx gate)** -Pattern1/8 の候補抑制を planner 側に集約し、single_planner の Pattern1 抑制を撤去。 - -**2025-12-29: Phase 29al P0 COMPLETE (Skeleton/Feature model SSOT, docs-only)** -CorePlan を骨格→特徴→合成で説明する SSOT を追加し、Freeze taxonomy に unstructured を追加。 - -**2025-12-29: Phase 29al P1 COMPLETE (post-phi final form SSOT, docs-only)** -join 値(PHI相当)の最終表現(layout/mapping/pred分類/verify)を 1 枚 SSOT として固定。 - -**2025-12-29: Phase 29al P2 COMPLETE (effect classification SSOT, docs-only)** -effect 分類(Pure/Mut/Io/Control)と “許される変形” の最小法典を SSOT 化。 - -**2025-12-29: Phase 29al P3 COMPLETE (exitkind/cleanup/effect contract SSOT, docs-only)** -cleanup を ExitKind 語彙として扱い、Control/Io を跨いだ移動や DCE 消去の事故を防ぐ境界を SSOT 化。 - -**2025-12-29: Phase 29aj P10 COMPLETE (single_planner unified shape)** -single_planner を全パターンで planner-first → extractor フォールバックの共通形に統一(挙動不変)。 - -**2025-12-29: Phase 29aj P9 COMPLETE (phase286 pattern9 legacy isolation)** -phase286_pattern9_frag_poc を legacy pack (SKIP) に隔離し、JoinIR 回帰 SSOT を phase29ae pack に固定。 - -**2025-12-29: Phase 29aj P8 COMPLETE (Pattern9 planner-first)** -Pattern9 AccumConstLoop の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。 - -**2025-12-29: Phase 29ai P15 COMPLETE (Pattern2 promotion hint observe)** -strict/dev 時のみ `[plan/pattern2/promotion_hint:{TrimSeg|DigitPos}]` を観測できるようにし、次は promotion hint の Plan/Frag 吸収残作業(P16候補)。 - -**2025-12-29: Phase 29aj P0 COMPLETE (PlannerOutcome observability SSOT)** -planner outcome(facts+plan)を SSOT 化し、single_planner の観測が planner facts のみに依存するように統一。 - -**2025-12-29: Phase 29aj P1 COMPLETE (Remove legacy_rules)** -single_planner の legacy_rules を撤去し、Pattern1/3/4/5/8/9 の抽出を plan/extractors に統一。 - -**2025-12-29: Phase 29aj P2 COMPLETE (Pattern1 planner-first)** -chosen_rule を撤去し、Pattern1 SimpleWhile の Facts→Planner-first を導入(仕様不変)。 - -**2025-12-29: Phase 29aj P3 COMPLETE (Pattern3 planner-first)** -Pattern3 If-Phi の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。 - -**2025-12-29: Phase 29aj P4 COMPLETE (Pattern4 planner-first)** -Pattern4 Continue の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。 - -**2025-12-29: Phase 29aj P5 COMPLETE (Pattern5 planner-first)** -Pattern5 Infinite Early Exit の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。 - -**2025-12-27: Phase 188.3 / Phase 287 P2 COMPLETE (Pattern6 nested loop: merge/latch fixes)** -Pattern6(1-level nested loop)の JoinIR→bridge→merge 経路で発生していた `undefined ValueId` と `vm step budget exceeded`(無限ループ)を解消。`apps/tests/phase1883_nested_minimal.hako` が RC=9 を返し、quick 154 PASS を維持。 - -- SSOT(mergeの契約): - - latch_incoming を記録してよいのは `TailCallKind::BackEdge` のみ(LoopEntry は上書き禁止) - - entry-like 判定は “JoinIR MAIN のみ” を対象にする(block-id 推測はしない): `src/mir/builder/control_flow/joinir/merge/contract_checks/entry_like_policy.rs` - - latch 二重設定は `debug_assert!` で fail-fast(回帰検知) -- 変更箇所: - - `src/mir/builder/control_flow/joinir/merge/instruction_rewriter.rs` - - `src/mir/builder/control_flow/joinir/merge/loop_header_phi_info.rs` -- 検証(DONE): - - [x] 再現とPHI確認(Pattern6) - - [x] latch記録条件を修正(BackEdgeのみ) - - [x] デバッグ出力を撤去(恒常出力なし) - - [x] quick/fixtureで検証(quick 154 PASS / fixture RC=9) - - [x] docsを締めて次の指示書を用意(refactor挟み込み用) - -**2025-12-26: Phase 286 P2.2 COMPLETE (Hygiene: extractor重複排除 + router小整理)** -Pattern1/Pattern4 の Plan/Frag PoC 完了後、extractor の `extract_loop_increment_plan` を `common_helpers.rs` に統一、router の 3行パターン(normalize→verify→lower)を `lower_via_plan()` ヘルパーで共通化。~65行削減、quick 154 PASS 維持。 - -**2025-12-26: Phase 286 P2.3 COMPLETE (Pattern9 AccumConstLoop Plan化 PoC)** -Pattern9 (AccumConstLoop) を Plan/Frag SSOT に移行完了。PHI 2本(loop_var, acc_var)、const/var 両方 OK。Pattern9 は Pattern1 より先にチェック(より具体的なパターン)。quick 154 PASS 維持。 - -- 現行の入口: `docs/development/current/main/10-Now.md` -- Phase 286 詳細: `docs/development/current/main/phases/phase-286/README.md` -- 次の候補: `docs/development/current/main/30-Backlog.md` -- Design goal: `docs/development/current/main/design/join-explicit-cfg-construction.md` - -### 直近の道筋(JoinIR / Normalized) - -### 設計方針メモ(SSOT候補) - -- ExprLowererBox(式SSOT) - - 役割: `AST(expr)` → `(prelude: Vec, value: ValueId)`(ANF含む) - - pure/impure/whitelist/strict の契約を集約(入口SSOT) -- ConditionLowererBox(条件→分岐SSOT) - - 役割: `AST(cond)` → `BranchPlan`(短絡なら分岐語彙で組む) - - 評価順は ExprLowererBox に委譲(ANFで順序固定) - - `&&/||` は制御として扱い、式で無理しない -- ControlLowererBox(制御SSOT) - - 役割: `StepNode/ControlTree` → JoinIR(継続 + env) - - `if/loop` はここ、条件の中身は ConditionLowererBox に委譲 - -- Phase 139: if-only `post_k` の return lowering を `ReturnValueLowererBox` に統一(DONE) - - `docs/development/current/main/phases/phase-139/README.md` -- Phase 140: `NormalizedExprLowererBox` 初版(pure expression のみ)(DONE) - - SSOT: `docs/development/current/main/design/normalized-expr-lowering.md` - - `docs/development/current/main/phases/phase-140/README.md` -- Phase 141 P0: impure 拡張点(contract)を SSOT 化(Call/MethodCall はまだ out-of-scope)(DONE) - - `docs/development/current/main/phases/phase-141/README.md` -- Phase 141 P1: “既知 intrinsic だけ” を許可して段階投入(DONE) - - `docs/development/current/main/phases/phase-141/README.md` -- Phase 141 P1.5: known intrinsic registry + available_inputs 3-source merge + diagnostics(DONE) - - `docs/development/current/main/phases/phase-141/README.md` -- Phase 142-loopstmt P0: 正規化単位を statement(loop 1個)へ寄せる(DONE) - - `docs/development/current/main/phases/phase-142-loopstmt/README.md` -- Phase 142-loopstmt P1: LLVM EXE smoke(同 fixture)を追加(DONE) - - `docs/development/current/main/phases/phase-142-loopstmt/README.md` -- Phase 141 P2+: Call/MethodCall(effects + typing)を分離して段階投入 - - Historical context: `docs/development/current/main/investigations/joinir-generalization-study.md` -- Phase 143-loopvocab P0/P1: loop 内 if/break/continue の語彙追加(DONE) - - `docs/development/current/main/phases/phase-143-loopvocab/README.md` -- Phase 143-loopvocab P2: else 対称化(B-C / C-B)(DONE) - - `docs/development/current/main/phases/phase-143-loopvocab/README.md` -- Phase 145-anf P0/P1/P2: ANF(impure hoist + 再帰的線形化)(DONE) - - `docs/development/current/main/phases/phase-145-anf/README.md` -- Phase 146(in progress): Loop/If 条件式へ ANF を横展開(順序固定と診断) - - `docs/development/current/main/phases/phase-146/README.md` - -## Resolved (historical) - -### WSL EXDEV / cargo build failure (resolved) - -- 2025-12-18: `Invalid cross-device link (os error 18)` により `cargo build` が失敗する事象があったが、`wsl --shutdown` 再起動後に復旧。 -- 再発時のワークアラウンド: `tools/build_llvm.sh` は EXDEV を避けるため `TMPDIR` を `target/...` 配下へ寄せる。 +- Archive(過去ログ): `docs/development/current/main/phases/phase-29ao/CURRENT_TASK-archive.md` diff --git a/docs/development/current/main/10-Now.md b/docs/development/current/main/10-Now.md index 5b195e37..5940acbe 100644 --- a/docs/development/current/main/10-Now.md +++ b/docs/development/current/main/10-Now.md @@ -1,2233 +1,22 @@ # Self Current Task — Now (main) -## Current Focus: Phase 29ao(CorePlan composition) +## Current Focus -Next: Phase 29ao P32(Pattern2 real-world strict/dev shadow adopt) -指示書: `docs/development/current/main/phases/phase-29ao/P32-STRICT-ADOPT-PATTERN2-REALWORLD-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` +- Phase: `docs/development/current/main/phases/phase-29ao/README.md` +- Next: Phase 29ao P32(Pattern2 real-world strict/dev shadow adopt) + - 指示書: `docs/development/current/main/phases/phase-29ao/P32-STRICT-ADOPT-PATTERN2-REALWORLD-FROM-FACTS-INSTRUCTIONS.md` -**2025-12-30: Phase 29ao P31 完了** ✅ -- 目的: shadow adopt の判定/Fail-Fast/タグを composer 側に集約し、router を薄くする(仕様不変) -- 変更: `src/mir/builder/control_flow/plan/composer/shadow_adopt.rs` / `src/mir/builder/control_flow/plan/composer/mod.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` / `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` +## Gate (SSOT) -**2025-12-30: Phase 29ao P30 完了** ✅ -- 目的: Facts→CorePlan の入口を `plan/composer` に集約し、Normalizer の責務を DomainPlan→CorePlan に縮退(挙動不変) -- 変更: `src/mir/builder/control_flow/plan/composer/shadow_adopt.rs` / `src/mir/builder/control_flow/plan/composer/mod.rs` / `src/mir/builder/control_flow/joinir/patterns/router.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern2_break.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern5_infinite_early_exit.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern_scan_with_init.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern_split_scan.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` / `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` +- Integration gate: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` +- Quick smoke: `./tools/smokes/v2/run.sh --profile quick` -**2025-12-30: Phase 29ao P29 完了** ✅ -- 目的: regression gate 全パターンで shadow adopt タグを必須化し、strict/dev 実踏みを SSOT 化(仕様不変) -- 変更: `src/mir/builder/control_flow/joinir/patterns/router.rs` / `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern1_strict_shadow_vm.sh` / `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern5_strict_shadow_vm.sh` / `tools/smokes/v2/profiles/integration/apps/phase29ai_pattern2_break_plan_subset_ok_min_vm.sh` / `tools/smokes/v2/profiles/integration/apps/phase118_pattern3_if_sum_vm.sh` / `tools/smokes/v2/lib/test_runner.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `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` / `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` +## Ops Rules -**2025-12-30: Phase 29ao P28 完了** ✅ -- 目的: strict/dev shadow adopt の実踏みを安定タグと回帰スモークで検証可能にする(仕様不変) -- 変更: `src/mir/builder/control_flow/joinir/patterns/router.rs` / `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern6_strict_shadow_vm.sh` / `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern7_strict_shadow_vm.sh` / `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `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` / `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` +- integration filter で `phase143_*` は回さない(JoinIR 回帰は gate のみ) +- `phase286_pattern9_*` は legacy pack (SKIP) のみで扱う -**2025-12-30: Phase 29ao P27 完了** ✅ -- 目的: Pattern6(ScanWithInit) の subset を strict/dev で Facts→CorePlan に寄せ、planner subset のズレを早期検知 -- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern_scan_with_init.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` / `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` +## Pointers -**2025-12-30: Phase 29ao P26 完了** ✅ -- 目的: Pattern2(Break) の subset を strict/dev で Facts→CorePlan に寄せ、planner subset のズレを早期検知 -- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern2_break.rs` / `src/mir/builder/control_flow/joinir/patterns/router.rs` / `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `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` / `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` - -**2025-12-30: Phase 29ao P25 完了** ✅ -- 目的: Pattern5 を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を早期検知 -- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern5_infinite_early_exit.rs` / `src/mir/builder/control_flow/joinir/patterns/router.rs` / `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern5_strict_shadow_vm.sh` / `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `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` / `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` - -**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` -- 検証: `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 P22 完了** ✅ -- 目的: Pattern1 の CoreLoop 構築を SSOT 化し、DomainPlan/Facts 経路の二重実装を排除 -- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern1_coreloop_builder.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern1_simple_while.rs` / `src/mir/builder/control_flow/plan/normalizer/skeleton_loop.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 P21 完了** ✅ -- 目的: Pattern1 subset を body=step のみに引き締め、strict/dev shadow adopt の誤マッチを遮断 -- 変更: `src/mir/builder/control_flow/plan/policies/pattern1_subset_policy.rs` / `src/mir/builder/control_flow/plan/facts/pattern1_simplewhile_facts.rs` / `src/mir/builder/control_flow/plan/extractors/pattern1.rs` / `apps/tests/phase29ao_pattern1_subset_reject_extra_stmt.hako` / `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern1_subset_reject_extra_stmt_vm.sh` / `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `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 P20 完了** ✅ -- 目的: CoreLoop の ExitMap/Cleanup/ValueJoin 合成規約を SSOT 化(docs-only) -- 変更: `docs/development/current/main/design/coreloop-exitmap-composition-ssot.md` / `docs/development/current/main/design/planfrag-ssot-registry.md` / `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` - -**2025-12-30: Phase 29ao P19 完了** ✅ -- 目的: regression gate に Pattern1 strict/dev shadow adopt を含め、回帰で必ず踏む(SSOT化) -- 変更: `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern1_strict_shadow_vm.sh` / `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` -- 検証: `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` - -**2025-12-30: Phase 29ao P0 完了** ✅ -- 目的: `CanonicalLoopFacts → CorePlan` 合成の入口(未接続)を 1 箇所に作る -- 変更: `src/mir/builder/control_flow/plan/composer/mod.rs` / `src/mir/builder/control_flow/plan/mod.rs` / `docs/development/current/main/phases/phase-29ao/README.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 P1 完了** ✅ -- 目的: composer bridge で `CanonicalLoopFacts` から `DomainPlan` を組み立てる入口を追加(未接続) -- 変更: `src/mir/builder/control_flow/plan/composer/mod.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 P2 完了** ✅ -- 目的: `CanonicalLoopFacts → DomainPlan → PlanNormalizer → CorePlan` の bridge を未接続で固定 -- 変更: `src/mir/builder/control_flow/plan/composer/mod.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 P3 完了** ✅ -- 目的: `CanonicalLoopFacts` から `CorePlan::Loop`(skeleton)を direct 生成(Pattern1 subset のみ) -- 変更: `src/mir/builder/control_flow/plan/normalizer/skeleton_loop.rs` / `src/mir/builder/control_flow/plan/normalizer/mod.rs` / `src/mir/builder/control_flow/plan/composer/mod.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 P4 完了** ✅ -- 目的: `exit_kinds_present` を `Frag.exits` に投影(未配線のまま語彙のみ固定) -- 変更: `src/mir/builder/control_flow/plan/normalizer/skeleton_loop.rs` / `src/mir/builder/control_flow/plan/composer/mod.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 P5 完了** ✅ -- 目的: `cleanup_kinds_present` を ExitKind 語彙として `Frag.exits` に投影(未配線のまま語彙のみ固定) -- 変更: `src/mir/builder/control_flow/plan/normalizer/skeleton_loop.rs` / `src/mir/builder/control_flow/plan/composer/mod.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 P6 完了** ✅ -- 目的: `value_join_needed` が立つケースは direct skeleton を採用しない(安全ゲート) -- 変更: `src/mir/builder/control_flow/plan/normalizer/skeleton_loop.rs` / `src/mir/builder/control_flow/plan/composer/mod.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 P7 完了** ✅ -- 目的: `ExprResultPlusCarriers` の語彙固定と最小 verify を追加(未接続) -- 変更: `src/mir/builder/control_flow/plan/normalizer/value_join_args.rs` / `src/mir/builder/control_flow/plan/normalizer/mod.rs` / `src/mir/builder/control_flow/plan/verifier.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 P8 完了** ✅ -- 目的: compose::seq/if_/cleanup が EdgeArgs(layout+values) を保持することをテストで固定 -- 変更: `src/mir/builder/control_flow/edgecfg/api/compose/seq.rs` / `src/mir/builder/control_flow/edgecfg/api/compose/if_.rs` / `src/mir/builder/control_flow/edgecfg/api/compose/cleanup.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 test --release -p nyash-rust` / `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 P9 完了** ✅ -- 目的: EdgeCFG の block params 足場を追加し、strict/dev で join 受け口の整合を fail-fast で固定 -- 変更: `src/mir/builder/control_flow/edgecfg/api/block_params.rs` / `src/mir/builder/control_flow/edgecfg/api/frag.rs` / `src/mir/builder/control_flow/edgecfg/api/compose/seq.rs` / `src/mir/builder/control_flow/edgecfg/api/compose/if_.rs` / `src/mir/builder/control_flow/edgecfg/api/compose/cleanup.rs` / `src/mir/builder/control_flow/edgecfg/api/compose/loop_.rs` / `src/mir/builder/control_flow/edgecfg/api/verify.rs` / `src/mir/builder/control_flow/edgecfg/api/emit.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 test --release -p nyash-rust --lib` / `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 P10 完了** ✅ -- 目的: `Frag.block_params` を `emit_frag()` で PHI に落とす唯一の接続点を追加(未接続のまま) -- 変更: `src/mir/builder/control_flow/edgecfg/api/emit.rs` / `src/mir/builder/control_flow/edgecfg/api/verify.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 test --release -p nyash-rust --lib` / `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 P11 完了** ✅ -- 目的: Normalizer が `Frag.block_params` を生成する最小ケース(If2 demo)を追加し、PHI挿入まで unit test で固定 -- 変更: `src/mir/builder/control_flow/plan/normalizer/value_join_demo_if2.rs` / `src/mir/builder/control_flow/plan/normalizer/mod.rs` / `src/mir/builder/control_flow/edgecfg/api/emit.rs` / `src/mir/builder/control_flow/edgecfg/api/verify.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 test --release -p nyash-rust --lib` / `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 P12 完了** ✅ -- 目的: Pattern7 SplitScan の step join を `Frag.block_params + EdgeArgs` に移行 -- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern_split_scan.rs` / `src/mir/builder/control_flow/plan/normalizer/common.rs` -- 検証: `cargo test --release -p nyash-rust --lib` / `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 P13 完了** ✅ -- 目的: Pattern3 If‑Phi の merge join を `Frag.block_params + EdgeArgs` に移行(expr_result 的な join 値の実使用) -- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs` / `docs/development/current/main/phases/phase-29ao/P13-VALUEJOIN-REAL-USAGE-PATTERN3-IFPHI-MERGE-INSTRUCTIONS.md` -- 検証: `cargo test --release -p nyash-rust --lib` / `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 P14 完了** ✅ -- 目的: Pattern2 Break の after join を `Frag.block_params + EdgeArgs` に移行 -- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern2_break.rs` / `docs/development/current/main/phases/phase-29ao/P14-VALUEJOIN-REAL-USAGE-PATTERN2-BREAK-EXITJOIN-INSTRUCTIONS.md` -- 検証: `cargo test --release -p nyash-rust --lib` / `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 P15 完了** ✅ -- 目的: JoinIR 回帰パック(phase29ae pack)に Pattern3(If‑Phi, VM) を追加して、P13 の実経路をゲートで固定 -- 変更: `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `docs/development/current/main/phases/phase-29ao/P15-REGRESSION-PACK-INCLUDE-PATTERN3-INSTRUCTIONS.md` -- 検証: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/run.sh --profile quick` - -**2025-12-30: Phase 29ao P16 完了** ✅ -- 目的: Pattern5 Infinite Early-Exit の after join を `Frag.block_params + EdgeArgs` に移行 -- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern5_infinite_early_exit.rs` / `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` -- 検証: `cargo test --release -p nyash-rust --lib` / `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 P17 完了** ✅ -- 目的: strict/dev のみ Pattern1 を Facts→CorePlan(skeleton) で shadow adopt -- 変更: `src/mir/builder/control_flow/joinir/patterns/router.rs` / `docs/development/current/main/phases/phase-29ao/P17-COMPOSER-PATTERN1-STRICT-SHADOW-INSTRUCTIONS.md` -- 検証: `cargo test --release -p nyash-rust --lib` / `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 P18 完了** ✅ -- 目的: single_planner から planner outcome を受け取り、router の二重 planner 実行を撤去 -- 変更: `src/mir/builder/control_flow/plan/single_planner/rules.rs` / `src/mir/builder/control_flow/plan/single_planner/mod.rs` / `src/mir/builder/control_flow/joinir/patterns/router.rs` -- 検証: `cargo test --release -p nyash-rust --lib` / `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 29an P15 完了** ✅ -- 目的: P0–P14 の成果を closeout 形式でまとめ、次フェーズ(Phase 29ao)入口を固定 -- 変更: `docs/development/current/main/phases/phase-29an/README.md` / `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md` / `CURRENT_TASK.md` - -**2025-12-29: Phase 29an P8 完了** ✅ -- 目的: exit_usage と DomainPlan(Pattern1/2/4/5)の整合を debug-only で固定(release は仕様不変) -- 変更: `src/mir/builder/control_flow/plan/planner/build.rs` -- 検証: `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 29an P9 完了** ✅ -- 目的: SkeletonFacts の一意化推論 API を追加し、0/1/2+ 境界をテストで固定(未接続・仕様不変) -- 変更: `src/mir/builder/control_flow/plan/facts/skeleton_facts.rs` -- 検証: `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 29an P10 完了** ✅ -- 目的: ExitMapFacts の語彙足場(型)を追加(未接続・仕様不変) -- 変更: `src/mir/builder/control_flow/plan/facts/feature_facts.rs` -- 検証: `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 29an P11 完了** ✅ -- 目的: ExitMapFacts を “存在集合” として最小で埋める(対応付け/CFGなし、仕様不変) -- 変更: `src/mir/builder/control_flow/plan/facts/feature_facts.rs` -- 検証: `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 29an P12 完了** ✅ -- 目的: CanonicalLoopFacts に exitmap presence(exit_kinds_present)を投影(挙動不変) -- 変更: `src/mir/builder/control_flow/plan/normalize/canonicalize.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` -- 検証: `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 29an P13 完了** ✅ -- 目的: CleanupFacts の語彙足場 + canonical projection を追加(未接続・仕様不変) -- 変更: `src/mir/builder/control_flow/plan/facts/feature_facts.rs` / `src/mir/builder/control_flow/plan/normalize/canonicalize.rs` -- 検証: `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 29an P14 完了** ✅ -- 目的: ValueJoinFacts の語彙足場 + canonical projection を追加(未接続・仕様不変) -- 変更: `src/mir/builder/control_flow/plan/facts/feature_facts.rs` / `src/mir/builder/control_flow/plan/normalize/canonicalize.rs` / `src/mir/builder/control_flow/plan/verifier.rs` -- 検証: `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 29an P7 完了** ✅ -- 目的: CanonicalLoopFacts に skeleton/exit_usage の projection を追加(挙動不変) -- 変更: `src/mir/builder/control_flow/plan/normalize/canonicalize.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` -- 検証: `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 29an P6 完了** ✅ -- 目的: planner入口に skeleton gate を追加(Loop 以外は Ok(None) で fallback 維持、仕様不変) -- 変更: `src/mir/builder/control_flow/plan/planner/build.rs` -- 検証: `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 29an P4 完了** ✅ -- 目的: LoopFacts が Some のとき skeleton/features が必ず揃うように型を引き締め(SSOT引き締め、仕様不変) -- 変更: `src/mir/builder/control_flow/plan/facts/loop_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` -- 検証: `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 29an P5 完了** ✅ -- 目的: SkeletonFacts の If2 判定を else 有無に依存しない形へ修正(未接続・仕様不変) -- 変更: `src/mir/builder/control_flow/plan/facts/skeleton_facts.rs` -- 検証: `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 29an P3 完了** ✅ -- 目的: Freeze taxonomy の `unstructured` タグをコード語彙へ追加(未使用のまま、仕様不変) -- 変更: `src/mir/builder/control_flow/plan/planner/freeze.rs` -- 検証: `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 29an P2 完了** ✅ -- 目的: planner を Skeleton→Feature→CandidateSet の段取りへ整理(候補/順序/挙動は不変) -- 変更: `src/mir/builder/control_flow/plan/planner/build.rs` -- 検証: `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 29an P1 完了** ✅ -- 目的: FeatureFacts(まず ExitUsage)を Facts SSOT として追加(仕様不変・未接続) -- 変更: `src/mir/builder/control_flow/plan/facts/feature_facts.rs` / `src/mir/builder/control_flow/plan/facts/loop_facts.rs` -- 検証: `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 29an P0 完了** ✅ -- 目的: SkeletonFacts(Loop/If/BranchN/StraightLine)を Facts SSOT として追加(仕様不変・未接続) -- 変更: `src/mir/builder/control_flow/plan/facts/skeleton_facts.rs` / `src/mir/builder/control_flow/plan/facts/loop_facts.rs` -- 検証: `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 P3 完了** ✅ -- 目的: Exit を “独立ノード増殖” にせず、Frag/ExitMap と整合する表現へ寄せる(仕様不変) -- 変更: `src/mir/builder/control_flow/plan/verifier.rs`([V11]) -- 検証: `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 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` -- 検証: `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 P0 完了** ✅ -- 目的: CorePlan の If/Exit を lowerer/verifier で扱えるようにして、CorePlan 移行の土台を作る(仕様不変) -- 変更: `src/mir/builder/control_flow/plan/lowerer.rs` / `src/mir/builder/control_flow/plan/verifier.rs` -- 検証: `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 29al P3 完了** ✅ -- 目的: cleanup を ExitKind と effect の契約として固定(仕様不変) -- SSOT: `docs/development/current/main/design/exitkind-cleanup-effect-contract-ssot.md` - -**2025-12-29: Phase 29al P2 完了** ✅ -- 目的: effect 分類と “許される変形” の最小法典を SSOT 化(仕様不変) -- SSOT: `docs/development/current/main/design/effect-classification-ssot.md` - -**2025-12-29: Phase 29al P1 完了** ✅ -- 目的: join 値(PHI相当)の最終表現と局所 verify を SSOT 化(仕様不変) -- SSOT: `docs/development/current/main/design/post-phi-final-form-ssot.md` - -**2025-12-29: Phase 29al P0 完了** ✅ -- 目的: Skeleton/Feature model を SSOT 化し、「通らない/危険」形を Freeze taxonomy に落とす(仕様不変) -- SSOT: `docs/development/current/main/design/coreplan-skeleton-feature-model.md` - -**2025-12-29: Phase 29ak P5 完了** ✅ -- 目的: planner の candidate gate を SSOT 化し、single_planner の Pattern1 抑制を撤去(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/planner/outcome.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29ak P4 完了** ✅ -- 目的: Pattern1 guard を single_planner から撤去(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29ak P3 完了** ✅ -- 目的: Pattern8 static box filter を single_planner から撤去(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29ak P2 完了** ✅ -- 目的: Pattern8 static box filter を planner 側へ移し、facts 抽出を抑制(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/facts/loop_facts.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29ak P1 完了** ✅ -- 目的: Pattern1 guard を planner 側へ移して facts 抽出を抑制(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/facts/loop_facts.rs` / `src/mir/builder/control_flow/plan/planner/outcome.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29ak P0 完了** ✅ -- 目的: PlanRuleOrder SSOT を新設し、PlannerContext の配線だけ先に導入(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/single_planner/rule_order.rs` / `src/mir/builder/control_flow/plan/planner/context.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29aj P10 完了** ✅ -- 目的: single_planner を全パターン planner-first 形に統一(挙動不変) -- 実装: `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29aj P9 完了** ✅ -- 目的: phase286_pattern9_frag_poc を legacy pack (SKIP) に隔離して SSOT を固定 -- 実装: `tools/smokes/v2/profiles/integration/joinir/phase286_pattern9_legacy_pack.sh` / `docs/development/current/main/phases/phase-29aj/README.md` / `docs/development/current/main/phases/phase-29ae/README.md` -- 検証: `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/profiles/integration/joinir/phase286_pattern9_legacy_pack.sh` (SKIP) - -**2025-12-29: Phase 29aj P8 完了** ✅ -- 目的: Pattern9(AccumConstLoop)を Facts→Planner-first に移行(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/facts/pattern9_accum_const_loop_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29aj P7 完了** ✅ -- 目的: Pattern8(BoolPredicateScan)を Facts→Planner-first に移行(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/facts/pattern8_bool_predicate_scan_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29aj P6 完了** ✅ -- 目的: JoinIR 回帰の integration gate を phase29ae pack に固定し、phase143_* を隔離 -- 実装: `tools/smokes/v2/profiles/integration/joinir/phase143_legacy_pack.sh` / `docs/development/current/main/phases/phase-29aj/README.md` / `docs/development/current/main/phases/phase-29ae/README.md` -- 検証: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/profiles/integration/joinir/phase143_legacy_pack.sh` (SKIP) - -**2025-12-29: Phase 29aj P5 完了** ✅ -- 目的: Pattern5(Infinite Early Exit)を Facts→Planner-first に移行(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/facts/pattern5_infinite_early_exit_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/run.sh --profile integration --filter "phase143_"` PASS - -**2025-12-29: Phase 29aj P4 完了** ✅ -- 目的: Pattern4(Continue)を Facts→Planner-first に移行(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/facts/pattern4_continue_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/run.sh --profile integration --filter "phase286_pattern4_frag_poc"` PASS - -**2025-12-29: Phase 29aj P3 完了** ✅ -- 目的: Pattern3(If-Phi)を Facts→Planner-first に移行(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/facts/pattern3_ifphi_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29aj P2 完了** ✅ -- 目的: chosen_rule を撤去し、Pattern1 を Facts→Planner-first に移行(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/planner/outcome.rs` / `src/mir/builder/control_flow/plan/facts/pattern1_simplewhile_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29aj P1 完了** ✅ -- 目的: single_planner の legacy_rules を撤去し、plan extractor を SSOT に集約(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/extractors/pattern{1,3,4,5,8,9}.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29aj P0 完了** ✅ -- 目的: planner outcome(facts+plan)を SSOT 化して strict 観測の再スキャンを撤去(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/planner/outcome.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29ai P15 完了** ✅ -- 目的: strict/dev のときだけ LoopBodyLocal facts を安定タグで観測できるようにする(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/single_planner/rules.rs` / `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern2_loopbodylocal_seg_min_vm.sh` / `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern2_loopbodylocal_min_vm.sh` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29ai P14 完了** ✅ -- 目的: Pattern2 LoopBodyLocal promotion の要求を Plan に載せる(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/mod.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/extractors/pattern2_break.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29ai P13 完了** ✅ -- 目的: single_planner の planner 呼び出しを 1 回に memoize して二重スキャンを解消(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29ai P12 完了** ✅ -- 目的: Pattern2 LoopBodyLocal promotion の facts 抽出を SSOT 化(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/facts/pattern2_loopbodylocal_facts.rs` / `src/mir/builder/control_flow/plan/facts/loop_facts.rs` / `src/mir/builder/control_flow/plan/facts/mod.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29ai P11 完了** ✅ -- 目的: Pattern2 break subset を Facts→Planner に吸収し、single_planner で planner-first を開始(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/facts/pattern2_break_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/run.sh --profile integration --filter "phase29ai_pattern2_break_plan_subset_ok_min"` PASS - -**2025-12-29: Phase 29ai P10 完了** ✅ -- 目的: Pattern2 extractor を plan 層へ移設して依存方向を固定(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/extractors/pattern2_break.rs` / `src/mir/builder/control_flow/joinir/patterns/extractors/pattern2.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29ai P9 完了** ✅ -- 目的: Pattern7 split-scan subset を Facts→Planner→DomainPlan まで到達させ、single_planner の Pattern7 で planner-first を開始(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/facts/loop_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29ai P8 完了** ✅ -- 目的: Facts→Planner を実行経路へ 1 歩だけ接続し、Pattern6(scan-with-init)の subset から吸収を開始(仕様不変) -- 実装: `src/mir/builder/control_flow/plan/single_planner/rules.rs`(Pattern6 rule の先頭で planner を試す) -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29ag P1 完了** ✅ -- 目的: coordinator の ValueId(idx) 前提を撤去し、boundary.join_inputs を SSOT 化(仕様不変) -- 入口: `docs/development/current/main/phases/phase-29ag/README.md` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS -- 回帰パック: `phase263_pattern2_*` を追加済み - -**2025-12-29: Phase 29ah P0 完了** ✅ -- 目的: JoinIR 回帰パックに real-world Pattern2(Phase 263)を追加(仕様不変) -- 入口: `docs/development/current/main/phases/phase-29ah/README.md` -- 回帰パック: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` - -**2025-12-29: Phase 29af P5 完了** ✅ -- 目的: 29af を closeout して JoinIR 回帰確認を 1 本に収束(仕様不変) -- 回帰パック: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS - -**2025-12-29: Phase 29af P4 完了** ✅ -- 目的: BoundaryCarrierLayout と header PHI の同順一致を strict/dev で Fail-Fast 固定(仕様不変) -- 入口: `src/mir/builder/control_flow/joinir/merge/contract_checks/header_phi_layout.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/run.sh --profile quick` PASS - -**2025-12-29: Phase 29af P3 完了** ✅ -- 目的: carrier の順序(loop_var + carriers)を merge 側 SSOT に統合(仕様不変) -- 入口: `src/mir/builder/control_flow/joinir/merge/boundary_carrier_layout.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/run.sh --profile quick` PASS - -**2025-12-29: Phase 29af P1 完了** ✅ -- 目的: boundary hygiene を merge 入口(`contract_checks`)へ集約して再発検知を SSOT 化(仕様不変) -- 実装: `src/mir/builder/control_flow/joinir/merge/contract_checks/boundary_hygiene.rs`(strict/dev のみ) -- 配線: `src/mir/builder/control_flow/joinir/merge/contract_checks/boundary_creation.rs` -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern2_"` / `./tools/smokes/v2/run.sh --profile integration --filter "phase1883_"` PASS -- JoinIR 回帰確認: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` - -**2025-12-29: Phase 29af P0 完了** ✅ -- 目的: Pattern2 の boundary 情報の歪みを SSOT 化し、exit/header/latch の責務境界を固定(仕様不変) -- 入口: `docs/development/current/main/phases/phase-29af/README.md` -- 変更: exit_bindings は LoopState のみ(ConditionOnly/LoopLocalZero は carrier_info→header PHI) -- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern2_"` / `./tools/smokes/v2/run.sh --profile integration --filter "phase1883_"` PASS - -**2025-12-28: Phase 29ae P1 完了** ✅ -- 目的: Merge/Phi Contract SSOT + 回帰パック完全固定 -- 入口: `docs/development/current/main/phases/phase-29ae/README.md` -- 追加: Header PHI Entry/Latch Contract の要点を SSOT 化 -- 検証: `./tools/smokes/v2/run.sh --profile integration --filter "phase1883_"` / `phase29ab_pattern2_` / `phase29ab_pattern6_` / `phase29ab_pattern7_` PASS - -**2025-12-28: Phase 29ae P0 完了** ✅ -- 目的: JoinIR の最小回帰セットを SSOT で固定 -- 入口: `docs/development/current/main/phases/phase-29ae/README.md` - -**2025-12-28: Phase 29ad 完了** ✅ -- 目的: Pattern6/7 fixture/smoke の命名規約を SSOT 化し、variant 名を明示して迷いを消す -- 入口: `docs/development/current/main/phases/phase-29ad/README.md` - -**2025-12-28: Phase 29ac 完了** ✅ -- 目的: Pattern6/7 の near-miss(freeze固定)を、契約維持のまま PASS へ倒す(silent fallback禁止) -- 入口: `docs/development/current/main/phases/phase-29ac/README.md` -- 結果: reverse/matchscan は `phase29ab_pattern6_*` を OK 化、split-scan は near-miss OK fixture(`phase29ab_pattern7_splitscan_nearmiss_ok_min`)を追加 - -**2025-12-28: Phase 29ab P1 完了** ✅ -- 目的: Pattern2 の LoopBodyLocal promotion の最小ケースを fixture+integration smoke で固定 -- 実装: carrier binding policy を導入し、ConditionOnly / LoopLocalZero を host binding しない -- 追加: `apps/tests/phase29ab_pattern2_loopbodylocal_min.hako` -- Smoke: `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern2_loopbodylocal_min_vm.sh` -- 検証: `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern2_*"` PASS - -**2025-12-28: Phase 29ab P2 完了** ✅ -- 目的: Pattern2 Trim(A-3)相当の `LoopBodyLocal(seg)` 最小ケースを fixture+integration smoke で固定 -- 追加: `apps/tests/phase29ab_pattern2_loopbodylocal_seg_min.hako` -- Smoke: `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern2_loopbodylocal_seg_min_vm.sh` -- 検証: `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern2_*"` PASS(2/2) - -**2025-12-28: Phase 29ab P3 完了** ✅ -- 目的: Pattern2 promotion の NotApplicable/Freeze 境界を contract+fixture+smoke で固定(JoinIR-only前提) -- 契約: `src/mir/builder/control_flow/joinir/patterns/pattern2/api/README.md` -- fixtures: `apps/tests/phase29ab_pattern2_seg_{notapplicable,freeze}_min.hako` -- smokes: `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern2_seg_{notapplicable,freeze}_min_vm.sh` -- 検証: `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern2_*"` PASS(4/4) - -**2025-12-28: Phase 29ab P4 完了** ✅ -- 目的: Phase 263 の実ログ seg を Derived slot 方針で通し、fixture+integration smoke で PASS 固定 -- Smoke: `tools/smokes/v2/profiles/integration/apps/phase263_pattern2_seg_realworld_min_vm.sh` -- 追加/調整: `String.indexOf(search, fromIndex)` の2引数対応(arity解決を含む)を VM/JoinIR lowering 側で整備 - -**2025-12-28: Phase 29ab P5 完了** ✅ -- 目的: Pattern7 SplitScan の「形は近いが契約違反」ケースを extractor 段で freeze に固定(SSOT化) -- 実装: `src/mir/builder/control_flow/joinir/patterns/pattern7_split_scan.rs`(`freeze_with_hint("phase29ab/pattern7/contract", ...)`) -- fixture: `apps/tests/phase29ab_pattern7_splitscan_contract_min.hako` -- smoke: `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern7_splitscan_contract_min_vm.sh` -- 検証: `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern7_*"` PASS - -**2025-12-28: Phase 29ab P6 完了** ✅ -- 目的: Pattern6 ScanWithInit の near-miss(契約違反)を extractor 段で freeze に固定(SSOT化) -- 実装: `src/mir/builder/control_flow/joinir/patterns/pattern6_scan_with_init.rs`(`[joinir/phase29ab/pattern6/contract]`) -- fixture: `apps/tests/phase29ab_pattern6_scan_with_init_contract_min.hako` -- smoke: `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern6_scan_with_init_contract_min_vm.sh` -- 検証: `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern6_*"` PASS - -**2025-12-28: Phase 29ab P7 完了** ✅ -- 目的: Pattern6 reverse scan / matchscan の near-miss を追加で freeze 固定し、契約境界を安定化 -- fixtures: `apps/tests/phase29ab_pattern6_{reverse,matchscan}_contract_min.hako` -- smokes: `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern6_{reverse,matchscan}_contract_min_vm.sh` -- 検証: `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern6_*"` PASS(3/3) - -**2025-12-28: Phase 29ab P8 完了** ✅ -- 目的: Pattern6/7 の正常系 fixture を Plan/Frag/compose 経路で PASS 固定(freeze を減らす) -- Pattern6 OK: `apps/tests/phase29ab_pattern6_scan_with_init_ok_min.hako` -- Pattern7 OK: `apps/tests/phase29ab_pattern7_splitscan_ok_min.hako` -- Smokes: `phase29ab_pattern6_scan_with_init_ok_min_vm`, `phase29ab_pattern7_splitscan_ok_min_vm` - -**2025-12-28: Phase 29ab P9 完了** ✅ -- 目的: Phase 29ab closeout(入口SSOTの集約) -- 入口: `docs/development/current/main/phases/phase-29ab/README.md` - -**2025-12-28: Phase 29aa P5 完了** ✅ -- 目的: Return block が複数 predecessor のとき、incoming state が完全一致する場合のみ ReturnCleanup を成立させる -- 入口: `docs/development/current/main/phases/phase-29aa/README.md` -- Safety Contract: state 不一致なら join state を作らない(誤 release 防止) -- Selfcheck: Case 3.7(state一致→cleanup)/ Case 3.8(state不一致→no cleanup)PASS -- 検証: quick 154/154 PASS / selfcheck PASS - -**2025-12-28: Phase 29aa P6 完了** ✅ -- 目的: multi-predecessor Return で state 不一致でも、共通部分(intersection)だけ ReturnCleanup を成立 -- 入口: `docs/development/current/main/phases/phase-29aa/README.md` -- Safety Contract: intersection(全経路で ptr=val が一致するもののみ)で cleanup -- Conservative: value 不一致の ptr は release しない=リーク方向(安全だが保守的) -- Selfcheck: Case 3.9(部分一致→cleanup)/ Case 3.10(intersection空→no cleanup)PASS -- 検証: quick 154/154 PASS / selfcheck PASS - -**2025-12-28: Phase 29aa P7 完了** ✅ -- 目的: ReleaseStrong の `values` 順序を決定的にする(HashSet/HashMap 由来の非決定性排除) -- 入口: `docs/development/current/main/phases/phase-29aa/README.md` -- Contract: `sort_unstable()` + `dedup()` で ValueId 昇順に固定 -- ヘルパー関数 `sorted_release_values` で全 ReleaseStrong 生成箇所(2箇所)を統一 -- Selfcheck: Case 3.11(values が昇順であることを検証)PASS -- 検証: quick 154/154 PASS / selfcheck PASS - -**2025-12-28: Phase 29aa P8 完了** ✅ -- 目的: CFG を跨いだ null 伝播(Copy-only)で explicit drop(Store null)の精度を上げる -- 入口: `docs/development/current/main/phases/phase-29aa/README.md` -- Contract: single-predecessor Jump-chain のみ null_values 伝播(multi-pred Return は合流しない) -- Non-goals: edge_args 経由の null 伝播(ValueId 同一性だけでは追えない) -- Selfcheck: Case 3.12(null 伝播で ReturnCleanup なし)PASS -- 検証: quick 154/154 PASS / selfcheck PASS - -**2025-12-27: Phase 29aa P4 完了** ✅ -- 目的: Jump の直列チェーン(単一 predecessor)を通して ReturnCleanup を成立させる(cleanup は Return block のみ) -- 入口: `docs/development/current/main/phases/phase-29aa/README.md` - -**2025-12-27: Phase 29aa P3 完了** ✅ -- 目的: Jump→Return(単一 predecessor)で state 伝播し ReturnCleanup を成立 -- 入口: `docs/development/current/main/phases/phase-29aa/README.md` - -**2025-12-27: Phase 29z P2 closeout** ✅ -- `src/mir/passes/rc_insertion.rs`: `Store` 上書き + `Store null`(explicit drop)+ Return終端cleanup の最小 release 挿入(単一block・安全ガード) -- 既定OFF: Cargo feature `rc-insertion-minimal`(env var 新設なし) -- 検証: quick 154/154 PASS 維持 + `cargo run --bin rc_insertion_selfcheck --features rc-insertion-minimal` -- 入口: `docs/development/current/main/phases/phase-29z/README.md` -- 次: Phase 29aa P2(CFG-aware の最小ターゲット選定) - -**2025-12-27: Phase 29y P0 完了** ✅ -- docs-first SSOT finalized(ABI/RC insertion/Observability) -- 3つのSSOT文書(10/20/30)を Ready に確定 -- pilot 実装(Phase 29y.1)の入口を固定 -- Next steps(実装タスク3つ)を明文化 -- 入口: `docs/development/current/main/phases/phase-29y/README.md` -- **Next**: Phase 29aa(CFG-aware RC insertion)または Phase 29x(De-Rust runtime)候補 - -**2025-12-27: Phase 287 完了** ✅ -- P0-P9完了(big files modularization / facade pattern / SSOT establishment / closeout) -- 検証: quick 154/154 PASS維持、意味論不変 -- 入口: `docs/development/current/main/phases/phase-287/README.md` - -**2025-12-27: Phase 188.3 完了** ✅ -- Pattern6(NestedLoopMinimal): `apps/tests/phase1883_nested_minimal.hako` が RC=9 -- Merge SSOT(latch/entry-like/double latch)を固定(BackEdgeのみlatch記録、main entry blockのみentry-like、二重latchはdebug_assert) -- `./tools/smokes/v2/run.sh --profile quick` 154/154 PASS 維持 -- 入口: `docs/development/current/main/phases/phase-188.3/README.md` -- 次の指示書(refactor挟み込み): `docs/development/current/main/phases/phase-188.3/P2-REFACTORING-INSTRUCTIONS.md` - -**2025-12-27: Phase 287 P0 完了** ✅ -- `merge/mod.rs` を modularize(1,555 → 1,053 lines) -- SSOT: `boundary.loop_header_func_name` 優先、`boundary.continuation_func_ids` で除外、`MAIN` 明示除外 -- 検証: Pattern6 RC=9 / quick 154 PASS / 恒常ログ増加なし -- 入口: `docs/development/current/main/phases/phase-287/P0-BIGFILES-REFACTORING-INSTRUCTIONS.md` - -**2025-12-27: Phase 287 P1 完了** ✅ -- `ast_feature_extractor.rs` を facade 化(1,148 → 135 lines) -- `pattern_recognizers/`(8 modules)へ分割(1 module = 1 質問) -- 検証: Build 0 errors / Pattern6 RC=9 / quick 154 PASS / 恒常ログ増加なし -- 入口: `docs/development/current/main/phases/phase-287/P1-AST_FEATURE_EXTRACTOR-INSTRUCTIONS.md` -- 次の指示書(P2): `docs/development/current/main/phases/phase-287/P2-CONTRACT_CHECKS-MODULARIZATION-INSTRUCTIONS.md`(完了) - -**2025-12-27: Phase 287 P2 完了** ✅ -- `contract_checks.rs` を facade 化し、`contract_checks/` 配下へ契約単位で分割(1 module = 1 contract) -- 検証: Build 0 errors / Pattern6 RC=9 / quick 154 PASS / 恒常ログ増加なし -- 入口: `docs/development/current/main/phases/phase-287/P2-CONTRACT_CHECKS-MODULARIZATION-INSTRUCTIONS.md` -- 次の指示書(P3): `docs/development/current/main/phases/phase-287/P3-INSTRUCTION_REWRITER-MODULARIZATION-INSTRUCTIONS.md`(完了) - -**2025-12-27: Phase 287 P3 完了** ✅ -- `instruction_rewriter.rs` を stage 単位へ物理分割(Scan/Plan/Apply)し、facade(orchestrator)へ縮退(意味論不変) -- 検証: Build 0 errors / quick 154 PASS / 恒常ログ増加なし -- 入口: `docs/development/current/main/phases/phase-287/P3-INSTRUCTION_REWRITER-MODULARIZATION-INSTRUCTIONS.md` -- 次の指示書(P4): `docs/development/current/main/phases/phase-287/P4-PLAN_STAGE-MODULARIZATION-INSTRUCTIONS.md`(完了) - -**2025-12-27: Phase 287 P4 完了** ✅ -- `rewriter/stages/plan.rs` を facade 化し、`rewriter/stages/plan/` 配下へ責務単位で分割(意味論不変) -- 検証: Build 0 errors / quick 154 PASS / 恒常ログ増加なし -- 入口: `docs/development/current/main/phases/phase-287/P4-PLAN_STAGE-MODULARIZATION-INSTRUCTIONS.md` -- 次の指示書(P5): `docs/development/current/main/phases/phase-287/P5-STAGES-VISIBILITY-FACADE-INSTRUCTIONS.md`(完了) - -**2025-12-27: Phase 287 P5 完了** ✅ -- `stages/mod.rs` を facade にして stage 関数を re-export(単一入口化) -- 検証: Build 0 errors / quick 154 PASS / 恒常ログ増加なし -- 入口: `docs/development/current/main/phases/phase-287/P5-STAGES-VISIBILITY-FACADE-INSTRUCTIONS.md` -- 次の指示書(P6): `docs/development/current/main/phases/phase-287/P6-SCAN_PLAN-INTEGRATION-INSTRUCTIONS.md`(完了) - -**2025-12-27: Phase 287 P6 完了** ✅ -- Scan stage を削除し、pipeline を 2-stage(Plan→Apply)へ単純化(意味論不変) -- 検証: quick 154 PASS -- 入口: `docs/development/current/main/phases/phase-287/P6-SCAN_PLAN-INTEGRATION-INSTRUCTIONS.md` -- 次の指示書(P7): `docs/development/current/main/phases/phase-287/P7-REWRITER-BOX-SCAFFOLDING-CLEANUP-INSTRUCTIONS.md`(完了) - -**2025-12-27: Phase 287 P7 完了** ✅ -- `rewriter/` の未使用 Box 雛形を削除し、SSOT を `rewriter/stages/*` に寄せた(意味論不変) -- 検証: Build 0 errors / quick 154 PASS / 恒常ログ増加なし -- 入口: `docs/development/current/main/phases/phase-287/P7-REWRITER-BOX-SCAFFOLDING-CLEANUP-INSTRUCTIONS.md` -- 次の指示書(P8): `docs/development/current/main/phases/phase-287/P8-REWRITER-README-GUARD-INSTRUCTIONS.md` - -**2025-12-27: Phase 287 P8 完了** ✅ -- `rewriter/README.md` を追加し、責務境界と SSOT(Plan→Apply)を明文化(docs-only) -- 検証: cargo check / quick PASS -- 入口: `src/mir/builder/control_flow/joinir/merge/rewriter/README.md` -- 次の指示書(P9): `docs/development/current/main/phases/phase-287/P9-PHASE-CLOSEOUT-INSTRUCTIONS.md` - -**2025-12-27: Phase 188.2 完了** ✅ -- StepTreeの `max_loop_depth` を SSOT に採用(Option A) -- strict mode で depth > 2 を明示エラー化(Fail-Fast) -- quick 154/154 PASS、integration selfhost FAIL=0 維持 -- 次: `docs/development/current/main/phases/phase-188.3/P2-REFACTORING-INSTRUCTIONS.md`(意味論不変での整理を優先) - -**2025-12-27: Phase S0.1 完了** ✅ -- integration selfhost を「落ちない状態」に収束(FAIL=0) -- canary テスト opt-in 化(SMOKES_ENABLE_SELFHOST=1、9本) -- baseline テスト条件付き SKIP(該当ログの時だけ、unknown は FAIL 維持) -- quick 154/154 PASS 維持、Fail-Fast 原則遵守 -- SSOT: [selfhost-integration-limitations.md](investigations/selfhost-integration-limitations.md) - -**2025-12-27: Phase S0 Selfhost Integration 安定化(実ログベース)完了** ✅ -- **実ログ採取完了**: 5本のスクリプト直叩き + 全体ログで事実確定(推定排除) -- **確認済みエラーパターン**(実ログベース): - - Pattern 1: Loop lowering failed / StepTree lowering returned None(JoinIR loop pattern gap) - - Pattern 2: cap_missing/NestedLoop(JoinIR caps gap) - - Pattern 3: strict mode panic(NYASH_JOINIR_STRICT=1 削除で対応) - - Pattern 4: Argument list too long(OS limitation) -- **条件付き SKIP 実装**: selfhost_minimal.sh, phase150, mir_min_vm, canary 4本(該当ログの時だけ、それ以外はFAIL) -- **進捗**: 12 FAIL → 10 FAIL(selfhost_minimal, mir_min_vm が PASS に) -- **quick smoke**: 154/154 PASS 維持 ✅ -- **SSOT**: [selfhost-integration-limitations.md](investigations/selfhost-integration-limitations.md) -- **未確認**: String+Integer 型エラー(実ログで未検出、追加しない) - -**2025-12-27: Phase 29y.1(pilot plumbing)完了** ✅ -- docs SSOT(ABI/RC insertion/observability)を Phase 29y に集約 -- "後続実装へ迷わず切るための最小導線" を追加(意味論は変更しない) - - NyRT handle ABI shim(`crates/nyash_kernel/src/ffi/lifecycle.rs`) - - RC insertion pass 入口(no-op skeleton) - - leak report に root categories(handlesのみ)を追加(Phase 1 limitation 明記) -- integration smokes 追加(Phase 29y.1): `phase29y_handle_abi_{vm,llvm}.sh` -- quick smoke 154/154 PASS 維持 - -**2025-12-26: Phase 285 P2 完了** ✅ -- weak の意味論(`weak ` + `weak_to_strong()` 成功)を integration smoke で固定 -- Fixture A(成功パターン): exit 2 で明確化、VM/LLVM PASS -- Fixture B(失敗パターン): 明示 drop (`x = null`) 方式 -- Block scope drop conformance は別タスク(P2 では扱わない) -- quick smoke 154/154 PASS 維持 - -**2025-12-26: Phase 285 P2.1 完了** ✅ -- hidden root を根治し、weak-fail fixture を PASS に復帰(`x = null` 後に `weak_to_strong()` が `null`) -- `KeepAlive` / `ReleaseStrong` により「スコープ維持 / 上書きdrop」を語彙として分離(後続の命令分離で整理) - -**2025-12-26: Phase 285 P2.2(hygiene)完了** ✅ -- `KeepAlive { values, drop_after }` を廃止し、`KeepAlive` / `ReleaseStrong` に命令分離(意図を MIR 語彙で明確化) -- quick smoke 154/154 PASS 維持 - -**2025-12-27: Phase 285 P4 Post-Completion** ✅ -- **Phase 284 P2 Integration Fix** (commit `225600b5f`) - - `phase284_p2_return_in_loop_llvm` FAIL 修正(unreachable instruction 使用) - - Integration LLVM tests: 3/3 PASS(FAIL 残りなし) -- **ret.py Box-First Refactoring** (commits `32aa0ddf6`, `5a88c4eb2`) - - Phase 1-2: UnreachableReturnHandlerBox + ReturnTypeAdjusterBox - - Phase 3: StringBoxerBox + ReturnPhiSynthesizerBox - - lower_return() 削減: 166→117 lines (-29%) -- **Code Quality Improvements** (commits `d7c6df367`, `798c193cb`, `1869396fd`, `095213c58`) - - LLVM exit code SSOT化、nyash_kernel FFI分割、LLVM検出集約、auto_detect.conf明確化 -- quick smoke 154/154 PASS 維持 - -**2025-12-26: Phase 285 P0 完了** ✅ -- 言語 SSOT との境界明文化(lifecycle.md, types.md) -- 用語・禁止事項・VM/LLVM差分分類を固定 -- P1/P2 への導線を箇条書きで追加 - -**2025-12-26: Phase 284 P2 完了** ✅ -- return を含む loop(Pattern5)を VM で smoke 固定 -- LLVM harness integration でも PASS(unreachable return の型不整合を修正) -- quick smoke 154/154 PASS 維持 - -設計相談(将来の正規化): -- `docs/development/current/main/investigations/phase-286-plan-normalization-consult.md` - -**2025-12-26: Phase 286 P2 完了** ✅ -- Pattern4 (Loop with Continue) → Plan/Frag SSOT 化 PoC 成功 -- phi_bindings 導入で PHI dst 参照を正しく解決 -- Integration test PASS (output: 6), quick smoke 154/154 PASS - -**2025-12-26: Phase 286 P2.1 完了** ✅ -- Pattern1 (SimpleWhile) → Plan/Frag SSOT 化 PoC 成功 -- Integration test PASS (return: 3), quick smoke 154/154 PASS -- Plan line routing: `route=plan strategy=extract pattern=Pattern1_SimpleWhile` - -**2025-12-26: Phase 286 P2.2 完了** ✅ -- extractor helper化: `extract_loop_increment_plan` → `common_helpers.rs` に統一(重複排除 ~25行) -- router helper化: `lower_via_plan()` 追加で Pattern6/7/4/1 の boilerplate 削減(~40行) -- quick smoke 154/154 PASS 維持、Pattern1/4 PoC 両方 PASS - -**次のステップ**: -1. **Phase 287(P9)**: Phase closeout(docs-only) - - 指示書: `docs/development/current/main/phases/phase-287/P9-PHASE-CLOSEOUT-INSTRUCTIONS.md` -2. (post self-host / docs-first)**Phase 29y**: MIR lifecycle vocab freeze(RC/weak/ABI) - - 相談パケット: `docs/development/current/main/investigations/phase-29y-mir-lifecycle-vocab-consult.md` -3. (future design, separate phase)Plan 生成の正規化(相談パケット) - - `docs/development/current/main/investigations/phase-286-plan-normalization-consult.md` - -## Recently Completed - -### 2025-12-25: Phase 288.1(REPL Session Persistence + Auto-Display) - -- ✅ **Phase 288.1完了**: REPL variable persistence + expression auto-display - - 詳細: `docs/development/current/main/phases/phase-288/README.md` - - 実装方式: AST Rewrite + ExternCall Bridge - - 達成内容: - - ✅ AST Rewriter 実装(~430行、`src/runner/repl/ast_rewriter.rs`) - - ✅ __repl.get/set ExternCall handlers 実装 - - ✅ Rc> session sharing - - ✅ Expression auto-display + `_` variable - - ✅ Fail-fast undefined variable errors - - 検証結果: - - ✅ Variable persistence: `x = 42` then `print(x)` → `42` - - ✅ Expression display: `1 + 1` → `2` - - ✅ `_` variable: `10 * 2` → `20`, then `_` → `20` - - ✅ Session reset: `.reset` clears all variables - - ✅ 154/154 smoke tests PASS (no regressions) - - Files: 8 files, +592 lines (REPL-isolated) - -### 2025-12-24: Phase 285LLVM-1.3(LLVM InstanceBox Field Access) - -- ✅ **Phase 285LLVM-1.3完了**: InstanceBox field access (getField/setField) implementation - - 詳細: `docs/development/current/main/phases/phase-285/phase-285llvm-1.3-verification-report.md` - - 実装: `crates/nyash_kernel/src/plugin/invoke.rs` (~170 lines) - - 達成内容: - - ✅ getField/setField handlers 実装完了(SSOT `fields_ng` 直接アクセス) - - ✅ Fail-Fast error logging 実装(`[llvm/invoke/{get,set}Field]` tags) - - ✅ Raw i64 fallback 対応(LLVM backend 特有の挙動) - - ✅ Handle resolution 動作確認(handle 4 → IntegerBox(42)) - - 検証結果: - - ✅ setField: Integer(42) を正しく保存 - - ✅ getField: Integer(42) を正しく取得、handle 返却 - - ✅ print issue: Phase 285LLVM-1.4(型タグ伝播)で解決済み - -### 2025-12-23 - -- Phase 283(bugfix): JoinIR if-condition remap fix: `docs/development/current/main/phases/phase-283/README.md` -- Phase 282(Router shrinkage + extraction-based migration + extractor refactor P0–P9a): `docs/development/current/main/phases/phase-282/README.md` -- Phase 280(Frag composition SSOT positioning): `docs/development/current/main/phases/phase-280/README.md` -- Phase 281(Pattern6/7 compose adoption, P0–P3): `docs/development/current/main/phases/phase-281/README.md` -- Phase 273(Plan line SSOT): `docs/development/current/main/phases/phase-273/README.md` -- Phase 275 P0(A1/B2/C2 coercion SSOT): `docs/development/current/main/phases/phase-275/README.md` -- Phase 276 P0(quick wins / type_helper SSOT): `docs/development/current/main/phases/phase-276/README.md` -- Phase 277 P1(PHI strict fail-fast): `docs/development/current/main/phases/phase-277/README.md` -- Phase 277 P2(PHI env var 統合): `docs/development/current/main/phases/phase-277/README.md` -- Phase 278 P0(deprecated PHI env vars removal): `docs/development/current/main/phases/phase-278/README.md` -- Phase 279 P0(type propagation pipeline SSOT unification): `docs/development/current/main/phases/phase-279/README.md` - ---- - -## 2025-12-22: Follow-ups(post Phase 275/276/277) - -- 目的: Phase 275/276 で積み残した改善タスクを完全実装(デッドコード削除・SSOT使用推進・Void検出) -- 達成内容: - - ✅ **P0: box_from_f64 削除**(デッドコード) - - `crates/nyash_kernel/src/lib.rs` から2関数削除 - - Phase 275 P0 の Float 型 SSOT 方針により boxing helper 不要 - - ビルド成功・テスト成功確認 - - ✅ **P1: dst_type_to_llvm_type 使用推進** - - `phi_wiring/wiring.py` を type_helper.py SSOT に統一 - - 型変換ロジックが完全に1箇所に集約(拡張性向上) - - ✅ **LLVM A1: Void検出修正(Phase 275 P0 残タスク)** - - `branch.py` に Void/VoidBox 検出ロジック実装済みを確認 - - エラーメッセージ追加(fail-fast 原則) - - テストケース作成(/tmp/test_p275_a1_void.hako) - - VM側で正常にエラー検出確認 - - ✅ **LLVM Smoke Tests 完全実施**: - - Test 1 (simple Int+Float): ✅ PASS (exit=3, VM/LLVM parity) - - Test 2 (two Int+Float ops): ✅ PASS (exit=3, VM/LLVM parity) - - Test 3 (Float + String): C2 では **TypeError** が期待(文字列混在 `+` は禁止)。ここが通るならバグとして扱う -- 効果: - - Float PHI 完全動作(VM/LLVM parity 達成) - - SSOT 原則完全適用(型変換・環境変数) - - Fail-Fast 原則適用(Void in boolean context) - - デッドコード削減(保守性向上) - -## 2025-12-22: Phase 277(P2)— PHI関連環境変数の統合・整理 ✅ - -- 目的: PHI関連環境変数を **8個 → 3個** に統合してユーザビリティ向上・保守性向上 -- 完了日: 2025-12-22 -- 達成内容: - - ✅ `debug_helper.py` 作成(環境変数チェックのSSOT) - - ✅ 3つの統合関数実装: - - `is_phi_debug_enabled()`: 一般デバッグ(LLVM_PHI_DEBUG + PHI_TYPE_DEBUG + PHI_ORDERING_DEBUG 統合) - - `is_phi_trace_enabled()`: 詳細トレース(LLVM_TRACE_PHI + LLVM_VMAP_TRACE 統合) - - `is_phi_strict_enabled()`: 厳格モード(既存維持) - - ✅ 全PHI関連ファイル修正完了(9ファイル): - - `phi_wiring/wiring.py`, `phi_wiring/tagging.py`, `phi_wiring/common.py` - - `phi_placement.py`, `trace.py`, `instructions/phi.py` - - `resolver.py`, `utils/values.py`, `builders/block_lower.py` 他 - - ✅ 後方互換性対応(非推奨警告付き、Phase 278で削除予定) - - ✅ ドキュメント更新: - - `docs/reference/environment-variables.md` に詳細セクション追加 - - 使用例・出力例・移行ガイド記載 -- 効果: - - ユーザビリティ向上(覚える変数 8個→3個) - - ドキュメント簡潔化(環境変数セクションが短く) - - 保守性向上(関連設定が1つに) - - SSOT原則適用(環境変数チェックロジック統一) - -## 2025-12-22: Phase 276(P0)— Quick Win 改善(型取得SSOT化) ✅ - -- 目的: Phase 275 P0 完了後の堅牢性改善(デバッグコード削減・型取得ロジックSSOT化・警告強化) -- 完了ドキュメント: `docs/development/current/main/phases/phase-276/P0-COMPLETION.md` -- 達成内容: - - ✅ デバッグスタックトレース削除(wiring.py) - - ✅ box_from_f64 使用確認(削除可能と判断) - - ✅ 型取得ロジックSSOT化(type_helper.py 作成、3ファイル統一) - - ✅ 型不一致CRITICAL警告強化(PhiManager連携) -- 効果: - - 型取得ロジックの重複削除(3箇所 → 1箇所) - - SSOT原則適用(バグ防止・拡張性向上) - - デバッグ性向上(CRITICAL警告で早期発見) - -## 2025-12-22:Phase 275(P0)— coercion SSOT rollout(truthiness / `==` / `+`) ✅ - -- 完了: Phase 274 P3 で確定した coercion ルール(A1/B2/C2)を VM/LLVM に実装 -- Decision (SSOT): `docs/development/current/main/phases/phase-274/P3-DECISIONS.md` -- 実装ガイド: `docs/development/current/main/phases/phase-275/P0-INSTRUCTIONS.md` -- 重要修正: - - Float型PHI完全対応(MIR型伝播 → LLVM IR double生成) - - 型取得ロジック3箇所統一(type_helper.py) - - 型不一致警告強化(CRITICAL表示) -- fixture/smoke: - - `apps/tests/phase275_p0_float_phi_min.hako` (想定) - - LLVM harness で exit=3 動作確認済み - -### 過去の Blocker: 型伝播パイプラインの二重化(lifecycle vs JoinIR) - -- 現状、型伝播/PHI 型解決の順序が経路により異なり、同一 fixture が別ルートで壊れ得る(実質 "2本のコンパイラ")。 -- 対処(SSOT, short-term): Phase 276 P0 で型取得ロジックをSSOT化(部分対応) -- 根治(SSOT, long-term): Phase 279 で type propagation pipeline の入口/順序を完全統一 -- 予定: `docs/development/current/main/phases/phase-279/README.md` - -## 2025-12-22:Phase 274(P1)— TypeOp(is/as)を Rust VM で実行可能にする ✅ - -- 完了: Rust VM が `MirInstruction::TypeOp`(Check/Cast)を実行可能 -- fixture/smoke: - - `apps/tests/phase274_p1_typeop_is_as_min.hako` - - `tools/smokes/v2/profiles/integration/apps/phase274_p1_typeop_is_as_vm.sh` - -## 2025-12-22:Phase 274(P2)— LLVM TypeOp alignment ✅ - -- 完了: LLVM harness でも `TypeOp(Check/Cast)` が SSOT(Rust VM)と一致 -- 重要修正: MIR JSON emitter(bin)で `typeop` が欠落していたため、JSON に `op:"typeop"` を出力するよう修正 -- fixture/smoke(LLVM): - - `apps/tests/phase274_p2_typeop_primitives_only.hako` - - `tools/smokes/v2/profiles/integration/apps/phase274_p2_typeop_is_as_llvm.sh` - -## 2025-12-22:Phase 272(P0.2)— Pattern7 Frag+emit_frag 移行 ✅ - -- 目的: Pattern7(split scan)を `Frag + emit_frag()` 経路へ移行し、terminator emission を SSOT に集約する(副作用 `result.push` を含む) -- 状況: Phase 272 P0.1(Pattern6)+ P0.2(Pattern7)ともに ✅ 完了 -- 入口 fixture/smoke: - - Pattern7: `apps/tests/phase256_p0_split_min.hako` + `tools/smokes/v2/profiles/integration/apps/phase256_p0_split_vm.sh` -- SSOT: `docs/development/current/main/design/edgecfg-fragments.md`(合成則/bridge撤去条件) -- 詳細: `docs/development/current/main/phases/phase-272/README.md` - -## 2025-12-22:Phase 271(docs-only)— Bridge pattern 撤去条件SSOT ✅ - -- 変更: - - `docs/development/current/main/design/edgecfg-fragments.md` に bridge contract(テンプレ)+ `Pattern9_AccumConstLoop` 撤去条件を追記 - - `docs/development/current/main/30-Backlog.md` の Phase 271 成果物を明文化 - -## 2025-12-22:Phase 269 P1.2(this/me in loop)— Static Call 正規化SSOT ✅ - -- 目的: static box 内の `this.method(...)` / `me.method(...)` を runtime receiver にせず、compile-time に static call へ正規化する(NewBox 禁止 / by-name ハードコード禁止) -- SSOT: `comp_ctx.current_static_box` と `BoxName.method/arity`(canonical key) -- 実装: MethodCall 共通入口で `This/Me` receiver を最優先で検出し、static call へ正規化(ハードコード無し) -- fixture/smoke: - - `apps/tests/phase269_p1_2_this_method_in_loop_min.hako` - - `tools/smokes/v2/profiles/integration/apps/phase269_p1_2_this_method_in_loop_vm.sh` -- 受け入れ: MIR dump に receiver `const "StringUtils"` が出ない / `call_method StringUtils.is_digit/1`(同等の static call)になる - -## 2025-12-22:Phase 269 P1(Pattern8 EdgeCFG lowering)— SSA を閉じる ✅ - -- 完了: header に `i_current = phi [i_init, preheader], [i_next, step_bb]` を入れて SSA を閉じ、header/body/step の参照を `i_current` に統一 -- 検証: `tools/smokes/v2/profiles/integration/apps/phase269_p0_pattern8_frag_vm.sh` PASS(+ 回帰 `phase259_p0_is_integer_vm` PASS) -- 詳細: `docs/development/current/main/phases/phase-269/README.md` - -## 2025-12-21:Phase 270(P0+P1)— JoinIR-only minimal loop SSOT ✅ - -- 目的: `loop(i < 3)` + `sum=sum+i` + `i=i+1` を JoinIR 経路で通すことを fixture/smoke で固定 -- 結果: Pattern1 は test-only stub のため不適合 → Pattern9(AccumConstLoop)を橋渡しとして追加し、fixture は exit=3 で PASS -- 制約: `cf_loop` は JoinIR-only(非JoinIR loop 経路や env-var 分岐は追加しない) -- 詳細: `docs/development/current/main/phases/phase-270/README.md` - -## 2025-12-21:Phase 269 P1(Pattern8 EdgeCFG lowering)✅ - -**目的**: Pattern8(BoolPredicateScan)を JoinIR ではなく **EdgeCFG Frag + emit_frag()** で “本当に”動かす(層境界は維持) -**スコープ**: Pattern8 内だけ差し替え(merge/EdgeCFG plumbing/Pattern6/7/9 は触らない、cf_loop hard-freeze維持) - -**完了内容(P1)**: -- ✅ emission 入口 `loop_predicate_scan` を追加し、Frag 構築 + `emit_frag()` を配線 -- ✅ 5ブロック構成(header/body/step/after/ret_false)で terminator を生成 -- ✅ header に PHI を挿入して `i` の SSA を閉じた(`i_current`) -- ✅ early-exit `return false` は Return wire、`return true` は loop 後 AST に任せる -- ✅ Pattern8 lower は当面 `emit_void(builder)`(loop-statement 扱い) - -**詳細**: `docs/development/current/main/phases/phase-269/README.md` - -## 2025-12-21:Phase 269 P1.1(call_method return type)— 署名SSOTで型注釈 ✅ - -- 問題: `call_method BoxName.method/N(...)` の戻り値型が既定 `String` になり、Bool を返すメソッドが誤動作する -- 修正方針: `emit_unified_call_impl` の直後で、`BoxName.method/arity` の canonical key を構築し、 - `MirFunction.signature.return_type`(SSOT)から dst の型を注釈する(ハードコード禁止) - -## 2025-12-21:Phase 267 P0(BranchStub + emit_frag)✅ - -**目的**: Frag に Branch を第一級で追加し、wires(Jump/Return)と同様に MIR terminator へ落とせる入口(SSOT)を作る -**結果**: `emit_frag()` により、`wires + branches` を BasicBlockId 層で PoC 証明(unit tests)まで完了 - -- ✅ `BranchStub` 追加 + `Frag.branches` 追加 -- ✅ `compose::if_` が header→then/else の `BranchStub` を生成 -- ✅ `emit_frag(function, frag)` 追加(`verify_frag_invariants_strict` を先頭で実行、1 block = 1 terminator を Fail-Fast) -- ✅ `cargo test -p nyash-rust --lib` PASS - -**注意(P1)**: NormalizedShadow/JoinIR への実適用は層ミスマッチがあるため Phase 268 に繰り越し -**詳細**: `docs/development/current/main/phases/phase-267/README.md` - -## 2025-12-21:Phase 268 P1(compose::if_ entry edge-args SSOT化)✅ - -**目的**: compose::if_() の then/else entry edge-args を呼び出し側 SSOT にし、TODO 削除(Phase 267 P2+ からの継続) - -**実装完了内容**: -- ✅ compose::if_() シグネチャ変更(then_entry_args, else_entry_args パラメータ追加) -- ✅ emission/branch.rs::emit_conditional_edgecfg() から空 EdgeArgs を then/else 両方に渡す -- ✅ EdgeCFG テスト更新(compose.rs 2箇所、emit.rs 1箇所) -- ✅ TODO コメント削除完了(Phase 267 P2+ TODO 解消) - -**テスト結果**: -- ✅ cargo build --release: **成功**(0エラー) -- ✅ cargo test --lib --release: **1444/1444 PASS** -- ✅ quick smoke: **45/46 PASS**(既存状態維持) - -**核心的な設計判断**: -1. **SSOT 原則**: compose::if_() 内部で then/else entry edge-args を "勝手に空 Vec で生成" しない → 呼び出し側が明示的に渡す -2. **P0 との整合性**: P0 で emission/branch.rs に薄いラッパーを作ったので、edge-args も同じ層で SSOT として渡す - -**次フェーズへの橋渡し**: -- Phase 269: Pattern6/7/8 への Frag 適用 + fixture/smoke test - -**詳細**: `docs/development/current/main/phases/phase-268/README.md` - -## 2025-12-21:Phase 266(wires → MIR terminator 生成 - 最小 PoC)✅ - -**目的**: wires を MIR terminator に変換する最小 PoC を実装し、Phase 267 での本格適用に備える - -**実装完了内容**: -- ✅ emit.rs 作成(emit_wires 実装 + unit test 4個) - - from ごとにグループ化して1本だけ許可(1 block = 1 terminator 制約) - - Return は target=None を許可(意味を持たない) - - Jump/Return 対応(Branch は Phase 267) -- ✅ verify_frag_invariants_strict() 追加(段階導入を壊さない) - - 既存の verify_frag_invariants() は変更なし(警告のまま) - - wires/exits 分離契約を Err 化(Return の target=None は許可) -- ✅ mod.rs 更新(emit module エクスポート) - -**テスト結果**: -- ✅ edgecfg::api::emit テスト: **4/4 PASS** - - test_emit_wires_jump_basic - - test_emit_wires_return_basic - - test_emit_wires_unwired_stub_fails - - test_emit_wires_multiple_from_same_block_fails -- ✅ 全 lib テスト: **1392/1392 PASS**(既存 1388 + 新規 4個、退行なし) - -**核心的な設計判断**: -1. **from グループ化**: 同じ block に複数 terminator を設定すると上書き → BTreeMap で from ごとにグループ化し、1本だけ許可 -2. **Return の target=None 許可**: Return は呼び出し元に戻るので target が意味を持たない → Normal/Break/Continue/Unwind のみ target 必須 -3. **verify strict 版**: 既存の verify_frag_invariants() を Err 化すると既存コードが壊れる → 新規に strict 版を追加し、段階導入 -4. **Phase 260 terminator 語彙ルール厳守**: Jump は set_jump_with_edge_args()、Return は set_terminator() + set_return_env() - -**重要**: JoinIR/NormalizedShadow には触らない(Phase 267)。Branch terminator 生成も Phase 267 に繰り越し。 - -**次フェーズへの橋渡し**: -- Phase 267: NormalizedShadow への Frag 適用 + Pattern6/7/8 を Frag 化 + Branch 生成 - -**詳細**: `docs/development/current/main/design/edgecfg-fragments.md` - -## 2025-12-21:Phase 265 P2(seq/if_ 実装 - wires/exits 分離)✅ - -**目的**: 「解決済み配線(wires)」と「未解決 exit(exits)」を分離し、Frag 合成の基本パターンを完成させる - -**実装完了内容**: -- ✅ Frag に `wires: Vec` フィールド追加 -- ✅ wires/exits 分離設計確立 - - **exits**: target = None のみ(未配線、外へ出る exit) - - **wires**: target = Some(...) のみ(配線済み、内部配線) -- ✅ loop_() を wires 対応に更新(Break/Continue → wires) -- ✅ seq(a, b) 実装完了(a.Normal → b.entry が wires、seq の Normal exit は b の Normal) -- ✅ if_(header, cond, t, e, join_frag) 実装完了(t/e.Normal → join が wires、if の exit は join_frag.exits) -- ✅ verify_frag_invariants() に wires/exits 分離契約追加(警告のみ、Err化は Phase 266) - -**テスト結果**: -- ✅ edgecfg::api テスト: **13/13 PASS**(frag 3個 + compose 9個 + verify 1個) -- ✅ 全 lib テスト: **1388/1388 PASS**(退行なし) - -**核心的な設計判断**: -1. **wires/exits 分離**: 解決済み配線と未解決 exit を混ぜると再配線バグが起きる → 分離して不変条件強化 -2. **if_ は join_frag 受け取り**: join: BasicBlockId では「join block」か「join 以降」か曖昧 → join_frag: Frag で明確化 -3. **verify は警告のみ**: P2 は wires/exits 分離の証明に集中、Err 化は Phase 266 で MIR 生成時に実施 - -**重要**: -- MIR 命令生成の **PoC(emit_wires)**は Phase 266 で完了。 -- Pattern6/7/8 や NormalizedShadow への **実適用**は Phase 267 以降(層境界維持)。 - -**次フェーズへの橋渡し**: -- Phase 266: wires を MIR terminator に落とす(PoC: emit_wires)✅ -- Phase 267: NormalizedShadow/JoinIR への適用 + Pattern6/7/8 を Frag 化 + Branch 生成 - -**詳細**: `docs/development/current/main/phases/phase-265/` + `docs/development/current/main/design/edgecfg-fragments.md` - -## 2025-12-21:Phase 263 P0.2(Pattern2 promotion API SSOT)✅ - -- **Goal**: Pattern2 の “Reject/continue/fallback の揺れ” を **型 + 入口SSOT**で封じ、部分続行(後段で落ちる)を構造で不可能にする -- **実装**: - - `PromoteDecision::{Promoted, NotApplicable, Freeze}`(Option 多重を撤去) - - `pattern2/api/` を入口SSOTとして新設し、`try_promote(...)` を **単一参照点**に固定 -- **効果**: - - `NotApplicable` は **必ず** `Ok(None)` で Pattern2 全体を抜ける(後続経路へ) - - `Freeze` は **必ず** Fail-Fast(close-but-unsupported のみ即死) -- **検証結果**: - - cargo test --lib: **1368/1368 PASS** ✅ - - quick smoke: **45/46 PASS** ✅(既知 1 件は別論点) -- **Commits**: - - `abdb860e7`(P0.1): PromoteDecision 導入(Option 揺れの撤去) - - `e17902a44`(P0.2): `pattern2/api/` で入口SSOT物理固定 -- **詳細**: `docs/development/current/main/phases/phase-263/README.md` - -## 2025-12-21:Phase 264 P0(EdgeCFG Fragment 入口作成)✅ - -**目的**: Frag/ExitKind を一次概念にする入口APIを用意(実装置換は次フェーズ) - -**完了内容**: -- 入口フォルダ作成: `src/mir/builder/control_flow/edgecfg/api/` -- コア型定義: `ExitKind`, `EdgeStub`, `Frag` -- 合成関数シグネチャ: `seq`, `if_`, `loop_`, `cleanup`(中身TODO) -- 最小テスト: 3個のユニットテスト追加 -- ドキュメント連動: `edgecfg-fragments.md` に入口情報追記 - -**重要**: 既存実装(pattern6/7/8, merge/EdgeCFG)は未改変。 -入口だけ固定し、適用は quick 復旧後の次フェーズで実施。 - -**次のステップ**: -- Phase 265: Pattern8 を Frag 合成に移行(最小適用) -- Phase 266: Pattern6/7 への展開(再利用確認) - -**詳細**: `docs/development/current/main/phases/phase-264/README.md` + `docs/development/current/main/design/edgecfg-fragments.md` - -## 2025-12-21:Phase 265 P0(compose/verify 最小実装)✅ - -**目的**: 入口SSOTを触って迷子防止(compose/verify の形を固める) - -**完了内容**: -- `compose::loop_()` 最小実装(exit集合の分類のみ、配線はP1以降) -- `verify_frag_invariants()` 最小実装(デバッグガード付き) -- compose::loop_() のユニットテスト 2個追加 - -**重要**: Pattern8への適用はP0ではやらない(偽Fragを避ける)。 -配線ロジックはP1で実装、Pattern8適用もP1から。 - -**次のステップ**: -- Phase 265 P1: 配線ロジック実装 + Pattern8適用 -- Phase 265 P2: seq/if_ 実装(pattern番号分岐削減の見通し) - -**詳細**: `docs/development/current/main/phases/phase-265/README.md` - -## 2025-12-21:Phase 265 P1(compose 配線ロジック実装)✅ - -**目的**: Frag/ExitKind が BasicBlockId 層で配線できることを証明 - -**完了内容**: -- EdgeStub に `target: Option` 追加 -- compose::loop_() 配線ロジック実装(Continue → header, Break → after) -- verify_frag_invariants() 配線契約検証追加 -- test-only PoC で実証完了(5個のテスト: 既存2個更新 + 新規3個追加) - -**配線契約**: -- Continue(loop_id) の EdgeStub.target = Some(header) -- Break(loop_id) の EdgeStub.target = Some(after) -- Normal/Return/Unwind の EdgeStub.target = None(上位へ伝搬) - -**重要**: -- MIR 命令生成はまだしない(Frag 層の配線能力証明に集中) -- NormalizedShadow/JoinIR層への適用は Phase 266 に繰り越し(層境界を守る) - -**次のステップ**: -- Phase 265 P2: seq/if_ 実装(順次合成・条件分岐合成) -- Phase 266: JoinIR-VM Bridge 改修後、NormalizedShadow への適用 - -**詳細**: `docs/development/current/main/phases/phase-265/README.md` - -## Next (planned) - -- Phase 265(planned): Pattern8 を Frag 合成に移行し、ExitKind+Frag の実装適用を開始(`compose::loop_` 実装) -- Phase 266(planned): catch/cleanup / cleanup/defer / async を "exit-edge 正規化" で追加できる形へ(設計: `docs/development/current/main/design/exception-cleanup-async.md`) -- Phase 141 P2+: Call/MethodCall 対応(effects + typing を分離して段階投入、ANF を前提に順序固定) -- Phase 143-loopvocab P3+: 条件スコープ拡張(impure conditions 対応) -- 詳細: `docs/development/current/main/30-Backlog.md` - -## Phase 260(大工事)ロードマップ(要約) - -- P0: edge-args を MIR terminator operand として **併存導入**(Branch を含むので参照点は `out_edges()` 系に一本化) -- P1: terminator更新APIを一本化し、successors/preds 同期漏れを構造で潰す -- P2: `BasicBlock.jump_args` を削除(terminator operand を SSOT 化) -- P3: spans を `Vec>` に収束(段階導入) - -## Phase 261 P0 チェックリスト(legacy-only 経路の棚卸し) - -- `src/mir/basic_block.rs:119` — reason: legacy layout の初期値が None(空メタ); expected: OK(legacy 未設定時の既定) -- `src/mir/basic_block.rs:239` — reason: out_edges が legacy fallback を持つ; expected: Jump/Branch で edge-args を書く経路を増やし、verify で legacy-only を検出 -- `src/mir/basic_block.rs:254` — reason: legacy setter API; expected: writer 側は edge-args を併記する経路に統一 -- `src/mir/basic_block.rs:281` — reason: legacy edge-args 生成 API; expected: read-side の移行完了後に削除(P2) -- `src/mir/basic_block.rs:337` — reason: legacy edge-args fallback; expected: verify で legacy-only を検出し、P2で撤去 - -## Current First FAIL (SSOT) - -- **After Phase 260 P0.3**: `core_direct_array_oob_set_rc_vm / Stage-B compile / JoinIR Pattern2 LoopBodyLocal(seg)` - -### FAIL Details (既知・Phase 260 scope外) - -- **Test**: `core_direct_array_oob_set_rc_vm` -- **Status**: **既知 / Phase 260 scope外**(JoinIR Pattern2 LoopBodyLocal promotion 未実装) -- **Phase**: Stage‑B compile (`stageb_compile_to_json`) -- **Error**: `[cf_loop/pattern2] Cannot promote LoopBodyLocal variables ["seg"]: No promotable pattern detected (tried A-3 Trim, A-4 DigitPos); read-only-slot rejected: [joinir/freeze] [pattern2/body_local_slot/contract/not_readonly] 'seg' must be read-only (assignment detected in loop body)` -- **Expected**: Stage-B compile succeeds (bundle_resolver loop compiles) -- **Actual**: MIR compilation error (LoopBodyLocal "seg" cannot be promoted - A-3/A-4 patterns not detected) -- **Reproduce**: - ```bash - ./tools/smokes/v2/run.sh --profile quick - # または - bash tools/smokes/v2/profiles/quick/core/core_direct_array_oob_set_rc_vm.sh - ``` -- **Root Cause**: Pattern2 の LoopBodyLocal promotion(A-3 Trim / A-4 DigitPos)に依存しており、Stage‑B の bundle_resolver 系のループで露出している。 -- **Next Action**: **Phase 260 完了**(P0.3まで完了)→ **今後は機能側のPhaseへ**(Pattern2 LoopBodyLocal promotion 機能実装) -- **分類**: JoinIR Pattern2 機能拡張(compiler機能側、CFG基盤整備は完了) - -### 次の次(構造で迷子を潰す) - -Phase 263(Pattern2 LoopBodyLocal “seg”)が片付いたら、Pattern2 の「Reject/continue/fallback の揺れ」を構造で潰す。 - -- ねらい: “Reject でも続行して後段で落ちる” を型/APIで不可能にする -- 方針(最小): - - `PromoteStepBox::try_promote(...) -> Result` - - `PromoteDecision::{Promoted, NotApplicable, Freeze}` - - orchestrator が `NotApplicable` を受け取ったら **Pattern2 全体を `Ok(None)` で抜けて fallback**(SSOT) - - “部分続行” を禁止(Fail-Fast/SSOTを維持) - -## 2025-12-21:Phase 260 P2(BasicBlock.jump_args 完全削除)✅ - -- **EdgeCFG SSOT確立完了**: `BasicBlock.jump_args` フィールド削除、edge-args SSOTをterminator operand側に一本化 -- **フィールド変更**: `jump_args` → `return_env`(Return専用metadata、terminator operandなし) -- **API簡略化**: legacy helper 8個削除、terminator更新API保持(successors同期漏れ防止) -- **Verification簡素化**: dual-source検証削除(cfg.rs 62行削除) -- **テスト結果**: - - cargo test --lib: 1368 PASS - - quick smoke: 45/46 PASS - - phase258 tail call: PASS(Return env保持確認) -- **検証**: `rg 'jump_args' src/` = 0件(コメント除く) -- **修正ファイル**: 9ファイル(basic_block.rs、handlers 4件、verification、test) -- **詳細**: `docs/development/current/main/phases/phase-260/README.md` - -## 2025-12-21:Phase 260 P0.2/P0.3(モジュール化大工事)✅ - -- **P0.2**: instruction_rewriter モジュール化 - - Commits: `cbed040a7`, `aa3fdf3c1`, `c2e8099ff`, `84cd653ae`, `875bfee1b`, `666de9d3e` - - 抽出: exit_collection, block_allocator, merge_variable_handler, call_generator, handlers/(8ファイル) -- **P0.3**: joinir_block_converter モジュール化 - - Commits: `e7f9adcfe`, `2c01a7335` - - Phase 1: terminator_builder, block_finalizer - - Phase 2: handlers/(call, jump, conditional_method_call, if_merge, nested_if_merge) - - **成果**: 15モジュール、約3941行、53単体テスト全てpass、45/46統合テストpass -- **SSOT維持確認**: jump_args直参照ゼロ、out_edges()/edge_args_to() SSOT維持 -- **詳細**: `docs/development/current/main/phases/phase-260/README.md` - -## 2025-12-20:Phase 260 P0/P0.1(edge-args Strangler)✅ - -- P0: MIR terminator の edge-args 併存導入(読む側 SSOT を `out_edges()`/`edge_args_to()` へ寄せた) -- P0.1: legacy layout の未設定を禁止(verify fail-fast)+ terminator 直代入を `set_terminator*()` へ寄せた -- Commits: - - P0: `4dfe3349b` - - P0.1: `1fe5be347` - -## 2025-12-21:Phase 259 P0(Pattern8 BoolPredicateScan)✅ - -- Phase 259 README: `docs/development/current/main/phases/phase-259/README.md` -- Result: `StringUtils.is_integer/1` を Pattern8(新規)で受理 -- Fixtures: - - `apps/tests/phase259_p0_is_integer_min.hako`(expected exit 7) -- Smokes: - - `tools/smokes/v2/profiles/integration/apps/phase259_p0_is_integer_vm.sh` ✅ PASS - - `tools/smokes/v2/profiles/integration/apps/phase259_p0_is_integer_llvm_exe.sh`(LLVM harness 要設定) -- Key Implementation: - - `src/mir/builder/control_flow/joinir/patterns/pattern8_scan_bool_predicate.rs`(新規) - - `src/mir/join_ir/lowering/scan_bool_predicate_minimal.rs`(新規) -- Design Decision: Pattern8 を新設(Pattern6 拡張ではなく分離) - - Pattern6: "見つける" scan(返り値: Integer) - - Pattern8: "全部検証する" predicate scan(返り値: Boolean) -- Note: json_lint_vm はまだ FAIL だが、is_integer 自体は解決済み。残りは nested-loop with break パターン(Pattern2 の別問題) - -## 2025-12-20:Phase 258(index_of_string/2 dynamic window scan)✅ - -- Phase 258 README: `docs/development/current/main/phases/phase-258/README.md` -- Result: `index_of_string/2` を JoinIR で受理し、quick の first FAIL を `is_integer/1` へ進めた - -## 2025-12-20:Phase 257(Pattern6 reverse scan + PHI/CFG stabilization)✅ - -- Phase 257 README: `docs/development/current/main/phases/phase-257/README.md` -- Result: `last_index_of/2` を Pattern6(reverse scan)で受理し、PHI predecessor mismatch を fail-fast + 自動補正で根治 - -## 2025-12-19:Phase 146/147 完了 ✅ - -- Phase 146 README: `docs/development/current/main/phases/phase-146/README.md` -- Fixtures: - - `apps/tests/phase146_p0_if_cond_unified_min.hako`(P0: pure cond, expected exit 7) - - `apps/tests/phase146_p1_if_cond_intrinsic_min.hako`(P1: `s.length() == 3`, expected exit 7) -- Smokes: - - `tools/smokes/v2/profiles/integration/apps/phase146_p0_if_cond_unified_vm.sh` - - `tools/smokes/v2/profiles/integration/apps/phase146_p0_if_cond_unified_llvm_exe.sh` - - `tools/smokes/v2/profiles/integration/apps/phase146_p1_if_cond_intrinsic_vm.sh` - - `tools/smokes/v2/profiles/integration/apps/phase146_p1_if_cond_intrinsic_llvm_exe.sh` -- Flags: - - `HAKO_ANF_DEV=1`(dev-only: ANF routing 有効化) - - `HAKO_ANF_ALLOW_PURE=1`(dev-only: PureOnly scope で ANF 有効化) - -## 2025-12-19:Phase 251 Fix(JoinIR 条件変数抽出 / デバッグ出力整理)✅ - -- Phase 251 README: `docs/development/current/main/phases/phase-251/README.md` -- Fix: - - `collect_variables_recursive()` を拡張し、`MethodCall/FieldAccess/Index/Call` の基底変数を ConditionEnv に登録できるようにした - - `loop_with_if_phi_if_sum.rs` の無条件 `eprintln!` を `is_joinir_debug()` ガードに移した(デフォルトは clean output) -- Status: - - 元の回帰(`arr.length()` の `arr` が ConditionEnv に入らない): 解決 - - `--profile quick` の `json_lint_vm` は別件で失敗が残る(JoinIR Pattern2 の break 条件で `MethodCall` が未対応) - -## 2025-12-19:Phase 252 P0/P1(Pattern2 break 条件: `this.methodcall`)✅ - -- Phase 252 README: `docs/development/current/main/phases/phase-252/README.md` -- Status: - - `cargo check` は通過(0 errors) - - `--profile quick` は次の FAIL が残る → Phase 253(`[joinir/mutable-acc-spec]`) - -## 2025-12-19:Phase 255(Multi-param loop wiring)✅ - -- Phase 255 README: `docs/development/current/main/phases/phase-255/README.md` -- Status: - - Pattern6/index_of が VM/LLVM で PASS - - `loop_invariants` を導入して ConditionOnly 誤用を根治 - -## 2025-12-19:Phase 256(StringUtils.split/2 可変 step ループ)✅ - -- Phase 256 README: `docs/development/current/main/phases/phase-256/README.md` -- Status: - - `StringUtils.split/2` は VM `--verify` / integration smoke まで PASS - - `--profile quick` の最初の FAIL は Phase 257(`StringUtils.last_index_of/2`)へ移動 - - 設計SSOT: `docs/development/current/main/design/join-explicit-cfg-construction.md` -- 直近の主要fix: - - `ValueId(57)` undefined は根治(原因は `const_1` 未初期化)。 - - SSA undef(`%49/%67`)は P1.7 で根治(continuation 関数名の SSOT 不一致)。 - - P1.8で ExitLine/jump_args の余剰許容と関数名マッピングを整流。 - - P1.9で `JoinInst::Jump` を tail call として bridge に落とし、`jump_args` を SSOT として保持。 - - P1.10で DCE が `jump_args` を used 扱いし、`instruction_spans` を同期(SPAN MISMATCH 根治)。 - - P1.11で ExitArgsCollector の expr_result slot 判定を明確化し、split が `--verify` / integration smoke まで PASS。 - - P1.5-DBG: boundary entry params の契約チェックを追加(VM実行前 fail-fast)。 - - P1.6: 契約チェックの薄い集約 `run_all_pipeline_checks()` を導入(pipeline の責務を縮退)。 - - P1.13: Pattern2 boundary entry params を `join_module.entry.params` SSOT へ寄せた(ValueId 推測生成の撤去)。 - - P1.13.5(= Phase 256.8.5): Boundary SSOT 統一(Pattern4/6/7 横展開 + hardcoded ValueId/PARAM_MIN 撤去)。 - - Known issue(非ブロッカー): Pattern7 integration smoke の `phi predecessor mismatch` は残存(今回の修正とは独立)。 - -## 2025-12-20:Phase 257(last_index_of early return loop)🔜 - -- Phase 257 README: `docs/development/current/main/phases/phase-257/README.md` -- Goal: `StringUtils.last_index_of/2` を JoinIR で受理し、`--profile quick` を緑に戻す - - Investigation(最小再現/論点): `docs/development/current/main/investigations/phase-257-last-index-of-loop-shape.md` - - Status: Pattern6 reverse scan + PHI/CFG 安定化は完了(最初の FAIL は次へ移動) - - Current first FAIL: `json_lint_vm / StringUtils.index_of_string/2`(dynamic window scan, unsupported) - -## 2025-12-20:Phase 258(is_integer nested-if + loop)🔜 - -- Phase 258 README: `docs/development/current/main/phases/phase-258/README.md` - - Status: `index_of_string/2` を対象(dynamic window scan) - -## 2025-12-20:Phase 259(is_integer nested-if + loop)🔜 - -- Phase 259 README: `docs/development/current/main/phases/phase-259/README.md` - -## 2025-12-19:Phase 254(index_of loop pattern)✅ 完了(Blocked by Phase 255) - -- Phase 254 README: `docs/development/current/main/phases/phase-254/README.md` -- Status: **Pattern 6 実装完了、ただし実行失敗(Phase 255 で unblock)** -- 完了項目: - - ✅ Pattern 6 DetectorBox 実装(`Pattern6_ScanWithInit MATCHED`) - - ✅ extract_scan_with_init_parts() - 構造抽出 - - ✅ scan_with_init_minimal.rs - JoinIR lowerer(main/loop_step/k_exit 生成) - - ✅ MirBuilder 統合 - boundary 構築と merge 実行 - - ✅ substring を BoxCall として init-time に emit -- ブロッカー: - - JoinIR→MIR merge/boundary が複数ループ変数(s, ch, i)に未対応 - - PHI ノードが 1つしか作られず、undefined value エラー -- **Phase 254 の受け入れ境界**: Pattern 6 検出+JoinIR 生成まで ✅ -- **実行 PASS は Phase 255 の範囲** - -## 2025-12-19:Phase 253(mutable-acc-spec)✅ - -- Phase 253 README: `docs/development/current/main/phases/phase-253/README.md` -- Goal: `--profile quick` を緑に戻す(対処療法なし、analyzer 契約の整理で直す) - -## 2025-12-19:Phase 145-anf P0/P1/P2 完了 ✅ - -- SSOT docs: - - `docs/development/current/main/phases/phase-145-anf/README.md` - - `docs/development/current/main/phases/phase-144-anf/INSTRUCTIONS.md` -- 実装 SSOT: - - `src/mir/control_tree/normalized_shadow/anf/` - - 入口(接続箇所 SSOT): `src/mir/control_tree/normalized_shadow/common/expr_lowerer_box.rs` -- 環境変数: - - `HAKO_ANF_DEV=1`(dev-only: ANF 有効化) - - `HAKO_ANF_STRICT=1`(dev-only: ANF fail-fast) -- Fixtures & smokes(VM/LLVM EXE parity): - - `apps/tests/phase145_p1_anf_length_min.hako` → exit 12 - - `apps/tests/phase145_p2_compound_expr_binop_min.hako` → exit 18 - - `apps/tests/phase145_p2_compound_expr_double_intrinsic_min.hako` → exit 5 - -## 2025-12-19:Phase 143-loopvocab P2 完了 ✅ - -- 対象: else 対称化(B-C / C-B) -- Fixtures & smokes(VM/LLVM EXE parity): - - `apps/tests/phase143_p2_loop_true_if_bc_min.hako` → exit 8 - - `apps/tests/phase143_p2_loop_true_if_cb_min.hako` → exit 9 - -## 2025-12-19:Phase 143 実行系契約修正 ✅ - -**問題**: normalized_helpers が env params を `ValueId(1,2...)` で割り当てていた(PHI Reserved 領域 0-99)。 - -**根本原因**: JoinValueSpace 契約では Param 領域は 100-999。4つの normalized shadow モジュールが全て間違った領域に params を割り当てていた。 - -**修正**: -- `NormalizedHelperBox::alloc_env_params_param_region()` 新規追加(100+ 開始) -- 4 ファイルの normalized shadow 生成を更新: - - `loop_true_if_break_continue.rs` - - `loop_true_break_once.rs` - - `if_as_last_join_k.rs` - - `post_if_post_k.rs` -- `instruction_rewriter.rs` 型ミスマッチ修正(`func.signature.params` → `func.params`) - -**検証**: -- VM exit=7 ✅(phase143_loop_true_if_break_vm.sh PASS) -- LLVM EXE exit=7 ✅(phase143_loop_true_if_break_llvm_exe.sh PASS、timeout 解消) -- Unit tests: 69/69 PASS - -**ValueId Space Contract (Phase 201)**: -| Region | Range | Purpose | -|--------|-------|---------| -| PHI Reserved | 0-99 | Loop header PHI dst | -| **Param** | **100-999** | **env params (flag, counter, etc.)** | -| Local | 1000+ | Const, BinOp, condition results | - -## 2025-12-19:Phase 143.5 + P1 完了 ✅ - -**Phase 143.5: NormalizedHelperBox 箱化(リファクタリング)** -- 目的: 120+ 行のヘルパー関数重複を消去(4 ファイル共通化) -- 実装: `src/mir/control_tree/normalized_shadow/common/normalized_helpers.rs` (151行+6テスト) -- 効果: 136行追加 - 149行削除 = **-13行**(保守性大幅向上) -- 統計: 67/67 tests PASS(新規テスト 6個含む) -- 検証: cargo check 0 errors, cargo test 100% green - -**Phase 143 P1: Continue Support(条件付きループ継続)** -- 目的: `loop(true) { if(cond_pure) continue }` パターン追加 -- 実装: Loop-If-Exit contract enum 駆動(break/continue 弁別) -- 変更: - - `extract_pattern_shape()`: Err-based pattern matching to LoopIfExitShape - - `extract_exit_action()`: Break/Continue を enum variant として識別 - - `loop_cond_check`: match shape.then で Jump target を動的決定 -- Fixtures & Tests: - - `apps/tests/phase143_loop_true_if_continue_min.hako` - - `tools/smokes/v2/profiles/integration/apps/phase143_loop_true_if_continue_vm.sh` - - `tools/smokes/v2/profiles/integration/apps/phase143_loop_true_if_continue_llvm_exe.sh` -- 検証: 契約ベース(shape.validate_for_p1() で P1 制約チェック) -- 注記: Phase 131 Pattern matching Issue 既知(ルーティング層の pre-existing failure) - -## 2025-12-19:Phase 143-loopvocab P0 完了 ✅ - -**Phase 143-loopvocab P0: Conditional Break Vocabulary Extension** -- 目的: `loop(true) { if(cond_pure) break }` パターンを Normalized shadow で実装(Phase 131 の条件付き拡張) -- 仕様: - - Loop条件: `true` リテラルのみ - - ループ本体: 単一 if statement(else なし) - - If then: `break` のみ(no continue, no nested if) - - 条件: pure expression のみ(変数/リテラル/算術/比較、Method call なし) - - Out-of-scope は `Ok(None)` で graceful fallback -- 実装 SSOT: - - `src/mir/control_tree/normalized_shadow/loop_true_if_break_continue.rs` - - 6-function JoinModule(main → loop_step → loop_cond_check → Jump/Call → k_exit → Ret) - - Jump: if true → k_exit, if false → fall through to Call(loop_step) -- Fixtures: - - `apps/tests/phase143_loop_true_if_break_min.hako`(expected exit code 7) -- Smoke tests: - - VM: `tools/smokes/v2/profiles/integration/apps/phase143_loop_true_if_break_vm.sh` ✅ PASS - - LLVM EXE: `tools/smokes/v2/profiles/integration/apps/phase143_loop_true_if_break_llvm_exe.sh` ✅ PASS -- Regression: Phase 131-142 green(no regressions) -- 統計: +400 lines(loop_true_if_break_continue.rs), 0 change to existing code -- 入口: `docs/development/current/main/phases/phase-143-loopvocab/README.md` - -## 2025-12-19:Phase 142-loopstmt P0 完了 ✅ - -**Phase 142-loopstmt P0: Statement-Level Loop Normalization** -- 目的: 正規化単位を "block suffix" から "statement (loop 1個)" へ寄せてパターン爆発を防ぐ -- 変更: - - PlanBox: loop(true) に対して常に loop_only() を返す(consumed=1) - - SuffixRouter: LoopOnly を受け入れて実行 - - build_block: consumed 後も後続文を処理(break 削除) -- 実装 SSOT: - - `src/mir/builder/control_flow/normalization/plan_box.rs` - - `src/mir/builder/control_flow/joinir/patterns/policies/normalized_shadow_suffix_router_box.rs` - - `src/mir/builder/stmts.rs` -- Refactoring: - - LoopWithPost variant を deprecated(4 commits) - - suffix_router コメント更新 - - README 更新 -- Tests: - - Fixture: `apps/tests/phase142_loop_stmt_only_then_return_length_min.hako`(exit code 3) - - VM smoke: ✅ PASS - - Unit tests: ✅ 10/10 passed - - Regression: ✅ Phase 131, 141 green -- 統計: -38 lines net (code reduction success!) -- 入口: `docs/development/current/main/phases/phase-142-loopstmt/README.md` - -⚠️ **Note**: Phase 142 (Canonicalizer Pattern Extension) とは別物。SSOT 衝突回避のため phase-142-loopstmt として独立管理。 - -## 2025-12-19:Phase 141 P1.5 完了 ✅ - -**Phase 141 P1.5: KnownIntrinsic registry + available_inputs 3-source merge + diagnostics** -- 目的: “既知 intrinsic だけ” を SSOT 化しつつ、suffix 正規化が prefix の変数を見失わないようにする(既定挙動不変)。 -- Task B(バグ修正): `AvailableInputsCollectorBox::collect(.., prefix_variables)` を追加し、Function params > Prefix variables > CapturedEnv の 3-source merge に変更 -- Task A(SSOT化): `KnownIntrinsicRegistryBox` を追加し、intrinsic の metadata(name/arity/type_hint)を `known_intrinsics.rs` に集約 -- Task C(診断): `OutOfScopeReason::IntrinsicNotWhitelisted` を追加し、Call/MethodCall の out-of-scope 理由を精密化 -- 実装 SSOT: - - `src/mir/control_tree/normalized_shadow/available_inputs_collector.rs` - - `src/mir/control_tree/normalized_shadow/common/known_intrinsics.rs` - - `src/mir/control_tree/normalized_shadow/common/expr_lowerer_box.rs` - - `src/mir/control_tree/normalized_shadow/common/expr_lowering_contract.rs` - - `src/mir/builder/control_flow/normalization/execute_box.rs` -- 設計 SSOT: - - `docs/development/current/main/design/normalized-expr-lowering.md` - -## 2025-12-19:Phase 141 P1 完了 ✅ - -**Phase 141 P1: KnownIntrinsicOnly (length0)** -- 目的: impure 導入の安全なオンランプとして、既知 intrinsic(小さな allowlist)のみを ExprLowerer に追加 -- 仕様: - - `ExprLoweringScope::WithImpure(ImpurePolicy::KnownIntrinsicOnly)` でのみ `receiver.length()` を lowering - - それ以外の Call/MethodCall は引き続き `Ok(None)`(既定挙動不変) -- Fixture: - - `apps/tests/phase141_p1_if_only_post_k_return_length_min.hako`(expected exit code 3) -- Smoke tests: - - VM: `tools/smokes/v2/profiles/integration/apps/phase141_p1_if_only_post_k_return_length_vm.sh` - - LLVM EXE: `tools/smokes/v2/profiles/integration/apps/phase141_p1_if_only_post_k_return_length_llvm_exe.sh` -- 入口: `docs/development/current/main/phases/phase-141/README.md` - -## 2025-12-19:Phase 141 P0 完了 ✅ - -**Phase 141 P0: Impure Extension Contract (Call/MethodCall stays out-of-scope)** -- 目的: 次フェーズの Call/MethodCall 導入に向けて、pure/impure 境界の contract(SSOT)を型で固定 -- SSOT: - - `src/mir/control_tree/normalized_shadow/common/expr_lowering_contract.rs` - - `src/mir/control_tree/normalized_shadow/common/expr_lowerer_box.rs` -- 仕様: Call/MethodCall は引き続き `Ok(None)`(既定挙動不変) -- 入口: `docs/development/current/main/phases/phase-141/README.md` - -## 2025-12-19:Phase 140 完了 ✅ - -**Phase 140: NormalizedExprLowererBox (pure expressions)** -- 目的: “return の形追加” をやめて、pure expression を AST walker で一般化して収束させる -- SSOT: - - `src/mir/control_tree/normalized_shadow/common/expr_lowerer_box.rs` - - `src/mir/control_tree/normalized_shadow/common/return_value_lowerer_box.rs` -- 仕様: - - pure のみ(Variable / Integer&Bool literal / unary(not,-) / arith(+,-,*,/) / compare(==,!=,<,<=,>,>=)) - - Call/MethodCall など impure は `Ok(None)`(Phase 141+) -- 入口: `docs/development/current/main/phases/phase-140/README.md` - -## 2025-12-19:Phase 139 完了 ✅ - -**Phase 139: post-if `post_k` Return Lowering Unification** -- 目的: if-only `post_k` 側の return lowering を `ReturnValueLowererBox` に統一し、loop/if の出口を一本化 -- 実装: - - `src/mir/control_tree/normalized_shadow/post_if_post_k.rs` の return lowering を `ReturnValueLowererBox::lower_to_value_id()` に委譲 - - out-of-scope は `Ok(None)` でフォールバック(既定挙動不変・dev-only) -- Fixture: - - `apps/tests/phase139_if_only_post_k_return_add_min.hako`(expected exit code 4) -- Smoke tests: - - VM: `tools/smokes/v2/profiles/integration/apps/phase139_if_only_post_k_return_add_vm.sh` - - LLVM EXE: `tools/smokes/v2/profiles/integration/apps/phase139_if_only_post_k_return_add_llvm_exe.sh` -- 入口: `docs/development/current/main/phases/phase-139/README.md` - -## 2025-12-18:Phase 138 完了 ✅ - -**Phase 138: ReturnValueLowererBox - Return Lowering SSOT** -- 目的: Return lowering logic を共有 Box として抽出し SSOT を確立 -- 実装: - - Created `common/return_value_lowerer_box.rs` (~300 lines) - - Migrated `loop_true_break_once.rs` to use Box (2 call sites) - - 5 comprehensive unit tests for all patterns - - Code reduction: ~115 lines removed from loop_true_break_once.rs -- SSOT: - - `ReturnValueLowererBox::lower_to_value_id()` - - Supported: Variable, Integer literal, Add expression (x + 2, 5 + 3) - - Fallback: Out-of-scope patterns return `Ok(None)` -- Tests: - - 5 new unit tests: variable, integer literal, add (var+int), add (int+int), fallback (subtract) - - All regressions PASS: Phase 137/97/131/135/136 -- Design Decision: - - Phase 138 P0 migrated loop paths only - - Phase 139 P0 will unify post_if_post_k.rs for complete SSOT -- Architecture Impact: - - Single location for return lowering improvements - - Isolated unit tests for return lowering logic - - Easy to add new return patterns in one location -- 入口: `docs/development/current/main/phases/phase-138/README.md` - ---- - -## 2025-12-18:Phase 137 完了 ✅ - -**Phase 137: loop(true) break-once with return add expression** -- 目的: Phase 136 を拡張し、return 時に最小 add 式をサポート -- 仕様: - - `return x + 2`(variable + integer literal)→ exit code 3 - - `return 5 + 3`(integer literal + integer literal)→ exit code 8 - - `loop(true) { x = 1; break }; x = x + 10; return x + 2` → exit code 13 -- 実装: - - `src/mir/control_tree/normalized_shadow/loop_true_break_once.rs`(`lower_return_value_to_vid()` 行 638-743, BinaryOp Add at 行 673) - - BinaryOp Add パターン追加(LHS: Variable or Integer literal, RHS: Integer literal only) - - Ok(None) fallback for out-of-scope patterns(`return x + y`, `return x - 2` 等) -- Return Value Lowering SSOT: - - Documentation: `loop_true_break_once.rs`(行 29-46, module-level comment) - - Boxification trigger: 2+ files で同一 return lowering logic が必要になった時 -- Fixtures: - - `phase137_loop_true_break_once_return_add_min.hako`(期待: exit code 3) - - `phase137_loop_true_break_once_return_add_const_min.hako`(期待: exit code 8) - - `phase137_loop_true_break_once_post_return_add_min.hako`(期待: exit code 13) -- Smoke tests: - - VM: 3/3 PASS - - LLVM EXE: 3/3 PASS -- Regression: - - Phase 97: 2/2 PASS(next_non_ws, json_loader_escape) - - Phase 131/135/136: 3/3 PASS -- 設計判断(Approach A 採用): - - 直接拡張(boxification なし)、変更スコープ小 - - post_if_post_k.rs は未変更(責任分離) -- 入口: `docs/development/current/main/phases/phase-137/README.md` - ---- - -## 2025-12-18:Phase 136 完了 ✅ - -**Phase 136: loop(true) break-once with return literal** -- 目的: Phase 131-135 を拡張し、return integer literal をサポート -- 仕様: - - `loop(true) { x = 1; break }; return 7` → exit code 7 - - `loop(true) { x = 1; break }; x = x + 2; return 7` → exit code 7 - - PHI禁止維持、dev-only、既定挙動不変 -- 実装: - - `src/mir/control_tree/normalized_shadow/loop_true_break_once.rs`(`lower_return_value_to_vid()` 行 638-743, Integer literal at 行 661) - - Integer literal パターン: Const generation(Phase 123 パターン再利用) - - Ok(None) fallback for out-of-scope patterns(`return "hello"`, `return 3.14` 等) -- Fixtures: - - `phase136_loop_true_break_once_return_literal_min.hako`(期待: exit code 7) - - `phase136_loop_true_break_once_post_return_literal_min.hako`(期待: exit code 7) -- Smoke tests: - - VM: 2/2 PASS - - LLVM EXE: 2/2 PASS -- Regression: - - Phase 131: 2/2 PASS - - Phase 135: 2/2 PASS -- 入口: `docs/development/current/main/phases/phase-136/README.md` - ---- - -## 2025-12-18:Phase 135 P0 完了 ✅ - -**Phase 135 P0: Normalization Plan Suffix Detection Generalization** -- 目的: NormalizationPlanBox の suffix 検出を一般化し、post-loop assign が 0 回でも OK に -- 背景: - - Phase 133 までは `loop + assign+ + return`(assign 1回以上必須) - - Phase 131 は `loop` のみ(return なし) - - ギャップ: `loop + return`(0 assign)が別経路 -- 改善: - - `loop + assign* + return`(N >= 0 assignments)を統一パターンとして検出 - - Phase 131 と Phase 132-133 を `LoopWithPost { post_assign_count }` enum で統一 - - Phase 131 (loop-only, no return) は `PlanKind::LoopOnly` として独立維持 -- 実装: - - `src/mir/builder/control_flow/normalization/plan_box.rs`(検出ロジック修正のみ) - - `post_assign_count >= 1` チェックを削除 → `>= 0` を許容 - - `execute_box.rs` は変更なし(既存ロジックが 0 assigns を自然にサポート) -- Fixture: `apps/tests/phase135_loop_true_break_once_post_empty_return_min.hako`(期待: exit code 1) -- Smoke tests: - - `phase135_loop_true_break_once_post_empty_return_vm.sh` PASS - - `phase135_loop_true_break_once_post_empty_return_llvm_exe.sh` PASS -- Regression: - - Phase 131: 2/2 PASS(VM + LLVM EXE) - - Phase 133: 2/2 PASS(VM + LLVM EXE) -- Unit tests: 9/9 PASS(plan_box module) -- 設計原則: - - **最小変更**: plan_box.rs の検出条件のみ変更 - - **SSOT 維持**: 検出ロジックは plan_box.rs に集約 - - **Box-First**: PlanBox(what)と ExecuteBox(how)の責任分離維持 -- 入口: `src/mir/builder/control_flow/normalization/README.md`(Phase 135 セクション追加) - -## 2025-12-18:Phase 133 完了 ✅ - -**Phase 133: loop(true) break-once + multiple post-loop assigns(dev-only)** -- 目的: Phase 132 を拡張し、post-loop で複数の assign を受理(PHI-free 維持) -- 仕様: - - `loop(true) { x = 1; break }; x = x + 2; x = x + 3; return x` は exit code `6`(VM/LLVM EXE parity) - - post_nodes 検出を `len() == 2` から `len() >= 2` に拡張 - - 複数 assign を iterative に lower(LegacyLowerer::lower_assign_stmt 再利用) -- 実装: - - `src/mir/control_tree/normalized_shadow/loop_true_break_once.rs`(3箇所編集、~30行追加) - - Pattern detection: all_assigns + ends_with_return - - Post-loop lowering: for loop で複数 assign 処理 - - SSOT: env_post_k が最終値を保持(ExitMeta に反映) -- Fixture: `apps/tests/phase133_loop_true_break_once_post_multi_add_min.hako`(期待: 6) -- Smoke: - - `phase133_loop_true_break_once_post_multi_add_vm.sh` PASS - - `phase133_loop_true_break_once_post_multi_add_llvm_exe.sh` PASS -- Regression: Phase 132/131/97 維持確認(全 PASS) -- Unit tests: 1176/1176 PASS -- 入口: `docs/development/current/main/phases/phase-133/README.md` - -## 2025-12-18:Phase 130 完了 ✅ - -**Phase 130: if-only Normalized "Small Expr/Assign" Expansion(dev-only)** -- 目的: post_k 内の最小 post-if 計算(`x = x + 3; return x`)を Normalized で通す(PHI禁止) -- 実装: - - P1: Assign(Variable) - `x = y` サポート(env map 直接更新) - - P2: Assign(Add) - `x = x + ` サポート(Const + BinOp Add) - - P3: Verifier - env map が env layout(writes + inputs)外の変数を導入しないことを検証 - - `src/mir/control_tree/normalized_shadow/legacy/mod.rs` (lower_assign_stmt 拡張) - - `src/mir/control_tree/normalized_shadow/normalized_verifier.rs` (verify_env_writes_discipline 追加) -- Fixture: `apps/tests/phase130_if_only_post_if_add_min.hako`(期待出力: 5\n4) -- Smoke: `phase130_if_only_post_if_add_vm.sh` PASS -- LLVM EXE smoke: `phase130_if_only_post_if_add_llvm_exe.sh`(LLVM 前提が無い環境では SKIP) -- Regression: Phase 129/128 維持確認(全 PASS) -- Unit tests: 1155/1155 PASS -- 入口: `docs/development/current/main/phases/phase-130/README.md` - -## 2025-12-18:Phase 129-C 完了 ✅ - -**Phase 129-C: post-if / post_k continuation(dev-only)** -- post-if(`if { x=2 }; return x`)を post_k continuation で表現 -- join_k が env merge → TailCall(post_k, merged_env) -- post_k が post-if statements 実行 → Ret -- PHI禁止: Normalized IR 内に PHI 相当を入れず env 引数で合流 -- 実装: - - `src/mir/control_tree/normalized_shadow/post_if_post_k.rs`(392行、新規) - - `builder.rs` に PostIfPostKBuilderBox 統合 - - `normalized_verifier.rs` に post_k 構造検証追加 - - `parity_contract.rs` に StructureMismatch 追加 -- Fixture: `apps/tests/phase129_if_only_post_if_return_var_min.hako` -- Smoke: `phase129_if_only_post_if_return_var_vm.sh` PASS -- Regression: Phase 129-B, 128 維持確認(全 PASS) -- Unit tests: 1155/1155 PASS -- 入口: `docs/development/current/main/phases/phase-129/README.md` - -## 2025-12-18:Phase 132 完了 ✅ - -**Phase 132: loop(true) break-once + post-loop minimal(dev-only)** -- 目的: Phase 131 を拡張し、ループ後の最小 post 計算まで Normalized shadow で固定(PHI-free 維持) -- 仕様: - - `loop(true) { x = 1; break }; x = x + 2; return x` は exit code `3`(VM/LLVM EXE parity) - - post_k continuation で post-loop statements を処理 -- 実装: - - **P0**: post_k 生成(loop_true_break_once.rs 拡張) - - **P0.5**: StepTree が post-loop statements を保持(suffix router box 追加) - - **P1**: k_exit continuation 分類修正(構造ベースの判定) - - **R0**: Continuation SSOT 一本化 + legacy 隔離 + docs 整備 -- SSOT: - - `JoinInlineBoundary::default_continuations()` - continuation ID の集約 - - `src/mir/builder/control_flow/joinir/merge/README.md` - merge 契約明文化 - - `src/mir/builder/control_flow/joinir/legacy/README.md` - legacy 撤去条件 -- テスト配置: `src/mir/builder/control_flow/joinir/merge/tests/continuation_contract.rs` -- 検証: - - `bash tools/smokes/v2/profiles/integration/apps/phase132_loop_true_break_once_post_add_vm.sh` - - `bash tools/smokes/v2/profiles/integration/apps/phase132_loop_true_break_once_post_add_llvm_exe.sh` -- 回帰: Phase 131/97 維持確認(全 PASS) -- 入口: `docs/development/current/main/phases/phase-132/README.md` - -## 2025-12-18:Phase 131 P2 完了 ✅ - -**Phase 131: loop(true) break-once Normalized(dev-only)** -- 目的: Normalized shadow の最小ループを VM/LLVM EXE 両方で動かし、更新値が外に見えることまで固定 -- 仕様: - - `loop(true) { x = 1; break }; return x` は exit code `1` - - DirectValue mode(PHI-free)で exit 値を `variable_map` に再接続 -- 検証: - - `bash tools/smokes/v2/profiles/integration/apps/phase131_loop_true_break_once_vm.sh` - - `bash tools/smokes/v2/profiles/integration/apps/phase131_loop_true_break_once_llvm_exe.sh` -- 環境: WSL の一時的な EXDEV(`Invalid cross-device link`)は `wsl --shutdown` 再起動で解消、上記 + `phase97_next_non_ws_llvm_exe.sh` まで PASS -- 入口: `docs/development/current/main/phases/phase-131/README.md` - -## 2025-12-18:Phase 127 完了 ✅ - -**Phase 127: unknown-read strict Fail-Fast(dev-only)** -- unknown-read = reads - (writes ∪ inputs) を検出 -- strict: `freeze_with_hint("phase127/unknown_read/", ...)` で即停止(hint必須) -- dev-only non-strict: 理由ログ(tag + count + 先頭数件) -- 入口: `docs/development/current/main/phases/phase-127/README.md` - -## 2025-12-18:Phase 128 完了 ✅ - -**Phase 128: if-only partial assign keep/merge in Normalized (dev-only)** -- StepStmtKind::Assign に value_ast 追加(Phase 128) -- Normalized builder に Assign(int literal) 対応(env 更新) -- Fixture: phase128_if_only_partial_assign_normalized_min.hako(簡易版) -- Smoke: phase128_if_only_partial_assign_normalized_vm.sh(PASS) -- Regression: Phase 121-126, 118 維持確認(全 PASS) -- Unit tests: 1165/1165 PASS -- 入口: `docs/development/current/main/phases/phase-128/README.md` -- 実装: - - `src/mir/control_tree/step_tree.rs` (value_ast 追加、14行追加) - - `src/mir/control_tree/normalized_shadow/builder.rs` (Assign lowering、87行追加) -- Note: 完全な join_k continuation は future work(Phase 128 は基本構造確立) - -## 2025-12-18:Phase 126 完了 ✅ - -**Phase 126: available_inputs SSOT wiring (dev-only)** -- AvailableInputsCollectorBox 実装(function params + CapturedEnv 収集) -- try_lower_if_only() に available_inputs 配線(dev-only) -- EnvLayout.inputs が実際に使用されるようになった -- Fixture 強化: reads-only 変数の return 解決を確認 -- Regression: Phase 121-125, 118 維持確認(全 PASS) -- Unit tests: 28/28 PASS (including 5 new AvailableInputsCollectorBox tests) -- Integration smoke: PASS (phase125_if_only_return_input_vm.sh, exit code 7) -- 入口: `docs/development/current/main/phases/phase-126/README.md` -- 実装: - - `src/mir/control_tree/normalized_shadow/available_inputs_collector.rs` (143行、新規) - - `src/mir/control_tree/normalized_shadow/builder.rs` (available_inputs 配線) - - `src/mir/builder/calls/lowering.rs` (AvailableInputsCollectorBox::collect() 呼び出し) - -## 2025-12-18:Phase 125 P2-P5 完了 ✅ - -**Phase 125 P2-P5: Reads-Only Env Inputs (dev-only, structure)** -- EnvLayout 導入(writes + inputs の 2 レーン化) -- from_contract: reads ∩ available_inputs で inputs を決定(決定的順序) -- Return(Variable) 解決拡張: writes or inputs から解決 -- Fail-Fast with hint: env に無い変数は構造化エラー -- Unit tests: 18/18 PASS (including new test_return_variable_from_inputs_stub) -- Integration smoke: PASS (phase125_if_only_return_input_vm.sh, exit code 7) -- Regression: Phase 121-124, 118 維持確認(全 PASS) -- 入口: `docs/development/current/main/phases/phase-125/README.md` -- 実装: - - `src/mir/control_tree/normalized_shadow/builder.rs` (EnvLayout, 186行追加) -- Note: P3 (available_inputs wiring) 未実装、inputs は空(structure-only) - -## 2025-12-18:Phase 124 完了 ✅ - -**Phase 124: Normalized reads facts + Return(Variable from env)(dev-only)** -- StepTreeFacts に reads 追加(Variable 参照を AST から抽出) -- StepTreeContract signature に reads 反映(決定性維持) -- env マッピング(変数名 → ValueId)を writes から生成 -- Return(Variable) サポート: env にある変数のみ(writes 由来) -- env に無い Variable は Fail-Fast エラー(phase124 error → Ok(None) fallback) -- Box-first modularization: extract_variables_from_ast() で SSOT 化 -- Unit tests: 1159 tests PASS (including test_return_variable_from_env) -- Integration smoke: PASS (`phase124_if_only_return_var_vm.sh`, exit code 7 許容) -- 回帰: Phase 121/123/118 維持確認 -- 入口: `docs/development/current/main/phases/phase-124/README.md` -- 実装: - - `src/mir/control_tree/step_tree_facts.rs` (reads 追加、76行) - - `src/mir/control_tree/step_tree_contract_box.rs` (reads 反映、101行) - - `src/mir/control_tree/step_tree.rs` (extract_variables_from_ast 追加、612行) - - `src/mir/control_tree/normalized_shadow/builder.rs` (env マッピング追加、837行) - -## 2025-12-18:Phase 123 完了 ✅ - -**Phase 123: if-only Normalized semantics(dev-only)** -- Return(Integer literal) → `Const + Ret(Some(vid))` 生成 -- Return(Variable) → `Ok(None)` (graceful degradation, Phase 124 で対応) -- If(minimal compare) → Variable vs Integer literal のみ対応 -- Graceful degradation: Phase 123 制限は `Ok(None)` で legacy に fallback -- Structured error codes: `[phase123/...]` prefix で明示的エラー -- Box-first modularization: parse/verify/lower 責務分離 -- Unit tests: 8 tests PASS (including graceful degradation test) -- Integration smoke: PASS (`phase123_if_only_normalized_semantics_vm.sh`) -- 入口: `docs/development/current/main/phases/phase-123/README.md` - -## 2025-12-18:Phase 121 完了 ✅ - -**Phase 121: StepTree→Normalized Shadow Lowering (if-only, dev-only)** -- 箱化モジュール化: normalized_shadow/{contracts,builder,parity}.rs (508行、新規) -- Shadow lowering: StepTree → JoinModule (Normalized方言、if-only限定) -- Capability guard: Loop/Break/Continue を明示的拒否(SSOT) -- Parity 検証: exit contracts + writes 比較(dev ログ / strict fail-fast) -- Dev-only wiring: `joinir_dev_enabled()` のときのみ shadow 生成 -- Strict fail-fast: `freeze_with_hint` で mismatch を即座に検出(hint必須) -- Smoke tests: VM 3/3 PASS、LLVM スタブ(ハーネス設定必要) -- 回帰: Phase 120 維持確認、全テスト PASS -- 入口: `docs/development/current/main/phases/phase-121/README.md` -- 設計: `docs/development/current/main/design/control-tree.md` (Phase 121章) - -## 2025-12-18:Phase 120 完了 ✅ - -**Phase 120: StepTree "Facts→Decision→Emit" 箱化モジュール化** -- 箱化モジュール化: StepTreeFacts / StepTreeContractBox の責務分離 -- StepTreeBuilderBox: 構造 + facts 抽出まで(意思決定・整形・署名生成はしない) -- StepTreeContractBox: facts → contract の整形のみ(idempotent, deterministic) -- BTreeSet で順序決定性保証(facts は順序に依存しない) -- signature_basis_string() の決定性維持(既定挙動不変) -- 回帰: Phase 103/118 維持確認、全 1142 テスト PASS -- 入口: `docs/development/current/main/design/control-tree.md` -- 実装: - - `src/mir/control_tree/step_tree_facts.rs` (63行、新規) - - `src/mir/control_tree/step_tree_contract_box.rs` (168行、新規) - - `src/mir/control_tree/step_tree.rs` (262→411行、リファクタリング) - -## 2025-12-18:Phase 119 完了 ✅ - -**Phase 119: StepTree cond SSOT(AST handle)** -- StepNode::If / StepNode::Loop に cond_ast (AstNodeHandle) を追加 -- SSOT: cond は AST 参照を保持、cond_sig は派生(署名/ログ/差分検知) -- 不変条件: cond_ast は signature_basis_string() に混ぜない(決定性維持) -- 実装: Box clone(dev-only なので許容) -- 回帰: Phase 103/104/118 維持確認 -- 入口: `docs/development/current/main/design/control-tree.md` - -## 2025-12-18:Phase 118 完了 ✅ - -**Phase 118: loop + if-only merge parity** -- loop + if-only で条件付き変数更新 merge を VM/LLVM で固定 -- Fixture: phase118_loop_nested_if_merge_min.hako (expected: 2) -- Pattern3 (if-sum) 活用 -- Smoke: VM + LLVM EXE parity 検証済み -- Follow-up: Pattern3 carrier PHI contract(expected: 12) - - Fixture: phase118_pattern3_if_sum_min.hako - - Smoke: phase118_pattern3_if_sum_{vm,llvm_exe}.sh -- 回帰: Phase 117 維持確認 -- 入口: `docs/development/current/main/phases/phase-118/README.md` - -## 2025-12-18:Phase 117 完了 ✅ - -**Phase 117: if-only nested-if + call merge parity** -- ネストしたif-only(内側if + 外側else)で call 結果 merge を VM/LLVM で固定 -- Fixture: phase117_if_only_nested_if_call_merge_min.hako (expected: 2, 3, 4) -- Smoke: VM + LLVM EXE parity 検証済み -- 回帰: Phase 116 維持確認 -- 入口: `docs/development/current/main/phases/phase-117/README.md` - -## 2025-12-18:Phase 116 完了 ✅ - -**Phase 116: if-only keep+call merge parity** -- if-only で片側が元値保持、片側が call 結果のパターンを VM/LLVM で固定 -- Fixture: phase116_if_only_keep_plus_call_min.hako (expected: 10, 2) -- Smoke: VM + LLVM EXE parity 検証済み -- 回帰: Phase 115 維持確認 -- 入口: `docs/development/current/main/phases/phase-116/README.md` - -## 2025-12-18:Phase 115 完了 ✅ - -**Phase 115: if-only call result merge parity** -- if-only で関数呼び出し結果を merge するパターンを VM/LLVM で固定 -- Fixture: phase115_if_only_call_merge_min.hako (expected: 2, 3) -- Smoke: VM + LLVM EXE parity 検証済み -- 回帰: Phase 103/113/114 維持確認 -- 入口: `docs/development/current/main/phases/phase-115/README.md` - -## 2025-12-18:Phase 114 完了 ✅ - -**Phase 114: if-only return+post parity** -- if-only で early return + post-if statements パターンを VM/LLVM で固定 -- Fixture: phase114_if_only_return_then_post_min.hako (expected: 7, 2) -- Smoke: VM + LLVM EXE parity 検証済み -- 回帰: Phase 103/113 維持確認 -- 入口: `docs/development/current/main/phases/phase-114/README.md` - -## 2025-12-18:Phase 113 完了 ✅ - -**Phase 113: if-only partial assign parity** -- if-only(else なし)の片側代入で「保持 merge」パターンを VM/LLVM で固定 -- Fixture: phase113_if_only_partial_assign_min.hako -- Smoke: VM + LLVM EXE parity 検証済み - -## 2025-12-18:Phase 112 完了 ✅ - -**Phase 112: StepTree Capability Guard (strict-only)** -- StepTree の required_caps を strict mode でチェック -- Allowlist: If, NestedIf, Loop, Return, Break, Continue -- Deny (strict): NestedLoop, TryCatch, Throw, Lambda, While, ForRange, Match, Arrow -- Error format: `[joinir/control_tree/cap_missing/] Hint: ` -- Default behavior unchanged (strict=false always Ok) -- 入口: `docs/development/current/main/design/control-tree.md` -- 実装: - - `src/mir/builder/control_flow/joinir/control_tree_capability_guard.rs` - - `src/mir/builder/calls/lowering.rs` (wired into lower_function_body) - -## 2025-12-18:Phase 111 完了 ✅ - -**Phase 111: StepTreeContract + StepTreeSignature(dev-only)** -- StepTreeContract を追加(`exits` / `writes` / `required_caps` / `cond_sig`) -- StepTreeSignature を追加(`signature_basis_string()` を安定 hash、Span は含めない) -- dev-only parity を break/continue に加えて return まで拡張 -- 入口: `docs/development/current/main/design/control-tree.md` -- 実装: `src/mir/control_tree/step_tree.rs` - -## 2025-12-18:Phase 110 完了 ✅ - -**Phase 110: ControlTree / StepTree(構造SSOT・dev-only観測)** -- StepTree の語彙(Block/If/Loop/Stmt)と Feature を pure AST で実装(ValueId/PHI/CFG を混ぜない) -- joinir routing 側で extractor との “分類矛盾” を dev-only で検出(strict のみ Fail-Fast) -- 関数本体の StepTree を dev-only でダンプ(既定挙動不変) -- 入口: `docs/development/current/main/design/control-tree.md` -- 実装: - - `src/mir/control_tree/step_tree.rs` - - `src/mir/builder/calls/lowering.rs` - - `src/mir/builder/control_flow/joinir/routing.rs` - -## 2025-12-17:Phase 109 完了 ✅ - -**Phase 109: error_tags hints SSOT** -- policy/validator エラーを "tag + message + hint" 形式に統一 -- freeze_with_hint() API 追加(hint 必須、空なら panic) -- Phase 107/104/100 の代表3箱を hint 対応に移行 -- 入口: `docs/development/current/main/phases/phase-109/README.md` - -## 2025-12-17:Phase 104 完了 ✅ - -**Phase 104: loop(true) + break-only digits(read_digits 系)** -- read_digits_from 形の `loop(true)` を Pattern2 で受理(loop var 抽出 + break cond 正規化) -- fixture: `apps/tests/phase104_read_digits_loop_true_min.hako`(expected: `2`, `1`) -- smoke: `tools/smokes/v2/profiles/integration/apps/phase104_read_digits_vm.sh` / `tools/smokes/v2/profiles/integration/apps/phase104_read_digits_llvm_exe.sh` -- P2: json_cur 由来の回帰面を追加(fixture+VM/LLVM EXE smoke) - -## 2025-12-17:Phase 107 完了 ✅ - -**Phase 107: json_cur find_balanced_* depth scan(VM + LLVM EXE parity)** -- depth scan + nested if + return-in-loop を Pattern2 policy で受理(hardcode なし) -- fixture: - - `apps/tests/phase107_find_balanced_array_end_min.hako`(expected: `1`, `3`) - - `apps/tests/phase107_find_balanced_object_end_min.hako`(expected: `1`, `3`) -- smoke(integration): - - VM: `tools/smokes/v2/profiles/integration/apps/phase107_find_balanced_array_end_vm.sh` / `tools/smokes/v2/profiles/integration/apps/phase107_find_balanced_object_end_vm.sh` - - LLVM EXE: `tools/smokes/v2/profiles/integration/apps/phase107_find_balanced_array_end_llvm_exe.sh` / `tools/smokes/v2/profiles/integration/apps/phase107_find_balanced_object_end_llvm_exe.sh` -- 入口: `docs/development/current/main/phases/phase-107/README.md` - -## 2025-12-17:Phase 108 完了 ✅ - -**Phase 108: Pattern2 policy router SSOT(薄い入口の固定)** -- post-loop early return を一般 plan(`cond`/`ret_expr`)として独立し、Pattern2Inputs の依存を解消 -- ApplyPolicyStepBox から “直叩き” を撤去し、policy router 1本に集約(入口SSOT) -- 入口: `docs/development/current/main/phases/phase-108/README.md` - -## 2025-12-17:Phase 103 P0 完了 ✅ - -**Phase 103: if-only regression baseline** -- if-only(loop無し)の nested if + merge を fixture 化し、VM/LLVM EXE parity を integration smoke で固定 - -## 2025-12-17:Phase 100 P3 完了 ✅ - -**Phase 100 P3: String Accumulator Captures** -- String accumulator(`out = out + ch`)を最小形で固定し、VM/LLVM EXE parity を smoke で検証 -- LLVM EXE 側の stringish 伝播(PHI/copy/binop)を修正し、concat の意味論を安定化 - -## 2025-12-17:Phase 100 P2 完了 ✅ - -**Phase 100 P2: Mutable Accumulator Captures** -- Mutable accumulator pattern (`out = out + ch`) を Pattern2 carrier で対応 -- ScopeManager 委譲により read-only check を回避 -- Numeric output validation (count=3) で fixture 固定 -- VM/LLVM EXE parity 完了(smoke 追加) - -## 2025-12-17:Phase 100 P1 完了 ✅ - -**Phase 100 P1: Pinned Local Captures** -- CapturedEnv に CapturedKind (Explicit/Pinned) 拡張 -- PinnedLocalAnalyzer で loop-outer read-only locals を識別 -- Pinned receiver (例: s.substring()) が loop 内で使用可能に -- Fixture/smoke で動作確認済み - -## 2025‑12‑17:Phase 99 完了 ✅ - -**Phase 99: Trim/escape 実コード寄り強化(VM+LLVM EXE)** -- next_non_ws を3ケース固定(`2`, `-1`, `3`)— 改行/CR/Tab混在パターン追加 -- escape 末尾バックスラッシュを best-effort として固定(`hello\` そのまま出力) -- VM+LLVM EXE parity 完全対応、integration smoke で検証済み - -関連(設計/実装の入口): -- Phase 100: `docs/development/current/main/phases/phase-100/README.md` - -## 2025‑12‑15:Phase 132 完了 ✅ - -**Phase 132: LLVM Exit PHI=0 根治修正 完了!** -- ループ exit PHI が 0 を返す問題を根治解決 -- 原因(2層): (1) JoinIR/Boundary が exit 値を境界に渡していない、(2) LLVM Python が PHI を落とす/上書きする -- 修正: Pattern 1 で exit 値を明示的に渡す + `predeclared_ret_phis` 使用 + `builder.vmap` の PHI 保護 -- 結果: `/tmp/p1_return_i.hako` が 3 を返す(VM 一致) -- 詳細: `investigations/phase132-llvm-exit-phi-wrong-result.md` - -**追加(Phase 132-P2): Case C の Exit PHI ValueId 衝突を修正** -- 原因: `exit_phi_builder.rs` が module-level allocator を使い、同一関数内で ValueId が衝突し得た -- 修正: `func.next_value_id()`(function-level)へ統一(`bd07b7f4`) -- 結果: `apps/tests/llvm_stage3_loop_only.hako` が LLVM EXE でも `Result: 3`(VM 一致) -- 詳細: `investigations/phase132-case-c-llvm-exe.md` - -**追加(Phase 132-P3): Exit PHI collision の早期検出(debug-only)** -- `verify_exit_phi_no_collision()` を `contract_checks.rs` に追加し、ValueId 衝突を JoinIR merge の段階で Fail-Fast する - -## 2025‑12‑15:Phase 133–136(短報) - -- Phase 133: promoted carrier(Trim)の `join_id` 解決を SSOT に寄せて修正(smoke は compile-only)。 -- Phase 134: plugin loader best-effort loading を導入(決定的順序 + failure 集約 + 継続)。 -- Phase 135: ConditionLoweringBox が allocator SSOT を無視して ValueId 衝突を起こす問題を根治。 - - 詳細: `docs/development/current/main/phases/phase-135/README.md` -- Phase 136: MirBuilder の Context 分割を完了し、状態の SSOT を Context に一本化。 - - 詳細: `docs/development/current/main/phases/phase-136/README.md` - -## 2025‑12‑16:Phase 137‑141(短報) - -- Loop Canonicalizer(前処理 SSOT)は Phase 141 まで完了(既定挙動は不変、dev-only 観測/strict parity あり)。 - - 設計 SSOT: `docs/development/current/main/design/loop-canonicalizer.md` - - 実装: `src/mir/loop_canonicalizer/mod.rs`(+ 観測: `src/mir/builder/control_flow/joinir/routing.rs`) - - Phase 記録: `docs/development/current/main/phases/phase-137/README.md` - -## 2025‑12‑16:Phase 92(短報) - -- Phase 92(ConditionalStep / P5b escape の lowering 基盤)は完了。 - - 条件付き更新(`ConditionalStep`)のJoinIR表現 + Pattern2 側の委譲(emitter 箱化) - - 条件式での body-local 参照(`ConditionEnv → LoopBodyLocalEnv`)+ 最小E2E smoke 固定 - - Phase 記録(SSOT入口): `docs/development/current/main/phases/phase-92/README.md` - - 残: P5b の “完全E2E” は body-local promotion 拡張後(スコープ外で保留) - -## 2025‑12‑16:Phase 93(短報) - -- Trim の `is_ch_match` など「ConditionOnly(PHIで運ばない派生値)」を Derived Slot として毎イテレーション再計算できるようにした。 - - SSOT: `ConditionOnlyRecipe`(運搬禁止)+ `ConditionOnlyEmitter` - - schedule: `body-init → derived → break` を評価順SSOTとして強制 - - Phase 記録(入口): `docs/development/current/main/phases/phase-93/README.md` - -## 2025‑12‑16:Phase 94(短報) - -- P5b escape(`ch` 再代入 + `i` の +1/+2)を “derived(Select)” として扱い、VM E2E を固定。 - - 新箱: `BodyLocalDerivedEmitter` + 明示ポリシー(strict で理由付き Fail-Fast) - - integration smoke: `tools/smokes/v2/profiles/integration/apps/phase94_p5b_escape_e2e.sh` - - Phase 記録(入口): `docs/development/current/main/phases/phase-94/README.md` - -## 2025‑12‑16:Phase 95(短報) - -- MiniJsonLoader の escape ループを Phase 94 基盤で固定(派生 body-local + 条件付き skip)。 - - フィクスチャ: `apps/tests/phase95_json_loader_escape_min.hako` - - smoke: `tools/smokes/v2/profiles/integration/apps/phase95_json_loader_escape_vm.sh` - - Phase 記録(入口): `docs/development/current/main/phases/phase-95/README.md` - -## 2025‑12‑16:Phase 96(短報) - -- Trim系 policy 化を開始し、MiniJsonLoader の next_non_ws ループを fixtures/smoke に追加。 - - フィクスチャ: `apps/tests/phase96_json_loader_next_non_ws_min.hako` - - smoke: `tools/smokes/v2/profiles/integration/apps/phase96_json_loader_next_non_ws_vm.sh` - - Phase 記録(入口): `docs/development/current/main/phases/phase-96/README.md` - -## 2025‑12‑16:Phase 97(短報) - -- Phase 95/96 の MiniJsonLoader fixture を LLVM EXE ラインでも固定し、JoinIR/Trim の退行検出を強化。 - - smoke: `tools/smokes/v2/profiles/integration/apps/phase97_next_non_ws_llvm_exe.sh`(next_non_ws) - - smoke: `tools/smokes/v2/profiles/integration/apps/phase97_json_loader_escape_llvm_exe.sh`(escape) - - Phase 記録(入口): `docs/development/current/main/phases/phase-97/README.md` - -## 2025‑12‑17:Phase 98(短報) - -- plugin loader に strict fail-fast を導入し(HAKO_JOINIR_STRICT=1)、FileBox/MapBox の LLVM EXE parity を持続可能に。 - - smoke: `tools/smokes/v2/profiles/integration/apps/phase97_next_non_ws_llvm_exe.sh` - - smoke: `tools/smokes/v2/profiles/integration/apps/phase97_json_loader_escape_llvm_exe.sh` - - Phase 記録(入口): `docs/development/current/main/phases/phase-98/README.md` - -## 2025‑12‑17:Phase 102(短報) - -- real-app(MiniJsonLoader.read_quoted_from)の loop を最小抽出し、VM + LLVM EXE で regression を固定(期待: length=4)。 - - フィクスチャ: `apps/tests/phase102_realapp_read_quoted_min.hako` - - smoke: `tools/smokes/v2/profiles/integration/apps/phase102_realapp_read_quoted_vm.sh` - - smoke: `tools/smokes/v2/profiles/integration/apps/phase102_realapp_read_quoted_llvm_exe.sh` - - Phase 記録(入口): `docs/development/current/main/phases/phase-102/README.md` - -## 2025‑12‑14:現状サマリ - -(補足)docs が増えて迷子になったときの「置き場所ルール(SSOT)」: - -- `docs/development/current/main/DOCS_LAYOUT.md` - -### JoinIR / Loop / If ライン - -- LoopBuilder は Phase 186‑187 で完全削除済み。**JoinIR が唯一の loop lowering 経路**。 -- LoopPattern 系は Pattern1–4 まで実装・本線化済み: - - Pattern1: Simple While - - Pattern2: Loop with Break - - Pattern3: Loop with If‑Else PHI(break/continue なし) - - Pattern4: Loop with Continue(multi‑carrier 対応) -- Exit/Carrier/Boundary ラインは次の箱で SSOT 化: - - `CarrierInfo` / `ExitMeta` / `ExitBindingBuilder` - - `JoinInlineBoundary` + `LoopExitBinding` -- If lowering は IfSelectLowerer/IfMergeLowerer を中心に整理済み。Select/PHI の扱いも Phase 189 系で橋渡し済み。 -- 残課題(JoinIR ライン): - - JoinIR→MIR merge の一般化(複雑な Select/PHI パターンの統合) - - JsonParserBox など実アプリ側での長期運用テスト -- Phase 86–90(Loop frontends)まとめ(1枚): - - `docs/development/current/main/phase86-90-loop-frontends-summary.md` - -### Phase 86–90: Loop frontends(要約) - -- Phase 86–90 は “dev-only fixtures + shape guard + fail-fast” で段階的に固定済み。 -- 具体の fixture / shape / 未検証は `docs/development/current/main/phase86-90-loop-frontends-summary.md` を SSOT とする。 - -### Scope / BindingId(dev-only の段階移行ライン) - -- MIR builder 側で lexical scope / shadowing を実在化し、言語仕様の “local はブロック境界で分離” を SSOT に揃えた。 - - JoinIR lowering 側は name-based から BindingId-based へ段階移行中: - - `ScopeManager.lookup_with_binding()` / `ConditionEnv.binding_id_map` を導入し、shadowing を壊さずに解決できる足場を作った。 - - promoted carriers(DigitPos/Trim)については `BindingId(original) → BindingId(promoted) → ValueId(join)` の鎖を dev-only で整備中。 - - Phase 86 で `carrier_init_builder` / `error_tags` を SSOT 化し、段階移行ラインの基盤(ValueId 生成とエラー語彙)が確立した。 - - これにより、BindingId dual-path の拡張・統合時に「生成」と「表示」の責務が混ざらない構造が固定された。 - - Phase 81 で Pattern2(DigitPos/Trim)の ExitLine 契約(ConditionOnly を exit PHI から除外、LoopState のみを reconnect)を E2E で固定した。 - - 参照: - - `docs/development/current/main/phase73-scope-manager-design.md` - - `docs/development/current/main/phase78-bindingid-promoted-carriers.md` - - `docs/development/current/main/phase80-bindingid-p3p4-plan.md` - - `docs/development/current/main/phase81-pattern2-exitline-contract.md` - - `docs/development/current/main/phase78-85-boxification-feedback.md` - -### JsonParser / Selfhost depth‑2 ライン - -- `selfhost_build.sh --json` で Program JSON v0 emit は安定。 - `.hako` 側から env 経由で JSON を読む最小ループ(`program_read_min.hako`)は動作確認済み。 -- JsonParserBox / BundleResolver のループ 21 本のうち: - - 18 本は Pattern1–4 で JoinIR 対応済み(Phase 162–165)。 - - `_trim` を含む一部の複合ループは、ValueId 境界や Box 登録など残課題あり。 -- BoolExprLowerer / condition_to_joinir で OR/AND/NOT 付き条件式の lowering は実装完了(Phase 168–169)。 -- 残課題(JsonParser/selfhost depth‑2): - - JoinIR→MIR ValueId boundary の完全一般化(条件用 ValueId を含める) - - JsonParserBox の using / Box 登録(Rust VM 側での認識) - - Program JSON v0 を JsonParserBox 経由でフル解析する line の仕上げ - -### Ring0 / Runtime / CoreServices ライン - -- Ring0Context + Ring0Registry で OS API 抽象化レイヤ完成: - - MemApi / IoApi / TimeApi / LogApi / FsApi / ThreadApi - - RuntimeProfile(Default / NoFs) で条件付き必須を制御。 -- CoreServices(ring1‑core)として次を実装済み: - - StringService / IntegerService / BoolService - - ArrayService / MapService / ConsoleService - - PluginHost 統合 + UnifiedBoxRegistry からの自動初期化 -- FileBox / FileHandleBox ライン: - - Ring0FsFileIo 経由で read / write / append / metadata 完全対応 - - Default プロファイルでは必須、NoFs プロファイルでは disabled。 -- Logging ライン: - - ConsoleService(user‑facing) - - Ring0.log(internal/dev) - - println!(test 専用) - の 3 層が `logging_policy.md` で整理済み。JoinIR/Loop trace も同ドキュメントに集約。 -- VM backend の Box 解決(UnifiedBoxRegistry / BoxFactoryRegistry)の経路図: - - `docs/development/current/main/phase131-2-box-resolution-map.md` -- LLVM(Python llvmlite)lowering の棚卸し(Phase 131-3..10): - - `docs/development/current/main/phase131-3-llvm-lowering-inventory.md` - - 状態: Case B(Pattern1/loop_min_while)は EMIT/LINK/RUN まで復旧済み。Phase 132 で `return i` の VM/LLVM parity を固定。 - - Case C は別途 “Case C docs” を SSOT にして追跡する(状況は更新されるので、この箇所では断定しない) - - Case C の調査と実装計画: - - `docs/development/current/main/phase131-11-case-c-summary.md` - - `docs/development/current/main/case-c-infinite-loop-analysis.md` - ---- - -## 2025‑09‑08:旧スナップショット(参考) - -- LLVM 側 P0 完了(BitOps/Array/Echo/Map 緑)。VInvoke(by‑name/by‑id vector) は戻り値マッピングの暫定課題を確認中(Decisions 参照)。 -- selfhosting-dev の作業を main に順次取り込み。VM/MIR 基盤は main で先に整える方針。 - -直近タスク(当時) -1) continue/break の lowering(Builder 修正のみで表現) - - ループ文脈スタック {head, exit} を導入。 - - continue に遭遇 → head(または latch)へ br を emit し終端。 - - break に遭遇 → exit へ br を emit し終端。 - - post‑terminated 後に emit しない制御を徹底。 -2) ループ CFG の厳密化 - - 単一 exit ブロックの徹底。 - - Phi はヘッダでキャリー変数を合流(SSA/支配関係が崩れない形)。 -3) 検証とスモーク - - Verifier 緑(dominance/SSA)。 - - VM のループ代表(単純/ネスト/早期継続・脱出)。 - - LLVM/Cranelift EXE に綺麗に降りる(br/phi ベースで問題なし)。 - -代表コマンド(例) -- ビルド: `cargo build --release` -- LLVM smoke: `LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) NYASH_LLVM_BITOPS_SMOKE=1 ./tools/llvm_smoke.sh release` -- VInvoke 調査: `NYASH_LLVM_VINVOKE_TRACE=1 NYASH_LLVM_VINVOKE_SMOKE=1 ./tools/llvm_smoke.sh release` +- CorePlan 移行道筋 SSOT: `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` +- 旧ログ(肥大化防止のためアーカイブ): `docs/development/current/main/phases/phase-29ao/10-Now-archive.md` diff --git a/docs/development/current/main/30-Backlog.md b/docs/development/current/main/30-Backlog.md index 1209ba7a..83535dd4 100644 --- a/docs/development/current/main/30-Backlog.md +++ b/docs/development/current/main/30-Backlog.md @@ -1,442 +1,18 @@ # Self Current Task — Backlog (main) Status: Active -Scope: 「次にやる候補」を短く列挙するメモ。現状は `docs/development/current/main/10-Now.md` を入口にする。 -Related: -- `docs/development/current/main/10-Now.md` -- `docs/development/current/main/DOCS_LAYOUT.md` +Scope: 「次にやる候補」を短く列挙するメモ。入口は `docs/development/current/main/10-Now.md`。 -## 直近(JoinIR/selfhost) +## Active -- **Phase 29an(✅ COMPLETE): Skeleton/Feature Facts(SSOT)** - - 入口: `docs/development/current/main/phases/phase-29an/README.md` - - 状況: P0–P14 ✅ 完了 / P15 closeout ✅ - - Gate: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` +- CorePlan migration: `docs/development/current/main/phases/phase-29ao/README.md`(Next: P32) -- **Phase 29ao(active): CorePlan composition from Skeleton/Feature** - - 入口: `docs/development/current/main/phases/phase-29ao/README.md` - - 状況: P0–P31 ✅ 完了 / Next: P32(Pattern2 real-world strict/dev shadow adopt) - - Next 指示書: `docs/development/current/main/phases/phase-29ao/P32-STRICT-ADOPT-PATTERN2-REALWORLD-FROM-FACTS-INSTRUCTIONS.md` +## Near-Term Candidates -- **Phase 29af(✅ COMPLETE): Boundary hygiene / regression entrypoint / carrier layout SSOT** - - 入口: `docs/development/current/main/phases/phase-29af/README.md` +- JoinIR regression gate SSOT: `docs/development/current/main/phases/phase-29ae/README.md` +- CorePlan hardening (docs-first): `docs/development/current/main/phases/phase-29al/README.md` +- CorePlan lowerer/verifier: `docs/development/current/main/phases/phase-29am/README.md` -- **Phase 29ag(✅ COMPLETE): JoinIR merge SSOT unification** - - 入口: `docs/development/current/main/phases/phase-29ag/README.md` +## Archive -- **Phase 29ah(✅ COMPLETE): JoinIR regression pack expansion(real-world coverage)** - - 入口: `docs/development/current/main/phases/phase-29ah/README.md` - -- **Phase 29aj(candidate): PlannerOutcome observability SSOT** - - 入口: `docs/development/current/main/phases/phase-29aj/README.md` - - 状況: P0/P1/P2/P3/P4/P5/P6/P7/P8/P9/P10 ✅ 完了 - - Next: Phase 29aj P11(TBD) - - 運用: integration filter で phase143_* は回さない(JoinIR 回帰は phase29ae pack のみ) - - 運用: phase286_pattern9_* は legacy pack (SKIP) を使う - -- **Phase 29ak(candidate): PlanRuleOrder SSOT + PlannerContext plumbing** - - 入口: `docs/development/current/main/phases/phase-29ak/README.md` - - 状況: P0/P1/P2/P3/P4/P5 ✅ 完了 - - Next: None(phase-29al へ) - -- **Phase 29al(candidate): CorePlan composition hardening (docs-first)** - - 入口: `docs/development/current/main/phases/phase-29al/README.md` - - 状況: P0/P1/P2/P3 ✅ 完了(docs-only) - - Next: P4(unwind を含む ExitKind 拡張: design only) - - 道筋 SSOT: `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` - -- **Phase 29am(✅ COMPLETE): CorePlan Step-A implementation (lowerer/verifier)** - - 入口: `docs/development/current/main/phases/phase-29am/README.md` - - 状況: P0/P1/P2/P3 ✅ 完了 - - Next: Phase 29an - - Gate: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` - -- **Phase 29ai(candidate): Plan/Frag single-planner(Facts SSOT)** - - 入口: `docs/development/current/main/phases/phase-29ai/README.md` - - Next: Phase 29ai P16(TBD: promotion hint を JoinIR 側の orchestrator へ配線、挙動不変) - -- **Phase 29ae P1(✅ COMPLETE): JoinIR Regression Pack (SSOT固定)** - - 入口: `docs/development/current/main/phases/phase-29ae/README.md` - -- **Phase 29ad(✅ COMPLETE): Naming SSOT for Pattern6/7 fixtures** - - 入口: `docs/development/current/main/phases/phase-29ad/README.md` - -- **Phase 29ac(✅ COMPLETE): De-freeze Pattern6/7** - - 入口: `docs/development/current/main/phases/phase-29ac/README.md` - -- **Phase 29ab(✅ COMPLETE): JoinIR completion triage** - - 入口: `docs/development/current/main/phases/phase-29ab/README.md` - -- **Phase 288(✅ P0–P3 + 288.1 complete): REPL mode** - - 入口: `docs/development/current/main/phases/phase-288/README.md` - - SSOT: `docs/reference/language/repl.md` - - 次: Phase 288.2+(任意): REPL UX improvements(history / multiline / load 等) - -- **Phase 287(✅ COMPLETE): Developer Hygiene(意味論不変)** - - 状況: P0–P9 ✅ 完了(big files / facade / SSOT / docs guard / closeout) - - 成果: merge/mod.rs (1,555→1,053行), ast_feature_extractor (1,148→135行), plan.rs (741→120行) - - 入口: `docs/development/current/main/phases/phase-287/README.md` - -- **Phase 284(✅ COMPLETE): Return as ExitKind SSOT(patternに散らさない)** - - 目的: `return` を “pattern最適化の個別実装” にせず、`ExitKind` と `compose::*` / `emit_frag()` に収束させる - - ねらい: 移行期間中の「二重ルール」「検出の穴」を減らし、将来の pattern 増殖を防ぐ - - 入口: `docs/development/current/main/phases/phase-284/README.md` - - P0(docs-only): `docs/development/current/main/phases/phase-284/P0-INSTRUCTIONS.md` - - SSOT: - - Composition: `src/mir/builder/control_flow/edgecfg/api/compose/mod.rs` - - Terminator emission: `emit_frag()`(`src/mir/builder/control_flow/edgecfg/api/emit.rs`) - - Frag docs: `docs/development/current/main/design/edgecfg-fragments.md` - - 進め方: - - P0(docs-only)で “return の意味” と “Ok(None)/Err” の境界を固定 - - P1+ で Rust/LLVM の実装を SSOT に収束(pattern側に例外実装を増やさない) - -- **Phase 285(✅ COMPLETE): Box lifecycle / weakref / finalization / GC SSOT** - - 目的: Box の生存期間(強参照/弱参照/解放/最終化)を SSOT として固定し、「実装が仕様」になっている箇所を潰す - - ねらい: - - VM 側の weakref/finalization を仕様化(テストで固定) - - LLVM harness 側の未対応/差分を “仕様として明文化” し、将来の実装計画を切る - - 入口: `docs/development/current/main/phases/phase-285/README.md` - - 状況(完了): - - P0/P1/P2 ✅ 完了(weak 成功パターンは smoke 固定) - - P2.1 ✅ 完了: hidden root を根治し、weak-fail smoke を PASS に復帰 - - P2.2 ✅ 完了: KeepAlive の二重責務を命令分離で解消(`KeepAlive`/`ReleaseStrong`) - - P3.1/P3.2 ✅ 完了: LLVM 検出 + quick SSOT(`--features llvm` でも quick の意味が変わらない) - - P4 ✅ 完了: `phase285_weak_basic_llvm` を PASS に復帰(quick 154/154) - - 参考(現状の入口候補): - - weakref 表現: `src/value.rs`(`NyashValue::WeakBox`) - - finalization: `src/finalization.rs` - - 追加(syntax cleanup, small & focused): - - `weak` の表面構文を `weak ` に収束(`weak()` を持ち込まない) - - `let weak w;` / `let weak w = e` の糖衣を検討(概念を増やさず `let w = weak e` にデシュガー) - - fixture/smoke は `apps/tests/*.hako` を SSOT にして VM/LLVM で共通化(必要なら LLVM 側は SKIP で理由を固定) - -- **Phase 29y(✅ P0 COMPLETE, docs-first SSOT finalized): MIR lifecycle vocab freeze(RC/weak/ABI)** - - 状況: P0 ✅ 完了(docs-first SSOT finalized: ABI/RC insertion/Observability) - - 成果: 3つのSSOT文書(10/20/30)Ready、pilot実装固定、Next steps明文化 - - 入口: `docs/development/current/main/phases/phase-29y/README.md` - - 次: Phase 29z(RC insertion minimal)または Phase 29x(De-Rust runtime)候補 - -- **Phase 29z(P2 CLOSEOUT準備中, implementation-minimal): RC insertion minimal** - - 進捗: P1まで完了(上書き+Store null+Return終端cleanup で ReleaseStrong 挿入、単一block・安全ガード付き) - - ガード: Cargo feature `rc-insertion-minimal`(既定OFF、env var 新設なし) - - 検証: quick 154/154 PASS 維持 + `rc_insertion_selfcheck`(opt-in) - - 残課題(P2で方針化→次フェーズへ) - - null伝搬の精度向上(copy以外の伝搬パターン追加を段階的に) - - Branch/Jump 終端での cleanup をどう安全に扱うかの設計 - - PHI/loop/early-exit の安全な cleanup 設計(誤release防止) - - 入口: `docs/development/current/main/phases/phase-29z/README.md` - - 指示書: `docs/development/current/main/phases/phase-29z/P0-RC_INSERTION_MINIMAL-INSTRUCTIONS.md` - -- **Phase 29aa(✅ COMPLETE): RC insertion safety expansion(CFG-aware)** - - 進捗: P2 ✅ 完了(Jump/Branch 終端で cleanup を入れない契約の SSOT 化) - - 進捗: P3 ✅ 完了(Jump→Return single-predecessor state 伝播) - - 進捗: P4 ✅ 完了(Jump-chain propagation to Return) - - 進捗: P5 ✅ 完了(Multi-predecessor Return join: state完全一致のみ) - - 進捗: P6 ✅ 完了(Multi-predecessor Return join: intersection) - - 進捗: P7 ✅ 完了(Deterministic ReleaseStrong ordering) - - 進捗: P8 ✅ 完了(Null propagation across CFG; Copy-only) - - 入口: `docs/development/current/main/phases/phase-29aa/README.md` - -- **Phase 29x(planned, post self-host): De-Rust runtime for LLVM execution** - - 目的: LLVM 実行経路のランタイム依存を段階的に Rust から切り離す(脱Rust)。 - - 前提: self-host ラインが安定し、VM/LLVM conformance(Phase 285)が十分に固まっていること。 - - 方針: - - 仕様SSOT(strong/weak/fini/cleanup/void)は維持し、実装だけを差し替え可能にする。 - - まず ABI 境界(例: `nyrt_*`)を “将来置換する契約” として固定し、独立ランタイムに差し替える。 - - 受け入れ条件(最小): - - 既存の `apps/tests/*.hako` fixture を再利用し、VM/LLVM parity のスモークが維持される。 - - weak の語彙(`weak ` / `weak_to_strong()`)が同じ意味で動作する(cycleは当面リーク仕様でも可)。 - -- **Phase 29y(planned, post self-host / docs-first): MIR lifecycle vocab freeze(RC/weak/ABI)** - - 目的: 参照カウント(strong/weak)を “どこで” 実装するか(MIR語彙 vs runtime ABI)を設計SSOT化し、脱Rust実装の土台にする - - 前提: self-host 後/Phase 285(weak conformance + hidden root 根治)が落ち着いていること - - 入口(phase): `docs/development/current/main/phases/phase-29y/README.md` - - 入口(相談パケット): `docs/development/current/main/investigations/phase-29y-mir-lifecycle-vocab-consult.md` - - 進捗(pilot, 仕様不変): - - docs SSOT(ABI/RC insertion/observability)を phase-29y 配下に集約 - - Phase 29y.1: “最小導線” の実装だけ先行(意味論は変更しない) - - NyRT handle ABI shim(`crates/nyash_kernel/src/ffi/lifecycle.rs`) - - RC insertion pass 入口(no-op) - - leak report に root categories(handlesのみ)を追加(Phase 1 limitation 明記) - -- **Phase 286(✅ complete): JoinIR Line Absorption(JoinIR→CorePlan/Frag 収束)** - - 目的: 移行期間に残っている「2本の lowering(Plan line / JoinIR line)」を、構造で 1 本に収束させる - - ねらい: `return/break/continue` のような “大きな出口語彙” の実装場所が揺れない状態にする - - 入口: `docs/development/current/main/phases/phase-286/README.md` - - P0(docs-only): `docs/development/current/main/phases/phase-286/P0-INSTRUCTIONS.md` - - 状況: Pattern1–9 の主要ループ形が Plan/Frag SSOT に吸収され、quick gate は green を維持。 - - 将来の設計相談(Phase 286 の範囲外で、別フェーズでSSOT化してから): `docs/development/current/main/investigations/phase-286-plan-normalization-consult.md` - - SSOT: - - Plan/Frag: `compose::*` + `emit_frag()`(Phase 280/281) - - JoinIR line 共通入口: `src/mir/builder/control_flow/joinir/patterns/conversion_pipeline.rs` - -- (✅ done)**Phase 282**: Router shrinkage + detection SSOT + extractor refactor - - 完了: `docs/development/current/main/phases/phase-282/README.md` - -(✅ done)**Phase 279 P0**: Type propagation pipeline SSOT 統一(lifecycle / JoinIR / LLVM の二重化解消) - - 完了: `docs/development/current/main/phases/phase-279/README.md` - -- **Phase 272(✅ complete): Pattern6/7 を Frag+emit_frag へ吸収(段階適用)** - - 目的: scan系 loop の CFG 構築を `Frag/ExitKind` 合成へ寄せ、pattern列挙の増殖を止める - - 完了: P0.1(Pattern6)✅ + P0.2(Pattern7)✅ - - 入口: fixture/smoke を SSOT として固定(Pattern6→Pattern7 の順で段階適用) - - 詳細: `phases/phase-272/README.md` - -- (✅ done)**Phase 273**: Plan line SSOT(Pattern6/7) - - 完了: `docs/development/current/main/phases/phase-273/README.md` - -- (✅ done)**Phase 280**: Frag composition SSOT positioning - - 完了: `docs/development/current/main/phases/phase-280/README.md` - -- (✅ done)**Phase 281**: compose adoption(Pattern6/7, P0–P3) - - 完了: `docs/development/current/main/phases/phase-281/README.md` - -- (✅ done)**Phase 277/278**: PHI strict + env var 収束 - - 完了: `docs/development/current/main/phases/phase-277/README.md` - - 完了: `docs/development/current/main/phases/phase-278/README.md` - - -- **Phase 274(active, design-first): Type SSOT Alignment(local + dynamic runtime)** - - 入口SSOT: `docs/reference/language/types.md` - - P1(✅完了): Rust VM が `TypeOp(Check/Cast)` を実行可能(`is/as` が動く) - - P2(✅完了): LLVM ライン(llvmlite harness)の `TypeOp` を SSOT に合わせる - - P3(decision): truthiness / equality / compare / `+` の coercion を SSOT として固定(必要なら “仕様変更フェーズ” を追加) - - 詳細: `phases/phase-274/README.md` - -- **Phase 270(✅ 完了): JoinIR-only minimal loop SSOT** - - `apps/tests/phase270_p0_loop_min_const.hako` + VM smoke で “最小 const loop” を固定(exit=3) - - Pattern1 は test-only stub のため不適合 → Pattern9(AccumConstLoop)を橋渡しとして追加 - - 詳細: `phases/phase-270/README.md` - -- **Phase 271(✅ 完了, docs-only): Bridge pattern 撤去条件SSOT** - - 対象: bridge pattern(例: `Pattern9_AccumConstLoop`) - - 目的: 「汎用化しない」「Frag 合成へ吸収して削除する」を SSOT 化 - - 成果物: - - `docs/development/current/main/design/edgecfg-fragments.md` の `Bridge patterns(撤去条件SSOT)` に “bridge contract” テンプレを追加 - - `Pattern9_AccumConstLoop` の撤去条件(fixture/smoke/手順)を同セクションに明文化 - - SSOT: `docs/development/current/main/design/edgecfg-fragments.md` - -- **Phase 269 P1(✅ 完了): Pattern8 を EdgeCFG で実装(SSA を閉じる)** - - 方針: emission 入口で Frag 構築(break/continue 無しなので `compose::loop_()` は使わず手配線) - - 完了: header に `i` の PHI を追加して SSA を閉じた(`i_current = phi [i_init, preheader], [i_next, step]`) - - early-exit の `return false` は Return wire、`return true` は loop 後 AST に任せる - - Pattern8 の返り値は当面 `void`(loop-statement 扱い) - - 補足(DONE): static box の `this/me` は MethodCall 共通入口で static call に正規化済み(Pattern8 は現状 static box 文脈を対象外) - - 詳細: `phases/phase-269/README.md` - -- **Phase 270+(planned): Pattern6/7 への Frag 適用** - - Pattern6: Match scan(index_of 系) - - Pattern7: Split scan(split 系) - - 統一的なループ処理パターン確立 - - Pattern 分岐削減 - -- **収束方針(SSOT案): Expr/Condition/Control の 3 箱分割** - - ExprLowererBox(式SSOT): `AST(expr)` → `(prelude, value)`(ANF含む)。pure/impure/whitelist/strict を集約(入口SSOT)。 - - ConditionLowererBox(条件→分岐SSOT): `AST(cond)` → `BranchPlan`。評価順は ExprLowererBox に委譲し、`&&/||` は制御語彙で扱う。 - - ControlLowererBox(制御SSOT): `StepNode/ControlTree` → JoinIR(継続 + env)。`if/loop` を担当し、条件は ConditionLowererBox に委譲。 - -- **Phase 141 P2+(planned): Call/MethodCall(effects + typing を分離して段階投入)** - - ねらい: pure/impure 境界を壊さずに、impure lowering を段階投入する。 - - 前提(DONE): - - Phase 141 P1.5: known intrinsic allowlist + available_inputs 3-source merge + diagnostics - - 受け入れ条件: - - out-of-scope は `Ok(None)` でフォールバック(既定挙動不変) - - effects の順序付けは SSOT で固定してから解禁(by-name 増殖禁止) - -- **Phase 144-anf(planned): impure 式導入の順序固定(ANF)** - - ねらい: `x + f(y)` 等の “pure + impure 混在” で評価順が仕様になる前に、ANF で順序固定を SSOT 化する - - 入口: `docs/development/current/main/phases/phase-144-anf/INSTRUCTIONS.md` - - 受け入れ条件: - - impure を lowering できない場合は `Ok(None)` でフォールバック(既定挙動不変) - - dev/strict では「順序固定の欠落」を Fail-Fast(診断に順序ログを含める) - -- **Phase 143-loopvocab R0(planned): Contract SSOT 抽出(refactor P0 → modular components)** - - 目的: loop_true_if_break_continue.rs を「検出/契約/変換」に分割し、P1/P2 での if分岐増殖を防ぐ - - 実装: - - 新ファイル: `src/mir/control_tree/normalized_shadow/common/loop_if_exit_contract.rs` - - `enum LoopIfExitThen { Break, Continue }` - - `struct LoopIfExitShape { has_else: bool, then: LoopIfExitThen, else_: Option, cond_scope: ExprLoweringScope }` - - `enum OutOfScopeReason { NotLoopTrue, BodyNotSingleIf, ThenNotExit, ElseNotSupported, CondOutOfScope(...) }` - - Refactor: loop_true_if_break_continue.rs は「shape抽出 → lower」だけに縮退(SSOT は contract側) - - Tests: unit test を dedicated module へ分離(test maintainability) - - 受け入れ条件: - - cargo check ✅(no errors) - - P1/P2 での if分岐を防ぐ(contract で決定性を保証) - - out-of-scope は `Ok(None)` で一貫(既定挙動不変) - -- **Phase 143-loopvocab P1(planned): continue 語彙追加** - - 対象: `loop(true) { if(cond_pure) continue }` を same lowering に通す - - 実装: - - LoopIfExitShape で `LoopIfExitThen::Continue` を許可 - - JoinModule: if true → loop_step (continue semantics) - - Fixtures: `phase143_loop_true_if_continue_min.hako` - - Smoke: VM + LLVM EXE - - Out-of-scope は `Ok(None)` のまま - -(DONE)Phase 143-loopvocab P2: else 対称化(B-C / C-B) - - 記録: `docs/development/current/main/10-Now.md` - -- **Phase 143-loopvocab P3+(planned): impure conditions 対応** - - 目的: `if(cond_impure) break/continue` を ANF/順序固定の上で段階投入する - - 方針: Phase 145-anf の契約(hoist + left-to-right)を条件式にも適用 - -- **Phase 263+(planned): Pattern2 LoopBodyLocal promotion(seg)** - - 目的: Stage‑B compile(bundle_resolver系)で露出している Pattern2 `LoopBodyLocal(seg)` を受理し、quick の first FAIL を進める - - 受け入れ条件: - - 最小再現 fixture + smoke で固定(先に失敗を SSOT 化) - - Pattern2 が不成立のときは “部分続行” せず `Ok(None)` で fallback(既定挙動不変) - -- **(DONE)Phase 263 P0.2: Pattern2 PromoteDecision API hardening** - - 入口SSOT: `src/mir/builder/control_flow/joinir/patterns/pattern2/api/` - - `PromoteDecision::{Promoted, NotApplicable, Freeze}` と `try_promote(...)` に参照点を収束(Option揺れを撤去) - -- **Phase 264(✅ 入口作成完了): EdgeCFG Fragment 入口作成(design-first)** - - **ステータス**: ✅ 入口作成完了(適用は次フェーズ) - - **実装内容**: - - `edgecfg/api/` フォルダに SSOT 入口作成 - - `ExitKind`, `EdgeStub`, `Frag` の型定義 - - `seq`, `if_`, `loop_`, `cleanup` のシグネチャ固定(pub(crate)) - - 最小ユニットテスト 3個 - - ドキュメント連動(edgecfg-fragments.md) - - **制約遵守**: - - 既存 pattern6/7/8 未改変 - - merge/EdgeCFG 未改変 - - cargo test -p nyash-rust --lib --no-run 成功確認 - - **次フェーズへの橋渡し**: - - Phase 265 で Pattern8 適用時に `compose::loop_` を実装 - - 再利用確認後、pattern番号分岐を段階的に削減 - -- **Phase 265 P0(✅ 完了): compose/verify 最小実装** - - **目的**: 入口SSOTの形を固める(迷子防止) - - **実装**: - - compose::loop_() 最小実装(exit集合分類のみ、配線なし) - - verify_frag_invariants() 最小実装(デバッグガード付き) - - compose::loop_() ユニットテスト 2個追加 - - **制約**: - - Pattern8 未改変(P0では触らない、偽Frag回避) - - 配線ロジックは P1 以降 - - **次**: Phase 265 P1 で配線ロジック + Pattern8適用 - -- **Phase 265 P1(✅ 完了): compose 配線ロジック実装** - - **目的**: Frag/ExitKind の配線能力を BasicBlockId 層で証明 - - **実装**: - - EdgeStub.target 追加(Option) - - compose::loop_() 配線ロジック(Continue → header, Break → after) - - verify_frag_invariants() 配線契約検証 - - test-only PoC(5個のテスト: 既存2個更新 + 新規3個追加) - - **配線契約**: - - Continue(loop_id) の EdgeStub.target = Some(header) - - Break(loop_id) の EdgeStub.target = Some(after) - - Normal/Return/Unwind の EdgeStub.target = None(上位へ伝搬) - - **制約**: - - MIR 命令生成なし(Frag 層のみ) - - NormalizedShadow 未適用(Phase 267 に繰り越し) - -- **(✅ 完了)Phase 265 P2: seq/if_ 実装(wires/exits 分離)** - - **目的**: 「解決済み配線(wires)」と「未解決 exit(exits)」を分離し、Frag 合成の基本パターンを完成 - - **完了内容**: - - Frag に `wires: Vec` 追加 - - wires/exits 分離設計確立(exits = target None, wires = target Some) - - loop_() を wires 対応に更新 - - seq(a, b) 実装(a.Normal → wires) - - if_(header, cond, t, e, join_frag) 実装(t/e.Normal → wires) - - verify 強化(wires/exits 分離契約、警告のみ) - - 全テスト PASS(13個: frag 3 + compose 9 + verify 1) - - **設計判断**: - - wires/exits 分離で再配線バグ防止 - - if_ は join_frag: Frag で「join 以降」を明確化 - - verify は警告のみ(Err 化は Phase 266 の strict 版で段階導入) - - **次**: Phase 266 で MIR 命令生成 PoC(emit_wires)、Phase 267 で NormalizedShadow/JoinIR へ実適用 - -- **(✅ 完了)Phase 266: wires → MIR terminator 生成(最小 PoC)** - - **目的**: wires を MIR terminator に変換する最小 PoC を実装し、Phase 267 での本格適用に備える - - **完了内容**: - - emit.rs 作成(emit_wires 実装 + unit test 4個) - - verify_frag_invariants_strict() 追加(段階導入を壊さない) - - Jump/Return 対応(Branch は Phase 267) - - mod.rs 更新(emit module エクスポート) - - 全テスト PASS(1392 passed: 既存 1388 + 新規 4個) - - **核心原則**: - - from ごとにグループ化して1本だけ許可(1 block = 1 terminator 制約) - - Return は target=None を許可(意味を持たない) - - verify_frag_invariants() は変更なし(警告のまま、strict 版を別名で用意) - - Phase 260 terminator 語彙ルールを厳守 - - **設計判断**: - - from グループ化で terminator 上書きバグ防止 - - Return は target 不要(呼び出し元に戻る) - - verify strict 版で段階導入を壊さない - - **次**: Phase 267 で JoinIR Pattern への適用 - -- **(✅ P0 完了)Phase 267: BranchStub + emit_frag(Branch の第一級化)** - - **目的**: Frag に Branch を第一級で追加し、wires(Jump/Return)と同様に MIR terminator へ落とす入口を作る - - **完了内容(P0)**: - - `BranchStub` 追加 + `Frag.branches` 追加 - - `compose::if_` が header→then/else の BranchStub を生成 - - `emit_frag(function, frag)` を追加(`emit_wires` + `set_branch_with_edge_args`) - - 1 block = 1 terminator(wire/branch の衝突)を Fail-Fast - - unit tests + `cargo test -p nyash-rust --lib` PASS - - **P1(延期)**: - - "層を跨がない実適用"は候補が抽象化層へ委譲済みのため、Phase 268 で体系的に適用する方針 - - **詳細**: `docs/development/current/main/phases/phase-267/README.md` - -- **(✅ 完了)Phase 268: if_form.rs への Frag 適用 + entry edge-args SSOT化** - - **目的**: EdgeCFG Fragment を層を跨がずに実戦投入し、compose::if_() の edge-args を SSOT 化 - - **完了内容(P0)**: - - emission/branch.rs に emit_conditional_edgecfg() 追加(薄いラッパー) - - if_form.rs を Frag+emit_frag 経由に変更(emit_conditional + emit_jump を削除) - - emission 層経由で層が綺麗に保たれる - - **完了内容(P1)**: - - compose::if_() シグネチャ変更(then_entry_args, else_entry_args 追加) - - emission/branch.rs から空 EdgeArgs を渡す - - EdgeCFG テスト更新(compose.rs 2箇所、emit.rs 1箇所) - - TODO コメント削除完了(Phase 267 P2+ TODO 解消) - - **テスト結果**: - - cargo build --release: 成功 - - cargo test --lib --release: 1444/1444 PASS - - quick smoke: 45/46 PASS(既存状態維持) - - **核心原則**: - - emission 層経由で Frag 構築を MirBuilder 層から分離 - - SSOT 原則: compose::if_() は edge-args を内部生成しない - - **次**: Phase 269 で Pattern6/7/8 への Frag 適用 + fixture/smoke test - - **詳細**: `docs/development/current/main/phases/phase-268/README.md` - -- **real-app loop regression の横展開(VM + LLVM EXE)** - - ねらい: 実コード由来ループを 1 本ずつ最小抽出して fixture/smoke で固定する(段階投入)。 - - 現状: Phase 107(find_balanced_array/object / json_cur 由来)まで固定済み。 - - 次候補: JsonLoader/JsonCur から 1 本ずつ(fixture + integration smoke)で増やす。 - -- **P5b “完全E2E”**(escape skip の実ループを end-to-end で固定) - - 現状: Phase 94 で VM E2E まで固定済み。次は selfhost 実コード(`apps/selfhost-vm/json_loader.hako`)へ横展開して回帰を減らす。 - - 入口: `docs/development/current/main/phases/phase-94/README.md` - -- **制御の再帰合成(docs-only → dev-only段階投入)** - - ねらい: `loop/if` ネストの "構造" を SSOT(ControlTree/StepTree)で表せるようにする - - 注意: canonicalizer は観測/構造SSOTまで(ValueId/PHI配線は Normalized 側へ) - - 現状: Phase 119–128(if-only Normalized: reads/inputs/unknown-read/partial-assign keep/merge)まで完了 - - ✅ 完了: Phase 129-C(post-if を post_k continuation で表現) - - 入口: `docs/development/current/main/design/control-tree.md` - -## 中期(ループ在庫の残り) - -- **P5(guard-bounded)**: 大型ループを “小粒度” に割ってから取り込む(分割 or 新契約) -- **P6(nested loops)**: capability guard で Fail-Fast 維持しつつ、解禁時の契約を先に固定 - -## 中期(制御の表現力) - -北極星: `docs/development/current/main/design/join-explicit-cfg-construction.md` -設計メモ: `docs/development/current/main/design/exception-cleanup-async.md` - -- **catch/cleanup(Invoke)** - - 追加語彙を `Invoke(ok_edge, err_edge)` に絞って例外 edge を明示する(例外値は edge-args で運ぶ)。 - - 実装タイミング: Phase 260(edge-args terminator 収束)の P1〜P2 以降が推奨。 -- **cleanup/defer(cleanup normalizer)** - - Return/Throw/Break/Continue を cleanup に寄せる “脱出 edge 正規化” を箱化する(finally の後継としての cleanup)。 - - 実装タイミング: catch/cleanup の次(例外 edge も含めて正規化するため)。 -- **async/await(state machine lowering)** - - CFG語彙に混ぜず、AsyncLowerBox で state machine 化してから MIR に落とす。 - - 実装タイミング: finally/defer の後(cancel/drop と cleanup の接続を先に固める)。 - -## ドキュメント運用 - -- 重複が出たら「設計 SSOT(design)」に集約し、Phaseログ(phases)は “何をやったか/検証したか” に限定する -- 調査ログ(investigations)は結論を SSOT に反映してから Historical 化する +- 旧 backlog(肥大化防止のためアーカイブ): `docs/development/current/main/phases/phase-29ao/30-Backlog-archive.md` diff --git a/docs/development/current/main/phases/phase-29ao/10-Now-archive.md b/docs/development/current/main/phases/phase-29ao/10-Now-archive.md new file mode 100644 index 00000000..5f231f42 --- /dev/null +++ b/docs/development/current/main/phases/phase-29ao/10-Now-archive.md @@ -0,0 +1,2233 @@ +# Self Current Task — Now (archive) + +## Current Focus: Phase 29ao(CorePlan composition) + +Next: Phase 29ao P32(Pattern2 real-world strict/dev shadow adopt) +指示書: `docs/development/current/main/phases/phase-29ao/P32-STRICT-ADOPT-PATTERN2-REALWORLD-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` + +**2025-12-30: Phase 29ao P31 完了** ✅ +- 目的: shadow adopt の判定/Fail-Fast/タグを composer 側に集約し、router を薄くする(仕様不変) +- 変更: `src/mir/builder/control_flow/plan/composer/shadow_adopt.rs` / `src/mir/builder/control_flow/plan/composer/mod.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` / `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` + +**2025-12-30: Phase 29ao P30 完了** ✅ +- 目的: Facts→CorePlan の入口を `plan/composer` に集約し、Normalizer の責務を DomainPlan→CorePlan に縮退(挙動不変) +- 変更: `src/mir/builder/control_flow/plan/composer/shadow_adopt.rs` / `src/mir/builder/control_flow/plan/composer/mod.rs` / `src/mir/builder/control_flow/joinir/patterns/router.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern2_break.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern5_infinite_early_exit.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern_scan_with_init.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern_split_scan.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` / `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` + +**2025-12-30: Phase 29ao P29 完了** ✅ +- 目的: regression gate 全パターンで shadow adopt タグを必須化し、strict/dev 実踏みを SSOT 化(仕様不変) +- 変更: `src/mir/builder/control_flow/joinir/patterns/router.rs` / `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern1_strict_shadow_vm.sh` / `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern5_strict_shadow_vm.sh` / `tools/smokes/v2/profiles/integration/apps/phase29ai_pattern2_break_plan_subset_ok_min_vm.sh` / `tools/smokes/v2/profiles/integration/apps/phase118_pattern3_if_sum_vm.sh` / `tools/smokes/v2/lib/test_runner.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `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` / `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` + +**2025-12-30: Phase 29ao P28 完了** ✅ +- 目的: strict/dev shadow adopt の実踏みを安定タグと回帰スモークで検証可能にする(仕様不変) +- 変更: `src/mir/builder/control_flow/joinir/patterns/router.rs` / `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern6_strict_shadow_vm.sh` / `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern7_strict_shadow_vm.sh` / `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `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` / `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` + +**2025-12-30: Phase 29ao P27 完了** ✅ +- 目的: Pattern6(ScanWithInit) の subset を strict/dev で Facts→CorePlan に寄せ、planner subset のズレを早期検知 +- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern_scan_with_init.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` / `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` + +**2025-12-30: Phase 29ao P26 完了** ✅ +- 目的: Pattern2(Break) の subset を strict/dev で Facts→CorePlan に寄せ、planner subset のズレを早期検知 +- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern2_break.rs` / `src/mir/builder/control_flow/joinir/patterns/router.rs` / `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `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` / `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` + +**2025-12-30: Phase 29ao P25 完了** ✅ +- 目的: Pattern5 を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を早期検知 +- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern5_infinite_early_exit.rs` / `src/mir/builder/control_flow/joinir/patterns/router.rs` / `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern5_strict_shadow_vm.sh` / `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `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` / `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` + +**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` +- 検証: `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 P22 完了** ✅ +- 目的: Pattern1 の CoreLoop 構築を SSOT 化し、DomainPlan/Facts 経路の二重実装を排除 +- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern1_coreloop_builder.rs` / `src/mir/builder/control_flow/plan/normalizer/pattern1_simple_while.rs` / `src/mir/builder/control_flow/plan/normalizer/skeleton_loop.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 P21 完了** ✅ +- 目的: Pattern1 subset を body=step のみに引き締め、strict/dev shadow adopt の誤マッチを遮断 +- 変更: `src/mir/builder/control_flow/plan/policies/pattern1_subset_policy.rs` / `src/mir/builder/control_flow/plan/facts/pattern1_simplewhile_facts.rs` / `src/mir/builder/control_flow/plan/extractors/pattern1.rs` / `apps/tests/phase29ao_pattern1_subset_reject_extra_stmt.hako` / `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern1_subset_reject_extra_stmt_vm.sh` / `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `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 P20 完了** ✅ +- 目的: CoreLoop の ExitMap/Cleanup/ValueJoin 合成規約を SSOT 化(docs-only) +- 変更: `docs/development/current/main/design/coreloop-exitmap-composition-ssot.md` / `docs/development/current/main/design/planfrag-ssot-registry.md` / `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` + +**2025-12-30: Phase 29ao P19 完了** ✅ +- 目的: regression gate に Pattern1 strict/dev shadow adopt を含め、回帰で必ず踏む(SSOT化) +- 変更: `tools/smokes/v2/profiles/integration/joinir/phase29ao_pattern1_strict_shadow_vm.sh` / `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` +- 検証: `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` + +**2025-12-30: Phase 29ao P0 完了** ✅ +- 目的: `CanonicalLoopFacts → CorePlan` 合成の入口(未接続)を 1 箇所に作る +- 変更: `src/mir/builder/control_flow/plan/composer/mod.rs` / `src/mir/builder/control_flow/plan/mod.rs` / `docs/development/current/main/phases/phase-29ao/README.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 P1 完了** ✅ +- 目的: composer bridge で `CanonicalLoopFacts` から `DomainPlan` を組み立てる入口を追加(未接続) +- 変更: `src/mir/builder/control_flow/plan/composer/mod.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 P2 完了** ✅ +- 目的: `CanonicalLoopFacts → DomainPlan → PlanNormalizer → CorePlan` の bridge を未接続で固定 +- 変更: `src/mir/builder/control_flow/plan/composer/mod.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 P3 完了** ✅ +- 目的: `CanonicalLoopFacts` から `CorePlan::Loop`(skeleton)を direct 生成(Pattern1 subset のみ) +- 変更: `src/mir/builder/control_flow/plan/normalizer/skeleton_loop.rs` / `src/mir/builder/control_flow/plan/normalizer/mod.rs` / `src/mir/builder/control_flow/plan/composer/mod.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 P4 完了** ✅ +- 目的: `exit_kinds_present` を `Frag.exits` に投影(未配線のまま語彙のみ固定) +- 変更: `src/mir/builder/control_flow/plan/normalizer/skeleton_loop.rs` / `src/mir/builder/control_flow/plan/composer/mod.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 P5 完了** ✅ +- 目的: `cleanup_kinds_present` を ExitKind 語彙として `Frag.exits` に投影(未配線のまま語彙のみ固定) +- 変更: `src/mir/builder/control_flow/plan/normalizer/skeleton_loop.rs` / `src/mir/builder/control_flow/plan/composer/mod.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 P6 完了** ✅ +- 目的: `value_join_needed` が立つケースは direct skeleton を採用しない(安全ゲート) +- 変更: `src/mir/builder/control_flow/plan/normalizer/skeleton_loop.rs` / `src/mir/builder/control_flow/plan/composer/mod.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 P7 完了** ✅ +- 目的: `ExprResultPlusCarriers` の語彙固定と最小 verify を追加(未接続) +- 変更: `src/mir/builder/control_flow/plan/normalizer/value_join_args.rs` / `src/mir/builder/control_flow/plan/normalizer/mod.rs` / `src/mir/builder/control_flow/plan/verifier.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 P8 完了** ✅ +- 目的: compose::seq/if_/cleanup が EdgeArgs(layout+values) を保持することをテストで固定 +- 変更: `src/mir/builder/control_flow/edgecfg/api/compose/seq.rs` / `src/mir/builder/control_flow/edgecfg/api/compose/if_.rs` / `src/mir/builder/control_flow/edgecfg/api/compose/cleanup.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 test --release -p nyash-rust` / `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 P9 完了** ✅ +- 目的: EdgeCFG の block params 足場を追加し、strict/dev で join 受け口の整合を fail-fast で固定 +- 変更: `src/mir/builder/control_flow/edgecfg/api/block_params.rs` / `src/mir/builder/control_flow/edgecfg/api/frag.rs` / `src/mir/builder/control_flow/edgecfg/api/compose/seq.rs` / `src/mir/builder/control_flow/edgecfg/api/compose/if_.rs` / `src/mir/builder/control_flow/edgecfg/api/compose/cleanup.rs` / `src/mir/builder/control_flow/edgecfg/api/compose/loop_.rs` / `src/mir/builder/control_flow/edgecfg/api/verify.rs` / `src/mir/builder/control_flow/edgecfg/api/emit.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 test --release -p nyash-rust --lib` / `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 P10 完了** ✅ +- 目的: `Frag.block_params` を `emit_frag()` で PHI に落とす唯一の接続点を追加(未接続のまま) +- 変更: `src/mir/builder/control_flow/edgecfg/api/emit.rs` / `src/mir/builder/control_flow/edgecfg/api/verify.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 test --release -p nyash-rust --lib` / `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 P11 完了** ✅ +- 目的: Normalizer が `Frag.block_params` を生成する最小ケース(If2 demo)を追加し、PHI挿入まで unit test で固定 +- 変更: `src/mir/builder/control_flow/plan/normalizer/value_join_demo_if2.rs` / `src/mir/builder/control_flow/plan/normalizer/mod.rs` / `src/mir/builder/control_flow/edgecfg/api/emit.rs` / `src/mir/builder/control_flow/edgecfg/api/verify.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 test --release -p nyash-rust --lib` / `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 P12 完了** ✅ +- 目的: Pattern7 SplitScan の step join を `Frag.block_params + EdgeArgs` に移行 +- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern_split_scan.rs` / `src/mir/builder/control_flow/plan/normalizer/common.rs` +- 検証: `cargo test --release -p nyash-rust --lib` / `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 P13 完了** ✅ +- 目的: Pattern3 If‑Phi の merge join を `Frag.block_params + EdgeArgs` に移行(expr_result 的な join 値の実使用) +- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern3_if_phi.rs` / `docs/development/current/main/phases/phase-29ao/P13-VALUEJOIN-REAL-USAGE-PATTERN3-IFPHI-MERGE-INSTRUCTIONS.md` +- 検証: `cargo test --release -p nyash-rust --lib` / `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 P14 完了** ✅ +- 目的: Pattern2 Break の after join を `Frag.block_params + EdgeArgs` に移行 +- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern2_break.rs` / `docs/development/current/main/phases/phase-29ao/P14-VALUEJOIN-REAL-USAGE-PATTERN2-BREAK-EXITJOIN-INSTRUCTIONS.md` +- 検証: `cargo test --release -p nyash-rust --lib` / `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 P15 完了** ✅ +- 目的: JoinIR 回帰パック(phase29ae pack)に Pattern3(If‑Phi, VM) を追加して、P13 の実経路をゲートで固定 +- 変更: `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` / `docs/development/current/main/phases/phase-29ao/P15-REGRESSION-PACK-INCLUDE-PATTERN3-INSTRUCTIONS.md` +- 検証: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/run.sh --profile quick` + +**2025-12-30: Phase 29ao P16 完了** ✅ +- 目的: Pattern5 Infinite Early-Exit の after join を `Frag.block_params + EdgeArgs` に移行 +- 変更: `src/mir/builder/control_flow/plan/normalizer/pattern5_infinite_early_exit.rs` / `tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `docs/development/current/main/phases/phase-29ae/README.md` +- 検証: `cargo test --release -p nyash-rust --lib` / `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 P17 完了** ✅ +- 目的: strict/dev のみ Pattern1 を Facts→CorePlan(skeleton) で shadow adopt +- 変更: `src/mir/builder/control_flow/joinir/patterns/router.rs` / `docs/development/current/main/phases/phase-29ao/P17-COMPOSER-PATTERN1-STRICT-SHADOW-INSTRUCTIONS.md` +- 検証: `cargo test --release -p nyash-rust --lib` / `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 P18 完了** ✅ +- 目的: single_planner から planner outcome を受け取り、router の二重 planner 実行を撤去 +- 変更: `src/mir/builder/control_flow/plan/single_planner/rules.rs` / `src/mir/builder/control_flow/plan/single_planner/mod.rs` / `src/mir/builder/control_flow/joinir/patterns/router.rs` +- 検証: `cargo test --release -p nyash-rust --lib` / `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 29an P15 完了** ✅ +- 目的: P0–P14 の成果を closeout 形式でまとめ、次フェーズ(Phase 29ao)入口を固定 +- 変更: `docs/development/current/main/phases/phase-29an/README.md` / `docs/development/current/main/10-Now.md` / `docs/development/current/main/30-Backlog.md` / `CURRENT_TASK.md` + +**2025-12-29: Phase 29an P8 完了** ✅ +- 目的: exit_usage と DomainPlan(Pattern1/2/4/5)の整合を debug-only で固定(release は仕様不変) +- 変更: `src/mir/builder/control_flow/plan/planner/build.rs` +- 検証: `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 29an P9 完了** ✅ +- 目的: SkeletonFacts の一意化推論 API を追加し、0/1/2+ 境界をテストで固定(未接続・仕様不変) +- 変更: `src/mir/builder/control_flow/plan/facts/skeleton_facts.rs` +- 検証: `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 29an P10 完了** ✅ +- 目的: ExitMapFacts の語彙足場(型)を追加(未接続・仕様不変) +- 変更: `src/mir/builder/control_flow/plan/facts/feature_facts.rs` +- 検証: `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 29an P11 完了** ✅ +- 目的: ExitMapFacts を “存在集合” として最小で埋める(対応付け/CFGなし、仕様不変) +- 変更: `src/mir/builder/control_flow/plan/facts/feature_facts.rs` +- 検証: `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 29an P12 完了** ✅ +- 目的: CanonicalLoopFacts に exitmap presence(exit_kinds_present)を投影(挙動不変) +- 変更: `src/mir/builder/control_flow/plan/normalize/canonicalize.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` +- 検証: `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 29an P13 完了** ✅ +- 目的: CleanupFacts の語彙足場 + canonical projection を追加(未接続・仕様不変) +- 変更: `src/mir/builder/control_flow/plan/facts/feature_facts.rs` / `src/mir/builder/control_flow/plan/normalize/canonicalize.rs` +- 検証: `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 29an P14 完了** ✅ +- 目的: ValueJoinFacts の語彙足場 + canonical projection を追加(未接続・仕様不変) +- 変更: `src/mir/builder/control_flow/plan/facts/feature_facts.rs` / `src/mir/builder/control_flow/plan/normalize/canonicalize.rs` / `src/mir/builder/control_flow/plan/verifier.rs` +- 検証: `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 29an P7 完了** ✅ +- 目的: CanonicalLoopFacts に skeleton/exit_usage の projection を追加(挙動不変) +- 変更: `src/mir/builder/control_flow/plan/normalize/canonicalize.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` +- 検証: `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 29an P6 完了** ✅ +- 目的: planner入口に skeleton gate を追加(Loop 以外は Ok(None) で fallback 維持、仕様不変) +- 変更: `src/mir/builder/control_flow/plan/planner/build.rs` +- 検証: `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 29an P4 完了** ✅ +- 目的: LoopFacts が Some のとき skeleton/features が必ず揃うように型を引き締め(SSOT引き締め、仕様不変) +- 変更: `src/mir/builder/control_flow/plan/facts/loop_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` +- 検証: `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 29an P5 完了** ✅ +- 目的: SkeletonFacts の If2 判定を else 有無に依存しない形へ修正(未接続・仕様不変) +- 変更: `src/mir/builder/control_flow/plan/facts/skeleton_facts.rs` +- 検証: `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 29an P3 完了** ✅ +- 目的: Freeze taxonomy の `unstructured` タグをコード語彙へ追加(未使用のまま、仕様不変) +- 変更: `src/mir/builder/control_flow/plan/planner/freeze.rs` +- 検証: `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 29an P2 完了** ✅ +- 目的: planner を Skeleton→Feature→CandidateSet の段取りへ整理(候補/順序/挙動は不変) +- 変更: `src/mir/builder/control_flow/plan/planner/build.rs` +- 検証: `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 29an P1 完了** ✅ +- 目的: FeatureFacts(まず ExitUsage)を Facts SSOT として追加(仕様不変・未接続) +- 変更: `src/mir/builder/control_flow/plan/facts/feature_facts.rs` / `src/mir/builder/control_flow/plan/facts/loop_facts.rs` +- 検証: `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 29an P0 完了** ✅ +- 目的: SkeletonFacts(Loop/If/BranchN/StraightLine)を Facts SSOT として追加(仕様不変・未接続) +- 変更: `src/mir/builder/control_flow/plan/facts/skeleton_facts.rs` / `src/mir/builder/control_flow/plan/facts/loop_facts.rs` +- 検証: `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 P3 完了** ✅ +- 目的: Exit を “独立ノード増殖” にせず、Frag/ExitMap と整合する表現へ寄せる(仕様不変) +- 変更: `src/mir/builder/control_flow/plan/verifier.rs`([V11]) +- 検証: `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 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` +- 検証: `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 P0 完了** ✅ +- 目的: CorePlan の If/Exit を lowerer/verifier で扱えるようにして、CorePlan 移行の土台を作る(仕様不変) +- 変更: `src/mir/builder/control_flow/plan/lowerer.rs` / `src/mir/builder/control_flow/plan/verifier.rs` +- 検証: `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 29al P3 完了** ✅ +- 目的: cleanup を ExitKind と effect の契約として固定(仕様不変) +- SSOT: `docs/development/current/main/design/exitkind-cleanup-effect-contract-ssot.md` + +**2025-12-29: Phase 29al P2 完了** ✅ +- 目的: effect 分類と “許される変形” の最小法典を SSOT 化(仕様不変) +- SSOT: `docs/development/current/main/design/effect-classification-ssot.md` + +**2025-12-29: Phase 29al P1 完了** ✅ +- 目的: join 値(PHI相当)の最終表現と局所 verify を SSOT 化(仕様不変) +- SSOT: `docs/development/current/main/design/post-phi-final-form-ssot.md` + +**2025-12-29: Phase 29al P0 完了** ✅ +- 目的: Skeleton/Feature model を SSOT 化し、「通らない/危険」形を Freeze taxonomy に落とす(仕様不変) +- SSOT: `docs/development/current/main/design/coreplan-skeleton-feature-model.md` + +**2025-12-29: Phase 29ak P5 完了** ✅ +- 目的: planner の candidate gate を SSOT 化し、single_planner の Pattern1 抑制を撤去(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/planner/outcome.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29ak P4 完了** ✅ +- 目的: Pattern1 guard を single_planner から撤去(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29ak P3 完了** ✅ +- 目的: Pattern8 static box filter を single_planner から撤去(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29ak P2 完了** ✅ +- 目的: Pattern8 static box filter を planner 側へ移し、facts 抽出を抑制(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/facts/loop_facts.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29ak P1 完了** ✅ +- 目的: Pattern1 guard を planner 側へ移して facts 抽出を抑制(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/facts/loop_facts.rs` / `src/mir/builder/control_flow/plan/planner/outcome.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29ak P0 完了** ✅ +- 目的: PlanRuleOrder SSOT を新設し、PlannerContext の配線だけ先に導入(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/single_planner/rule_order.rs` / `src/mir/builder/control_flow/plan/planner/context.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29aj P10 完了** ✅ +- 目的: single_planner を全パターン planner-first 形に統一(挙動不変) +- 実装: `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29aj P9 完了** ✅ +- 目的: phase286_pattern9_frag_poc を legacy pack (SKIP) に隔離して SSOT を固定 +- 実装: `tools/smokes/v2/profiles/integration/joinir/phase286_pattern9_legacy_pack.sh` / `docs/development/current/main/phases/phase-29aj/README.md` / `docs/development/current/main/phases/phase-29ae/README.md` +- 検証: `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/profiles/integration/joinir/phase286_pattern9_legacy_pack.sh` (SKIP) + +**2025-12-29: Phase 29aj P8 完了** ✅ +- 目的: Pattern9(AccumConstLoop)を Facts→Planner-first に移行(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/facts/pattern9_accum_const_loop_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29aj P7 完了** ✅ +- 目的: Pattern8(BoolPredicateScan)を Facts→Planner-first に移行(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/facts/pattern8_bool_predicate_scan_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29aj P6 完了** ✅ +- 目的: JoinIR 回帰の integration gate を phase29ae pack に固定し、phase143_* を隔離 +- 実装: `tools/smokes/v2/profiles/integration/joinir/phase143_legacy_pack.sh` / `docs/development/current/main/phases/phase-29aj/README.md` / `docs/development/current/main/phases/phase-29ae/README.md` +- 検証: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/profiles/integration/joinir/phase143_legacy_pack.sh` (SKIP) + +**2025-12-29: Phase 29aj P5 完了** ✅ +- 目的: Pattern5(Infinite Early Exit)を Facts→Planner-first に移行(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/facts/pattern5_infinite_early_exit_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/run.sh --profile integration --filter "phase143_"` PASS + +**2025-12-29: Phase 29aj P4 完了** ✅ +- 目的: Pattern4(Continue)を Facts→Planner-first に移行(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/facts/pattern4_continue_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/run.sh --profile integration --filter "phase286_pattern4_frag_poc"` PASS + +**2025-12-29: Phase 29aj P3 完了** ✅ +- 目的: Pattern3(If-Phi)を Facts→Planner-first に移行(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/facts/pattern3_ifphi_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29aj P2 完了** ✅ +- 目的: chosen_rule を撤去し、Pattern1 を Facts→Planner-first に移行(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/planner/outcome.rs` / `src/mir/builder/control_flow/plan/facts/pattern1_simplewhile_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29aj P1 完了** ✅ +- 目的: single_planner の legacy_rules を撤去し、plan extractor を SSOT に集約(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/extractors/pattern{1,3,4,5,8,9}.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29aj P0 完了** ✅ +- 目的: planner outcome(facts+plan)を SSOT 化して strict 観測の再スキャンを撤去(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/planner/outcome.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29ai P15 完了** ✅ +- 目的: strict/dev のときだけ LoopBodyLocal facts を安定タグで観測できるようにする(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/single_planner/rules.rs` / `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern2_loopbodylocal_seg_min_vm.sh` / `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern2_loopbodylocal_min_vm.sh` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29ai P14 完了** ✅ +- 目的: Pattern2 LoopBodyLocal promotion の要求を Plan に載せる(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/mod.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/extractors/pattern2_break.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29ai P13 完了** ✅ +- 目的: single_planner の planner 呼び出しを 1 回に memoize して二重スキャンを解消(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29ai P12 完了** ✅ +- 目的: Pattern2 LoopBodyLocal promotion の facts 抽出を SSOT 化(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/facts/pattern2_loopbodylocal_facts.rs` / `src/mir/builder/control_flow/plan/facts/loop_facts.rs` / `src/mir/builder/control_flow/plan/facts/mod.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29ai P11 完了** ✅ +- 目的: Pattern2 break subset を Facts→Planner に吸収し、single_planner で planner-first を開始(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/facts/pattern2_break_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/run.sh --profile integration --filter "phase29ai_pattern2_break_plan_subset_ok_min"` PASS + +**2025-12-29: Phase 29ai P10 完了** ✅ +- 目的: Pattern2 extractor を plan 層へ移設して依存方向を固定(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/extractors/pattern2_break.rs` / `src/mir/builder/control_flow/joinir/patterns/extractors/pattern2.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29ai P9 完了** ✅ +- 目的: Pattern7 split-scan subset を Facts→Planner→DomainPlan まで到達させ、single_planner の Pattern7 で planner-first を開始(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/facts/loop_facts.rs` / `src/mir/builder/control_flow/plan/planner/build.rs` / `src/mir/builder/control_flow/plan/single_planner/rules.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29ai P8 完了** ✅ +- 目的: Facts→Planner を実行経路へ 1 歩だけ接続し、Pattern6(scan-with-init)の subset から吸収を開始(仕様不変) +- 実装: `src/mir/builder/control_flow/plan/single_planner/rules.rs`(Pattern6 rule の先頭で planner を試す) +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29ag P1 完了** ✅ +- 目的: coordinator の ValueId(idx) 前提を撤去し、boundary.join_inputs を SSOT 化(仕様不変) +- 入口: `docs/development/current/main/phases/phase-29ag/README.md` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS +- 回帰パック: `phase263_pattern2_*` を追加済み + +**2025-12-29: Phase 29ah P0 完了** ✅ +- 目的: JoinIR 回帰パックに real-world Pattern2(Phase 263)を追加(仕様不変) +- 入口: `docs/development/current/main/phases/phase-29ah/README.md` +- 回帰パック: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` + +**2025-12-29: Phase 29af P5 完了** ✅ +- 目的: 29af を closeout して JoinIR 回帰確認を 1 本に収束(仕様不変) +- 回帰パック: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` PASS + +**2025-12-29: Phase 29af P4 完了** ✅ +- 目的: BoundaryCarrierLayout と header PHI の同順一致を strict/dev で Fail-Fast 固定(仕様不変) +- 入口: `src/mir/builder/control_flow/joinir/merge/contract_checks/header_phi_layout.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/run.sh --profile quick` PASS + +**2025-12-29: Phase 29af P3 完了** ✅ +- 目的: carrier の順序(loop_var + carriers)を merge 側 SSOT に統合(仕様不変) +- 入口: `src/mir/builder/control_flow/joinir/merge/boundary_carrier_layout.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` / `./tools/smokes/v2/run.sh --profile quick` PASS + +**2025-12-29: Phase 29af P1 完了** ✅ +- 目的: boundary hygiene を merge 入口(`contract_checks`)へ集約して再発検知を SSOT 化(仕様不変) +- 実装: `src/mir/builder/control_flow/joinir/merge/contract_checks/boundary_hygiene.rs`(strict/dev のみ) +- 配線: `src/mir/builder/control_flow/joinir/merge/contract_checks/boundary_creation.rs` +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern2_"` / `./tools/smokes/v2/run.sh --profile integration --filter "phase1883_"` PASS +- JoinIR 回帰確認: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` + +**2025-12-29: Phase 29af P0 完了** ✅ +- 目的: Pattern2 の boundary 情報の歪みを SSOT 化し、exit/header/latch の責務境界を固定(仕様不変) +- 入口: `docs/development/current/main/phases/phase-29af/README.md` +- 変更: exit_bindings は LoopState のみ(ConditionOnly/LoopLocalZero は carrier_info→header PHI) +- 検証: `cargo build --release` / `./tools/smokes/v2/run.sh --profile quick` / `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern2_"` / `./tools/smokes/v2/run.sh --profile integration --filter "phase1883_"` PASS + +**2025-12-28: Phase 29ae P1 完了** ✅ +- 目的: Merge/Phi Contract SSOT + 回帰パック完全固定 +- 入口: `docs/development/current/main/phases/phase-29ae/README.md` +- 追加: Header PHI Entry/Latch Contract の要点を SSOT 化 +- 検証: `./tools/smokes/v2/run.sh --profile integration --filter "phase1883_"` / `phase29ab_pattern2_` / `phase29ab_pattern6_` / `phase29ab_pattern7_` PASS + +**2025-12-28: Phase 29ae P0 完了** ✅ +- 目的: JoinIR の最小回帰セットを SSOT で固定 +- 入口: `docs/development/current/main/phases/phase-29ae/README.md` + +**2025-12-28: Phase 29ad 完了** ✅ +- 目的: Pattern6/7 fixture/smoke の命名規約を SSOT 化し、variant 名を明示して迷いを消す +- 入口: `docs/development/current/main/phases/phase-29ad/README.md` + +**2025-12-28: Phase 29ac 完了** ✅ +- 目的: Pattern6/7 の near-miss(freeze固定)を、契約維持のまま PASS へ倒す(silent fallback禁止) +- 入口: `docs/development/current/main/phases/phase-29ac/README.md` +- 結果: reverse/matchscan は `phase29ab_pattern6_*` を OK 化、split-scan は near-miss OK fixture(`phase29ab_pattern7_splitscan_nearmiss_ok_min`)を追加 + +**2025-12-28: Phase 29ab P1 完了** ✅ +- 目的: Pattern2 の LoopBodyLocal promotion の最小ケースを fixture+integration smoke で固定 +- 実装: carrier binding policy を導入し、ConditionOnly / LoopLocalZero を host binding しない +- 追加: `apps/tests/phase29ab_pattern2_loopbodylocal_min.hako` +- Smoke: `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern2_loopbodylocal_min_vm.sh` +- 検証: `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern2_*"` PASS + +**2025-12-28: Phase 29ab P2 完了** ✅ +- 目的: Pattern2 Trim(A-3)相当の `LoopBodyLocal(seg)` 最小ケースを fixture+integration smoke で固定 +- 追加: `apps/tests/phase29ab_pattern2_loopbodylocal_seg_min.hako` +- Smoke: `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern2_loopbodylocal_seg_min_vm.sh` +- 検証: `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern2_*"` PASS(2/2) + +**2025-12-28: Phase 29ab P3 完了** ✅ +- 目的: Pattern2 promotion の NotApplicable/Freeze 境界を contract+fixture+smoke で固定(JoinIR-only前提) +- 契約: `src/mir/builder/control_flow/joinir/patterns/pattern2/api/README.md` +- fixtures: `apps/tests/phase29ab_pattern2_seg_{notapplicable,freeze}_min.hako` +- smokes: `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern2_seg_{notapplicable,freeze}_min_vm.sh` +- 検証: `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern2_*"` PASS(4/4) + +**2025-12-28: Phase 29ab P4 完了** ✅ +- 目的: Phase 263 の実ログ seg を Derived slot 方針で通し、fixture+integration smoke で PASS 固定 +- Smoke: `tools/smokes/v2/profiles/integration/apps/phase263_pattern2_seg_realworld_min_vm.sh` +- 追加/調整: `String.indexOf(search, fromIndex)` の2引数対応(arity解決を含む)を VM/JoinIR lowering 側で整備 + +**2025-12-28: Phase 29ab P5 完了** ✅ +- 目的: Pattern7 SplitScan の「形は近いが契約違反」ケースを extractor 段で freeze に固定(SSOT化) +- 実装: `src/mir/builder/control_flow/joinir/patterns/pattern7_split_scan.rs`(`freeze_with_hint("phase29ab/pattern7/contract", ...)`) +- fixture: `apps/tests/phase29ab_pattern7_splitscan_contract_min.hako` +- smoke: `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern7_splitscan_contract_min_vm.sh` +- 検証: `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern7_*"` PASS + +**2025-12-28: Phase 29ab P6 完了** ✅ +- 目的: Pattern6 ScanWithInit の near-miss(契約違反)を extractor 段で freeze に固定(SSOT化) +- 実装: `src/mir/builder/control_flow/joinir/patterns/pattern6_scan_with_init.rs`(`[joinir/phase29ab/pattern6/contract]`) +- fixture: `apps/tests/phase29ab_pattern6_scan_with_init_contract_min.hako` +- smoke: `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern6_scan_with_init_contract_min_vm.sh` +- 検証: `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern6_*"` PASS + +**2025-12-28: Phase 29ab P7 完了** ✅ +- 目的: Pattern6 reverse scan / matchscan の near-miss を追加で freeze 固定し、契約境界を安定化 +- fixtures: `apps/tests/phase29ab_pattern6_{reverse,matchscan}_contract_min.hako` +- smokes: `tools/smokes/v2/profiles/integration/apps/phase29ab_pattern6_{reverse,matchscan}_contract_min_vm.sh` +- 検証: `./tools/smokes/v2/run.sh --profile integration --filter "phase29ab_pattern6_*"` PASS(3/3) + +**2025-12-28: Phase 29ab P8 完了** ✅ +- 目的: Pattern6/7 の正常系 fixture を Plan/Frag/compose 経路で PASS 固定(freeze を減らす) +- Pattern6 OK: `apps/tests/phase29ab_pattern6_scan_with_init_ok_min.hako` +- Pattern7 OK: `apps/tests/phase29ab_pattern7_splitscan_ok_min.hako` +- Smokes: `phase29ab_pattern6_scan_with_init_ok_min_vm`, `phase29ab_pattern7_splitscan_ok_min_vm` + +**2025-12-28: Phase 29ab P9 完了** ✅ +- 目的: Phase 29ab closeout(入口SSOTの集約) +- 入口: `docs/development/current/main/phases/phase-29ab/README.md` + +**2025-12-28: Phase 29aa P5 完了** ✅ +- 目的: Return block が複数 predecessor のとき、incoming state が完全一致する場合のみ ReturnCleanup を成立させる +- 入口: `docs/development/current/main/phases/phase-29aa/README.md` +- Safety Contract: state 不一致なら join state を作らない(誤 release 防止) +- Selfcheck: Case 3.7(state一致→cleanup)/ Case 3.8(state不一致→no cleanup)PASS +- 検証: quick 154/154 PASS / selfcheck PASS + +**2025-12-28: Phase 29aa P6 完了** ✅ +- 目的: multi-predecessor Return で state 不一致でも、共通部分(intersection)だけ ReturnCleanup を成立 +- 入口: `docs/development/current/main/phases/phase-29aa/README.md` +- Safety Contract: intersection(全経路で ptr=val が一致するもののみ)で cleanup +- Conservative: value 不一致の ptr は release しない=リーク方向(安全だが保守的) +- Selfcheck: Case 3.9(部分一致→cleanup)/ Case 3.10(intersection空→no cleanup)PASS +- 検証: quick 154/154 PASS / selfcheck PASS + +**2025-12-28: Phase 29aa P7 完了** ✅ +- 目的: ReleaseStrong の `values` 順序を決定的にする(HashSet/HashMap 由来の非決定性排除) +- 入口: `docs/development/current/main/phases/phase-29aa/README.md` +- Contract: `sort_unstable()` + `dedup()` で ValueId 昇順に固定 +- ヘルパー関数 `sorted_release_values` で全 ReleaseStrong 生成箇所(2箇所)を統一 +- Selfcheck: Case 3.11(values が昇順であることを検証)PASS +- 検証: quick 154/154 PASS / selfcheck PASS + +**2025-12-28: Phase 29aa P8 完了** ✅ +- 目的: CFG を跨いだ null 伝播(Copy-only)で explicit drop(Store null)の精度を上げる +- 入口: `docs/development/current/main/phases/phase-29aa/README.md` +- Contract: single-predecessor Jump-chain のみ null_values 伝播(multi-pred Return は合流しない) +- Non-goals: edge_args 経由の null 伝播(ValueId 同一性だけでは追えない) +- Selfcheck: Case 3.12(null 伝播で ReturnCleanup なし)PASS +- 検証: quick 154/154 PASS / selfcheck PASS + +**2025-12-27: Phase 29aa P4 完了** ✅ +- 目的: Jump の直列チェーン(単一 predecessor)を通して ReturnCleanup を成立させる(cleanup は Return block のみ) +- 入口: `docs/development/current/main/phases/phase-29aa/README.md` + +**2025-12-27: Phase 29aa P3 完了** ✅ +- 目的: Jump→Return(単一 predecessor)で state 伝播し ReturnCleanup を成立 +- 入口: `docs/development/current/main/phases/phase-29aa/README.md` + +**2025-12-27: Phase 29z P2 closeout** ✅ +- `src/mir/passes/rc_insertion.rs`: `Store` 上書き + `Store null`(explicit drop)+ Return終端cleanup の最小 release 挿入(単一block・安全ガード) +- 既定OFF: Cargo feature `rc-insertion-minimal`(env var 新設なし) +- 検証: quick 154/154 PASS 維持 + `cargo run --bin rc_insertion_selfcheck --features rc-insertion-minimal` +- 入口: `docs/development/current/main/phases/phase-29z/README.md` +- 次: Phase 29aa P2(CFG-aware の最小ターゲット選定) + +**2025-12-27: Phase 29y P0 完了** ✅ +- docs-first SSOT finalized(ABI/RC insertion/Observability) +- 3つのSSOT文書(10/20/30)を Ready に確定 +- pilot 実装(Phase 29y.1)の入口を固定 +- Next steps(実装タスク3つ)を明文化 +- 入口: `docs/development/current/main/phases/phase-29y/README.md` +- **Next**: Phase 29aa(CFG-aware RC insertion)または Phase 29x(De-Rust runtime)候補 + +**2025-12-27: Phase 287 完了** ✅ +- P0-P9完了(big files modularization / facade pattern / SSOT establishment / closeout) +- 検証: quick 154/154 PASS維持、意味論不変 +- 入口: `docs/development/current/main/phases/phase-287/README.md` + +**2025-12-27: Phase 188.3 完了** ✅ +- Pattern6(NestedLoopMinimal): `apps/tests/phase1883_nested_minimal.hako` が RC=9 +- Merge SSOT(latch/entry-like/double latch)を固定(BackEdgeのみlatch記録、main entry blockのみentry-like、二重latchはdebug_assert) +- `./tools/smokes/v2/run.sh --profile quick` 154/154 PASS 維持 +- 入口: `docs/development/current/main/phases/phase-188.3/README.md` +- 次の指示書(refactor挟み込み): `docs/development/current/main/phases/phase-188.3/P2-REFACTORING-INSTRUCTIONS.md` + +**2025-12-27: Phase 287 P0 完了** ✅ +- `merge/mod.rs` を modularize(1,555 → 1,053 lines) +- SSOT: `boundary.loop_header_func_name` 優先、`boundary.continuation_func_ids` で除外、`MAIN` 明示除外 +- 検証: Pattern6 RC=9 / quick 154 PASS / 恒常ログ増加なし +- 入口: `docs/development/current/main/phases/phase-287/P0-BIGFILES-REFACTORING-INSTRUCTIONS.md` + +**2025-12-27: Phase 287 P1 完了** ✅ +- `ast_feature_extractor.rs` を facade 化(1,148 → 135 lines) +- `pattern_recognizers/`(8 modules)へ分割(1 module = 1 質問) +- 検証: Build 0 errors / Pattern6 RC=9 / quick 154 PASS / 恒常ログ増加なし +- 入口: `docs/development/current/main/phases/phase-287/P1-AST_FEATURE_EXTRACTOR-INSTRUCTIONS.md` +- 次の指示書(P2): `docs/development/current/main/phases/phase-287/P2-CONTRACT_CHECKS-MODULARIZATION-INSTRUCTIONS.md`(完了) + +**2025-12-27: Phase 287 P2 完了** ✅ +- `contract_checks.rs` を facade 化し、`contract_checks/` 配下へ契約単位で分割(1 module = 1 contract) +- 検証: Build 0 errors / Pattern6 RC=9 / quick 154 PASS / 恒常ログ増加なし +- 入口: `docs/development/current/main/phases/phase-287/P2-CONTRACT_CHECKS-MODULARIZATION-INSTRUCTIONS.md` +- 次の指示書(P3): `docs/development/current/main/phases/phase-287/P3-INSTRUCTION_REWRITER-MODULARIZATION-INSTRUCTIONS.md`(完了) + +**2025-12-27: Phase 287 P3 完了** ✅ +- `instruction_rewriter.rs` を stage 単位へ物理分割(Scan/Plan/Apply)し、facade(orchestrator)へ縮退(意味論不変) +- 検証: Build 0 errors / quick 154 PASS / 恒常ログ増加なし +- 入口: `docs/development/current/main/phases/phase-287/P3-INSTRUCTION_REWRITER-MODULARIZATION-INSTRUCTIONS.md` +- 次の指示書(P4): `docs/development/current/main/phases/phase-287/P4-PLAN_STAGE-MODULARIZATION-INSTRUCTIONS.md`(完了) + +**2025-12-27: Phase 287 P4 完了** ✅ +- `rewriter/stages/plan.rs` を facade 化し、`rewriter/stages/plan/` 配下へ責務単位で分割(意味論不変) +- 検証: Build 0 errors / quick 154 PASS / 恒常ログ増加なし +- 入口: `docs/development/current/main/phases/phase-287/P4-PLAN_STAGE-MODULARIZATION-INSTRUCTIONS.md` +- 次の指示書(P5): `docs/development/current/main/phases/phase-287/P5-STAGES-VISIBILITY-FACADE-INSTRUCTIONS.md`(完了) + +**2025-12-27: Phase 287 P5 完了** ✅ +- `stages/mod.rs` を facade にして stage 関数を re-export(単一入口化) +- 検証: Build 0 errors / quick 154 PASS / 恒常ログ増加なし +- 入口: `docs/development/current/main/phases/phase-287/P5-STAGES-VISIBILITY-FACADE-INSTRUCTIONS.md` +- 次の指示書(P6): `docs/development/current/main/phases/phase-287/P6-SCAN_PLAN-INTEGRATION-INSTRUCTIONS.md`(完了) + +**2025-12-27: Phase 287 P6 完了** ✅ +- Scan stage を削除し、pipeline を 2-stage(Plan→Apply)へ単純化(意味論不変) +- 検証: quick 154 PASS +- 入口: `docs/development/current/main/phases/phase-287/P6-SCAN_PLAN-INTEGRATION-INSTRUCTIONS.md` +- 次の指示書(P7): `docs/development/current/main/phases/phase-287/P7-REWRITER-BOX-SCAFFOLDING-CLEANUP-INSTRUCTIONS.md`(完了) + +**2025-12-27: Phase 287 P7 完了** ✅ +- `rewriter/` の未使用 Box 雛形を削除し、SSOT を `rewriter/stages/*` に寄せた(意味論不変) +- 検証: Build 0 errors / quick 154 PASS / 恒常ログ増加なし +- 入口: `docs/development/current/main/phases/phase-287/P7-REWRITER-BOX-SCAFFOLDING-CLEANUP-INSTRUCTIONS.md` +- 次の指示書(P8): `docs/development/current/main/phases/phase-287/P8-REWRITER-README-GUARD-INSTRUCTIONS.md` + +**2025-12-27: Phase 287 P8 完了** ✅ +- `rewriter/README.md` を追加し、責務境界と SSOT(Plan→Apply)を明文化(docs-only) +- 検証: cargo check / quick PASS +- 入口: `src/mir/builder/control_flow/joinir/merge/rewriter/README.md` +- 次の指示書(P9): `docs/development/current/main/phases/phase-287/P9-PHASE-CLOSEOUT-INSTRUCTIONS.md` + +**2025-12-27: Phase 188.2 完了** ✅ +- StepTreeの `max_loop_depth` を SSOT に採用(Option A) +- strict mode で depth > 2 を明示エラー化(Fail-Fast) +- quick 154/154 PASS、integration selfhost FAIL=0 維持 +- 次: `docs/development/current/main/phases/phase-188.3/P2-REFACTORING-INSTRUCTIONS.md`(意味論不変での整理を優先) + +**2025-12-27: Phase S0.1 完了** ✅ +- integration selfhost を「落ちない状態」に収束(FAIL=0) +- canary テスト opt-in 化(SMOKES_ENABLE_SELFHOST=1、9本) +- baseline テスト条件付き SKIP(該当ログの時だけ、unknown は FAIL 維持) +- quick 154/154 PASS 維持、Fail-Fast 原則遵守 +- SSOT: [selfhost-integration-limitations.md](investigations/selfhost-integration-limitations.md) + +**2025-12-27: Phase S0 Selfhost Integration 安定化(実ログベース)完了** ✅ +- **実ログ採取完了**: 5本のスクリプト直叩き + 全体ログで事実確定(推定排除) +- **確認済みエラーパターン**(実ログベース): + - Pattern 1: Loop lowering failed / StepTree lowering returned None(JoinIR loop pattern gap) + - Pattern 2: cap_missing/NestedLoop(JoinIR caps gap) + - Pattern 3: strict mode panic(NYASH_JOINIR_STRICT=1 削除で対応) + - Pattern 4: Argument list too long(OS limitation) +- **条件付き SKIP 実装**: selfhost_minimal.sh, phase150, mir_min_vm, canary 4本(該当ログの時だけ、それ以外はFAIL) +- **進捗**: 12 FAIL → 10 FAIL(selfhost_minimal, mir_min_vm が PASS に) +- **quick smoke**: 154/154 PASS 維持 ✅ +- **SSOT**: [selfhost-integration-limitations.md](investigations/selfhost-integration-limitations.md) +- **未確認**: String+Integer 型エラー(実ログで未検出、追加しない) + +**2025-12-27: Phase 29y.1(pilot plumbing)完了** ✅ +- docs SSOT(ABI/RC insertion/observability)を Phase 29y に集約 +- "後続実装へ迷わず切るための最小導線" を追加(意味論は変更しない) + - NyRT handle ABI shim(`crates/nyash_kernel/src/ffi/lifecycle.rs`) + - RC insertion pass 入口(no-op skeleton) + - leak report に root categories(handlesのみ)を追加(Phase 1 limitation 明記) +- integration smokes 追加(Phase 29y.1): `phase29y_handle_abi_{vm,llvm}.sh` +- quick smoke 154/154 PASS 維持 + +**2025-12-26: Phase 285 P2 完了** ✅ +- weak の意味論(`weak ` + `weak_to_strong()` 成功)を integration smoke で固定 +- Fixture A(成功パターン): exit 2 で明確化、VM/LLVM PASS +- Fixture B(失敗パターン): 明示 drop (`x = null`) 方式 +- Block scope drop conformance は別タスク(P2 では扱わない) +- quick smoke 154/154 PASS 維持 + +**2025-12-26: Phase 285 P2.1 完了** ✅ +- hidden root を根治し、weak-fail fixture を PASS に復帰(`x = null` 後に `weak_to_strong()` が `null`) +- `KeepAlive` / `ReleaseStrong` により「スコープ維持 / 上書きdrop」を語彙として分離(後続の命令分離で整理) + +**2025-12-26: Phase 285 P2.2(hygiene)完了** ✅ +- `KeepAlive { values, drop_after }` を廃止し、`KeepAlive` / `ReleaseStrong` に命令分離(意図を MIR 語彙で明確化) +- quick smoke 154/154 PASS 維持 + +**2025-12-27: Phase 285 P4 Post-Completion** ✅ +- **Phase 284 P2 Integration Fix** (commit `225600b5f`) + - `phase284_p2_return_in_loop_llvm` FAIL 修正(unreachable instruction 使用) + - Integration LLVM tests: 3/3 PASS(FAIL 残りなし) +- **ret.py Box-First Refactoring** (commits `32aa0ddf6`, `5a88c4eb2`) + - Phase 1-2: UnreachableReturnHandlerBox + ReturnTypeAdjusterBox + - Phase 3: StringBoxerBox + ReturnPhiSynthesizerBox + - lower_return() 削減: 166→117 lines (-29%) +- **Code Quality Improvements** (commits `d7c6df367`, `798c193cb`, `1869396fd`, `095213c58`) + - LLVM exit code SSOT化、nyash_kernel FFI分割、LLVM検出集約、auto_detect.conf明確化 +- quick smoke 154/154 PASS 維持 + +**2025-12-26: Phase 285 P0 完了** ✅ +- 言語 SSOT との境界明文化(lifecycle.md, types.md) +- 用語・禁止事項・VM/LLVM差分分類を固定 +- P1/P2 への導線を箇条書きで追加 + +**2025-12-26: Phase 284 P2 完了** ✅ +- return を含む loop(Pattern5)を VM で smoke 固定 +- LLVM harness integration でも PASS(unreachable return の型不整合を修正) +- quick smoke 154/154 PASS 維持 + +設計相談(将来の正規化): +- `docs/development/current/main/investigations/phase-286-plan-normalization-consult.md` + +**2025-12-26: Phase 286 P2 完了** ✅ +- Pattern4 (Loop with Continue) → Plan/Frag SSOT 化 PoC 成功 +- phi_bindings 導入で PHI dst 参照を正しく解決 +- Integration test PASS (output: 6), quick smoke 154/154 PASS + +**2025-12-26: Phase 286 P2.1 完了** ✅ +- Pattern1 (SimpleWhile) → Plan/Frag SSOT 化 PoC 成功 +- Integration test PASS (return: 3), quick smoke 154/154 PASS +- Plan line routing: `route=plan strategy=extract pattern=Pattern1_SimpleWhile` + +**2025-12-26: Phase 286 P2.2 完了** ✅ +- extractor helper化: `extract_loop_increment_plan` → `common_helpers.rs` に統一(重複排除 ~25行) +- router helper化: `lower_via_plan()` 追加で Pattern6/7/4/1 の boilerplate 削減(~40行) +- quick smoke 154/154 PASS 維持、Pattern1/4 PoC 両方 PASS + +**次のステップ**: +1. **Phase 287(P9)**: Phase closeout(docs-only) + - 指示書: `docs/development/current/main/phases/phase-287/P9-PHASE-CLOSEOUT-INSTRUCTIONS.md` +2. (post self-host / docs-first)**Phase 29y**: MIR lifecycle vocab freeze(RC/weak/ABI) + - 相談パケット: `docs/development/current/main/investigations/phase-29y-mir-lifecycle-vocab-consult.md` +3. (future design, separate phase)Plan 生成の正規化(相談パケット) + - `docs/development/current/main/investigations/phase-286-plan-normalization-consult.md` + +## Recently Completed + +### 2025-12-25: Phase 288.1(REPL Session Persistence + Auto-Display) + +- ✅ **Phase 288.1完了**: REPL variable persistence + expression auto-display + - 詳細: `docs/development/current/main/phases/phase-288/README.md` + - 実装方式: AST Rewrite + ExternCall Bridge + - 達成内容: + - ✅ AST Rewriter 実装(~430行、`src/runner/repl/ast_rewriter.rs`) + - ✅ __repl.get/set ExternCall handlers 実装 + - ✅ Rc> session sharing + - ✅ Expression auto-display + `_` variable + - ✅ Fail-fast undefined variable errors + - 検証結果: + - ✅ Variable persistence: `x = 42` then `print(x)` → `42` + - ✅ Expression display: `1 + 1` → `2` + - ✅ `_` variable: `10 * 2` → `20`, then `_` → `20` + - ✅ Session reset: `.reset` clears all variables + - ✅ 154/154 smoke tests PASS (no regressions) + - Files: 8 files, +592 lines (REPL-isolated) + +### 2025-12-24: Phase 285LLVM-1.3(LLVM InstanceBox Field Access) + +- ✅ **Phase 285LLVM-1.3完了**: InstanceBox field access (getField/setField) implementation + - 詳細: `docs/development/current/main/phases/phase-285/phase-285llvm-1.3-verification-report.md` + - 実装: `crates/nyash_kernel/src/plugin/invoke.rs` (~170 lines) + - 達成内容: + - ✅ getField/setField handlers 実装完了(SSOT `fields_ng` 直接アクセス) + - ✅ Fail-Fast error logging 実装(`[llvm/invoke/{get,set}Field]` tags) + - ✅ Raw i64 fallback 対応(LLVM backend 特有の挙動) + - ✅ Handle resolution 動作確認(handle 4 → IntegerBox(42)) + - 検証結果: + - ✅ setField: Integer(42) を正しく保存 + - ✅ getField: Integer(42) を正しく取得、handle 返却 + - ✅ print issue: Phase 285LLVM-1.4(型タグ伝播)で解決済み + +### 2025-12-23 + +- Phase 283(bugfix): JoinIR if-condition remap fix: `docs/development/current/main/phases/phase-283/README.md` +- Phase 282(Router shrinkage + extraction-based migration + extractor refactor P0–P9a): `docs/development/current/main/phases/phase-282/README.md` +- Phase 280(Frag composition SSOT positioning): `docs/development/current/main/phases/phase-280/README.md` +- Phase 281(Pattern6/7 compose adoption, P0–P3): `docs/development/current/main/phases/phase-281/README.md` +- Phase 273(Plan line SSOT): `docs/development/current/main/phases/phase-273/README.md` +- Phase 275 P0(A1/B2/C2 coercion SSOT): `docs/development/current/main/phases/phase-275/README.md` +- Phase 276 P0(quick wins / type_helper SSOT): `docs/development/current/main/phases/phase-276/README.md` +- Phase 277 P1(PHI strict fail-fast): `docs/development/current/main/phases/phase-277/README.md` +- Phase 277 P2(PHI env var 統合): `docs/development/current/main/phases/phase-277/README.md` +- Phase 278 P0(deprecated PHI env vars removal): `docs/development/current/main/phases/phase-278/README.md` +- Phase 279 P0(type propagation pipeline SSOT unification): `docs/development/current/main/phases/phase-279/README.md` + +--- + +## 2025-12-22: Follow-ups(post Phase 275/276/277) + +- 目的: Phase 275/276 で積み残した改善タスクを完全実装(デッドコード削除・SSOT使用推進・Void検出) +- 達成内容: + - ✅ **P0: box_from_f64 削除**(デッドコード) + - `crates/nyash_kernel/src/lib.rs` から2関数削除 + - Phase 275 P0 の Float 型 SSOT 方針により boxing helper 不要 + - ビルド成功・テスト成功確認 + - ✅ **P1: dst_type_to_llvm_type 使用推進** + - `phi_wiring/wiring.py` を type_helper.py SSOT に統一 + - 型変換ロジックが完全に1箇所に集約(拡張性向上) + - ✅ **LLVM A1: Void検出修正(Phase 275 P0 残タスク)** + - `branch.py` に Void/VoidBox 検出ロジック実装済みを確認 + - エラーメッセージ追加(fail-fast 原則) + - テストケース作成(/tmp/test_p275_a1_void.hako) + - VM側で正常にエラー検出確認 + - ✅ **LLVM Smoke Tests 完全実施**: + - Test 1 (simple Int+Float): ✅ PASS (exit=3, VM/LLVM parity) + - Test 2 (two Int+Float ops): ✅ PASS (exit=3, VM/LLVM parity) + - Test 3 (Float + String): C2 では **TypeError** が期待(文字列混在 `+` は禁止)。ここが通るならバグとして扱う +- 効果: + - Float PHI 完全動作(VM/LLVM parity 達成) + - SSOT 原則完全適用(型変換・環境変数) + - Fail-Fast 原則適用(Void in boolean context) + - デッドコード削減(保守性向上) + +## 2025-12-22: Phase 277(P2)— PHI関連環境変数の統合・整理 ✅ + +- 目的: PHI関連環境変数を **8個 → 3個** に統合してユーザビリティ向上・保守性向上 +- 完了日: 2025-12-22 +- 達成内容: + - ✅ `debug_helper.py` 作成(環境変数チェックのSSOT) + - ✅ 3つの統合関数実装: + - `is_phi_debug_enabled()`: 一般デバッグ(LLVM_PHI_DEBUG + PHI_TYPE_DEBUG + PHI_ORDERING_DEBUG 統合) + - `is_phi_trace_enabled()`: 詳細トレース(LLVM_TRACE_PHI + LLVM_VMAP_TRACE 統合) + - `is_phi_strict_enabled()`: 厳格モード(既存維持) + - ✅ 全PHI関連ファイル修正完了(9ファイル): + - `phi_wiring/wiring.py`, `phi_wiring/tagging.py`, `phi_wiring/common.py` + - `phi_placement.py`, `trace.py`, `instructions/phi.py` + - `resolver.py`, `utils/values.py`, `builders/block_lower.py` 他 + - ✅ 後方互換性対応(非推奨警告付き、Phase 278で削除予定) + - ✅ ドキュメント更新: + - `docs/reference/environment-variables.md` に詳細セクション追加 + - 使用例・出力例・移行ガイド記載 +- 効果: + - ユーザビリティ向上(覚える変数 8個→3個) + - ドキュメント簡潔化(環境変数セクションが短く) + - 保守性向上(関連設定が1つに) + - SSOT原則適用(環境変数チェックロジック統一) + +## 2025-12-22: Phase 276(P0)— Quick Win 改善(型取得SSOT化) ✅ + +- 目的: Phase 275 P0 完了後の堅牢性改善(デバッグコード削減・型取得ロジックSSOT化・警告強化) +- 完了ドキュメント: `docs/development/current/main/phases/phase-276/P0-COMPLETION.md` +- 達成内容: + - ✅ デバッグスタックトレース削除(wiring.py) + - ✅ box_from_f64 使用確認(削除可能と判断) + - ✅ 型取得ロジックSSOT化(type_helper.py 作成、3ファイル統一) + - ✅ 型不一致CRITICAL警告強化(PhiManager連携) +- 効果: + - 型取得ロジックの重複削除(3箇所 → 1箇所) + - SSOT原則適用(バグ防止・拡張性向上) + - デバッグ性向上(CRITICAL警告で早期発見) + +## 2025-12-22:Phase 275(P0)— coercion SSOT rollout(truthiness / `==` / `+`) ✅ + +- 完了: Phase 274 P3 で確定した coercion ルール(A1/B2/C2)を VM/LLVM に実装 +- Decision (SSOT): `docs/development/current/main/phases/phase-274/P3-DECISIONS.md` +- 実装ガイド: `docs/development/current/main/phases/phase-275/P0-INSTRUCTIONS.md` +- 重要修正: + - Float型PHI完全対応(MIR型伝播 → LLVM IR double生成) + - 型取得ロジック3箇所統一(type_helper.py) + - 型不一致警告強化(CRITICAL表示) +- fixture/smoke: + - `apps/tests/phase275_p0_float_phi_min.hako` (想定) + - LLVM harness で exit=3 動作確認済み + +### 過去の Blocker: 型伝播パイプラインの二重化(lifecycle vs JoinIR) + +- 現状、型伝播/PHI 型解決の順序が経路により異なり、同一 fixture が別ルートで壊れ得る(実質 "2本のコンパイラ")。 +- 対処(SSOT, short-term): Phase 276 P0 で型取得ロジックをSSOT化(部分対応) +- 根治(SSOT, long-term): Phase 279 で type propagation pipeline の入口/順序を完全統一 +- 予定: `docs/development/current/main/phases/phase-279/README.md` + +## 2025-12-22:Phase 274(P1)— TypeOp(is/as)を Rust VM で実行可能にする ✅ + +- 完了: Rust VM が `MirInstruction::TypeOp`(Check/Cast)を実行可能 +- fixture/smoke: + - `apps/tests/phase274_p1_typeop_is_as_min.hako` + - `tools/smokes/v2/profiles/integration/apps/phase274_p1_typeop_is_as_vm.sh` + +## 2025-12-22:Phase 274(P2)— LLVM TypeOp alignment ✅ + +- 完了: LLVM harness でも `TypeOp(Check/Cast)` が SSOT(Rust VM)と一致 +- 重要修正: MIR JSON emitter(bin)で `typeop` が欠落していたため、JSON に `op:"typeop"` を出力するよう修正 +- fixture/smoke(LLVM): + - `apps/tests/phase274_p2_typeop_primitives_only.hako` + - `tools/smokes/v2/profiles/integration/apps/phase274_p2_typeop_is_as_llvm.sh` + +## 2025-12-22:Phase 272(P0.2)— Pattern7 Frag+emit_frag 移行 ✅ + +- 目的: Pattern7(split scan)を `Frag + emit_frag()` 経路へ移行し、terminator emission を SSOT に集約する(副作用 `result.push` を含む) +- 状況: Phase 272 P0.1(Pattern6)+ P0.2(Pattern7)ともに ✅ 完了 +- 入口 fixture/smoke: + - Pattern7: `apps/tests/phase256_p0_split_min.hako` + `tools/smokes/v2/profiles/integration/apps/phase256_p0_split_vm.sh` +- SSOT: `docs/development/current/main/design/edgecfg-fragments.md`(合成則/bridge撤去条件) +- 詳細: `docs/development/current/main/phases/phase-272/README.md` + +## 2025-12-22:Phase 271(docs-only)— Bridge pattern 撤去条件SSOT ✅ + +- 変更: + - `docs/development/current/main/design/edgecfg-fragments.md` に bridge contract(テンプレ)+ `Pattern9_AccumConstLoop` 撤去条件を追記 + - `docs/development/current/main/30-Backlog.md` の Phase 271 成果物を明文化 + +## 2025-12-22:Phase 269 P1.2(this/me in loop)— Static Call 正規化SSOT ✅ + +- 目的: static box 内の `this.method(...)` / `me.method(...)` を runtime receiver にせず、compile-time に static call へ正規化する(NewBox 禁止 / by-name ハードコード禁止) +- SSOT: `comp_ctx.current_static_box` と `BoxName.method/arity`(canonical key) +- 実装: MethodCall 共通入口で `This/Me` receiver を最優先で検出し、static call へ正規化(ハードコード無し) +- fixture/smoke: + - `apps/tests/phase269_p1_2_this_method_in_loop_min.hako` + - `tools/smokes/v2/profiles/integration/apps/phase269_p1_2_this_method_in_loop_vm.sh` +- 受け入れ: MIR dump に receiver `const "StringUtils"` が出ない / `call_method StringUtils.is_digit/1`(同等の static call)になる + +## 2025-12-22:Phase 269 P1(Pattern8 EdgeCFG lowering)— SSA を閉じる ✅ + +- 完了: header に `i_current = phi [i_init, preheader], [i_next, step_bb]` を入れて SSA を閉じ、header/body/step の参照を `i_current` に統一 +- 検証: `tools/smokes/v2/profiles/integration/apps/phase269_p0_pattern8_frag_vm.sh` PASS(+ 回帰 `phase259_p0_is_integer_vm` PASS) +- 詳細: `docs/development/current/main/phases/phase-269/README.md` + +## 2025-12-21:Phase 270(P0+P1)— JoinIR-only minimal loop SSOT ✅ + +- 目的: `loop(i < 3)` + `sum=sum+i` + `i=i+1` を JoinIR 経路で通すことを fixture/smoke で固定 +- 結果: Pattern1 は test-only stub のため不適合 → Pattern9(AccumConstLoop)を橋渡しとして追加し、fixture は exit=3 で PASS +- 制約: `cf_loop` は JoinIR-only(非JoinIR loop 経路や env-var 分岐は追加しない) +- 詳細: `docs/development/current/main/phases/phase-270/README.md` + +## 2025-12-21:Phase 269 P1(Pattern8 EdgeCFG lowering)✅ + +**目的**: Pattern8(BoolPredicateScan)を JoinIR ではなく **EdgeCFG Frag + emit_frag()** で “本当に”動かす(層境界は維持) +**スコープ**: Pattern8 内だけ差し替え(merge/EdgeCFG plumbing/Pattern6/7/9 は触らない、cf_loop hard-freeze維持) + +**完了内容(P1)**: +- ✅ emission 入口 `loop_predicate_scan` を追加し、Frag 構築 + `emit_frag()` を配線 +- ✅ 5ブロック構成(header/body/step/after/ret_false)で terminator を生成 +- ✅ header に PHI を挿入して `i` の SSA を閉じた(`i_current`) +- ✅ early-exit `return false` は Return wire、`return true` は loop 後 AST に任せる +- ✅ Pattern8 lower は当面 `emit_void(builder)`(loop-statement 扱い) + +**詳細**: `docs/development/current/main/phases/phase-269/README.md` + +## 2025-12-21:Phase 269 P1.1(call_method return type)— 署名SSOTで型注釈 ✅ + +- 問題: `call_method BoxName.method/N(...)` の戻り値型が既定 `String` になり、Bool を返すメソッドが誤動作する +- 修正方針: `emit_unified_call_impl` の直後で、`BoxName.method/arity` の canonical key を構築し、 + `MirFunction.signature.return_type`(SSOT)から dst の型を注釈する(ハードコード禁止) + +## 2025-12-21:Phase 267 P0(BranchStub + emit_frag)✅ + +**目的**: Frag に Branch を第一級で追加し、wires(Jump/Return)と同様に MIR terminator へ落とせる入口(SSOT)を作る +**結果**: `emit_frag()` により、`wires + branches` を BasicBlockId 層で PoC 証明(unit tests)まで完了 + +- ✅ `BranchStub` 追加 + `Frag.branches` 追加 +- ✅ `compose::if_` が header→then/else の `BranchStub` を生成 +- ✅ `emit_frag(function, frag)` 追加(`verify_frag_invariants_strict` を先頭で実行、1 block = 1 terminator を Fail-Fast) +- ✅ `cargo test -p nyash-rust --lib` PASS + +**注意(P1)**: NormalizedShadow/JoinIR への実適用は層ミスマッチがあるため Phase 268 に繰り越し +**詳細**: `docs/development/current/main/phases/phase-267/README.md` + +## 2025-12-21:Phase 268 P1(compose::if_ entry edge-args SSOT化)✅ + +**目的**: compose::if_() の then/else entry edge-args を呼び出し側 SSOT にし、TODO 削除(Phase 267 P2+ からの継続) + +**実装完了内容**: +- ✅ compose::if_() シグネチャ変更(then_entry_args, else_entry_args パラメータ追加) +- ✅ emission/branch.rs::emit_conditional_edgecfg() から空 EdgeArgs を then/else 両方に渡す +- ✅ EdgeCFG テスト更新(compose.rs 2箇所、emit.rs 1箇所) +- ✅ TODO コメント削除完了(Phase 267 P2+ TODO 解消) + +**テスト結果**: +- ✅ cargo build --release: **成功**(0エラー) +- ✅ cargo test --lib --release: **1444/1444 PASS** +- ✅ quick smoke: **45/46 PASS**(既存状態維持) + +**核心的な設計判断**: +1. **SSOT 原則**: compose::if_() 内部で then/else entry edge-args を "勝手に空 Vec で生成" しない → 呼び出し側が明示的に渡す +2. **P0 との整合性**: P0 で emission/branch.rs に薄いラッパーを作ったので、edge-args も同じ層で SSOT として渡す + +**次フェーズへの橋渡し**: +- Phase 269: Pattern6/7/8 への Frag 適用 + fixture/smoke test + +**詳細**: `docs/development/current/main/phases/phase-268/README.md` + +## 2025-12-21:Phase 266(wires → MIR terminator 生成 - 最小 PoC)✅ + +**目的**: wires を MIR terminator に変換する最小 PoC を実装し、Phase 267 での本格適用に備える + +**実装完了内容**: +- ✅ emit.rs 作成(emit_wires 実装 + unit test 4個) + - from ごとにグループ化して1本だけ許可(1 block = 1 terminator 制約) + - Return は target=None を許可(意味を持たない) + - Jump/Return 対応(Branch は Phase 267) +- ✅ verify_frag_invariants_strict() 追加(段階導入を壊さない) + - 既存の verify_frag_invariants() は変更なし(警告のまま) + - wires/exits 分離契約を Err 化(Return の target=None は許可) +- ✅ mod.rs 更新(emit module エクスポート) + +**テスト結果**: +- ✅ edgecfg::api::emit テスト: **4/4 PASS** + - test_emit_wires_jump_basic + - test_emit_wires_return_basic + - test_emit_wires_unwired_stub_fails + - test_emit_wires_multiple_from_same_block_fails +- ✅ 全 lib テスト: **1392/1392 PASS**(既存 1388 + 新規 4個、退行なし) + +**核心的な設計判断**: +1. **from グループ化**: 同じ block に複数 terminator を設定すると上書き → BTreeMap で from ごとにグループ化し、1本だけ許可 +2. **Return の target=None 許可**: Return は呼び出し元に戻るので target が意味を持たない → Normal/Break/Continue/Unwind のみ target 必須 +3. **verify strict 版**: 既存の verify_frag_invariants() を Err 化すると既存コードが壊れる → 新規に strict 版を追加し、段階導入 +4. **Phase 260 terminator 語彙ルール厳守**: Jump は set_jump_with_edge_args()、Return は set_terminator() + set_return_env() + +**重要**: JoinIR/NormalizedShadow には触らない(Phase 267)。Branch terminator 生成も Phase 267 に繰り越し。 + +**次フェーズへの橋渡し**: +- Phase 267: NormalizedShadow への Frag 適用 + Pattern6/7/8 を Frag 化 + Branch 生成 + +**詳細**: `docs/development/current/main/design/edgecfg-fragments.md` + +## 2025-12-21:Phase 265 P2(seq/if_ 実装 - wires/exits 分離)✅ + +**目的**: 「解決済み配線(wires)」と「未解決 exit(exits)」を分離し、Frag 合成の基本パターンを完成させる + +**実装完了内容**: +- ✅ Frag に `wires: Vec` フィールド追加 +- ✅ wires/exits 分離設計確立 + - **exits**: target = None のみ(未配線、外へ出る exit) + - **wires**: target = Some(...) のみ(配線済み、内部配線) +- ✅ loop_() を wires 対応に更新(Break/Continue → wires) +- ✅ seq(a, b) 実装完了(a.Normal → b.entry が wires、seq の Normal exit は b の Normal) +- ✅ if_(header, cond, t, e, join_frag) 実装完了(t/e.Normal → join が wires、if の exit は join_frag.exits) +- ✅ verify_frag_invariants() に wires/exits 分離契約追加(警告のみ、Err化は Phase 266) + +**テスト結果**: +- ✅ edgecfg::api テスト: **13/13 PASS**(frag 3個 + compose 9個 + verify 1個) +- ✅ 全 lib テスト: **1388/1388 PASS**(退行なし) + +**核心的な設計判断**: +1. **wires/exits 分離**: 解決済み配線と未解決 exit を混ぜると再配線バグが起きる → 分離して不変条件強化 +2. **if_ は join_frag 受け取り**: join: BasicBlockId では「join block」か「join 以降」か曖昧 → join_frag: Frag で明確化 +3. **verify は警告のみ**: P2 は wires/exits 分離の証明に集中、Err 化は Phase 266 で MIR 生成時に実施 + +**重要**: +- MIR 命令生成の **PoC(emit_wires)**は Phase 266 で完了。 +- Pattern6/7/8 や NormalizedShadow への **実適用**は Phase 267 以降(層境界維持)。 + +**次フェーズへの橋渡し**: +- Phase 266: wires を MIR terminator に落とす(PoC: emit_wires)✅ +- Phase 267: NormalizedShadow/JoinIR への適用 + Pattern6/7/8 を Frag 化 + Branch 生成 + +**詳細**: `docs/development/current/main/phases/phase-265/` + `docs/development/current/main/design/edgecfg-fragments.md` + +## 2025-12-21:Phase 263 P0.2(Pattern2 promotion API SSOT)✅ + +- **Goal**: Pattern2 の “Reject/continue/fallback の揺れ” を **型 + 入口SSOT**で封じ、部分続行(後段で落ちる)を構造で不可能にする +- **実装**: + - `PromoteDecision::{Promoted, NotApplicable, Freeze}`(Option 多重を撤去) + - `pattern2/api/` を入口SSOTとして新設し、`try_promote(...)` を **単一参照点**に固定 +- **効果**: + - `NotApplicable` は **必ず** `Ok(None)` で Pattern2 全体を抜ける(後続経路へ) + - `Freeze` は **必ず** Fail-Fast(close-but-unsupported のみ即死) +- **検証結果**: + - cargo test --lib: **1368/1368 PASS** ✅ + - quick smoke: **45/46 PASS** ✅(既知 1 件は別論点) +- **Commits**: + - `abdb860e7`(P0.1): PromoteDecision 導入(Option 揺れの撤去) + - `e17902a44`(P0.2): `pattern2/api/` で入口SSOT物理固定 +- **詳細**: `docs/development/current/main/phases/phase-263/README.md` + +## 2025-12-21:Phase 264 P0(EdgeCFG Fragment 入口作成)✅ + +**目的**: Frag/ExitKind を一次概念にする入口APIを用意(実装置換は次フェーズ) + +**完了内容**: +- 入口フォルダ作成: `src/mir/builder/control_flow/edgecfg/api/` +- コア型定義: `ExitKind`, `EdgeStub`, `Frag` +- 合成関数シグネチャ: `seq`, `if_`, `loop_`, `cleanup`(中身TODO) +- 最小テスト: 3個のユニットテスト追加 +- ドキュメント連動: `edgecfg-fragments.md` に入口情報追記 + +**重要**: 既存実装(pattern6/7/8, merge/EdgeCFG)は未改変。 +入口だけ固定し、適用は quick 復旧後の次フェーズで実施。 + +**次のステップ**: +- Phase 265: Pattern8 を Frag 合成に移行(最小適用) +- Phase 266: Pattern6/7 への展開(再利用確認) + +**詳細**: `docs/development/current/main/phases/phase-264/README.md` + `docs/development/current/main/design/edgecfg-fragments.md` + +## 2025-12-21:Phase 265 P0(compose/verify 最小実装)✅ + +**目的**: 入口SSOTを触って迷子防止(compose/verify の形を固める) + +**完了内容**: +- `compose::loop_()` 最小実装(exit集合の分類のみ、配線はP1以降) +- `verify_frag_invariants()` 最小実装(デバッグガード付き) +- compose::loop_() のユニットテスト 2個追加 + +**重要**: Pattern8への適用はP0ではやらない(偽Fragを避ける)。 +配線ロジックはP1で実装、Pattern8適用もP1から。 + +**次のステップ**: +- Phase 265 P1: 配線ロジック実装 + Pattern8適用 +- Phase 265 P2: seq/if_ 実装(pattern番号分岐削減の見通し) + +**詳細**: `docs/development/current/main/phases/phase-265/README.md` + +## 2025-12-21:Phase 265 P1(compose 配線ロジック実装)✅ + +**目的**: Frag/ExitKind が BasicBlockId 層で配線できることを証明 + +**完了内容**: +- EdgeStub に `target: Option` 追加 +- compose::loop_() 配線ロジック実装(Continue → header, Break → after) +- verify_frag_invariants() 配線契約検証追加 +- test-only PoC で実証完了(5個のテスト: 既存2個更新 + 新規3個追加) + +**配線契約**: +- Continue(loop_id) の EdgeStub.target = Some(header) +- Break(loop_id) の EdgeStub.target = Some(after) +- Normal/Return/Unwind の EdgeStub.target = None(上位へ伝搬) + +**重要**: +- MIR 命令生成はまだしない(Frag 層の配線能力証明に集中) +- NormalizedShadow/JoinIR層への適用は Phase 266 に繰り越し(層境界を守る) + +**次のステップ**: +- Phase 265 P2: seq/if_ 実装(順次合成・条件分岐合成) +- Phase 266: JoinIR-VM Bridge 改修後、NormalizedShadow への適用 + +**詳細**: `docs/development/current/main/phases/phase-265/README.md` + +## Next (planned) + +- Phase 265(planned): Pattern8 を Frag 合成に移行し、ExitKind+Frag の実装適用を開始(`compose::loop_` 実装) +- Phase 266(planned): catch/cleanup / cleanup/defer / async を "exit-edge 正規化" で追加できる形へ(設計: `docs/development/current/main/design/exception-cleanup-async.md`) +- Phase 141 P2+: Call/MethodCall 対応(effects + typing を分離して段階投入、ANF を前提に順序固定) +- Phase 143-loopvocab P3+: 条件スコープ拡張(impure conditions 対応) +- 詳細: `docs/development/current/main/30-Backlog.md` + +## Phase 260(大工事)ロードマップ(要約) + +- P0: edge-args を MIR terminator operand として **併存導入**(Branch を含むので参照点は `out_edges()` 系に一本化) +- P1: terminator更新APIを一本化し、successors/preds 同期漏れを構造で潰す +- P2: `BasicBlock.jump_args` を削除(terminator operand を SSOT 化) +- P3: spans を `Vec>` に収束(段階導入) + +## Phase 261 P0 チェックリスト(legacy-only 経路の棚卸し) + +- `src/mir/basic_block.rs:119` — reason: legacy layout の初期値が None(空メタ); expected: OK(legacy 未設定時の既定) +- `src/mir/basic_block.rs:239` — reason: out_edges が legacy fallback を持つ; expected: Jump/Branch で edge-args を書く経路を増やし、verify で legacy-only を検出 +- `src/mir/basic_block.rs:254` — reason: legacy setter API; expected: writer 側は edge-args を併記する経路に統一 +- `src/mir/basic_block.rs:281` — reason: legacy edge-args 生成 API; expected: read-side の移行完了後に削除(P2) +- `src/mir/basic_block.rs:337` — reason: legacy edge-args fallback; expected: verify で legacy-only を検出し、P2で撤去 + +## Current First FAIL (SSOT) + +- **After Phase 260 P0.3**: `core_direct_array_oob_set_rc_vm / Stage-B compile / JoinIR Pattern2 LoopBodyLocal(seg)` + +### FAIL Details (既知・Phase 260 scope外) + +- **Test**: `core_direct_array_oob_set_rc_vm` +- **Status**: **既知 / Phase 260 scope外**(JoinIR Pattern2 LoopBodyLocal promotion 未実装) +- **Phase**: Stage‑B compile (`stageb_compile_to_json`) +- **Error**: `[cf_loop/pattern2] Cannot promote LoopBodyLocal variables ["seg"]: No promotable pattern detected (tried A-3 Trim, A-4 DigitPos); read-only-slot rejected: [joinir/freeze] [pattern2/body_local_slot/contract/not_readonly] 'seg' must be read-only (assignment detected in loop body)` +- **Expected**: Stage-B compile succeeds (bundle_resolver loop compiles) +- **Actual**: MIR compilation error (LoopBodyLocal "seg" cannot be promoted - A-3/A-4 patterns not detected) +- **Reproduce**: + ```bash + ./tools/smokes/v2/run.sh --profile quick + # または + bash tools/smokes/v2/profiles/quick/core/core_direct_array_oob_set_rc_vm.sh + ``` +- **Root Cause**: Pattern2 の LoopBodyLocal promotion(A-3 Trim / A-4 DigitPos)に依存しており、Stage‑B の bundle_resolver 系のループで露出している。 +- **Next Action**: **Phase 260 完了**(P0.3まで完了)→ **今後は機能側のPhaseへ**(Pattern2 LoopBodyLocal promotion 機能実装) +- **分類**: JoinIR Pattern2 機能拡張(compiler機能側、CFG基盤整備は完了) + +### 次の次(構造で迷子を潰す) + +Phase 263(Pattern2 LoopBodyLocal “seg”)が片付いたら、Pattern2 の「Reject/continue/fallback の揺れ」を構造で潰す。 + +- ねらい: “Reject でも続行して後段で落ちる” を型/APIで不可能にする +- 方針(最小): + - `PromoteStepBox::try_promote(...) -> Result` + - `PromoteDecision::{Promoted, NotApplicable, Freeze}` + - orchestrator が `NotApplicable` を受け取ったら **Pattern2 全体を `Ok(None)` で抜けて fallback**(SSOT) + - “部分続行” を禁止(Fail-Fast/SSOTを維持) + +## 2025-12-21:Phase 260 P2(BasicBlock.jump_args 完全削除)✅ + +- **EdgeCFG SSOT確立完了**: `BasicBlock.jump_args` フィールド削除、edge-args SSOTをterminator operand側に一本化 +- **フィールド変更**: `jump_args` → `return_env`(Return専用metadata、terminator operandなし) +- **API簡略化**: legacy helper 8個削除、terminator更新API保持(successors同期漏れ防止) +- **Verification簡素化**: dual-source検証削除(cfg.rs 62行削除) +- **テスト結果**: + - cargo test --lib: 1368 PASS + - quick smoke: 45/46 PASS + - phase258 tail call: PASS(Return env保持確認) +- **検証**: `rg 'jump_args' src/` = 0件(コメント除く) +- **修正ファイル**: 9ファイル(basic_block.rs、handlers 4件、verification、test) +- **詳細**: `docs/development/current/main/phases/phase-260/README.md` + +## 2025-12-21:Phase 260 P0.2/P0.3(モジュール化大工事)✅ + +- **P0.2**: instruction_rewriter モジュール化 + - Commits: `cbed040a7`, `aa3fdf3c1`, `c2e8099ff`, `84cd653ae`, `875bfee1b`, `666de9d3e` + - 抽出: exit_collection, block_allocator, merge_variable_handler, call_generator, handlers/(8ファイル) +- **P0.3**: joinir_block_converter モジュール化 + - Commits: `e7f9adcfe`, `2c01a7335` + - Phase 1: terminator_builder, block_finalizer + - Phase 2: handlers/(call, jump, conditional_method_call, if_merge, nested_if_merge) + - **成果**: 15モジュール、約3941行、53単体テスト全てpass、45/46統合テストpass +- **SSOT維持確認**: jump_args直参照ゼロ、out_edges()/edge_args_to() SSOT維持 +- **詳細**: `docs/development/current/main/phases/phase-260/README.md` + +## 2025-12-20:Phase 260 P0/P0.1(edge-args Strangler)✅ + +- P0: MIR terminator の edge-args 併存導入(読む側 SSOT を `out_edges()`/`edge_args_to()` へ寄せた) +- P0.1: legacy layout の未設定を禁止(verify fail-fast)+ terminator 直代入を `set_terminator*()` へ寄せた +- Commits: + - P0: `4dfe3349b` + - P0.1: `1fe5be347` + +## 2025-12-21:Phase 259 P0(Pattern8 BoolPredicateScan)✅ + +- Phase 259 README: `docs/development/current/main/phases/phase-259/README.md` +- Result: `StringUtils.is_integer/1` を Pattern8(新規)で受理 +- Fixtures: + - `apps/tests/phase259_p0_is_integer_min.hako`(expected exit 7) +- Smokes: + - `tools/smokes/v2/profiles/integration/apps/phase259_p0_is_integer_vm.sh` ✅ PASS + - `tools/smokes/v2/profiles/integration/apps/phase259_p0_is_integer_llvm_exe.sh`(LLVM harness 要設定) +- Key Implementation: + - `src/mir/builder/control_flow/joinir/patterns/pattern8_scan_bool_predicate.rs`(新規) + - `src/mir/join_ir/lowering/scan_bool_predicate_minimal.rs`(新規) +- Design Decision: Pattern8 を新設(Pattern6 拡張ではなく分離) + - Pattern6: "見つける" scan(返り値: Integer) + - Pattern8: "全部検証する" predicate scan(返り値: Boolean) +- Note: json_lint_vm はまだ FAIL だが、is_integer 自体は解決済み。残りは nested-loop with break パターン(Pattern2 の別問題) + +## 2025-12-20:Phase 258(index_of_string/2 dynamic window scan)✅ + +- Phase 258 README: `docs/development/current/main/phases/phase-258/README.md` +- Result: `index_of_string/2` を JoinIR で受理し、quick の first FAIL を `is_integer/1` へ進めた + +## 2025-12-20:Phase 257(Pattern6 reverse scan + PHI/CFG stabilization)✅ + +- Phase 257 README: `docs/development/current/main/phases/phase-257/README.md` +- Result: `last_index_of/2` を Pattern6(reverse scan)で受理し、PHI predecessor mismatch を fail-fast + 自動補正で根治 + +## 2025-12-19:Phase 146/147 完了 ✅ + +- Phase 146 README: `docs/development/current/main/phases/phase-146/README.md` +- Fixtures: + - `apps/tests/phase146_p0_if_cond_unified_min.hako`(P0: pure cond, expected exit 7) + - `apps/tests/phase146_p1_if_cond_intrinsic_min.hako`(P1: `s.length() == 3`, expected exit 7) +- Smokes: + - `tools/smokes/v2/profiles/integration/apps/phase146_p0_if_cond_unified_vm.sh` + - `tools/smokes/v2/profiles/integration/apps/phase146_p0_if_cond_unified_llvm_exe.sh` + - `tools/smokes/v2/profiles/integration/apps/phase146_p1_if_cond_intrinsic_vm.sh` + - `tools/smokes/v2/profiles/integration/apps/phase146_p1_if_cond_intrinsic_llvm_exe.sh` +- Flags: + - `HAKO_ANF_DEV=1`(dev-only: ANF routing 有効化) + - `HAKO_ANF_ALLOW_PURE=1`(dev-only: PureOnly scope で ANF 有効化) + +## 2025-12-19:Phase 251 Fix(JoinIR 条件変数抽出 / デバッグ出力整理)✅ + +- Phase 251 README: `docs/development/current/main/phases/phase-251/README.md` +- Fix: + - `collect_variables_recursive()` を拡張し、`MethodCall/FieldAccess/Index/Call` の基底変数を ConditionEnv に登録できるようにした + - `loop_with_if_phi_if_sum.rs` の無条件 `eprintln!` を `is_joinir_debug()` ガードに移した(デフォルトは clean output) +- Status: + - 元の回帰(`arr.length()` の `arr` が ConditionEnv に入らない): 解決 + - `--profile quick` の `json_lint_vm` は別件で失敗が残る(JoinIR Pattern2 の break 条件で `MethodCall` が未対応) + +## 2025-12-19:Phase 252 P0/P1(Pattern2 break 条件: `this.methodcall`)✅ + +- Phase 252 README: `docs/development/current/main/phases/phase-252/README.md` +- Status: + - `cargo check` は通過(0 errors) + - `--profile quick` は次の FAIL が残る → Phase 253(`[joinir/mutable-acc-spec]`) + +## 2025-12-19:Phase 255(Multi-param loop wiring)✅ + +- Phase 255 README: `docs/development/current/main/phases/phase-255/README.md` +- Status: + - Pattern6/index_of が VM/LLVM で PASS + - `loop_invariants` を導入して ConditionOnly 誤用を根治 + +## 2025-12-19:Phase 256(StringUtils.split/2 可変 step ループ)✅ + +- Phase 256 README: `docs/development/current/main/phases/phase-256/README.md` +- Status: + - `StringUtils.split/2` は VM `--verify` / integration smoke まで PASS + - `--profile quick` の最初の FAIL は Phase 257(`StringUtils.last_index_of/2`)へ移動 + - 設計SSOT: `docs/development/current/main/design/join-explicit-cfg-construction.md` +- 直近の主要fix: + - `ValueId(57)` undefined は根治(原因は `const_1` 未初期化)。 + - SSA undef(`%49/%67`)は P1.7 で根治(continuation 関数名の SSOT 不一致)。 + - P1.8で ExitLine/jump_args の余剰許容と関数名マッピングを整流。 + - P1.9で `JoinInst::Jump` を tail call として bridge に落とし、`jump_args` を SSOT として保持。 + - P1.10で DCE が `jump_args` を used 扱いし、`instruction_spans` を同期(SPAN MISMATCH 根治)。 + - P1.11で ExitArgsCollector の expr_result slot 判定を明確化し、split が `--verify` / integration smoke まで PASS。 + - P1.5-DBG: boundary entry params の契約チェックを追加(VM実行前 fail-fast)。 + - P1.6: 契約チェックの薄い集約 `run_all_pipeline_checks()` を導入(pipeline の責務を縮退)。 + - P1.13: Pattern2 boundary entry params を `join_module.entry.params` SSOT へ寄せた(ValueId 推測生成の撤去)。 + - P1.13.5(= Phase 256.8.5): Boundary SSOT 統一(Pattern4/6/7 横展開 + hardcoded ValueId/PARAM_MIN 撤去)。 + - Known issue(非ブロッカー): Pattern7 integration smoke の `phi predecessor mismatch` は残存(今回の修正とは独立)。 + +## 2025-12-20:Phase 257(last_index_of early return loop)🔜 + +- Phase 257 README: `docs/development/current/main/phases/phase-257/README.md` +- Goal: `StringUtils.last_index_of/2` を JoinIR で受理し、`--profile quick` を緑に戻す + - Investigation(最小再現/論点): `docs/development/current/main/investigations/phase-257-last-index-of-loop-shape.md` + - Status: Pattern6 reverse scan + PHI/CFG 安定化は完了(最初の FAIL は次へ移動) + - Current first FAIL: `json_lint_vm / StringUtils.index_of_string/2`(dynamic window scan, unsupported) + +## 2025-12-20:Phase 258(is_integer nested-if + loop)🔜 + +- Phase 258 README: `docs/development/current/main/phases/phase-258/README.md` + - Status: `index_of_string/2` を対象(dynamic window scan) + +## 2025-12-20:Phase 259(is_integer nested-if + loop)🔜 + +- Phase 259 README: `docs/development/current/main/phases/phase-259/README.md` + +## 2025-12-19:Phase 254(index_of loop pattern)✅ 完了(Blocked by Phase 255) + +- Phase 254 README: `docs/development/current/main/phases/phase-254/README.md` +- Status: **Pattern 6 実装完了、ただし実行失敗(Phase 255 で unblock)** +- 完了項目: + - ✅ Pattern 6 DetectorBox 実装(`Pattern6_ScanWithInit MATCHED`) + - ✅ extract_scan_with_init_parts() - 構造抽出 + - ✅ scan_with_init_minimal.rs - JoinIR lowerer(main/loop_step/k_exit 生成) + - ✅ MirBuilder 統合 - boundary 構築と merge 実行 + - ✅ substring を BoxCall として init-time に emit +- ブロッカー: + - JoinIR→MIR merge/boundary が複数ループ変数(s, ch, i)に未対応 + - PHI ノードが 1つしか作られず、undefined value エラー +- **Phase 254 の受け入れ境界**: Pattern 6 検出+JoinIR 生成まで ✅ +- **実行 PASS は Phase 255 の範囲** + +## 2025-12-19:Phase 253(mutable-acc-spec)✅ + +- Phase 253 README: `docs/development/current/main/phases/phase-253/README.md` +- Goal: `--profile quick` を緑に戻す(対処療法なし、analyzer 契約の整理で直す) + +## 2025-12-19:Phase 145-anf P0/P1/P2 完了 ✅ + +- SSOT docs: + - `docs/development/current/main/phases/phase-145-anf/README.md` + - `docs/development/current/main/phases/phase-144-anf/INSTRUCTIONS.md` +- 実装 SSOT: + - `src/mir/control_tree/normalized_shadow/anf/` + - 入口(接続箇所 SSOT): `src/mir/control_tree/normalized_shadow/common/expr_lowerer_box.rs` +- 環境変数: + - `HAKO_ANF_DEV=1`(dev-only: ANF 有効化) + - `HAKO_ANF_STRICT=1`(dev-only: ANF fail-fast) +- Fixtures & smokes(VM/LLVM EXE parity): + - `apps/tests/phase145_p1_anf_length_min.hako` → exit 12 + - `apps/tests/phase145_p2_compound_expr_binop_min.hako` → exit 18 + - `apps/tests/phase145_p2_compound_expr_double_intrinsic_min.hako` → exit 5 + +## 2025-12-19:Phase 143-loopvocab P2 完了 ✅ + +- 対象: else 対称化(B-C / C-B) +- Fixtures & smokes(VM/LLVM EXE parity): + - `apps/tests/phase143_p2_loop_true_if_bc_min.hako` → exit 8 + - `apps/tests/phase143_p2_loop_true_if_cb_min.hako` → exit 9 + +## 2025-12-19:Phase 143 実行系契約修正 ✅ + +**問題**: normalized_helpers が env params を `ValueId(1,2...)` で割り当てていた(PHI Reserved 領域 0-99)。 + +**根本原因**: JoinValueSpace 契約では Param 領域は 100-999。4つの normalized shadow モジュールが全て間違った領域に params を割り当てていた。 + +**修正**: +- `NormalizedHelperBox::alloc_env_params_param_region()` 新規追加(100+ 開始) +- 4 ファイルの normalized shadow 生成を更新: + - `loop_true_if_break_continue.rs` + - `loop_true_break_once.rs` + - `if_as_last_join_k.rs` + - `post_if_post_k.rs` +- `instruction_rewriter.rs` 型ミスマッチ修正(`func.signature.params` → `func.params`) + +**検証**: +- VM exit=7 ✅(phase143_loop_true_if_break_vm.sh PASS) +- LLVM EXE exit=7 ✅(phase143_loop_true_if_break_llvm_exe.sh PASS、timeout 解消) +- Unit tests: 69/69 PASS + +**ValueId Space Contract (Phase 201)**: +| Region | Range | Purpose | +|--------|-------|---------| +| PHI Reserved | 0-99 | Loop header PHI dst | +| **Param** | **100-999** | **env params (flag, counter, etc.)** | +| Local | 1000+ | Const, BinOp, condition results | + +## 2025-12-19:Phase 143.5 + P1 完了 ✅ + +**Phase 143.5: NormalizedHelperBox 箱化(リファクタリング)** +- 目的: 120+ 行のヘルパー関数重複を消去(4 ファイル共通化) +- 実装: `src/mir/control_tree/normalized_shadow/common/normalized_helpers.rs` (151行+6テスト) +- 効果: 136行追加 - 149行削除 = **-13行**(保守性大幅向上) +- 統計: 67/67 tests PASS(新規テスト 6個含む) +- 検証: cargo check 0 errors, cargo test 100% green + +**Phase 143 P1: Continue Support(条件付きループ継続)** +- 目的: `loop(true) { if(cond_pure) continue }` パターン追加 +- 実装: Loop-If-Exit contract enum 駆動(break/continue 弁別) +- 変更: + - `extract_pattern_shape()`: Err-based pattern matching to LoopIfExitShape + - `extract_exit_action()`: Break/Continue を enum variant として識別 + - `loop_cond_check`: match shape.then で Jump target を動的決定 +- Fixtures & Tests: + - `apps/tests/phase143_loop_true_if_continue_min.hako` + - `tools/smokes/v2/profiles/integration/apps/phase143_loop_true_if_continue_vm.sh` + - `tools/smokes/v2/profiles/integration/apps/phase143_loop_true_if_continue_llvm_exe.sh` +- 検証: 契約ベース(shape.validate_for_p1() で P1 制約チェック) +- 注記: Phase 131 Pattern matching Issue 既知(ルーティング層の pre-existing failure) + +## 2025-12-19:Phase 143-loopvocab P0 完了 ✅ + +**Phase 143-loopvocab P0: Conditional Break Vocabulary Extension** +- 目的: `loop(true) { if(cond_pure) break }` パターンを Normalized shadow で実装(Phase 131 の条件付き拡張) +- 仕様: + - Loop条件: `true` リテラルのみ + - ループ本体: 単一 if statement(else なし) + - If then: `break` のみ(no continue, no nested if) + - 条件: pure expression のみ(変数/リテラル/算術/比較、Method call なし) + - Out-of-scope は `Ok(None)` で graceful fallback +- 実装 SSOT: + - `src/mir/control_tree/normalized_shadow/loop_true_if_break_continue.rs` + - 6-function JoinModule(main → loop_step → loop_cond_check → Jump/Call → k_exit → Ret) + - Jump: if true → k_exit, if false → fall through to Call(loop_step) +- Fixtures: + - `apps/tests/phase143_loop_true_if_break_min.hako`(expected exit code 7) +- Smoke tests: + - VM: `tools/smokes/v2/profiles/integration/apps/phase143_loop_true_if_break_vm.sh` ✅ PASS + - LLVM EXE: `tools/smokes/v2/profiles/integration/apps/phase143_loop_true_if_break_llvm_exe.sh` ✅ PASS +- Regression: Phase 131-142 green(no regressions) +- 統計: +400 lines(loop_true_if_break_continue.rs), 0 change to existing code +- 入口: `docs/development/current/main/phases/phase-143-loopvocab/README.md` + +## 2025-12-19:Phase 142-loopstmt P0 完了 ✅ + +**Phase 142-loopstmt P0: Statement-Level Loop Normalization** +- 目的: 正規化単位を "block suffix" から "statement (loop 1個)" へ寄せてパターン爆発を防ぐ +- 変更: + - PlanBox: loop(true) に対して常に loop_only() を返す(consumed=1) + - SuffixRouter: LoopOnly を受け入れて実行 + - build_block: consumed 後も後続文を処理(break 削除) +- 実装 SSOT: + - `src/mir/builder/control_flow/normalization/plan_box.rs` + - `src/mir/builder/control_flow/joinir/patterns/policies/normalized_shadow_suffix_router_box.rs` + - `src/mir/builder/stmts.rs` +- Refactoring: + - LoopWithPost variant を deprecated(4 commits) + - suffix_router コメント更新 + - README 更新 +- Tests: + - Fixture: `apps/tests/phase142_loop_stmt_only_then_return_length_min.hako`(exit code 3) + - VM smoke: ✅ PASS + - Unit tests: ✅ 10/10 passed + - Regression: ✅ Phase 131, 141 green +- 統計: -38 lines net (code reduction success!) +- 入口: `docs/development/current/main/phases/phase-142-loopstmt/README.md` + +⚠️ **Note**: Phase 142 (Canonicalizer Pattern Extension) とは別物。SSOT 衝突回避のため phase-142-loopstmt として独立管理。 + +## 2025-12-19:Phase 141 P1.5 完了 ✅ + +**Phase 141 P1.5: KnownIntrinsic registry + available_inputs 3-source merge + diagnostics** +- 目的: “既知 intrinsic だけ” を SSOT 化しつつ、suffix 正規化が prefix の変数を見失わないようにする(既定挙動不変)。 +- Task B(バグ修正): `AvailableInputsCollectorBox::collect(.., prefix_variables)` を追加し、Function params > Prefix variables > CapturedEnv の 3-source merge に変更 +- Task A(SSOT化): `KnownIntrinsicRegistryBox` を追加し、intrinsic の metadata(name/arity/type_hint)を `known_intrinsics.rs` に集約 +- Task C(診断): `OutOfScopeReason::IntrinsicNotWhitelisted` を追加し、Call/MethodCall の out-of-scope 理由を精密化 +- 実装 SSOT: + - `src/mir/control_tree/normalized_shadow/available_inputs_collector.rs` + - `src/mir/control_tree/normalized_shadow/common/known_intrinsics.rs` + - `src/mir/control_tree/normalized_shadow/common/expr_lowerer_box.rs` + - `src/mir/control_tree/normalized_shadow/common/expr_lowering_contract.rs` + - `src/mir/builder/control_flow/normalization/execute_box.rs` +- 設計 SSOT: + - `docs/development/current/main/design/normalized-expr-lowering.md` + +## 2025-12-19:Phase 141 P1 完了 ✅ + +**Phase 141 P1: KnownIntrinsicOnly (length0)** +- 目的: impure 導入の安全なオンランプとして、既知 intrinsic(小さな allowlist)のみを ExprLowerer に追加 +- 仕様: + - `ExprLoweringScope::WithImpure(ImpurePolicy::KnownIntrinsicOnly)` でのみ `receiver.length()` を lowering + - それ以外の Call/MethodCall は引き続き `Ok(None)`(既定挙動不変) +- Fixture: + - `apps/tests/phase141_p1_if_only_post_k_return_length_min.hako`(expected exit code 3) +- Smoke tests: + - VM: `tools/smokes/v2/profiles/integration/apps/phase141_p1_if_only_post_k_return_length_vm.sh` + - LLVM EXE: `tools/smokes/v2/profiles/integration/apps/phase141_p1_if_only_post_k_return_length_llvm_exe.sh` +- 入口: `docs/development/current/main/phases/phase-141/README.md` + +## 2025-12-19:Phase 141 P0 完了 ✅ + +**Phase 141 P0: Impure Extension Contract (Call/MethodCall stays out-of-scope)** +- 目的: 次フェーズの Call/MethodCall 導入に向けて、pure/impure 境界の contract(SSOT)を型で固定 +- SSOT: + - `src/mir/control_tree/normalized_shadow/common/expr_lowering_contract.rs` + - `src/mir/control_tree/normalized_shadow/common/expr_lowerer_box.rs` +- 仕様: Call/MethodCall は引き続き `Ok(None)`(既定挙動不変) +- 入口: `docs/development/current/main/phases/phase-141/README.md` + +## 2025-12-19:Phase 140 完了 ✅ + +**Phase 140: NormalizedExprLowererBox (pure expressions)** +- 目的: “return の形追加” をやめて、pure expression を AST walker で一般化して収束させる +- SSOT: + - `src/mir/control_tree/normalized_shadow/common/expr_lowerer_box.rs` + - `src/mir/control_tree/normalized_shadow/common/return_value_lowerer_box.rs` +- 仕様: + - pure のみ(Variable / Integer&Bool literal / unary(not,-) / arith(+,-,*,/) / compare(==,!=,<,<=,>,>=)) + - Call/MethodCall など impure は `Ok(None)`(Phase 141+) +- 入口: `docs/development/current/main/phases/phase-140/README.md` + +## 2025-12-19:Phase 139 完了 ✅ + +**Phase 139: post-if `post_k` Return Lowering Unification** +- 目的: if-only `post_k` 側の return lowering を `ReturnValueLowererBox` に統一し、loop/if の出口を一本化 +- 実装: + - `src/mir/control_tree/normalized_shadow/post_if_post_k.rs` の return lowering を `ReturnValueLowererBox::lower_to_value_id()` に委譲 + - out-of-scope は `Ok(None)` でフォールバック(既定挙動不変・dev-only) +- Fixture: + - `apps/tests/phase139_if_only_post_k_return_add_min.hako`(expected exit code 4) +- Smoke tests: + - VM: `tools/smokes/v2/profiles/integration/apps/phase139_if_only_post_k_return_add_vm.sh` + - LLVM EXE: `tools/smokes/v2/profiles/integration/apps/phase139_if_only_post_k_return_add_llvm_exe.sh` +- 入口: `docs/development/current/main/phases/phase-139/README.md` + +## 2025-12-18:Phase 138 完了 ✅ + +**Phase 138: ReturnValueLowererBox - Return Lowering SSOT** +- 目的: Return lowering logic を共有 Box として抽出し SSOT を確立 +- 実装: + - Created `common/return_value_lowerer_box.rs` (~300 lines) + - Migrated `loop_true_break_once.rs` to use Box (2 call sites) + - 5 comprehensive unit tests for all patterns + - Code reduction: ~115 lines removed from loop_true_break_once.rs +- SSOT: + - `ReturnValueLowererBox::lower_to_value_id()` + - Supported: Variable, Integer literal, Add expression (x + 2, 5 + 3) + - Fallback: Out-of-scope patterns return `Ok(None)` +- Tests: + - 5 new unit tests: variable, integer literal, add (var+int), add (int+int), fallback (subtract) + - All regressions PASS: Phase 137/97/131/135/136 +- Design Decision: + - Phase 138 P0 migrated loop paths only + - Phase 139 P0 will unify post_if_post_k.rs for complete SSOT +- Architecture Impact: + - Single location for return lowering improvements + - Isolated unit tests for return lowering logic + - Easy to add new return patterns in one location +- 入口: `docs/development/current/main/phases/phase-138/README.md` + +--- + +## 2025-12-18:Phase 137 完了 ✅ + +**Phase 137: loop(true) break-once with return add expression** +- 目的: Phase 136 を拡張し、return 時に最小 add 式をサポート +- 仕様: + - `return x + 2`(variable + integer literal)→ exit code 3 + - `return 5 + 3`(integer literal + integer literal)→ exit code 8 + - `loop(true) { x = 1; break }; x = x + 10; return x + 2` → exit code 13 +- 実装: + - `src/mir/control_tree/normalized_shadow/loop_true_break_once.rs`(`lower_return_value_to_vid()` 行 638-743, BinaryOp Add at 行 673) + - BinaryOp Add パターン追加(LHS: Variable or Integer literal, RHS: Integer literal only) + - Ok(None) fallback for out-of-scope patterns(`return x + y`, `return x - 2` 等) +- Return Value Lowering SSOT: + - Documentation: `loop_true_break_once.rs`(行 29-46, module-level comment) + - Boxification trigger: 2+ files で同一 return lowering logic が必要になった時 +- Fixtures: + - `phase137_loop_true_break_once_return_add_min.hako`(期待: exit code 3) + - `phase137_loop_true_break_once_return_add_const_min.hako`(期待: exit code 8) + - `phase137_loop_true_break_once_post_return_add_min.hako`(期待: exit code 13) +- Smoke tests: + - VM: 3/3 PASS + - LLVM EXE: 3/3 PASS +- Regression: + - Phase 97: 2/2 PASS(next_non_ws, json_loader_escape) + - Phase 131/135/136: 3/3 PASS +- 設計判断(Approach A 採用): + - 直接拡張(boxification なし)、変更スコープ小 + - post_if_post_k.rs は未変更(責任分離) +- 入口: `docs/development/current/main/phases/phase-137/README.md` + +--- + +## 2025-12-18:Phase 136 完了 ✅ + +**Phase 136: loop(true) break-once with return literal** +- 目的: Phase 131-135 を拡張し、return integer literal をサポート +- 仕様: + - `loop(true) { x = 1; break }; return 7` → exit code 7 + - `loop(true) { x = 1; break }; x = x + 2; return 7` → exit code 7 + - PHI禁止維持、dev-only、既定挙動不変 +- 実装: + - `src/mir/control_tree/normalized_shadow/loop_true_break_once.rs`(`lower_return_value_to_vid()` 行 638-743, Integer literal at 行 661) + - Integer literal パターン: Const generation(Phase 123 パターン再利用) + - Ok(None) fallback for out-of-scope patterns(`return "hello"`, `return 3.14` 等) +- Fixtures: + - `phase136_loop_true_break_once_return_literal_min.hako`(期待: exit code 7) + - `phase136_loop_true_break_once_post_return_literal_min.hako`(期待: exit code 7) +- Smoke tests: + - VM: 2/2 PASS + - LLVM EXE: 2/2 PASS +- Regression: + - Phase 131: 2/2 PASS + - Phase 135: 2/2 PASS +- 入口: `docs/development/current/main/phases/phase-136/README.md` + +--- + +## 2025-12-18:Phase 135 P0 完了 ✅ + +**Phase 135 P0: Normalization Plan Suffix Detection Generalization** +- 目的: NormalizationPlanBox の suffix 検出を一般化し、post-loop assign が 0 回でも OK に +- 背景: + - Phase 133 までは `loop + assign+ + return`(assign 1回以上必須) + - Phase 131 は `loop` のみ(return なし) + - ギャップ: `loop + return`(0 assign)が別経路 +- 改善: + - `loop + assign* + return`(N >= 0 assignments)を統一パターンとして検出 + - Phase 131 と Phase 132-133 を `LoopWithPost { post_assign_count }` enum で統一 + - Phase 131 (loop-only, no return) は `PlanKind::LoopOnly` として独立維持 +- 実装: + - `src/mir/builder/control_flow/normalization/plan_box.rs`(検出ロジック修正のみ) + - `post_assign_count >= 1` チェックを削除 → `>= 0` を許容 + - `execute_box.rs` は変更なし(既存ロジックが 0 assigns を自然にサポート) +- Fixture: `apps/tests/phase135_loop_true_break_once_post_empty_return_min.hako`(期待: exit code 1) +- Smoke tests: + - `phase135_loop_true_break_once_post_empty_return_vm.sh` PASS + - `phase135_loop_true_break_once_post_empty_return_llvm_exe.sh` PASS +- Regression: + - Phase 131: 2/2 PASS(VM + LLVM EXE) + - Phase 133: 2/2 PASS(VM + LLVM EXE) +- Unit tests: 9/9 PASS(plan_box module) +- 設計原則: + - **最小変更**: plan_box.rs の検出条件のみ変更 + - **SSOT 維持**: 検出ロジックは plan_box.rs に集約 + - **Box-First**: PlanBox(what)と ExecuteBox(how)の責任分離維持 +- 入口: `src/mir/builder/control_flow/normalization/README.md`(Phase 135 セクション追加) + +## 2025-12-18:Phase 133 完了 ✅ + +**Phase 133: loop(true) break-once + multiple post-loop assigns(dev-only)** +- 目的: Phase 132 を拡張し、post-loop で複数の assign を受理(PHI-free 維持) +- 仕様: + - `loop(true) { x = 1; break }; x = x + 2; x = x + 3; return x` は exit code `6`(VM/LLVM EXE parity) + - post_nodes 検出を `len() == 2` から `len() >= 2` に拡張 + - 複数 assign を iterative に lower(LegacyLowerer::lower_assign_stmt 再利用) +- 実装: + - `src/mir/control_tree/normalized_shadow/loop_true_break_once.rs`(3箇所編集、~30行追加) + - Pattern detection: all_assigns + ends_with_return + - Post-loop lowering: for loop で複数 assign 処理 + - SSOT: env_post_k が最終値を保持(ExitMeta に反映) +- Fixture: `apps/tests/phase133_loop_true_break_once_post_multi_add_min.hako`(期待: 6) +- Smoke: + - `phase133_loop_true_break_once_post_multi_add_vm.sh` PASS + - `phase133_loop_true_break_once_post_multi_add_llvm_exe.sh` PASS +- Regression: Phase 132/131/97 維持確認(全 PASS) +- Unit tests: 1176/1176 PASS +- 入口: `docs/development/current/main/phases/phase-133/README.md` + +## 2025-12-18:Phase 130 完了 ✅ + +**Phase 130: if-only Normalized "Small Expr/Assign" Expansion(dev-only)** +- 目的: post_k 内の最小 post-if 計算(`x = x + 3; return x`)を Normalized で通す(PHI禁止) +- 実装: + - P1: Assign(Variable) - `x = y` サポート(env map 直接更新) + - P2: Assign(Add) - `x = x + ` サポート(Const + BinOp Add) + - P3: Verifier - env map が env layout(writes + inputs)外の変数を導入しないことを検証 + - `src/mir/control_tree/normalized_shadow/legacy/mod.rs` (lower_assign_stmt 拡張) + - `src/mir/control_tree/normalized_shadow/normalized_verifier.rs` (verify_env_writes_discipline 追加) +- Fixture: `apps/tests/phase130_if_only_post_if_add_min.hako`(期待出力: 5\n4) +- Smoke: `phase130_if_only_post_if_add_vm.sh` PASS +- LLVM EXE smoke: `phase130_if_only_post_if_add_llvm_exe.sh`(LLVM 前提が無い環境では SKIP) +- Regression: Phase 129/128 維持確認(全 PASS) +- Unit tests: 1155/1155 PASS +- 入口: `docs/development/current/main/phases/phase-130/README.md` + +## 2025-12-18:Phase 129-C 完了 ✅ + +**Phase 129-C: post-if / post_k continuation(dev-only)** +- post-if(`if { x=2 }; return x`)を post_k continuation で表現 +- join_k が env merge → TailCall(post_k, merged_env) +- post_k が post-if statements 実行 → Ret +- PHI禁止: Normalized IR 内に PHI 相当を入れず env 引数で合流 +- 実装: + - `src/mir/control_tree/normalized_shadow/post_if_post_k.rs`(392行、新規) + - `builder.rs` に PostIfPostKBuilderBox 統合 + - `normalized_verifier.rs` に post_k 構造検証追加 + - `parity_contract.rs` に StructureMismatch 追加 +- Fixture: `apps/tests/phase129_if_only_post_if_return_var_min.hako` +- Smoke: `phase129_if_only_post_if_return_var_vm.sh` PASS +- Regression: Phase 129-B, 128 維持確認(全 PASS) +- Unit tests: 1155/1155 PASS +- 入口: `docs/development/current/main/phases/phase-129/README.md` + +## 2025-12-18:Phase 132 完了 ✅ + +**Phase 132: loop(true) break-once + post-loop minimal(dev-only)** +- 目的: Phase 131 を拡張し、ループ後の最小 post 計算まで Normalized shadow で固定(PHI-free 維持) +- 仕様: + - `loop(true) { x = 1; break }; x = x + 2; return x` は exit code `3`(VM/LLVM EXE parity) + - post_k continuation で post-loop statements を処理 +- 実装: + - **P0**: post_k 生成(loop_true_break_once.rs 拡張) + - **P0.5**: StepTree が post-loop statements を保持(suffix router box 追加) + - **P1**: k_exit continuation 分類修正(構造ベースの判定) + - **R0**: Continuation SSOT 一本化 + legacy 隔離 + docs 整備 +- SSOT: + - `JoinInlineBoundary::default_continuations()` - continuation ID の集約 + - `src/mir/builder/control_flow/joinir/merge/README.md` - merge 契約明文化 + - `src/mir/builder/control_flow/joinir/legacy/README.md` - legacy 撤去条件 +- テスト配置: `src/mir/builder/control_flow/joinir/merge/tests/continuation_contract.rs` +- 検証: + - `bash tools/smokes/v2/profiles/integration/apps/phase132_loop_true_break_once_post_add_vm.sh` + - `bash tools/smokes/v2/profiles/integration/apps/phase132_loop_true_break_once_post_add_llvm_exe.sh` +- 回帰: Phase 131/97 維持確認(全 PASS) +- 入口: `docs/development/current/main/phases/phase-132/README.md` + +## 2025-12-18:Phase 131 P2 完了 ✅ + +**Phase 131: loop(true) break-once Normalized(dev-only)** +- 目的: Normalized shadow の最小ループを VM/LLVM EXE 両方で動かし、更新値が外に見えることまで固定 +- 仕様: + - `loop(true) { x = 1; break }; return x` は exit code `1` + - DirectValue mode(PHI-free)で exit 値を `variable_map` に再接続 +- 検証: + - `bash tools/smokes/v2/profiles/integration/apps/phase131_loop_true_break_once_vm.sh` + - `bash tools/smokes/v2/profiles/integration/apps/phase131_loop_true_break_once_llvm_exe.sh` +- 環境: WSL の一時的な EXDEV(`Invalid cross-device link`)は `wsl --shutdown` 再起動で解消、上記 + `phase97_next_non_ws_llvm_exe.sh` まで PASS +- 入口: `docs/development/current/main/phases/phase-131/README.md` + +## 2025-12-18:Phase 127 完了 ✅ + +**Phase 127: unknown-read strict Fail-Fast(dev-only)** +- unknown-read = reads - (writes ∪ inputs) を検出 +- strict: `freeze_with_hint("phase127/unknown_read/", ...)` で即停止(hint必須) +- dev-only non-strict: 理由ログ(tag + count + 先頭数件) +- 入口: `docs/development/current/main/phases/phase-127/README.md` + +## 2025-12-18:Phase 128 完了 ✅ + +**Phase 128: if-only partial assign keep/merge in Normalized (dev-only)** +- StepStmtKind::Assign に value_ast 追加(Phase 128) +- Normalized builder に Assign(int literal) 対応(env 更新) +- Fixture: phase128_if_only_partial_assign_normalized_min.hako(簡易版) +- Smoke: phase128_if_only_partial_assign_normalized_vm.sh(PASS) +- Regression: Phase 121-126, 118 維持確認(全 PASS) +- Unit tests: 1165/1165 PASS +- 入口: `docs/development/current/main/phases/phase-128/README.md` +- 実装: + - `src/mir/control_tree/step_tree.rs` (value_ast 追加、14行追加) + - `src/mir/control_tree/normalized_shadow/builder.rs` (Assign lowering、87行追加) +- Note: 完全な join_k continuation は future work(Phase 128 は基本構造確立) + +## 2025-12-18:Phase 126 完了 ✅ + +**Phase 126: available_inputs SSOT wiring (dev-only)** +- AvailableInputsCollectorBox 実装(function params + CapturedEnv 収集) +- try_lower_if_only() に available_inputs 配線(dev-only) +- EnvLayout.inputs が実際に使用されるようになった +- Fixture 強化: reads-only 変数の return 解決を確認 +- Regression: Phase 121-125, 118 維持確認(全 PASS) +- Unit tests: 28/28 PASS (including 5 new AvailableInputsCollectorBox tests) +- Integration smoke: PASS (phase125_if_only_return_input_vm.sh, exit code 7) +- 入口: `docs/development/current/main/phases/phase-126/README.md` +- 実装: + - `src/mir/control_tree/normalized_shadow/available_inputs_collector.rs` (143行、新規) + - `src/mir/control_tree/normalized_shadow/builder.rs` (available_inputs 配線) + - `src/mir/builder/calls/lowering.rs` (AvailableInputsCollectorBox::collect() 呼び出し) + +## 2025-12-18:Phase 125 P2-P5 完了 ✅ + +**Phase 125 P2-P5: Reads-Only Env Inputs (dev-only, structure)** +- EnvLayout 導入(writes + inputs の 2 レーン化) +- from_contract: reads ∩ available_inputs で inputs を決定(決定的順序) +- Return(Variable) 解決拡張: writes or inputs から解決 +- Fail-Fast with hint: env に無い変数は構造化エラー +- Unit tests: 18/18 PASS (including new test_return_variable_from_inputs_stub) +- Integration smoke: PASS (phase125_if_only_return_input_vm.sh, exit code 7) +- Regression: Phase 121-124, 118 維持確認(全 PASS) +- 入口: `docs/development/current/main/phases/phase-125/README.md` +- 実装: + - `src/mir/control_tree/normalized_shadow/builder.rs` (EnvLayout, 186行追加) +- Note: P3 (available_inputs wiring) 未実装、inputs は空(structure-only) + +## 2025-12-18:Phase 124 完了 ✅ + +**Phase 124: Normalized reads facts + Return(Variable from env)(dev-only)** +- StepTreeFacts に reads 追加(Variable 参照を AST から抽出) +- StepTreeContract signature に reads 反映(決定性維持) +- env マッピング(変数名 → ValueId)を writes から生成 +- Return(Variable) サポート: env にある変数のみ(writes 由来) +- env に無い Variable は Fail-Fast エラー(phase124 error → Ok(None) fallback) +- Box-first modularization: extract_variables_from_ast() で SSOT 化 +- Unit tests: 1159 tests PASS (including test_return_variable_from_env) +- Integration smoke: PASS (`phase124_if_only_return_var_vm.sh`, exit code 7 許容) +- 回帰: Phase 121/123/118 維持確認 +- 入口: `docs/development/current/main/phases/phase-124/README.md` +- 実装: + - `src/mir/control_tree/step_tree_facts.rs` (reads 追加、76行) + - `src/mir/control_tree/step_tree_contract_box.rs` (reads 反映、101行) + - `src/mir/control_tree/step_tree.rs` (extract_variables_from_ast 追加、612行) + - `src/mir/control_tree/normalized_shadow/builder.rs` (env マッピング追加、837行) + +## 2025-12-18:Phase 123 完了 ✅ + +**Phase 123: if-only Normalized semantics(dev-only)** +- Return(Integer literal) → `Const + Ret(Some(vid))` 生成 +- Return(Variable) → `Ok(None)` (graceful degradation, Phase 124 で対応) +- If(minimal compare) → Variable vs Integer literal のみ対応 +- Graceful degradation: Phase 123 制限は `Ok(None)` で legacy に fallback +- Structured error codes: `[phase123/...]` prefix で明示的エラー +- Box-first modularization: parse/verify/lower 責務分離 +- Unit tests: 8 tests PASS (including graceful degradation test) +- Integration smoke: PASS (`phase123_if_only_normalized_semantics_vm.sh`) +- 入口: `docs/development/current/main/phases/phase-123/README.md` + +## 2025-12-18:Phase 121 完了 ✅ + +**Phase 121: StepTree→Normalized Shadow Lowering (if-only, dev-only)** +- 箱化モジュール化: normalized_shadow/{contracts,builder,parity}.rs (508行、新規) +- Shadow lowering: StepTree → JoinModule (Normalized方言、if-only限定) +- Capability guard: Loop/Break/Continue を明示的拒否(SSOT) +- Parity 検証: exit contracts + writes 比較(dev ログ / strict fail-fast) +- Dev-only wiring: `joinir_dev_enabled()` のときのみ shadow 生成 +- Strict fail-fast: `freeze_with_hint` で mismatch を即座に検出(hint必須) +- Smoke tests: VM 3/3 PASS、LLVM スタブ(ハーネス設定必要) +- 回帰: Phase 120 維持確認、全テスト PASS +- 入口: `docs/development/current/main/phases/phase-121/README.md` +- 設計: `docs/development/current/main/design/control-tree.md` (Phase 121章) + +## 2025-12-18:Phase 120 完了 ✅ + +**Phase 120: StepTree "Facts→Decision→Emit" 箱化モジュール化** +- 箱化モジュール化: StepTreeFacts / StepTreeContractBox の責務分離 +- StepTreeBuilderBox: 構造 + facts 抽出まで(意思決定・整形・署名生成はしない) +- StepTreeContractBox: facts → contract の整形のみ(idempotent, deterministic) +- BTreeSet で順序決定性保証(facts は順序に依存しない) +- signature_basis_string() の決定性維持(既定挙動不変) +- 回帰: Phase 103/118 維持確認、全 1142 テスト PASS +- 入口: `docs/development/current/main/design/control-tree.md` +- 実装: + - `src/mir/control_tree/step_tree_facts.rs` (63行、新規) + - `src/mir/control_tree/step_tree_contract_box.rs` (168行、新規) + - `src/mir/control_tree/step_tree.rs` (262→411行、リファクタリング) + +## 2025-12-18:Phase 119 完了 ✅ + +**Phase 119: StepTree cond SSOT(AST handle)** +- StepNode::If / StepNode::Loop に cond_ast (AstNodeHandle) を追加 +- SSOT: cond は AST 参照を保持、cond_sig は派生(署名/ログ/差分検知) +- 不変条件: cond_ast は signature_basis_string() に混ぜない(決定性維持) +- 実装: Box clone(dev-only なので許容) +- 回帰: Phase 103/104/118 維持確認 +- 入口: `docs/development/current/main/design/control-tree.md` + +## 2025-12-18:Phase 118 完了 ✅ + +**Phase 118: loop + if-only merge parity** +- loop + if-only で条件付き変数更新 merge を VM/LLVM で固定 +- Fixture: phase118_loop_nested_if_merge_min.hako (expected: 2) +- Pattern3 (if-sum) 活用 +- Smoke: VM + LLVM EXE parity 検証済み +- Follow-up: Pattern3 carrier PHI contract(expected: 12) + - Fixture: phase118_pattern3_if_sum_min.hako + - Smoke: phase118_pattern3_if_sum_{vm,llvm_exe}.sh +- 回帰: Phase 117 維持確認 +- 入口: `docs/development/current/main/phases/phase-118/README.md` + +## 2025-12-18:Phase 117 完了 ✅ + +**Phase 117: if-only nested-if + call merge parity** +- ネストしたif-only(内側if + 外側else)で call 結果 merge を VM/LLVM で固定 +- Fixture: phase117_if_only_nested_if_call_merge_min.hako (expected: 2, 3, 4) +- Smoke: VM + LLVM EXE parity 検証済み +- 回帰: Phase 116 維持確認 +- 入口: `docs/development/current/main/phases/phase-117/README.md` + +## 2025-12-18:Phase 116 完了 ✅ + +**Phase 116: if-only keep+call merge parity** +- if-only で片側が元値保持、片側が call 結果のパターンを VM/LLVM で固定 +- Fixture: phase116_if_only_keep_plus_call_min.hako (expected: 10, 2) +- Smoke: VM + LLVM EXE parity 検証済み +- 回帰: Phase 115 維持確認 +- 入口: `docs/development/current/main/phases/phase-116/README.md` + +## 2025-12-18:Phase 115 完了 ✅ + +**Phase 115: if-only call result merge parity** +- if-only で関数呼び出し結果を merge するパターンを VM/LLVM で固定 +- Fixture: phase115_if_only_call_merge_min.hako (expected: 2, 3) +- Smoke: VM + LLVM EXE parity 検証済み +- 回帰: Phase 103/113/114 維持確認 +- 入口: `docs/development/current/main/phases/phase-115/README.md` + +## 2025-12-18:Phase 114 完了 ✅ + +**Phase 114: if-only return+post parity** +- if-only で early return + post-if statements パターンを VM/LLVM で固定 +- Fixture: phase114_if_only_return_then_post_min.hako (expected: 7, 2) +- Smoke: VM + LLVM EXE parity 検証済み +- 回帰: Phase 103/113 維持確認 +- 入口: `docs/development/current/main/phases/phase-114/README.md` + +## 2025-12-18:Phase 113 完了 ✅ + +**Phase 113: if-only partial assign parity** +- if-only(else なし)の片側代入で「保持 merge」パターンを VM/LLVM で固定 +- Fixture: phase113_if_only_partial_assign_min.hako +- Smoke: VM + LLVM EXE parity 検証済み + +## 2025-12-18:Phase 112 完了 ✅ + +**Phase 112: StepTree Capability Guard (strict-only)** +- StepTree の required_caps を strict mode でチェック +- Allowlist: If, NestedIf, Loop, Return, Break, Continue +- Deny (strict): NestedLoop, TryCatch, Throw, Lambda, While, ForRange, Match, Arrow +- Error format: `[joinir/control_tree/cap_missing/] Hint: ` +- Default behavior unchanged (strict=false always Ok) +- 入口: `docs/development/current/main/design/control-tree.md` +- 実装: + - `src/mir/builder/control_flow/joinir/control_tree_capability_guard.rs` + - `src/mir/builder/calls/lowering.rs` (wired into lower_function_body) + +## 2025-12-18:Phase 111 完了 ✅ + +**Phase 111: StepTreeContract + StepTreeSignature(dev-only)** +- StepTreeContract を追加(`exits` / `writes` / `required_caps` / `cond_sig`) +- StepTreeSignature を追加(`signature_basis_string()` を安定 hash、Span は含めない) +- dev-only parity を break/continue に加えて return まで拡張 +- 入口: `docs/development/current/main/design/control-tree.md` +- 実装: `src/mir/control_tree/step_tree.rs` + +## 2025-12-18:Phase 110 完了 ✅ + +**Phase 110: ControlTree / StepTree(構造SSOT・dev-only観測)** +- StepTree の語彙(Block/If/Loop/Stmt)と Feature を pure AST で実装(ValueId/PHI/CFG を混ぜない) +- joinir routing 側で extractor との “分類矛盾” を dev-only で検出(strict のみ Fail-Fast) +- 関数本体の StepTree を dev-only でダンプ(既定挙動不変) +- 入口: `docs/development/current/main/design/control-tree.md` +- 実装: + - `src/mir/control_tree/step_tree.rs` + - `src/mir/builder/calls/lowering.rs` + - `src/mir/builder/control_flow/joinir/routing.rs` + +## 2025-12-17:Phase 109 完了 ✅ + +**Phase 109: error_tags hints SSOT** +- policy/validator エラーを "tag + message + hint" 形式に統一 +- freeze_with_hint() API 追加(hint 必須、空なら panic) +- Phase 107/104/100 の代表3箱を hint 対応に移行 +- 入口: `docs/development/current/main/phases/phase-109/README.md` + +## 2025-12-17:Phase 104 完了 ✅ + +**Phase 104: loop(true) + break-only digits(read_digits 系)** +- read_digits_from 形の `loop(true)` を Pattern2 で受理(loop var 抽出 + break cond 正規化) +- fixture: `apps/tests/phase104_read_digits_loop_true_min.hako`(expected: `2`, `1`) +- smoke: `tools/smokes/v2/profiles/integration/apps/phase104_read_digits_vm.sh` / `tools/smokes/v2/profiles/integration/apps/phase104_read_digits_llvm_exe.sh` +- P2: json_cur 由来の回帰面を追加(fixture+VM/LLVM EXE smoke) + +## 2025-12-17:Phase 107 完了 ✅ + +**Phase 107: json_cur find_balanced_* depth scan(VM + LLVM EXE parity)** +- depth scan + nested if + return-in-loop を Pattern2 policy で受理(hardcode なし) +- fixture: + - `apps/tests/phase107_find_balanced_array_end_min.hako`(expected: `1`, `3`) + - `apps/tests/phase107_find_balanced_object_end_min.hako`(expected: `1`, `3`) +- smoke(integration): + - VM: `tools/smokes/v2/profiles/integration/apps/phase107_find_balanced_array_end_vm.sh` / `tools/smokes/v2/profiles/integration/apps/phase107_find_balanced_object_end_vm.sh` + - LLVM EXE: `tools/smokes/v2/profiles/integration/apps/phase107_find_balanced_array_end_llvm_exe.sh` / `tools/smokes/v2/profiles/integration/apps/phase107_find_balanced_object_end_llvm_exe.sh` +- 入口: `docs/development/current/main/phases/phase-107/README.md` + +## 2025-12-17:Phase 108 完了 ✅ + +**Phase 108: Pattern2 policy router SSOT(薄い入口の固定)** +- post-loop early return を一般 plan(`cond`/`ret_expr`)として独立し、Pattern2Inputs の依存を解消 +- ApplyPolicyStepBox から “直叩き” を撤去し、policy router 1本に集約(入口SSOT) +- 入口: `docs/development/current/main/phases/phase-108/README.md` + +## 2025-12-17:Phase 103 P0 完了 ✅ + +**Phase 103: if-only regression baseline** +- if-only(loop無し)の nested if + merge を fixture 化し、VM/LLVM EXE parity を integration smoke で固定 + +## 2025-12-17:Phase 100 P3 完了 ✅ + +**Phase 100 P3: String Accumulator Captures** +- String accumulator(`out = out + ch`)を最小形で固定し、VM/LLVM EXE parity を smoke で検証 +- LLVM EXE 側の stringish 伝播(PHI/copy/binop)を修正し、concat の意味論を安定化 + +## 2025-12-17:Phase 100 P2 完了 ✅ + +**Phase 100 P2: Mutable Accumulator Captures** +- Mutable accumulator pattern (`out = out + ch`) を Pattern2 carrier で対応 +- ScopeManager 委譲により read-only check を回避 +- Numeric output validation (count=3) で fixture 固定 +- VM/LLVM EXE parity 完了(smoke 追加) + +## 2025-12-17:Phase 100 P1 完了 ✅ + +**Phase 100 P1: Pinned Local Captures** +- CapturedEnv に CapturedKind (Explicit/Pinned) 拡張 +- PinnedLocalAnalyzer で loop-outer read-only locals を識別 +- Pinned receiver (例: s.substring()) が loop 内で使用可能に +- Fixture/smoke で動作確認済み + +## 2025‑12‑17:Phase 99 完了 ✅ + +**Phase 99: Trim/escape 実コード寄り強化(VM+LLVM EXE)** +- next_non_ws を3ケース固定(`2`, `-1`, `3`)— 改行/CR/Tab混在パターン追加 +- escape 末尾バックスラッシュを best-effort として固定(`hello\` そのまま出力) +- VM+LLVM EXE parity 完全対応、integration smoke で検証済み + +関連(設計/実装の入口): +- Phase 100: `docs/development/current/main/phases/phase-100/README.md` + +## 2025‑12‑15:Phase 132 完了 ✅ + +**Phase 132: LLVM Exit PHI=0 根治修正 完了!** +- ループ exit PHI が 0 を返す問題を根治解決 +- 原因(2層): (1) JoinIR/Boundary が exit 値を境界に渡していない、(2) LLVM Python が PHI を落とす/上書きする +- 修正: Pattern 1 で exit 値を明示的に渡す + `predeclared_ret_phis` 使用 + `builder.vmap` の PHI 保護 +- 結果: `/tmp/p1_return_i.hako` が 3 を返す(VM 一致) +- 詳細: `investigations/phase132-llvm-exit-phi-wrong-result.md` + +**追加(Phase 132-P2): Case C の Exit PHI ValueId 衝突を修正** +- 原因: `exit_phi_builder.rs` が module-level allocator を使い、同一関数内で ValueId が衝突し得た +- 修正: `func.next_value_id()`(function-level)へ統一(`bd07b7f4`) +- 結果: `apps/tests/llvm_stage3_loop_only.hako` が LLVM EXE でも `Result: 3`(VM 一致) +- 詳細: `investigations/phase132-case-c-llvm-exe.md` + +**追加(Phase 132-P3): Exit PHI collision の早期検出(debug-only)** +- `verify_exit_phi_no_collision()` を `contract_checks.rs` に追加し、ValueId 衝突を JoinIR merge の段階で Fail-Fast する + +## 2025‑12‑15:Phase 133–136(短報) + +- Phase 133: promoted carrier(Trim)の `join_id` 解決を SSOT に寄せて修正(smoke は compile-only)。 +- Phase 134: plugin loader best-effort loading を導入(決定的順序 + failure 集約 + 継続)。 +- Phase 135: ConditionLoweringBox が allocator SSOT を無視して ValueId 衝突を起こす問題を根治。 + - 詳細: `docs/development/current/main/phases/phase-135/README.md` +- Phase 136: MirBuilder の Context 分割を完了し、状態の SSOT を Context に一本化。 + - 詳細: `docs/development/current/main/phases/phase-136/README.md` + +## 2025‑12‑16:Phase 137‑141(短報) + +- Loop Canonicalizer(前処理 SSOT)は Phase 141 まで完了(既定挙動は不変、dev-only 観測/strict parity あり)。 + - 設計 SSOT: `docs/development/current/main/design/loop-canonicalizer.md` + - 実装: `src/mir/loop_canonicalizer/mod.rs`(+ 観測: `src/mir/builder/control_flow/joinir/routing.rs`) + - Phase 記録: `docs/development/current/main/phases/phase-137/README.md` + +## 2025‑12‑16:Phase 92(短報) + +- Phase 92(ConditionalStep / P5b escape の lowering 基盤)は完了。 + - 条件付き更新(`ConditionalStep`)のJoinIR表現 + Pattern2 側の委譲(emitter 箱化) + - 条件式での body-local 参照(`ConditionEnv → LoopBodyLocalEnv`)+ 最小E2E smoke 固定 + - Phase 記録(SSOT入口): `docs/development/current/main/phases/phase-92/README.md` + - 残: P5b の “完全E2E” は body-local promotion 拡張後(スコープ外で保留) + +## 2025‑12‑16:Phase 93(短報) + +- Trim の `is_ch_match` など「ConditionOnly(PHIで運ばない派生値)」を Derived Slot として毎イテレーション再計算できるようにした。 + - SSOT: `ConditionOnlyRecipe`(運搬禁止)+ `ConditionOnlyEmitter` + - schedule: `body-init → derived → break` を評価順SSOTとして強制 + - Phase 記録(入口): `docs/development/current/main/phases/phase-93/README.md` + +## 2025‑12‑16:Phase 94(短報) + +- P5b escape(`ch` 再代入 + `i` の +1/+2)を “derived(Select)” として扱い、VM E2E を固定。 + - 新箱: `BodyLocalDerivedEmitter` + 明示ポリシー(strict で理由付き Fail-Fast) + - integration smoke: `tools/smokes/v2/profiles/integration/apps/phase94_p5b_escape_e2e.sh` + - Phase 記録(入口): `docs/development/current/main/phases/phase-94/README.md` + +## 2025‑12‑16:Phase 95(短報) + +- MiniJsonLoader の escape ループを Phase 94 基盤で固定(派生 body-local + 条件付き skip)。 + - フィクスチャ: `apps/tests/phase95_json_loader_escape_min.hako` + - smoke: `tools/smokes/v2/profiles/integration/apps/phase95_json_loader_escape_vm.sh` + - Phase 記録(入口): `docs/development/current/main/phases/phase-95/README.md` + +## 2025‑12‑16:Phase 96(短報) + +- Trim系 policy 化を開始し、MiniJsonLoader の next_non_ws ループを fixtures/smoke に追加。 + - フィクスチャ: `apps/tests/phase96_json_loader_next_non_ws_min.hako` + - smoke: `tools/smokes/v2/profiles/integration/apps/phase96_json_loader_next_non_ws_vm.sh` + - Phase 記録(入口): `docs/development/current/main/phases/phase-96/README.md` + +## 2025‑12‑16:Phase 97(短報) + +- Phase 95/96 の MiniJsonLoader fixture を LLVM EXE ラインでも固定し、JoinIR/Trim の退行検出を強化。 + - smoke: `tools/smokes/v2/profiles/integration/apps/phase97_next_non_ws_llvm_exe.sh`(next_non_ws) + - smoke: `tools/smokes/v2/profiles/integration/apps/phase97_json_loader_escape_llvm_exe.sh`(escape) + - Phase 記録(入口): `docs/development/current/main/phases/phase-97/README.md` + +## 2025‑12‑17:Phase 98(短報) + +- plugin loader に strict fail-fast を導入し(HAKO_JOINIR_STRICT=1)、FileBox/MapBox の LLVM EXE parity を持続可能に。 + - smoke: `tools/smokes/v2/profiles/integration/apps/phase97_next_non_ws_llvm_exe.sh` + - smoke: `tools/smokes/v2/profiles/integration/apps/phase97_json_loader_escape_llvm_exe.sh` + - Phase 記録(入口): `docs/development/current/main/phases/phase-98/README.md` + +## 2025‑12‑17:Phase 102(短報) + +- real-app(MiniJsonLoader.read_quoted_from)の loop を最小抽出し、VM + LLVM EXE で regression を固定(期待: length=4)。 + - フィクスチャ: `apps/tests/phase102_realapp_read_quoted_min.hako` + - smoke: `tools/smokes/v2/profiles/integration/apps/phase102_realapp_read_quoted_vm.sh` + - smoke: `tools/smokes/v2/profiles/integration/apps/phase102_realapp_read_quoted_llvm_exe.sh` + - Phase 記録(入口): `docs/development/current/main/phases/phase-102/README.md` + +## 2025‑12‑14:現状サマリ + +(補足)docs が増えて迷子になったときの「置き場所ルール(SSOT)」: + +- `docs/development/current/main/DOCS_LAYOUT.md` + +### JoinIR / Loop / If ライン + +- LoopBuilder は Phase 186‑187 で完全削除済み。**JoinIR が唯一の loop lowering 経路**。 +- LoopPattern 系は Pattern1–4 まで実装・本線化済み: + - Pattern1: Simple While + - Pattern2: Loop with Break + - Pattern3: Loop with If‑Else PHI(break/continue なし) + - Pattern4: Loop with Continue(multi‑carrier 対応) +- Exit/Carrier/Boundary ラインは次の箱で SSOT 化: + - `CarrierInfo` / `ExitMeta` / `ExitBindingBuilder` + - `JoinInlineBoundary` + `LoopExitBinding` +- If lowering は IfSelectLowerer/IfMergeLowerer を中心に整理済み。Select/PHI の扱いも Phase 189 系で橋渡し済み。 +- 残課題(JoinIR ライン): + - JoinIR→MIR merge の一般化(複雑な Select/PHI パターンの統合) + - JsonParserBox など実アプリ側での長期運用テスト +- Phase 86–90(Loop frontends)まとめ(1枚): + - `docs/development/current/main/phase86-90-loop-frontends-summary.md` + +### Phase 86–90: Loop frontends(要約) + +- Phase 86–90 は “dev-only fixtures + shape guard + fail-fast” で段階的に固定済み。 +- 具体の fixture / shape / 未検証は `docs/development/current/main/phase86-90-loop-frontends-summary.md` を SSOT とする。 + +### Scope / BindingId(dev-only の段階移行ライン) + +- MIR builder 側で lexical scope / shadowing を実在化し、言語仕様の “local はブロック境界で分離” を SSOT に揃えた。 + - JoinIR lowering 側は name-based から BindingId-based へ段階移行中: + - `ScopeManager.lookup_with_binding()` / `ConditionEnv.binding_id_map` を導入し、shadowing を壊さずに解決できる足場を作った。 + - promoted carriers(DigitPos/Trim)については `BindingId(original) → BindingId(promoted) → ValueId(join)` の鎖を dev-only で整備中。 + - Phase 86 で `carrier_init_builder` / `error_tags` を SSOT 化し、段階移行ラインの基盤(ValueId 生成とエラー語彙)が確立した。 + - これにより、BindingId dual-path の拡張・統合時に「生成」と「表示」の責務が混ざらない構造が固定された。 + - Phase 81 で Pattern2(DigitPos/Trim)の ExitLine 契約(ConditionOnly を exit PHI から除外、LoopState のみを reconnect)を E2E で固定した。 + - 参照: + - `docs/development/current/main/phase73-scope-manager-design.md` + - `docs/development/current/main/phase78-bindingid-promoted-carriers.md` + - `docs/development/current/main/phase80-bindingid-p3p4-plan.md` + - `docs/development/current/main/phase81-pattern2-exitline-contract.md` + - `docs/development/current/main/phase78-85-boxification-feedback.md` + +### JsonParser / Selfhost depth‑2 ライン + +- `selfhost_build.sh --json` で Program JSON v0 emit は安定。 + `.hako` 側から env 経由で JSON を読む最小ループ(`program_read_min.hako`)は動作確認済み。 +- JsonParserBox / BundleResolver のループ 21 本のうち: + - 18 本は Pattern1–4 で JoinIR 対応済み(Phase 162–165)。 + - `_trim` を含む一部の複合ループは、ValueId 境界や Box 登録など残課題あり。 +- BoolExprLowerer / condition_to_joinir で OR/AND/NOT 付き条件式の lowering は実装完了(Phase 168–169)。 +- 残課題(JsonParser/selfhost depth‑2): + - JoinIR→MIR ValueId boundary の完全一般化(条件用 ValueId を含める) + - JsonParserBox の using / Box 登録(Rust VM 側での認識) + - Program JSON v0 を JsonParserBox 経由でフル解析する line の仕上げ + +### Ring0 / Runtime / CoreServices ライン + +- Ring0Context + Ring0Registry で OS API 抽象化レイヤ完成: + - MemApi / IoApi / TimeApi / LogApi / FsApi / ThreadApi + - RuntimeProfile(Default / NoFs) で条件付き必須を制御。 +- CoreServices(ring1‑core)として次を実装済み: + - StringService / IntegerService / BoolService + - ArrayService / MapService / ConsoleService + - PluginHost 統合 + UnifiedBoxRegistry からの自動初期化 +- FileBox / FileHandleBox ライン: + - Ring0FsFileIo 経由で read / write / append / metadata 完全対応 + - Default プロファイルでは必須、NoFs プロファイルでは disabled。 +- Logging ライン: + - ConsoleService(user‑facing) + - Ring0.log(internal/dev) + - println!(test 専用) + の 3 層が `logging_policy.md` で整理済み。JoinIR/Loop trace も同ドキュメントに集約。 +- VM backend の Box 解決(UnifiedBoxRegistry / BoxFactoryRegistry)の経路図: + - `docs/development/current/main/phase131-2-box-resolution-map.md` +- LLVM(Python llvmlite)lowering の棚卸し(Phase 131-3..10): + - `docs/development/current/main/phase131-3-llvm-lowering-inventory.md` + - 状態: Case B(Pattern1/loop_min_while)は EMIT/LINK/RUN まで復旧済み。Phase 132 で `return i` の VM/LLVM parity を固定。 + - Case C は別途 “Case C docs” を SSOT にして追跡する(状況は更新されるので、この箇所では断定しない) + - Case C の調査と実装計画: + - `docs/development/current/main/phase131-11-case-c-summary.md` + - `docs/development/current/main/case-c-infinite-loop-analysis.md` + +--- + +## 2025‑09‑08:旧スナップショット(参考) + +- LLVM 側 P0 完了(BitOps/Array/Echo/Map 緑)。VInvoke(by‑name/by‑id vector) は戻り値マッピングの暫定課題を確認中(Decisions 参照)。 +- selfhosting-dev の作業を main に順次取り込み。VM/MIR 基盤は main で先に整える方針。 + +直近タスク(当時) +1) continue/break の lowering(Builder 修正のみで表現) + - ループ文脈スタック {head, exit} を導入。 + - continue に遭遇 → head(または latch)へ br を emit し終端。 + - break に遭遇 → exit へ br を emit し終端。 + - post‑terminated 後に emit しない制御を徹底。 +2) ループ CFG の厳密化 + - 単一 exit ブロックの徹底。 + - Phi はヘッダでキャリー変数を合流(SSA/支配関係が崩れない形)。 +3) 検証とスモーク + - Verifier 緑(dominance/SSA)。 + - VM のループ代表(単純/ネスト/早期継続・脱出)。 + - LLVM/Cranelift EXE に綺麗に降りる(br/phi ベースで問題なし)。 + +代表コマンド(例) +- ビルド: `cargo build --release` +- LLVM smoke: `LLVM_SYS_180_PREFIX=$(llvm-config-18 --prefix) NYASH_LLVM_BITOPS_SMOKE=1 ./tools/llvm_smoke.sh release` +- VInvoke 調査: `NYASH_LLVM_VINVOKE_TRACE=1 NYASH_LLVM_VINVOKE_SMOKE=1 ./tools/llvm_smoke.sh release` diff --git a/docs/development/current/main/phases/phase-29ao/30-Backlog-archive.md b/docs/development/current/main/phases/phase-29ao/30-Backlog-archive.md new file mode 100644 index 00000000..ccd2d192 --- /dev/null +++ b/docs/development/current/main/phases/phase-29ao/30-Backlog-archive.md @@ -0,0 +1,442 @@ +# Self Current Task — Backlog (archive) + +Status: Active +Scope: 「次にやる候補」を短く列挙するメモ。現状は `docs/development/current/main/10-Now.md` を入口にする。 +Related: +- `docs/development/current/main/10-Now.md` +- `docs/development/current/main/DOCS_LAYOUT.md` + +## 直近(JoinIR/selfhost) + +- **Phase 29an(✅ COMPLETE): Skeleton/Feature Facts(SSOT)** + - 入口: `docs/development/current/main/phases/phase-29an/README.md` + - 状況: P0–P14 ✅ 完了 / P15 closeout ✅ + - Gate: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` + +- **Phase 29ao(active): CorePlan composition from Skeleton/Feature** + - 入口: `docs/development/current/main/phases/phase-29ao/README.md` + - 状況: P0–P31 ✅ 完了 / Next: P32(Pattern2 real-world strict/dev shadow adopt) + - Next 指示書: `docs/development/current/main/phases/phase-29ao/P32-STRICT-ADOPT-PATTERN2-REALWORLD-FROM-FACTS-INSTRUCTIONS.md` + +- **Phase 29af(✅ COMPLETE): Boundary hygiene / regression entrypoint / carrier layout SSOT** + - 入口: `docs/development/current/main/phases/phase-29af/README.md` + +- **Phase 29ag(✅ COMPLETE): JoinIR merge SSOT unification** + - 入口: `docs/development/current/main/phases/phase-29ag/README.md` + +- **Phase 29ah(✅ COMPLETE): JoinIR regression pack expansion(real-world coverage)** + - 入口: `docs/development/current/main/phases/phase-29ah/README.md` + +- **Phase 29aj(candidate): PlannerOutcome observability SSOT** + - 入口: `docs/development/current/main/phases/phase-29aj/README.md` + - 状況: P0/P1/P2/P3/P4/P5/P6/P7/P8/P9/P10 ✅ 完了 + - Next: Phase 29aj P11(TBD) + - 運用: integration filter で phase143_* は回さない(JoinIR 回帰は phase29ae pack のみ) + - 運用: phase286_pattern9_* は legacy pack (SKIP) を使う + +- **Phase 29ak(candidate): PlanRuleOrder SSOT + PlannerContext plumbing** + - 入口: `docs/development/current/main/phases/phase-29ak/README.md` + - 状況: P0/P1/P2/P3/P4/P5 ✅ 完了 + - Next: None(phase-29al へ) + +- **Phase 29al(candidate): CorePlan composition hardening (docs-first)** + - 入口: `docs/development/current/main/phases/phase-29al/README.md` + - 状況: P0/P1/P2/P3 ✅ 完了(docs-only) + - Next: P4(unwind を含む ExitKind 拡張: design only) + - 道筋 SSOT: `docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` + +- **Phase 29am(✅ COMPLETE): CorePlan Step-A implementation (lowerer/verifier)** + - 入口: `docs/development/current/main/phases/phase-29am/README.md` + - 状況: P0/P1/P2/P3 ✅ 完了 + - Next: Phase 29an + - Gate: `./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` + +- **Phase 29ai(candidate): Plan/Frag single-planner(Facts SSOT)** + - 入口: `docs/development/current/main/phases/phase-29ai/README.md` + - Next: Phase 29ai P16(TBD: promotion hint を JoinIR 側の orchestrator へ配線、挙動不変) + +- **Phase 29ae P1(✅ COMPLETE): JoinIR Regression Pack (SSOT固定)** + - 入口: `docs/development/current/main/phases/phase-29ae/README.md` + +- **Phase 29ad(✅ COMPLETE): Naming SSOT for Pattern6/7 fixtures** + - 入口: `docs/development/current/main/phases/phase-29ad/README.md` + +- **Phase 29ac(✅ COMPLETE): De-freeze Pattern6/7** + - 入口: `docs/development/current/main/phases/phase-29ac/README.md` + +- **Phase 29ab(✅ COMPLETE): JoinIR completion triage** + - 入口: `docs/development/current/main/phases/phase-29ab/README.md` + +- **Phase 288(✅ P0–P3 + 288.1 complete): REPL mode** + - 入口: `docs/development/current/main/phases/phase-288/README.md` + - SSOT: `docs/reference/language/repl.md` + - 次: Phase 288.2+(任意): REPL UX improvements(history / multiline / load 等) + +- **Phase 287(✅ COMPLETE): Developer Hygiene(意味論不変)** + - 状況: P0–P9 ✅ 完了(big files / facade / SSOT / docs guard / closeout) + - 成果: merge/mod.rs (1,555→1,053行), ast_feature_extractor (1,148→135行), plan.rs (741→120行) + - 入口: `docs/development/current/main/phases/phase-287/README.md` + +- **Phase 284(✅ COMPLETE): Return as ExitKind SSOT(patternに散らさない)** + - 目的: `return` を “pattern最適化の個別実装” にせず、`ExitKind` と `compose::*` / `emit_frag()` に収束させる + - ねらい: 移行期間中の「二重ルール」「検出の穴」を減らし、将来の pattern 増殖を防ぐ + - 入口: `docs/development/current/main/phases/phase-284/README.md` + - P0(docs-only): `docs/development/current/main/phases/phase-284/P0-INSTRUCTIONS.md` + - SSOT: + - Composition: `src/mir/builder/control_flow/edgecfg/api/compose/mod.rs` + - Terminator emission: `emit_frag()`(`src/mir/builder/control_flow/edgecfg/api/emit.rs`) + - Frag docs: `docs/development/current/main/design/edgecfg-fragments.md` + - 進め方: + - P0(docs-only)で “return の意味” と “Ok(None)/Err” の境界を固定 + - P1+ で Rust/LLVM の実装を SSOT に収束(pattern側に例外実装を増やさない) + +- **Phase 285(✅ COMPLETE): Box lifecycle / weakref / finalization / GC SSOT** + - 目的: Box の生存期間(強参照/弱参照/解放/最終化)を SSOT として固定し、「実装が仕様」になっている箇所を潰す + - ねらい: + - VM 側の weakref/finalization を仕様化(テストで固定) + - LLVM harness 側の未対応/差分を “仕様として明文化” し、将来の実装計画を切る + - 入口: `docs/development/current/main/phases/phase-285/README.md` + - 状況(完了): + - P0/P1/P2 ✅ 完了(weak 成功パターンは smoke 固定) + - P2.1 ✅ 完了: hidden root を根治し、weak-fail smoke を PASS に復帰 + - P2.2 ✅ 完了: KeepAlive の二重責務を命令分離で解消(`KeepAlive`/`ReleaseStrong`) + - P3.1/P3.2 ✅ 完了: LLVM 検出 + quick SSOT(`--features llvm` でも quick の意味が変わらない) + - P4 ✅ 完了: `phase285_weak_basic_llvm` を PASS に復帰(quick 154/154) + - 参考(現状の入口候補): + - weakref 表現: `src/value.rs`(`NyashValue::WeakBox`) + - finalization: `src/finalization.rs` + - 追加(syntax cleanup, small & focused): + - `weak` の表面構文を `weak ` に収束(`weak()` を持ち込まない) + - `let weak w;` / `let weak w = e` の糖衣を検討(概念を増やさず `let w = weak e` にデシュガー) + - fixture/smoke は `apps/tests/*.hako` を SSOT にして VM/LLVM で共通化(必要なら LLVM 側は SKIP で理由を固定) + +- **Phase 29y(✅ P0 COMPLETE, docs-first SSOT finalized): MIR lifecycle vocab freeze(RC/weak/ABI)** + - 状況: P0 ✅ 完了(docs-first SSOT finalized: ABI/RC insertion/Observability) + - 成果: 3つのSSOT文書(10/20/30)Ready、pilot実装固定、Next steps明文化 + - 入口: `docs/development/current/main/phases/phase-29y/README.md` + - 次: Phase 29z(RC insertion minimal)または Phase 29x(De-Rust runtime)候補 + +- **Phase 29z(P2 CLOSEOUT準備中, implementation-minimal): RC insertion minimal** + - 進捗: P1まで完了(上書き+Store null+Return終端cleanup で ReleaseStrong 挿入、単一block・安全ガード付き) + - ガード: Cargo feature `rc-insertion-minimal`(既定OFF、env var 新設なし) + - 検証: quick 154/154 PASS 維持 + `rc_insertion_selfcheck`(opt-in) + - 残課題(P2で方針化→次フェーズへ) + - null伝搬の精度向上(copy以外の伝搬パターン追加を段階的に) + - Branch/Jump 終端での cleanup をどう安全に扱うかの設計 + - PHI/loop/early-exit の安全な cleanup 設計(誤release防止) + - 入口: `docs/development/current/main/phases/phase-29z/README.md` + - 指示書: `docs/development/current/main/phases/phase-29z/P0-RC_INSERTION_MINIMAL-INSTRUCTIONS.md` + +- **Phase 29aa(✅ COMPLETE): RC insertion safety expansion(CFG-aware)** + - 進捗: P2 ✅ 完了(Jump/Branch 終端で cleanup を入れない契約の SSOT 化) + - 進捗: P3 ✅ 完了(Jump→Return single-predecessor state 伝播) + - 進捗: P4 ✅ 完了(Jump-chain propagation to Return) + - 進捗: P5 ✅ 完了(Multi-predecessor Return join: state完全一致のみ) + - 進捗: P6 ✅ 完了(Multi-predecessor Return join: intersection) + - 進捗: P7 ✅ 完了(Deterministic ReleaseStrong ordering) + - 進捗: P8 ✅ 完了(Null propagation across CFG; Copy-only) + - 入口: `docs/development/current/main/phases/phase-29aa/README.md` + +- **Phase 29x(planned, post self-host): De-Rust runtime for LLVM execution** + - 目的: LLVM 実行経路のランタイム依存を段階的に Rust から切り離す(脱Rust)。 + - 前提: self-host ラインが安定し、VM/LLVM conformance(Phase 285)が十分に固まっていること。 + - 方針: + - 仕様SSOT(strong/weak/fini/cleanup/void)は維持し、実装だけを差し替え可能にする。 + - まず ABI 境界(例: `nyrt_*`)を “将来置換する契約” として固定し、独立ランタイムに差し替える。 + - 受け入れ条件(最小): + - 既存の `apps/tests/*.hako` fixture を再利用し、VM/LLVM parity のスモークが維持される。 + - weak の語彙(`weak ` / `weak_to_strong()`)が同じ意味で動作する(cycleは当面リーク仕様でも可)。 + +- **Phase 29y(planned, post self-host / docs-first): MIR lifecycle vocab freeze(RC/weak/ABI)** + - 目的: 参照カウント(strong/weak)を “どこで” 実装するか(MIR語彙 vs runtime ABI)を設計SSOT化し、脱Rust実装の土台にする + - 前提: self-host 後/Phase 285(weak conformance + hidden root 根治)が落ち着いていること + - 入口(phase): `docs/development/current/main/phases/phase-29y/README.md` + - 入口(相談パケット): `docs/development/current/main/investigations/phase-29y-mir-lifecycle-vocab-consult.md` + - 進捗(pilot, 仕様不変): + - docs SSOT(ABI/RC insertion/observability)を phase-29y 配下に集約 + - Phase 29y.1: “最小導線” の実装だけ先行(意味論は変更しない) + - NyRT handle ABI shim(`crates/nyash_kernel/src/ffi/lifecycle.rs`) + - RC insertion pass 入口(no-op) + - leak report に root categories(handlesのみ)を追加(Phase 1 limitation 明記) + +- **Phase 286(✅ complete): JoinIR Line Absorption(JoinIR→CorePlan/Frag 収束)** + - 目的: 移行期間に残っている「2本の lowering(Plan line / JoinIR line)」を、構造で 1 本に収束させる + - ねらい: `return/break/continue` のような “大きな出口語彙” の実装場所が揺れない状態にする + - 入口: `docs/development/current/main/phases/phase-286/README.md` + - P0(docs-only): `docs/development/current/main/phases/phase-286/P0-INSTRUCTIONS.md` + - 状況: Pattern1–9 の主要ループ形が Plan/Frag SSOT に吸収され、quick gate は green を維持。 + - 将来の設計相談(Phase 286 の範囲外で、別フェーズでSSOT化してから): `docs/development/current/main/investigations/phase-286-plan-normalization-consult.md` + - SSOT: + - Plan/Frag: `compose::*` + `emit_frag()`(Phase 280/281) + - JoinIR line 共通入口: `src/mir/builder/control_flow/joinir/patterns/conversion_pipeline.rs` + +- (✅ done)**Phase 282**: Router shrinkage + detection SSOT + extractor refactor + - 完了: `docs/development/current/main/phases/phase-282/README.md` + +(✅ done)**Phase 279 P0**: Type propagation pipeline SSOT 統一(lifecycle / JoinIR / LLVM の二重化解消) + - 完了: `docs/development/current/main/phases/phase-279/README.md` + +- **Phase 272(✅ complete): Pattern6/7 を Frag+emit_frag へ吸収(段階適用)** + - 目的: scan系 loop の CFG 構築を `Frag/ExitKind` 合成へ寄せ、pattern列挙の増殖を止める + - 完了: P0.1(Pattern6)✅ + P0.2(Pattern7)✅ + - 入口: fixture/smoke を SSOT として固定(Pattern6→Pattern7 の順で段階適用) + - 詳細: `phases/phase-272/README.md` + +- (✅ done)**Phase 273**: Plan line SSOT(Pattern6/7) + - 完了: `docs/development/current/main/phases/phase-273/README.md` + +- (✅ done)**Phase 280**: Frag composition SSOT positioning + - 完了: `docs/development/current/main/phases/phase-280/README.md` + +- (✅ done)**Phase 281**: compose adoption(Pattern6/7, P0–P3) + - 完了: `docs/development/current/main/phases/phase-281/README.md` + +- (✅ done)**Phase 277/278**: PHI strict + env var 収束 + - 完了: `docs/development/current/main/phases/phase-277/README.md` + - 完了: `docs/development/current/main/phases/phase-278/README.md` + + +- **Phase 274(active, design-first): Type SSOT Alignment(local + dynamic runtime)** + - 入口SSOT: `docs/reference/language/types.md` + - P1(✅完了): Rust VM が `TypeOp(Check/Cast)` を実行可能(`is/as` が動く) + - P2(✅完了): LLVM ライン(llvmlite harness)の `TypeOp` を SSOT に合わせる + - P3(decision): truthiness / equality / compare / `+` の coercion を SSOT として固定(必要なら “仕様変更フェーズ” を追加) + - 詳細: `phases/phase-274/README.md` + +- **Phase 270(✅ 完了): JoinIR-only minimal loop SSOT** + - `apps/tests/phase270_p0_loop_min_const.hako` + VM smoke で “最小 const loop” を固定(exit=3) + - Pattern1 は test-only stub のため不適合 → Pattern9(AccumConstLoop)を橋渡しとして追加 + - 詳細: `phases/phase-270/README.md` + +- **Phase 271(✅ 完了, docs-only): Bridge pattern 撤去条件SSOT** + - 対象: bridge pattern(例: `Pattern9_AccumConstLoop`) + - 目的: 「汎用化しない」「Frag 合成へ吸収して削除する」を SSOT 化 + - 成果物: + - `docs/development/current/main/design/edgecfg-fragments.md` の `Bridge patterns(撤去条件SSOT)` に “bridge contract” テンプレを追加 + - `Pattern9_AccumConstLoop` の撤去条件(fixture/smoke/手順)を同セクションに明文化 + - SSOT: `docs/development/current/main/design/edgecfg-fragments.md` + +- **Phase 269 P1(✅ 完了): Pattern8 を EdgeCFG で実装(SSA を閉じる)** + - 方針: emission 入口で Frag 構築(break/continue 無しなので `compose::loop_()` は使わず手配線) + - 完了: header に `i` の PHI を追加して SSA を閉じた(`i_current = phi [i_init, preheader], [i_next, step]`) + - early-exit の `return false` は Return wire、`return true` は loop 後 AST に任せる + - Pattern8 の返り値は当面 `void`(loop-statement 扱い) + - 補足(DONE): static box の `this/me` は MethodCall 共通入口で static call に正規化済み(Pattern8 は現状 static box 文脈を対象外) + - 詳細: `phases/phase-269/README.md` + +- **Phase 270+(planned): Pattern6/7 への Frag 適用** + - Pattern6: Match scan(index_of 系) + - Pattern7: Split scan(split 系) + - 統一的なループ処理パターン確立 + - Pattern 分岐削減 + +- **収束方針(SSOT案): Expr/Condition/Control の 3 箱分割** + - ExprLowererBox(式SSOT): `AST(expr)` → `(prelude, value)`(ANF含む)。pure/impure/whitelist/strict を集約(入口SSOT)。 + - ConditionLowererBox(条件→分岐SSOT): `AST(cond)` → `BranchPlan`。評価順は ExprLowererBox に委譲し、`&&/||` は制御語彙で扱う。 + - ControlLowererBox(制御SSOT): `StepNode/ControlTree` → JoinIR(継続 + env)。`if/loop` を担当し、条件は ConditionLowererBox に委譲。 + +- **Phase 141 P2+(planned): Call/MethodCall(effects + typing を分離して段階投入)** + - ねらい: pure/impure 境界を壊さずに、impure lowering を段階投入する。 + - 前提(DONE): + - Phase 141 P1.5: known intrinsic allowlist + available_inputs 3-source merge + diagnostics + - 受け入れ条件: + - out-of-scope は `Ok(None)` でフォールバック(既定挙動不変) + - effects の順序付けは SSOT で固定してから解禁(by-name 増殖禁止) + +- **Phase 144-anf(planned): impure 式導入の順序固定(ANF)** + - ねらい: `x + f(y)` 等の “pure + impure 混在” で評価順が仕様になる前に、ANF で順序固定を SSOT 化する + - 入口: `docs/development/current/main/phases/phase-144-anf/INSTRUCTIONS.md` + - 受け入れ条件: + - impure を lowering できない場合は `Ok(None)` でフォールバック(既定挙動不変) + - dev/strict では「順序固定の欠落」を Fail-Fast(診断に順序ログを含める) + +- **Phase 143-loopvocab R0(planned): Contract SSOT 抽出(refactor P0 → modular components)** + - 目的: loop_true_if_break_continue.rs を「検出/契約/変換」に分割し、P1/P2 での if分岐増殖を防ぐ + - 実装: + - 新ファイル: `src/mir/control_tree/normalized_shadow/common/loop_if_exit_contract.rs` + - `enum LoopIfExitThen { Break, Continue }` + - `struct LoopIfExitShape { has_else: bool, then: LoopIfExitThen, else_: Option, cond_scope: ExprLoweringScope }` + - `enum OutOfScopeReason { NotLoopTrue, BodyNotSingleIf, ThenNotExit, ElseNotSupported, CondOutOfScope(...) }` + - Refactor: loop_true_if_break_continue.rs は「shape抽出 → lower」だけに縮退(SSOT は contract側) + - Tests: unit test を dedicated module へ分離(test maintainability) + - 受け入れ条件: + - cargo check ✅(no errors) + - P1/P2 での if分岐を防ぐ(contract で決定性を保証) + - out-of-scope は `Ok(None)` で一貫(既定挙動不変) + +- **Phase 143-loopvocab P1(planned): continue 語彙追加** + - 対象: `loop(true) { if(cond_pure) continue }` を same lowering に通す + - 実装: + - LoopIfExitShape で `LoopIfExitThen::Continue` を許可 + - JoinModule: if true → loop_step (continue semantics) + - Fixtures: `phase143_loop_true_if_continue_min.hako` + - Smoke: VM + LLVM EXE + - Out-of-scope は `Ok(None)` のまま + +(DONE)Phase 143-loopvocab P2: else 対称化(B-C / C-B) + - 記録: `docs/development/current/main/10-Now.md` + +- **Phase 143-loopvocab P3+(planned): impure conditions 対応** + - 目的: `if(cond_impure) break/continue` を ANF/順序固定の上で段階投入する + - 方針: Phase 145-anf の契約(hoist + left-to-right)を条件式にも適用 + +- **Phase 263+(planned): Pattern2 LoopBodyLocal promotion(seg)** + - 目的: Stage‑B compile(bundle_resolver系)で露出している Pattern2 `LoopBodyLocal(seg)` を受理し、quick の first FAIL を進める + - 受け入れ条件: + - 最小再現 fixture + smoke で固定(先に失敗を SSOT 化) + - Pattern2 が不成立のときは “部分続行” せず `Ok(None)` で fallback(既定挙動不変) + +- **(DONE)Phase 263 P0.2: Pattern2 PromoteDecision API hardening** + - 入口SSOT: `src/mir/builder/control_flow/joinir/patterns/pattern2/api/` + - `PromoteDecision::{Promoted, NotApplicable, Freeze}` と `try_promote(...)` に参照点を収束(Option揺れを撤去) + +- **Phase 264(✅ 入口作成完了): EdgeCFG Fragment 入口作成(design-first)** + - **ステータス**: ✅ 入口作成完了(適用は次フェーズ) + - **実装内容**: + - `edgecfg/api/` フォルダに SSOT 入口作成 + - `ExitKind`, `EdgeStub`, `Frag` の型定義 + - `seq`, `if_`, `loop_`, `cleanup` のシグネチャ固定(pub(crate)) + - 最小ユニットテスト 3個 + - ドキュメント連動(edgecfg-fragments.md) + - **制約遵守**: + - 既存 pattern6/7/8 未改変 + - merge/EdgeCFG 未改変 + - cargo test -p nyash-rust --lib --no-run 成功確認 + - **次フェーズへの橋渡し**: + - Phase 265 で Pattern8 適用時に `compose::loop_` を実装 + - 再利用確認後、pattern番号分岐を段階的に削減 + +- **Phase 265 P0(✅ 完了): compose/verify 最小実装** + - **目的**: 入口SSOTの形を固める(迷子防止) + - **実装**: + - compose::loop_() 最小実装(exit集合分類のみ、配線なし) + - verify_frag_invariants() 最小実装(デバッグガード付き) + - compose::loop_() ユニットテスト 2個追加 + - **制約**: + - Pattern8 未改変(P0では触らない、偽Frag回避) + - 配線ロジックは P1 以降 + - **次**: Phase 265 P1 で配線ロジック + Pattern8適用 + +- **Phase 265 P1(✅ 完了): compose 配線ロジック実装** + - **目的**: Frag/ExitKind の配線能力を BasicBlockId 層で証明 + - **実装**: + - EdgeStub.target 追加(Option) + - compose::loop_() 配線ロジック(Continue → header, Break → after) + - verify_frag_invariants() 配線契約検証 + - test-only PoC(5個のテスト: 既存2個更新 + 新規3個追加) + - **配線契約**: + - Continue(loop_id) の EdgeStub.target = Some(header) + - Break(loop_id) の EdgeStub.target = Some(after) + - Normal/Return/Unwind の EdgeStub.target = None(上位へ伝搬) + - **制約**: + - MIR 命令生成なし(Frag 層のみ) + - NormalizedShadow 未適用(Phase 267 に繰り越し) + +- **(✅ 完了)Phase 265 P2: seq/if_ 実装(wires/exits 分離)** + - **目的**: 「解決済み配線(wires)」と「未解決 exit(exits)」を分離し、Frag 合成の基本パターンを完成 + - **完了内容**: + - Frag に `wires: Vec` 追加 + - wires/exits 分離設計確立(exits = target None, wires = target Some) + - loop_() を wires 対応に更新 + - seq(a, b) 実装(a.Normal → wires) + - if_(header, cond, t, e, join_frag) 実装(t/e.Normal → wires) + - verify 強化(wires/exits 分離契約、警告のみ) + - 全テスト PASS(13個: frag 3 + compose 9 + verify 1) + - **設計判断**: + - wires/exits 分離で再配線バグ防止 + - if_ は join_frag: Frag で「join 以降」を明確化 + - verify は警告のみ(Err 化は Phase 266 の strict 版で段階導入) + - **次**: Phase 266 で MIR 命令生成 PoC(emit_wires)、Phase 267 で NormalizedShadow/JoinIR へ実適用 + +- **(✅ 完了)Phase 266: wires → MIR terminator 生成(最小 PoC)** + - **目的**: wires を MIR terminator に変換する最小 PoC を実装し、Phase 267 での本格適用に備える + - **完了内容**: + - emit.rs 作成(emit_wires 実装 + unit test 4個) + - verify_frag_invariants_strict() 追加(段階導入を壊さない) + - Jump/Return 対応(Branch は Phase 267) + - mod.rs 更新(emit module エクスポート) + - 全テスト PASS(1392 passed: 既存 1388 + 新規 4個) + - **核心原則**: + - from ごとにグループ化して1本だけ許可(1 block = 1 terminator 制約) + - Return は target=None を許可(意味を持たない) + - verify_frag_invariants() は変更なし(警告のまま、strict 版を別名で用意) + - Phase 260 terminator 語彙ルールを厳守 + - **設計判断**: + - from グループ化で terminator 上書きバグ防止 + - Return は target 不要(呼び出し元に戻る) + - verify strict 版で段階導入を壊さない + - **次**: Phase 267 で JoinIR Pattern への適用 + +- **(✅ P0 完了)Phase 267: BranchStub + emit_frag(Branch の第一級化)** + - **目的**: Frag に Branch を第一級で追加し、wires(Jump/Return)と同様に MIR terminator へ落とす入口を作る + - **完了内容(P0)**: + - `BranchStub` 追加 + `Frag.branches` 追加 + - `compose::if_` が header→then/else の BranchStub を生成 + - `emit_frag(function, frag)` を追加(`emit_wires` + `set_branch_with_edge_args`) + - 1 block = 1 terminator(wire/branch の衝突)を Fail-Fast + - unit tests + `cargo test -p nyash-rust --lib` PASS + - **P1(延期)**: + - "層を跨がない実適用"は候補が抽象化層へ委譲済みのため、Phase 268 で体系的に適用する方針 + - **詳細**: `docs/development/current/main/phases/phase-267/README.md` + +- **(✅ 完了)Phase 268: if_form.rs への Frag 適用 + entry edge-args SSOT化** + - **目的**: EdgeCFG Fragment を層を跨がずに実戦投入し、compose::if_() の edge-args を SSOT 化 + - **完了内容(P0)**: + - emission/branch.rs に emit_conditional_edgecfg() 追加(薄いラッパー) + - if_form.rs を Frag+emit_frag 経由に変更(emit_conditional + emit_jump を削除) + - emission 層経由で層が綺麗に保たれる + - **完了内容(P1)**: + - compose::if_() シグネチャ変更(then_entry_args, else_entry_args 追加) + - emission/branch.rs から空 EdgeArgs を渡す + - EdgeCFG テスト更新(compose.rs 2箇所、emit.rs 1箇所) + - TODO コメント削除完了(Phase 267 P2+ TODO 解消) + - **テスト結果**: + - cargo build --release: 成功 + - cargo test --lib --release: 1444/1444 PASS + - quick smoke: 45/46 PASS(既存状態維持) + - **核心原則**: + - emission 層経由で Frag 構築を MirBuilder 層から分離 + - SSOT 原則: compose::if_() は edge-args を内部生成しない + - **次**: Phase 269 で Pattern6/7/8 への Frag 適用 + fixture/smoke test + - **詳細**: `docs/development/current/main/phases/phase-268/README.md` + +- **real-app loop regression の横展開(VM + LLVM EXE)** + - ねらい: 実コード由来ループを 1 本ずつ最小抽出して fixture/smoke で固定する(段階投入)。 + - 現状: Phase 107(find_balanced_array/object / json_cur 由来)まで固定済み。 + - 次候補: JsonLoader/JsonCur から 1 本ずつ(fixture + integration smoke)で増やす。 + +- **P5b “完全E2E”**(escape skip の実ループを end-to-end で固定) + - 現状: Phase 94 で VM E2E まで固定済み。次は selfhost 実コード(`apps/selfhost-vm/json_loader.hako`)へ横展開して回帰を減らす。 + - 入口: `docs/development/current/main/phases/phase-94/README.md` + +- **制御の再帰合成(docs-only → dev-only段階投入)** + - ねらい: `loop/if` ネストの "構造" を SSOT(ControlTree/StepTree)で表せるようにする + - 注意: canonicalizer は観測/構造SSOTまで(ValueId/PHI配線は Normalized 側へ) + - 現状: Phase 119–128(if-only Normalized: reads/inputs/unknown-read/partial-assign keep/merge)まで完了 + - ✅ 完了: Phase 129-C(post-if を post_k continuation で表現) + - 入口: `docs/development/current/main/design/control-tree.md` + +## 中期(ループ在庫の残り) + +- **P5(guard-bounded)**: 大型ループを “小粒度” に割ってから取り込む(分割 or 新契約) +- **P6(nested loops)**: capability guard で Fail-Fast 維持しつつ、解禁時の契約を先に固定 + +## 中期(制御の表現力) + +北極星: `docs/development/current/main/design/join-explicit-cfg-construction.md` +設計メモ: `docs/development/current/main/design/exception-cleanup-async.md` + +- **catch/cleanup(Invoke)** + - 追加語彙を `Invoke(ok_edge, err_edge)` に絞って例外 edge を明示する(例外値は edge-args で運ぶ)。 + - 実装タイミング: Phase 260(edge-args terminator 収束)の P1〜P2 以降が推奨。 +- **cleanup/defer(cleanup normalizer)** + - Return/Throw/Break/Continue を cleanup に寄せる “脱出 edge 正規化” を箱化する(finally の後継としての cleanup)。 + - 実装タイミング: catch/cleanup の次(例外 edge も含めて正規化するため)。 +- **async/await(state machine lowering)** + - CFG語彙に混ぜず、AsyncLowerBox で state machine 化してから MIR に落とす。 + - 実装タイミング: finally/defer の後(cancel/drop と cleanup の接続を先に固める)。 + +## ドキュメント運用 + +- 重複が出たら「設計 SSOT(design)」に集約し、Phaseログ(phases)は “何をやったか/検証したか” に限定する +- 調査ログ(investigations)は結論を SSOT に反映してから Historical 化する diff --git a/docs/development/current/main/phases/phase-29ao/CURRENT_TASK-archive.md b/docs/development/current/main/phases/phase-29ao/CURRENT_TASK-archive.md new file mode 100644 index 00000000..75c1645d --- /dev/null +++ b/docs/development/current/main/phases/phase-29ao/CURRENT_TASK-archive.md @@ -0,0 +1,232 @@ +# CURRENT_TASK (archive) + +Status: SSOT +Scope: Repo root の旧リンク互換。現行の入口は `docs/development/current/main/10-Now.md`。 + +- Now: `docs/development/current/main/10-Now.md` +- Backlog: `docs/development/current/main/30-Backlog.md` + +--- + +## Handoff (current) + +### 状況(SSOT) + +**JoinIR 回帰 SSOT** +`./tools/smokes/v2/profiles/integration/joinir/phase29ae_regression_pack_vm.sh` が唯一の integration gate。phase143_* は対象外(legacy pack で隔離)。phase286_pattern9_* は legacy pack (SKIP) で運用。 + +**CorePlan migration 道筋 SSOT** +`docs/development/current/main/design/coreplan-migration-roadmap-ssot.md` が移行タスクの Done 判定の入口。 + +**Next implementation (Phase 29ao P32)** +- 目的: Pattern2 real-world strict/dev shadow adopt +- 指示書: `docs/development/current/main/phases/phase-29ao/P32-STRICT-ADOPT-PATTERN2-REALWORLD-FROM-FACTS-INSTRUCTIONS.md` +- After P32: TBD + +**2025-12-30: Phase 29ao P31 COMPLETE (shadow adopt routing SSOT)** +shadow adopt の判定/Fail-Fast/タグを composer 側に集約し、router を薄くした(仕様不変)。 + +**2025-12-30: Phase 29ao P30 COMPLETE (Shadow adopt composer SSOT)** +Facts→CorePlan の入口を `plan/composer` に集約し、Normalizer の責務を DomainPlan→CorePlan に縮退した(挙動不変)。 + +**2025-12-30: Phase 29ao P25 COMPLETE (Pattern5 strict/dev adopt from facts)** +Pattern5(Infinite Early-Exit)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。 + +**2025-12-30: Phase 29ao P27 COMPLETE (Pattern6 subset strict/dev adopt from facts)** +Pattern6(ScanWithInit) の subset を strict/dev で Facts→CorePlan に寄せ、planner subset のズレを Fail-Fast で検知できるようにした。 + +**2025-12-30: Phase 29ao P28 COMPLETE (Shadow adopt observability tags + gate smokes)** +strict/dev shadow adopt が実際に踏まれていることを安定タグと回帰スモークで検証できるようにした(仕様不変)。 + +**2025-12-30: Phase 29ao P29 COMPLETE (Shadow adopt tag coverage)** +regression gate に含まれる全パターンで shadow adopt のタグを必須化した(仕様不変)。 + +**2025-12-30: Phase 29ao P26 COMPLETE (Pattern2 subset strict/dev adopt from facts)** +Pattern2(Break) の subset を strict/dev で Facts→CorePlan に寄せ、planner subset のズレを Fail-Fast で検知できるようにした。 + +**2025-12-30: Phase 29ao P24 COMPLETE (Pattern7 strict/dev adopt from facts)** +Pattern7(SplitScan)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。 + +**2025-12-30: Phase 29ao P23 COMPLETE (Pattern3 strict/dev adopt from facts)** +Pattern3(If‑Phi)を strict/dev で Facts→CorePlan に寄せ、DomainPlan 経路との差分を Fail-Fast で検知できるようにした。 + +**2025-12-30: Phase 29ao P22 COMPLETE (Pattern1 CoreLoop dedup)** +Pattern1 の CoreLoop 構築を SSOT で 1 箇所に統一し、DomainPlan/Facts の二重化を解消した。 + +**2025-12-30: Phase 29ao P21 COMPLETE (Pattern1 subset step-only gate)** +Pattern1 subset を body=step のみに引き締め、strict/dev shadow adopt の誤マッチを遮断した。 + +**2025-12-30: Phase 29ao P20 COMPLETE (CoreLoop ExitMap composition SSOT)** +CoreLoop の ExitMap/Cleanup/ValueJoin 合成規約を SSOT 化し、合成境界と Fail-Fast ルールを固定した(docs-only)。 + +**2025-12-29: Phase 29am P0 COMPLETE (CorePlan If/Exit lowerer/verifier)** +CorePlan の If/Exit を lowerer/verifier で扱えるようにして、CorePlan 移行の土台を作った。 + +**2025-12-30: Phase 29ao P12 COMPLETE (Pattern7 SplitScan step join via block_params)** +Pattern7 SplitScan の step join を `Frag.block_params + EdgeArgs` で表現し、CorePhiInfo の step PHI を撤去した。 + +**2025-12-30: Phase 29ao P18 COMPLETE (single_planner outcome plumbing)** +single_planner が planner outcome を返す SSOT に寄せ、router の二重 planner 実行を撤去した。 + +**2025-12-30: Phase 29ao P17 COMPLETE (Pattern1 strict/dev shadow adopt)** +strict/dev のみ Facts→CorePlan(skeleton) を採用し、既定経路は維持した。 + +**2025-12-30: Phase 29ao P14 COMPLETE (Pattern2 Break exit join via block_params)** +Pattern2 Break の after join を `Frag.block_params + EdgeArgs` で表現し、CorePhiInfo の after PHI を撤去した。 + +**2025-12-30: Phase 29ao P16 COMPLETE (Pattern5 Break exit join via block_params)** +Pattern5 Infinite Early-Exit の after join を `Frag.block_params + EdgeArgs` で表現し、CorePhiInfo の exit PHI を撤去した。 + +**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 は許可。 + +**2025-12-29: Phase 29am P3 COMPLETE (Exit alignment: “Exit is last” rule)** +CorePlan 内の Exit の乱用を抑制し、Frag/ExitMap と整合する表現へ寄せた([V11])。 + +**PlanRuleOrder SSOT** +single_planner の順序/名前 SSOT は `src/mir/builder/control_flow/plan/single_planner/rule_order.rs` に固定。PlannerContext で Pattern1 facts の抑制を開始し、残りの guard/filter は段階移行。 + +**2025-12-29: Phase 29aj P6 COMPLETE (JoinIR regression gate SSOT)** +JoinIR 回帰の integration gate を phase29ae pack に固定し、phase143_* を legacy pack で隔離。 + +**2025-12-29: Phase 29aj P7 COMPLETE (Pattern8 planner-first)** +Pattern8 BoolPredicateScan の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。 + +**2025-12-29: Phase 29ak P0 COMPLETE (PlanRuleOrder + PlannerContext plumbing)** +PlanRuleOrder を SSOT 化し、PlannerContext を配線(未使用)。single_planner の手書きテーブルを撤去。 + +**2025-12-29: Phase 29ak P1 COMPLETE (Pattern1 facts guard via planner)** +Pattern1 以外のループで pattern1_simplewhile facts 抽出を抑制。single_planner 側の guard は安全策として維持。 + +**2025-12-29: Phase 29ak P2 COMPLETE (Pattern8 static box filter via planner)** +static box では Pattern8 facts 抽出を抑制。single_planner 側の filter は安全策として維持。 + +**2025-12-29: Phase 29ak P3 COMPLETE (remove Pattern8 filter in single_planner)** +Pattern8 static box filter を single_planner から撤去し、planner/facts 側 SSOT に一本化。 + +**2025-12-29: Phase 29ak P4 COMPLETE (remove Pattern1 guard in single_planner)** +Pattern1 guard を single_planner から撤去し、planner/facts 側 SSOT と fallback 抑制に統一。 + +**2025-12-29: Phase 29ak P5 COMPLETE (planner candidate ctx gate)** +Pattern1/8 の候補抑制を planner 側に集約し、single_planner の Pattern1 抑制を撤去。 + +**2025-12-29: Phase 29al P0 COMPLETE (Skeleton/Feature model SSOT, docs-only)** +CorePlan を骨格→特徴→合成で説明する SSOT を追加し、Freeze taxonomy に unstructured を追加。 + +**2025-12-29: Phase 29al P1 COMPLETE (post-phi final form SSOT, docs-only)** +join 値(PHI相当)の最終表現(layout/mapping/pred分類/verify)を 1 枚 SSOT として固定。 + +**2025-12-29: Phase 29al P2 COMPLETE (effect classification SSOT, docs-only)** +effect 分類(Pure/Mut/Io/Control)と “許される変形” の最小法典を SSOT 化。 + +**2025-12-29: Phase 29al P3 COMPLETE (exitkind/cleanup/effect contract SSOT, docs-only)** +cleanup を ExitKind 語彙として扱い、Control/Io を跨いだ移動や DCE 消去の事故を防ぐ境界を SSOT 化。 + +**2025-12-29: Phase 29aj P10 COMPLETE (single_planner unified shape)** +single_planner を全パターンで planner-first → extractor フォールバックの共通形に統一(挙動不変)。 + +**2025-12-29: Phase 29aj P9 COMPLETE (phase286 pattern9 legacy isolation)** +phase286_pattern9_frag_poc を legacy pack (SKIP) に隔離し、JoinIR 回帰 SSOT を phase29ae pack に固定。 + +**2025-12-29: Phase 29aj P8 COMPLETE (Pattern9 planner-first)** +Pattern9 AccumConstLoop の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。 + +**2025-12-29: Phase 29ai P15 COMPLETE (Pattern2 promotion hint observe)** +strict/dev 時のみ `[plan/pattern2/promotion_hint:{TrimSeg|DigitPos}]` を観測できるようにし、次は promotion hint の Plan/Frag 吸収残作業(P16候補)。 + +**2025-12-29: Phase 29aj P0 COMPLETE (PlannerOutcome observability SSOT)** +planner outcome(facts+plan)を SSOT 化し、single_planner の観測が planner facts のみに依存するように統一。 + +**2025-12-29: Phase 29aj P1 COMPLETE (Remove legacy_rules)** +single_planner の legacy_rules を撤去し、Pattern1/3/4/5/8/9 の抽出を plan/extractors に統一。 + +**2025-12-29: Phase 29aj P2 COMPLETE (Pattern1 planner-first)** +chosen_rule を撤去し、Pattern1 SimpleWhile の Facts→Planner-first を導入(仕様不変)。 + +**2025-12-29: Phase 29aj P3 COMPLETE (Pattern3 planner-first)** +Pattern3 If-Phi の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。 + +**2025-12-29: Phase 29aj P4 COMPLETE (Pattern4 planner-first)** +Pattern4 Continue の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。 + +**2025-12-29: Phase 29aj P5 COMPLETE (Pattern5 planner-first)** +Pattern5 Infinite Early Exit の Facts→Planner-first を導入し、single_planner の extractor 依存を縮小。 + +**2025-12-27: Phase 188.3 / Phase 287 P2 COMPLETE (Pattern6 nested loop: merge/latch fixes)** +Pattern6(1-level nested loop)の JoinIR→bridge→merge 経路で発生していた `undefined ValueId` と `vm step budget exceeded`(無限ループ)を解消。`apps/tests/phase1883_nested_minimal.hako` が RC=9 を返し、quick 154 PASS を維持。 + +- SSOT(mergeの契約): + - latch_incoming を記録してよいのは `TailCallKind::BackEdge` のみ(LoopEntry は上書き禁止) + - entry-like 判定は “JoinIR MAIN のみ” を対象にする(block-id 推測はしない): `src/mir/builder/control_flow/joinir/merge/contract_checks/entry_like_policy.rs` + - latch 二重設定は `debug_assert!` で fail-fast(回帰検知) +- 変更箇所: + - `src/mir/builder/control_flow/joinir/merge/instruction_rewriter.rs` + - `src/mir/builder/control_flow/joinir/merge/loop_header_phi_info.rs` +- 検証(DONE): + - [x] 再現とPHI確認(Pattern6) + - [x] latch記録条件を修正(BackEdgeのみ) + - [x] デバッグ出力を撤去(恒常出力なし) + - [x] quick/fixtureで検証(quick 154 PASS / fixture RC=9) + - [x] docsを締めて次の指示書を用意(refactor挟み込み用) + +**2025-12-26: Phase 286 P2.2 COMPLETE (Hygiene: extractor重複排除 + router小整理)** +Pattern1/Pattern4 の Plan/Frag PoC 完了後、extractor の `extract_loop_increment_plan` を `common_helpers.rs` に統一、router の 3行パターン(normalize→verify→lower)を `lower_via_plan()` ヘルパーで共通化。~65行削減、quick 154 PASS 維持。 + +**2025-12-26: Phase 286 P2.3 COMPLETE (Pattern9 AccumConstLoop Plan化 PoC)** +Pattern9 (AccumConstLoop) を Plan/Frag SSOT に移行完了。PHI 2本(loop_var, acc_var)、const/var 両方 OK。Pattern9 は Pattern1 より先にチェック(より具体的なパターン)。quick 154 PASS 維持。 + +- 現行の入口: `docs/development/current/main/10-Now.md` +- Phase 286 詳細: `docs/development/current/main/phases/phase-286/README.md` +- 次の候補: `docs/development/current/main/30-Backlog.md` +- Design goal: `docs/development/current/main/design/join-explicit-cfg-construction.md` + +### 直近の道筋(JoinIR / Normalized) + +### 設計方針メモ(SSOT候補) + +- ExprLowererBox(式SSOT) + - 役割: `AST(expr)` → `(prelude: Vec, value: ValueId)`(ANF含む) + - pure/impure/whitelist/strict の契約を集約(入口SSOT) +- ConditionLowererBox(条件→分岐SSOT) + - 役割: `AST(cond)` → `BranchPlan`(短絡なら分岐語彙で組む) + - 評価順は ExprLowererBox に委譲(ANFで順序固定) + - `&&/||` は制御として扱い、式で無理しない +- ControlLowererBox(制御SSOT) + - 役割: `StepNode/ControlTree` → JoinIR(継続 + env) + - `if/loop` はここ、条件の中身は ConditionLowererBox に委譲 + +- Phase 139: if-only `post_k` の return lowering を `ReturnValueLowererBox` に統一(DONE) + - `docs/development/current/main/phases/phase-139/README.md` +- Phase 140: `NormalizedExprLowererBox` 初版(pure expression のみ)(DONE) + - SSOT: `docs/development/current/main/design/normalized-expr-lowering.md` + - `docs/development/current/main/phases/phase-140/README.md` +- Phase 141 P0: impure 拡張点(contract)を SSOT 化(Call/MethodCall はまだ out-of-scope)(DONE) + - `docs/development/current/main/phases/phase-141/README.md` +- Phase 141 P1: “既知 intrinsic だけ” を許可して段階投入(DONE) + - `docs/development/current/main/phases/phase-141/README.md` +- Phase 141 P1.5: known intrinsic registry + available_inputs 3-source merge + diagnostics(DONE) + - `docs/development/current/main/phases/phase-141/README.md` +- Phase 142-loopstmt P0: 正規化単位を statement(loop 1個)へ寄せる(DONE) + - `docs/development/current/main/phases/phase-142-loopstmt/README.md` +- Phase 142-loopstmt P1: LLVM EXE smoke(同 fixture)を追加(DONE) + - `docs/development/current/main/phases/phase-142-loopstmt/README.md` +- Phase 141 P2+: Call/MethodCall(effects + typing)を分離して段階投入 + - Historical context: `docs/development/current/main/investigations/joinir-generalization-study.md` +- Phase 143-loopvocab P0/P1: loop 内 if/break/continue の語彙追加(DONE) + - `docs/development/current/main/phases/phase-143-loopvocab/README.md` +- Phase 143-loopvocab P2: else 対称化(B-C / C-B)(DONE) + - `docs/development/current/main/phases/phase-143-loopvocab/README.md` +- Phase 145-anf P0/P1/P2: ANF(impure hoist + 再帰的線形化)(DONE) + - `docs/development/current/main/phases/phase-145-anf/README.md` +- Phase 146(in progress): Loop/If 条件式へ ANF を横展開(順序固定と診断) + - `docs/development/current/main/phases/phase-146/README.md` + +## Resolved (historical) + +### WSL EXDEV / cargo build failure (resolved) + +- 2025-12-18: `Invalid cross-device link (os error 18)` により `cargo build` が失敗する事象があったが、`wsl --shutdown` 再起動後に復旧。 +- 再発時のワークアラウンド: `tools/build_llvm.sh` は EXDEV を避けるため `TMPDIR` を `target/...` 配下へ寄せる。