diff --git a/docs/development/current/main/10-Now.md b/docs/development/current/main/10-Now.md index ec167480..66519fc6 100644 --- a/docs/development/current/main/10-Now.md +++ b/docs/development/current/main/10-Now.md @@ -9,6 +9,7 @@ Next(設計メモ): - Phase 100: Pinned Read‑Only Captures(ループ外 local を loop 内 receiver として解決): `docs/development/current/main/phases/phase-100/README.md` + - 段階投入: P1=read‑only(Pinned)→ P2=mutable は LoopState(carrier/env)へ ## 2025‑12‑15:Phase 132 完了 ✅ diff --git a/docs/development/current/main/30-Backlog.md b/docs/development/current/main/30-Backlog.md index c60f976f..3ead0df0 100644 --- a/docs/development/current/main/30-Backlog.md +++ b/docs/development/current/main/30-Backlog.md @@ -11,6 +11,10 @@ Related: - **P5b “完全E2E”**(escape skip の実ループを end-to-end で固定) - 現状: Phase 94 で VM E2E まで固定済み。次は selfhost 実コード(`apps/selfhost-vm/json_loader.hako`)へ横展開して回帰を減らす。 - 入口: `docs/development/current/main/phases/phase-94/README.md` +- **Pinned Read‑Only Captures(Phase 100)** + - ねらい: loop 外 local(動的式でも可)を loop 内 receiver として解決できるようにする(`receiver not found` を潰す)。 + - 段階投入: P1=read‑only(Pinned)→ P2=mutable は LoopState(carrier/env)へ昇格。 + - 入口: `docs/development/current/main/phases/phase-100/README.md` - **制御の再帰合成(docs-only → dev-only段階投入)** - ねらい: `loop/if` ネストの “構造” を SSOT(ControlTree/StepTree)で表せるようにする - 注意: canonicalizer は観測/構造SSOTまで(ValueId/PHI配線は Normalized 側へ) diff --git a/docs/development/current/main/phases/phase-100/README.md b/docs/development/current/main/phases/phase-100/README.md index 8dbb6695..7a02b6e2 100644 --- a/docs/development/current/main/phases/phase-100/README.md +++ b/docs/development/current/main/phases/phase-100/README.md @@ -33,3 +33,12 @@ loop(i < n) { - Phase 100 は「ループ外の値が loop 内で見えない」問題(capture/wiring)を解く。 - Loop Canonicalizer は「ループ内の不変式を外に出す」AST 変換であり、別ユースケース。 +## 予定(段階投入) + +この Phase は「自由度を上げるほどバグが出やすい領域」なので、段階投入で進める。 + +- **P1(read‑only)**: ループ外 local を `Pinned` として `CapturedEnv` に取り込み、receiver 解決を通す。 + - Fail‑Fast: loop body 内で再代入される変数は pinned 禁止(理由付き) +- **P2(mutable)**: loop body 内で再代入される外側変数は `Pinned` では扱わず、LoopState(carrier/env)に昇格して運ぶ。 + - 初期は “更新形を限定” して shape guard を作り、未対応は Fail‑Fast(曖昧に通さない) +- **P3(hoist)**: ループ内の不変式の巻き上げは Loop Canonicalizer 側で扱う(別ユースケースとして分離)