---
title: "L'architettura della piattaforma: cosa abbiamo deciso, e su cosa si regge."
seo_title: "Architettura della piattaforma: decisioni e riferimenti | SazAI"
description: "Come è costruita la SazAI: motori agnnostici, linhagem, decisioni versionate, validazione con metodo."
tags: [marketing]
icon: book
---

> **Conclusione: l'acceleratore è il controllo del team sul substrato; e nessuna decisione qui è gusto: la scelta è scritta, con quello che è stato scartato e perché.** La piramide sotto è la mappa; il vuoto rimane fuori da essa, dichiarato.

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

## Che cos'è la SazAI

<h3 class="sub">Motori, componenti e documentazione, dominati da chi li ha costruiti</h3>

La SazAI è la piattaforma: il substrato di intelligenza e prova su cui i prodotti sono
costruiti. Multi-tenancy, autenticazione, linhagem, orchestrazione, strato di agenti, misurazione esatta
e decisioni versionate, costruiti una volta. SazAI Corpus, la cassaforte e il design system sono i
prodotti che ne sono già usciti, e ognuno usa lo stesso motore invece di ricostruirlo.

I pannelli scendono per forza di ancoraggio, e ognuno si chiude con i suoi riferimenti in un blocco espandibile, per chi vuole verificare. Le citazioni seguono lo standard ABNT NBR 6023, 2018.

<figure class="viz" role="group" aria-label="La piramide di questa pagina: quattro forze di ancoraggio, da dipendenza di esecuzione a posizionamento, e il vuoto fuori">
<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)">dipendenza di esecuzione</b><span>il motore non funziona senza lo standard · passo 1</span>
<b style="color:var(--hue-output);margin-top:.5rem">standard applicato e misurato</b><span>legge nello schema, criterio nel componente, contrasto per token · passi 2 a 4</span>
<b style="color:var(--hue-upload);margin-top:.5rem">decisione registrata</b><span>scelta scritta, con quello che è stato scartato e perché · passi 5 e 6</span>
<b style="color:var(--hue-reprocess);margin-top:.5rem">posizionamento</b><span>studi con il caveat allegato · passo 7</span>
<b style="color:var(--gray);margin-top:.5rem">il vuoto</b><span>fuori dalla piramide, e dichiarato · ultimo pannello</span>
</div>
</div>
<figcaption>La forza di ancoraggio decide l'altezza. Quello che non sostiene nulla rimane fuori dal disegno, tratteggiato, con il suo pannello.</figcaption>
</figure>

Non è plug and play per chi arriva da fuori. **L'acceleratore non è il
substrato; è il controllo del team su di esso.** Chi conosce i motori, i componenti e la
documentazione costruisce un nuovo prodotto SaaS da quello che già esiste, e il resto di questa pagina è la misura di quanto ciò accorcia il percorso.

<figure class="viz duo" role="group" aria-label="Motori, componenti e documentazione; il controllo del team nel mezzo; i prodotti che escono">
<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>il substrato</b>motori, componenti, documentazione</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>il controllo del team</b>è quello che accelera</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>i prodotti</b>Corpus, cassaforte, design system</div>
</figure>

La cornice per questa idea non è nuova, e non viene da questa pagina: è l'ottavo dei nove pilastri con cui la SazAI si descrive, *piattaforma prima del prodotto*. Quello che segue è la sua prova.

</div>

<div class="chap">

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

## Il motore dipende dagli standard di formato per esistere

<h3 class="sub">Passo 1 · dipendenza di esecuzione, l'ancoraggio più forte che c'è</h3>

Se lo standard fosse sbagliato nel codice, il motore non funzionerebbe. Il riferimento non è
menzionato; è dipeso da, e il determinismo viene da questo.

**Dati e fatti:**

- OOXML namespace nel motore: 237 occorrenze in 37 forme distinte (2026-09-01).
- Dublin Core come dipendenza: 22 namespaces. ISO 8601: lo standard più citato nel database, 60 occorrenze.
- La catena verificabile: clausola pubblicata → commento DDL → mappa di dati → colonna. Parafrasi proibita da regola scritta; DDL e mappa portano la stessa clausola, letteralmente.

<figure class="viz duo four" role="group" aria-label="La catena del determinismo: clausola pubblicata, commento DDL, strato di mappa, colonna relazionale">
<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>clausola pubblicata</b>lo standard, per numero</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>commento DDL</b>la stessa clausola, letteralmente</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>strato di mappa</b>nessuna parafrasi, per regola</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>colonna relazionale</b>esiste perché la clausola esiste</div>
</figure>


