---
title: "Het bouwplan van het platform: wat we hebben beslist, en waarop het rust."
seo_title: "Platformarchitectuur: besluiten en referenties | SazAI"
description: "Hoe SazAI is gebouwd: formaatblinde motoren, lineage, versiebeheer van besluiten, en validatie met methode."
tags: [marketing]
icon: book
---

> **Conclusie: de accelerator is het team's controle over het substraat; en geen besluit hier is smaak: de keuze is opgeschreven, met wat is verworpen en waarom.** De piramide hieronder is de kaart; het gat blijft erbuiten, uitgesproken.

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

## Wat SazAI is

<h3 class="sub">Motoren, componenten en documentatie, beheerst door wie ze heeft gebouwd</h3>

SazAI is het platform: het substraat voor intelligentie en bewijs waarop de producten
zijn gebouwd. Multi-tenancy, verificatie, lineage, orkestratie, agentlaag, exacte meting,
en versiebeheerde besluiten, gebouwd eenmalig. SazAI Corpus, de kluis, en het design system zijn de
producten die er al uit zijn gekomen, en elk gebruikt dezelfde motor in plaats van die opnieuw te bouwen.

De panelen dalen af naar ankerkracht, en elk sluit af met zijn referenties in een uitvouwbaar blok, voor wie wil controleren. Citaten volgen de ABNT NBR 6023 norm, 2018.

<figure class="viz" role="group" aria-label="De piramide op deze pagina: vier ankerkrachten, van uitvoeringsafhankelijkheid tot positionering, en het gat erbuiten">
<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)">uitvoeringsafhankelijkheid</b><span>de motor werkt niet zonder de norm · stap 1</span>
<b style="color:var(--hue-output);margin-top:.5rem">norm toegepast en gemeten</b><span>wet in het schema, criterium in de component, contrast per token · stappen 2 tot 4</span>
<b style="color:var(--hue-upload);margin-top:.5rem">geregistreerd besluit</b><span>keuze opgeschreven, met wat is verworpen en waarom · stappen 5 en 6</span>
<b style="color:var(--hue-reprocess);margin-top:.5rem">positionering</b><span>onderzoeken met het voorbehoud eraan verbonden · stap 7</span>
<b style="color:var(--gray);margin-top:.5rem">het gat</b><span>buiten de piramide, en uitgesproken · laatste panel</span>
</div>
</div>
<figcaption>Ankerkracht bepaalt de hoogte. Wat niets ondersteunt blijft buiten de tekening, gestippeld, met zijn eigen panel.</figcaption>
</figure>

Het is niet plug and play voor wie van buiten komt. **De accelerator is niet het
substraat; het is het team's controle erover.** Wie de motoren, de componenten en de
documentatie kent bouwt een nieuw SaaS-product vanuit wat al bestaat, en de rest van deze pagina is de maat van hoeveel dat het pad verkort.

<figure class="viz duo" role="group" aria-label="Motoren, componenten en documentatie; het team's controle in het midden; de producten die eruit komen">
<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>het substraat</b>motoren, componenten, documentatie</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>het team's controle</b>dat is wat versnelt</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>de producten</b>Corpus, kluis, design system</div>
</figure>

Het raamwerk voor dit idee is niet nieuw, en niet van deze pagina: het is de achtste van de negen
pijlers waarmee SazAI zichzelf beschrijft, *platform voor product*. Wat volgt is het bewijs ervan.

</div>

<div class="chap">

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

## De motor is afhankelijk van formaatstandaarden om te bestaan

<h3 class="sub">Stap 1 · uitvoeringsafhankelijkheid, de sterkste ankerkracht er is</h3>

Zou de norm in de code fout zijn, dan zou de motor niet draaien. De referentie wordt niet
genoemd; ervan is afhankelijk, en determinisme komt daar uit voort.

**Gegevens en feiten:**

- OOXML-naamruimte in de motor: 237 voorkomen in 37 verschillende vormen (2026-09-01).
- Dublin Core als een afhankelijkheid: 22 naamruimten. ISO 8601: de meest aangehaalde norm in de database, 60 voorkomen.
- De controleerbare keten: gepubliceerde clausule → DDL-kolom commentaar → datakaart → kolom. Parafrase verboden bij geschreven regel; DDL en kaart bevatten dezelfde clausule, woordelijk.

<figure class="viz duo four" role="group" aria-label="De keten van determinisme: gepubliceerde clausule, DDL-commentaar, kaartlaag, relationele kolom">
<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>gepubliceerde clausule</b>de norm, per nummer</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-commentaar</b>dezelfde clausule, woordelijk</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>kaartlaag</b>geen parafrase, per regel</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>relationele kolom</b>bestaat omdat de clausule bestaat</div>
</figure>


### En het volgende formaat kost minder

