
Pistes d'audit inviolables pour agents d'IA : Runtime Records chaînés par hachage, sans dépendance, vérifiables par tous.
Pistes d'audit inviolables pour les agents IA — des Runtime Records chaînés par hachage, restitués sous forme de Runtime Report que vos clients peuvent vérifier eux-mêmes.
Chaque action capturée par votre instrumentation (appels d'outils, appels de modèles, accès aux données, approbations) devient un Runtime Record dans un journal en ajout seul, chaîné par hachage ; le Runtime Report est cette chaîne restituée sous forme de page HTML qui recalcule la chaîne de hachage dans le navigateur du lecteur et affiche ce qu'elle présente à partir des enregistrements qu'elle a vérifiés (pour une vérification qui ne dépend pas du code de la page elle-même, exécutez halo verify sur le JSONL). Toute partie détenant un point de contrôle de la chaîne peut vérifier que les enregistrements jusqu'à ce point de contrôle n'ont pas été altérés depuis qu'il a été pris, sans faire confiance à celui qui les a produits — ce point de contrôle est la pièce maîtresse : la chaîne seule est inviolable face à tous, sauf face à la partie qui exploite l'enregistreur (LIMITS.md §1). Quand l'équipe sécurité d'un client demande « qu'a fait votre agent avec nos données ? », vous lui remettez un lien au lieu d'un paragraphe. Les revues de sécurité posent déjà des questions sur l'IA à côté de la checklist SOC 2 — et de plus en plus, ces questions proviennent de l'ISO 42001, des articles de l'EU AI Act sur la tenue de registres, et des questionnaires propres aux clients. Aujourd'hui, une assurance écrite passe encore. Le pari derrière ce projet, c'est que cela ne durera pas longtemps.
Présenté dans Help Net Security (août 2026).
Le format d'enregistrement est ouvert et libre d'implémentation. Ce paquet est l'implémentation de référence : enregistreur, vérificateur, client témoin et serveur de rapports.
Vous utilisez halo-record, ou vous y pensez ? Dites-moi qui vous êtes et pour quoi faire → Qui utilise halo-record ?
On vous demande d'installer un enregistreur à l'intérieur de votre agent. Vous ne devriez pas accepter cela sur parole :
pip install halo-record installe exactement un paquet.halo serve --verify-email (envoie un code à usage unique et le nom du sujet du rapport, par SMTP via le serveur que vous configurez dans $HALO_SMTP_HOST, à l'adresse saisie par un lecteur du rapport). Tous sont désactivés sauf si vous les invoquez ; aucun autre contenu d'enregistrement ne quitte votre infrastructure.summaries=False) ne conserve aucun résumé. L'expurgation est au mieux (regex sur les formats courants de secrets et de données personnelles plus un attrape-tout par entropie) : considérez-la comme une défense en profondeur, pas comme une garantie. Les champs de résultat que vous fournissez au-delà de summary sont analysés et masqués avec les mêmes motifs, mais ne sont pas tronqués à 200 caractères (LIMITS §13).Ce que chaque couche prouve — la distinction porteuse dans ce projet (LIMITS.md §1) : une chaîne que vous détenez vous-même prouve que les enregistrements n'ont pas été modifiés, par rapport à une tête que quelqu'un détient déjà ; seuls des points de contrôle détenus en dehors de l'opérateur prouvent qu'aucun n'a été supprimé ; et aucun hash ne prouve que chaque action a été capturée.
| Affirmation | Chaîne auto-détenue | + Points de contrôle externes | + Capture de confiance |
|---|---|---|---|
| Détecter les modifications d'un artefact établi | ✔ | ✔ | ✔ |
| Détecter la réécriture d'un historique validé | — | ✔ | ✔ |
| Détecter les points de contrôle manquants/tardifs | — | ✔ (cadence convenue) | ✔ |
| Prouver que chaque action a été enregistrée | — | — | dépend de la frontière de capture |
Voyez-en un avant d'installer : un exemple de Runtime Report — données fictives, chaîne réelle, et son script recalcule dans votre navigateur la chaîne de hachage des enregistrements intégrés lorsque vous l'ouvrez.
Aucun agent requis. Avec uv, rien à installer :
uvx --from halo-record halo demo --serve
ou de la manière classique :
pip install halo-record
halo demo --serve
Soit on échafaude un fournisseur fictif d'agents de support avec deux clients, on assiste aux chaînes (avec un fichier témoin local tenant lieu de témoin extérieur à l'opérateur — voir LIMITS.md §1), on sert leurs Runtime Reports à accès restreint, et on ouvre la console de l'opérateur dans votre navigateur. Essayez ensuite le test d'altération : supprimez une ligne de l'un des fichiers .jsonl et rechargez. Le rapport le détecte.
Une ligne à la frontière :
from halo_record import trace
agent = trace(run_my_agent, profile="my-agent", log="audit.jsonl") # wraps your entrypoint; records the run boundary to ./audit.jsonl — add record_call() or a framework adapter at each tool boundary to capture individual calls
Un shim de commodité from halo import ... est également fourni — mais le nom halo sur PyPI appartient à un paquet de terminal-spinner sans rapport, et si ce paquet est installé, c'est lui qui remporte l'import. halo_record est sans ambiguïté, donc les exemples l'utilisent.
Sans log=, les enregistrements vont dans ~/.halo/my-agent.jsonl (une chaîne par agent). Le wrapper scelle la frontière d'exécution ; les preuves résident dans les enregistrements par appel. Capturez-les avec un adaptateur de framework (matrice ci-dessous) — ou explicitement, ce qui montre aussi comment les liens de délégation fonctionnent :
from halo_record import Recorder, record_call
rec = Recorder("audit.jsonl")
with record_call(rec, "crm.lookup", {"account": "acct-9"}) as call: # one sealed record per tool call
call.result = crm.lookup("acct-9")