## Task B: External env input bug fix (Priority 1) Fix: Suffix normalization couldn't access prefix-built local variables **Problem**: `s.length()` failed because 's' (from prefix `s = "abc"`) was not in available_inputs during suffix normalization. **Root cause**: `AvailableInputsCollectorBox::collect()` only collected function params and CapturedEnv, missing `builder.variable_map`. **Solution**: Add `prefix_variables` parameter with 3-source merge: 1. Function params (highest priority) 2. Prefix variables (medium priority - NEW) 3. CapturedEnv (lowest priority) **Changed files**: - src/mir/control_tree/normalized_shadow/available_inputs_collector.rs - src/mir/builder/control_flow/normalization/execute_box.rs - src/mir/builder/control_flow/joinir/patterns/policies/normalized_shadow_suffix_router_box.rs - src/mir/builder/control_flow/joinir/routing.rs - src/mir/builder/stmts.rs - src/mir/control_tree/normalized_shadow/dev_pipeline.rs - docs/development/current/main/design/normalized-expr-lowering.md (Available Inputs SSOT section) **Tests**: 3 new unit tests (prefix merge, priority order) ## Task A: KnownIntrinsic SSOT化 (Priority 2) Eliminate string literal scattered matching by centralizing to registry. **Problem**: Adding new intrinsics required editing if/match chains with hard-coded string literals (`if method == KnownIntrinsic::Length0.method_name()`). **Solution**: Create `KnownIntrinsicRegistryBox` as SSOT: - `lookup(method, arity) -> Option<KnownIntrinsic>` - `get_spec(intrinsic) -> KnownIntrinsicSpec` - Adding new intrinsics now requires: (1) enum variant, (2) registry entry only **Changed files**: - src/mir/control_tree/normalized_shadow/common/known_intrinsics.rs (NEW) - src/mir/control_tree/normalized_shadow/common/expr_lowerer_box.rs - src/mir/control_tree/normalized_shadow/common/expr_lowering_contract.rs (deprecated methods removed) - src/mir/control_tree/normalized_shadow/common/mod.rs - docs/development/current/main/design/normalized-expr-lowering.md (Known Intrinsic SSOT section) **Impact**: ~30% code reduction in intrinsic matching logic ## Task C: Better diagnostics (Priority 3) Add `OutOfScopeReason::IntrinsicNotWhitelisted` for precise diagnostics. **Changed files**: - src/mir/control_tree/normalized_shadow/common/expr_lowering_contract.rs (enum variant) - src/mir/control_tree/normalized_shadow/common/expr_lowerer_box.rs (diagnostic logic) ## Verification ✅ Build: `cargo build --release` - PASS ✅ Phase 97 regression: next_non_ws LLVM EXE - PASS ✅ Phase 131: loop(true) break-once VM - PASS ✅ Phase 136: return literal VM - PASS ✅ Phase 137: return x+2 VM - PASS 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
design/
docs/development/current/main/design/ は、長期参照する設計図(SSOT 寄り)を置く場所。
- 原則: “Phaseの作業ログ/完了報告” は
../phases/に置く。 - 原則: “不具合調査ログ” は
../investigations/に置く。
現役の設計図(入口)
- JoinIR の地図(navigation SSOT):
docs/development/current/main/design/joinir-design-map.md - Loop Canonicalizer(設計 SSOT):
docs/development/current/main/design/loop-canonicalizer.md - ControlTree / StepTree(構造SSOT):
docs/development/current/main/design/control-tree.md