---
title: "プラットフォーム構築アーキテクチャ：決定したことと、それが何の上に立っているか。"
seo_title: "プラットフォームアーキテクチャ：決定と参照資料 | SazAI"
description: "SazAIの構築方法：フォーマット非依存エンジン、リネージ、バージョン管理された決定、方法を伴う検証、ロードマップ。"
tags: [marketing]
icon: book
---

> **結論：アクセラレーターはチームが基質を支配すること。ここに決定に味はない。選択は記録される。何が棄却され、なぜかもともに。**ピラミッドは以下に置かれている；ギャップは外側に置かれ、述べられている。

<div class="chap">

<div class="ico-col"><span class="ico"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:36px;height:36px"><path d="M24 8l16 8-16 8-16-8z" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M8 24l16 8 16-8" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M8 32l16 8 16-8" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg></span></div>

## SazAIとは何か

<h3 class="sub">エンジン、コンポーネント、ドキュメント。構築した者によって支配される。</h3>

SazAIはプラットフォーム：知能とプルーフの基質であり、その上に製品が構築される。マルチテナント、認証、リネージ、オーケストレーション、エージェント層、厳密なメトリック、バージョン管理された決定。一度だけ。SazAI Corpus、保管庫、デザインシステムはすでに出てきた製品であり、それぞれが同じエンジンを使用している。再構築する代わりに。

パネルは定着の強さで下がり、それぞれの参照資料は展開可能なブロックで終わる。確認したい人のために。引用はABNT NBR 6023標準、2018年に従う。

<figure class="viz" role="group" aria-label="このページのピラミッド：実行依存関係から位置付けまで4つのアンカー強度、および外側のギャップ">
<div class="duo" style="grid-template-columns:auto 1fr">
<div class="mid"><svg viewBox="0 0 220 170" aria-hidden="true" style="width:200px">
<polygon points="110,10 150,50 70,50" fill="var(--hue-analysis)" opacity=".85"/>
<polygon points="64,58 156,58 176,92 44,92" fill="var(--hue-output)" opacity=".65"/>
<polygon points="38,100 182,100 198,130 22,130" fill="var(--hue-upload)" opacity=".5"/>
<polygon points="16,138 204,138 214,160 6,160" fill="var(--hue-reprocess)" opacity=".35"/>
<rect x="180" y="8" width="34" height="34" rx="4" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none" stroke-dasharray="4 3" style="color:var(--gray)"/>
</svg></div>
<div class="side" style="text-align:left">
<b style="color:var(--hue-analysis)">実行依存関係</b><span>エンジンは標準なしでは走らない。ステップ1</span>
<b style="color:var(--hue-output);margin-top:.5rem">標準が適用され、測定される</b><span>スキーマの法則、コンポーネントの基準、トークン単位での対比。ステップ2から4</span>
<b style="color:var(--hue-upload);margin-top:.5rem">記録された決定</b><span>何が棄却されたか、なぜかとともに記録された選択。ステップ5と6</span>
<b style="color:var(--hue-reprocess);margin-top:.5rem">位置付け</b><span>留保条項が付属した研究。ステップ7</span>
<b style="color:var(--gray);margin-top:.5rem">ギャップ</b><span>ピラミッドの外。述べられている。最後のパネル。</span>
</div>
</div>
<figcaption>アンカー強度は高さを決定する。何も支えていない場合は、破線で描かれた外側に置かれ、独自のパネルを持つ。</figcaption>
</figure>

外部から到着した人にとってプラグアンドプレイではない。**アクセラレーターは基質ではない。それはチームの基質に対する支配である。** エンジン、コンポーネント、ドキュメントを知っている者は、すでに存在するものから新しいSaaS製品を構築する。このページの残りはそれがパスをどれだけ短くするかの測定である。

<figure class="viz duo" role="group" aria-label="エンジン、コンポーネント、ドキュメント。中央のチームの支配；出てくる製品">
<div class="side" style="color:var(--hue-analysis)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:48px;height:48px"><rect x="10" y="10" width="28" height="28" rx="4" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><circle cx="24" cy="24" r="6" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="24" y1="4" x2="24" y2="10" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="24" y1="38" x2="24" y2="44" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="4" y1="24" x2="10" y2="24" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="38" y1="24" x2="44" y2="24" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg><b>基質</b>エンジン、コンポーネント、ドキュメント</div>
<div class="mid" style="color:var(--hue-upload)"><svg viewBox="0 0 120 72" aria-hidden="true"><line x1="6" y1="36" x2="40" y2="36" stroke="currentColor" stroke-width="1.5"/><path d="M34 31l6 5-6 5" fill="none" stroke="currentColor" stroke-width="1.5"/><circle cx="60" cy="36" r="14" fill="currentColor" opacity=".12" stroke="currentColor" stroke-width="1.5"/><path d="M54 36l4 4 8-8" fill="none" stroke="currentColor" stroke-width="1.5"/><line x1="80" y1="36" x2="114" y2="36" stroke="var(--hue-output)" stroke-width="1.5"/><path d="M108 31l6 5-6 5" fill="none" stroke="var(--hue-output)" stroke-width="1.5"/></svg><b>チームの支配</b>加速させるもの</div>
<div class="side" style="color:var(--hue-output)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:48px;height:48px"><rect x="8" y="12" width="32" height="24" rx="3" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="8" y1="20" x2="40" y2="20" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><circle cx="13" cy="16" r="1.4" fill="currentColor"/><circle cx="18" cy="16" r="1.4" fill="currentColor"/></svg><b>製品</b>Corpus、保管庫、デザインシステム</div>
</figure>

このアイデアのフレームは新しくなく、このページからのものではない。それはSazAIが自らを説明する9つの柱の8番目である。*プラットフォームを製品の前に*。以下が証拠である。

</div>

<div class="chap">

<div class="ico-col"><sz-icon style="color:var(--hue-analysis)" name="file" size="36"></sz-icon></div>

## エンジンはフォーマット標準に存在を依存する

<h3 class="sub">ステップ1：実行依存関係。最も強いアンカー。</h3>

標準がコードで間違っていたなら、エンジンは走らない。参照は言及されない。依存される。そして決定論がそこから出てくる。

**データと事実：**

- エンジンのOOXML名前空間：37の異なるフォーム全体で237回出現（2026-09-01）。
- ダブリンコアは依存関係：22の名前空間。ISO 8601：データベースで最も引用された標準。60回出現。
- チェック可能な連鎖：公開条項→DDLカラムコメント→データマップ→カラム。言い換え禁止。ルール書き込み。DDLとマップは同じ条項を逐語的に携帯。

<figure class="viz duo four" role="group" aria-label="決定論の連鎖：公開条項、DDLコメント、マップレイヤー、リレーショナルカラム">
<div class="side" style="color:var(--hue-analysis)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:40px;height:40px"><path d="M12 6h18l8 8v28H12z" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M30 6v8h8" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="18" y1="24" x2="32" y2="24" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg><b>公開条項</b>標準。番号別。</div>
<div class="side" style="color:var(--hue-analysis)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:40px;height:40px"><rect x="8" y="10" width="32" height="28" rx="3" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="14" y1="18" x2="34" y2="18" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none" stroke-dasharray="3 2"/><line x1="14" y1="25" x2="30" y2="25" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="14" y1="31" x2="30" y2="31" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg><b>DDLコメント</b>同じ条項。逐語的。</div>
<div class="side" style="color:var(--hue-analysis)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:40px;height:40px"><circle cx="14" cy="14" r="5" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><circle cx="34" cy="18" r="5" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><circle cx="22" cy="34" r="5" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="17" y1="17" x2="31" y2="16" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="16" y1="18" x2="20" y2="30" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg><b>マップレイヤー</b>言い換え不可。ルール別。</div>
<div class="side" style="color:var(--hue-analysis)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:40px;height:40px"><rect x="8" y="8" width="32" height="32" rx="3" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="20" y1="8" x2="20" y2="40" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="8" y1="20" x2="40" y2="20" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg><b>リレーショナルカラム</b>存在する。条項が存在するために。</div>
</figure>

### そして次のフォーマットはより安い

最初のフォーマットはPowerPointで、エンジン全体を買った：読む、測定、翻訳、書き戻す、比較。初めて。2番目、Wordドキュメント、1桁少ない。3番目、スプレッドシート、もう1つ。そして4番目、PDF、3番目と同じコスト。曲線が安定した。それは成果のリストではない。それは曲線であり、曲線が議論である。