### E il formato successivo costa meno

Il primo formato era PowerPoint, e è costato tutto il motore: leggere, misurare, tradurre,
scrivere di nuovo, confrontare, tutto per la prima volta. Il secondo, il documento Word, è costato un
ordine di grandezza meno. Il terzo, il foglio di calcolo, uno in più. E il quarto, PDF, è costato lo stesso del
terzo: la curva si è stabilizzata. Non è una lista di risultati; è una curva, e
la curva è l'argomento.

<figure class="viz curve" role="group" aria-label="Costo di ogni formato attraverso il ciclo completo, su scala logaritmica: il primo è costato tutto il motore, ognuno successivo un ordine di grandezza meno, e il quarto si stabilizza allo stesso costo del terzo">
<div class="row ooxml"><b>PPTX</b><span class="track"><span class="bar" style="width:100%"></span></span><em>tutto il motore</em></div>
<div class="row ooxml"><b>DOCX</b><span class="track"><span class="bar" style="width:46%"></span></span><em>un ordine meno</em></div>
<div class="row ooxml"><b>XLSX</b><span class="track"><span class="bar" style="width:16%"></span></span><em>uno in più</em></div>
<div class="row other"><b>PDF</b><span class="track"><span class="bar" style="width:15%"></span></span><em>si stabilizza</em></div>
<figcaption>Scala logaritmica: ogni passo è un ordine di grandezza. Il quarto punto non è solo il più piccolo: è di natura diversa, e è costato lo stesso del terzo.</figcaption>
</figure>

<p class="claim">Il <b>PDF è il primo substrato che non è Office</b>: un grafo binario di oggetti invece di zip più XML. Se il motore avesse solo migliorato in PowerPoint, il quarto formato avrebbe costato come il primo. È costato come il terzo. <b>Il motore non è diventato più veloce a PowerPoint; è diventato agnnostico del formato</b>, e i <a href="documents">quattro formati</a> funzionano oggi sulla stessa architettura, ognuno con la sua garanzia dichiarata. Ecco perché il quinto costerà quello che ha costato il quarto, e è questo che questa pagina chiama accelerazione.</p>

<div class="bound">
<p><b>Dove è registrato, detto prima che chiediate.</b> In git, non nel diario istituzionale: la curva si regge su decisioni datate e commit, che sono la fonte giusta per un intervallo, e è quello che si controlla in una valutazione. I tempi assoluti per ogni formato vivono nel documento tecnico, con il comando che li deriva accanto.</p>
</div>
<details class="refs"><summary>Riferimenti e decisioni registrate</summary>
<div>
<p><b>Cosa è scritto, e cosa è stato scartato</b></p><ul><li>Leggi ogni formato dallo standard, clausola per clausola; l'euristica è stata scartata perché non sopravvive a un audit.</li><li>Date in ISO 8601 in tutto il sistema; metadati di Dublin Core.</li><li>PDF accettato come il primo substrato non Office, citato dal suo standard.</li></ul><p><b>Riferimenti (ABNT NBR 6023:2018)</b></p><ul><li>ECMA INTERNATIONAL. <b>ECMA-376</b>: Office Open XML File Formats. Disponibile su: 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>: Date and time.</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>: implementation notes.</li><li>UNICODE CONSORTIUM. <b>Unicode CMap</b> specifications.</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>

## Il corpo di conoscenza

<h3 class="sub">Tutto quello che abbiamo deciso, misurato e scritto, collegato, e navigabile dal team e dagli agenti</h3>

Il controllo del team sul substrato ha un luogo dove abita: una cassaforte di Obsidian che
rispecchia il repository. Decisioni, la mappa di dati, i contratti degli agenti, le persone, la strategia, le sessioni di lavoro: ogni nota si collega alle altre, e gli hub sono le porte da cui una persona o un
agente entra. È lo stesso grafo che il prodotto consegna al cliente nella sua cassaforte, usato prima su
noi stessi. Sotto, il nostro, in movimento; passa con il mouse su un hub per vedere a cosa si collega, e clicca
per aprirlo completamente.

<figure class="viz graph" id="vault-graph" role="group" tabindex="0" aria-label="Il grafo della cassaforte di SazAI: gli hub per decisioni, agenti, mappa di dati, prodotto, strategia, operazioni, persone, pitch e persone, collegati tra loro e alle loro note">
<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>La cassaforte di SazAI, come il team la vede ogni giorno. Ogni punto è una nota; ogni linea, un collegamento che qualcuno ha scritto. Gli hub hanno nomi; il resto è quello a cui si collegano. Insieme di nodi fotografato a mano il 2026-08-28; quando arriva la derivazione automatica della cassaforte, questa riga se ne va.</figcaption>
</figure>