Het eerste formaat was PowerPoint, en het kostte de hele motor: lezen, meten, vertalen,
terugschrijven, vergelijken, alles voor de eerste keer. Het tweede, het Word-document, kostte een
orde van grootte minder. Het derde, het spreadsheet, nog een. En het vierde, PDF, kostte hetzelfde als
het derde: de curve stabiliseerde. Dit is geen lijst van prestaties; het is een curve, en de
curve is het argument.

<figure class="viz curve" role="group" aria-label="Kosten van elk formaat door de volledige cyclus, op logaritmische schaal: de eerste kostte de hele motor, elk volgende een orde van grootte minder, en de vierde stabiliseert op dezelfde kosten als de derde">
<div class="row ooxml"><b>PPTX</b><span class="track"><span class="bar" style="width:100%"></span></span><em>de hele motor</em></div>
<div class="row ooxml"><b>DOCX</b><span class="track"><span class="bar" style="width:46%"></span></span><em>een orde minder</em></div>
<div class="row ooxml"><b>XLSX</b><span class="track"><span class="bar" style="width:16%"></span></span><em>nog een</em></div>
<div class="row other"><b>PDF</b><span class="track"><span class="bar" style="width:15%"></span></span><em>stabiliseert</em></div>
<figcaption>Logaritmische schaal: elke stap is een orde van grootte. Het vierde punt is niet alleen het kleinste: het is van een ander karakter, en het kostte hetzelfde als het derde.</figcaption>
</figure>

<p class="claim">De <b>PDF is het eerste substraat dat niet Office is</b>: een binaire grafiek van objecten in plaats van zip plus XML. Zou de motor alleen goed zijn geworden in PowerPoint, dan zou het vierde formaat hebben gekost als het eerste. Het kostte als het derde. <b>De motor is niet sneller geworden in PowerPoint; het werd formaatblind</b>, en de <a href="documents">vier formaten</a> draaien vandaag op dezelfde architectuur, elk met zijn eigen verklaard garantie. Dat is waarom de vijfde zal kosten wat de vierde kostte, en dat is wat deze pagina versnelling noemt.</p>

<div class="bound">
<p><b>Waar dit is geregistreerd, uitgesproken voordat je vraagt.</b> In git, niet in het institutionele dagboek: de curve rust op gedateerde besluiten en commits, die de juiste bron zijn voor een interval, en dat is wat wordt gecontroleerd in een evaluatie. De absolute tijden voor elk formaat staan in het technische document, met het commando dat ze ernaast afleidt.</p>
</div>
<details class="refs"><summary>Referenties en geregistreerde besluiten</summary>
<div>
<p><b>Wat is geschreven, en wat is verworpen</b></p><ul><li>Lees elk formaat aan de hand van de norm, clausule voor clausule; de heuristiek is verworpen omdat die een audit niet doorstaat.</li><li>Datums in ISO 8601 in het hele systeem; metadata via Dublin Core.</li><li>PDF aanvaard als het eerste niet-Office substraat, aangehaald via zijn eigen norm.</li></ul><p><b>Referenties (ABNT NBR 6023:2018)</b></p><ul><li>ECMA INTERNATIONAL. <b>ECMA-376</b>: Office Open XML File Formats. Beschikbaar op: https://ecma-international.org/publications-and-standards/standards/ecma-376/.</li><li>ISO/IEC. <b>ISO/IEC 29500</b>: Office Open XML File Formats.</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>: Datum en tijd.</li><li>IETF. <b>RFC 5646</b>: Tags for Identifying Languages.</li><li>MICROSOFT. <b>MS-PPTX · MS-DOCX · MS-OE376 · MS-ODRAWXML · MS-OFFCRYPTO</b>: implementatienotities.</li><li>UNICODE CONSORTIUM. <b>Unicode CMap</b> specificaties.</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>

## Het kennislichaam

<h3 class="sub">Alles wat we hebben beslist, gemeten en geschreven, gekoppeld, en navigeerbaar door het team en door agenten</h3>

Het team's controle over het substraat heeft een plaats waar het leeft: een Obsidian-kluis die
het repository spiegelt. Besluiten, de datakaart, agentcontracten, persona's, strategie, werksessies:
elke notitie koppelt aan de andere, en hubs zijn de deuren waar een persoon of een
agent binnenkomt. Het is dezelfde grafiek die het product aan de klant in hun eigen kluis levert, eerst op
onszelf gebruikt. Hieronder, van ons, in beweging; zweef over een hub om te zien wat het koppelt, en klik
om het helemaal te openen.