<figure class="viz curve" role="group" aria-label="対数スケール上の各フォーマット全サイクルのコスト：最初はエンジン全体、次の各1桁ずつ小さい、4番目は3番目と同じで安定">
<div class="row ooxml"><b>PPTX</b><span class="track"><span class="bar" style="width:100%"></span></span><em>エンジン全体</em></div>
<div class="row ooxml"><b>DOCX</b><span class="track"><span class="bar" style="width:46%"></span></span><em>1桁少ない</em></div>
<div class="row ooxml"><b>XLSX</b><span class="track"><span class="bar" style="width:16%"></span></span><em>もう1つ</em></div>
<div class="row other"><b>PDF</b><span class="track"><span class="bar" style="width:15%"></span></span><em>安定する</em></div>
<figcaption>対数スケール。各ステップは1桁。4番目のポイントは最小なだけではない。それは異なった性質のものであり、3番目と同じコストだった。</figcaption>
</figure>

<p class="claim">**PDFは最初の非Officeの基質である**：ZIPプラスXMLではなく、オブジェクトのバイナリグラフ。エンジンがPowerPointでしか上達していなかったなら、4番目のフォーマットは最初のようにコストがかかったであろう。3番目のようにコストがかかった。**エンジンはPowerPointでより速くなったのではない；フォーマット非依存になった**。そして<a href="documents">4つのフォーマット</a>は今日同じアーキテクチャ上で走り、それぞれ独自の宣言された保証付き。だから5番目は4番目がコストしたものをコストするであろう。そしてそれがこのページが加速と呼ぶものである。</p>

<div class="bound">
<p><b>ここが記録されている。質問される前に述べられている。</b> Gitで、機関日誌ではない。曲線は日付された決定とコミットの上に乗っており、それらは区間の正しいソースであり、評価の際にチェックされるもの。各フォーマットの絶対時間は技術文書に住んでいて、それを導出するコマンドが隣にある。</p>
</div>

</div>

<div class="chap">

<div class="ico-col"><span class="ico"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:36px;height:36px"><circle cx="24" cy="24" r="5" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><circle cx="10" cy="12" r="3" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><circle cx="38" cy="10" r="3" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><circle cx="12" cy="38" r="3" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><circle cx="38" cy="36" r="3" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="13" y1="14" x2="20" y2="21" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="35" y1="12" x2="28" y2="21" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="14" y1="36" x2="20" y2="27" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="35" y1="34" x2="28" y2="27" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg></span></div>

## 知識の本体

<h3 class="sub">決定したこと、測定したこと、書いたこと。リンク。チームとエージェントが移動可能。</h3>

チームが基質を支配するのは、それが住む場所を持つ。リポジトリを反映するObsidian保管庫。決定、データマップ、エージェント契約、ペルソナ、戦略、作業セッション。各ノートが他にリンク。ハブが入口。人またはエージェントが通る。顧客が自分の保管庫で受け取るのと同じグラフ。最初は自分たちで使用。以下、私たち。動いている。ハブにホバーしてそれがリンクするものを見る。クリックして全文を開く。

<figure class="viz graph" id="vault-graph" role="group" tabindex="0" aria-label="SazAI保管庫のグラフ：決定、エージェント、データマップ、製品、戦略、オペレーション、人、ピッチ、ペルソナのハブ。相互にリンク。ノートにリンク。">
<div class="stage"><svg viewBox="0 0 800 520" aria-hidden="true"><g class="edges"></g><g class="nodes"></g></svg><div class="labels" aria-hidden="true"></div></div>
<figcaption>SazAI保管庫、チームが毎日見ている通り。各ポイントは1つのノート。各線は誰かが書いたリンク。ハブに名前がある。残りはそれらがリンクするもの。ノード設定は手で写真に撮られた2026-08-28；保管庫の自動導出が着地したとき、この線は出ていく。</figcaption>
</figure>

<div class="bound">
<p><b>マップが達する距離。測定される。最も価値がある部分。</b>保管庫グラフは158のデータマップテーブルの55と5つのフォーマットマップの1に達する。リポジトリは158のうち158に達する。すべてが接続されたことを示す図は、受信書がない、このページの唯一の主張になるであろう。ページ全体が主張に受信書が付属していることにおいて。検証されるのはすべてが接続することではない。正確に何が接続されるのか、何がそうしないのか知っていることである。マップが沈黙しているところ、リポジトリが応答する。</p>
</div>

</div>

<div class="chap">

<div class="ico-col"><sz-icon style="color:var(--hue-reprocess)" name="info" size="36"></sz-icon></div>

## データ保護は設計。設計は監査される。

<h3 class="sub">ステップ2：法律はスキーマになり、スキーマはチェック可能。</h3>

法律が書いて求めるもの、データベースは構造を通じて満たす。検証は私たちのポリシーを読むことではない。スキーマを監査する。

**データと事実：**

- 永続ストレージはドキュメントコンテンツを携帯しない。コンテンツは別のデータベースに住む。機密。削除可能。
- テナント別の隔離。カラム。スライスはテナントを越えない。
- 認定。今日：なし。証拠として機能するように設計されたコントロール。それが求められるとき。

<figure class="viz duo" role="group" aria-label="2つのデータベース：コンテンツなしの永続的なもの。機密。別。削除可能。">
<div class="side" style="color:var(--hue-analysis)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:48px;height:48px"><ellipse cx="24" cy="12" rx="14" ry="5" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M10 12v24c0 3 6 5 14 5s14-2 14-5V12" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="16" y1="22" x2="32" y2="22" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="16" y1="29" x2="28" y2="29" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg><b>永続</b>構造、測定、リネージ。コンテンツ、決して。</div>
<div class="mid" style="color:var(--gray)"><svg viewBox="0 0 120 72" aria-hidden="true"><line x1="60" y1="10" x2="60" y2="62" stroke="currentColor" stroke-width="1.5" stroke-dasharray="4 3"/></svg><b>設計で分離</b>スキーマを監査する</div>
<div class="side" style="color:var(--hue-reprocess)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:48px;height:48px"><ellipse cx="24" cy="12" rx="14" ry="5" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M10 12v24c0 3 6 5 14 5s14-2 14-5V12" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none" stroke-dasharray="4 3"/><line x1="18" y1="26" x2="30" y2="34" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="30" y1="26" x2="18" y2="34" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg><b>機密</b>コンテンツ。真に削除可能。</div>
</figure>

</div>

<div class="chap">

<div class="ico-col"><sz-icon style="color:var(--hue-output)" name="eye" size="36"></sz-icon></div>

## アクセシビリティは測定される。宣言されない。

<h3 class="sub">ステップ3：引用された標準はコンプライアンス。測定された数値は設計。</h3>

基準はコンポーネントの中に住む。数値がコードの隣に。コントラスト色が外システムに入る前に測定される。

**データと事実：**

- 51のデザインシステムファイル全体でWCAG 2.2 AA。基準は番号で引用される（1.4.1、3.1）（2026-09-01）。
- トークンごとに測定されたコントラスト：`--hue-lineage` 4.00:1で、注釈*ガイド、決してテキストではない*トークン自体の中に書かれている。`--text-faint` **失敗**、測定された2.56:1を白で。失敗記録された。
- 色覚異常測定。紫は異常色覚で評価。色距離ΔE 29.1。
- ゼロのアーキテクチャ決定レコードWCAG。家で最も強いアクセシビリティアンカーは決定レコードで非表示。記録することはまだ行うべき仕事。

<figure class="viz" role="group" aria-label="3つの色測定：1つのトークン承認されたガイドとして。1つは失敗。紫は色覚異常の下で測定">
<div class="duo" style="grid-template-columns:1fr 1fr 1fr">
<div class="side"><div class="ev proof" style="margin:0"><span class="n">4.00:1</span><span class="t"><b>ガイドとして承認</b>注釈*ガイド、決してテキストではない*トークン自体の中に書かれている</span></div></div>
<div class="side"><div class="ev open" style="margin:0"><span class="n">2.56:1</span><span class="t"><b>失敗</b>白で測定。失敗記録された。</span></div></div>
<div class="side"><div class="ev proof" style="margin:0"><span class="n">ΔE 29.1</span><span class="t"><b>異常色覚</b>最も一般的な色欠損の下で測定された紫</span></div></div>
</div>
<figcaption>引用された標準はコンプライアンス。測定された数値は設計。3つの数値はポリシーではなくトークンに住む。</figcaption>
</figure>

