---
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、保险库和设计系统已是从中产生的产品，每一个都使用同一引擎而非重建它。

在它下面，不是为外来者的即插即用。**加速器不是基质；它是团队对基质的掌控。** 了解引擎、组件和文档的人可以从已存在的东西构建新的 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>


各个面板按支点强度下降，每个都以可扩展块中的参考文献结束，供想要检查的人使用。引文遵循 ABNT NBR 6023 标准，2018。

<figure class="viz" role="group" aria-label="这个页面上的金字塔：四个支点强度，从执行依赖到定位，以及外面的间隙">
<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>

这个想法的框架并不新颖，也不是来自这个页面：它是 SazAI 描述自己的九个支柱中的第八个，*平台先于产品*。接下来是它的证明。

</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">第一步·执行依赖，最强的支点</h3>

如果标准在代码中有误，引擎就无法运行。参考不是被提及的；它是被依赖的，确定性从中产生。

**数据和事实：**

- 引擎中的 OOXML 命名空间：跨 37 种不同形式的 237 个出现（2026-09-01）。
- Dublin Core 作为依赖：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，它花费了整个引擎：读取、测量、翻译、写回、比较，全都是第一次。第二个，Word 文档，花费了少一个数量级。第三个，电子表格，又少一个。第四个，PDF，花费和第三个相同：曲线稳定了。这不是成就的列表；这是一条曲线，而曲线是论证。

<figure class="viz curve" role="group" aria-label="每种格式在完整周期中的成本，在对数刻度上：第一个花费整个引擎，每个接下来的少一个数量级，第四个在与第三个相同的成本处稳定">
<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>少一个数量级</em></div>
<div class="row ooxml"><b>XLSX</b><span class="track"><span class="bar" style="width:16%"></span></span><em>再少一个</em></div>
<div class="row other"><b>PDF</b><span class="track"><span class="bar" style="width:15%"></span></span><em>稳定</em></div>
<figcaption>对数刻度：每一步是一个数量级。第四个点不只是最小的：它本质不同，花费与第三个相同。</figcaption>
</figure>

<p class="claim">**PDF 是第一个非 Office 的基质**：二进制对象图而非 zip 加 XML。如果引擎只是在 PowerPoint 上变好，第四个格式花费会像第一个。它花费了第三个的量。**引擎没有在 PowerPoint 上变快；它成了格式无关的**，四种<a href="documents">格式</a>今天在同一架构上运行，每一个都有其自己的已声明保证。这就是为什么第五个会花费第四个花费的量，这就是这个页面所说的加速。</p>

<div class="bound">
<p><b>这被记录在哪里，在你问之前已说明。</b> 在 git 中，不在机构日记中：曲线立足于日期化决定和提交，这是间隔的正确来源，这正是评估中被检查的。每个格式的绝对时间在技术文档中，派生它们的命令在它旁边。</p>
</div>
<details class="refs"><summary>参考和已记录决定</summary>
<div>
<p><b>什么被写了，什么被舍弃</b></p><ul><li>按标准逐子句读取每个格式；启发式被舍弃是因为它不能通过审计。</li><li>整个系统上的日期采用 ISO 8601；元数据采用 Dublin Core。</li><li>PDF 作为第一个非 Office 基质被接受，按其自己的标准引用。</li></ul><p><b>参考文献（ABNT NBR 6023:2018）</b></p><ul><li>ECMA INTERNATIONAL. <b>ECMA-376</b>: Office Open XML 文件格式。访问地址：https://ecma-international.org/publications-and-standards/standards/ecma-376/。</li><li>ISO/IEC. <b>ISO/IEC 29500</b>: Office Open XML 文件格式。</li><li>ISO. <b>ISO 32000-1</b>: Portable Document Format. · ISO. <b>ISO 19005</b>: PDF/A。</li><li>ISO. <b>ISO 15836-1</b>: Dublin Core. · ISO. <b>ISO 8601</b>: 日期和时间。</li><li>IETF. <b>RFC 5646</b>: 标识语言的标签。</li><li>MICROSOFT. <b>MS-PPTX · MS-DOCX · MS-OE376 · MS-ODRAWXML · MS-OFFCRYPTO</b>: 实现说明。</li><li>UNICODE CONSORTIUM. <b>Unicode CMap</b> 规范。</li></ul>
</div>
</details>

