acb6720d9b
Phase 61: structural if-sum+break lowering (dev-only)
2025-12-12 22:15:41 +09:00
6aba138950
feat(joinir): Phase 59 - Ownership P3 plumbing (dev-only)
...
P3 (if-sum) パターン用の OwnershipPlan → lowering inputs 変換を追加。
Key changes:
- plan_to_lowering.rs (+153 lines):
- P3LoweringInputs struct (same structure as P2)
- plan_to_p3_inputs() converter
- 4 unit tests (multi-carrier, 5+, condition-only, relay-rejected)
P3 specific features:
- Multi-carrier support (sum, count, 5+ carriers)
- Same Fail-Fast on relay_writes (Phase 59 scope)
- Same CarrierRole discrimination (LoopState vs ConditionOnly)
Integration tests:
- test_phase59_ownership_p3_relay_failfast: Verifies relay detection
- test_phase59_ownership_p3_loop_local_success: Verifies loop-local success
Design: Perfect parallelism with P2
- Same struct layout (carriers, captures, condition_captures)
- Same conversion logic (skip loop var, filter written vars)
- Same error handling (Fail-Fast on relay)
Tests: 946/946 PASS (16 ownership tests)
All code under #[cfg(feature = "normalized_dev")] - zero impact on canonical.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-12 18:45:08 +09:00
fcf85313e5
feat(joinir): Phase 58 - Ownership P2 plumbing (dev-only)
...
OwnershipPlan → P2 lowering inputs 変換の dev 経路を追加。
Key changes:
- New plan_to_lowering.rs (~210 lines):
- P2LoweringInputs struct (carriers/captures/condition_captures)
- plan_to_p2_inputs() converter
- Fail-Fast on relay_writes (Phase 58 scope limitation)
Conversion rules:
- owned_vars where is_written=true → carriers
- Loop variable skipped (pinned, handled separately)
- is_condition_only=true → CarrierRole::ConditionOnly
- Read-only captures preserved
Entry point strategy:
- Analysis-only testing (no lowering path modification yet)
- Proves OwnershipAnalyzer can analyze P2 fixtures
- Full integration deferred to Phase 60+
Tests: 946/946 PASS (7 ownership tests)
- test_simple_p2_conversion
- test_relay_rejected (Fail-Fast verification)
- test_phase58_ownership_p2_comparison
All code under #[cfg(feature = "normalized_dev")] - zero impact on canonical path.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-12 18:08:00 +09:00
c722dc3bf6
feat(joinir): Phase 57 - OwnershipAnalyzer implementation (dev-only)
...
AST/ProgramJSON から OwnershipPlan を生成する解析箱を実装。
Key changes:
- New analyzer.rs (632 lines):
- OwnershipAnalyzer: Main analysis engine
- ScopeKind: Function/Loop/Block/If scope types
- ScopeInfo: Internal scope representation with reads/writes tracking
Algorithm:
1. Build scope tree (Function/Loop/Block/If hierarchy)
2. Collect reads/writes/condition_reads per scope
3. Apply body-local ownership rule (if/block locals → enclosing Loop/Function)
4. Generate OwnershipPlan: owned_vars, relay_writes, captures, condition_captures
Core invariants enforced:
- Ownership Uniqueness: Each variable has exactly one owner
- Carrier Locality: carriers = writes ∩ owned
- Relay Propagation: writes to ancestor-owned → relay up
- Capture Read-Only: captures have no PHI at this scope
Tests: 7 ownership unit tests + 946 existing (0 regressions)
- test_simple_loop_ownership: relay writes to function
- test_loop_local_carrier: owned AND written = carrier
- test_capture_read_only: read-only captures
- test_nested_loop_relay: relay chains through nested loops
Design: "読むのは自由、管理は直下だけ"
Phase 57 is dev-only - not yet connected to lowering.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-12 17:51:53 +09:00
2d10c5ce3f
docs(joinir): Phase 56 - Ownership-Relay Design + interface skeleton
...
「読むのは自由、管理は直下 owned だけ」アーキテクチャの設計文書と型定義。
Key changes:
- Design doc: phase56-ownership-relay-design.md
- Core definitions: owned/carriers/captures/relay
- Invariants: Ownership Uniqueness, Carrier Locality, Relay Propagation
- Shadowing rules, multi-writer merge semantics
- JoinIR mapping from current system to new system
- Implementation phases roadmap (56-61)
- New module: src/mir/join_ir/ownership/
- types.rs: ScopeId, ScopeOwnedVar, RelayVar, CapturedVar, OwnershipPlan
- mod.rs: Module documentation with responsibility boundaries
- README.md: Usage guide and examples
- API methods:
- OwnershipPlan::carriers() - owned AND written variables
- OwnershipPlan::condition_only_carriers() - condition-only carriers
- OwnershipPlan::verify_invariants() - invariant checking
Tests: 942/942 PASS (+3 unit tests)
Zero behavioral change - analysis module skeleton only.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-12 17:39:59 +09:00
80e952b83a
feat(joinir): Phase 54 SELFHOST-SHAPE-GROWTH - 構造軸育成 + 偽陽性観測
...
Phase 53 成果を踏まえ、構造シグネチャ軸を 5+ に育て、
偽陽性観測テストで name ガード縮小準備を整えた。
方針変更: 新ループ追加 → 構造軸育成 + 偽陽性率測定に焦点変更
- 理由: Phase 53 で selfhost P2/P3 実戦パターン追加済み
- 焦点: 既存ループに対する構造軸拡張 + 精度測定
主な成果:
1. 構造軸 5+ 達成:
- carrier 数
- carrier 型
- Compare パターン
- branch 構造
- NEW: Compare op 分布 (count_compare_ops ヘルパー)
2. 偽陽性観測テスト追加:
- test_phase54_structural_axis_discrimination_p2()
- test_phase54_structural_axis_discrimination_p3()
3. 重要な発見 - 偽陽性率 ~50%:
- P2: selfhost P2 が正しく検出されず (name ガード依存)
- P3: selfhost P3 が Pattern4ContinueMinimal と誤検出 (構造的類似性)
- 結論: 構造判定のみでは分離不十分、name ガード必須と判明
変更内容:
- shape_guard.rs (+80 lines):
- count_compare_ops() 構造軸ヘルパー追加
- detect_shapes() pub 化 (テストから呼び出し可能に)
- SelfhostVerifySchemaP2/SelfhostDetectFormatP3 enum 追加 (将来用)
- normalized_joinir_min.rs (+110 lines):
- 偽陽性観測テスト 2 個追加 (P2/P3 各1)
- canonical shapes vs selfhost shapes 構造判定精度測定
- phase49 doc (+200 lines):
- Phase 54 節完成版
- 偽陽性分析結果記録
- name ガード縮小方針明記
- enum 拡張対応:
- bridge.rs (+8 lines)
- normalized.rs (+8 lines)
- ast_lowerer/mod.rs (+2 lines)
偽陽性観測結果 (2025-12-12):
- P2 構造判定: selfhost P2 検出失敗 → name ガード必須
- P3 構造判定: selfhost P3 が Pattern4 と誤判定 → 構造的類似性問題
- 総合: 偽陽性率 ~50% → 構造軸 5 本では不十分
次フェーズ方針 (Phase 55+):
- Phase 55-A: 条件複雑度軸追加 (BinOp/UnaryOp ネスト深度)
- Phase 55-B: 算術パターン軸追加 (Mul/Sub/Div 出現パターン)
- Phase 56: selfhost 実戦ループ追加 (6 本以上蓄積)
- Phase 57: 誤判定率 < 5% 達成後に name ガード縮小開始
name ガード撤去条件 (Phase 57):
- 構造軸 8+ 本確立
- selfhost P2/P3 各 6 本以上蓄積
- 誤判定率 < 5% 達成
- 複合的特徴量ベース判定実装
回帰テスト: ✅ 939 PASS, 0 FAIL (既存挙動不変)
Files Modified: 8 files
Lines Added: ~408 lines (net)
Implementation: Pure additive (feature-gated)
Phase 54 完了!構造軸育成・偽陽性観測基盤確立!
2025-12-12 17:12:58 +09:00
7b0db59100
feat(joinir): Phase 53 - SELFHOST-NORM-DEV-EXPAND implementation
...
Expanded selfhost dev Normalized target with 2 practical P2/P3 loop variations,
strengthened structural signature axis, and implemented two-stage detection.
Key Changes:
1. Documentation (phase49-selfhost-joinir-depth2-design.md +128 lines):
- Added Phase 53 section with candidate selection rationale
- Documented two-stage detector strategy (structural primary + dev-only name guard)
- Defined structural axis strengthening (carrier count/type, branch patterns)
2. Fixtures (+210 lines):
- selfhost_args_parse_p2.program.json (60 lines): P2 with String carrier + conditional branching
- selfhost_stmt_count_p3.program.json (150 lines): P3 with 5 carriers + multi-branch if-else
3. Structured Builders (fixtures.rs +48 lines):
- build_selfhost_args_parse_p2_structured_for_normalized_dev()
- build_selfhost_stmt_count_p3_structured_for_normalized_dev()
4. ShapeGuard Two-Stage Detection (shape_guard.rs +80 lines):
- Added SelfhostArgsParseP2/SelfhostStmtCountP3 to NormalizedDevShape enum
- Implemented is_selfhost_args_parse_p2(): P2 core family + name guard
- Implemented is_selfhost_stmt_count_p3(): 2-10 carrier check + name guard
- Updated capability_for_shape() mappings
5. Bridge Integration (bridge.rs +8 lines, normalized.rs +10 lines):
- Added shape handlers delegating to existing normalizers
- Added roundtrip reconstruction handlers
6. Entry Point Registration (ast_lowerer/mod.rs +2 lines):
- Registered selfhost_args_parse_p2/selfhost_stmt_count_p3 as LoopFrontend routes
7. Dev VM Comparison Tests (normalized_joinir_min.rs +40 lines):
- normalized_selfhost_args_parse_p2_vm_bridge_direct_matches_structured()
- normalized_selfhost_stmt_count_p3_vm_bridge_direct_matches_structured()
8. Test Context Fix (dev_env.rs):
- Added thread-local test context depth counter
- Fixed deadlock in nested test_ctx() calls via reentrant with_dev_env_if_unset()
Structural Axis Growth:
P2 family:
- Carrier count: 1-3 (unchanged)
- NEW: Type diversity (Integer/String mixed)
- NEW: Conditional branching patterns (Eq-heavy comparisons)
P3 family:
- NEW: Carrier count upper bound: 2-10 (was 2-4)
- NEW: Multi-branch if-else (5+ branches with nested structure)
- NEW: Complex conditional patterns
Test Results:
- normalized_dev: 40/40 PASS (including 2 new tests)
- lib regression: 939 PASS, 56 ignored
- Existing behavior unchanged (normalized_dev feature-gated)
Phase 53 Achievements:
✅ P2/P3 each gained 1 practical variation (2 total)
✅ Two-stage detection: structural primary + dev-only name guard
✅ Structural axis expanded: 4 axes (carrier count/type/Compare/branch patterns)
✅ All tests PASS, no regressions
✅ Test context deadlock fixed (0.04s for 29 tests)
Files Modified: 14 files
Lines Added: ~516 lines (net)
Implementation: Pure additive (feature-gated)
Next Phase (54+):
- Accumulate 6+ loops per P2/P3 family
- Achieve 5+ stable structural axes
- Target < 5% false positive rate
- Then shrink/remove name guard scope
2025-12-12 16:40:20 +09:00
386cbc1915
Phase47-B/C: extend P3 normalized shapes and quiet dev warnings
2025-12-12 07:13:34 +09:00
7200309cc3
feat(joinir): Phase 48-A - P4 (continue) Normalized minimal implementation
...
Pattern4 (continue) integration into Normalized JoinIR pipeline complete.
Key changes:
- P4 minimal fixture: skip i==2 pattern, single carrier (acc)
- ShapeGuard: Pattern4ContinueMinimal detector (structure-based)
- StepScheduleBox: ContinueCheck step (eval order: HeaderCond → ContinueCheck → Updates → Tail)
- normalize_pattern4_continue_minimal(): Delegates to P2 (95% infrastructure reuse)
- Tests: 4 integration tests (normalization/runner/VM Bridge comparison×2)
Design validation:
- P4 (continue) = reverse control flow of P2 (break)
- Same loop_step(env, k_exit) skeleton
- Same EnvLayout/ConditionEnv/CarrierInfo infrastructure
- Only difference: evaluation order and control flow direction
Architecture proof:
- Normalized JoinIR successfully handles P1/P2/P3/P4 uniformly
- Infrastructure reuse rate: 95%+ as designed
Tests: 939/939 PASS (+1 from baseline 938, target exceeded!)
Files modified: 10 files (~305 lines added, pure additive)
- pattern4_continue_min.program.json (NEW +126 lines) - P4 fixture
- fixtures.rs (+31 lines) - P4 fixture loader
- shape_guard.rs (+60 lines) - Shape detection
- step_schedule.rs (+18 lines) - Schedule + test
- normalized.rs (+35 lines) - Normalization function
- loop_with_break_minimal.rs (+4 lines) - ContinueCheck handler
- bridge.rs (+5 lines) - VM bridge routing
- ast_lowerer/mod.rs (+2 lines) - Function registration
- normalized_joinir_min.rs (+84 lines) - Integration tests
- CURRENT_TASK.md (+13 lines) - Phase 48-A completion
Next steps:
- Phase 48-B: Extended P4 (multi-carrier, complex continue)
- Phase 48-C: Canonical promotion (always use Normalized for P4)
2025-12-12 06:31:13 +09:00
4ecb6435d3
docs(joinir): Phase 48 - Normalized P4 (Continue) design
...
Complete design documentation for Pattern4 (continue) Normalized support,
extending unified Normalized infrastructure to all 4 loop patterns.
Design documents:
- phase48-norm-p4-design.md: Complete P4 Normalized design (380 lines)
- Key insight: continue = immediate TailCallFn(loop_step, ...) (no new instruction!)
- Infrastructure reuse: 95%+ from P2/P3 (only ContinueCheck step kind new)
- Target loops prioritized:
- ◎ _parse_array (skip whitespace) - PRIMARY (Phase 48-A)
- ○ _parse_object (skip whitespace) - Extended
- △ _unescape_string, _parse_string - Later
- Control flow: ContinueCheck before Updates (skip processing early)
- Same EnvLayout/ConditionEnv/CarrierInfo/ExitLine as P2/P3
- Implementation strategy: dev-only → canonical (proven approach)
Architecture:
- Unified Normalized for P1/P2/P3/P4 (all patterns same pipeline)
- P4 uses loop_step(env, k_exit) skeleton (same as P2/P3)
- continue semantics: TailCallFn = skip to next iteration (CPS natural fit)
Benefits:
- 95% infrastructure reuse from P2/P3
- No new JpInst needed (continue = existing TailCallFn)
- Incremental rollout (dev → canonical)
- Clear semantic: continue = immediate recursion
Implementation roadmap:
- Phase 48-A: Minimal continue (dev-only)
- Phase 48-B: Extended patterns (multi-carrier)
- Phase 48-C: Canonical promotion
Updates:
- joinir-architecture-overview.md: Added Phase 48 section
- CURRENT_TASK.md: Phase 48 entry (Design Complete)
- phase47-norm-p3-design.md: Minor formatting
Status: Design phase complete (doc-only, no implementation yet)
Next: Phase 48-A implementation (when requested)
2025-12-12 06:06:39 +09:00
99bdf93dfe
feat(joinir): Phase 47-A-LOWERING - P3 Normalized→MIR(direct)
...
Implement full Pattern3 (if-sum) Normalized→MIR(direct) support, completing
the P3 minimal implementation.
Key changes:
1. P3 Shape Detection (shape_guard.rs):
- Implemented is_pattern3_if_sum_minimal() with structure-based detection
- Detects P3 characteristics:
- Has Compare instruction (loop condition)
- Has Select instruction (conditional carrier update)
- Has tail call (Call with k_next: None)
- Reasonable param count (2-4 for i, sum carriers)
- Handles both JoinInst::Select and Compute(MirLikeInst::Select)
- Added unit test: test_detect_pattern3_if_sum_minimal_shape ✅
2. P3 Normalization Function (normalized.rs):
- Implemented normalize_pattern3_if_sum_minimal()
- Guards: Validates Structured JoinIR + P3 shape detection
- Phase 47-A minimal: Delegates to P2 normalization (works for simple cases)
- Updated normalized_dev_roundtrip_structured() integration
- Returns Result<NormalizedModule, String> for proper error handling
3. Bridge Integration (bridge.rs):
- Updated normalize_for_shape() to call P3 normalization
- No changes needed to direct.rs (already handles P3 instructions)
4. Integration Tests (normalized_joinir_min.rs):
- Added test_phase47a_pattern3_if_sum_minimal_normalization
- Tests Structured→Normalized transformation
- Verifies shape detection + normalization succeeds
- Validates function count and phase correctness
- Added test_phase47a_pattern3_if_sum_minimal_runner
- Basic smoke test for P3 fixture validity
- Verifies 3-function structure and entry point
Benefits:
- P3 now uses Normalized→MIR(direct) pipeline (same as P1/P2)
- Structure-based detection (no name-based heuristics)
- Minimal implementation (delegates to P2 for simplicity)
- Pure additive (no P1/P2 behavioral changes)
Tests: 938/938 PASS (lib), shape_guard P3 test PASS
- test_detect_pattern3_if_sum_minimal_shape ✅
- test_phase47a_pattern3_if_sum_minimal_normalization ✅
- test_phase47a_pattern3_if_sum_minimal_runner ✅
Next phase: Phase 47-B (proper P3-specific normalization, array_filter, multi-carrier)
Design note: This minimal implementation reuses P2 normalization for simplicity.
Proper P3-specific normalization (IfCond, ThenUpdates, ElseUpdates step sequence)
will be implemented in Phase 47-B when needed for more complex P3 patterns.
2025-12-12 05:53:23 +09:00
c3a26e705e
feat(joinir): Phase 47-A-IMPL - P3 Normalized infrastructure
...
Implement Pattern3 (if-sum) Normalized infrastructure, extending existing P2
StepSchedule and ShapeGuard systems.
Key changes:
1. StepSchedule generalization (P2 → P2/P3):
- Renamed: pattern2_step_schedule.rs → step_schedule.rs
- Extended StepKind enum with P3 variants:
- IfCond (if condition in body)
- ThenUpdates (carrier updates in then branch)
- ElseUpdates (carrier updates in else branch)
- Added pattern3_if_sum_schedule() function
- Added unit test: test_pattern3_if_sum_schedule()
- Updated module references (mod.rs, loop_with_break_minimal.rs)
2. ShapeGuard extension:
- Added Pattern3IfSumMinimal variant to NormalizedDevShape
- Added is_pattern3_if_sum_minimal() detector (placeholder)
- Updated shape detector table
- Extended capability_for_shape() mapping
3. Bridge integration:
- bridge.rs: Added P3 shape handling in normalize_for_shape()
- normalized.rs: Added P3 roundtrip match (uses P2 temporarily)
4. P2/P3 separation:
- loop_with_break_minimal.rs: Added panic for P3 steps in P2 lowering
- Clear boundary enforcement (P2 lowerer rejects P3 steps)
5. Documentation:
- CURRENT_TASK.md: Phase 47-A-IMPL status
- phase47-norm-p3-design.md: Implementation status section
Benefits:
- Reuses 90% of P2 infrastructure (ConditionEnv, CarrierInfo, ExitLine)
- Clean P2/P3 separation via StepKind
- Pure additive changes (no P2 behavioral changes)
- Ready for Phase 47-A-LOWERING (full P3 Normalized implementation)
Tests: 938/938 PASS (+1 from step_schedule unit test)
- All existing P1/P2 tests pass (no regressions)
- P3 test uses Structured path temporarily (proper lowering in next phase)
Next phase: Implement full P3 Normalized→MIR(direct) lowering
2025-12-12 05:23:18 +09:00
42ecd7a7e7
feat(joinir): Phase 47-A prep - P3 fixture and test stub
...
Preparation for Phase 47-A (P3 Normalized minimal implementation).
Added fixture and test stub for pattern3_if_sum_minimal.
Changes:
- fixtures.rs: Added pattern3_if_sum_minimal fixture
- Source: phase212_if_sum_min.hako
- Pattern: Single carrier (sum), simple condition (i > 0)
- Dev-only fixture for P3 Normalized development
- normalized_joinir_min.rs: Added test stub
- test_normalized_pattern3_if_sum_minimal_runner
- Currently returns early (implementation pending)
- Feature-gated: #[cfg(feature = "normalized_dev")]
- Documentation updates:
- CURRENT_TASK.md: Phase 47-A status
- PHASE_43_245B_NORMALIZED_COMPLETION.md: P3 forward reference
- joinir-architecture-overview.md: Minor formatting
- phase47-norm-p3-design.md: Implementation notes
Next steps (Phase 47-A implementation):
1. Rename pattern2_step_schedule.rs → step_schedule.rs
2. Add P3 StepKind (IfCond, ThenUpdates, ElseUpdates)
3. Implement Normalized→MIR(direct) for P3
4. Complete test implementation
Tests: 937/937 PASS (no behavioral changes yet)
2025-12-12 05:07:01 +09:00
23ebb86e6e
docs(joinir): Phase 47 - Normalized P3 (If-Sum) design
...
Complete design for extending Normalized JoinIR to Pattern3 (if-sum) loops,
reusing 90% of existing P2 infrastructure.
Key insight: P3 already uses P2's Structured JoinIR foundation (Phase 220
ConditionEnv integration), so Normalized extension is straightforward.
Design documents:
- phase47-norm-p3-design.md: Complete P3 Normalized design
- Infrastructure reuse analysis (ConditionEnv, CarrierInfo, ExitLine)
- Representative loops identified (phase212_if_sum_min primary target)
- StepScheduleBox extension (IfCond, ThenUpdates, ElseUpdates)
- JpInst reuse (If instruction already exists)
- Implementation strategy (dev-only → canonical)
- File impact estimate (~365 lines, pure additive)
- phase47-test-files-inventory.md: P3 test file catalog
- 3 P3 test files analyzed
- phase212_if_sum_min.hako: Single carrier (PRIMARY)
- phase217_if_sum_multi_min.hako: Multi-carrier (sum + count)
- phase218_json_if_sum_min.hako: Variable accumulation (sum + i)
Architecture:
- Unified Normalized for P1/P2/P3 (same pipeline)
- Conditional updates only difference vs P2
- No P2 code changes needed (pure additive)
Benefits:
- 90% infrastructure reuse from P2
- Proven incremental rollout (dev → canonical)
- Clear path to P4 (continue pattern)
Implementation roadmap:
- Phase 47-A: Minimal sum_count (dev-only)
- Phase 47-B: array_filter (body-local + method calls)
- Phase 47-C: Canonical promotion
Updates:
- joinir-architecture-overview.md: Added Phase 47 section
- CURRENT_TASK.md: Updated Phase 47 entry (Design Complete)
Status: Design phase complete, ready for implementation
2025-12-12 04:50:26 +09:00
d4b9ae3ba5
feat(joinir): Phase 46 - P2-Mid canonical Normalized promotion
...
Promote P2-Mid patterns (_atoi real, _parse_number real) to canonical
Normalized→MIR(direct) route, completing P2 line transition.
Canonical set expansion (Phase 41 → Phase 46):
- P2-Core: Pattern2Mini, skip_ws mini/real, atoi mini
- P2-Mid: atoi real, parse_number real (NEW)
All JsonParser P2 loops (_skip_whitespace, _atoi, _parse_number) now
canonical Normalized - Structured→MIR is legacy/comparison-only.
Key changes:
- shape_guard.rs: Expanded is_canonical_shape() (+2 patterns)
- JsonparserAtoiReal
- JsonparserParseNumberReal
- Made NormalizedDevShape enum public
- bridge.rs: Updated canonical routing comments (Phase 41 → 46)
- normalized.rs: Made shape_guard module public
- normalized_joinir_min.rs: Added Phase 46 canonical verification test
- phase46-norm-canon-p2-mid.md: Complete design documentation
Out of scope (deferred):
- P3/P4 Normalized support → NORM-P3/NORM-P4 phases
- Selfhost complex loops → separate phases
Benefits:
- Clear P2 boundary: All JsonParser P2 = Normalized canonical
- Infrastructure validation: Phase 43/245B proven production-ready
- Simplified mental model: P2 = Normalized-first, P3/P4 = future
Tests: 937/937 PASS (lib), 20/20 PASS (normalized_dev feature)
Phase 46 test: test_phase46_canonical_set_includes_p2_mid ✅
2025-12-12 04:40:46 +09:00
297258f963
docs(joinir): Phase 43/245B Normalized JoinIR completion summary
...
Complete documentation consolidation for Phases 26-45 Normalized JoinIR
infrastructure. All components are implemented and tested (937/937 PASS).
Key additions:
- PHASE_43_245B_NORMALIZED_COMPLETION.md: Master completion summary
- Architecture components (Mode, Capability, Carriers, DigitPos, etc.)
- Supported loop patterns (P1, P2 variants including JsonParser)
- Complete file reference guide
- Test coverage documentation
- Future expansion roadmap
Updates:
- CURRENT_TASK.md: Moved Phase 43/245B to completed section
- joinir-architecture-overview.md: Phases 43-45 marked complete
- Historical docs: Added completion banners with links
- phase223-loopbodylocal-condition-design.md
- phase223-loopbodylocal-condition-inventory.md
- PHASE_223_SUMMARY.md
- phase245b-num_str-carrier-design.md
- phase245c-function-param-capture-summary.md
Documentation hierarchy established:
- Master summary → individual design docs
- Historical docs → completion summary
- Cross-references complete across all docs
Status: Phase 43/245B Normalized infrastructure COMPLETE ✅
2025-12-12 04:19:06 +09:00
c82ae2365f
refactor(joinir): Phase 44 - Capability-based shape guard
...
Refactor shape detection from function-name-based to capability-based
architecture for better extensibility and maintainability.
Key changes:
- ShapeCapabilityKind enum: P2CoreSimple/SkipWs/Atoi/ParseNumber
- ShapeCapability: Capability descriptor with future extensibility
- Helper functions:
- capability_for_shape(): Map shape to capability
- is_canonical_shape(): Exact shape-level check
- is_p2_core_capability(): Broad capability family check
- is_supported_by_normalized(): Normalized dev support
Benefits:
- Extensibility: Easy to add new capability kinds
- Clarity: Shape purpose explicit in kind names
- Maintainability: Centralized mapping vs scattered ifs
- Future-ready: Infrastructure for carrier roles, method signatures
Backward compatibility:
- Zero behavioral changes (pure refactoring)
- Canonical set preserved: Pattern2Mini, skip_ws mini/real, atoi mini
- All existing code paths unchanged
Tests: 937/937 PASS
Files: +78 lines (shape_guard.rs), design doc created
2025-12-12 04:06:03 +09:00
2e6b731563
refactor(config): Modularize env.rs into 7 semantic flag Boxes
...
Refactored monolithic env.rs (948 lines, 106 flat functions) into 7 focused
Box modules following Box-First principles. Zero breaking changes via
backward-compatible re-exports.
**Module organization** (7 semantic Boxes):
- joinir_flags.rs (172 lines, 15 functions) - JoinIR core/experiment flags
- mir_flags.rs (227 lines, 35 functions) - MIR core/PHI/optimizer flags
- vm_backend_flags.rs (135 lines, 15 functions) - VM/Backend/LLVM flags
- parser_flags.rs (136 lines, 10 functions) - Parser stage/postfix flags
- using_flags.rs (70 lines, 7 functions) - Using/namespace system flags
- verification_flags.rs (61 lines, 7 functions) - Verification/SSA flags
- selfhost_flags.rs (98 lines, 12 functions) - Selfhost NY compiler flags
**Improvements**:
- IDE discoverability: `joinir_flags::`, `mir_flags::` in autocomplete
- Single Responsibility: Each Box handles one semantic area
- Maintainability: ~100-200 line modules instead of 948 line monolith
- Scalability: Easy to add new flags to appropriate modules
- Backward compatibility: All functions re-exported at `crate::config::env::`
**Verification**:
- 937/937 tests PASS (zero regressions)
- cargo build --release succeeds
- No code changes required in existing callsites (backward compatible)
Box-First architecture:
- 箱に切り出す: 106 functions → 7 semantic modules
- 境界をはっきりさせる: Each module has clear responsibility
- 差し替え可能: Backward-compatible re-exports
- いつでも戻せる: Original backup created, reverts are safe
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-12 03:59:00 +09:00
a763651162
refactor(joinir): Modularize function_scope_capture (1588→4 modules)
...
Break down monolithic function_scope_capture.rs into 4 focused Box-First modules:
**File structure**:
- mod.rs (57 lines): Public API and module organization
- types.rs (110 lines): CapturedVar, CapturedEnv type definitions
- helpers.rs (411 lines): 11 helper functions for AST analysis
- analyzers.rs (1015 lines): Core analysis functions and FunctionScopeCaptureAnalyzer
**Separation of concerns**:
- types.rs: Pure data structures
- helpers.rs: Reusable utility functions (find_stmt_index, ast_matches, etc.)
- analyzers.rs: High-level analysis logic and orchestration
- mod.rs: Clean public API
**Benefits**:
- Single Responsibility Principle: Each module has one clear purpose
- Maintainability: ~400 line modules instead of 1588 line monolith
- Testability: 12 tests organized by module
- Box-First design: Clear separation with well-defined boundaries
**Verification**:
- 937/937 tests PASS (no regression)
- cargo build --release succeeds
- All docs and comments preserved
- No functional changes
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-12 03:42:57 +09:00
879d3ee08e
feat(joinir): Phase 45 - JoinIR mode unification
...
Unified JoinIR routing logic through centralized JoinIrMode enum:
Key changes:
- Added JoinIrMode enum (StructuredOnly / NormalizedDev / NormalizedCanonical)
- Added current_joinir_mode() for centralized mode determination
- Refactored normalized_dev_enabled() as thin wrapper over mode enum
- Updated bridge.rs: mode-based routing with canonical P2-Core special handling
- Updated runner.rs: mode pattern matching for dev roundtrip path
Files modified:
- joinir_dev.rs: JoinIrMode enum + current_joinir_mode() (+49 lines)
- bridge.rs: Replaced boolean checks with mode pattern matching (+29 lines)
- runner.rs: Mode-based routing logic (+9 lines)
- CURRENT_TASK.md: Phase 45 implementation summary
Documentation:
- phase45-norm-mode-design.md: Complete design spec and implementation guide
Behavior preservation:
- Canonical P2-Core shapes: always Normalized→MIR(direct) (mode-independent)
- NormalizedDev mode: Structured→Normalized→MIR for supported shapes
- StructuredOnly mode: Structured→MIR direct (default)
Tests: 937/937 PASS (no regression, pure refactor)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-12 03:31:58 +09:00
ed8e2d3142
feat(joinir): Phase 248 - Normalized JoinIR infrastructure
...
Major refactoring of JoinIR normalization pipeline:
Key changes:
- Structured→Normalized→MIR(direct) pipeline established
- ShapeGuard enhanced with Pattern2 loop validation
- dev_env.rs: New development fixtures and env control
- fixtures.rs: jsonparser_parse_number_real fixture
- normalized_bridge/direct.rs: Direct MIR generation from Normalized
- pattern2_step_schedule.rs: Extracted step scheduling logic
Files changed:
- normalized.rs: Enhanced NormalizedJoinModule with DevEnv support
- shape_guard.rs: Pattern2-specific validation (+300 lines)
- normalized_bridge.rs: Unified bridge with direct path
- loop_with_break_minimal.rs: Integrated step scheduling
- Deleted: step_schedule.rs (moved to pattern2_step_schedule.rs)
New files:
- param_guess.rs: Loop parameter inference
- pattern2_step_schedule.rs: Step scheduling for Pattern2
- phase43-norm-canon-p2-mid.md: Design doc
Tests: 937/937 PASS (+6 from baseline 931)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-12 03:15:45 +09:00
59caf5864c
Document Phase 36 normalized direct bridge
2025-12-11 22:52:17 +09:00
12e2f87c6f
Refine normalized bridge direct path and env guard
2025-12-11 22:50:23 +09:00
a4756f3ce1
Add dev normalized→MIR bridge for P1/P2 mini and JP _atoi
2025-12-11 22:12:46 +09:00
af6f95cd4b
Phase 33 NORM canon test: enforce normalized dev route for P1/P2/JP mini
2025-12-11 20:54:33 +09:00
59a985b7fa
joinir: clean pattern visibility and refactor pattern2 pipeline
2025-12-11 19:11:26 +09:00
463a6240fb
chore(test): Improve phase246ex_atoi_mini test format
...
- Change from string return ("PASS"/"FAIL") to numeric RC (0=success, 1=fail)
- Add print("result = N") for stdout verification
- Update comments to reflect new test format
This makes test results verifiable via both stdout AND return code,
avoiding future confusion about RC interpretation.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-11 17:24:32 +09:00
eb00d97fdb
feat(joinir): Phase 246-EX Part 2 - Exit PHI & step scheduling fixes
...
Phase 246-EX Part 2 completes the _atoi JoinIR integration:
Key fixes:
- Exit PHI connection: ExitLineReconnector now correctly uses exit PHI dsts
- Jump args preservation: BasicBlock.jump_args field stores JoinIR exit values
- instruction_rewriter: Reads jump_args, remaps JoinIR→HOST values by carrier order
- step_schedule.rs: New module for body-local init step ordering
Files changed:
- reconnector.rs: Exit PHI connection improvements
- instruction_rewriter.rs: Jump args reading & carrier value mapping
- loop_with_break_minimal.rs: Refactored step scheduling
- step_schedule.rs: NEW - Step ordering logic extracted
Tests: 931/931 PASS (no regression)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-11 17:16:10 +09:00
e356524b0a
feat(joinir): Phase 246-EX Part 1 - FromHost carrier infrastructure
...
Extends Phase 247-EX dual-value architecture for _atoi NumberAccumulation
support. Implements FromHost carrier handling throughout JoinIR pipeline.
## Problem Analysis
_atoi requires `result = result * 10 + digit_pos` where:
- digit_pos is promoted to dual carriers: is_digit_pos (bool) + digit_value (int)
- digit_value is used in NumberAccumulation but NOT updated itself
- Existing infrastructure filtered out carriers without updates
## Implementation
### 1. Carrier Filtering (pattern2_with_break.rs:507-514)
**Added FromHost retention**:
```rust
carrier_updates.contains_key(&carrier.name)
|| carrier.role == CarrierRole::ConditionOnly
|| carrier.init == CarrierInit::FromHost // Phase 247-EX
```
**Effect**: Keeps digit_value carrier despite no update expression
### 2. Carrier Update Passthrough (loop_with_break_minimal.rs:411-426)
**Added FromHost passthrough**:
- FromHost carriers without updates pass through from env
- Similar to Phase 227 ConditionOnly handling
- Logged as `[loop/carrier_update] Phase 247-EX: FromHost carrier passthrough`
### 3. Exit Bindings Collection (meta_collector.rs:156-172)
**Added FromHost exit_bindings inclusion**:
```rust
Some((CarrierRole::LoopState, CarrierInit::FromHost)) => {
// Include in exit_bindings for latch incoming
// Not for exit PHI or variable_map
}
```
**Effect**: digit_value gets latch incoming for header PHI
## Test Results
- **Before**: 931 tests PASS
- **After**: 931 tests PASS (0 regressions)
## Verification
**Phase 247-EX UpdateEnv working**:
```
[update_env/phase247ex] Resolved promoted 'digit_pos' → 'digit_value' (integer carrier): ValueId(111)
```
**NumberAccumulation MIR generated**:
```
%39 = %14 Mul %38 ← result * 10
%40 = %39 Add %9 ← tmp + digit_value
```
## Status
- ✅ Pattern2 classification
- ✅ NumberAccumulation detection
- ✅ dual-value carrier resolution
- ✅ FromHost carrier handling
- ⚠️ RC:0 issue (runtime value problem, Part 2)
## Related
- Phase 247-EX: DigitPos dual-value architecture (commit 8900a3cc )
- Phase 227: ConditionOnly carrier handling
- Phase 228-8: ConditionOnly exit_bindings
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-11 15:28:36 +09:00
8900a3cc44
feat(joinir): Phase 247-EX - DigitPos dual-value architecture
...
Extends DigitPos promotion to generate TWO carriers for Pattern A/B support:
- Boolean carrier (is_digit_pos) for break conditions
- Integer carrier (digit_value) for NumberAccumulation
## Implementation
1. **DigitPosPromoter** (loop_body_digitpos_promoter.rs)
- Generates dual carriers: is_<var> (bool) + <base>_value (int)
- Smart naming: "digit_pos" → "digit" (removes "_pos" suffix)
2. **UpdateEnv** (update_env.rs)
- Context-aware promoted variable resolution
- Priority: <base>_value (int) → is_<var> (bool) → standard
- Pass promoted_loopbodylocals from CarrierInfo
3. **Integration** (loop_with_break_minimal.rs)
- UpdateEnv constructor updated to pass promoted list
## Test Results
- **Before**: 925 tests PASS
- **After**: 931 tests PASS (+6 new tests, 0 failures)
## New Tests
- test_promoted_variable_resolution_digit_pos - Full dual-value
- test_promoted_variable_resolution_fallback_to_bool - Fallback
- test_promoted_variable_not_a_carrier - Error handling
## Impact
| Pattern | Before | After |
|---------|--------|-------|
| _parse_number | ✅ Works (bool only) | ✅ Works (bool used, int unused) |
| _atoi | ❌ Failed (missing int) | ✅ READY (int carrier available!) |
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-11 15:08:14 +09:00
d4597dacfa
feat(joinir): Phase 245C - Function parameter capture + test fix
...
Extend CapturedEnv to include function parameters used in loop conditions,
enabling ExprLowerer to resolve variables like `s` in `loop(p < s.length())`.
Phase 245C changes:
- function_scope_capture.rs: Add collect_names_in_loop_parts() helper
- function_scope_capture.rs: Extend analyze_captured_vars_v2() with param capture logic
- function_scope_capture.rs: Add 4 new comprehensive tests
Test fix:
- expr_lowerer/ast_support.rs: Accept all MethodCall nodes for syntax support
(validation happens during lowering in MethodCallLowerer)
Problem solved: "Variable not found: s" errors in loop conditions
Test results: 924/924 PASS (+13 from baseline 911)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-11 13:13:08 +09:00
00ecddbbc9
Add pattern router tests and tidy pattern4 lowering
2025-12-11 04:22:08 +09:00
d4f90976da
refactor(joinir): Phase 244 - ConditionLoweringBox trait unification
...
Unify condition lowering logic across Pattern 2/4 with trait-based API.
New infrastructure:
- condition_lowering_box.rs: ConditionLoweringBox trait + ConditionContext (293 lines)
- ExprLowerer implements ConditionLoweringBox trait (+51 lines)
Pattern migrations:
- Pattern 2 (loop_with_break_minimal.rs): Use trait API
- Pattern 4 (loop_with_continue_minimal.rs): Use trait API
Benefits:
- Unified condition lowering interface
- Extensible for future lowering strategies
- Clean API boundary between patterns and lowering logic
- Zero code duplication
Test results: 911/911 PASS (+2 new tests)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2025-12-11 02:35:31 +09:00
2dfe363365
refactor(joinir): Phase 242-EX-A - Delete legacy Pattern3 lowerer
...
Remove hardcoded Pattern3 PoC implementation (loop_with_if_phi_minimal.rs)
and enhance if-sum mode to handle complex conditions like `i % 2 == 1`.
Key changes:
- condition_pattern.rs: Accept BinaryOp in comparison operands (+58 lines)
- loop_with_if_phi_if_sum.rs: Dynamic complex condition lowering (+147 lines)
- pattern3_with_if_phi.rs: Remove lower_pattern3_legacy() (-130 lines)
- loop_with_if_phi_minimal.rs: Delete entire file (-437 lines)
- loop_patterns/with_if_phi.rs: Update stub (-45 lines)
- mod.rs: Remove module reference (-4 lines)
Net reduction: -664 lines of hardcoded PoC code
Test results: 909/909 PASS (legacy mode completely removed)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-11 01:27:08 +09:00
811dfebf98
fix(joinir): Phase 241-EX - Remove hardcoded 'sum' check from Pattern3
...
Remove legacy hardcoded 'sum' carrier validation that was blocking
array_filter patterns with different accumulator names (e.g., 'out').
Before: Pattern3 required carrier named 'sum' to exist
After: Pattern3 uses carrier_info generically (any carrier name works)
Test results:
- phase49_joinir_array_filter_smoke: PASS ✅
- phase49_joinir_array_filter_fallback: PASS ✅
- phase49_joinir_array_filter_ab_comparison: PASS ✅
- Full suite: 909/909 PASS, 0 FAIL
Also: Archive old roadmap documentation (67k lines moved to docs/archive/)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-11 00:48:42 +09:00
a7dbc15878
feat(joinir): Phase 240-EX - Pattern2 header condition ExprLowerer integration
...
Implementation:
- Add make_pattern2_scope_manager() helper for DRY
- Header conditions use ExprLowerer for supported patterns
- Legacy fallback for unsupported patterns
- Fail-Fast on supported patterns that fail
Tests:
- 4 new tests (all pass)
- test_expr_lowerer_supports_simple_header_condition_i_less_literal
- test_expr_lowerer_supports_header_condition_var_less_var
- test_expr_lowerer_header_condition_generates_expected_instructions
- test_pattern2_header_condition_via_exprlowerer
Also: Archive old phase documentation (34k lines removed)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-11 00:33:04 +09:00
448bf3d8c5
docs(joinir): Phase 232-239 documentation and ExprLowerer refinements
...
Documentation:
- Move completion reports to docs/archive/reports/
- Add phase232-238 design/inventory documents
- Update joinir-architecture-overview.md
- Add doc-status-policy.md
Code refinements:
- ExprLowerer: condition catalog improvements
- ScopeManager: boundary clarifications
- CarrierInfo: cleanup
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-11 00:21:29 +09:00
13a676d406
feat(joinir): Phase 231 - ExprLowerer/ScopeManager pilot implementation
...
Pilot implementation of unified expression lowering for Pattern2 break conditions:
New files:
- scope_manager.rs (280 lines) - ScopeManager trait + Pattern2ScopeManager
- expr_lowerer.rs (455 lines) - ExprLowerer with Condition context support
Features:
- Unified variable lookup across ConditionEnv/LoopBodyLocalEnv/CapturedEnv/CarrierInfo
- Pre-validation of condition AST before lowering
- Fail-safe design with fallback to legacy path
- 8 new unit tests (all pass)
Integration:
- Pattern2 break condition uses ExprLowerer for pre-validation
- Existing proven lowering path preserved
- Zero impact on existing functionality (890/897 tests pass)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-10 22:48:45 +09:00
b07329b37f
feat(joinir): Phase 224-E - DigitPos condition normalization
...
Add DigitPosConditionNormalizer to transform integer comparison to boolean:
- `digit_pos < 0` → `!is_digit_pos`
This eliminates the type error caused by comparing Bool carrier with Integer:
- Before: Bool(is_digit_pos) < Integer(0) → Type error
- After: !is_digit_pos → Boolean expression, no type mismatch
Implementation:
- New Box: digitpos_condition_normalizer.rs (173 lines)
- Pattern2 integration: normalize after promotion success
- 5 unit tests (all pass)
- E2E test passes (type error eliminated)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-10 22:10:28 +09:00
38e810d071
refactor(joinir): Phase 229 - Remove redundant ConditionAlias
...
Replace static alias mapping with dynamic condition variable resolution using:
- promoted_loopbodylocals as source of truth
- Naming conventions: is_<var> or is_<var>_match
- Pattern-aware inference during lowering
Benefits:
- Simpler data structure (6 fields → 5)
- Single source of truth
- Self-documenting with explicit naming conventions
- Fewer maintenance points
Net: -25 lines (60 additions, 85 deletions)
Tests: 877/884 PASS (no regressions)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-10 21:53:27 +09:00
717a50ceeb
feat(joinir): Phase 228-8 - ConditionOnly carrier latch incoming support
...
- ExitMetaCollector includes ConditionOnly carriers in exit_bindings (for latch)
- ExitLineReconnector skips ConditionOnly in variable_map updates
- Pattern 2/3/4 pass carrier_info to ExitMetaCollector
- Resolves "has no latch incoming set" error
Role separation:
- Header PHI: entry + latch for both LoopState and ConditionOnly
- Exit PHI: LoopState only (ConditionOnly excluded)
- variable_map: LoopState only (ConditionOnly skipped)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-10 21:30:03 +09:00
192620f842
feat(joinir): Phase 228 - CarrierInit for ConditionOnly header PHI initialization
...
- Add CarrierInit enum (FromHost/BoolConst) for explicit initialization policy
- LoopHeaderPhiBuilder generates Const instruction for BoolConst carriers
- merge/mod.rs uses carrier_info to include ALL carriers in header PHI
- Pattern 2/4 pass carrier_info to boundary builder
- ConditionOnly carriers (is_digit_pos) now included in header PHI
Remaining: latch incoming for ConditionOnly carriers (Phase 228-8)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-10 21:10:28 +09:00
478cc0012e
feat(joinir): Phase 227 - CarrierRole separation (LoopState vs ConditionOnly)
...
- Add CarrierRole enum to distinguish state carriers from condition-only carriers
- ConditionOnly carriers (is_digit_pos) skip exit PHI but keep header PHI
- Update all test struct literals with role field
- 877/884 tests PASS (7 pre-existing failures unrelated)
Remaining: ValueId(0) undefined - header PHI initialization for ConditionOnly
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-10 20:07:30 +09:00
d28e54ba06
feat(joinir): Phase 226 - Cascading LoopBodyLocal resolution
...
- Add LoopBodyLocalEnv to argument resolution in MethodCallLowerer
- Implement cascading lookup: LoopBodyLocalEnv → ConditionEnv
- Enable ch → digit_pos dependency chain in init expressions
- Resolves "Variable 'ch' not bound in ConditionEnv" error
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-10 19:29:03 +09:00
0243de871f
feat(joinir): Phase 225 - MethodCall init meta-driven lowering
...
- Remove hardcoded method whitelist from loop_body_local_init.rs
- Remove hardcoded box name matching
- Delegate to MethodCallLowerer for all MethodCall handling
- CoreMethodId metadata is now SSOT for init method validation
- substring now works in body-local init (-82 net lines)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-10 19:08:18 +09:00
4e00edcea5
feat(joinir): Phase 224-D - ConditionAlias for promoted variable resolution
...
- Add ConditionAlias type to CarrierInfo (old_name → carrier_name)
- Record aliases in DigitPosPromoter and TrimPatternInfo
- Resolve aliases in Pattern2 ConditionEnv building
- digit_pos now correctly resolves to is_digit_pos carrier
Fixes "Variable 'digit_pos' not bound in ConditionEnv" error.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-10 18:45:04 +09:00
8e3b55ddec
feat(joinir): Phase 224-C - MethodCallLowerer with argument support
...
- Add StringIndexOf to CoreMethodId (arity=1, return IntegerBox)
- Extend MethodCallLowerer to handle methods with arguments
- Add arity checking against CoreMethodId metadata
- Recursive argument lowering via lower_value_expression
- 8 unit tests PASS (indexOf, substring, arity mismatch)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-10 18:19:14 +09:00
250555bfc0
feat(joinir): Phase 224-B - MethodCallLowerer + CoreMethodId extension
...
- Extend CoreMethodId with is_pure(), allowed_in_condition(), allowed_in_init()
- New MethodCallLowerer box for metadata-driven MethodCall lowering
- Integrate MethodCall handling in condition_lowerer
- P0: Zero-argument methods (length) supported
- Design principle: NO method name hardcoding, CoreMethodId metadata only
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-10 17:59:24 +09:00
4cddca1cae
feat(joinir): Phase 224-cont - Promoted variable tracking for lowerer
...
- Add promoted_loopbodylocals field to CarrierInfo
- Record promoted variables in Pattern2 promotion handler
- Filter promoted variables in lowerer LoopBodyLocal check
- digit_pos → is_digit_pos promotion now continues to lowering
Closes Phase 224 lowerer integration gap.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-10 16:30:53 +09:00
00d1ec7cc5
feat(joinir): Phase 224 - DigitPosPromoter for A-4 pattern (core complete)
...
- New DigitPosPromoter Box for cascading indexOf pattern detection
- Two-tier promotion strategy: A-3 Trim → A-4 DigitPos fallback
- Unit tests 6/6 PASS (comparison operators, cascading dependency)
- Promotion verified: digit_pos → is_digit_pos carrier
⚠️ Lowerer integration gap: lower_loop_with_break_minimal doesn't
recognize promoted variables yet (Phase 224-continuation)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-10 16:21:01 +09:00