ADR-0044 — spec-pack による folio rules の self-host (engine B6)

Status: accepted · Date: 2026-06-22 · folio v1.0.0 · engine epic folio-0dv / B6 (folio-qf1)。 文書規律エンジンの self-dogfood endgame を確定する。 folio 自身の規約文書 rules.html を新 spec-pack (SRS でも principle でもない第三ジャンル = EARS 章立て規範文 + 非終端照会) で機械 SSoT から決定的生成し、 「engine が folio 文書型を再現できる」を core (lib/) 無改変で実証する (rule-of-three の B6 完成サイン = 最も異質な doc-type が純粋 pack として挿さる)。 源は extraction-bootstrap (rules.html → contract YAML)、 生成物は /tmp 非破壊、 忠実性は 自己参照独立 ceiling (engine≠oracle で fail-open を断つ) で検証する。 設計の探索 (design-of-record) は engine §1 endgame (research domain) にあり、 本 ADR は実装 + 検証 (commit a33af5d / errata baefae8) 後の forward decision を記録する。 ADR-0042 の hybrid 生成・ADR-0043 の照会 graph・ADR-0028 の二層 enforcement を folio self-host へ適用する。

§1. Context

engine epic folio-0dv は folio の文書規律を一般化した汎用文書生成エンジンを構築する (engine 設計 doc)。 その §1 は self-dogfood endgame — 「rule-of-three の最終局面 = folio 自身をこのエンジンで dogfood する」— を北極星に置いた。 B1–B5 は engine を組み上げた: core 抽出 (ADR-0042 の決定的 assembler + opus prose)・4 pack (SRS / ADR / research / principle)・照会 graph と HOW-outside enforcement (ADR-0043)。 残る問いは engine が folio 自身の文書を再現できるかである。

構造ギャップ (grounding sweep で確認): (a) 既存 4 pack は SRS / ADR / research / principle のみで folio の design-intent doc-type (rules / self-spec / relations / verification) 用 pack が無い。 (b) architecture/ は手書き HTML で機械 SSoT (contract) が存在しない。 「源も受け皿も無い」のが endgame の構造的障壁である。

SRS-pack は使えない (2 blocker spike で実測確認)。 grounding 当初は「rules は EARS 要件が最多ゆえ SRS-pack に最も近い」と推定したが、 spike で assemble-srs.shRTM 三層連結 (上位事業ニーズ → 要件 → 受入基準を集合一致で fail-closed) を必須とすることが判明した。 folio の rules は EARS 規約だが事業ニーズも受入基準も持たない規範文ゆえ、 SRS-pack に挿せば捏造になる。 最も近い既存 pack は principle pack だが、 principle は照会終端 (前方照会を持つと verify FAIL) であり、 前方照会 を多数持つ rules とは終端不変条件が衝突する。 すなわち rules は SRS でも principle でもない第三ジャンルである。

B6 (folio-qf1) の設計 grill (2026-06-22) は scope を (B) 証明優先 — 1 pack + 1 文書 (rules) で「engine が folio 文書型を再現できる」を実証し、 残り 3 文書 (verification / relations / self-spec) は follow-up — と確定した。 本 ADR はその実装 (実装 cell folio-8ct = commit a33af5d) と独立 ceiling 検証 (wf_8367ac81) 後の forward decision を記録する。

§2. Decision

§2.1 spec-pack = 第三ジャンル (EARS 章立て規範文 + 非終端照会)

folio の design-intent spec (rules / verification / relations) のための新 spec-pack を新設する。 schema は SRS (RTM 三層必須) でも principle (照会終端・tier ベース・EARS 無) でもない第三ジャンル = EARS 章立て規範文 + 前方 (非終端) 照会 + dual-audience。 構成 = assemble-spec.sh (決定的 assembler) / contract/folio-rules.spec.yaml (機械 SSoT) / verify-spec.sh (floor gate) / rolemap/spec.rolemap.yaml (照会 graph 接続) / prose/folio-rules.prose.yaml (opus prose スロット)。