</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 保险库，镜像资源库。决定、数据地图、代理合同、人物角色、战略、工作会议：每个笔记链接到其他，hub 是人或代理进入的门。这是同一个图，产品在他们自己的保险库中交付给客户，首先在我们自己身上使用。下面，我们的，在运动中；悬停在 hub 上看它链接的内容，点击以完全打开。

<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 保险库，如团队每天看到的。每个点是一个笔记；每条线，某人写的链接。Hub 有名字；其他是它们链接的。节点集在 2026-08-28 手工拍摄；当保险库的自动派生着陆时，这条线退出。</figcaption>
</figure>

<div class="bound">
<p><b>地图能到达多远，已测量，这是最值得的部分。</b> 保险库图到达 158 个数据地图表中的 55 个和五个格式地图中的一个；资源库到达 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">第二步·法律成了模式，模式是可检查的</h3>

法律以书面形式要求的，数据库通过结构满足。验证不是阅读我们的政策；它是审计模式。

**数据和事实：**

- 永久存储不进行文档内容；内容在单独的数据库中生活，敏感且可擦除。
- 租户隔离作为列，不是承诺：切片永不跨越租户。
- 今天认证：无。设计的控制在被寻求时用作证据。

<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"><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>

<details class="refs"><summary>参考和已记录决定</summary>
<div>
<p><b>什么被写了，什么被舍弃</b></p><ul><li>按设计和默认的隐私作为架构；一个共享数据库的合规层被舍弃。</li><li>移除被称为**撤销**，不是删除：更强的词被舍弃是因为它承诺了备份不支持的覆盖。</li></ul><p><b>参考文献（ABNT NBR 6023:2018）</b></p><ul><li>EUROPEAN UNION. <b>Regulation (EU) 2016/679</b> (GDPR), art. 25。</li><li>BRAZIL. <b>Law No. 13,709, of August 14, 2018</b> (LGPD)。</li><li>CAVOUKIAN, Ann. <b>隐私设计</b>：七个基本原则。多伦多：IPC, 2009。</li><li>ISO/IEC. <b>ISO/IEC 27001</b>. · OWASP FOUNDATION. 访问地址：https://owasp.org/。</li></ul>
</div>
</details>

</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">第三步·被引用的标准是合规；被测量的数字是设计</h3>

标准存在于组件中，数字在代码旁边，对比在任何颜色进入系统前被测量。

**数据和事实：**

- WCAG 2.2 AA 跨越 51 个设计系统文件，标准按编号引用（1.4.1, 3.1）（2026-09-01）。
- 对比按标记测量：`--hue-lineage` 在与备注 *guide, never text* 在标记本身内写的 4.00:1；`--text-faint` **失败**因为测量在白色上 2.56:1，且失败被记录。
- 色盲被测量：紫色在红色色盲下被评估，颜色距离 ΔE 29.1。
- 零个建筑决定记录 WCAG；房子最强的无障碍支点在决定记录中是不可见的，记录它是仍然要做的工作。

<figure class="viz" role="group" aria-label="三个颜色测量：一个标记作为指南获批，一个失败，紫色在红色色盲下被测量">
<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>备注 <i>guide, never text</i> 在标记本身内写</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>被引用的标准是合规；被测量的数字是设计。三个数字在标记中生活，不在政策中。</figcaption>
</figure>

### 设计系统是产品，构建在开放标准上

<h3 class="sub">第四步·其他表面的加速器，在 W3C 标准中</h3>

设计系统是 SazAI 产品通过批准（2026-08-26），函数加速其他：服务营销、保险库和展示的组件是相同的，它们是开放标准，不是专有框架。