### デザインシステムは製品。開放標準の上に構築。

<h3 class="sub">ステップ4：他の表面を加速するもの。W3C標準で。</h3>

デザインシステムはSazAI製品。批准によって（2026-08-26）。機能は他を加速させること：マーケティングを提供するコンポーネント、保管庫とショーケース、同じもの。開放標準。所有フレームワークではない。

**データと事実：**

- W3C Custom Elementsとcss Custom Propertiesで構築されたコンポーネント。フレームワーク依存なし。
- 1つのライブラリ。3つの表面提供。明るいテーマと暗いテーマ、ホワイトラベルスキン、同じトークンメカニズムを通じて。
- トークンは独自の測定と使用メモを携帯（ステップ3）。ルールは色とともに移動。

<figure class="viz duo" role="group" aria-label="1つのコンポーネントライブラリが3つの表面を提供">
<div class="side" style="color:var(--verb-see)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:48px;height:48px"><rect x="8" y="8" width="14" height="14" rx="3" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><rect x="26" y="8" width="14" height="14" rx="3" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><rect x="8" y="26" width="14" height="14" rx="3" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><rect x="26" y="26" width="14" height="14" rx="3" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg><b>1つのライブラリ</b>コンポーネント、トークン、スキン</div>
<div class="mid" style="color:var(--gray)"><svg viewBox="0 0 120 72" aria-hidden="true"><line x1="10" y1="36" x2="55" y2="36" stroke="currentColor" stroke-width="1.5"/><line x1="55" y1="36" x2="105" y2="14" stroke="currentColor" stroke-width="1.5"/><line x1="55" y1="36" x2="105" y2="36" stroke="currentColor" stroke-width="1.5"/><line x1="55" y1="36" x2="105" y2="58" stroke="currentColor" stroke-width="1.5"/></svg><b>同じメカニズム</b>テーマとホワイトラベル。トークン経由。</div>
<div class="side" style="color:var(--hue-output)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:48px;height:48px"><rect x="6" y="8" width="36" height="10" rx="2" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><rect x="6" y="22" width="36" height="10" rx="2" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><rect x="6" y="36" width="36" height="6" rx="2" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg><b>3つの表面</b>マーケティング、保管庫、ショーケース</div>
</figure>

</div>

<div class="chap">

<div class="ico-col"><sz-icon style="color:var(--hue-analysis)" name="globe" size="36"></sz-icon></div>

## チャネルは機能。APIとMCPが製品をどうなれるかを変える。

<h3 class="sub">ステップ5：オープン標準が入口で。それらが可能にするもの。</h3>

OpenAPIとMCPは配管ではない。他のインターフェースと接続が同じ基質の上に構築されることを可能にする。私たちなしで。サードパーティのエージェント。あなた自身のダッシュボード。あるなたのワークフロー統合。製品は那のものになることができるようになる。チャネルが存在するために。

**データと事実：**

- エージェントチャネルは標準OAuth資源サーバー。認証情報なしで401。検出が公開される。
- 契約としてのパリティ。**MCP ⊆ OpenAPI**。MCPが公開するすべてがOpenAPIに存在。1つの基質。複数のリーダー。
- オーケストレーション。耐久ワークフロー実行ツール。その保証のために採用。保証は測定される。デッド仕事は部分的な状態を残さない。オーバーロード。デグレード。キューに入る。破晶しない。何も静かに失敗しない。

<figure class="viz duo" role="group" aria-label="1つの基質。2つのチャネル。それらが可能にするインターフェース。">
<div class="side" style="color:var(--hue-analysis)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:48px;height:48px"><rect x="10" y="10" width="28" height="28" rx="4" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><circle cx="24" cy="24" r="6" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg><b>1つの基質</b>エンジンと保管庫</div>
<div class="mid" style="color:var(--hue-upload)"><svg viewBox="0 0 120 72" aria-hidden="true"><rect x="38" y="14" width="44" height="18" rx="9" stroke="currentColor" stroke-width="1.5" fill="currentColor" opacity=".12"/><rect x="38" y="40" width="44" height="18" rx="9" stroke="currentColor" stroke-width="1.5" fill="none"/><line x1="10" y1="36" x2="38" y2="24" stroke="currentColor" stroke-width="1.5"/><line x1="10" y1="36" x2="38" y2="48" stroke="currentColor" stroke-width="1.5"/><line x1="82" y1="24" x2="110" y2="16" stroke="var(--hue-output)" stroke-width="1.5"/><line x1="82" y1="48" x2="110" y2="40" stroke="var(--hue-output)" stroke-width="1.5"/><line x1="82" y1="36" x2="110" y2="60" stroke="var(--hue-output)" stroke-width="1.5"/></svg><b>APIとMCP</b>MCPはOpenAPIのサブセット。契約により。</div>
<div class="side" style="color:var(--hue-output)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:48px;height:48px"><path d="M24 6l4 12 12 4-12 4-4 12-4-12-12-4 12-4z" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg><b>それがなれることができるもの</b>あなた自身のエージェント、ダッシュボード、ワークフロー</div>
</figure>

</div>

<div class="chap">

<div class="ico-col"><span class="ico"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:36px;height:36px"><path d="M24 6l14 5v12c0 9-6 15-14 19-8-4-14-10-14-19V11z" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M17 24l5 5 9-10" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg></span></div>

## どのように検証するか

<h3 class="sub">拒否するテスト。方法を伴う監査。公開された欠陥と一緒。合格したもの。</h3>

検証は4つの層を持つ。そして順序が重要。**テスト：**リポジトリの505テストファイル。デザインシステムスイート、毎回のビルドで実行。**ガード：**ビルド時に拒否するチェック。報告するだけでなく。ルールに違反するビルドは出ない。**荷重：**2026-07-20のテスト。忠実な本番レプリカ上で。50の同時読み取り。0.77秒で答えた。重いジョブ。ピーク4.71 GiB。天井5に対して。5と10のジョブの波。ゼロ障害。ゼロメモリオーバーラン。ゼロ破損。オーバーロードの下で。システムはキューに入る。壊れない。**内部監査：**日付された応力、破壊、セキュリティレポート。項目ごとの判定。

<figure class="viz duo four" role="group" aria-label="4つの検証層：テスト。ガード拒否。監査方法。公開された欠陥。">
<div class="side" style="color:var(--hue-output)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:44px;height:44px"><rect x="8" y="8" width="32" height="32" rx="3" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M15 24l6 6 12-12" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg><b>505テスト</b>スイートは毎回のビルドで実行</div>
<div class="side" style="color:var(--hue-output)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:44px;height:44px"><path d="M8 12h32v10H8z" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M8 26h32v10H8z" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="30" y1="14" x2="36" y2="20" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="36" y1="14" x2="30" y2="20" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M28 31l3 3 5-6" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg><b>拒否するガード</b>違反するビルドは出ない</div>
<div class="side" style="color:var(--hue-output)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:44px;height:44px"><circle cx="21" cy="21" r="11" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="29" y1="29" x2="40" y2="40" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="16" y1="19" x2="26" y2="19" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="16" y1="24" x2="23" y2="24" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg><b>方法を伴う監査</b>応力。破壊。セキュリティ。</div>
<div class="side" style="color:var(--hue-output)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:44px;height:44px"><path d="M12 6h18l8 8v28H12z" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M30 6v8h8" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><circle cx="24" cy="28" r="6" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="24" y1="25" x2="24" y2="29" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><circle cx="24" cy="31.5" r=".9" fill="currentColor"/></svg><b>公開された欠陥</b>合格したものの隣</div>
</figure>

<p class="claim">私たちはSOC2でもISO認定でもない。私たちが持っているのは**文書化された内部監査。宣言された方法。発見された欠陥が隣に公開。合格したもの。**1つの報告書は、独自のセクションとして持つ。*発見された欠陥*。*私がほぼ公開した1つの偽陽性*。*確立できなかったもの*。シールは第三者の言葉。宣言された方法、技術的な読者が1人で判断。そして書かれた決定は認定が求められるときの管理証拠として機能するように設計。</p>

