diff --git a/docs/development/current/main/design/control-tree.md b/docs/development/current/main/design/control-tree.md index f4ea0758..b33c7e23 100644 --- a/docs/development/current/main/design/control-tree.md +++ b/docs/development/current/main/design/control-tree.md @@ -44,6 +44,29 @@ lowering/PHI/CFG の判断にはまだ使わない(dev-only)だが、再解 - `required_caps`: capability 宣言(例: `NestedLoop`, `TryCatch`, `Throw`, `Lambda` など) - `cond_sig`: if/loop 条件式の要約(下記) +### Facts→Decision→Emit 設計(Phase 120) + +**責務分離(Box-First原則)**: +1. **StepTreeBuilderBox**: 構造 + facts 抽出まで + - AST を StepNode 木に変換 + - `StepTreeFacts` を収集(exits/writes/required_caps/cond_sig の生データ) + - 意思決定・整形・署名生成はしない + +2. **StepTreeContractBox**: facts → contract の整形のみ + - `StepTreeFacts` を受け取り `StepTreeContract` に整形 + - BTreeSet で安定性保証(順序決定性) + - 意思決定はしない(facts をそのまま contract に移す) + +3. **StepTree→Normalized**: contract を読むだけ + - AST 再解析禁止 + - contract に含まれる情報のみで lowering 判断 + - 将来実装時の契約 + +**不変条件**: +- `signature_basis_string()` の決定性維持(既定挙動不変) +- facts は順序に依存しない(BTreeSet 使用) +- contract 生成は冪等(同じ facts から同じ contract) + ### cond の SSOT(Phase 119) **SSOT**: `cond` は **AST 参照(ID/ハンドル)** を保持する。