**数据和事实：**

- 组件建立在 W3C Custom Elements 和 CSS Custom Properties；无框架依赖。
- 一个库，三个表面被服务；通过相同的标记机制的浅色和深色主题以及白标皮肤。
- 标记进行自己的测量和使用说明（第三步），所以规则随颜色传播。

<figure class="viz duo" role="group" aria-label="一个组件库服务三个表面">
<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>一个库</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>三个表面</b>营销、保险库、展示</div>
</figure>


<details class="refs"><summary>参考和已记录决定</summary>
<div><p><b>什么被写了，什么被舍弃</b></p><ul><li>在组件中按编号的标准满足它；中央政策页面被舍弃。</li><li>从设计中删除的词：HTML 中的文本，SVG 中的几何。</li></ul><p><b>参考文献（ABNT NBR 6023:2018）</b></p><ul><li>W3C. <b>WCAG 2.2</b>: 网页内容无障碍指南，AA 级。2023 推荐。访问地址：https://www.w3.org/TR/WCAG22/。</li></ul><p><b>什么被写了，什么被舍弃</b></p><ul><li>标准网络组件；专有框架被舍弃所以白标不会依赖我们的许可证。</li><li>坚持与任何表面相同的标准：运行的套件、在构建时拒绝的保护。</li></ul><p><b>参考文献（ABNT NBR 6023:2018）</b></p><ul><li>W3C. <b>Custom Elements</b> (HTML Living Standard). · W3C. <b>CSS Custom Properties for Cascading Variables</b>。</li></ul></div>
</details>

</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">第五步·开放标准在门口，以及它们启用的内容</h3>

开放 API 和 MCP 不是管道：它们是允许其他接口和连接在相同基质上构建的内容，不是我们在房间里。第三方代理、你自己的仪表盘、工作流集成：产品能够是这些东西因为通道存在。

**数据和事实：**

- 代理通道是标准 OAuth 资源服务器：没有凭证的 401，发现已发布。
- 奇偶作为合同：**MCP ⊆ OpenAPI**，MCP 暴露的一切在开放 API 中存在。一个基质，多个读者。
- 由可持久工作流执行工具的编排，因其保证而被采用，保证被测量：死工作不留部分状态；过载降级进入队列，不破裂；无内容无声地失败。

<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"/></svg><b>一个基质</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>

<details class="refs"><summary>参考和已记录决定</summary>
<div>
<p><b>什么被写了，什么被舍弃</b></p><ul><li>由 RFC 的身份验证和发现；自定义惯例被舍弃。</li><li>新通道不发明新表面：奇偶规则防止 MCP 成为第二 API。</li></ul><p><b>参考文献（ABNT NBR 6023:2018）</b></p><ul><li>IETF. <b>RFC 8414</b>: OAuth 2.0 Authorization Server Metadata. 2018。</li><li>IETF. <b>RFC 9728</b>: OAuth 2.0 Protected Resource Metadata. 2025。</li><li>IETF. <b>RFC 8707</b>: Resource Indicators for OAuth 2.0. 2020。</li><li>OPENAPI INITIATIVE. <b>OpenAPI Specification</b>. 访问地址：https://spec.openapis.org/。</li><li>ANTHROPIC. <b>Model Context Protocol</b> (MCP). 访问地址：https://modelcontextprotocol.io/。</li></ul>
</div>
</details>

</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>

验证有四个层，顺序很重要。**测试：** 资源库中 505 个测试文件，设计系统套件在每个构建上运行。**保护：** 在构建时拒绝的检查而非只报告；违反规则的构建不发货。**负载：** 2026-07-20 的测试，在忠实的生产副本上，50 个并发读在 0.77 秒内答复，一个重工作在 5 的天花板针对 4.71 GiB 峰值，以及五和十个工作的波形，零失败、零内存溢出、零损坏。在过载下系统进入队列；它不破裂。**内部审计：** 已日期化的压力、破坏和安全报告，每项都有一个裁决。

