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>
This commit is contained in:
nyash-codex
2025-12-12 03:31:58 +09:00
parent ed8e2d3142
commit 879d3ee08e
5 changed files with 254 additions and 16 deletions

View File

@ -31,7 +31,7 @@
use std::collections::HashMap;
#[cfg(feature = "normalized_dev")]
use crate::config::env::normalized_dev_enabled;
use crate::config::env::joinir_dev::{current_joinir_mode, JoinIrMode};
use crate::mir::join_ir::{ConstValue, JoinFuncId, JoinInst, JoinModule, MirLikeInst, VarId};
#[cfg(feature = "normalized_dev")]
use crate::mir::join_ir::normalized::{
@ -51,8 +51,13 @@ pub fn run_joinir_function(
args: &[JoinValue],
) -> Result<JoinValue, JoinRuntimeError> {
#[cfg(feature = "normalized_dev")]
if normalized_dev_enabled() {
return run_joinir_function_normalized_dev(vm, module, entry, args);
match current_joinir_mode() {
JoinIrMode::NormalizedDev => {
return run_joinir_function_normalized_dev(vm, module, entry, args);
}
_ => {
// Structured-only path (default)
}
}
execute_function(vm, module, entry, args.to_vec())
@ -65,6 +70,7 @@ fn run_joinir_function_normalized_dev(
entry: JoinFuncId,
args: &[JoinValue],
) -> Result<JoinValue, JoinRuntimeError> {
// JoinIrMode::NormalizedDev path: Structured→Normalized→Structured roundtrip
// Keep dev path opt-in and fail-fast: only Structured P1/P2 minis are supported.
dev_env::with_dev_env_if_unset(|| {
let debug = dev_env::normalized_dev_logs_enabled();