<div class="bound">
<p><b>このページが引用するもの、引用しないもの。</b>報告書の存在とそれらの方法。項目ごとの判定は評価に付属する技術文書に住む。プローブリストを結果とともに漏斗の上部に公開することは、持つべきではない者に地図を渡す。負荷テストが*それを許可しないと述べるフレーズ：*50の同時。50の座席と1つの重いジョブ。一度。2つを混同することは、このページが存在して避けることのエラー。</p>
</div>

</div>

<div class="chap">

<div class="ico-col"><span class="ico"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:36px;height:36px"><path d="M12 6h18l8 8v28H12z" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M30 6v8h8" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="18" y1="22" x2="32" y2="22" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="18" y1="28" x2="32" y2="28" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="18" y1="34" x2="26" y2="34" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="15" y1="25" x2="35" y2="25" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none" stroke-width="2"/></svg></span></div>

## どのように決定するか

<h3 class="sub">61の書かれた決定。何が棄却されたか、なぜか。そして超然が2つの文を打ち抜く。その他なし。</h3>

SazAIのすべてのアーキテクチャ決定は日付されたドキュメント。コンテクスト。棄却された代替え。そして理由。61は今日のページの日付まで。そして数は日付されるので、成長する。それを導出するコマンドはこのパネルの参照にある。これを死んだファイルではなく受信書にするのは超然性。新しい決定が古い決定に矛盾するとき、それは古いもののどの文が保持を停止するかを正確に述べる。そして古いものはその身体のマークを得る。文に。そしてタイトルではなく。

最も最近の例は昨日である。決定023は他の事柄の中で、ユーザーが製品の機能を名付けるボキャブラリーを固定した。決定061は**2つの文**それを超然した。どちらもボキャブラリーについて。そしてエンジンについてのすべてをそのままにした。違反されたと信じられた条項を含む。そうではなかったが。3人の有能な読者がその条項を同じ間違った方法で読んでいた。そして決定は3つの名前すべてを記録する。なぜなら結論だけを保つ決定は、3人が一緒に間違った理由を失うから。

<figure class="viz duo" role="group" aria-label="2つの文が打たれた古い決定。その他は無傷。新しい決定にリンク。">
<div class="side" style="color:var(--hue-reprocess)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:52px;height:52px"><path d="M12 6h18l8 8v28H12z" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M30 6v8h8" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="18" y1="22" x2="32" y2="22" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="18" y1="28" x2="32" y2="28" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="18" y1="34" x2="26" y2="34" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><line x1="15" y1="25" x2="35" y2="25" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none" stroke-width="2"/></svg><b>古い決定</b>2つの文打たれた。その他無傷。</div>
<div class="mid" style="color:var(--hue-reprocess)"><svg viewBox="0 0 120 72" aria-hidden="true"><line x1="10" y1="36" x2="106" y2="36" stroke="currentColor" stroke-width="1.5"/><path d="M100 31l6 5-6 5" fill="none" stroke="currentColor" stroke-width="1.5"/><rect x="42" y="26" width="36" height="20" rx="10" fill="currentColor" opacity=".12" stroke="currentColor" stroke-width="1.5"/></svg><b>超然</b>文を名付ける。それだけ。</div>
<div class="side" style="color:var(--hue-output)"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:52px;height:52px"><path d="M12 6h18l8 8v28H12z" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M30 6v8h8" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M18 28l4 4 8-8" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg><b>新しい決定</b>3つの名前とともに。一緒に間違った。</div>
</figure>

<div class="bound">
<p><b>このページが公開しない数。</b>これらの61のうち何個が*受け入れ*られたかは、カウンターが状態フィールドに許可する言葉に依存する。そして5人の有能なカウンターは今週5つの異なった数に達した。誰も間違わない。フィールドはそれ自身のボキャブラリーを宣言しなかった。61は安定。受け入れ数は公開に行く。それが来る。コマンドとともに。それが製造。隣に。158個のテーブルがすでに行く方法。</p>
</div>



### そして書く方法：内部契約。正直さのため1ステップ下。

<h3 class="sub">ステップ6：記録された内部一貫性。外部標準の1ステップ下。</h3>

執筆スタイル、命名、および家の慣例はエージェントが引用するバージョン管理された契約に住む。そのアンカーは外部標準ではなく番号付きではなく、記録された決定を持つ内部一貫性。これは前のものより1ステップ下。そして下のステップはこのページの階層が何かのコストがあってもさえ適用することを証明。

**データと事実：**

- リビジョン別のバージョンを備えた単一の執筆標準。決定とエージェントによって契約として引用。
- 命名と名前慣例。全システム全体で統一。引用された標準は言い換えられない。
- フォーマット、リント、秘密スキャン。自動化。標準で宣言。ソース隣に。

<figure class="viz" role="group" aria-label="記録された内部一貫性：外部標準1ステップ下。意図的に破線で描かれた。">
<div class="ev open"><span class="n">内部一貫性</span><span class="t"><b>1ステップ下。描かれたその方法。</b>このパネルのアンカーは記録された決定。番号付き標準ではない。破線フレームは同じ。家が何にも使用するもの。受信書ではないもの。そしてパネルが下のステップ。階層が適用すること証明。何かのコストがあっても。</span></div>
</figure>

</div>

<div class="chap">

<div class="ico-col"><sz-icon style="color:var(--hue-output)" name="check" size="36"></sz-icon></div>

## 何が受信書か。何がまだ実践か。

<h3 class="sub">4つの機能。証拠付き。3つ宣言。動詞が現在形にない。</h3>