<figure class="viz graph" id="vault-graph" role="group" tabindex="0" aria-label="De grafiek van de SazAI-kluis: de hubs voor besluiten, agenten, datakaart, product, strategie, operaties, mensen, pitch, en persona's, gekoppeld aan elkaar en aan hun notities">
<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>De SazAI-kluis, zoals het team hem elke dag ziet. Elk punt is een notitie; elke lijn, een koppeling die iemand heeft geschreven. De hubs hebben namen; de rest is wat ze koppelen. Knooppuntset met de hand gefotografeerd op 2026-08-28; wanneer de automatische afleiding van de kluis landt, verdwijnt deze regel.</figcaption>
</figure>

<div class="bound">
<p><b>Hoe ver de kaart reikt, gemeten, en dat is het deel waard het meest.</b> De kluisgrafiek reikt 55 van de 158 datakaart-tabellen en een van de vijf formaatkaarten; het repository reikt 158 van 158. Een figuur die alles verbonden zou laten zien zou deze pagina's enige bewering zonder bewijs erachter zijn, op een pagina waarvan het hele onderwerp is dat onze beweringen bewijzen dragen. Wat is gevalideerd is niet dat alles verbonden is: het is dat we exact weten wat verbonden is en wat niet. Waar de kaart zwijgt, beantwoordt het repository.</p>
</div>

</div>

<div class="chap">

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

## Gegevensbescherming is ontwerp, en ontwerp wordt gecontroleerd

<h3 class="sub">Stap 2 · de wet werd schema, en het schema kan worden gecontroleerd</h3>

Wat de wet in geschrift vraagt, vervult de database door structuur. Verificatie is niet
het lezen van ons beleid; het is het controleren van het schema.

**Gegevens en feiten:**

- Permanente opslag draagt geen documentinhoud; inhoud leeft in een aparte database, gevoelig en wist-baar.
- Isolatie per huurder als een kolom, niet als een belofte: segmenten kruisen nooit huurtders.
- Certificering vandaag: geen. Controles ontworpen om als bewijs te dienen wanneer dat wordt gezocht.

<figure class="viz duo" role="group" aria-label="Twee databases: de permanente zonder inhoud, en de gevoelige, apart en wist-baar">
<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>permanent</b>structuur, meting, lineage; inhoud, nooit</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>gescheiden door ontwerp</b>het schema controleren</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>gevoelig</b>de inhoud, echt wist-baar</div>
</figure>

<details class="refs"><summary>Referenties en geregistreerde besluiten</summary>
<div>
<p><b>Wat is geschreven, en wat is verworpen</b></p><ul><li>Privacy door ontwerp en standaard als architectuur; een nalevingslaag over een gedeelde database is verworpen.</li><li>Verwijdering heet <b>indiening</b>, niet verwijdering: het sterkere woord is verworpen omdat het een bereik beloofde dat backups niet kunnen volhouden.</li></ul><p><b>Referenties (ABNT NBR 6023:2018)</b></p><ul><li>EUROPESE UNIE. <b>Verordening (EU) 2016/679</b> (GDPR), art. 25.</li><li>BRAZILIË. <b>Wet nr. 13.709, van 14 augustus 2018</b> (LGPD).</li><li>CAVOUKIAN, Ann. <b>Privacy by Design</b>: de 7 fundamentele principes. Toronto: IPC, 2009.</li><li>ISO/IEC. <b>ISO/IEC 27001</b>. · OWASP FOUNDATION. Beschikbaar op: 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>

## Toegankelijkheid wordt gemeten, niet verklaard

<h3 class="sub">Stap 3 · een aangehaalde norm is naleving; een gemeten getal is ontwerp</h3>

Het criterium leeft in de component, met het getal ernaast in de code, en contrast wordt
gemeten voordat een kleur in het systeem komt.

**Gegevens en feiten:**

- WCAG 2.2 AA over 51 design-system bestanden, met criteria aangehaald per getal (1.4.1, 3.1) (2026-09-01).
- Contrast gemeten per token: `--hue-lineage` op 4,00:1 met de opmerking *gids, nooit tekst* geschreven in het token zelf; `--text-faint` **mislukt** voor het meten van 2,56:1 op wit, en de mislukking geregistreerd.
- Kleurenblindheid gemeten: de paarse onder deuteranopie, kleurafstand ΔE 29.1.
- Nul architectuur besluiten registreren WCAG; de sterktste toegankelijkheidsanker van het huis is onzichtbaar in de besluitregistratie, en het registreren ervan is nog werk om te doen.

<figure class="viz" role="group" aria-label="Drie kleurmetingen: een token goedgekeurd als gids, een mislukt, en de paarse gemeten onder deuteranopie">
<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>goedgekeurd als gids</b>met de opmerking <i>gids, nooit tekst</i> geschreven in het token zelf</span></div></div>
<div class="side"><div class="ev open" style="margin:0"><span class="n">2,56:1</span><span class="t"><b>mislukt</b>gemeten op wit, en de mislukking geregistreerd</span></div></div>
<div class="side"><div class="ev proof" style="margin:0"><span class="n">ΔE 29,1</span><span class="t"><b>deuteranopie</b>de paarse gemeten onder de meest voorkomende kleurgebreken</span></div></div>
</div>
<figcaption>Een aangehaalde norm is naleving; een gemeten getal is ontwerp. De drie getallen leven in de tokens, niet in een beleid.</figcaption>
</figure>

