Skip to main content
Depuis la v1.9, l’autorisation et l’appel à l’hôte ne vivent plus dans l’interpréteur. Ils vivent dans un noyau de quelques fichiers (agentl/kernel/). L’interpréteur, le planificateur, le raisonneur bayésien et le Studio proposent des actions. Seul le noyau les autorise.

Le passage d’une action

  1. La proposition est figée : une copie isolée, que ni le planificateur ni l’approbateur ne peuvent modifier.
  2. La politique est évaluée sur cette copie. Une exception vaut DENY.
  3. L’approbateur reçoit une seconde copie. Une exception de l’approbateur vaut refus, jamais accord.
  4. Le permis est émis en dernier. Il est à usage unique et lié au condensat canonique de l’action : outil ou sous-agent, arguments.
Host.invoke, AsyncHost.invoke et le registre host.subagents exigent ce permis. Sans lui, ou avec un permis émis pour d’autres arguments, ils lèvent PermitError :
Ce qui a été approuvé est donc exactement ce qui s’exécute. Un défaut du planificateur, du Studio ou d’un hôte peut produire une mauvaise proposition. Il ne peut plus produire une exécution que la politique n’a pas autorisée.

Tester un outil

Un test qui appelait host.invoke directement lève désormais PermitError. Deux façons de faire :

Le contexte de l’action en cours

Dans un outil, current_action() rend le contexte de l’action autorisée :
La clé d’idempotence est stable d’une reprise à l’autre. C’est elle qui rend l’exécution durable « exactement une fois ».

Les invariants

La suite tests/test_kernel_invariants_aaa.py énonce dix invariants, un test par invariant : I1 est aussi vérifié sur le code source : seul le noyau appelle l’hôte. La liste des fichiers de confiance est agentl.kernel.TCB_FILES, et un test échoue si elle dépasse son budget.

Modèle formel

Le protocole du noyau (autorisation, intention, exécution, crash, reprise) est modélisé en TLA+ et vérifié exhaustivement par TLC sur des bornes finies. Cinq mutants plausibles doivent être attrapés, sinon la vérification échoue.
Le modèle décrit le protocole, pas le code Python. La correspondance est défendue par les tests : crash injecté à chaque écriture du journal, suites aléatoires d’opérations sur les permis. Voir docs/formal/README.md.

Exécution durable

Reprendre après un crash sans doubler un effet.

Provenance

Des gardes qui lisent d’où vient une valeur.