このプラットフォーム上のすべての機能は3つの質問を通された。書かれた決定がそれを支配している。測定がある。それとも働くだけ。誰も書いていない。なぜ。最初の2つを通る。私たちは<dfn data-hint="書かれた決定と誰もが再現できる測定を持つ機能。約束ではなく。記録。">受信書</dfn>と呼ぶ。残りは実践。そしてそれは宣言されたままである。方向。[ロードマップ](#roadmap)が下で宣言するもの。3つが受信書である場所、1つを提示するページより弱い、それが7つを提示する。

<figure class="viz ledger" role="group" aria-label="証拠を伴う4つの受信書と方向として宣言された3つの実践">
<div class="col receipts">
<h4>受信書</h4>
<div class="item"><b>プラグアンドプレイ</b><span>4つのADRと無視。4ポイント曲線。158テーブルパーティション。再導出可能。</span></div>
<div class="item"><b>キューコントロール</b><span>5つのADR。荷重テスト。ゼロ障害。ゼロOOM。ゼロ破損。</span></div>
<div class="item"><b>アーキテクチャ。リネージ。テナント。</b><span>プロバイダー境界が名付けられたホール。</span></div>
<div class="item"><b>決定バージョン。</b><span>日付された決定。外科的超然。</span></div>
</div>
<div class="col practices">
<h4>宣言された実践</h4>
<div class="item"><b>スキーマバージョン。</b><span>宣言された方向。</span></div>
<div class="item"><b>アーティファクトバージョン。</b><span>宣言された方向。</span></div>
<div class="item"><b>エージェント間通信。</b><span>宣言された方向。障害モード測定。</span></div>
</div>
</figure>

<p class="claim">左側の4つはどこかでチェックされることがある。以下のチャプターが言う場所。右側の3つはプラットフォームが行く場所。そしてどれもその動詞は現在形ではない。</p>

</div>

<div class="chap">

<div class="ico-col"><span class="ico"><svg viewBox="0 0 48 48" aria-hidden="true" style="width:36px;height:36px"><circle cx="24" cy="24" r="16" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/><path d="M31 17l-4 10-10 4 4-10z" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round" fill="none"/></svg></span></div>

<a id="roadmap"></a>

## ロードマップ：構築している

ロードマップはビッグな方向を保つ。プラットフォームが指す。そしてまだ構築していない。ピースがここを去るとき、このリストから消える。そしてマッチング機能のページに現れる。日付付きで。ロードマップが動くのは唯一の外的証拠。スピード。形容詞で書くことができない。以下のものは何も出ていない。そして何もここが今日の決定に重みを付けるべきではない。
このページ上のものは何も出ていない。何もここがあなたの決定に重みを付けるべきではない。そしてチームの誰も現在形でそれらを提示すべきではない。出ていたものは[製品の散歩](/)にあり、その保証とともに。そして存在するもののlimitsは[信頼](trust)にある。

## 赤線と交渉知識

草案を当事者の修正に対して比較。各側が何を変更したかを見せる。リスクがどこに移動したか。テキストが明らかにする意図。この下にある比較エンジンはすでに存在。そして今日の文書バージョンの上を走る。何が欠けているのは法的層。変更された条項は別のパラグラフではないことを理解。

**なぜそれはロードマップの上にあるのか、道の上にはない：**それは独自のカテゴリーを作成する最大の可能性を持つ方向であり、それはまさしくなぜそれが早く売るのが最も簡単かである。それは存在しない。

## あなたのコーパスの上の専門エージェント

独自の範囲を持つエージェント。すでに保管庫にある知識の上に構築。あなたの会社の本当の物質から教える家庭教師。新しいプロセスの採用仲間。それが出典を引用している間に能力をチェック。評価者。

**すでに下に立つ：**コーパス。リネージ。会話エージェント。源の引用。**何が欠けているのか：**タスクレベルの特殊化。独自のlimitsと規則を持つ各エージェントごと。

## 統治されたエージェントの艦隊のための基質

前のステップからの次のステップ。そして最も広く到達。会社の各部分は保管庫に独自の文書を供給。そしてその部分がすでに使用するエージェントはそのランタイムで保管庫を相談。ファイルで。またはプロトコルで。会社についての質問のために。1つの統治されたソース。全艦隊の下。それではなく。監査しない緩いAIツール。

**なぜこれはロードマップであり、ぼやけた約束ではないのか：**採用メカニズムは具体的。そしてすでに部分的に存在。保管庫は携帯可能。外部からの消費可能。何が欠けているのか。艦隊統治。それは構築されない。

## 存在して、さらに表示できないもの

これらは機能ギャップ。特徴ギャップではない。能力はある。公開の証拠はない。それまで。私たちはおしゃべりな周りの空白よりリスト選好する。

- **実証されたボールト輸出。**保管庫は存在。平文。リンク。何が欠けているのは公開デモンストレーション。誰もが話すことなく再現できる。それまで。デューデリジェンス会話。ページアイテムではない。
- **正式な監査レコードの十分性。**レコードは存在。管理証拠として機能。あなたの業界の特定の監査要件を閉じるかどうか。ケースバイケースで回答する質問。ページ主張ではない。
- **測定した上のスケール。**数百万のドキュメントのボリュームは実行されない。それは購入サイジングプロジェクト。購入の前。

## まだ存在しないもの

これらは欠けている機能。それよりも柔らかいどこでも申請する。それはあなたにそれらが存在して、私たちは単に表示できないことを伝えるであろう。彼らはいない。

- **忠実な視覚的検証。**システムは構造を測定。要素を数える。それは最終ページを見ない。製品内の視覚的チェッカーは存在しない。
- **バックアップコピーに到達する削除。**今日、削除は完全。ライブシステムで。そしてリテンション期間内のバックアップに到達しない。技術的パスが定義される。まだ構築されない。正確な範囲は[プライバシーと主権](privacy)。
- **コンテンツを削除し、1つのアクション。インターフェースを通じてアカウントを無効にする。**今日、ドキュメント削除が存在。派生物と一緒に。すべて一度にすることは存在しない。そしてリクエストで処理される閉鎖。名前が故意。それはコンテンツを消す。そしてアカウントを無効にする。なぜなら。システムにアクセスした誰かの轡は仲間の中にとどまる。

## このページはどのように保持されるか

アイテムがここを去るとき、それは存在。そしてそれが測定されている。ほぼ準備ではない。それが去るとき。それはマッチング能力ページに入る。それが保証することとともに。そしてそれが停止する場所。もしあなたがしばらくSazAIを追う。このページは速度が示す場所。

## 境界がパスするところ

<h3 class="sub">3つのlimits。技術的な読者最初テスト。試験の前に述べられた。</h3>

**プロバイダー境界。**リネージは各テキストのピースに従う。それが言語モデルのために去るまで。そしてそれが戻るときピックアップ再開。テーブルはありません。何が起こったか記録される。他方。それを求める誰でも。*テキスト内でモデルはそれをしたことを証明*。彼らが契約したプロバイダーの保持用語を受け取る。そしてあなた自身のインストール。プロバイダーはあなたの選択。[主権](privacy)ページは言う。ここで停止。

**Copyleftライセンス除外。**AGPLライブラリなしエンジンに入る。そしてそれは依存ファイルに書かれている。文書化されたプロジェクト決定。それはコメント。ゲートではない。何も壊す。ビルド。それを誰かが無視。言うこと。より強い。ゲートのふりをすることより。なぜなら。誰がファイルを開く。それは10秒見える。

**エージェント。**このシステムはエージェントのチームによって構築。宣言された範囲。そしてレビュー連鎖。そしてそれらの間の通信。実践。受信書ではない。書かれた決定なし。チャネルを統治。そしてその障害モード。測定された。私たちの。今週。アカウント簿の右側に座る。そしてそこに行く。

このページが述べるすべてはコマンドまたはドキュメントの後ろにある。そしてそれはない。方向として述べられた。もし何かここが再現されない。あなた自身の評価。それは私たちの欠陥。そしてあなたより前に知りたい。最初に出てきた製品。このプラットフォーム。それは[ドキュメント入る時見える](see)。

### このピラミッドが保持しないもの

正直なピラミッドがそれの外に何が留まるかを言う。

**データと事実：**

- 5つの教義参照。ゼロのエンジニアリング工芸品。W3C **PROV**。ZAHARIA他。**複合AIシステム**（BAIR、2024）。XU他。**GraphRAG**（SIGIR、2024）。**モデルルーティング**文献。**CommonMark/GFM**。彼らは考えを形作った。記録された決定。出てきた。なし。
- テスト：強い実践。ビルドを拒否するガード。日付レポート。外部方法宣言。なし。これらの言葉で述べた。それぞれ説得力のある隣人。
- そして結論全体を保つ発見。11の11の代替え。決定したのは何。エンジニアリング原理。外部参照ではない。標準が支持。選択は私たち。そしてそれが書かれた。

</div>

*2026-09-01で測定された図。成長するセット：誰が明日の測定を繰り返す。同じものを期待。より大きい数ではない。*

<script type="module">
// IF THE #stars CANVAS EVER MORPHS INTO THIS GRAPH (Dev UX / Dev CO), REMOVE THIS FIGURE: two
// objects doing one job on one page is how a surface rots, quietly, because both look right.
// THE VAULT GRAPH, BORN AS STARS. Geometry in SVG, words in HTML. The layout is seeded, so the
// same picture renders every time; hubs are the real hubs of sazai.vault; satellites are counted
// per section, not drawn one to one. First reveal on intersection: points scatter like the
// starfield, then settle into the graph and the labels fade in. Hover lights a hub's edges;
// click (or Enter) opens the same scene full-screen; Escape closes. Reduced motion: no drift.
const fig=document.getElementById('vault-graph'); if(fig){
const svg=fig.querySelector('svg'),E=fig.querySelector('.edges'),N=fig.querySelector('.nodes'),L=fig.querySelector('.labels');
// no namespace literal: the house serves zero external references, and insertAdjacentHTML inside the <svg> inherits the SVG namespace on its own
const el=(t,a,parent)=>{parent.insertAdjacentHTML('beforeend','<'+t+' '+Object.entries(a).map(([k,v])=>k+'="'+v+'"').join(' ')+'/>');return parent.lastElementChild};
let seed=20260828; const rnd=()=>{seed=(seed*1664525+1013904223)%4294967296;return seed/4294967296};
const H=[ // real hubs of sazai.vault; n = satellites drawn, proportional, not exact
 {id:'index',l:'00-INDEX',x:400,y:250,c:'var(--dark)',r:9,n:6},
 {id:'adrs',l:'ADRs Hub',x:300,y:120,c:'var(--hue-reprocess)',r:8,n:61},
 {id:'agents',l:'Agents Hub',x:250,y:330,c:'var(--hue-analysis)',r:8,n:30},
 {id:'km',l:'Knowledge Map',x:560,y:130,c:'var(--hue-output)',r:7,n:18},
 {id:'product',l:'MOC-Product',x:600,y:300,c:'var(--hue-output)',r:7,n:26},
 {id:'strategy',l:'MOC-Strategy',x:520,y:410,c:'var(--hue-upload)',r:7,n:28},
 {id:'ops',l:'MOC-Operations',x:130,y:200,c:'var(--gray)',r:6,n:14},
 {id:'people',l:'MOC-People',x:150,y:440,c:'var(--hue-analysis)',r:6,n:10},
 {id:'pitch',l:'MOC-Pitch',x:690,y:440,c:'var(--hue-upload)',r:6,n:12},
 {id:'personas',l:'Personas',x:410,y:470,c:'var(--hue-reprocess)',r:6,n:7},
 {id:'sessions',l:'Sessions',x:700,y:200,c:'var(--gray)',r:5,n:9},
];
const X=[['index','adrs'],['index','agents'],['index','km'],['index','product'],['index','strategy'],['index','ops'],['index','people'],['index','pitch'],['index','personas'],['index','sessions'],['adrs','km'],['adrs','agents'],['agents','ops'],['agents','people'],['product','km'],['product','strategy'],['strategy','pitch'],['strategy','personas'],['pitch','personas'],['sessions','agents'],['sessions','adrs']];
const nodes=[],edges=[];
for(const h of H){const hub={...h,hub:true,sx:h.x,sy:h.y,ph:rnd()*6.28};nodes.push(hub);
  for(let i=0;i<h.n;i++){const a=rnd()*6.28,d=34+rnd()*(h.n>20?110:70);const s={id:h.id+i,x:h.x+Math.cos(a)*d,y:h.y+Math.sin(a)*d,c:h.c,r:1.6+rnd()*1.6,hub:false,of:hub,ph:rnd()*6.28};s.sx=s.x;s.sy=s.y;nodes.push(s);edges.push([hub,s]);
    if(rnd()<.12){const o=nodes[Math.floor(rnd()*nodes.length)];if(o&&o!==s)edges.push([s,o]);}}}
const byId=Object.fromEntries(nodes.filter(n=>n.hub).map(n=>[n.id,n]));
for(const [a,b] of X)edges.push([byId[a],byId[b]]);
for(const n of nodes){n.el=el('circle',{r:n.r,fill:n.c,opacity:n.hub?1:.75},N);n.el.style.color=n.c;
  n.rx=rnd()*800;n.ry=rnd()*520;n.t=0; // scatter origin, for the reveal
  if(n.hub){const sp=document.createElement('span');sp.textContent=n.l;sp.dataset.hub=n.id;L.appendChild(sp);n.lab=sp;
    n.el.classList.add('hub');n.el.dataset.hub=n.id;}}
for(const e of edges){e.el=el('line',{stroke:'var(--lightgray)','stroke-width':e[0].hub&&e[1].hub?1:.6,opacity:.55},E);}
const reduce=matchMedia('(prefers-reduced-motion: reduce)').matches;
let t0=null,revealed=false,lit=null;
function place(){const now=performance.now();for(const n of nodes){
  const k=reduce?1:Math.min(1,(now-(t0||now))/1600),ease=1-Math.pow(1-k,3);
  const dx=reduce?0:Math.sin(now/1900+n.ph)*(n.hub?2.2:3.6),dy=reduce?0:Math.cos(now/2300+n.ph)*(n.hub?2.2:3.6);
  n.x=n.rx+(n.sx-n.rx)*ease+dx;n.y=n.ry+(n.sy-n.ry)*ease+dy;
  n.el.setAttribute('cx',n.x);n.el.setAttribute('cy',n.y);
  if(n.hub){const pulse=reduce?1:1+Math.sin(now/1400+n.ph)*.08;n.el.setAttribute('r',n.r*pulse*ease+ .5);
    n.lab.style.left=(n.x/800*100)+'%';n.lab.style.top=(n.y/520*100)+'%';}else n.el.setAttribute('r',n.r*(.4+.6*ease));}
  for(const e of edges){e.el.setAttribute('x1',e[0].x);e.el.setAttribute('y1',e[0].y);e.el.setAttribute('x2',e[1].x);e.el.setAttribute('y2',e[1].y);}
  if(!revealed&&(reduce||now-t0>1500)){revealed=true;fig.classList.add('ready');}
  if(!reduce||!revealed)requestAnimationFrame(place);}
function light(id){lit=id;fig.classList.toggle('lit',!!id);
  for(const e of edges){const on=id&&(e[0].id===id||e[1].id===id||(e[0].of&&e[0].of.id===id&&e[1].hub===false&&e[1].of===e[0].of));
    e.el.setAttribute('opacity',id?(on?1:.12):.55);e.el.setAttribute('stroke',on?byId[id].c:'var(--lightgray)');}
  for(const n of nodes){const on=!id||n.id===id||(n.of&&n.of.id===id);n.el.setAttribute('opacity',on?(n.hub?1:.85):.18);}}
fig.addEventListener('mouseover',e=>{const h=e.target.closest('[data-hub]');if(h)light(h.dataset.hub)});
fig.addEventListener('mouseout',e=>{if(e.target.closest('[data-hub]'))light(null)});
// THE EXPANDED SCENE IS A MODAL (ADR-047 A10.4 #15): the figure moves into an sz-modal beside it, inside the same
// chapter so the .chap .graph.full rules still match, and comes back on close. The dialog brings the top layer, the
// blurred page behind (A10.2) and Esc; moved BEFORE open, the figure is inside the modal, so no hole is cut for it.
const ph=document.createElement('div');let modal=null;
const restore=()=>{if(!fig.classList.contains('full'))return;fig.classList.remove('full');ph.replaceWith(fig);document.body.style.overflow='';fig.focus({preventScroll:true})};
const expand=()=>{if(!modal){modal=document.createElement('sz-modal');modal.setAttribute('size','full');modal.setAttribute('bare','');modal.setAttribute('label',fig.getAttribute('aria-label')||'');modal.addEventListener('sz-close',restore)}
  ph.style.height=fig.offsetHeight+'px';fig.replaceWith(ph);ph.after(modal);modal.appendChild(fig);fig.classList.add('full');document.body.style.overflow='hidden';modal.open();fig.focus({preventScroll:true})};
const toggle=()=>{if(fig.classList.contains('full')){modal.close();return}customElements.whenDefined('sz-modal').then(expand)};
fig.addEventListener('click',e=>{if(!e.target.closest('[data-hub]')||fig.classList.contains('full'))toggle()});
fig.addEventListener('keydown',e=>{if(e.key==='Enter'||e.key===' '){e.preventDefault();toggle()}});
// START ON SIGHT. IntersectionObserver is the primary trigger; a geometry check on load and on the
// first scroll is the fallback, so a viewport that never reports intersection (measured: an
// automated background tab delivers neither IO nor rAF) still gets the reveal on the next paint.
let started=false;const start=()=>{if(started)return;started=true;t0=performance.now();requestAnimationFrame(place)};
const inView=()=>{const r=fig.getBoundingClientRect();return r.top<innerHeight*.8&&r.bottom>innerHeight*.2};
const io=new IntersectionObserver((en)=>{if(en.some(x=>x.isIntersecting)){start();io.disconnect()}},{threshold:.35});io.observe(fig);
if(inView())start();else addEventListener('scroll',()=>{if(inView())start()},{passive:true});
}
</script>

<style>

/* CHAPTER NUMERALS, EDITORIAL. The number is the chapter's mark, not a KPI: it enters large,
   in the domain hue, beside an uppercase kicker that says what it counts. The house h2 follows
   untouched. These rules move to marketing.css (and the connectome port) when the page lands;
   they live in the body for the refine loop. */
/* ICON COLUMN (Ramés, 2026-08-28): the chapter icon sits left of the title AND its subtitle; the
   subtitle takes the old kicker voice: small, uppercase, quiet. */
/* THE ICON IS A SIBLING OF THE H2, NEVER INSIDE IT, AND THAT IS AN ANCHOR DECISION RATHER THAN
   A STYLE ONE. Quartz slugs a heading from its TEXT CONTENT, and any inline element in the
   heading contributes an empty token. Measured on a probe page, all six forms: `<sz-icon>`
   before the words gives `id="-forma-a-inline-antes"`, a `<span>` behaves identically, the icon
   AFTER the words gives a TRAILING hyphen, and the `{#explicit-id}` syntax is NOT supported
   here: it is slugged as literal text. Only a heading with no markup at all comes out clean.
   AN ANCHOR IS A URL AND A WRONG URL IS PERMANENT, so the icon leaves the heading. The visual
   is unchanged: `.ch` is zero-height and the icon is absolutely placed into the padding column
   the h2 already reserves. */
/* ============================================================================
   THE CHAPTER IS A PANEL, AND THAT ALSO RETIRES THREE MAGIC NUMBERS.

   THE DIAGNOSIS WAS AN INVERTED HIERARCHY, not a missing divider. Rendered, the page read
   heading / floating prose / CONTAINED FIGURE / floating prose: the figure carried a border,
   a fill and a blur while the chapter that owns it carried nothing, so the strongest container
   on the page was a child of the section rather than the section. Prose did not read loose so
   much as OUT-RANKED.

   Now each chapter is a real element, which fixes the ranking AND the alignment at once:

   1. THE CHAPTER IS THE SURFACE. Soft ground, hairline border, radius, generous padding.
   2. THE FIGURE GIVES BACK ITS FILL and keeps only its outline, so it reads as an object
      INSIDE the panel instead of a competing surface. The blur goes with the fill: a backdrop
      filter over a transparent box is cost with no picture.
   3. THE ICON SITS IN ITS OWN GRID COLUMN, vertically centred on the title block by the
      layout rather than by an offset. Everything before this was a magic number chasing a
      MARGIN COLLAPSE: `.ch` was a zero-height div and the h2's top margin collapsed through
      it, so the icon's 18px raise was EMERGENT, and every spacing change moved it. Measured,
      three times: padding opened a 2.4rem gap; a margin dropped it 19px; a margin on the
      previous paragraph did the same. The wrapper removes the collapse from the problem.
   ============================================================================ */
article .chap{position:relative;display:grid;grid-template-columns:3.4rem 1fr;
  gap:0 0;align-items:start;
  border:1px solid color-mix(in srgb,var(--lightgray) 85%,transparent);border-radius:14px;
  background:transparent;
  padding:1.7rem 1.9rem 1.5rem;margin:1.6rem 0}
/* THE GLASS IS A VEIL, NOT A FILTER ON THE PANEL, AND THAT IS A MEASURED CORRECTION.
   `blur(4px)` is the house's own value, read off the served page from `div.search-container`
   and `div.global-graph-outer`, the only two elements that already carry a backdrop filter.
   PUT IT ON `.chap` DIRECTLY AND THE COMPARE MODAL BREAKS: `backdrop-filter` makes the element
   a containing block for `position:fixed` DESCENDANTS, and the modal lives inside this panel.
   Measured before and after: the scrim went from the viewport (1440x757) to the panel's own box
   (788x569). So the veil goes on a pseudo-element at `z-index:-1`, which blurs what is behind
   the panel while leaving `.chap` an ordinary containing block. IT IS THE HOUSE'S OWN ANSWER
   TOO: `sz-search-field` solves the identical problem with a `.veil` behind its pill. */
article .chap::before{content:"";position:absolute;inset:0;z-index:-1;border-radius:inherit;
  /* `--surface` AND NOT `--light`, MEASURED RATHER THAN CHOSEN BY NAME. In the dark theme
     `--light` resolves to #09090b, which is EXACTLY the body background: a 40% mix of the
     background over the background is the background, and the panel measured invisible on the
     rendered pixels (inside 9,9,10 against outside 9,9,11: a delta of zero). Blur cannot
     rescue it either, because a backdrop filter over a flat surface has nothing to blur: THE
     FILL IS WHAT MAKES A PANEL EXIST and the blur is only its texture. `--surface` is #18181b,
     the house's own raised colour, the one `sz-search-field` puts behind its pill. */
  background:color-mix(in srgb,var(--surface) 72%,transparent);
  backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);pointer-events:none}