<div class="bound">
<p><b>Fino a dove arriva la mappa, misurato, e è la parte che vale di più.</b> Il grafo della cassaforte raggiunge 55 delle 158 tabelle della mappa di dati e una delle cinque mappe di formato; il repository raggiunge 158 su 158. Una figura che mostrasse tutto collegato sarebbe l'unica affermazione di questa pagina senza ricevuta dietro, in una pagina il cui soggetto è che le nostre affermazioni hanno ricevuta. Quello che è validato non è che tutto si collega: è che sappiamo esattamente cosa si collega e cosa no. Dove la mappa è silenziosa, il repository risponde.</p>
</div>

</div>

<div class="chap">

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

## La protezione dei dati è il design, e il design viene controllato

<h3 class="sub">Passo 2 · la legge è diventata schema, e lo schema è verificabile</h3>

Quello che la legge chiede per iscritto, il database lo realizza attraverso la struttura. La verifica non è
leggere la nostra politica; è controllare lo schema.

**Dati e fatti:**

- L'archiviazione permanente non porta contenuto di documento; il contenuto vive in un database separato, sensibile ed erasabile.
- Isolamento per tenant come colonna, non come promessa: le sezioni non attraversano mai i tenant.
- Certificazione oggi: nessuna. Controlli progettati per servire come prova quando è cercata.

<figure class="viz duo" role="group" aria-label="Due database: quello permanente senza contenuto, e quello sensibile, separato ed erasabile">
<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>permanente</b>struttura, misurazione, linhagem; contenuto, mai</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>separato per design</b>controlla lo schema</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>sensibile</b>il contenuto, veramente erasabile</div>
</figure>