<figure class="viz duo four" role="group" aria-label="四个验证层：测试、拒绝的保护、有方法的审计、已发布的缺陷">
<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 认证。我们有的是**已记录的内部审计，有已声明的方法以及它找到的缺陷已发布在它通过的旁边**。我们的一份报告进行，作为它自己的部分，*找到的缺陷*、*一个我几乎发布的假阳性*以及*我无法建立的内容*。一个印章是第三方的字；一个已声明的方法，技术读者独自判断。已写的决定被设计作为控制证据当认证被寻求。</p>

<div class="bound">
<p><b>这个页面引用什么以及它不引用什么。</b> 这里是报告的存在和它们的方法。逐项裁决在伴随评估的技术文档中，因为在漏斗顶部发布探针列表和结果，交付一个地图给不应该有一个的人。负载*不*授权的短语：*五十并发*。这是五十座位和一次一个重工作；混淆这两个是这个页面存在以不犯的错误。</p>
</div>

<details class="refs"><summary>参考和已记录决定</summary>
<div><p><b>为测试轴声明的外部方法：无。</b> 强实践、在构建时拒绝的保护、已日期化的报告；方法的来源是内部的，说这是方法的一部分。</p></div>
</details>

</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">已写的已日期化决定，以及一个取代只删除两个句子及别无他物</h3>

每个 SazAI 架构决定是一个已日期化的文档，带上下文、被拒绝的替代和原因。截至这个页面的日期有 61 个，数字以已日期化的方式进入因为它增长；派生它的命令在这个面板的参考中。使这成为凭证而非死文件的是取代：当新决定与旧决定相矛盾时，它精确指出旧决定的哪个句子停止成立，旧决定在它自己的身体、句子中得到标记，而非标题。

最近的例子是昨天的。决定 023 固定，在其他东西中间，用户命名产品能力的词汇。决定 061 取代**两个句子**它，都关于词汇，而且让一切关于引擎完整，包括被认为违反的不是的子句。三个能干的读者已读那个子句同样错的方式，决定记录所有三个名字，因为一个只保持结论的决定失去了三个人为什么一起错的原因。

<figure class="viz duo" role="group" aria-label="一个旧决定有两个句子删除和其他完整的，链接到新决定">
<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>两个句子删除，其他完整</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>有三个一起错了的名字</div>
</figure>

<div class="bound">
<p><b>这个页面不发布的一个数字。</b> 这些决定中有多少*已接受*依赖于计数器在状态字段中承认哪些词，五个能干的计数器这周到达五个不同的数字。没人错了：字段从未声明它自己的词汇。我们发布已日期化的计数，命令在它旁边；已接受计数只在来带与产生它的命令在它旁边时去公开，就像 158 个表已去。</p>
</div>

</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">第六步·已记录的内部一致性，低于外部标准的一步</h3>

写作风格、命名和房子惯例在一个版本化的合同中生活，代理引用。其支点是与已记录的决定的内部一致性，不是一个编号的外部标准；那是低于前面的一步，向下一步证明即使当它花费某些东西时这个页面的等级也适用。

**数据和事实：**

- 一个单一的写作标准，由修订版本化，由决定和代理作为合同引用。
- 命名和名称惯例在整个系统中统一；被引用的标准从未被转述。
- 格式化、lint 和秘密扫描自动化，在标准中声明与源码在它旁边。

<figure class="viz" role="group" aria-label="已记录的内部一致性：低于外部标准的一步，有意绘制为虚线">
<div class="ev open"><span class="n">内部一致性</span><span class="t"><b>向下一步，这样绘制</b>这个面板的支点是一个已记录的决定，不是一个编号的标准。虚线框是房子为一切不是凭证的使用的相同框，一个向下一步的面板证明即使当它花费某些东西时等级也适用。</span></div>
</figure>


## 什么是凭证，什么仍然是实践