### Het design system is een product, gebouwd op een open norm

<h3 class="sub">Stap 4 · de accelerator voor de andere oppervlakken, in W3C-norm</h3>

Het design system is een SazAI-product per ratificatie (2026-08-26), met de functie van
het versnellen van de andere: de componenten die marketing, de kluis en de showcase dienen zijn
dezelfde, en ze zijn open norm, niet een eigen framework.

**Gegevens en feiten:**

- Componenten gebouwd op W3C Custom Elements en CSS Custom Properties; geen framework-afhankelijkheid.
- Één bibliotheek, drie oppervlakken bediend; lichte en donkere thema's en white-label skins via hetzelfde tokenmechanisme.
- De tokens dragen hun eigen metingen en gebruiksnotities (stap 3), dus de regel reist met de kleur.

<figure class="viz duo" role="group" aria-label="Één componentenbibliotheek die drie oppervlakken bedient">
<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>één bibliotheek</b>componenten, tokens, skins</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>hetzelfde mechanisme</b>thema's en white label per token</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>drie oppervlakken</b>marketing, kluis, showcase</div>
</figure>


<details class="refs"><summary>Referenties en geregistreerde besluiten</summary>
<div><p><b>Wat is geschreven, en wat is verworpen</b></p><ul><li>Criterium per getal in de component die het vervult; de centrale beleidspagina is verworpen.</li><li>Woord uit ontwerp: tekst in HTML, geometrie in SVG.</li></ul><p><b>Referenties (ABNT NBR 6023:2018)</b></p><ul><li>W3C. <b>WCAG 2.2</b>: Web Content Accessibility Guidelines, niveau AA. Aanbeveling, 2023. Beschikbaar op: https://www.w3.org/TR/WCAG22/.</li></ul><p><b>Wat is geschreven, en wat is verworpen</b></p><ul><li>Standaard Web Components; het eigen framework is verworpen zodat white label niet afhankelijk zou zijn van een licentie van ons.</li><li>Gehouden aan dezelfde norm als elk oppervlak: een suite die draait, wachten die op bouw weigeren.</li></ul><p><b>Referenties (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>

## Kanalen zijn mogelijkheid: API en MCP veranderen wat het product kan zijn

<h3 class="sub">Stap 5 · open normen aan de deur, en wat zij mogelijk maken</h3>

Open API en MCP zijn geen leidingen: ze stellen anderen in staat andere interfaces en verbindingen
op hetzelfde substraat te bouwen, zonder ons in de kamer. Een agent van jezelf, een dashboard
van jezelf, een workflowintegratie: het product wordt in staat om die dingen te zijn omdat de kanalen bestaan.

**Gegevens en feiten:**

- Het agentkanaal is een standaard OAuth-resourceserver: 401 zonder referentie, ontdekking gepubliceerd.
- Pariteit als contract: **MCP ⊆ OpenAPI**, alles wat MCP blootlegt bestaat in de open API. Eén substraat, meerdere lezers.
- Orkestratie door een duurzaam workflowuitvoeringshulpmiddel, aangenomen voor wat het garandeert, en het garantie wordt gemeten: dood werk laat geen gedeeltelijke toestand achter; overbelasting degradeert in een wachtrij, het breekt niet; niets faalt stilletjes.

<figure class="viz duo" role="group" aria-label="Één substraat, twee kanalen, en de interfaces die zij mogelijk maken">
<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>één substraat</b>de motor en de kluis</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 en MCP</b>MCP ⊆ OpenAPI, per contract</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>wat het kan zijn</b>agenten van jezelf, dashboards van jezelf, workflows van jezelf</div>
</figure>

<details class="refs"><summary>Referenties en geregistreerde besluiten</summary>
<div>
<p><b>Wat is geschreven, en wat is verworpen</b></p><ul><li>Verificatie en ontdekking via de RFC's; een eigen overeenkomst is verworpen.</li><li>Een nieuw kanaal leidt niet tot een nieuw oppervlak: de pariteitregel voorkomt dat MCP een tweede API wordt.</li></ul><p><b>Referenties (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>. Beschikbaar op: https://spec.openapis.org/.</li><li>ANTHROPIC. <b>Model Context Protocol</b> (MCP). Beschikbaar op: 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>

## Hoe we valideren

<h3 class="sub">Tests die weigeren, controle met methode, en defecten gepubliceerd naast wat werkte</h3>