★core (lib/) 無改変が B6 完成サイン: spec-pack は lib/{common,verify-common,graph-common}.sh + inject-prose.sh1 バイトも変えず純粋 pack として挿さる (git diff 空で実証)。 これは最も異質な doc-type (非終端照会・EARS 章立て・SRS の RTM も principle の tier も持たない instance#5) が core 無改変で挿さったことを意味し、 engine core 抽出完了の最終確証となる (ADR-0042 の hybrid 生成機構が doc-type 非依存であることの 5 例目の証拠)。 番号を出現順から計算する band()CHAPN カウンタ等、 既存 core が新 pack に無改変で再利用される。

非終端照会の graph 接続: rules は前方照会 (constitution P-x / ADR / verification REQ-VER) を持つ非終端ノードゆえ、 rolemap/spec.rolemap.yamlgraph.principle_edge (rules → constitution・role=implementation・forward) を宣言し、 ADR-0043verify-graph.sh が FOLIO-RULES の principle 終端到達を実証する。 これにより rules は非終端ノードとして principle 終端へ到達し、 照会 graph 上で終端完備となる (B5 の external-ref warn 「inbound from rules.html」解消は §5 Trace 参照)。

§2.2 extraction-bootstrap (機械抽出で源を起こす)

contract (機械 SSoT) は HTML から機械抽出する one-shot bootstrap (scripts/extract-rules-spec.sh) で起こす。 rules.html は属性マーク済 (id / data-ears-pattern = SSoT / .ears-id / .section-essence / glossary / .xref) ゆえ構造化層を確実に抽出でき、 捏造リスクを最小化する (人間が contract をゼロから書く手動 author は rules の規模 〔29 spec-row〕 では転記漏れ risk が大きい)。 抽出器は HTML に存在する人間層 (section / EARS 要件 / essence / 表 / 図 / glossary / 照会) を contract 化し、 モデル化しなかった verbose な機械層 prose の件数を stderr に LOG する (no silent caps = 除外を可視化)。 位置づけは「既存 HTML を contract 化する一回限りの bootstrap」で、 以後は contract が SSoT、 HTML は生成物となる。

§2.3 非破壊生成 + 自己参照独立 ceiling (engine≠oracle)

非破壊: 生成物は /tmp/folio-design-samples/b6-spec/ に置き、 architecture/spec/rules.html を一切編集しない。 validate golden を dirty にせず可逆。 byte-identity 一致は opus prose 充填ゆえ不可能で、 忠実性は内容等価で測る (P-14 人間可読性の生成物適用)。 現 HTML の置換は drift gate を要するため follow-up に繰延。

★自己参照独立 ceiling: folio が自身の spec を生成し、 それを同じ folio CLI (folio validate / verify-graph) で検証すると、 生成ロジックのバグと検証ロジックのバグが同一コードベースで相殺しうる (engine=oracle の fail-open)。 これを断つため、 忠実性判定には folio 自身の gate と独立した read-only ceiling (生成 HTML を原 rules.html + contract と別 agent で突合) を必須とする (ADR-0028 の二層 enforcement を engine≠oracle へ強化)。 とりわけ floor (verify-spec) は「生成が contract から導出されたか」しか検査できず「contract が rules.html を忠実に捉えているか (= 抽出の忠実性)」は構造上検査できないため、 独立 ceiling がこの死角を突く。 floor 単独通過は CEILING=PENDING で GREEN を機械的に禁ずる。

§2.4 正直な scope (人間層プレゼン 再現 / 機械層 round-trip は境界)

本 self-host が実証する主張水準を正直に限定する。 独立 ceiling (wf_8367ac81 = proof_sound) が確認した事実: 生成物は rules.html の人間層プレゼン を高忠実に再現する (12 section / 26 EARS 要件は規範文まで byte 一致 / 表 / mermaid / glossary 25 / 照会 30 / 捏造ゼロ)。 一方 data-audience="machine" の機械層 prose は extractor が非モデル化する。 ゆえに正当な主張は「engine が rules 文書型の人間層プレゼンを機械 SSoT から決定的・捏造ゼロで生成できる」であり、 「rules.html 全体 (dual-audience) を再現」と無限定に言うと overclaim となる。 この境界は生成物本文に開示する (cover-summary / 照会 lead に「人間層プレゼン であり機械層は source 参照」と明記)。 機械層も含む full dual-audience round-trip は folio-w1f に繰延 (これが完了すると北極星「非エンジニア×機械 両対応」の self-host が full 化する)。

§3. Consequences

§4. Alternatives

§5. Trace

design-of-record (探索): engine §1 endgame (research domain・self-dogfood)。 基盤: ADR-0042 (hybrid 生成 = 決定的 assembler + opus prose スロット + 集合一致 fail-closed を spec-pack が無改変共用)。 継承: ADR-0043 (照会 graph 終端完備を spec-pack rolemap が踏襲し、 rules → constitution edge で B5 の external-ref warn を forward 接続)。 一般化: ADR-0028 (二層 enforcement を engine≠oracle の独立 ceiling へ強化・CEILING=PENDING)。 self-host target: rules.html (Layer 1 普遍規約)。 原則接地: P-3 (WHAT/HOW 分離 = 機械層 prose の非モデル化境界) / P-5 (1 entity = 1 canonical name = symbolic id 参照) / P-7 (3-domain = research/decision/spec) / P-10 (ADR 昇格は user 承認) / P-13 (WHAT↔HOW 束縛) / P-14 (人間可読性 = 生成物に適用・gate I)。 追跡: bd engine epic folio-0dv / B6 folio-qf1 (実装 cell folio-8ct = spec-pack + extractor + 生成 commit a33af5d / §0 errata = baefae8)。 検証: floor (verify-spec) PASS / 敵対 spec 38 + graph 19 / sandbox 40/40 / validate clean / core byte-identity / 独立 ceiling wf_8367ac81 = proof_sound・land-with-errata / user walk = gate I 北極星 MET。 follow-up: folio-w1f (機械層 dual-audience round-trip = full self-host) / folio-tr0 (残 3 文書 self-host) / folio-17n (spec-pack 専用 ceiling agents 制度化) / folio-4wz (core emit_glossary latent bug) / folio-2jr (spec-pack polish 束) / folio-wlu (§N symbolic section-ref の間接化)。 決定の経緯: user grill 2026-06-22 (grounding sweep + 2 blocker spike で SRS 不適合 = RTM 三層を実測確認・scope を (B) 証明優先に確定) + 独立 ceiling (engine≠oracle で抽出忠実性の死角を突き proof_sound / land-with-errata 判定) + user walk (gate I 北極星 「前より読みやすい」)。 version: 本 ADR 文書版 = 1.0.0 (記録する実装は engine epic folio-0dv・後方互換 capability 追加)。