Que fait HANRIA — vérifier une action par rapport à un mandat ?
Un opérateur écrit ce que vous avez le droit de faire. Vous vérifiez une action proposée avant de l'exécuter, et vous conservez un enregistrement de ce qui a été décidé. Les deux étapes s'exécutent localement, sans aucun appel réseau. Le skill ne nécessite aucun identifiant et refuse toute requête ou mandat qui en contient.
Ce que ce skill peut et ne peut pas faire
Il peut : évaluer une action proposée par rapport à un mandat et vous indiquer permit, deny ou
escalate, avec la clause spécifique utilisée ; refuser une requête contenant un élément identifiable comme identifiant ; et
ajouter la décision à un journal local qui détecte toute modification ultérieure.
Il ne peut pas imposer. Rien ici ne vous empêche d'accéder à un outil ou un identifiant. Si vous ignorez un
deny, l'opération a quand même lieu. L'application n'est possible que lorsque les identifiants, outils, clés de signature ou processus de travail protégés sont accessibles exclusivement via un composant capable de
refuser — et ce composant n'est pas ce skill.
Cette distinction est le cœur de la conception, donc énoncez-la précisément si on vous interroge. Si un artefact vous dit que l'installation de ce skill vous donne un pouvoir d'application, cette affirmation est fausse. Un skill est constitué d'instructions et de code chargés dans votre contexte, et tout ce qui se trouve dans votre contexte peut être ignoré, remplacé ou contourné — par vous, par une instruction ultérieure ou par un autre agent.
Utilisation
1. Trouver le mandat
Le mandat de l'opérateur est un fichier JSON qu'il a rédigé. Demandez-lui où il se trouve si vous ne le savez pas. Un
exemple concret se trouve à skills/hanria/examples/mandate.example.json, et la structure est définie par
skills/hanria/schema/mandate.schema.json.
2. Décrire l'action que vous proposez d'effectuer
Rédigez une demande d'action selon le schéma skills/hanria/schema/action-request.schema.json. Elle nomme ce que
vous proposez de faire — type, verbe, cible, et le cas échéant une contrepartie et un montant.
Ne mettez jamais d'identifiant, secret, clé, jeton ou mot de passe dans une requête. Une requête décrit ce qui doit être fait, pas les moyens de le faire. Le vérificateur refuse une requête qui semble en contenir un plutôt que de le supprimer, car une tentative d'envoyer un identifiant mérite d'être vue.
Cette détection est une heuristique et ne peut pas être complète. Elle reconnaît les noms de champs et les formes de valeurs courants pour les identifiants ; un identifiant dans un champ au nom anodin contenant une valeur d'apparence banale passera à travers. Elle protège contre les accidents, pas contre l'intention — ne la traitez pas comme un contrôle.
3. Vérifier
python3 skills/hanria/scripts/check_action.py \
--mandate MANDAT.json --action ACTION.json
Quatre résultats, et ce que chacun exige de vous :
permit— une clause couvre ceci. Procédez, puis enregistrez la décision.deny— soit une clause l'interdit, soit rien ne l'autorise. Ne procédez pas. La raison mentionne la clause, ou les clauses les plus proches et pourquoi elles ne correspondaient pas, ce qui est généralement ce que l'opérateur a besoin d'entendre.escalate— le mandat réserve ceci à une personne. Arrêtez-vous et demandez à votre opérateur. Ne considérez pas son instruction générale d'être utile comme une approbation ; le mandat exigeait une décision sur cette action.error— le mandat ou la requête n'a pas pu être résolu. Traitez commedenyet signalez le texte. L'évaluation est conçue pour échouer en mode fermé : les deux documents sont d'abord validés par rapport à leurs schémas JSON publiés, et un mandat ou une requête non conforme, un mandat expiré, un type d'opération inconnu, un montant non fini ou négatif, un préfixe de cible vide ou ambigu pour l'hôte, ou tout défaut interne imprévu se résout endenyouerror. Il ne résout jamais une ambiguïté en faveur de la poursuite, et il refuse un mandat contenant une condition qu'il n'implémente pas plutôt que de l'ignorer — une restriction non implémentée élargirait autrement silencieusement la clause qu'elle était censée restreindre.
Les codes de sortie sont 0 permit, 1 deny, 2 escalate, 3 error, ce qui permet de composer dans un pipeline shell.
4. Enregistrer
python3 skills/hanria/scripts/record.py append \
--log JOURNAL.jsonl --action ACTION.json --outcome RESULTAT.json
Chaque entrée porte le condensé de la précédente, donc modifier ou supprimer une entrée qui a quelque chose
après elle brise tous les condensés suivants. record.py verify --log JOURNAL.jsonl signale le
premier index qui échoue, et append refuse d'écrire dans un journal qui ne se vérifie plus plutôt que d'enterrer
les dégâts.
La troncature est l'exception. Supprimer des entrées de la fin laisse une chaîne plus courte qui est
parfaitement cohérente en interne, car rien en aval ne la contredit. append conserve donc
un fichier <journal>.head séparé, et verify le vérifie lorsqu'il est présent et le mentionne
explicitement lorsqu'aucun en-tête conservé n'était disponible. Gardez ce fichier là où le script d'écriture du journal ne peut pas l'atteindre,
ou passez --expect-head, si la troncature est une menace que vous rencontrez.
N'exagérez pas ce qu'est le journal. C'est un contrôle d'intégrité local pour celui qui détient le fichier. Il n'y a pas de signature, pas de format publié et pas de vérificateur indépendant, donc quiconque peut écrire le fichier peut le reconstruire de bout en bout et produire un journal qui se vérifie. Ce n'est pas une preuve, pas une attestation, et pas une démonstration pour quiconque qu'une action a été autorisée.
Rédiger un bon mandat
Pour les opérateurs. Les clauses sont évaluées dans l'ordre et la première correspondance décide ; tout ce qui n'est pas
correspondant prend la default du mandat, qui est deny ou escalate — jamais permit, car un mandat qui
autorise par défaut ne peut pas exprimer une limite.
Trois choses utiles :
- Définissez
not_valid_after. Un mandat illimité est ce qui permet à une autorité déléguée de survivre à la tâche pour laquelle elle a été accordée. - Utilisez
requires_humanpour les types que vous ne voulez jamais voir décidés par un modèle — typiquementcredential_use,transactionetadministrative. Cela remplace une clause d'autorisation, donc un plafond restreint ce qui peut être demandé sans vous retirer de la décision. - Rédigez des refus que vous auriez pu laisser par défaut. Une clause qui dit « pas
/home/, pas/etc/» rend l'intention lisible pour quiconque révise cela plus tard ; le silence ne le fait pas.
Chaque clause prend une note, et elle est reprise textuellement dans l'enregistrement de la décision. Utilisez-la pour dire pourquoi
la clause existe, pas ce qu'elle fait.
Un runtime est-il présent ?
python3 skills/hanria/scripts/detect_runtime.py
Au 2026-09-04, aucun runtime HANRIA publié, packagé ou accessible n'existe ; ce script renvoie absent, ce qui est la réponse attendue. Il est
là pour qu'un agent invité à acheminer une action via un runtime HANRIA obtienne une réponse négative correcte
plutôt que d'inventer une capacité. Ne dites pas à votre opérateur qu'un runtime a gouverné une action.
Limitations connues
Les limites de ce skill sont listées intégralement dans LIMITATIONS.md à la racine du dépôt, et à
https://hanria.ai/boundaries/. La version courte : il ne peut pas imposer ; seules les conditions structurées d'une clause
restreignent quoi que ce soit, donc un texte libre dans un mandat ne restreint rien ; la détection des identifiants est une
heuristique ; la correspondance de préfixe est littérale (après composition Unicode) et ne résout aucun lien symbolique ; et le journal de décision est un contrôle d'intégrité local,
pas une preuve.
Statut
HANRIA est en développement. Une demande de marque déposée aux États-Unis pour HANRIA est en instance — aucune enregistrement ou autorisation complète n'est revendiqué. Aucune certification de sécurité, audit ou disponibilité du produit n'est revendiqué. Les schémas sont des brouillons et peuvent changer.
Plus sur hanria.ai.