この spec は、 folio の generator が機械 SSoT (contract + prose YAML) から生成する SRS プレゼン HTML が「完成した (GREEN)」と言える条件を定める。 決定的で blocking な floor と LLM の ceiling の二層で、 floor 単独では GREEN を宣言しないのが要。
機械 SSoT から生成した SRS プレゼン HTML の完成判定を、 決定的で blocking な floor と LLM の ceiling の二層で定義する (REQ-VER-024〜030、 SRS 部品 taxonomy §5)。 機械/LLM 検証境界: 件数・構造・render・構成同一性など算術的に自明なものだけを floor が blocking で裁き、 自由文の捏造・可読性・意味カバレッジは LLM の ceiling (gate J / I / K) が裁く。 一次根拠は fabrication-free-by-construction (rules §12・構造捏造は構成上不可能) ゆえ、 静的 ban 群は非 blocking の warn 級 backstop に留め、 floor 単独で GREEN を宣言しない。
以下は folio 自身の spec 検証 (verification.html §3.6 / §3.8) と異なり、 consumer が機械 SSoT から生成する SRS プレゼン HTML の done-condition を定義する (design-system generator .claude-plugin/design-system/generator/ が実装)。 設計 SSoT は SRS 部品 taxonomy §5 (二層判定式 floor + ceiling)、 生成方式は ADR-0042 (ハイブリッド = 構造決定的・prose のみ opus) / ADR-0041。 conformance は generator-local の test-adversarial.sh + render-gate-srs.py --selftest (sandbox scenarios でなく generator-local + CI dogfood — 生成物向けゆえ consumer の folio validate には入れない)。 本 spec は taxonomy §5 で設計済みの二層モデルを REQ-VER 形式で形式化する (新規 ADR を要さない)。 機械/LLM 検証境界: 自由文の意味的忠実性 (契約への忠実さ・捏造・矛盾・可読性) は決定的アルゴリズムで判定不能ゆえ、 機械 floor は algorithmic に自明なもの (件数・id・集合・派生・構造の存在/完全性・幾何 render 健全性) のみを blocking で裁き (escape 健全性の検査は warn 級 backstop の領分)、 意味検証は独立コンテキストの LLM reviewer を複数束ねる ceiling (taxonomy §5.3 gate I/J/K) が担う (確信は reviewer 数と敵対的突合で調整・別建ての決定的安全網を後付けしない)。 その一次根拠 = fabrication-free-by-construction (rules §12 が WHAT の SSoT・構造捏造は構成上排除済み) ゆえ、 機械 census (全列挙 backstop) が捏造を再検査するのは重複検査であり、 静的 hidden-render ban 群 (REQ-VER-024) の意味権威は ceiling gate I/J にあり、 これら決定的機構は honest-bug を実捕捉する warn 級 backstop (非 blocking) である。 blocking の部品件数照合は census-count arm (REQ-VER-024 blocking arm・source DOM の静的件数 ↔ contract 期待件数・render 不要) が、 post-build 改変の検出は構成同一性 arm (REQ-VER-030) が担う (機構と検出完全性の論証は同 record が SSoT)。 census closure 語彙の全単射 (REQ-VER-029) は本境界下では語彙鮮度の floor である (census 消費の基盤ではない)。 各 REQ-VER の gate 割当・blocking arm と warn 級 backstop の区分は本 spec が SSoT。
生成 SRS の done-condition を 5 REQ で形式化する (REQ-VER-024〜030・027/028 は欠番)。 各 REQ が §1 の境界のどこ (blocking floor / warn 級 backstop / ceiling) に属すかを、 各 REQ の essence と machine 部の双方に明記する。
folio verify-srs <html> <contract> は生成 SRS の決定的 floor を検査する: blocking arm = gate A–E,G,H + visual-first + census-count (部品件数の静的 DOM 照合)。 静的 hidden-render ban 群と visual-deception ban は fabrication-free-by-construction (rules §12) の脅威向けwarn 級 backstop (非 blocking・意味権威は ceiling gate J)。 ★blocking arm 全 PASS でも CEILING=PENDING を返し floor 単独 GREEN を禁じる (手編集後も再検証可・render/構成同一性/ceiling は 025/030/026、 ban 群一覧と詳細は machine 部)。
REQ-VER-024: WHEN the folio verify-srs <generated.html> <contract.yaml> command runs (CLI 引数順 = <html> <contract>、 html=主対象), it SHALL check the deterministic floor of a generated SRS presentation (taxonomy §5.2 gate A–E,G,H + visual-first) over the (contract, html) pair alone (manifest 不要 = 成果物入力ゆえ手編集後も再検証可), flagging with non-zero exit: gate A — 各 MUST 部品 (S5 凍結 required-existence 集合: doc-cover-band / chapter-deck-band / section-lead-callout / scope-summary-panel / actor-stakeholder-table / source-trace-origin / requirement-matrix-table / ears-requirement-row / priority-badge / nfr-hero-metrics / nfr-metrics-table / acceptance-criteria-checklist / rtm-collapse / constraint-callout / glossary-term-table / fidelity-sync-meta / requirement-type-color-tokens) が data-component 属性で各 ≥1 (条件付き MUST = MUST-when-applicable は凍結集合外); gate B — register 整合 (deck-band family ≥1 ∧ dense系 ≥1 ∧ requirement-type-color-tokens 存在 ∧ @media (prefers-color-scheme: dark) 規則の両モード定義 — コメント擬装でなく規則ブロック存在を要求); gate C — RTM 完全性 (孤立要件 (出所なし) = 0 ∧ 未検証要件 (受入なし) = 0、 contract の trace.backward / trace.acceptance から導出); gate D — 要件 ID 健全性 (一意 data-req-id (重複 0) ∧ 全要件行に priority-badge ∧ 検証手法 (T/A/I/D) span ∧ 可視 fid span == 同行 data-req-id で手編集の可視 ID 捏造を検出); gate E — 用語被覆 (plain-language-term-inline の plain 併記が glossary plain_short から正確派生 = verify-fabrication-free --artifact §9 に委譲); gate G — 内容完全性 (no-TBD: MUST 部品の必須スロット非空 ∧ placeholder トークン (TBD/TODO/未定 等・case-insensitive・語境界・日本語含む) = 0); gate H — fidelity meta (fidelity-sync-meta の 機械SSoT / 生成 / 検証状態 の 3 項目が非空白で充填); visual-first — 各章 (footer 除く) に非 prose 部品 ≥1 (字だけの章 = 0); census-count — 計数部品の source DOM 静的件数が contract 由来期待件数と一致 (ears-requirement-row == .requirements 数 ∧ nfr-metric-row == .nfr 数 ∧ .plain == .requirements + .nfr・render を要さない算術照合; 実描画・可視性の意味照合は ceiling の領分・post-build 改変は REQ-VER-030 が byte 検出)。 ★以下の静的 hidden-render ban 群と visual-deception ban は fabrication-free-by-construction (rules §12) で構造捏造が構成上排除済ゆえ warn 級 backstop (非 blocking) とし、 意味権威は ceiling gate J にある (§1 境界参照): static script-ban — SRS HTML 全体で <script> == 0 (case-insensitive・タグ境界 \b robust・head/body 双方被覆): SRS は <script> を一切 emit しないゆえ任意の <script> は捏造コンテナ — 検証通過後に innerHTML 等で genuine 要件/承認/章を捏造差替えする render-time DOM-swap (folio-4gz) か、 必須要素を <script> で包み静的 grep を素通しつつ browser 非描画にする OMISSION (folio-459 script-container) — を render を要さず pack-additive 静的 invariant で原理封鎖する (<style> 由来の content 捏造と comment 由来の OMISSION は post-build の byte 改変ゆえ構成同一性 = REQ-VER-030 が render を要さず捕捉し、 意味権威は ceiling gate J にある); static shadowroot-ban — SRS HTML 全体で <template> == 0 (whole-tag ban・case-insensitive・タグ境界 \b robust): SRS は declarative shadow DOM を一切 emit しないゆえ、 <template shadowrootmode> 内に注入した偽要件が描画されつつ document.querySelectorAll (census) の shadow 境界を貫通しない census-blindness (folio-hef FF5) を pack-additive 静的 invariant で render を要さず原理封鎖する (★shadowrootmode 属性を狙う narrow regex <template[^>]*shadowrootmode> は negated class [^>]* がクォート属性値内の '>' 〔例 <template data-x="a>b" shadowrootmode>〕 で停止し素通る fail-open だった 〔独立 ceiling wf_b544a704〕 ため、 属性に依存しない whole-tag <template> ban に転換した); static nested-context-ban — SRS HTML 全体で <iframe> / <object> / <embed> / <frame> / <frameset> / <portal> == 0: nested browsing context は declarative shadow DOM と同型の境界 (census/fidelity の document 走査が srcdoc / 別 document を貫通しない) を作るため、 同型の pack-additive 静的 invariant で封鎖する (folio-hef FF5-sibling・独立 ceiling wf_0900ca71); static inline-only-ban — SRS HTML 全体で replaced / interactive / form-associated 要素 <img> / <image> / <canvas> / <video> / <audio> / <input> / <textarea> / <select> / <button> / <progress> / <meter> == 0 (<progress>/<meter> は ::-webkit-progress-*/::-webkit-meter-* が background-image を実描画するが getComputedStyle が none を返し computed-style 走査が構造的に盲ゆえ静的タグ ban で封鎖・round-3e) かつ CSS url( が #fragment 内部参照以外 (= scheme 付き外部 / data:) == 0: これらは偽要件テキストを data: 画像サブリソース / form control value で描画しつつ textContent に出さない hidden-render を作る (SRS = inline HTML + geometric SVG のみ という doc-type 不変条件の補集合)。 url( ban は url( token 直後の非 '#' を見るため char-ref (data:) を decode せず捕捉し、 url(#gradient-id) 内部参照のみ将来許容する (folio-hef FF5 ceiling round-3 / 3b・user 案A); static scroll-pseudo-ban — SRS HTML 全体で ::scroll-button / ::scroll-marker / scroll-marker-group == 0: generated-content scroll pseudo は content で偽要件を可視描画しつつ textContent に出さない (旧 census が ::before / ::after / ::marker のみ走査した盲点・folio-hef FF round-3c)。 一次防御は構成同一性 (REQ-VER-030・post-build の CSS 注入を byte 逸脱として spelling 非依存に捕捉) が担い、 本静的 ban は再組立入力を欠く環境向けの literal-spelling backstop である (genuine SRS は scroll container を一切使わない = script-ban 同型の genuine vocabulary 補集合・FP-free); static list-marker-ban — SRS HTML 全体で @counter-style == 0 かつ 文字列リテラル値の list-style(-type) (引用符を含む値) == 0: list-marker テキストは content プロパティを経由せず list-style-type + @counter-style (symbols/prefix/suffix) または文字列リテラル list-style で ::marker に生成され、 census (::marker の content 走査) も fidelity (textContent) も両盲点する generated-content の第3サブシステム (round-3d ceiling 実証: census exit 0 で偽要件 li marker が可視・textContent blind)。 genuine SRS は list-style:none のみで @counter-style / 文字列 list-style を一切使わない (verified 0) ゆえ、 script-ban 同型の genuine vocabulary 補集合 静的 invariant で封鎖する (標準キーワード none/disc/decimal 等は引用符を含まず素通る = FP-free・将来 genuine が実リストを使う時は標準 keyword allowlist で対応)。 機構非依存の構造閉包は構成同一性 (REQ-VER-030 byte 同一性) が担い、 本静的 ban はその前の安価封鎖 (best-effort predicate); visual-deception unicode ban — SRS HTML に bidi-override (U+202A–202E / U+2066–2069) と zero-width・BOM (U+200B–200D / U+2060 / U+FEFF) が == 0: 機械生成 SRS はこれらを一切 emit しないゆえ、 contract-bearing text を視覚反転 (bidi RLO) / 可視テキストを zero-width で消去する render 依存の視覚破壊を source/DOM の codepoint として render を要さず静的・決定的に封鎖する (DOM textContent の論理順序を保つため fidelity ceiling すら見逃す軸を floor で塞ぐ; z-order occlusion 〔不透明 overlay〕 は render 依存ゆえ folio-cpf へ carve)。 加えて static bidi-override-ban — <bdo> 要素および source CSS unicode-bidi:bidi-override / isolate-override == 0: これらは制御 codepoint (U+202x) を一切使わず視覚反転を実現し上の unicode codepoint ban を回避する同型の機構漏れ (round-3e ceiling 実証・logical textContent 保持で fidelity blind)。 ★computed unicode-bidi:isolate は table/tr/td の UA 既定値ゆえ computed でなく source CSS の override リテラルと <bdo> 要素のみを ban する (genuine SRS は両者 0・FP-free)。 ★source literal grep ゆえ CSS escape (\62 idi-override) で回避されるため、 構成同一性 (REQ-VER-030) が post-build の CSS 注入を byte 逸脱として spelling 非依存に捕捉する一次防御・本静的 ban は再組立入力を欠く環境向け backstop (round-3f)。 It SHALL return CEILING=PENDING on blocking arm PASS (gate A–E,G,H + visual-first + census-count; 構成同一性 arm は REQ-VER-030 が定義し同じく blocking; 上記 warn 級 backstop の指摘は exit を上げない — 測定系 tool-integrity error 〔render 破綻等〕 は gate 判定と別軸で非零 exit) — exit 0 は floor PASS であって GREEN ではない (taxonomy §5.1 「floor 単独で GREEN を宣言しない」)。 gate F (render 健全性) は REQ-VER-025、 構成同一性 (repro-build) は REQ-VER-030、 ceiling (gate I/J/K) は REQ-VER-026。 conformance は generator の test-adversarial.sh (A22–A33 が各 gate の fail-closed を seed: 空 prose / 中段 TBD / 孤立要件 / sync-meta 欠落・空白化 / MUST 部品欠落 / data-req-id 重複 / 可視 fid 捏造 / dark-media コメント擬装; RG1-a〜c が静的 script-ban を seed: <script> 注入 / <script> コンテナ OMISSION / case-robust <SCRIPT>; RG1-d〜e が visual-deception unicode ban を範囲の代表点で seed: bidi RLO 〔U+202E〕 / zero-width 〔U+200B〕; RG1-f〜g が static shadowroot-ban を seed: <template shadowrootmode> 注入 / quoted-'>' 属性で narrow regex を回避する declarative shadow DOM 〔whole-tag ban が捕捉〕; RG1-h が static nested-context-ban を seed: <iframe srcdoc>; RG1-i〜k が static inline-only-ban を seed: data: 画像 <img> / form control <input> / char-ref encoded url(data:); RG1-l が static scroll-pseudo-ban を seed: ::scroll-button content; RG1-m〜n が static list-marker-ban を seed: @counter-style generated marker / 文字列 list-style-type marker; RG1-o〜p が inline-only-ban (form-associated) を seed: <progress> / <meter>; RG1-q〜r が static bidi-override-ban を seed: <bdo dir=rtl> / unicode-bidi:bidi-override; census-count は件数不一致 fixture の fail-closed seed で固定する)。 scope は ADR-0042 + bd folio-6jb (次元B = visual-deception unicode ban の floor 化) + bd folio-hef (FF5 = declarative shadow DOM / nested context / inline-only / scroll-pseudo / list-marker の静的 ban + render 側 image-sink 〔::first-line/::first-letter pseudo 含む〕 / 最小可読高 + per-char 横密度 census) + REQ-VER-030 (機構非依存の構造閉包 = 構成同一性 byte 一致) + bd folio-cpf (z-order occlusion 等 render 依存隠蔽の carve) + bd folio-mzn.2 (機械/LLM 検証境界 = warn 級 backstop 再分類・census-count blocking arm; code 整合は bd folio-mzn.3) で trace。
render-gate-srs.py) は生成 SRS を light/dark × 3 viewport で実 render し、 WCAG AA low-contrast / horizontal-overflow / component-overlap を検出する (fail-closed)。 重い playwright ゆえ renderer 在環境で実行し、 不在は honest SKIP (PASS と詐称しない)。 描画後 content の意味 fidelity は ceiling gate J・post-build 改変は REQ-VER-030 の領分 (検出器・定数は machine 部)。
REQ-VER-025: WHEN gate F (render 健全性、 render-gate-srs.py、 taxonomy §5.2) runs against a generated SRS presentation, it SHALL render the artifact in headless chromium at light / dark の両 prefers-color-scheme × 3 viewport (375 / 768 / 1280) and probe the post-render DOM, flagging with non-zero exit three classes: (1) low-contrast — 各 text 要素の文字色と実効背景の WCAG 2.1 コントラスト比が AA 未満 (通常 4.5:1 / 大 text 18pt=24px or 14pt-bold=18.66px は 3.0:1)。 実効背景は祖先を遡って不透明 background-color を底に半透明 layer を alpha 合成し、 gradient 背景は各レイヤーの停止色を抽出して下から alpha 合成した候補集合の worst-case (最小コントラスト) 停止で判定する (薄い勾配上の白文字を素通りさせない)。 色は 1×1 canvas で任意 CSS 色 (oklch / lab / hsl / hex / rgb 各構文) を sRGB へ解決する; 停止色を抽出できない真の image (url()) のみ skip し件数を disclose する; (2) horizontal-overflow — document.scrollWidth > clientWidth + 2px の意図しない横スクロール (overflow-x:auto の内部 scroll container は document に寄与しないため発火しない); (3) component-overlap — [data-component] が別の可視 block 要素 (素の div/li 等を含む広い集合・包含/inline は除外) と面積比 > 0.15 で矩形交差 (絶対配置・負 margin の崩れ + 非コンポーネント装飾の被さりを捕捉)。 It SHALL fail-closed: 検査対象 text が 1 つも無い (textChecked == 0) = render 破綻として「clean」でなく FAIL に倒す。 重い playwright 検査ゆえ folio verify-srs は renderer 在環境でのみ gate F を実行し、 不在環境では honest SKIP (RESULT を「gate F 未実行・floor 不完全」と明示し PASS と詐称しない); SRS_SKIP_RENDER=1 で bash-only floor に外せる。 幾何定数 (横溢れ許容 2px / overlap 面積比 0.15) は REQ-VER-022 の probe.js (ADR-0037) の値を複製する (drift は test-adversarial.sh A35 が検知)。 conformance は render-gate-srs.py --selftest (fixture 10 本 / case 17: low-contrast/overflow/component-overlap の kind 完全一致発火 + dark-only 崩れ + gradient×dark + url-image skip + viewport plumbing + fail-closed) + CI render-gate job (dogfood SRS を build→gate F、 sandbox 被覆外の CI-only)。 gate F は描画の見た目崩れに限り、 描画後 content の意味 fidelity は ceiling gate J の領分・post-build 改変は REQ-VER-030 (構成同一性) が byte 検出する。 scope は ADR-0037 (検出器・二層) + ADR-0041 (dark-contrast 崩壊型の検出を含む) で trace。
verify-srs は floor 通過時に CEILING=PENDING を返して floor 単独 GREEN を機械的に禁止し、 静的 ban 群は warn 級 backstop ゆえ GREEN 判定に含めない。 ceiling は LLM で非決定的、 floor は決定的・blocking の二層 (北極星 = gate I の非エンジニア可読性)。
REQ-VER-026: A generated SRS presentation SHALL be considered GREEN if and only if both layers pass: (floor) 全 blocking floor gate が PASS (REQ-VER-024 の folio verify-srs 決定的 floor の blocking arm 〔gate A–E,G,H + visual-first + census-count = 部品件数の静的 DOM count 照合〕 ∧ REQ-VER-025 の gate F (render 見た目崩れ) ∧ REQ-VER-030 の構成同一性 (機械 SSoT からの決定的再組立との byte 同一性)。 静的 hidden-render ban 群 (REQ-VER-024) は warn 級 backstop ゆえ GREEN 判定の blocking floor に含めない — その意味権威は下記 ceiling gate I/J; 測定系 tool-integrity error 〔render 破綻・再組立入力欠落等〕 は gate 判定と別軸で非零 exit する 〔測定不能を clean と詐称しない〕) AND (ceiling) 意味判定の 3 lens が合格 (taxonomy §5.3 gate I = persona-walk-srs agent 〔可読性の意味権威〕、 gate J = fidelity-srs agent 〔捏造の意味権威〕、 gate K = completeness-critic-srs agent 〔意味カバレッジ完全性〕)。 It SHALL NOT declare GREEN on floor pass alone — folio verify-srs が floor 通過時に CEILING=PENDING (exit 0 ≠ GREEN) を返すことで「floor 単独 GREEN 禁止」を機械担保する (taxonomy §5.1 判定式、 ADR-0040 の長さ Goodhart 再発防止)。 gate I (persona walk) = 非エンジニア persona が生成 SRS を index から歩き「何が要件か・なぜ要るか・どう検証されるか」を頑張れば読めるか (専門エンジニアがなんとか読める水準では不合格 = ADR-0041 北極星); gate J (fidelity) = 生成 HTML が機械 SSoT contract の正確な要約か — 情報落ち / 歪み / 捏造 (AI 捏造 RTM 行・SSoT 外の rationale 作文等) が無く、 派生ビュー (plain-language-term-inline) が SSoT 一致、 要件間 consistency (矛盾) も surface。 3 gate は agents/persona-walk-srs.md / agents/fidelity-srs.md / agents/completeness-critic-srs.md として常設し、 spec 用 Phase F の spec-review-* agent と同型の LLM review (read-only・構造化 findings)。 ceiling は LLM ゆえ非決定的 = CI で blocking しない (ADR-0028 の二層 enforcement と同型: floor=機械/blocking + ceiling=LLM/advisory)。 conformance: 二層 invariant (floor PASS ≠ GREEN) は決定的ゆえ test-adversarial.sh A22 (健全 artifact に verify-srs が CEILING=PENDING を返す = GREEN を宣言しない) が固定し、 ceiling agent は fidelity が SSoT 外の捏造 RTM 行を検出する型 (taxonomy §5.3 / ADR-0041 §2.5) を実装する。 scope は taxonomy §5.1 / §5.3 + ADR-0041 §2.5 (persona walk + fidelity = 原 2-gate co-equal; completeness = 第 3 翼 gate K の定義元は taxonomy §5.3) で trace。
verify-census-vocab.sh (決定的 CI floor) は closure 語彙 SSoT (srs.census-vocab.yaml) と assembler の emit 集合の bijection (emit == vocab) を assert し、 部品の追加・改名・削除での語彙未更新を非ゼロ exit で強制する。 捏造検出の意味権威は ceiling gate J にあるため、 本 gate は語彙鮮度の floor のみを担い census closure 基盤を消費しない (SSoT 配線・graph 非破壊は machine 部)。
REQ-VER-029: WHEN the verify-census-vocab.sh deterministic CI floor runs, it SHALL extract the set of data-component and data-prose-slot tokens emitted by assemble-srs.sh (SRS-pack 固有 emitter) と lib/common.sh (core chrome emitter) — 両 file を走査し、 lib/common.sh が perl 文字列内で backslash-escape する data-component=\"…\" 形も拾う robust 抽出 (SRS grep だけだと doc-cover-band / chapter-deck-band / glossary-term-table / fidelity-sync-meta / approval-block / plain-language-term-inline の core chrome が 6 件漏れる) — and assert it forms a bijection with the closure 語彙 SSoT rolemap/srs.census-vocab.yaml の data_components / prose_slots list, flagging with non-zero exit either direction of the symmetric difference: emit ∖ vocab (新部品追加・改名で語彙未更新 = 語彙更新を機械強制) と vocab ∖ emit (部品削除・改名で stale 語彙残存)。 It SHALL fail-closed: emit 抽出が 0 件 (assemble/common 走査破綻) または vocab list が 0 件 (SSoT 欠落/空) を整合と取り違えず FAIL に倒す。 The closure 語彙 SSoT srs.census-vocab.yaml SHALL be a generator-local pack 資産 (新規 file) が集約する『assemble-srs.sh + lib/common.sh が描画する data-component token』∪『data-prose-slot token』の閉集合。 ★M-A 監査補正: 本 SSoT は照会 graph の srs.rolemap.yaml .roles には足さない — verify-graph.sh が roles ⊆ GRAPH_ROLE_ALLOWLIST を hard-FAIL assert するため census 語彙 (data-component token) を .roles へ混ぜると即 FAIL する — ゆえ別 file へ分離し、 verify-graph.sh は <pack>.rolemap.yaml を明示名で開く (rolemap/ を glob しない) ため本 file の追加は verify-graph.sh に副作用ゼロ (非破壊)。 The folio verify-srs command SHALL read this SSoT at startup via pack-level yq (core graph reader lib/graph-common.sh を流用せず = lib/ 無改変), fail-closed (SSoT 不在 / data_components 空 = tool error)。 本 gate は SSoT 配線 + CI 整合 (語彙鮮度) に限る。 ★境界 (§1): 捏造検出の意味権威は ceiling gate J (fidelity-srs) にあるため、 本 gate は語彙鮮度の floor のみを担い、 「全描画要素 ↔ 期待要素の全単射が消費する closure 基盤」(S4/S5) を消費しない。 conformance は verify-census-vocab.sh の lock test (vocab から token を 1 個わざと抜く → assert が赤になる = 非空虚 gate の証明) + genuine (ec / clinic の folio verify-srs floor PASS = SSoT が emit と整合) + graph 非破壊 (verify-graph.sh が census-vocab 追加後も PASS) で固定する。 scope は bd folio-hef.3 (rolemap SSoT 派生 + CI 整合 gate) + taxonomy §5 + bd folio-mzn.2 (語彙鮮度 floor への純化) + bd folio-mzn.3 (census probe carry 配線の除去) で trace。
folio verify-srs の決定的 floor は生成 SRS を機械 SSoT (contract + prose YAML) から決定的に再組立し、 成果物との byte 同一性を blocking で検査する (非決定 field は footer 生成時刻のみを両辺同一に正規化)。 fabrication-free-by-construction (rules §12) の直接検証形で、 post-build 改変 (転置/複製/削除・decoy・隠蔽/捏造 CSS 注入) を attack 語彙の列挙なしに byte 逸脱として一括検出する (再組立入力の欠落は測定系 error・opt-out (FOLIO_SKIP_REPRO=1) は honest SKIP)。 assembler 自身のバグには盲ゆえ、 contract ↔ 成果物を独立照合する blocking arm と併存する (機構詳細は machine 部)。
REQ-VER-030: WHEN the folio verify-srs deterministic floor runs against a generated SRS presentation, it SHALL re-run the deterministic assembler pipeline (assemble → prose 注入) from the 機械 SSoT inputs (contract YAML + prose YAML) into a scratch path and assert byte-identity between the artifact under verification and the reassembled output, flagging any deviation with non-zero exit as a blocking floor failure (構成同一性 arm = construction-integrity)。 正規化は唯一の非決定 field = footer 生成時刻 (生成: <b>YYYY-MM-DD HH:MM</b> の厳密 pattern) のみを両辺同一の quotient 写像で商する — 両辺を同一関数で写像するため本文へ timestamp 形を注入する攻撃も再組立側との byte 差が残り健全であり、 緩い正規化は差分 masking の穴となるため厳密 pattern に限る。 It SHALL treat 再組立入力の欠落 (contract / prose / assembler 不在) と assembler 自身の非零 exit を gate 判定でなく測定系 tool-integrity error として別軸の非零 exit に倒す (REQ-VER-024 の測定系 error idiom と同型・「入力が無い = PASS」の fail-open を封鎖); 明示 opt-out (FOLIO_SKIP_REPRO=1) 時は honest SKIP (floor 不完全と明示し PASS と詐称しない・gate F の SRS_SKIP_RENDER と同 idiom)。 本 gate は fabrication-free-by-construction (rules §12 の不変条件「構造は SSoT から毎回決定的に再組立し差分編集を介在させない」) の直接検証形であり別建ての決定的安全網ではない; post-build 改変 (contract 由来 token の転置/複製/削除・decoy 要素注入・render 依存の隠蔽/捏造を狙う CSS/HTML 注入) は byte 逸脱として render を要さず一括検出される (partial-enumeration からの構造終端)。 honest scope: 再組立の両辺が同一 assembler を共有するため assembler 自身のバグには盲 — contract ↔ 成果物を独立照合する blocking arm の contract 照合部 (REQ-VER-024 gate A–E,G,H + census-count) を代替せず併存する。 byte 一致 regen の先例は ADR-0036 (glossary ↔ vocabulary regen byte 一致)。 conformance は generator の敵対 suite の repro-build seed (1-byte tamper → FAIL / 生成時刻のみ差 → PASS / 再組立入力欠落 → 測定系 error / 正規化 regex mutant の mutation-kill) で固定する。 scope は rules §12 (fabrication-free-by-construction) + bd folio-mzn.3 (構成同一性 arm の建設・決定的 census (全列挙機構) の構造終端置換) で trace。
done-condition REQ (024〜030) の検証被覆を一覧する。 scenario 列が空 = 未検証 gap を可視化する (VER-030 は scenario spawn 待ち)。
各 REQ-VER-* を derives-from (派生元 taxonomy / ADR) × scenario (検証 file) × verified で一覧する (P-13 trace matrix)。 ceiling gate (I/J/K) は LLM ゆえ scenario 列は決定的 floor / selftest を指す。
| REQ | EARS | derives-from | scenario (verifies) | verified |
|---|---|---|---|---|
| VER-024 | Event | taxonomy §5.2 / ADR-0042 | generator/test-adversarial.sh (A22–A33 + RG1-a〜e) | ✓ |
| VER-025 | Event | taxonomy §5.2 gate F / ADR-0037 + ADR-0041 | render-gate-srs.py --selftest + CI render-gate job (CI-only) | ✓ |
| VER-026 | Ubiq. | taxonomy §5.1 / §5.3 / ADR-0041 §2.5 | test-adversarial.sh A22 (floor≠GREEN) + ceiling agents (LLM) | ✓ |
| VER-029 | Event | bd folio-hef.3 / taxonomy §5 + bd folio-mzn.2 (語彙鮮度 floor) | verify-census-vocab.sh lock test + genuine (ec / clinic) + verify-graph.sh 非破壊 | ✓ |
| VER-030 | Event | rules §12 (fabrication-free-by-construction) / bd folio-mzn.3 | generator/test-adversarial.sh repro-build seed (tamper→FAIL / 生成時刻のみ→PASS / 入力欠落→測定系 error / 正規化 mutation-kill・spawn: bd folio-3d23) | ✗ |
本 spec が依拠する内部・外部参照の一覧。