ADR-0043 — 照会 graph 終端完備 + HOW-outside content boundary の 3-tier enforcement

Status: accepted · Date: 2026-06-22 · folio v1.0.0 · engine epic folio-0dv / B5 (folio-983)。 文書規律エンジンの照会 graph 終端完備検証HOW-outside content boundaryを、 決定的 floor (CI guarantee) と意味的 ceiling (advisory) の二層 + 3-tier enforcement (注入 / 編集 gate / CI) として確定する。 per-pack 局所照会検証 (B1–B4 で実証済) を graph 全体の principle 終端到達保証へ拡張し、 design-intent (WHAT/WHY) 本文への実装 HOW 混入を機械検出する。 設計の探索 (design-of-record) は engine §10 (research domain・路線「い」) にあり、 本 ADR は実装 + 検証 (commit 1c48156 / 2c49a74 / 59f3fc9) 後の forward decision を記録する。 ADR-0028 の二層 enforcement・ADR-0007 の context injection・ADR-0034 の xref graph を engine 汎用機構へ一般化する。

§1. Context

engine epic folio-0dv は folio の文書規律を一般化した汎用文書生成エンジンを構築する (engine 設計 doc)。 その §3 は doc-type を跨ぐ照会 graph (主張 → 根拠 → 探索 → … → 原則 終端) を、 §4 は WHAT/WHY と実装 HOW を分離する HOW-outside を design intent として置いた。 B1–B4 (clinic ADR / core 抽出 / research pack / principle pack) は per-pack の照会検証 (verify_cross_doc_refs = contract YAML を SSoT に各 doc 内の cross-doc 照会の存在と SET 一致を検証) を実装・実証した。

第一の gap — 局所照会では graph 全体の終端到達を保証できない。 per-pack verify は「この doc が宣言する照会先が存在するか」を局所に検査するが、 corpus 全体を 1 つの graph として見たとき「全チェーンが原則 (principle) 終端へ到達するか」は検査しない。 原則へ繋がらない孤立ノードや、 受け手の無い phantom 照会が局所検証を素通りしうる。 「根拠を原則まで全部見せて」という engine の北極星 (doc-type を跨ぐ説明可能性) は、 graph-level の終端完備性を保証して初めて成立する。

第二の gap — HOW 混入に強制機構が無い。 design-intent 文書 (WHAT/WHY) に実装/環境固有の HOW (P-3 portability 違反・P-11 の具体 primitive) が紛れ込むと、 文書が特定実装に癒着し portability と読みやすさを損なう。 だが B4 時点で HOW 混入を止める機構は助言的 lens 1 本のみで、 CI hard gate は存在しなかった。

B5 (folio-983) の設計 grill (2026-06-21) は reader 要約でなく実 corpus と現行機構を read-only で精査する grounding sweep を 3 本走らせ、 検証済事実に基づき 7 論点を詰めた。 sweep は地図に無かった重大事実 — 終端の 2 系統分裂 / inbound.from の完全無検査 / HOW-leak の hard gate ゼロ / userConfig の runtime 未読 — を炙り出し、 配布方式の推奨を案A から案C へ反転させた。 本 ADR はその確定設計を、 実装 + 検証 (engine §10 の 3 子セルが land 済) 後に forward decision として記録する。

§2. Decision

§2.1 照会 graph 終端完備検証 (rolemap + reachability)

(a) rolemap — pack ごとに rolemap (node-type → 抽象ロール 〔claim / rationale / exploration / verification / principle / implementation〕 の写像表) を pack 側 SSoT として宣言する。 抽象ロールにより「主張 → 根拠 → … → 原則終端」の統一 edge を doc-type 跨ぎで定義でき、 P-5 (1 entity = 1 canonical name) を保ったまま「根拠を原則まで辿る」が成立する。 リーダーは core (additive) に置き、 scope 内 edge のロールは floor で edge.role == rolemap[node.type] を pin する (co-author + enforce = ADR-0033 の規律を踏襲)。 corpus からの draft → 明示宣言 → pin が二重担保となり、 ロールの不在 (例 SRS の exploration 不在) は scan で実証解決する。