article .chap .ico-col{grid-column:1;grid-row:1 / span 2;align-self:center;
  display:flex;align-items:center;justify-content:flex-start;padding-top:.15rem}
article .chap .ico-col sz-icon,article .chap .ico-col .ico{display:inline-flex}
article .chap .ico-col .ico svg{width:36px;height:36px}
article .chap > h2{grid-column:2;grid-row:1;padding-left:0;margin:0}
article .chap > h3.sub{grid-column:2;grid-row:2;padding-left:0;margin:2px 0 0;line-height:1.15}
/* THE ANCHOR ICON WAS INFLATING THE LINE BOX, AND MY OWN CHANGE PUT IT THERE. Promoting the
   subtitle from `<p>` to `<h3>` for the SEO reading also gave it the `a[role=anchor]` Quartz
   adds to every heading: 15px tall, inline, on the baseline. Measured, the h3 box went to 26px
   for a 16px line, and that surplus is what read as too much air between title and subtitle.
   Capping the anchor to the text's own em takes the inflation out without removing the anchor,
   so the heading keeps the link it earned by being a heading. */
article .chap h2 a[role=anchor],article .chap h3.sub a[role=anchor]{
  display:inline-flex;align-items:center;height:1em;line-height:1;vertical-align:middle}
article .chap > *:not(.ico-col):not(h2):not(h3.sub){grid-column:1 / -1}
/* THE SPACE BELONGS TO THE FIRST PROSE PARAGRAPH, AND `:first-of-type` GAVE IT TO THE SUBTITLE.
   The first `<p>` inside a panel is `p.sub`, so this rule matched the subtitle instead of the
   prose: same specificity as the `.sub` rule and later in the block, so it won, and the
   subtitle inherited a 16px top margin nobody wrote for it. @rames spotted it on the rendered
   page before any probe did. Targeting the paragraph that FOLLOWS the subtitle says what was
   meant and cannot drift onto a sibling again. */