<details class="refs"><summary>Riferimenti e decisioni registrate</summary>
<div>
<p><b>Cosa è scritto, e cosa è stato scartato</b></p><ul><li>Privacy per design e per default come architettura; uno strato di conformità su un database condiviso è stato scartato.</li><li>La rimozione si chiama <b>ritiro</b>, non eliminazione: la parola più forte è stata scartata perché prometteva una portata che i backup non sostengono.</li></ul><p><b>Riferimenti (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>Privacy by Design</b>: the 7 foundational principles. Toronto: IPC, 2009.</li><li>ISO/IEC. <b>ISO/IEC 27001</b>. · OWASP FOUNDATION. Disponibile su: 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>

## L'accessibilità è misurata, non dichiarata

<h3 class="sub">Passo 3 · uno standard citato è conformità; un numero misurato è design</h3>

Il criterio vive nel componente, con il numero accanto al codice, e il contrasto è
misurato prima che un colore entri nel sistema.

**Dati e fatti:**

- WCAG 2.2 AA in 51 file di design system, con criteri citati per numero (1.4.1, 3.1) (2026-09-01).
- Contrasto misurato per token: `--hue-lineage` a 4.00:1 con la nota *guida, mai testo* scritta dentro il token stesso; `--text-faint` **non ha superato** misurando 2.56:1 su bianco, e l'errore è stato registrato.
- Daltonismo misurato: il viola valutato sotto deuteranopia, distanza di colore ΔE 29.1.
- Zero decisioni architettoniche registrano WCAG; l'ancoraggio di accessibilità più forte della casa è invisibile nel record delle decisioni, e registrarlo è ancora lavoro da fare.

<figure class="viz" role="group" aria-label="Tre misure di colore: un token approvato come guida, uno non superato, e il viola misurato sotto deuteranopia">
<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>approvato come guida</b>con la nota <i>guida, mai testo</i> scritta dentro il token stesso</span></div></div>
<div class="side"><div class="ev open" style="margin:0"><span class="n">2.56:1</span><span class="t"><b>non superato</b>misurato su bianco, e l'errore registrato</span></div></div>
<div class="side"><div class="ev proof" style="margin:0"><span class="n">ΔE 29.1</span><span class="t"><b>deuteranopia</b>il viola misurato sotto il difetto di colore più comune</span></div></div>
</div>
<figcaption>Uno standard citato è conformità; un numero misurato è design. I tre numeri vivono nei token, non in una politica.</figcaption>
</figure>

### Il design system è un prodotto, costruito su uno standard aperto

<h3 class="sub">Passo 4 · l'acceleratore per le altre superfici, in W3C standard</h3>

Il design system è un prodotto di SazAI per ratifica (2026-08-26), con la funzione di
accelerare gli altri: i componenti che servono il marketing, la cassaforte e lo showcase sono
gli stessi, e sono standard aperto, non un framework proprietario.

**Dati e fatti:**

- Componenti costruiti su W3C Custom Elements e CSS Custom Properties; nessuna dipendenza da framework.
- Una libreria, tre superfici servite; temi leggeri e scuri e skin white-label attraverso lo stesso meccanismo di token.
- I token portano le loro stesse misure e note d'uso (passo 3), quindi la regola viaggia con il colore.

<figure class="viz duo" role="group" aria-label="Una libreria di componenti che serve tre superfici">
<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>una libreria</b>componenti, token, skin</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>lo stesso meccanismo</b>temi e 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>tre superfici</b>marketing, cassaforte, showcase</div>
</figure>


<details class="refs"><summary>Riferimenti e decisioni registrate</summary>
<div><p><b>Cosa è scritto, e cosa è stato scartato</b></p><ul><li>Criterio per numero nel componente che lo realizza; la pagina di politica centrale è stata scartata.</li><li>Parola fuori da design: testo in HTML, geometria in SVG.</li></ul><p><b>Riferimenti (ABNT NBR 6023:2018)</b></p><ul><li>W3C. <b>WCAG 2.2</b>: Web Content Accessibility Guidelines, level AA. Recommendation, 2023. Disponibile su: https://www.w3.org/TR/WCAG22/.</li></ul><p><b>Cosa è scritto, e cosa è stato scartato</b></p><ul><li>Web Components standard; il framework proprietario è stato scartato così white label non dipenderebbe da una nostra licenza.</li><li>Mantenuto allo stesso standard di ogni superficie: una suite che funziona, guardie che rifiutano al build.</li></ul><p><b>Riferimenti (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>

## I canali sono capacità: API e MCP cambiano quello che il prodotto può essere

<h3 class="sub">Passo 5 · standard aperti alla porta, e quello che abilitano</h3>

Open API e MCP non sono impianti idraulici: sono quello che consente costruire altre interfacce e connessioni
sullo stesso substrato, senza di noi nella stanza. Un agente di terze parti, una dashboard
vostra, un'integrazione di flusso di lavoro: il prodotto diventa capace di essere queste cose perché i canali esistono.

**Dati e fatti:**

- Il canale dell'agente è un server di risorse OAuth standard: 401 senza credenziale, discovery pubblicato.
- Parità come contratto: **MCP ⊆ OpenAPI**, tutto quello che MCP espone esiste nell'API aperta. Un substrato, molti lettori.
- Orchestrazione da uno strumento di esecuzione del flusso di lavoro durevole, adottato per quello che garantisce, e la garanzia è misurata: il lavoro morto non lascia stato parziale; il sovraccarico si degrada in una coda, non si rompe; nulla fallisce silenziosamente.

<figure class="viz duo" role="group" aria-label="Un substrato, due canali, e le interfacce che abilitano">
<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>un substrato</b>il motore e la cassaforte</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 e MCP</b>MCP ⊆ OpenAPI, per contratto</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>quello che può essere</b>agenti vostri, dashboard vostri, flussi di lavoro vostri</div>
</figure>

<details class="refs"><summary>Riferimenti e decisioni registrate</summary>
<div>
<p><b>Cosa è scritto, e cosa è stato scartato</b></p><ul><li>Autenticazione e discovery dalle RFC; una convenzione personalizzata è stata scartata.</li><li>Un nuovo canale non inventa una nuova superficie: la regola di parità mantiene MCP dal diventare una seconda API.</li></ul><p><b>Riferimenti (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>. Disponibile su: https://spec.openapis.org/.</li><li>ANTHROPIC. <b>Model Context Protocol</b> (MCP). Disponibile su: 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>

## Come validiamo

<h3 class="sub">Test che rifiutano, audit con metodo, e i difetti pubblicati accanto a quello che è passato</h3>

La validazione ha quattro strati, e l'ordine importa. **Test:** 505 file di test nel repository,
con la suite del design system che funziona a ogni build. **Guardie:** controlli che rifiutano al tempo di build
invece di solo segnalare; una build che viola una regola non viene distribuita. **Carico:** il test di
2026-07-20, su una replica fedele di produzione, con 50 letture concorrenti risposte in 0,77 s, un
job pesante che raggiunge il picco a 4,71 GiB contro un massimale di 5, e onde di cinque e dieci job con zero errori,
zero overflow di memoria, zero corruzione. Sotto sovraccarico il sistema entra in una coda; non si rompe.
**Audit interno:** rapporti datati di stress, distruzione e sicurezza, con un verdetto per
articolo.

<figure class="viz duo four" role="group" aria-label="Quattro strati di validazione: test, guardie che rifiutano, audit con metodo, difetti pubblicati">
<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 test</b>la suite funziona a ogni 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>guardie che rifiutano</b>una build violata non viene distribuita</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>audit con metodo</b>stress, distruzione, sicurezza</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>difetti pubblicati</b>accanto a quello che è passato</div>
</figure>

<p class="claim">Non siamo certificati SOC2 né ISO. Quello che abbiamo è <b>audit interno documentato, con metodo dichiarato e con i difetti che ha trovato pubblicati accanto a quelli che ha passato</b>. Uno dei nostri rapporti porta, come sezioni proprie, <i>difetti trovati</i>, <i>un falso positivo che stavo per pubblicare</i> e <i>cosa non ho potuto stabilire</i>. Un sigillo è la parola di una terza parte; un metodo dichiarato, il lettore tecnico giudica da solo. E le decisioni scritte sono progettate per servire come prova di controllo quando la certificazione viene cercata.</p>

<div class="bound">
<p><b>Cosa questa pagina cita e cosa non cita.</b> Qui c'è l'esistenza dei rapporti e il loro metodo. I verdetti articolo per articolo vivono nel documento tecnico che accompagna una valutazione, perché pubblicare la lista di sonde con risultati in cima all'imbuto consegna una mappa a chi non dovrebbe averne una. La frase che il carico <i>non</i> autorizza: <i>cinquanta concorrenti</i>. Sono cinquanta posti e un job pesante per volta; confondere i due è l'errore che questa pagina esiste per non fare.</p>
</div>

<details class="refs"><summary>Riferimenti e decisioni registrate</summary>
<div><p><b>Metodologia esterna dichiarata per l'asse di testing: nessuna.</b> Forte pratica, guardie che rifiutano al build, rapporti datati; la fonte del metodo è interna, e dirlo è parte del metodo.</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>

## Come decidiamo

<h3 class="sub">Decisioni scritte e datate, e una supersessione che colpisce due frasi e nulla più</h3>

Ogni decisione architetturale di SazAI è un documento datato, con il contesto, il
l'alternativa rifiutata e la ragione. Ci sono 61 alla data di questa pagina, e il numero entra datato perché cresce; il comando che lo deriva è nei riferimenti di questo pannello. Quello che rende questo una ricevuta e non un file morto è la
supersessione: quando una nuova decisione contraddice una vecchia, dice esattamente quale frase della vecchia
smette di valere, e la vecchia riceve il marchio nel proprio corpo, sulla frase, e non sul titolo.

L'esempio più recente è da ieri. La decisione 023 ha fissato, tra le altre cose, il vocabolario
che l'utente nomina le capacità del prodotto con. La decisione 061 ha supersesso **due frasi** di essa, entrambe
sul vocabolario, e ha lasciato tutto intatto quello che è sul motore, inclusa la clausola creduta
violata che non era. Tre lettori competenti avevano letto quella clausola nello stesso modo sbagliato,
e la decisione registra tutti e tre i nomi, perché una decisione che mantiene solo la conclusione perde il
motivo per cui tre persone l'hanno sbagliata insieme.

<figure class="viz duo" role="group" aria-label="Una vecchia decisione con due frasi cancellate e il resto intatto, collegata alla nuova decisione">
<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>la vecchia decisione</b>due frasi cancellate, il resto intatto</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>supersede</b>nomina la frase, e solo essa</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>la nuova decisione</b>con i tre nomi che hanno sbagliato insieme</div>
</figure>

<div class="bound">
<p><b>Un numero che questa pagina non pubblica.</b> Quante di queste decisioni sono <i>accettate</i> dipende da quali parole il contatore ammette nel campo dello stato, e cinque contatori competenti hanno raggiunto cinque numeri diversi questa settimana. Nessuno aveva ragione: il campo non ha mai dichiarato il suo vocabolario. Pubblichiamo il conteggio datato, con il comando accanto; il conteggio accettato va pubblico solo quando viene con il comando che lo produce accanto, come fanno già le 158 tabelle.</p>
</div>

### E come scriviamo: un contratto interno, un passo giù per l'onestà

<h3 class="sub">Passo 6 · coerenza interna registrata, un passo sotto lo standard esterno</h3>

Stile di scrittura, denominazione e convenzioni della casa vivono in un contratto versionato che gli agenti
citano. Il suo ancoraggio è coerenza interna con una decisione registrata, non uno standard
numerato esterno; è un passo sotto i precedenti, e scendere di un passo dimostra che la gerarchia di questa pagina
si applica anche quando costa qualcosa.

**Dati e fatti:**

- Un singolo standard di scrittura, versionato per revisione, citato da decisioni e da agenti come contratto.
- Convenzioni di denominazione uniformi in tutto il sistema; uno standard citato non è mai parafrasato.
- Formattazione, lint e scansione segreta automatizzate, dichiarate nello standard con la fonte accanto.

<figure class="viz" role="group" aria-label="Coerenza interna registrata: un passo sotto uno standard esterno, disegnato tratteggiato apposta">
<div class="ev open"><span class="n">coerenza interna</span><span class="t"><b>Un passo giù, e disegnato così</b>L'ancoraggio di questo pannello è una decisione registrata, non uno standard numerato. La cornice tratteggiata è la stessa che la casa usa per tutto quello che non è una ricevuta, e un pannello che scende di un passo dimostra che la gerarchia si applica anche quando costa qualcosa.</span></div>
</figure>


<details class="refs"><summary>Riferimenti e decisioni registrate</summary>
<div>
<p><b>Cosa è scritto, e cosa è stato scartato</b></p><ul>
<li>Il conteggio: `ls docs/corpus/pptx/tech_specs/ADR | grep -c '^ADR-'` ritorna 61 il 2026-09-01. Il numero cresce; il comando no.</li><li>Le alternative di denominazione sono state rifiutate per convergenza in tre superfici, e il rifiuto è registrato con la ragione.</li></ul><p><b>Riferimenti</b></p><p>il contratto interno (`code_standards`, versionato) nomina le sue fonti; questa pagina non lo parafrasa.</p><p>Il contratto interno (<i>code_standards</i>, versionato) nomina le sue fonti; questa pagina non lo parafrasa.</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>

## Cosa è una ricevuta, e cosa è ancora pratica

<h3 class="sub">Quattro capacità con prova; tre dichiarate, con nessun verbo al presente</h3>

Ogni capacità di questa piattaforma è stata sottoposta a tre domande: esiste una decisione scritta che
la governa? esiste una misurazione? o funziona solo, senza che nessuno abbia scritto perché? Quello che passa
le prime due la chiamiamo <dfn data-hint="Una capacità con una decisione scritta e una misurazione che chiunque può riprodurre: non una promessa, una registrazione.">ricevuta</dfn>. Il resto è pratica, e rimane dichiarato come
direzione, nello stesso modo in cui la [roadmap](#roadmap) sotto dichiara quello che non esiste ancora. Una
pagina che presenta sette capacità dove tre sono ricevute è più debole di una che ne presenta
quattro.

<figure class="viz ledger" role="group" aria-label="Quattro ricevute con la loro prova e tre pratiche dichiarate come direzione">
<div class="col receipts">
<h4>Ricevuta</h4>
<div class="item"><b>Plug and play</b><span>4 ADR e la ricetta · la curva di quattro punti · la partizione della tabella 158, ri-derivabile</span></div>
<div class="item"><b>Controllo della coda</b><span>5 ADR · test di carico con zero errori, zero OOM, zero corruzione</span></div>
<div class="item"><b>Architettura · linhagem · tenancy</b><span>con il confine del provider dichiarato come buco nominato</span></div>
<div class="item"><b>Versionamento della decisione</b><span>decisioni datate, supersessione chirurgica</span></div>
</div>
<div class="col practices">
<h4>Pratica dichiarata</h4>
<div class="item"><b>Versionamento dello schema</b><span>direzione dichiarata</span></div>
<div class="item"><b>Versionamento dell'artefatto</b><span>direzione dichiarata</span></div>
<div class="item"><b>Comunicazione tra agenti</b><span>direzione dichiarata, con modalità di errore misurate</span></div>
</div>
</figure>
<p class="claim">I quattro a sinistra hanno dove essere verificati, e i capitoli seguenti dicono dove. I tre a destra sono dove la piattaforma sta andando, e nessuno dei loro verbi è al presente.</p>

### E il mercato: studi con il caveat allegato

<h3 class="sub">Passo 7 · ancoraggi dove giochiamo, non come costruiamo</h3>

Questo passo sostiene il posizionamento, non l'ingegneria, e per questo è ultimo: è l'ancoraggio più debole della
pagina, ed è etichettato come tale.

**Dati e fatti:**

- Sette case: Gartner, BCG, McKinsey, Deloitte, Menlo Ventures, MIT NANDA, Stanford HAI.
- Caveats costruiti nelle voci stesse: preliminare chiamato preliminare (MIT NANDA, n=52); ripubblicato chiamato ripubblicato (Stanford/McKinsey); una fetta regionale chiamata regionale (Deloitte, EMEA).
- Il 79% di BCG dimostra l'ostacolo, dati non strutturati non governati; non dimostra il ponte.
- La ricerca di sondaggi esecutivi è percezione, non bilanci controllati.


<details class="refs"><summary>Riferimenti e decisioni registrate</summary>
<div>
<p><b>Cosa è scritto, e cosa è stato scartato</b></p><ul><li>Piattaforma prima del prodotto; comprare prima di costruire.</li><li>Su Shadow AI, solo la forma citabile: riduzione attraverso un percorso aziendale governato. "SazAI risolve Shadow AI" è stato scartato per non avere misurazione per sostenerlo.</li></ul><p><b>Riferimenti</b></p><p>le voci complete in forma ABNT NBR 6023:2018 sono nei blocchi di questa pagina; delle 25 nell'inventario, quelle consultate online portano <i>Accessed on</i>, come lo standard richiede, e il resto no, come lo standard consente.</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: quello che stiamo costruendo

La roadmap contiene le grandi direzioni, quelle che la piattaforma punta e non ha ancora costruito. Quando un pezzo esce di qui, scompare da questo elenco e appare nella pagina per la capacità corrispondente, con la data. Una roadmap che si muove è l'unica prova di ritmo che non può essere scritta con un aggettivo. Nulla sotto è stato distribuito, e nessun articolo qui dovrebbe pesare sulla vostra decisione oggi.
Nulla di questa pagina è stato distribuito. Nessun articolo qui dovrebbe pesare sulla vostra decisione oggi, e nessuno del nostro team dovrebbe presentare nessuno di essi al tempo presente. Quello che è stato distribuito è nella [passeggiata di prodotto](/), con quello che garantisce, e i limiti di quello che esiste sono in [trust](trust).

## Intelligenza di negoziazione e redline

Confrontare una bozza contro le revisioni delle parti, mostrando quello che ogni lato ha cambiato, dove il rischio è cambiato, e quale intenzione il testo rivela. Il motore di confronto che sta dietro a questo esiste già e funziona oggi su versioni di documenti. Quello che manca è lo strato legale: capire che una clausola alterata non è solo un paragrafo diverso.

**Perché è sulla roadmap e non sulla strada:** è la direzione con il maggior potenziale per creare la sua propria categoria, e per questo è la più facile da vendere troppo presto. Non esiste.

## Agenti specializzati sul vostro corpus

Agenti con il loro proprio ambito, costruiti sulla conoscenza già nella vostra cassaforte: un tutor che insegna dal materiale reale della vostra azienda, un compagno di adozione per un nuovo processo, un valutatore che controlla la competenza mentre cita la fonte che ha usato.

**Quello che sta già sotto:** il corpus, linhagem, l'agente conversazionale, e citazione della fonte. **Quello che manca:** specializzazione a livello di compito, con i suoi propri limiti e regole per agente.

## Substrato per una flotta di agenti governati

Il passo successivo dal precedente, e il più ampio nella portata. Ogni parte dell'azienda alimenta la cassaforte con i suoi propri documenti, e gli agenti che quella parte già usa consultano quella cassaforte al runtime, per file o per protocollo, per ogni domanda sull'azienda. Una fonte governata unica sotto un'intera flotta, invece di strumenti di IA sciolti che nessuno controlla.

**Perché è roadmap e non una vaga promessa:** il meccanismo di adozione è concreto e già esiste in parte, perché la cassaforte è portatile e consumabile da fuori. Quello che manca è il governo della flotta, e non è costruito.

## Cose che esistono e che ancora non possiamo mostrarti

Questi sono vuoti di prova, non caratteristiche mancanti. La capacità è lì; la prova pubblica no, e finché non lo è preferiamo elencare il vuoto che parlare intorno a esso.

- **Esportazione della cassaforte dimostrata.** La cassaforte esiste ed è testo semplice con link; quello che manca è una dimostrazione pubblicata che chiunque può riprodurre senza parlarci. Fino ad allora, è una conversazione di due diligence, non un articolo di pagina.
- **Sufficienza del record per audit formale.** Il record esiste e serve come prova di controllo. Se esso chiude uno specifico requisito di audit nel vostro settore è una domanda che rispondiamo caso per caso, non un'affermazione di pagina.
- **Scala al di sopra di quello che abbiamo misurato.** I volumi di centinaia di migliaia o milioni di documenti non sono stati esercitati. Questo è un progetto di dimensionamento prima che sia un acquisto.

## Cose che non esistono ancora

Queste sono caratteristiche mancanti, e archiviarle in qualsiasi luogo più morbido vi direbbe che sono lì e non possiamo solo mostrarvi. Non sono lì.

- **Verifica visiva fedele.** Il sistema misura la struttura e conta gli elementi; non guarda la pagina finale. Un checker visivo dentro il prodotto non esiste.
- **Eliminazione che raggiunge le copie di backup.** Oggi l'eliminazione è completa nei sistemi live e non raggiunge i backup entro la finestra di conservazione. Il percorso tecnico è definito e non ancora costruito. L'ambito esatto è in [privacy e sovranità](privacy).
- **Rimuovere il contenuto e disattivare l'account, in un'azione attraverso l'interfaccia.** Oggi l'eliminazione di documento esiste e prende i derivati con sé; fare tutto questo in una volta non esiste ancora, e la chiusura è gestita su richiesta. Il nome è deliberato: cancella il contenuto e disattiva l'account, perché la traccia di chi ha acceduto al sistema rimane.

## Come questa pagina è mantenuta

Un articolo esce di qui quando esiste ed è stato misurato, non quando è quasi pronto. Quando esce, entra nella pagina di capacità con quello che garantisce e dove si ferma. Se seguite SazAI per un po', questa pagina è dove il ritmo si vede.

## Dove passa il confine

<h3 class="sub">Tre limiti che un lettore tecnico testa prima, dichiarati prima del test</h3>

**Il confine del provider.** La linhagem segue ogni pezzo di testo finché non esce per il
modello di linguaggio e riprende quando torna. Nessuna delle nostre tabelle registra quello che è successo dall'altro
lato; chi chiede *prova quello che hanno fatto con il mio testo dentro il modello* riceve i
termini di conservazione del provider che ha contrattato, e in un'installazione vostra il provider è vostra scelta. La pagina su
[sovranità](privacy) dice dove si ferma.

**L'esclusione della licenza copyleft.** Nessuna libreria AGPL entra nel motore, ed è scritto
nel file di dipendenze come decisione di progetto documentata. È un commento, non un portone:
nulla rompe la build se qualcuno lo ignora. Dirlo è più forte che fingere che sia un portone, perché
chi apre il file lo vede in dieci secondi.

**Gli agenti.** Questo sistema è costruito da un team di agenti con ambito dichiarato e una
catena di revisione, e la comunicazione tra loro è pratica, non ricevuta: non c'è una decisione scritta che
governi il canale, e le sue modalità di errore sono state misurate da noi questa settimana. Sta sul lato destro
del ledger, ed è dove sta andando.

Tutto quello che questa pagina afferma ha un comando o un documento dietro, e quello che non ha è dichiarato
come direzione. Se qualcosa qui non può essere riprodotto nella vostra valutazione, questo è un difetto nostro e
vogliamo saperlo prima di voi. Il prodotto che è uscito primo da questa piattaforma è quello che [vedete quando
un documento entra](see).


### Quello che questa piramide non sostiene

Una piramide onesta dice quello che rimane fuori da essa.

**Dati e fatti:**

- Cinque riferimenti dottrinali in zero artefatti di ingegneria: W3C **PROV** · ZAHARIA et al., **compound AI systems** (BAIR, 2024) · XU et al., **GraphRAG** (SIGIR, 2024) · letteratura di **instradamento di modello** · **CommonMark/GFM**. Hanno formato il pensiero; nessuna decisione registrata è uscita da loro.
- Test: forte pratica, guardie che rifiutano al build, rapporti datati; metodologia esterna dichiarata: nessuna. Detto in queste parole, con nessun vicino plausibile.
- E il risultato che sostiene l'intera conclusione, misurato in tutte le decisioni con un'alternativa nell'intestazione: in undici di undici, quello che ha deciso era un principio di ingegneria, non un riferimento esterno. Lo standard sostiene; la scelta è nostra, ed è scritta.


</div>

*Figure misurate il 2026-09-01 su insiemi che crescono: chi ripete la misurazione domani dovrebbe aspettarsi numeri più grandi, non gli stessi.*

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