Validatie heeft vier lagen, en de volgorde is van belang. **Tests:** 505 testbestanden in het repository,
met de design-system suite draaiend op elke build. **Wachten:** controles die bij bouwtime weigeren
in plaats van alleen rapporteren; een build die een regel schendt wordt niet verzonden. **Belasting:** de test van
2026-07-20, op een trouwe productiereplicator, met 50 gelijktijdige lezingen beantwoord in 0,77 s, een
zware taak met een piek van 4,71 GiB tegen een limiet van 5, en golven van vijf en tien taken zonder fouten,
zonder geheugenuitvoering, zonder corruptie. Onder overbelasting voert het systeem in een wachtrij in; het breekt niet.
**Interne controle:** gedateerde stress-, vernietigings- en veiligheidsrapporten, met een verdict per
item.

<figure class="viz duo four" role="group" aria-label="Vier validatielagen: tests, wachten die weigeren, controle met methode, gepubliceerde defecten">
<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 tests</b>de suite draait op elke build</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>wachten die weigeren</b>een geschonden build wordt niet verzonden</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>controle met methode</b>stress, vernietiging, veiligheid</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>gepubliceerde defecten</b>naast wat werkte</div>
</figure>

<p class="claim">We zijn niet SOC2 of ISO gecertificeerd. Wat we hebben is <b>gedocumenteerde interne controle, met een verklaard method en met de defecten die het vond gepubliceerd naast de ervan die het passeerden</b>. Een van onze rapporten draagt, als eigen secties, <i>gevonden defecten</i>, <i>een fout-positief dat ik bijna publiceerde</i>, en <i>wat ik niet kon vaststellen</i>. Een zegel is het woord van een derde; een verklaard method, de technische lezer beoordeelt alleen. En de geschreven besluiten zijn ontworpen als controlebewijzen te dienen wanneer certificering wordt gezocht.</p>

<div class="bound">
<p><b>Wat deze pagina aanhaalt en wat niet.</b> Hier is het bestaan van de rapporten en hun method. De verdictuitspraken item voor item staan in het technische document dat bij een evaluatie hoort, omdat het publiceren van de testlijst met resultaten aan de bovenkant van de trechter een kaart geeft aan wie dat niet zou moeten hebben. De zin die de belasting <i>niet</i> toestaat: <i>vijftig gelijktijdige</i>. Het zijn vijftig stoelen en één zware taak tegelijk; de twee verwarren is de fout die deze pagina bestaat niet om te maken.</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>

## Hoe we beslissen

<h3 class="sub">Geschreven, gedateerde besluiten, en een opvolging die twee zinnen doorhaalt en niets anders</h3>

Elk SazAI-architectuursluit is een gedateerd document, met de context, het
verworpen alternatief en de reden. Het zijn er 61 op deze pagina's datum, en het getal komt gedateerd in omdat het groeit; het commando dat het afleidt staat in dit panel's referenties. Wat dit een bewijs maakt en niet een dood bestand is de opvolging: wanneer een nieuw besluit een oud tegenspreekt, vermeldt het exact welke zin van het oude niet meer geldt, en het oude krijgt het merk in zijn eigen lichaam, op de zin, en niet op de titel.

Het meest recente voorbeeld is van gisteren. Besluit 023 stelde, onder andere dingen, het vocabulaire vast
dat de gebruiker de mogelijkheden van het product mee benoemt. Besluit 061 volgde twee zinnen ervan op, beide
over vocabulaire, en liet alles over de motor intact, inclusief de clausule waarvan werd geloofd
dat die was geschonden en niet was. Drie bekwame lezers hadden die clausule op dezelfde verkeerde manier gelezen,
en het besluit registreert alle drie de namen, omdat een besluit dat alleen de conclusie bewaart het
motief verliest van drie mensen die samen verkeerd liepen.

<figure class="viz duo" role="group" aria-label="Een oud besluit met twee zinnen doorgehaald en de rest intact, gekoppeld aan het nieuwe besluit">
<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>het oude besluit</b>twee zinnen doorgehaald, de rest intact</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>volgt op</b>noemt de zin, en alleen die</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>het nieuwe besluit</b>met de drie namen die samen vergissen</div>
</figure>

<div class="bound">
<p><b>Een getal dat deze pagina niet publiceert.</b> Hoeveel van deze 61 zijn <i>aanvaard</i> hangt af van welke woorden de teller toelaat in het statusveld, en vijf bekwame tellers bereikten vijf verschillende getallen deze week. Niemand had ongelijk: het veld verklaarde nooit zijn eigen vocabulaire. We publiceren het gedateerde getal, met het commando ernaast; het aanvaardde getal gaat alleen openbaar wanneer het met het commando dat het voortbrengt ernaast komt, zoals de 158 tabellen al doen.</p>
</div>

### En hoe we schrijven: een intern contract, één stap lager voor eerlijkheid