article .chap > h3.sub + p{margin-top:1rem}
article .chap > *:last-child{margin-bottom:0}
/* the figure is an object inside the panel, never a second surface */
article .chap .viz{background:transparent;backdrop-filter:none;-webkit-backdrop-filter:none;
  border-color:color-mix(in srgb,var(--lightgray) 65%,transparent)}
/* ============================================================================
   HINT TEXT ON A TERM, AND THE RULE IT KEEPS: THE HOVER IS NEVER THE ONLY COPY.

   @copy-chief's rule applied literally: the explanation lives in the SENTENCE, where all three
   readers reach it (the person, the buyer's research agent, our agent reading the .md). The
   attribute is the SHORT FORM of that same sentence, so the hover adds convenience and never
   carries meaning the prose lacks. His measured reason is this page's own defect: the
   aria-label versus <text> divergence came from two copies of the same words in two encodings,
   and only one of them ever got translated.

   NO SCRIPT. Hover, keyboard focus and tap all resolve through :hover and :focus-visible, so
   there is nothing to upgrade, nothing that can trap focus, and it works before any module
   loads. `tabindex=0` makes the term reachable by keyboard and gives a tap somewhere to land.
   The term is marked as a TERM and not as a link: dotted underline, body colour, no pointer,
   because the page carries four real links and a fifth affordance that looked the same
   would lie.
   ============================================================================ */
article dfn[data-hint]{font-style:italic;position:relative;border-bottom:1px dotted var(--gray);
  cursor:help;outline:none}
article dfn[data-hint]::after{content:attr(data-hint);position:absolute;left:0;top:calc(100% + .5rem);
  z-index:30;width:min(30rem,72vw);padding:.7rem .85rem;border:1px solid var(--lightgray);
  border-radius:10px;background:var(--light);color:var(--darkgray);
  font-style:normal;font-size:var(--fs-xs,.76rem);line-height:1.45;letter-spacing:0;
  box-shadow:0 8px 24px rgb(0 0 0 / .28);opacity:0;visibility:hidden;transition:opacity .12s ease}
article dfn[data-hint]:hover::after,article dfn[data-hint]:focus-visible::after{opacity:1;visibility:visible}
article dfn[data-hint]:focus-visible{border-bottom-color:var(--secondary)}
/* THE SUBTITLE IS AN h3 AND ITS LOOK IS UNCHANGED. @sophia's SEO reading: the H2s lost their
   keywords when they became short labels, and the sentences that carry them became a styled
   paragraph with no heading weight. Promoting the element gives the weight back without moving
   a pixel: every typographic value below is the one the `<p>` already had. */
article h3.sub{font-size:var(--fs-xs,.74rem);font-weight:var(--fw-normal,400);letter-spacing:.08em;text-transform:uppercase;color:var(--gray);line-height:1.15}
/* COMPARE, in the vault's vocabulary: original, the declared relation, the edition; the button opens the component. */
article .duo .act{grid-column:1/-1;text-align:center;margin-top:.4rem}
article .duo sz-compare{display:block;height:0;overflow:hidden}
/* THE SAME BLUR THE SEARCH OVERLAY USES (Quartz .search-container: backdrop-filter blur(4px)),
   applied to the content boxes over a translucent ground so the starfield lifts them. Moves to
   marketing.css .viz when the page lands. */
