Gouvernance · lecture seule par construction
La politique est du code.
Pas un prompt.
SQAI traite le modèle pour ce qu'il est : un client non fiable. Les listes d'autorisation sont fixées dans le code à la construction de l'outil, vérifiées en processus avant toute exécution, et absentes du protocole du modèle. Il n'y a rien à négocier avec le système.
IILe rétrécissement, en détail
Trois couches. Chacune ne peut que retirer.
Chaque réponse passe par le même confinement. Un contrat épinglé par hash définit ce qui existe. Votre politique le réduit à ce qui est autorisé. Une requête typée doit s'inscrire dans les deux.
- 01
Le contrat
4 778 capacités dans le runtime épinglé ; 4 574 exposées aux agents, toutes en lecture seule. Les 204 autres sont exclues d'emblée — pour un modèle, elles n'existent pas.
- 02
Votre politique
Trois listes d'autorisation — allowedSources, allowedFields par source, allowedFunctions — fixées à la création de createSQAI(). Les fonctions sont par défaut en « tout-lecture-seule ».
- 03
Une requête
Un plan typé, validé contre le contrat, puis vérifié contre la politique en processus — avant exécution, jamais après.
allowedSourcesordersallowedFieldsregionrevenueunit_priceallowedFunctionsstats.medianfinance.npvQuerySpec v1 · median(revenue) by region · policy ✓
contract_hash sha256:79f1c5a6c7164e7e9e1750e70a5c03292fa87eb52d8148a740c06695924be9a1
Rétrécissement uniquement.
Une politique peut réduire la surface ; rien ne peut l'élargir. Nommer une capacité que le contrat n'expose pas fait lever unsupported_operation par createSQAI() à la construction — l'application échoue avant qu'un agent ne se connecte.
Et l'entrée d'outil du modèle ne contient aucun champ allowed*. La politique n'est pas dans le protocole, il n'y a donc rien qu'un prompt — ou une injection — puisse élargir.
IIILa politique, en code
Écrite une fois. Vérifiée à chaque fois.
La plupart des outils de gouvernance se placent à côté du chemin de données et l'observent. La politique de SQAI se place à l'intérieur : trois listes d'autorisation dans le constructeur, appliquées en processus avant chaque exécution.
const sqai = createSQAI({
sources: { orders },
// policy — fixed here, invisible to the model
allowedSources: ['orders'],
allowedFields: {
orders: ['region', 'revenue', 'unit_price'],
},
// functions default: 'all-readonly'
allowedFunctions: [
'stats.median', 'finance.npv',
],
});- allowedSources
- Les sources enregistrées qu'un plan peut nommer. Toute autre retourne policy_denied_source.
- allowedFields
- Les colonnes, par source. Un plan qui touche une autre colonne retourne policy_denied_field.
- allowedFunctions
- Les fonctions en lecture seule qu'un plan peut appeler — par défaut « tout-lecture-seule ». Toute autre retourne policy_denied_function.
- tool input
- Ne contient aucun champ allowed*. Le modèle ne voit jamais la politique et ne peut donc jamais en envoyer une plus large.
Le registre des refus
Les refus sont des données, pas des exceptions. Chacun porte un code stable lisible par un agent — et aucun n'est réessayable, de sorte qu'une boucle ne peut pas éroder la politique.
à la construction
unsupported_operationLa politique nomme une capacité que le contrat n'expose pas. La construction lève une exception ; l'application échoue avant qu'un agent ne se connecte.
à la requête
policy_denied_sourceLe plan nomme une source absente de allowedSources.
policy_denied_fieldLe plan touche une colonne absente du allowedFields de cette source.
policy_denied_functionLe plan appelle une fonction absente de allowedFunctions.
source: "sqai" — chaque refus de politique arrive comme un résultat structuré, non réessayable. Les outils ne lèvent jamais d'exception.
IVCustody
Les résultats sont détenus, non conservés.
Un jeu de résultats complet n'atterrit jamais dans le contexte du modèle. Il est déposé dans un store gouverné et référencé par identifiant ; le modèle reçoit un échantillon déclaré.
Le store de résultats
Store gouverné · TTL 15 min
- result_id
- 16 octets aléatoires, base64url. Impossible à deviner, jamais séquentiel.
- authorization
- Lié au tenant. Un tenant incorrect reçoit result_not_found — le store ne confirme jamais l'existence.
- ttl
- 15 minutes. L'entrée est ensuite supprimée.
- capacity
- 256 résultats au maximum — 64 Mo au total, 16 Mo par tenant.
Le store détient le résultat. Le modèle lit un échantillon et l'indique.
Limites du contexte modèle
defaultLimit100limite de lignes appliquée lorsqu'un plan n'en définit pasmaxExecutionRows1 000plafond absolu de lignes retournées par toute exécutionmaxRowsToModel25nombre maximal de lignes transmises au contexte du modèlemaxCellsToModel250nombre maximal de cellules transmises au contexte du modèlemaxBytesToModel32 000volume maximal de données de résultat transmis au modèleLa troncature est toujours déclarée dans le résultat. Les lignes partielles ne sont jamais affichées — une ligne arrive entière ou pas du tout.
L'angle audit
17 %des organisations peuvent reconstituer la séquence complète d'appels d'outils d'un agent après coup
Le RGPD article 30 et SOC 2 CC7.2 attendent précisément ces enregistrements.
Chaque réponse SQAI porte déjà sa propre reconstruction :
plan_hash · invocation_hash · computation_hash · contract_hash
La relecture est une consultation, non une enquête. Fonctionnement du rejeu →
VIQuestions
La gouvernance, posée directement
Le modèle peut-il élargir ses propres accès ?
Non. La politique est fixée au moment de createSQAI() et vérifiée en cours de processus avant toute exécution. L'entrée outil du modèle ne comporte aucun champ allowed*, il n'existe donc rien dans le protocole à élargir — une requête hors politique retourne un résultat structuré policy_denied.
La lecture seule est-elle un indicateur contournable ?
Ce n'est pas un indicateur. Le contrat exposé comporte 4 574 capacités en lecture seule ; un chemin d'écriture est absent par construction, non désactivé. L'injection de prompt peut modifier ce qu'un modèle demande — elle ne peut pas ajouter des capacités à un contrat figé.
Quels enregistrements existent pour un audit RGPD article 30 ou SOC 2 CC7.2 ?
Chaque résultat porte plan_hash, invocation_hash, computation_hash et contract_hash. Le calcul exact peut être rejoué et vérifié contre ces hachages longtemps après les faits.
Où résident les données de résultat après une requête ?
Dans un store de résultats autorisé par tenant : les identifiants sont 16 octets aléatoires, les entrées expirent après 15 minutes, et le store est plafonné à 64 Mo au total et 16 Mo par tenant. Le contexte du modèle reçoit au plus 25 lignes, 250 cellules et 32 000 octets — troncature toujours déclarée.
VIISuite
Gouverner la réponse.
Apportez un schéma et une question de conformité. Nous vous montrerons la politique qui y répond.