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 
This commit is contained in:
nyash-codex
2025-12-12 04:40:46 +09:00
parent 297258f963
commit d4b9ae3ba5
7 changed files with 199 additions and 10 deletions

View File

@ -507,3 +507,23 @@ fn normalized_pattern2_jsonparser_atoi_real_vm_bridge_direct_matches_structured(
);
}
}
#[cfg(feature = "normalized_dev")]
#[test]
fn test_phase46_canonical_set_includes_p2_mid() {
use nyash_rust::mir::join_ir::normalized::shape_guard::{
is_canonical_shape, NormalizedDevShape,
};
// Phase 46: Verify P2-Mid patterns are canonical
assert!(is_canonical_shape(&NormalizedDevShape::JsonparserAtoiReal));
assert!(is_canonical_shape(
&NormalizedDevShape::JsonparserParseNumberReal
));
// Verify P2-Core patterns still canonical
assert!(is_canonical_shape(&NormalizedDevShape::Pattern2Mini));
assert!(is_canonical_shape(&NormalizedDevShape::JsonparserSkipWsMini));
assert!(is_canonical_shape(&NormalizedDevShape::JsonparserSkipWsReal));
assert!(is_canonical_shape(&NormalizedDevShape::JsonparserAtoiMini));
}