article .duo.four{grid-template-columns:repeat(4,1fr)}
article .duo.strip{grid-template-columns:auto auto 1fr}
article .duo .out4{display:grid;grid-template-columns:repeat(4,1fr);gap:.5rem}
article .duo .out4 span{display:block}
article .duo .out4 svg{width:40px;height:40px;margin:0 auto .3rem}
article .duo.four .side svg{width:44px;color:var(--hue-analysis)}
article .duo.xray .side svg{color:var(--hue-upload)}
@media (max-width:640px){article .duo.four{grid-template-columns:1fr 1fr}}
/* THE MODAL MUST BE ABOVE THE PAGE CHROME, AND THE HOUSE HAS NO LAYER SCALE TO SAY SO. Measured
   on the served page: the compare scrim is z-index 50 (sz-compare), the consent notice 60
   (sz-consent), the search field host 10000 (chrome CSS). A dialog the reader opened that
   renders UNDER the search bar is a defect; this lifts it through the part the component
   exposes for exactly that. 10001 is a magic number chasing another one, declared as such:
   the durable fix is NOT a z-scale: sz-modal already solved this in-house by building on the
   native <dialog> and its top layer, which no z-index can sit above. sz-compare following it
   onto <dialog> retires this rule; that is a component change, not a page style. */
article sz-compare::part(modal){z-index:10001}
@media (max-width:640px){article .duo.strip{grid-template-columns:1fr}article .duo .out4{grid-template-columns:1fr 1fr}}
/* THE CLOSE MIRRORS THE OPEN: one vault in the middle, two readers on the sides. Geometry only;
   every word is HTML. */
article .duo{display:grid;grid-template-columns:1fr auto 1fr;gap:1rem;align-items:center;text-align:center;font-size:var(--fs-xs,.74rem);color:var(--gray)}
article .duo svg{display:block;height:auto;margin:0 auto .3rem}
article .duo .side svg{width:56px}
article .duo .mid svg{width:96px}
article .duo b{display:block;color:var(--dark);font-size:var(--fs-sm,.86rem)}
@media (max-width:640px){article .duo{grid-template-columns:1fr}}

/* ============================================================================
   TWO OBJECTS THIS PAGE NEEDED AND `see` DID NOT.

   1. THE CURVE, ON A LOG SCALE, BECAUSE A LINEAR ONE HIDES THE ARGUMENT. The claim is one
      order of magnitude per format: 3600h, 48h, 4h, one session. Drawn linearly the last
      three bars are invisible and the fourth point, THE ONE CARRYING THE STRONGEST PROOF,
      reads as merely small. Log widths make the collapse legible, and the caption says the
      scale out loud so nobody reads it as linear.

      AND THE FOURTH ROW BREAKS THE VISUAL FAMILY ON PURPOSE. The three OOXML formats share a
      hue and a solid bar; PDF gets a different hue and an outlined bar. **THE BREAK IS THE
      ARGUMENT**: the engine did not get faster at PowerPoint, it became format-agnostic, and
      a fourth bar in the same family would have said the opposite.

   2. RECEIPT AND PRACTICE MUST NOT LOOK ALIKE, and that is a composition rule rather than a
      label. A receipt is a thing already true and carries its evidence on the same line, so
      it is solid, filled, and reads as closed. A practice is declared direction with no
      present-tense verb, so it is outlined, muted, and reads as open. A reader who never
      gets to the words should still be able to see which column is which.

   3. THE BOUNDS ARE IN THE FLOW, NOT IN SMALL PRINT. `see` had none of these. A bound that
      has to be read as a footnote is a bound that gets skipped, and both of this page's
      bounds are the kind a competent reader tests FIRST. So they sit inside the chapter, at
      the same measure as the prose, in a treatment that is quieter than the claim but not
      smaller than it.
   ============================================================================ */
article .curve{display:flex;flex-direction:column;gap:.55rem}
article .curve .row{display:grid;grid-template-columns:4.2rem 1fr 7.5rem;align-items:center;gap:.8rem}
article .curve .row b{font-size:var(--fs-sm,.86rem);color:var(--text)}
article .curve .track{display:block;height:10px;border-radius:5px;background:color-mix(in srgb,var(--lightgray) 45%,transparent)}
article .curve .bar{display:block;height:100%;border-radius:5px}
article .curve .ooxml .bar{background:var(--hue-analysis)}
article .curve .other .bar{background:transparent;border:1.5px solid var(--hue-output)}
article .curve .other b{color:var(--hue-output)}
article .curve em{font-style:normal;font-size:var(--fs-xs,.76rem);color:var(--gray);text-align:right}
article .curve .other em{color:var(--hue-output)}
article .ledger{display:grid;grid-template-columns:1fr 1fr;gap:1.4rem}
article .ledger h4{margin:0 0 .6rem;font-size:var(--fs-xs,.74rem);letter-spacing:.08em;text-transform:uppercase;font-weight:var(--fw-normal,400);color:var(--gray)}
article .ledger .item{margin-bottom:.7rem}
article .ledger .item b{display:block;font-size:var(--fs-sm,.88rem)}
article .ledger .item span{display:block;font-size:var(--fs-xs,.76rem);color:var(--gray);line-height:1.4;margin-top:.1rem}
article .ledger .receipts .item{border-left:2px solid var(--hue-output);padding-left:.7rem}
article .ledger .practices .item{border-left:2px dashed color-mix(in srgb,var(--gray) 55%,transparent);padding-left:.7rem}
article .ledger .practices .item b{color:var(--gray);font-weight:var(--fw-normal,400)}
article p.claim{margin:1rem 0 0;color:var(--text);font-size:var(--fs-sm,.95rem);line-height:1.55}
article .bound{margin:1.1rem 0 0;padding:.85rem 1rem;border-left:2px solid color-mix(in srgb,var(--gray) 40%,transparent);
  background:color-mix(in srgb,var(--surface) 45%,transparent);border-radius:0 8px 8px 0}
article .bound p{margin:0 0 .5rem;font-size:var(--fs-xs,.82rem);line-height:1.5;color:var(--gray)}
article .bound p:last-child{margin-bottom:0}
@media (max-width:640px){article .ledger{grid-template-columns:1fr}article .curve .row{grid-template-columns:3.4rem 1fr}article .curve em{grid-column:1/-1;text-align:left}}

/* THE VAULT GRAPH: born as stars, settles into the map. Geometry in SVG, words in HTML spans over
   it; `.stage` binds the two so labels track the drawing in both modes. Placed LAST so it wins
   over the panel's `.chap .viz` reset, and scoped to `.chap` so its specificity matches hers. */
article .chap .graph{position:relative;padding:.6rem;cursor:zoom-in;outline:none}
article .chap .graph .stage{position:relative;width:100%;aspect-ratio:800/520}
article .chap .graph .stage svg{display:block;width:100%;height:100%}
article .chap .graph .labels{position:absolute;inset:0;pointer-events:none}
article .chap .graph .labels span{position:absolute;transform:translate(-50%,10px);font-size:var(--fs-xs,.72rem);color:var(--dark);white-space:nowrap;opacity:0;transition:opacity .7s ease;text-shadow:0 0 6px var(--light),0 0 2px var(--light);pointer-events:auto}
article .chap .graph.ready .labels span{opacity:1}
article .chap .graph .nodes .hub{cursor:pointer;transition:opacity .25s}
article .chap .graph .edges line{transition:opacity .25s,stroke .25s}
article .chap .graph figcaption{margin-top:.4rem}
article .chap .graph:focus-visible{box-shadow:0 0 0 2px var(--secondary)}
article .chap .graph.full{flex:1;min-width:0;margin:0;border:0;border-radius:0;padding:3vh 4vw;background:transparent;cursor:zoom-out;display:flex;flex-direction:column;align-items:center;justify-content:center}
article .chap .graph.full .stage{width:min(92vw,calc(84vh * 800 / 520))}
article .chap .graph.full .labels span{font-size:1rem}
article .chap .graph.full figcaption{text-align:center;margin-top:1rem;max-width:70ch}
</style>