<h3 class="sub">四个能力有证据；三个已声明，没有现在时动词</h3>

这个平台上每个能力被放过三个问题：有一个已写的决定治理它？有一个测量？或它只是工作，没人写了为什么？什么通过前两个我们称为<dfn data-hint="一个能力带已写的决定和任何人可重现的测量：不是承诺，一个记录。">凭证</dfn>。其余是实践，以及它保持已声明为方向，同样的方式[roadmap](#roadmap)下面声明什么还不存在。一个呈现七个能力的页面，其中三个是凭证，比一个呈现四个的弱。

<figure class="viz ledger" role="group" aria-label="四个凭证带其证据以及三个实践已声明为方向">
<div class="col receipts">
<h4>凭证</h4>
<div class="item"><b>即插即用</b><span>4 个 ADR 和方案·四点曲线·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">左边的四个有某处被检查，下面的章节说哪里。右边的三个是平台去向，他们的任何动词都不在现在时。</p>

### 而且是市场：带附加的警告的研究

<h3 class="sub">第七步·支点所在的地方我们玩，不是我们如何构建</h3>

这一步支持定位，不是工程，那是为什么它最后：这是页面上最弱的支点，它被这样标记。

**数据和事实：**

- 七个房子：Gartner、BCG、McKinsey、Deloitte、Menlo Ventures、MIT NANDA、Stanford HAI。
- 内置在条目本身中的警告：初步称为初步（MIT NANDA, n=52）；重新发布称为重新发布（Stanford/McKinsey）；地区切片称为地区（Deloitte, EMEA）。
- BCG 的 79% 证明了障碍，未治理的非结构化数据；它不证明桥。
- 执行调查研究是感知，不是经审计的财务。


<details class="refs"><summary>参考和已记录决定</summary>
<div>
<p><b>什么被写了，什么被舍弃</b></p><ul><li>平台先于产品；购买先于构建。</li><li>在影子 AI 上，仅可引用的形式：通过受治理的企业路径的减少。"SazAI 解决影子 AI"被舍弃因为没有测量支持它。</li></ul><p><b>参考文献</b></p><p>ABNT NBR 6023:2018 形式的完整条目在这个页面的块中；库存中 25 个，在线查询的进行*访问日期*，如标准要求，其他进行不，如标准允许。</p>
</div>
</details>

</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>

## 路线图：我们在构建什么

路线图坚持大方向，平台指向已未构建的。当一件东西离开这里时，它从这个列表消失并出现在匹配能力的页面上，带日期。一个移动的路线图是唯一证明无法用形容词写的步伐。下面没有发货，这里的任何条目都不应在你今天的决定上加重。这个页面上没有发货。这里的任何条目都不应在你今天的决定上加重，我们团队中没人应以现在时呈现它们中任何一个。什么已发货在[product walk](/),带它保证的内容，存在的限制在[trust](trust)。

## 修订和谈判智能

比较草稿对方参与的修订，显示每边改了什么，风险向哪里移，文本揭示的意图。底层这个的比较引擎已存在并今天运行超过文档版本。什么缺失是法律层：理解一个改变的子句不只是不同的段落。

**为什么它在路线图上而非道路上：** 它是创建它自己类别的最大潜力的方向，那正是为什么它最容易过早销售。它不存在。

## 在你的语料库上的专门代理

有它们自己范围的代理，构建在已在你的保险库中的知识上：一个从你公司的真实材料教的导师，新过程的采用伴侣，一个评估检查能力时引用它使用的来源。

**什么已在下面站着：** 语料库、脉络、对话代理以及来源引用。**什么缺失：** 任务级专业化，带每个代理它自己的限制和规则。

## 受治理的代理船队的基质

从前一个的下一步，到达最远。公司的每一部分用其自己的文档给保险库供应，那部分已使用的代理在运行时咨询那个保险库，通过文件或协议，为关于公司的任何问题。一个受治理来源底下一个整个船队，而不是没人审计的松散 AI 工具。

**为什么这是路线图而非模糊承诺：** 采用机制是具体的以及已部分存在，因为保险库是便携的且从外面可消费。什么缺失是船队治理，它不构建。

## 存在的东西以及我们仍然无法显示你

这些是证据间隙，不是缺失的特征。能力在这里；公开证明不是，直到它是我们宁可列出间隙比谈论它。

- **已演示的保险库导出。** 保险库存在且是带链接的纯文本；什么缺失是一个已发布的演示任何人可以重现无需与我们谈话。直到那时，它是一个尽职调查对话，不是一个页面条目。
- **形式审计的记录充分。** 记录存在且用作控制证据。它是否结束你的部门的具体审计要求是一个问题我们案例情况回答，不是一个页面主张。
- **超过我们测量什么的规模。** 数百万或数百万文档的数量没有被练习。那是一个定大小的项目，然后它是一个购买。

## 仍然不存在的东西

这些是缺失的特征，给他们文件任何地方更软将告诉你它们在这里且我们只是无法显示它们。他们不在。

- **忠实的视觉验证。** 系统测量结构和计数元素；它不看最后的页面。产品内的视觉检查器不存在。
- **删除到达备份副本。** 今天删除在实时系统中是完整且不在保留窗口内到达备份。技术路径被定义且仍未构建。精确范围在[privacy and sovereignty](privacy)。
- **移除内容并在一个动作中通过接口停用帐户。** 今天文档删除存在且带走衍生物；做所有这一次不存在，关闭由请求处理。名称是故意的：它擦除内容并停用帐户，因为谁访问系统的踪迹保持。

## 这个页面如何被维护

一个条目当它存在且已被测量时离开这里，不是当它几乎准备好。当它离开时，它进入能力页面带它保证和它停止的地方。如果你为一些时间跟随 SazAI，这个页面是步伐显示的地方。

## 边界通过的地方

<h3 class="sub">一个技术读者测试最初的三个限制，在测试前已说明</h3>

**供应商边界。** 脉络跟随每块文本直到它为语言模型离开并当它返回时捡起来。我们的没有表记录另一边发生了什么；谁问*证明他们用我的文本在模型内做了什么*接收他们签约的供应商的保留条款，以及在你自己的安装中供应商是你的选择。关于[sovereignty](privacy)的页面说那在哪里停止。

**Copyleft 许可证排除。** 没有 AGPL 库进入引擎，那以一个已记录的项目决定写在依赖文件中。它是一个评论，不是一个门：没有什么如果某人忽视它就破裂构建。说这比假装它是一个门更强，因为谁打开文件十秒内看到它。

**代理。** 这个系统由一个团队已声明的范围的代理和一个审查链构建，他们之间的通信是实践，不是凭证：没有已写的决定治理通道，其故障模式被我们这周测量。它在账本的右边，那是它去向的地方。

这个页面陈述的每件东西有一个命令或一个文档在它后面，什么没有被陈述为方向。如果这里的某件东西无法在你自己的评估中被重现，那是我们的缺陷我们想知道先于你。从这个平台首先走出的产品是什么[you see when
a document comes in](see)。


### 这个金字塔不支持什么

一个诚实的金字塔说什么留在它外面。

**数据和事实：**

- 五个学说参考在零工程工件中：W3C **PROV** · ZAHARIA et al., **复合 AI 系统** (BAIR, 2024) · XU et al., **GraphRAG** (SIGIR, 2024) · **模型路由**文献· **CommonMark/GFM**。他们塑造了思考；没有已记录的决定出自它们。
- 测试：强实践、在构建时拒绝的保护、已日期化的报告；已声明的外部方法：无。用那些词说，没有合理的邻居。
- 而且找到支持整个结论的，在带替代的标头的决定间测量：在十一个十一个中，什么决定是工程原则，不是外部参考。标准支持；选择是我们的，以及它已写了下来。


</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:59},
 {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>
