refactor: unify string helpers and pattern2 derived slot

This commit is contained in:
2025-12-28 13:22:02 +09:00
parent 84e1cd7c7b
commit 10e6a15552
41 changed files with 2044 additions and 585 deletions

View File

@ -215,6 +215,39 @@ git revert 93022e7e1
- **方針**: Pattern2 scope 内で完結、SSOT 維持、既定挙動不変
- **Fail-Fast 原則**: 対象外は Ok(None) で後続経路へ、対象だが未対応は Err で即座に失敗silent skip 禁止)
---
# Phase 29ab P4: StageB 実ログ segDerived vs Promote 決定)
## Decision (SSOT)
**A: Derived slot** を採用する。
理由:
- `seg` は loop body で再代入されるため、read-only promotion は原理的に不成立。
- StageB 実ログの形は「body 内で seg を再計算 → break で参照」であり、毎イテレーション再計算の Derived が素直。
- 既存の Pattern2 の構造BodyInit → Breakと `LoopBodyLocalEnv` に収まる。
## Derived slot contract (minimal)
- 対象は **Pattern2 break 条件で参照される LoopBodyLocal 1 変数**。
- ループ body に以下の最小形があること:
1. `local seg = <base>` が top-level に存在
2. `if <cond> { seg = <then> } else { seg = <else> }` が top-level に存在
3. break guard より前に 1) と 2) がある
- `seg` への代入は上記 if/else のみ(他の代入がある場合は out-of-scope
- 代入式は **純粋**MethodCall/Literal/Variableのみ
## Fixtures / Smokes
- `apps/tests/phase263_pattern2_seg_realworld_min.hako` (StageB 実ログ最小化)
- `tools/smokes/v2/profiles/integration/apps/phase263_pattern2_seg_realworld_min_vm.sh`
### Smoke switch rule
- **Before Derived slot**: freeze を PASS`[joinir/freeze]` を期待)
- **After Derived slot**: `print/return = 4` を PASS に切り替える
## Related Documentation
- **Plan file**: `/home/tomoaki/.claude/plans/eventual-mapping-lemon.md`