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>
This commit is contained in:
2025-12-26 10:30:08 +09:00
parent 22945c190c
commit 7a575e30cc
18 changed files with 3394 additions and 4326 deletions

View File

@ -455,6 +455,23 @@ preheader → header(PHI: i, carrier) → body(exit_cond)
- Fixture B (break): PASS (出力 3)
- Regression: quick smoke 154 PASS, 0 FAILED
**クリーンアップ完了P3.2後)**:
- **Legacy Pattern5 削除**: `pattern5_infinite_early_exit.rs` (488行) 完全削除
- **Plan extractor が SSOT**: `extractors/pattern5.rs::extract_pattern5_plan()` が唯一の検出ロジック
- **LOOP_PATTERNS テーブルからエントリ削除**: router.rs の legacy エントリ撤去
**Fail-Fast 方針extract_pattern5_plan**:
| 状況 | 返り値 | 動作 |
|------|--------|------|
| PoC サブセット合致 | `Ok(Some(plan))` | Plan line 完走 |
| PoC サブセット外(構造ミスマッチ) | `Ok(None)` | 他のパターンへ回す |
| close-but-unsupported例: return in legacy Pattern5 | `Err(msg)` | Fail-Fastsilent fallback 禁止) |
**設計決定**:
- PoC サブセット外(複雑な loop(true))は `Ok(None)` で他へ回す
- 既存 legacy Pattern5 の `break + continue` 必須形式は対象外extractor でマッチしない)
- 検出できたが未対応の場合は `Err` で明示的に失敗Fail-Fast 原則維持)
## AcceptanceP0
- 2本の lowering が "設計として" どこで 1 本に収束するかが明文化されている