docs: Phase 122 plan (if-only emit)

This commit is contained in:
nyash-codex
2025-12-18 04:48:49 +09:00
parent 2a53f87d10
commit 95c9394396

View File

@ -206,3 +206,89 @@ StepTree は capability を“宣言”し、未対応は **Fail-Fastdev-only
**期待値**: **期待値**:
- 既存と同じ数値出力output_validator.sh で比較) - 既存と同じ数値出力output_validator.sh で比較)
- strict mode で落ちない(= shadow parity mismatch が無い) - strict mode で落ちない(= shadow parity mismatch が無い)
## Phase 122: if-only Normalized JoinModule emission (dev-only)
**目的**: Phase 121 の shadow契約だけを一段進めて、if-only を Normalized JoinIRenv+継続)として実際に JoinModule 生成する。
**スコープ**: if-only のみloop 無し。既定挙動は不変dev-only で生成・検証のみ)。
### 設計原則SSOT
**入力SSOT**:
- `StepTree` + `StepTreeContract`facts 再解析禁止)
- `cond_ast` を lowering 入力として使用(条件式の AST 参照)
- contract 以外の AST 再解析は禁止(構造は StepTree に固定)
**env レイアウトSSOT**:
- `writes` に含まれる変数だけをフィールドとして持つ
- 順序は決定的BTreeSet で安定性保証)
- env 構造体は関数間の値の橋渡しに使用
**merge 形式PHI 禁止)**:
- merge = `join_k(env)` への tail-call
- PHI ードは使用しないenv が PHI の役割を果たす)
- if の両分岐から同じ継続関数に tail-call
**strict mismatch 処理**:
- 生成できるはずが失敗 → `freeze_with_hint`hint 必須)
- capability 外は `Ok(None)`(正常な範囲外)
### 対応ノード(最小セット)
**Phase 122 で対応**:
- **If**then/else 分岐)
- **Return**payload なし/整数/変数の最小)
- **Assign**`x = <expr>` の最小: Const/Variable/BinOp(Add)/Call の範囲)
- Phase 115/116/117 で既に対応済みの範囲に限定
**Phase 122 で非対応**capability で拒否):
- Loop / Break / Continuecapability guard で明示的に拒否)
- Printreturn code parity に寄せるため不要)
### 実装責務Box-First
**`StepTreeNormalizedShadowLowererBox::try_lower_if_only`**:
- 責務: StepTree → JoinModuleNormalized 方言)変換
- env レイアウトは `writes` を SSOT として決定
- `cond_ast` を lowering して Compare/Truthiness へ変換
- if-only 限定Loop/Break/Continue は capability で拒否)
**`normalized_shadow/contracts.rs`**:
- 責務: capability チェック(変更なし)
- Unsupported capability の SSOTLoop/Break/Continue
**`normalized_shadow/parity.rs`**:
- 責務: 構造検証(関数数/継続数/tail-call 形式/env 引数)
- strict 時: 生成失敗で `freeze_with_hint`
- 実行器があれば RC 比較も可能(オプション)
### 禁止事項Fail-Fast
- env 直読み禁止(`src/config/env/*` 経由必須)
- ハードコード禁止fixture 名や変数名で分岐しない)
- capability で弾くLoop/Break/Continue
- strict で止める時は `freeze_with_hint`hint 必須)
### 配線dev-only
**既定挙動不変**:
- Phase 121 と同じ配線点を使用
- dev-only のとき: JoinModule を生成 → 検証 → 本経路の結果は変えない
### テスト戦略
**新規 fixture**:
- `apps/tests/phase122_if_only_normalized_emit_min.hako`
- flag=0/1 で return 値が変わるPhase 114/115 系)
- 期待出力: 数値 1-2 行
**Smoke test**:
- `tools/smokes/v2/profiles/integration/apps/phase122_if_only_normalized_emit_vm.sh`
- 期待: 既存実行は PASS + dev-only strict でも落ちない
### デバッグ出力dev-only
```
[trace:dev] phase122/emit: step_tree_sig=... module_emitted=true/false funcs=... conts=... env_fields=...
```