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.

4 574capacités exposées par le contrat — toutes en lecture seule
6droits dans la politique d'une app
1requête typée exécutée

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.

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

  2. 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 ».

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

Couche 01 · Le contrat4 574 exposées · lecture seule
Couche 02 · Votre politique6 autorisations
allowedSourcesorders
allowedFieldsregionrevenueunit_price
allowedFunctionsstats.medianfinance.npv
Couche 03 · Une requête1 plan typé

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

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

Le plan nomme une source absente de allowedSources.

policy_denied_field

Le plan touche une colonne absente du allowedFields de cette source.

policy_denied_function

Le 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 pas
maxExecutionRows1 000plafond absolu de lignes retournées par toute exécution
maxRowsToModel25nombre maximal de lignes transmises au contexte du modèle
maxCellsToModel250nombre maximal de cellules transmises au contexte du modèle
maxBytesToModel32 000volume maximal de données de résultat transmis au modèle

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