From 95c93943968d212087a8f84558bbfba724934e3b Mon Sep 17 00:00:00 2001 From: nyash-codex Date: Thu, 18 Dec 2025 04:48:49 +0900 Subject: [PATCH] docs: Phase 122 plan (if-only emit) --- .../current/main/design/control-tree.md | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/docs/development/current/main/design/control-tree.md b/docs/development/current/main/design/control-tree.md index da58197a..7b893e9c 100644 --- a/docs/development/current/main/design/control-tree.md +++ b/docs/development/current/main/design/control-tree.md @@ -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 = ` の最小: 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=... +```