<h3 class="sub">Stap 6 · geregistreerde interne coherentie, één stap onder externe norm</h3>

Schrijfstijl, naamgeving, en huisconventies leven in een versiecontract dat agenten
citeren. Haar anker is interne coherentie met een geregistreerd besluit, niet een genummerde
externe norm; dat is één stap lager dan de vorige, en een stap lager bewijst dat deze pagina's hiërarchie
geldt zelfs wanneer het iets kost.

**Gegevens en feiten:**

- Eén schrijfnorm, versiebeheerd per revisie, aangehaald door besluiten en door agenten als contract.
- Naamgeving en naamconventies uniform in het hele systeem; een aangehaalde norm wordt nooit geparafraseerd.
- Opmaak, lint, en geheim scannen geautomatiseerd, verklaard in de norm met de bron ernaast.

<figure class="viz" role="group" aria-label="Geregistreerde interne coherentie: één stap onder externe norm, doelbewust gestippeld getekend">
<div class="ev open"><span class="n">interne coherentie</span><span class="t"><b>Één stap lager, en zo getekend</b>Dit panel's anker is een geregistreerd besluit, niet een genummerde norm. Het gestippelde frame is hetzelfde dat het huis gebruikt voor alles wat geen bewijs is, en een panel dat een stap lager gaat bewijst dat de hiërarchie geldt zelfs wanneer het iets kost.</span></div>
</figure>


<details class="refs"><summary>Referenties en geregistreerde besluiten</summary>
<div>
<p><b>Wat is geschreven, en wat is verworpen</b></p><ul>
<li>De teller: <code>ls docs/corpus/pptx/tech_specs/ADR | grep -c '^ADR-'</code> retourneert 61 op 2026-09-01. Het getal groeit; het commando niet.</li><li>De naamgevingsalternatieven zijn verworpen door convergentie in drie oppervlakken, en de verwerping is geregistreerd met de reden.</li></ul><p><b>Referenties</b></p><p>het interne contract (`code_standards`, versiebeheerd) noemt zijn eigen bronnen; deze
pagina parafraseerde het niet.</p><p>Het interne contract (<i>code_standards</i>, versiebeheerd) noemt zijn eigen bronnen; deze pagina parafraseerde het niet.</p>
</div>
</details>

</div>

<div class="chap">

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

## Wat is een bewijs, en wat is nog praktijk

<h3 class="sub">Vier mogelijkheden met bewijs; drie verklaard, zonder werkwoord in onvoltooid tegenwoordige</h3>

