docs: Phase 122 plan (if-only emit)
This commit is contained in:
@ -206,3 +206,89 @@ StepTree は capability を“宣言”し、未対応は **Fail-Fast(dev-only
|
||||
**期待値**:
|
||||
- 既存と同じ数値出力(output_validator.sh で比較)
|
||||
- strict mode で落ちない(= shadow parity mismatch が無い)
|
||||
|
||||
## Phase 122: if-only Normalized JoinModule emission (dev-only)
|
||||
|
||||
**目的**: Phase 121 の shadow(契約だけ)を一段進めて、if-only を Normalized JoinIR(env+継続)として実際に 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 / Continue(capability guard で明示的に拒否)
|
||||
- Print(return code parity に寄せるため不要)
|
||||
|
||||
### 実装責務(Box-First)
|
||||
|
||||
**`StepTreeNormalizedShadowLowererBox::try_lower_if_only`**:
|
||||
- 責務: StepTree → JoinModule(Normalized 方言)変換
|
||||
- env レイアウトは `writes` を SSOT として決定
|
||||
- `cond_ast` を lowering して Compare/Truthiness へ変換
|
||||
- if-only 限定(Loop/Break/Continue は capability で拒否)
|
||||
|
||||
**`normalized_shadow/contracts.rs`**:
|
||||
- 責務: capability チェック(変更なし)
|
||||
- Unsupported capability の SSOT(Loop/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=...
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user