(b) reachability — 照会の真の SSoT は contract YAML (ADR-0034 の xref graph を格納・描画基盤に再利用、 HTML data-* は描画用 projection ゆえ別表現への転写を避ける)。 独立 script が contract/ を集約し edge union を作り、 principle 終端への到達可能性を 1 計算で {終端完備 / 孤立 = warn / 逆方向 = 局所} に展開する。 終端は domain-local principle を許容する (ADR inline の原則を graph node に昇格 = repo-local 完備と整合)。 孤立は方向ゼロでなく到達可能性で定義し、 改訂来歴 (amended_by) は meta-edge として reachability から除外する。 既存 core 関数は不変、 graph traversal は独立 script に置く。

§2.2 HOW-outside content boundary (二段 floor + ceiling)

design-intent (WHAT/WHY) 本文には HOW を埋めず、 実装/検証 (HOW) へは照会リンクで繋ぐ content boundary を二段 floor + ceiling で強制する。 floor-1 = 照会リンク存在 (本文 <a href> の link-integrity 延長)。 floor-2 = P-11 4-enum の保守的検出 — 環境変数の具体値 / バイナリ path / OS コマンド / 明示ツール起動という明示 primitive の有無を可視テキストから構文検出する。 明示 primitive の有無は意味判定の射程外ゆえ ADR-0028 の prose-gate 精度懸念に当たらない。 ceiling = 概念 HOW (P-3 portability 依存の記述) を既存 spec-review-ssot lens の強化で advisory に検出する (新 agent 不要)。 scope = spec_path (design-intent 空間)・HOW の住処である plugin harness は対象外。 floor-2 は誤検出率を実測する staged rollout を採り、 当初は soft-warn (exit 非影響の advisory) で着地させ、 許容内と確認後に新 ADR (P-10 user 承認) で CI hard gate へ昇格する。

§2.3 3-tier enforcement (注入 / 編集 gate / CI)

§2.1/§2.2 の規律を 3 つの層で consumer へ配布する。 配布方式は plugin 固定 (新 userConfig 変数 0) — userConfig は runtime 未読 (base_url のみ実読) ゆえ「userConfig 拡張」は新機構実装を要し不採用 (§4)。

§2.4 横断原則 (境界 / 決定的↔意味的 / core additive)

§3. Consequences

§4. Alternatives

§5. Trace

design-of-record (探索): engine §10 (research domain・路線「い」 = research に留め実証後 ADR 昇格)。 一般化元: ADR-0028 (二層 enforcement モデル — 決定的 floor / 意味的 ceiling / CEILING=PENDING を engine の照会 graph・HOW-outside へ拡張)・ADR-0007 (SessionStart 注入を tier1 digest へ拡張)。 基盤: ADR-0034 (xref graph を照会 graph の格納・描画基盤に再利用・contract YAML を SSoT)。 継承: ADR-0033 (co-author + enforce を rolemap pin が踏襲)。 規範化先: rules.html (照会 graph / rolemap / HOW-outside contract)・verification.html (graph floor + HOW floor の REQ)。 原則接地: P-3 (WHAT/HOW 分離) / P-7 (3-domain) / P-11 (HOW の隔離) / P-10 (ADR 昇格は user 承認)。 追跡: bd engine epic folio-0dv / B5 folio-983 (子 folio-p4o = graph 終端完備検証 commit 1c48156 / folio-6us = HOW-outside gate commit 2c49a74 / folio-hi6 = tier1/2 配布 + CI 統合 commit 59f3fc9)。 follow-up: folio-pgb (floor-2 hard-gate 昇格・needs-user) / folio-ulz (孤立 SRS warn→block policy・needs-user) / folio-0v0 (rules.html の HOW primitive 言い換え) / folio-1sn (rolemap allowlist 一本化)。 B6 前払い: 照会 graph helper を doc-type 非依存で core に置き folio 自身の横断 graph へ転用し、 folio-self-spec の HOW 参照の <a href> 昇格を B6 (folio-qf1) self-dogfood の deliverable とする。 決定の経緯: user grill 2026-06-21 (grounding sweep 3 本で検証済事実に基づき 7 論点を詰め、 配布推奨を案A → 案C へ反転) + B1–B4 実証 (per-pack 照会検証が load-bearing と確認)。 version: 本 ADR 文書版 = 1.0.0 (記録する実装は engine epic folio-0dv・後方互換 capability 追加)。