Elke mogelijkheid op dit platform is aan drie vragen onderworpen: bestaat er een geschreven besluit dat
het regeert? bestaat er een meting? of werkt het gewoon, zonder dat iemand heeft geschreven waarom? Wat door de eerste twee komt heet <dfn data-hint="Een mogelijkheid met geschreven besluit en meting die iedereen kan herhalen: niet een belofte, een verslag.">bewijs</dfn>. De rest is praktijk, en blijft verklaard als
richting, op dezelfde manier als de [roadmap](#roadmap) hieronder verklaart wat nog niet bestaat. Een
pagina die zeven mogelijkheden presenteert waar drie bewijzen zijn is zwakker dan een die er vier presenteert.

<figure class="viz ledger" role="group" aria-label="Vier bewijzen met hun bewijs en drie praktijken verklaard als richting">
<div class="col receipts">
<h4>Bewijs</h4>
<div class="item"><b>Plug and play</b><span>4 ADRs en het recept · de vierpuntscurve · de 158-tabelpartitie, opnieuw afleidbaar</span></div>
<div class="item"><b>Wachtrijcontrole</b><span>5 ADRs · belastingstest met nul fouten, nul OOM, nul corruptie</span></div>
<div class="item"><b>Architectuur · lineage · tenancy</b><span>met de providergrens verklaard als een benoemde gat</span></div>
<div class="item"><b>Besluitversiebeheer</b><span>gedateerde besluiten, chirurgische opvolging</span></div>
</div>
<div class="col practices">
<h4>Verklaard praktijk</h4>
<div class="item"><b>Schemaversiebeheer</b><span>verklaard richting</span></div>
<div class="item"><b>Artefactversiebeheer</b><span>verklaard richting</span></div>
<div class="item"><b>Agentcommunicatie</b><span>verklaard richting, met foutmodi gemeten</span></div>
</div>
</figure>
<p class="claim">De vier aan de linkerkant hebben ergens plaats om te worden gecontroleerd, en de volgende hoofdstukken zeggen waar. De drie aan de rechterkant zijn waar het platform heen gaat, en geen van hun werkwoorden is in onvoltooid tegenwoordige.</p>

### En de markt: onderzoeken met de voorbehouden eraan verbonden

<h3 class="sub">Stap 7 · ankels waar we spelen, niet hoe we bouwen</h3>

Deze stap ondersteunt positionering, niet engineeren, en dat is waarom het het laatste is: het is de zwakste
anker op de pagina, en het is als zodanig gemarkeerd.

**Gegevens en feiten:**

- Zeven huizen: Gartner, BCG, McKinsey, Deloitte, Menlo Ventures, MIT NANDA, Stanford HAI.
- Voorbehouden ingebouwd in de items zelf: voorlopig genaamd voorlopig (MIT NANDA, n=52); herpubliceerd genaamd herpubliceerd (Stanford/McKinsey); een regionaal segment genaamd regionaal (Deloitte, EMEA).
- BCG's 79% bewijst het obstakel, ongeregeerd ongestructureerde gegevens; het bewijst niet de brug.
- Onderzoek naar leidinggevenden is waarneming, niet gecontroleerde financiën.


<details class="refs"><summary>Referenties en geregistreerde besluiten</summary>
<div>
<p><b>Wat is geschreven, en wat is verworpen</b></p><ul><li>Platform voor product; koop voor bouw.</li><li>Op Shadow AI, alleen de aanhaalde vorm: reductie via een beheerst zakelijk pad. "SazAI lost Shadow AI op" is verworpen omdat het geen meting had om het te steunen.</li></ul><p><b>Referenties</b></p><p>de volledige items in ABNT NBR 6023:2018-vorm staan in dit panel's blokken; van de 25 in het
inventaris, de online geraadpleegde dragen <i>Geraadpleegd op</i>, zoals de norm vereist, en de rest niet, zoals de
norm toestaat.</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>

## Roadmap: wat we bouwen

De roadmap houdt de grote richtingen vast, de richting waar het platform naar wijst en nog niet heeft gebouwd. Wanneer een stuk hier vertrekt, verdwijnt het uit deze lijst en verschijnt op de pagina voor de overeenkomende mogelijkheid, met de datum. Een roadmap die beweegt is het enige bewijs van tempo dat niet kan worden geschreven met een bijvoeglijk naamwoord. Niets hieronder is verzonden, en geen item hier zou op uw beslissing vandaag moeten wegen.
Niets op deze pagina is verzonden. Geen item hier zou op uw beslissing vandaag moeten wegen, en niemand in ons team zou ze in onvoltooid tegenwoordige moeten presenteren. Wat is verzonden is in de [productwandeling](/), met wat het garandeert, en de limieten van wat bestaat staan in [vertrouwen](trust).

## Redline en onderhandelingsintelligentie

Vergelijken van een concept tegen de herzieningen van de partijen, tonend wat elke zijde heeft gewijzigd, waar het risico is verschoven, en wat bedoeling de tekst onthult. De vergelijkingsmotor die hieronder ligt bestaat al en draait vandaag over documentversies. Wat ontbreekt is de juridische laag: begrijpen dat een gewijzigde clausule niet alleen een ander paragraaf is.

**Waarom het op de roadmap staat en niet op de weg:** het is de richting met het grootste potentieel om zijn eigen categorie te creëren, en dat is precies waarom het het makkelijkst te vroeg te verkopen is. Het bestaat niet.

## Gespecialiseerde agenten over uw corpus

Agenten met hun eigen bereik, gebouwd op de kennis die al in uw kluis is: een leermeester die uit uw bedrijf's echte materiaal onderwijst, een adoptiegezellen voor een nieuw proces, een evaluator die competentie controleert terwijl de bron die het gebruikte aanhaalt.

**Wat al eronder staat:** de corpus, lineage, de conversatieagent, en bronvermelding. **Wat ontbreekt:** taak-vlak specialisatie, met haar eigen limieten en regels per agent.

## Substraat voor een vloot van beheerste agenten

De volgende stap van de vorige, en de verstrekkendste. Elk deel van het bedrijf voert de kluis met zijn eigen documenten, en de agenten die deel al gebruikt raadplegen die kluis bij lopen, per bestand of per protocol, voor elke vraag over het bedrijf. Eén beheerste bron eronder een hele vloot, in plaats van losse AI-tools die niemand controleert.

**Waarom dit roadmap is en geen vaag belofte:** het aannamemechanisme is concreet en bestaat al deels, omdat de kluis draagbaar en verbruikbaar van buiten. Wat ontbreekt is vloot-bestuur, en het is niet gebouwd.

## Dingen die bestaan en die we je nog niet kunnen tonen

Dit zijn bewijsgaten, geen ontbrekende functies. De mogelijkheid is er; het openbare bewijs niet, en totdat dat is zouden we liever het gat vermelden dan eromheen spreken.

- **Geleide kluis-export.** De kluis bestaat en is gewone tekst met koppelingen; wat ontbreekt is een gepubliceerde demonstratie die iedereen zonder met ons te praten kan herhalen. Tot dan is het een due-diligence-gesprek, geen paginaitem.
- **Voldoende van het verslag voor formele controle.** Het verslag bestaat en dient als controlebewijz. Of het een specifieke controlevereis in uw sector afsluit is een vraag die we geval per geval beantwoorden, geen paginaclaim.
- **Schaal boven wat we hebben gemeten.** Volumes in de honderdduizenden of miljoenen documenten zijn niet geoefend. Dat is een sizing-project voordat het een aankoop is.

## Dingen die nog niet bestaan

Dit zijn ontbrekende functies, en ze ergens zachter indienen zou je zeggen dat ze er zijn en we kunnen ze alleen niet tonen. Ze zijn er niet.

- **Getrouwe visuele verificatie.** Het systeem meet structuur en telt elementen; het kijkt niet naar de uiteindelijke pagina. Een visuele controle in het product bestaat niet.
- **Verwijdering die back-upkopieën bereikt.** Vandaag is verwijdering compleet in levende systemen en bereikt backups niet binnen het retentievenster. Het technische pad is gedefinieerd en nog niet gebouwd. De exacte omvang is in [privacy en soevereiniteit](privacy).
- **Verwijder de inhoud en deactiveer het account, in één actie via de interface.** Vandaag bestaat documentverwijdering en neemt derivaten mee; dit alles tegelijk doen bestaat niet yet, en sluiting wordt op verzoek afgehandeld. De naam is opzettelijk: het wist de inhoud en deactiveert het account, omdat het spoor van wie het systeem bediende blijft.

## Hoe deze pagina wordt onderhouden

Een item gaat hier weg wanneer het bestaat en is gemeten, niet wanneer het bijna klaar is. Wanneer het gaat, voert het de mogelijkheidspagina met wat het garandeert en waar het stopt. Volg je SazAI een tijd, dit is de pagina waar tempo toont.

## Waar de grens passeert

<h3 class="sub">Drie limieten die een technische lezer het eerst test, uitgesproken voordat de test</h3>

**De providergrens.** Lineage volgt elk stuk tekst tot het voor het
taalmodel vertrek en hervat wanneer het terugkomt. Geen van onze tabellen registreert wat eraan gebeurde
de andere kant; wie vraagt *bewijzen wat ze met mijn tekst in het model hebben gedaan* ontvangt de retentie
voorwaarden van de provider die zij contracteerden, en in uw eigen installatie de provider is uw keuze. De pagina op
[soevereiniteit](privacy) zegt waar dat stopt.

**De copyleft-licentie-uitsluiting.** Geen AGPL-bibliotheek voert de motor in, en dat staat geschreven
in het afhankelijkheidsbestand als een gedocumenteerde projectbesluit. Het is een opmerking, niet een poort:
niets breekt de build als iemand het negeert. Dit zeggen is sterker dan doen alsof het een poort is, omdat
wie het bestand opent het in tien seconden ziet.

**De agenten.** Dit systeem is gebouwd door een team van agenten met verklaard bereik en een
revisiebeuling, en de communicatie eronder is praktijk, geen bewijs: er is geen geschreven besluit dat
het kanaal beheerst, en haar foutmodi werden door ons deze week gemeten. Het zit aan de rechterkant
van de ledger, en dat is waar het heen gaat.

Alles wat deze pagina stelt heeft een commando of een document eronder, en wat niet is
als richting gesteld. Als iets hier niet kan worden herhaald in uw eigen evaluatie, dat is een gebrek van ons en
we willen het weten voordat jij. Het product dat eerst uit dit platform kwam is wat [je ziet wanneer
een document binnenkomt](see).


### Wat deze piramide niet ondersteunt

Een eerlijke piramide zegt wat erbuiten blijft.

**Gegevens en feiten:**

- Vijf doctrinereferenties in nul engineerartefacten: W3C **PROV** · ZAHARIA et al., **samengestelde AI-systemen** (BAIR, 2024) · XU et al., **GraphRAG** (SIGIR, 2024) · **modelrouting**literatuur · **CommonMark/GFM**. Ze vormden het denken; geen geschreven besluit kwam eruit.
- Tests: sterke praktijk, wachten die op bouw weigeren, gedateerde rapporten; externe methodologie verklaard: geen. Gezegd in die woorden, zonder plausibel buurman.
- En de bevinding die de hele conclusie ondersteunt, gemeten over de besluiten met een alternatief in de koppelingen: in elf van elf, wat besloot was een engineeringprincipe, niet een externe referentie. De norm ondersteunt; de keuze is van ons, en het is opgeschreven.


</div>

*Cijfers gemeten op 2026-09-01 over sets die groeien: wie de meting morgen herhaalt moet grotere getallen verwachten, niet dezelfde.*

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