diff --git a/CURRENT_TASK.md b/CURRENT_TASK.md index a47d26d2..be53a160 100644 --- a/CURRENT_TASK.md +++ b/CURRENT_TASK.md @@ -28,6 +28,7 @@ - **Phase 134 完了**: Plugin loader best-effort loading(決定的順序 + failure 集約 + 継続)を導入。 - **Phase 135 完了**: ConditionLoweringBox allocator SSOT(P0: 根治修正 + P1: contract_checks Fail-Fast 強化)。 - **Phase 136 完了**: MirBuilder Context SSOT 化(+ ValueId allocator 掃討)。 +- **Phase 137-1 完了**: Loop Canonicalizer(型/語彙の SSOT)を導入(routing/lowering には未介入)。 - **Phase 88 完了**: continue + 可変ステップ(i=i+const 差分)を dev-only fixture で固定、StepCalculator Box 抽出。 - **Phase 89 完了**: P0(ContinueReturn detector)+ P1(lowering 実装)完了。 - **Phase 90 完了**: ParseStringComposite + `Null` literal + ContinueReturn(同一値の複数 return-if)を dev-only fixture で固定。 @@ -52,21 +53,23 @@ ## 次の指示書(優先順位) -### P0: Loop Canonicalizer の設計(設計待ち - 外部検討中) +### P0: Loop Canonicalizer の Phase 2(dev-only 観測の導入) -**状態**: 🔶 設計中(ChatGPT Pro と詰めている) +**状態**: ✅ 設計 + Phase 1(型)完了、Phase 2 へ -**目的**: ループ形状の組み合わせ爆発を抑えるための "前処理パス" を設計し、SSOT を定める +**目的**: `LoopSkeleton` / `Capability` / `RoutingDecision` を実際のループ入口で “観測できる” 状態にして、組み合わせ爆発の手前で理由付き Fail-Fast ができる基盤を作る(ただし既定挙動は不変)。 SSOT: - `docs/development/current/main/design/loop-canonicalizer.md` +実装(Phase 1): +- `src/mir/loop_canonicalizer/mod.rs` **次に触るSSOT**: - Loop系の設計: `docs/development/current/main/joinir-architecture-overview.md` 注意: -- 実装は急がず、設計(SSOT)を先に固める -- 既定挙動は変えない(dev-only で段階投入する) +- 既定挙動は変えない(dev-only で観測→段階投入) +- 新しい環境変数は増やさない(`joinir_dev_enabled()` の範囲で観測する) ### P1: JoinIR / Selfhost depth-2 の前進(実装可能 - Phase 91 候補) diff --git a/docs/development/current/main/01-JoinIR-Selfhost-INDEX.md b/docs/development/current/main/01-JoinIR-Selfhost-INDEX.md index 8526a992..dbe4d346 100644 --- a/docs/development/current/main/01-JoinIR-Selfhost-INDEX.md +++ b/docs/development/current/main/01-JoinIR-Selfhost-INDEX.md @@ -42,6 +42,7 @@ JoinIR の箱構造と責務、ループ/if の lowering パターンを把握 - `docs/development/current/main/design/joinir-design-map.md` 5. Loop Canonicalizer(設計 SSOT) - `docs/development/current/main/design/loop-canonicalizer.md` + - 実装(Phase 137-1): `src/mir/loop_canonicalizer/mod.rs` 6. MIR Builder(Context 分割の入口) - `src/mir/builder/README.md` 7. Scope/BindingId(shadowing・束縛同一性の段階移行) diff --git a/docs/development/current/main/10-Now.md b/docs/development/current/main/10-Now.md index eaa52fd1..d01665c9 100644 --- a/docs/development/current/main/10-Now.md +++ b/docs/development/current/main/10-Now.md @@ -27,6 +27,12 @@ - Phase 136: MirBuilder の Context 分割を完了し、状態の SSOT を Context に一本化。 - 詳細: `docs/development/current/main/phases/phase-136/README.md` +## 2025‑12‑16:Phase 137‑1(短報) + +- Loop Canonicalizer の Phase 1(型/語彙の SSOT)を導入(routing/lowering には未介入)。 + - 設計 SSOT: `docs/development/current/main/design/loop-canonicalizer.md` + - 実装: `src/mir/loop_canonicalizer/mod.rs` + ## 2025‑12‑14:現状サマリ (補足)docs が増えて迷子になったときの「置き場所ルール(SSOT)」: diff --git a/docs/development/current/main/design/joinir-design-map.md b/docs/development/current/main/design/joinir-design-map.md index 9b4f27b1..0f63a4d8 100644 --- a/docs/development/current/main/design/joinir-design-map.md +++ b/docs/development/current/main/design/joinir-design-map.md @@ -105,6 +105,7 @@ flowchart LR - Trace(JoinIR ルートの統一トレース): [`src/mir/builder/control_flow/joinir/trace.rs`](../../../../../src/mir/builder/control_flow/joinir/trace.rs) - Error tags(SSOT): [`src/mir/join_ir/lowering/error_tags.rs`](../../../../../src/mir/join_ir/lowering/error_tags.rs) +- Loop Canonicalizer(前処理 SSOT): [`src/mir/loop_canonicalizer/mod.rs`](../../../../../src/mir/loop_canonicalizer/mod.rs) --- diff --git a/docs/development/current/main/design/loop-canonicalizer.md b/docs/development/current/main/design/loop-canonicalizer.md index 6e967767..c4921782 100644 --- a/docs/development/current/main/design/loop-canonicalizer.md +++ b/docs/development/current/main/design/loop-canonicalizer.md @@ -1,6 +1,6 @@ # Loop Canonicalizer(設計 SSOT) -Status: Design (P0) +Status: Phase 1 done(型定義まで) Scope: ループ形の組み合わせ爆発を抑えるための “前処理” の設計(fixture/shape guard/fail-fast と整合) Related: - SSOT (契約/不変条件): `docs/development/current/main/joinir-architecture-overview.md` @@ -158,6 +158,15 @@ pub enum CarrierRole { --- +## 実装の入口(現状) + +Phase 1(型定義のみ)の実装はここ: +- `src/mir/loop_canonicalizer/mod.rs` + +注意: +- ここは「型と語彙の SSOT」を置く場所で、routing/lowering にはまだ介入しない。 +- Phase 2 以降で `canonicalize(loop_ast) -> (LoopSkeleton, RoutingDecision)` を導入し、dev-only で観測から始める。 + ## Capability の語彙(Fail-Fast reason タグ) Skeleton を生成できても lower/merge できるとは限らない。以下の Capability で判定する: @@ -207,13 +216,13 @@ pub struct RoutingDecision { |----------------------------|-------------------------------|-----------------------------------| | `error_tags` | `chosen.is_none()` | Fail-Fast のエラーメッセージ | | `contract_checks` | debug build + 契約違反時 | Phase 135 P1 の verifier に統合 | -| `NYASH_LOOP_ROUTING_TRACE` | 環境変数 ON 時 | 開発時のルーティング追跡 | +| JoinIR dev/debug | `joinir_dev_enabled()==true` | 開発時のルーティング追跡 | | 統計 JSON | 将来拡張 | Corpus 分析(Skeleton Signature) | ### error_tags との統合 -- `RoutingDecision.error_tags` は `src/mir/builder/control_flow/joinir/error_tags.rs` に追記 -- 既存の `ErrorTagCollector` を使用(新規 Box は作らない) +- `RoutingDecision` の Fail-Fast 文言は `src/mir/join_ir/lowering/error_tags.rs` の語彙に寄せる +- 既存のエラータグ(例: `error_tags::freeze(...)`)を使用し、文字列直書きを増やさない --- @@ -269,4 +278,3 @@ loop(p < len) { - [ ] 必要 Capability を列挙し、未達は Fail-Fast(理由が出る) - [ ] 既存 smoke/verify が退行しない(quick は重くしない) - [ ] 新規 Capability は先に `loop-canonicalizer.md` に追記してから実装 - diff --git a/docs/development/current/main/phases/README.md b/docs/development/current/main/phases/README.md index ae30d512..dc8f2dae 100644 --- a/docs/development/current/main/phases/README.md +++ b/docs/development/current/main/phases/README.md @@ -9,6 +9,7 @@ - **Phase 134**: Plugin loader best-effort loading - **Phase 135**: ConditionLoweringBox allocator SSOT(ValueId 衝突の根治) - **Phase 136**: MirBuilder Context SSOT 化(+ ValueId allocator 掃討) +- **Phase 137**: Loop Canonicalizer(前処理 SSOT)導入 ## Phase フォルダ構成(推奨) diff --git a/docs/development/current/main/phases/phase-137/README.md b/docs/development/current/main/phases/phase-137/README.md new file mode 100644 index 00000000..1a036482 --- /dev/null +++ b/docs/development/current/main/phases/phase-137/README.md @@ -0,0 +1,27 @@ +# Phase 137: Loop Canonicalizer(前処理 SSOT) + +## Status +- 状態: 🔶 進行中(Phase 1 完了) + +## Goal +- ループ形の組み合わせ爆発を抑えるため、`AST → LoopSkeleton → (capability/routing)` の前処理を SSOT 化する。 +- 既存の方針(fixture + shape guard + Fail-Fast)を維持したまま、pattern 数を増やさずにスケールさせる。 + +## Phase 1(完了): 型/語彙の SSOT + +- 実装: `src/mir/loop_canonicalizer/mod.rs` + - `LoopSkeleton` / `SkeletonStep` / `UpdateKind` + - `ExitContract` / `CarrierSlot` / `CarrierRole` + - `RoutingDecision` / capability tags(`CAP_MISSING_*`) +- 注意: Phase 1 は「型と語彙」のみ。routing/lowering にはまだ介入しない。 + +## Phase 2(次): dev-only 観測の導入 + +- 目標: ループ入口で `LoopSkeleton` と `RoutingDecision` を生成し、dev-only で観測できるようにする。 +- 既定挙動: 不変(dev-only の観測から開始) +- スイッチ: 新しい env を増やさず、`joinir_dev_enabled()`(既存)配下で有効化する。 + +## SSOT + +- 設計 SSOT: `docs/development/current/main/design/loop-canonicalizer.md` +- JoinIR 契約 SSOT: `docs/development/current/main/joinir-architecture-overview.md`