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 で比較)
|
- 既存と同じ数値出力(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 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