9bc9454726
phase29af(p1): add boundary hygiene contract checks
2025-12-29 05:27:14 +09:00
19f2c6b7f6
phase29af(p0): pattern2 boundary hygiene ssot
2025-12-29 05:12:15 +09:00
1e1679f361
phase29ac(p1): normalize pattern6 reverse scan and flip smoke to PASS
2025-12-28 16:54:01 +09:00
209b04d808
docs(phase29ab): closeout P1-P9
2025-12-28 16:36:15 +09:00
b52788b3f6
phase29ab(p6): freeze pattern6 scan-with-init near-miss with fixture+smoke
2025-12-28 15:38:19 +09:00
bea2a8d9bb
phase29ab(p5): freeze pattern7 split-scan near-miss with fixture+smoke
2025-12-28 14:32:19 +09:00
10e6a15552
refactor: unify string helpers and pattern2 derived slot
2025-12-28 13:22:02 +09:00
84e1cd7c7b
phase29ab(p3): fix PromoteDecision contract and add negative smokes
2025-12-28 10:57:55 +09:00
280a5a8187
docs+api: finalize phase29ab P3 contract and update examples
2025-12-28 10:57:48 +09:00
bf9c5105c3
phase29ab(p2): add seg trim fixture+smoke and docs
2025-12-28 09:03:56 +09:00
3bd0c817be
phase29ab(p1): pattern2 carrier binding policy + loopbodylocal fixture
2025-12-28 07:19:03 +09:00
ca91be349d
Refactor JoinIR lowerers and boundary
2025-12-28 03:52:52 +09:00
0269fc2ed4
Reduce build warnings
2025-12-28 01:34:46 +09:00
f654dd316d
Reduce unused warnings in tests and helpers
2025-12-27 17:49:42 +09:00
de1cd1fea0
refactor(joinir): Phase 287 P1 - Modularize ast_feature_extractor (facade pattern)
...
Extracted pattern recognizers from ast_feature_extractor.rs (1,148 lines) into
specialized modules under pattern_recognizers/ directory.
**Structure**:
- ast_feature_extractor.rs: Facade (135 lines, re-exports)
- pattern_recognizers/: 8 modules (1,126 lines total)
- continue_break.rs: continue/break/return detection
- infinite_loop.rs: loop(true) detection
- if_else_phi.rs: if-else PHI pattern detection
- carrier_count.rs: carrier variable counting
- parse_number.rs: parse_number pattern (+ read_digits)
- parse_string.rs: parse_string pattern (+ continue pattern)
- skip_whitespace.rs: skip_whitespace pattern
**Contract**:
- Semantic invariance: All existing APIs preserved via re-exports
- No routing changes, no detection spec changes
- Public API unchanged (facade pattern)
**Verification**:
- Build: 0 errors, 0 warnings
- Pattern6: RC:9 (maintained)
- Smoke tests: 154/154 PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-27 10:42:17 +09:00
a04b48416e
fix(joinir): Phase 287 P2 - Pattern6 nested loop latch overwrite fix
...
Fix infinite loop in Pattern6 (nested loop minimal) caused by main→loop_step
overwriting k_inner_exit→loop_step latch values.
Root cause: JoinIR main entry block was incorrectly treated as BackEdge,
causing it to overwrite the correct latch incoming values set by the true
back edge (k_inner_exit → loop_step).
Solution:
- Restrict latch recording to TailCallKind::BackEdge only
- Treat only MAIN's entry block as entry-like (not loop_step's entry block)
- Add debug_assert! to detect double latch set in future
Refactoring:
- Extract latch recording to latch_incoming_recorder module (SSOT)
- Add boundary.loop_header_func_name for explicit header identification
- Strengthen tail_call_classifier with is_source_entry_like parameter
Tests: apps/tests/phase1883_nested_minimal.hako → RC:9 (was infinite loop)
Smoke: 154/154 PASS, no regressions
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-27 09:39:29 +09:00
d0527bcc2a
feat(joinir): Phase 188.3-P3.3 - Pattern6 continuation generation + Call callee fix
...
Phase 3-3 完了: 4関数モデル JoinIR 生成
- nested_loop_minimal.rs (337行, 新規): 4関数モデル実装
- main(): エントリーポイント
- loop_step(i, sum): outer loop header
- inner_step(j, i_outer, sum): inner loop (tail recursion)
- k_inner_exit(i, sum): outer continuation after inner loop
- k_exit(sum): 最終 exit
- pattern6_nested_minimal.rs: lowering pipeline 実装
- boundary 構築 (continuation_func_ids 設定)
- JoinIRConversionPipeline 呼び出し
- instruction_rewriter.rs: latch incoming 拡張
- continuation→header 呼び出し対応
Call callee 修正:
- call_generator.rs: callee フィールドを Callee::Global に設定
- joinir_block_converter.rs: emit_call_pair 使用に統一
smoke test 追加:
- phase1883_nested_minimal_vm.sh (integration)
既知の問題 (次タスク):
- ValueId(104) undefined: PHI/merge 問題
- JoinIR 関数パラメータの MIR マッピングが不完全
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-27 06:51:43 +09:00
c6ffc06660
feat(joinir): Phase 188.3-P3.1,3.2 - AST extraction & validation helpers
...
Phase 3-1 完了: extract_inner_loop_ast() 実装
- 外側 loop body から内側 loop を抽出
- 正確に 1 つの inner loop を検証
- 0 個 or 2+ 個の場合は明示エラー (Fail-Fast)
Phase 3-2 完了: validate_strict_mode() プレースホルダー
- 現在は大半の検証を is_pattern6_lowerable() で実施
- 将来の strict mode チェック用の足場
ドキュメント追加:
- P1-INSTRUCTIONS.md: Phase 3-3 実装指示書 (4関数モデル詳細)
- README.md: max_loop_depth 定義の明確化
- 10-Now.md: Phase 188.3 方針の整合性維持
次タスク: Phase 3-3 (Continuation 生成) - P1-INSTRUCTIONS.md 参照
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-27 06:22:59 +09:00
a2c5fd90fe
feat(joinir): Phase 188.3 - Pattern6 (NestedLoopMinimal) 選択ロジック実装
...
## Phase 188.3 進捗: Phase 2 完了 (6/13 tasks)
### 実装完了 ✅
**Phase 1: Fixture作成**
- apps/tests/phase1883_nested_minimal.hako 追加
- Add/Compare のみ(乗算なし)
- 期待 exit code: 9 (3×3 nested loops)
- 既存 lowering で fallback 動作確認
**Phase 2: 選択ロジック (SSOT)**
- LoopPatternContext に step_tree_max_loop_depth フィールド追加
- choose_pattern_kind() に Pattern6 選択ロジック実装:
1. Cheap check (has_inner_loop)
2. StepTree 構築 (max_loop_depth 取得)
3. AST validation (is_pattern6_lowerable)
- pattern6_nested_minimal.rs モジュール作成 (stub)
- LOOP_PATTERNS に Pattern6 entry 追加
- **検証**: Pattern6 が正しく選択される ✅
### 設計原則 (確認済み)
1. **Fail-Fast**: Pattern6 選択後は Ok(None) で逃げない
2. **outer 変数 write-back 検出 → validation false** (Phase 188.4+)
3. **最小実装**: inner local だけ、Pattern1 モデル二重化
4. **cfg! 依存なし**: production で動作
### 検証結果
```
[choose_pattern_kind] has_inner_loop=true
[choose_pattern_kind] max_loop_depth=2
[choose_pattern_kind] is_pattern6_lowerable=true
✅ Pattern6 SELECTED!
```
Stub からの期待エラー:
```
[ERROR] ❌ [Pattern6] Nested loop lowering not yet implemented
```
### 次: Phase 3 (Lowering 実装 - 推定4時間)
残りタスク:
- Phase 3-1: AST 抽出ヘルパー
- Phase 3-2: Validation ヘルパー
- Phase 3-3: Continuation 生成 (outer_step, inner_step, k_inner_exit)
- Phase 3-4: fixture が exit=9 を返すことを検証
### 変更ファイル
**新規**:
- apps/tests/phase1883_nested_minimal.hako
- src/mir/builder/control_flow/joinir/patterns/pattern6_nested_minimal.rs
- docs/development/current/main/phases/phase-188.{1,2,3}/README.md
**変更**:
- src/mir/builder/control_flow/joinir/routing.rs (Pattern6 選択)
- src/mir/builder/control_flow/joinir/patterns/router.rs (Context 拡張)
- src/mir/builder/control_flow/joinir/patterns/mod.rs (module 宣言)
🎯 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-27 05:45:12 +09:00
7a575e30cc
refactor(joinir): Phase 286 P3.2 cleanup + normalizer modularization
...
## Legacy Pattern5 削除 (488行)
- pattern5_infinite_early_exit.rs 完全削除
- LOOP_PATTERNS テーブルからエントリ削除
- Plan extractor が SSOT
## Normalizer 分割 (3294行 → 12ファイル)
- helpers.rs: 共通ヘルパー関数
- pattern*.rs: 各パターン専用ファイル
- mod.rs: ディスパッチャ
## ドキュメント更新
- Phase 286 README: クリーンアップ完了・Fail-Fast方針記載
- Phase 287 README: 将来計画
quick smoke 154/154 PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-26 10:30:08 +09:00
22945c190c
feat(joinir): Phase 286 P3.2 - Pattern5 Plan line (loop(true) + early exit)
...
- Pattern5InfiniteEarlyExitPlan (Return/Break variants)
- extract_pattern5_plan() for loop(true) literal only
- normalize_pattern5_return(): 5 blocks CFG (header→body→found/step)
- normalize_pattern5_break(): 6 blocks CFG with carrier PHI
- NormalizationPlanBox exclusion for Pattern5-style loops
- Fixtures: phase286_pattern5_{return,break}_min.hako
- quick smoke 154/154 PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-26 09:56:34 +09:00
b235a5b6db
feat(joinir): Phase 286 P3.1 - Pattern2 Plan line 完走(after_bb PHI)
...
Pattern2(Loop with Break)を Plan/Frag SSOT へ移行。
主な変更:
- Pattern2BreakPlan 追加(DomainPlan variant)
- extract_pattern2_plan() 実装(PoC サブセット厳守)
- normalize_pattern2_break() 実装(6-block CFG, 3 PHI)
- after_bb PHI が本質: carrier_out = PHI(header: carrier_current, break_then: carrier_break)
- router に Pattern2 追加(Pattern1 より前、より具体的)
テスト:
- Fixture B (break without update): PASS (出力 11)
- quick smoke: 154/154 PASS
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-26 05:56:30 +09:00
0fca2df5be
feat(joinir): Phase 286 P2.6.1 - Pattern3 Plan 完走(normalizer 実装 + Fail-Fast 統一)
...
## 変更内容
### Router Fail-Fast 統一
- Pattern3 stub fallback 特例を撤去
- extract 成功 → normalize/lower 失敗は即 Err(他パターンと統一)
### normalize_pattern3_if_phi() 実装
- CFG 構造: 8 blocks (preheader, header, body, then, else, merge, step, after)
- PHI 構成: 3本(header×2 + merge×1)
- Header: loop_var_current, carrier_current
- Merge: carrier_next (if-else 合流)
- Frag: BranchStub×2 + EdgeStub×4(Pattern1 流儀の直接構築)
### 発見・修正
- lowerer は body_bb の block_effects を無視して loop_plan.body を emit
- body_bb effects は CorePlan::Effect(...) として loop_plan.body に配置
## テスト結果
- Phase 118 smoke: PASS (出力 12)
- quick: 154/154 PASS
- Plan line 完走確認: route=plan ... Pattern3_IfPhi MATCHED
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-26 04:39:36 +09:00
3abca63ebe
refactor(joinir): Phase 286 P2.6 コード品質 - pattern3.rs 重複削除 + 共通化
...
## 変更内容
- pattern3.rs: has_return_statement() 削除 → common_helpers 使用
- pattern3.rs: has_control_flow_statement() → has_forbidden_control_flow_for_pattern3() にリネーム
- Pattern3 固有のセマンティクス(ネスト if 禁止)を明確化
- common_helpers.rs: find_if_else_statement() 追加
- PoC subset コメント付き(最初の if-else だけ取る)
## 効果
- 重複コード削除: -34 lines net
- 関数名で意図を明確化(Pattern3 固有の制約)
- common_helpers の再利用性向上
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-26 04:13:13 +09:00
4d17e3d812
feat(joinir): Phase 286 P2.6 - Pattern3 Plan 基盤 + Pattern1 退行修正
...
## Pattern1 退行修正(構造的 Fail-Fast)
- Router に pattern_kind ガード追加(ctx.pattern_kind != Pattern1SimpleWhile → skip)
- has_if_else_statement() ヘルパー追加(再帰版、ScopeBox/Loop 内もチェック)
- Pattern1 extractor に if-else 拒否追加
## Pattern3 Plan 基盤
- DomainPlan: Pattern3IfPhiPlan 構造体追加
- Extractor: extract_pattern3_plan() 追加
- Normalizer: normalize_pattern3_if_phi() スタブ追加(レガシー JoinIR へフォールバック)
- Router: PLAN_EXTRACTORS に Pattern3 追加
## テスト結果
- quick 154 PASS
- Phase 118 smoke PASS(出力 12、退行解消)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-26 04:01:11 +09:00
21daf1b7dd
refactor(joinir): Phase 286 コード品質改善 - ヘルパー共通化 + static box フィルタ
...
## 1. lower_*_ast ヘルパー共通化
- `lower_value_ast()` に MethodCall 対応追加
- Pattern8 normalizer も共有ヘルパーを使用
- Pattern1/8/9 で一貫した lowering ロジック
## 2. PLAN_EXTRACTORS ドキュメント追加
- `WithPostLoop` variant: 将来拡張用として残存理由を明記
- 現在は常に `&[]` を渡すが、post-loop segment analysis 用に保持
## 3. Legacy Pattern8 残存 + static box フィルタ
- Plan extractor は pure 関数(builder にアクセス不可)
- router 側で static box フィルタリングを実装
- static box コンテキストは legacy Pattern8 へ fallback
- legacy 残存理由をドキュメント化
## 検証
- Quick: 154 PASS, 0 FAILED
- Pattern8 integration: exit 7
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-26 03:35:02 +09:00
832d018046
feat(joinir): Phase 286 P2.4.1 - Pattern8 normalizer 実装 + Fail-Fast 化
...
## 概要
Pattern8 (BoolPredicateScan) を Plan line で完走させる。
stub normalizer を完全実装に置き換え、legacy fallback を禁止。
## Step 0: Fixture 簡約
- `?:` ternary → `if/else` に変更(PoC 安定化)
## Step 1: Router Fail-Fast 化
- 文字列判定 `e.contains("[normalizer/pattern8]")` を削除
- extract が Some → normalize/lower 失敗は即 Err(fallback 禁止)
- extract が None → 次の extractor へ(legacy 含む)
## Step 2: Pattern8 normalizer 実装
- CFG: preheader → header(PHI) → body → found/step → after
- found: return false(早期脱出)
- after: return true(ループ完走)
- compose::cleanup() で 2 つの Return exit をマージ
## 検証結果
- Integration: exit 7 ✅
- Plan 完走: route=plan strategy=extract pattern=Pattern8 MATCHED
- Regression: quick 154 PASS, 0 FAILED
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-26 03:17:48 +09:00
064cae169e
feat(joinir): Phase 286 P2.4 - Pattern8 BoolPredicateScan Plan化 PoC
...
## 概要
Pattern8 (BoolPredicateScan) を Plan extraction routing に追加。
static box 除外(Phase 269 決定)を尊重し、非 static box fixture で PoC。
## 実装内容
- Pattern8BoolPredicateScanPlan struct + DomainPlan variant
- extract_pattern8_plan(): 条件・predicate check・increment 抽出
- normalize_pattern8_bool_predicate_scan(): PoC stub(CoreExitPlan::Return 未統合)
- PLAN_EXTRACTORS テーブルに Pattern8 追加(3rd priority)
- エラーフォールバック: Plan normalization 失敗時 → legacy Pattern8 へ
## 動作フロー
Plan extraction MATCHED → normalization failed (PoC stub) → legacy Pattern8 MATCHED
## 検証結果
- Integration: phase286_pattern8_plan_poc_vm PASS (exit 7)
- Regression: quick 154 PASS, 0 FAILED
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-26 03:01:11 +09:00
1d24e9a106
feat(joinir): Phase 286 P2.3 + Phase 287 - Pattern9 Plan化 + Router table-driven
...
## Phase 286 P2.3: Pattern9 AccumConstLoop Plan化 PoC
- DomainPlan::Pattern9AccumConstLoop 追加
- PlanNormalizer::normalize_pattern9_accum_const_loop() 実装
- PHI 2本(loop_var, acc_var)
- const/var 両方 OK(sum = sum + 1 または sum = sum + i)
- Pattern9 は Pattern1 より優先(より具体的なパターン)
- Integration test: phase286_pattern9_frag_poc PASS (return: 3)
- Regression: quick 154 PASS
## Phase 287: Router table-driven Plan extraction
- PLAN_EXTRACTORS static table で Pattern6/7/4/9/1 を統一管理
- PlanExtractorEntry/PlanExtractorVariant 構造体追加
- try_plan_extractors() で ~100行 → 3行に集約
- メンテナンス性向上(新 Pattern 追加はテーブル1行追加のみ)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-26 02:38:09 +09:00
a824346e30
feat(joinir): Phase 286 P2/P2.1/P2.2 - JoinIR Line Absorption (Pattern1/4 Plan化 PoC + hygiene)
...
Phase 286 P2: Pattern4 (Loop with Continue) を Plan/Frag SSOT に移行
- DomainPlan::Pattern4Continue 追加
- PlanNormalizer::normalize_pattern4_continue() 実装(phi_bindings による PHI dst 優先参照)
- Router integration(Plan line routing → legacy fallback)
- Integration test PASS (output: 6), quick smoke 154/154 PASS
Phase 286 P2.1: Pattern1 (SimpleWhile) を Plan/Frag SSOT に移行
- DomainPlan::Pattern1SimpleWhile 追加
- PlanNormalizer::normalize_pattern1_simple_while() 実装(4ブロック、1 PHI、phi_bindings 流用)
- Router integration(Plan line routing → legacy fallback)
- Integration test PASS (return: 3), quick smoke 154/154 PASS
Phase 286 P2.2: hygiene(extractor重複排除 + router小整理)
- extractor helper化: extract_loop_increment_plan を common_helpers.rs に統一
- Pattern1/Pattern4 が呼ぶだけに変更(重複排除 ~25行)
- router helper化: lower_via_plan() を追加し Pattern6/7/4/1 で共用
- 3行パターン(normalize→verify→lower)を1関数に集約(ボイラープレート削減 ~40行)
成果物:
- DomainPlan 2パターン新規追加(Pattern1SimpleWhile, Pattern4Continue)
- Normalizer 2つの normalize 関数追加
- Router に Plan line ブロック追加 + lower_via_plan() helper
- Extractor に extract_pattern1_plan() 追加
- Integration fixtures 2個 + smoke tests 2個
検証:
- quick smoke: 154/154 PASS
- integration: phase286_pattern1_frag_poc PASS, phase286_pattern4_frag_poc PASS
- Plan line routing: route=plan strategy=extract で Pattern1/4 検出確認
🤖 Generated with Claude Code
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com >
2025-12-26 02:03:22 +09:00
86dfa30abe
chore(joinir): Phase 286C-5 Step 3 - Remove unused imports
...
Ran `cargo fix --allow-dirty --lib` to automatically remove unused imports
across the codebase. This cleanup is standard maintenance and improves code
hygiene.
**Files Modified**:
- instruction_rewriter.rs: Removed 6 unused imports
- block_remapper::remap_block_id
- LoweringDecision
- ParameterBindingBox
- propagate_value_type_for_inst (2 occurrences)
- apply_remapped_terminator
- PhiAdjustment, ParameterBinding from scan_box
- Other files: Minor unused import cleanup (12 files total)
**No Functional Changes**: Pure cleanup, all tests expected to pass.
Phase 286C-5 progress: 3/4 steps complete
Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-25 05:18:06 +09:00
843d094598
refactor(joinir): Phase 286 P1-P3 - Boundary contract context enrichment
...
- P1: Add alloc_join_param()/alloc_join_local() API to JoinValueSpace
- Prevents future API misuse (thin wrappers with explicit "JoinIR" context)
- Updated docs with footnote-style number references
- P2: Enrich error context with host_fn for better diagnostics
- Added context: &str parameter to verify_boundary_contract_at_creation()
- Error format now shows: [merge_joinir_mir_blocks host=<fn> ...]
- P3: Add join-side info to error context (continuation count + boundary summary)
- Uses boundary.continuation_func_ids.len() for join=
- Adds [conts=X exits=Y conds=Z] suffix with fixed key names
- Enables faster debugging with log-searchable format
Error format: [merge_joinir_mir_blocks host=X join=Y [conts=A exits=B conds=C]]
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-12-25 02:15:40 +09:00
ab76e39036
feat(parser): Phase 285A1.4 & A1.5 - Weak field sugar + Parser hang fix
...
A1.4: Add sugar syntax `public weak parent` ≡ `public { weak parent }`
A1.5: Fix parser hang on unsupported `param: Type` syntax
Key changes:
- A1.4: Extend visibility parser to handle weak modifier (fields.rs)
- A1.5: Shared helper `parse_param_name_list()` with progress-zero detection
- A1.5: Fix 6 vulnerable parameter parsing loops (methods, constructors, functions)
- Tests: Sugar syntax (OK/NG), parser hang (timeout-based)
- Docs: lifecycle.md, EBNF.md, phase-285a1-boxification.md
Additional changes:
- weak() builtin implementation (handlers/weak.rs)
- Leak tracking improvements (leak_tracker.rs)
- Documentation updates (lifecycle, types, memory-finalization, etc.)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-24 07:44:50 +09:00
dac57ec350
refactor(cleanup): Large-scale dead code elimination (Task 5)
...
Removed 966 lines of dead code identified by Rust compiler warnings.
4 files completely deleted, multiple pattern implementations cleaned up.
**Files Completely Deleted (4)**:
- src/mir/builder/control_flow/joinir/api/entry.rs (15 lines)
- src/mir/builder/control_flow/joinir/api/pipeline_contracts.rs (17 lines)
- src/mir/builder/control_flow/joinir/api/receiver.rs (21 lines)
- src/mir/builder/control_flow/joinir/patterns/pattern2_steps/promote_step_box.rs (33 lines)
**Pattern 7 (SplitScan) - 423 lines deleted**:
- Removed: can_lower(), lower(), cf_loop_pattern7_split_scan_impl()
- Removed helper functions: contains_methodcall(), contains_variable_step(), contains_push()
- Removed test code
- Kept: extract_split_scan_plan() (used by router.rs)
**Pattern 8 (BoolPredicate) - 222 lines deleted**:
- Removed: cf_loop_pattern8_bool_predicate_impl() (impl MirBuilder block)
- Kept: can_lower(), lower() (used by router.rs)
**Pattern 5 (InfiniteEarlyExit) - 95 lines deleted**:
- Removed: count_breaks_and_continues(), validate_continue_position(), validate_break_pattern()
**Pattern 6 (ScanWithInit) - 110 lines deleted**:
- Removed: contains_methodcall(), is_const_step_pattern()
- Removed 4 test functions
**JoinIR API - 53 lines deleted**:
- Removed module: api/entry.rs
- Removed module: api/pipeline_contracts.rs
- Removed module: api/receiver.rs
**EdgeCFG API - 30 lines deleted**:
- EdgeStub: Removed new(), with_target() methods
**Statistics**:
- Total lines deleted: 966
- Files deleted: 4
- Dead code warnings eliminated: Multiple pattern implementations
Build Status: ✅ Release build successful (0 errors)
🤖 Generated with Claude Code
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-24 04:49:52 +09:00
2da730de35
refactor(cleanup): Phase 285A1 Post-Implementation Cleanup
...
Code quality improvements after Phase 285A1 implementation:
**Task 1: Dead Code Cleanup**
- Removed unnecessary #[allow(dead_code)] from emit_weak_load()
- Function is actively used in weak_to_strong() method handler
**Task 2: Unused Import Removal (cargo fix)**
- edgecfg/api/mod.rs: Removed seq, if_, loop_, cleanup, verify_frag_invariants
- pattern3.rs: Removed BinaryOperator
- pattern2/api/mod.rs: Removed PromoteStepResult
- jump.rs: Removed EffectMask, Span
- Result: 6 unused imports eliminated
**Task 3: Deprecated Pattern Removal**
- Fixed 4 PlanKind::LoopWithPost deprecated warnings
- Updated to Phase 142 P0 architecture (statement-level normalization)
- Files: normalized_shadow_suffix_router_box.rs, routing.rs,
execute_box.rs, plan.rs
- Removed 2 deprecated tests: test_loop_with_post_*
**Task 4: WeakFieldValidatorBox Boxification**
- Extracted weak field validation logic into dedicated Box
- New file: src/mir/builder/weak_field_validator.rs (147 lines)
- fields.rs: 277 → 237 lines (-40 lines, -14.4%)
- Added 5 unit tests for validation logic
- Follows Phase 33 boxification principles (single responsibility,
testability, reusability)
**Metrics**:
- Code reduction: -40 lines in fields.rs
- Test coverage: +5 unit tests
- Warnings fixed: 4 deprecated warnings
- Imports cleaned: 6 unused imports
🤖 Generated with Claude Code
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-24 03:44:56 +09:00
661bbe1ab7
feat(phase284): P1 Complete - Return in Loop with Block Remap Fix
...
## Summary
Completed Phase 284 P1: Enable return statements in Pattern4/5 loops via
JoinInst::Ret infrastructure (100% pre-existing, no new infrastructure needed).
**Critical Bug Fix**: Block ID remap priority
- Fixed: local_block_map must take precedence over skipped_entry_redirects
- Root cause: Function-local block IDs can collide with global remap entries
(example: loop_step:bb4 vs k_exit:bb4 after merge allocation)
- Impact: Conditional Jump else branches were incorrectly redirected to exit
- Solution: Check local_block_map FIRST, then skipped_entry_redirects
## Implementation
### New Files
- `src/mir/join_ir/lowering/return_collector.rs` - Return detection SSOT (top-level only, P1 scope)
- `apps/tests/phase284_p1_return_in_loop_min.hako` - Test fixture (exit code 7)
- Smoke test scripts (VM/LLVM)
### Modified Files
- `loop_with_continue_minimal.rs`: Return condition check + Jump generation
- `pattern4_with_continue.rs`: K_RETURN registration in continuation_funcs
- `canonical_names.rs`: K_RETURN constant
- `instruction_rewriter.rs`: Fixed Branch remap priority (P1 fix)
- `terminator.rs`: Fixed Jump/Branch remap priority (P1 fix)
- `conversion_pipeline.rs`: Return normalization support
## Testing
✅ VM: exit=7 PASS
✅ LLVM: exit=7 PASS
✅ Baseline: 46 PASS, 1 FAIL (pre-existing emit issue)
✅ Zero regression
## Design Notes
- JoinInst::Ret infrastructure was 100% complete before P1
- Bridge automatically converts JoinInst::Ret → MIR Return terminator
- Pattern4/5 now properly merge k_return as non-skippable continuation
- Correct semantics: true condition → return, false → continue loop
## Next Phase (P2+)
- Refactor: Block remap SSOT (block_remapper.rs)
- Refactor: Return jump emitter extraction
- Scope: Nested if/loop returns, multiple returns
- Design: Standardize early exit pattern (return/break/continue as Jump with cond)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com >
2025-12-23 14:21:27 +09:00
41d92bedb9
refactor(extractors): Phase 282 P9a - CommonExtractionHelpers SSOT統合(スコープ限定版)
...
# Phase 282 P9a 完了 (Scope-Limited Integration)
## 実装内容
- **common_helpers.rs 作成**: 4グループの共通ヘルパー統合 (316行)
- Group 1: Control Flow Counting (count_control_flow - 汎用カウンター)
- Group 2: Control Flow Detection (has_break/continue/return_statement)
- Group 3: Condition Validation (extract_loop_variable, is_true_literal)
- Group 4: Pattern5専用ヘルパー (validate_continue_at_end, validate_break_in_simple_if)
- **Pattern統合完了**: Pattern5 → Pattern4 → Pattern2 → Pattern1
- Pattern5: ~90行削減 (5 tests PASS)
- Pattern4: ~66行削減 (5 tests PASS)
- Pattern2: ~67行削減 (4 tests PASS)
- Pattern1: ~28行削減 (3 tests PASS)
- Pattern3: 別フェーズに延期(pattern固有ロジック除外)
## 成果
- **コード削減**: ~251行(Pattern3除く、total ~400行見込み)
- **テスト**: 40 unit tests PASS (23 common_helpers + 17 extractors)
- **スモークテスト**: 45 PASS, 1 pre-existing FAIL(退行ゼロ)
- **ビルド警告**: 130 → 120 (-10)
## USER CORRECTIONS適用済み
1. ✅ スコープ限定(共通ロジックのみ、pattern固有除外)
2. ✅ Placeholder禁止(SSOT違反排除)
3. ✅ 統合順序変更(Pattern3を最後/別フェーズへ)
## 追加ドキュメント
- Phase 284 計画追加(Return as ExitKind SSOT)
- 10-Now.md, 30-Backlog.md 更新
🎯 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-23 11:14:28 +09:00
32ccccd272
feat(plan): Phase 282 P5 - Pattern3 ExtractionBased Migration & Classification
...
- Pattern3 extraction logic separated to extractors/pattern3.rs
- ExtractionBased strategy: pure functions, Fail-Fast, SSOT
- Pattern classification restored (AST-based pattern detection)
- Pattern1 extractor migrated (extractors/pattern1.rs)
- Documentation: phase-282 README updated, joinir-architecture updated
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-23 08:13:47 +09:00
c3fb3c5833
feat(joinir): Phase 282 P4 - Pattern2 ExtractionBased Migration
...
## Summary
Migrated Pattern2 (Loop with Conditional Break) from StructureBased to ExtractionBased detection following Pattern1 template (P3). Safety valve + extraction SSOT strategy with zero regression.
## Implementation
- **extractors/pattern2.rs**: 4-phase validation (condition, HAS break, NO continue/return, extraction)
- **pattern2_with_break.rs**: Updated can_lower() (safety valve + extraction) and lower() (re-extraction + ctx.skeleton)
- **extractors/mod.rs**: Registered pattern2 module
## Key Design Decisions
- **Lightweight Parts**: loop_var (String), is_loop_true (bool), break_count (usize) - no AST duplication
- **4-Phase Validation**: Lightweight checks only (condition, break presence, continue/return absence, extraction)
- **Hybrid loop(true) Handling**: Quick detection in extractor, deep validation in can_lower() via LoopTrueCounterExtractorBox
- **SSOT Carrier Validation**: Deferred to CommonPatternInitializer in can_lower() (Step 4)
- **ctx.skeleton Usage**: Re-uses existing ctx.skeleton instead of new env var (避けenv増殖)
## Testing Results
- ✅ Unit tests: 4/4 PASS (extractors::pattern2)
- ✅ Build: 0 errors
- ✅ Regression: 46/49 PASS (zero regression, 1 unrelated pre-existing failure)
- ⚠️ Pattern2 smoke test: Pre-existing PHI bug confirmed (not a regression)
## Migration Template
This implementation provides a template for Pattern3-5 ExtractionBased migration:
1. Lightweight Parts structure (validation results only)
2. 4-phase extraction validation
3. Safety valve (pattern_kind) + extraction (SSOT)
4. Re-extraction in lower() (no caching)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-23 06:49:49 +09:00
8d0808b6d4
feat(joinir): Phase 282 P3 - Pattern1 ExtractionBased Migration
...
Migrated Pattern1 (Simple While Loop) from StructureBased to ExtractionBased
detection, creating a migration template for Pattern2-5.
**Changes**:
1. Created extractors/mod.rs - Module entry point with design principles
2. Created extractors/pattern1.rs - Pure extraction functions with 4-phase validation
3. Updated pattern1_minimal.rs - can_lower() + lower() use extraction
4. Updated mod.rs - Registered extractors module
**Pattern1Parts Design** (Lightweight):
- Stores only loop_var (AST reused from ctx, no heavy copies)
- Validation: 比較条件 + no break/continue/if-else + 単純step (i = i ± const)
- Return statements allowed (not loop control flow)
**4-Phase Validation**:
1. Validate condition structure (比較演算, left=variable)
2. Validate body (no break/continue/if-else-phi)
3. Validate step pattern (simple i = i ± const only)
4. Extract loop variable
**Safety Valve Strategy**:
- pattern_kind as O(1) early rejection guard
- Extraction as SSOT authoritative check
- Re-extraction in lower() (no caching from can_lower)
**Testing**:
- Unit tests: 3/3 PASS
- Build: 0 errors
- Regression: 45/46 PASS (zero regression)
**Migration Template**:
- Result<Option<Parts>, String> return type (Pattern8/9 model)
- Pure functions (no builder mutations)
- Fail-Fast error handling (Err for logic bugs, Ok(None) for non-matches)
🎉 Generated with Claude Code (https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-23 06:09:57 +09:00
a2be79b875
docs(router): Phase 282 P2 - Comment archaeology + TODO cleanup
...
Step 2: Router comment updates
- Update Phase references (183, 273, 282 retained)
- Document ExtractionBased status (Pattern8/9 already done)
- Remove obsolete Phase references (187, 193, 195)
Step 3: TODO cleanup
- pattern5: Remove completed TODO (lowering fully implemented)
- pattern_pipeline: Clarify loop_update_summary status (reserved)
- apply_policy: Mark current_static_box_name as low-priority refactor
Step 4: Pattern3 legacy references
- Simplify module docstring (remove legacy mode details)
- Update inline comments (legacy removal Phase 242-EX-A)
Changes: Comment/docstring only (zero behavior change)
Test: cargo build --release (0 errors)
2025-12-23 05:35:42 +09:00
519e58a977
docs(router): Phase 282 P0+P1 - Router shrinkage SSOT + entrypoint logging
...
P0: Documentation SSOT (~80 lines added)
- Router Responsibilities SSOT (DOES/DOESN'T split)
- Ok(None)/Err boundary rules (Fail-Fast principle)
- Entrypoint table (Plan/JoinIR/None, 収束先明記)
- Pattern番号 = 症状ラベル定義(最小記述)
P1: Minimal Code (~10 lines)
- 4 trace statements modified (router.rs)
- Entrypoint-based logging (route=plan/joinir/none)
- Pattern names preserved (backward compatible)
- No new environment variables (既存trace機構のみ)
Test Results:
- quick profile: 45 PASS / 1 FAIL (既知failure)
- Pattern6 VM: PASS (phase258_p0_index_of_string_vm.sh)
- Pattern6 LLVM: PASS (phase258_p0_index_of_string_llvm_exe.sh)
- Zero regression ✅
Phase 282 Goal Achieved:
- Router shrinkage complete (SSOT positioning clear)
- Pattern numbers → symptom labels transition documented
- CFG construction converges to emit_frag() SSOT
2025-12-23 05:03:25 +09:00
6f1d0df187
docs(plan): Phase 273 P4 - Plan Line SSOT Documentation Finalization
...
Phase 273 P4 では、Plan ライン(Extractor → Normalizer → Verifier → Lowerer)を
"current operational SSOT" として文書化し、アーキテクチャの収束を明文化した。
## Changes
### router.rs docstring 更新
- "Phase 273 P3: Plan Line is Current SSOT for Pattern6/7" セクション追加
- ルーティング戦略を明示(Plan entry points → legacy table)
- SSOT Entry Points を列挙(Pattern6/7 Normalizer, Pattern1-5 各 Lowerer)
### phase-273/README.md 更新
- P3 completion section 追加(generalized CoreLoopPlan 移行完了)
- P3+ Legacy Removal section 追加(~174 lines 削除記録)
- P4 Proposal section 追加(Documentation Finalization チェックリスト)
- SSOT Documentation Entry Points リスト追加(5 つの SSOT 入口)
### joinir-architecture-overview.md 更新
- Section 2.1.2 "Plan-Based Patterns (Pattern6-7, Phase 273 P3)" 追加
- Plan Extractor, Normalizer, Verifier, Lowerer の Box 構造を文書化
- Plan line vs JoinIR line 比較表追加(収束性・SSOT 特性の対比)
- SSOT characteristics リスト追加(Normalizer SSOT, emit_frag SSOT 等)
## SSOT Entry Points(Phase 273 P3 完了時点)
1. **ルーティング**: `router.rs::route_loop_pattern()` - Pattern6/7 Plan entry points
2. **型定義**: `plan/mod.rs` - DomainPlan/CorePlan 固定語彙
3. **正規化**: `plan/normalizer.rs` - Pattern 固有知識一元管理
4. **検証**: `plan/verifier.rs` - fail-fast 不変条件(V2-V9)
5. **降格**: `plan/lowerer.rs` - Pattern-agnostic MIR emission
## Test
- ✅ VM regression: phase254_p0_index_of_vm.sh (PASS)
- ✅ LLVM regression: phase258_p0_index_of_string_llvm_exe.sh (PASS)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-23 00:34:38 +09:00
1b7fd7a0ff
refactor(plan): Phase 273 P3+ - Legacy code removal
...
Phase 273 P3+ 完成: レガシーコード削除 + 未使用 import 整理
Removed Legacy Items:
1. emit_scan_with_init_edgecfg() - Pattern6 固有の emission 関数
- File deleted: src/mir/builder/emission/loop_scan_with_init.rs (~144 lines)
- Replaced by: generalized Frag API (Phase 273 P2)
2. CoreCarrierInfo struct - Legacy carrier representation
- Removed from: src/mir/builder/control_flow/plan/mod.rs (~15 lines)
- Replaced by: CorePhiInfo (generalized PHI representation)
3. verify_carrier() function - CoreCarrierInfo validator
- Removed from: src/mir/builder/control_flow/plan/verifier.rs (~15 lines)
- Replaced by: generalized PHI verification (V7-V9)
Code Cleanup:
- cargo fix applied: unused imports removed (~30 files)
- Verifier invariants updated: V1→V2-V9 (carrier→PHI model)
- Module declaration cleanup in emission/mod.rs
Impact:
- Total lines removed: ~174 lines (net reduction)
- Pattern-agnostic architecture strengthened
- All legacy Pattern6 references eliminated
Tests:
- ✅ VM tests PASS (phase254/256/258)
- ✅ LLVM tests PASS (phase256/258)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-23 00:11:20 +09:00
e4b5a8e832
feat(plan): Phase 273 P2 Step 3-6 - Pattern7 (SplitScan) to Plan line
...
Migrate Pattern7 from legacy lowering to Plan architecture:
DomainPlan (mod.rs):
- Added SplitScan(SplitScanPlan) variant
- SplitScanPlan: s_var, sep_var, result_var, i_var, start_var
Extractor (pattern7_split_scan.rs):
- extract_split_scan_plan() returning DomainPlan
- Reuses existing extract_split_scan_parts()
Router (router.rs):
- Pattern7 now uses Plan line (Normalize→Verify→Lower)
- Removed from LOOP_PATTERNS table
Normalizer (normalizer.rs):
- normalize_split_scan() - 400+ lines migrated from impl
- 6 blocks: preheader/header/body/then/else/step/after
- 4 PHIs: header(2) + step(2) for i/start carriers
- Side effect: push with EffectMask::MUT
Bug fixes:
- Pattern6 extractor returns Ok(None) for non-match (allows fallback)
- Reverse scan filtered early in extractor (P1 scope)
Tests:
- phase256_p0_split_vm: PASS (exit=3)
- phase258_p0_index_of_string_vm: PASS (exit=6)
Lowerer no longer contains "split" - pattern-agnostic achieved!
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-22 23:35:43 +09:00
960241795d
feat(mir/llvm): Phase 273 P0-P1 DomainPlan→CorePlan + LLVM arg fix
...
Phase 273 P0-P1: Two-layer plan architecture
- DomainPlan: Pattern-specific knowledge (ScanWithInit)
- CorePlan: Fixed vocabulary (Seq, Loop, If, Effect, Exit)
- ValueId references only (String expressions forbidden)
- Pipeline: Extractor→Normalizer→Verifier→Lowerer
New plan/ module:
- mod.rs: Type definitions, SSOT spec
- normalizer.rs: DomainPlan→CorePlan + ID allocation
- verifier.rs: V1-V6 invariant checks (fail-fast)
- lowerer.rs: CorePlan→MIR (pattern-agnostic)
LLVM fix (ChatGPT):
- function_lower.py: Fix argument reference bug
- Phase 258 index_of_string now PASS on LLVM backend
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-22 22:42:56 +09:00
757193891f
feat(llvm/phi): Phase 277 P1 - fail-fast validation for PHI strict mode
...
## Summary
Implemented fail-fast validation for PHI ordering and value resolution in strict mode.
## Changes
### P1-1: Strict mode for "PHI after terminator"
- File: `src/llvm_py/phi_wiring/wiring.py::ensure_phi`
- Behavior: `NYASH_LLVM_PHI_STRICT=1` → RuntimeError if PHI created after terminator
- Default: Warning only (no regression)
### P1-2: Strict mode for "fallback 0"
- File: `src/llvm_py/phi_wiring/wiring.py::wire_incomings`
- Behavior: Strict mode forbids silent fallback to 0 (2 locations)
- Location 1: Unresolvable incoming value
- Location 2: Type coercion failure
- Error messages point to next debug file: `llvm_builder.py::_value_at_end_i64`
### P1-3: Connect verify_phi_ordering() to execution path
- File: `src/llvm_py/builders/function_lower.py`
- Behavior: Verify PHI ordering after all instructions emitted
- Debug mode: Shows "✅ All N blocks have correct PHI ordering"
- Strict mode: Raises RuntimeError with block list if violations found
## Testing
✅ Test 1: strict=OFF - passes without errors
✅ Test 2: strict=ON - passes without errors (no violations in test fixtures)
✅ Test 3: debug mode - verify_phi_ordering() connected and running
## Scope
- LLVM harness (Python) changes only
- No new environment variables (uses existing 3 from Phase 277 P2)
- No JoinIR/Rust changes (root fix is Phase 279)
- Default behavior unchanged (strict mode opt-in)
## Next Steps
- Phase 278: Remove deprecated env var support
- Phase 279: Root fix - unify "2本のコンパイラ" pipelines
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-22 14:48:37 +09:00
4ef2261e97
fix(joinir): Phase 269 P1.2 - static call normalization for this.method()
...
Problem:
- `this.method()` calls in static box loops were using string constant "StringUtils" as receiver
- This violated Box Theory (static box this should not be runtime object)
- Pattern8 was trying to pass receiver to JoinIR, causing SSA/PHI issues
Solution (3-part fix):
1. **MeResolverBox Fail-Fast** (stmts.rs): Remove string fallback, error message cleanup
2. **ReceiverNormalizeBox** (calls/build.rs): Normalize `this/me.method()` → static call at compile-time
3. **Pattern8 Skip Static Box** (pattern8_scan_bool_predicate.rs): Reject Pattern8 for static box contexts
Key changes:
- **stmts.rs**: Update error message - remove MeBindingInitializerBox mentions
- **calls/build.rs**: Add This/Me receiver check, normalize to static call if current_static_box exists
- **calls/lowering.rs**: Remove NewBox-based "me" initialization (2 locations - fixes Stage1Cli regression)
- **pattern8_scan_bool_predicate.rs**: Skip Pattern8 for static boxes (use Pattern1 fallback instead)
Result:
- ✅ phase269_p1_2_this_method_in_loop_vm.sh PASS (exit=7)
- ✅ No regression: phase259_p0_is_integer_vm PASS
- ✅ No regression: phase269_p0_pattern8_frag_vm PASS
- ✅ Stage1Cli unit tests PASS
- ✅ MIR uses CallTarget::Global, no const "StringUtils" as receiver
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-22 03:33:30 +09:00
5f22fe8fcd
feat(pattern8): Phase 269 P1 - SSA fix and call_method type annotation
...
Phase 269 P1.0: Pattern8 SSA correctness
- Add PHI node for loop variable `i` in pattern8_scan_bool_predicate.rs
- Ensure proper SSA form: i_current = phi [(preheader, i_init), (step, i_next)]
- Create loop_predicate_scan.rs for Pattern8 Frag emission
- Pre-allocate PHI destination before block generation
- Use insert_phi_at_head_spanned() for span synchronization
Phase 269 P1.1: call_method return type SSOT propagation
- Add callee_sig_name() helper in annotation.rs for function name formatting
- Annotate call_method return types in emit_unified_call_impl()
- Use module signature as SSOT for return type resolution (no hardcoding)
- Arity-aware function name: "BoxName.method/arity"
Fixes: is_integer() now correctly returns Bool instead of String
Test: Simple call_method test returns exit=7 (loop test has pre-existing bug)
Unit tests: All 1389 tests passing
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-22 01:41:19 +09:00
df715e909e
feat(edgecfg): Phase 268-270 savepoint (if_form adoption + Pattern9 minimal loop SSOT)
2025-12-21 23:12:52 +09:00