Projets · méthodologie d’agents

Quelles promesses sont appliquées : Zetetic Agents, suivi dans son code

L’affirmation sur l’emballage est inhabituellement vérifiable : pas une bibliothèque de prompts, une méthodologie avec application au moment du commit.1 Une affirmation pareille se contrôle, et ce dossier la contrôle, garantie par garantie. Le critère est simple : une garantie est appliquée quand un hook, un script ou un test peut rendre un code de sortie non nul qui arrête réellement l’action, et elle est demandée quand elle n’existe qu’en prose adressée à un modèle. Quatre sont appliquées et échouent fermé. Quatre autres le sont jusqu’à ce qu’on change un réglage. Une — la méthode qui donne son nom au produit — est en rapport seul jusqu’à opt-in. Et quatre-vingt-dix-sept refus documentés sont de l’instruction, ce que le projet énonce lui-même.23

Catalogue97 motifs de raisonnement et 23 agents d’équipe, 81 skills, 27 commandes, 57 outils57
Trois entréesl’hôte dispatche un agent d’équipe, un script shell assemble un genius, et un seul script lance vraiment un processus69
Arrêt netpas de contrat de délégation, pas de lancement — et le contrat doit nommer un oracle d’acceptation externe1022
Mesuréun benchmark apparié pré-enregistré : lancer a coûté plus cher à chaque run, et a été plus lent là où l’écart était significatif2829
Plafond publiél’accord de routage entre deux annotateurs est de 39,0 %, et tout score de routage est rapporté contre lui30
Hors de l’hôterien ne s’applique. Commits au terminal, CI et autres éditeurs contournent tous les gates24
Pièce 01 · le catalogue

Cent vingt agents, et trois façons d’y entrer

Le roster n’est pas fait pour être parcouru. On nomme la forme de son problème et la forme choisit le motif,3 et ce qui est livré pour chacun est une méthode plutôt qu’un personnage : les citations, les gestes canoniques, les angles morts documentés, et les conditions dans lesquelles il doit refuser.4 L’affirmation distinctive est plus étroite et plus intéressante qu’il n’y paraît : ici, un agent peut dire qu’il ne sait pas.2

Trois voies mènent à ce catalogue et elles ne se recouvrent pas. L’hôte dispatche les vingt-trois agents d’équipe par correspondance sur leur description.5 Un script shell assemble les quatre-vingt-dix-sept motifs de raisonnement, et il vaut la peine de savoir exactement ce qu’il fait : il imprime le fichier d’agent. Aucun modèle n’est appelé.6 Seul le script de lancement démarre un processus, et c’est le seul endroit où une garantie a des dents.9

CE QUI EST LIVRÉ, COMPTÉ 97 agents genius 23 agents d’équipe 81 skills, 15 par forme de problème 27 commandes · 57 outils 23 enregistrements de hooks comptés depuis l’arbre, non lus dans la documentation VOIE A · L’HÔTE DISPATCHE 23 agents d’équipe sélectionnés par correspondance sur la description VOIE B · UN SCRIPT SHELL ASSEMBLE 97 agents genius genius-invoker.sh — invoke, list, route il imprime le fichier d’agent. Aucun modèle appelé. VOIE C · LA SEULE QUI LANCE spawn-agent.sh un genius est lançable ici, à l’inverse de la voie A claude --permission-mode bypassPermissions le corps de l’agent en prompt système AVANT TOUTE MUTATION un contrat, ou rien ne tourne pas de python3 sur la machine = un refus Worktree isolé <repo>/.claude/ worktrees/<agent> l’identité vient du site de lancement À QUOI SERT LE CATALOGUE « On ne parcourt pas une liste de 97 figures historiques. On nomme la forme de son problème. » Chaque motif est livré avec ses citations, ses gestes canoniques, ses angles morts documentés, et les conditions dans lesquelles il doit refuser. Ces conditions de refus sont de la prose adressée à un modèle. Le projet le dit lui-même, à deux reprises. Un script sur le disque n’est enregistré nulle part : un hook de contexte retiré le 2026-09-04 après avoir tiré deux fois par franchissement à côté de la copie d’un autre greffon.
Un catalogue compté, pas cité. Les chiffres ci-dessus ont été comptés depuis l’arbre plutôt que lus dans la documentation, ce qui compte ici plus qu’ailleurs : la dernière pièce montre ce qui arrive là où cette discipline s’arrête. Un script du disque n’est enregistré nulle part, et le manifeste dit pourquoi — il tirait deux fois par franchissement à côté de la copie d’un autre greffon du même hook, gaspillant des dizaines de milliers de tokens par lancement parasite, et il a été retiré le 2026-09-04.33
Pièce 02 · l’application

Ce qui bloque vraiment, et à quelle condition

Quatre garanties tiennent sans échappatoire. Une délégation ne peut pas démarrer sans contrat validé.9 Une définition ayant un appelant vivant ne peut pas être supprimée, et la garde échoue fermé sur « cannot determine » plutôt qu’ouvert.21 Un appel qui exposerait des secrets sort avec un code bloquant.20 Et un gate d’acceptation ne passe que si sa commande sort en zéro, un ensemble vide valant rejet.22

Quatre autres sont appliquées jusqu’à ce que quelqu’un change un réglage, et l’une d’elles est mal énoncée dans le README. Il dit que les absolus non sourcés sont bloqués sous tous les profils ;17 sous le profil permissif, le checker compte les erreurs, les imprime, et sort en zéro.16 Les noms de règles, eux, ne peuvent pas être désactivés — cette tentative sort en 2 — mais la sévérité, si.18 Vient alors la plus importante : la colonne zététique, la méthode en quatre temps qui donne son nom au produit, est en rapport seul par défaut et ne bloque que sur opt-in, et sa détection est une heuristique qu’une seule recherche web satisfait.19

APPLIQUÉ, ÉCHOUE FERMÉ un contrat de délégation, ou pas de lancement supprimer une définition ayant un appelant vivant, « cannot determine » compris lire des fichiers de secrets, clés, jetons un gate d’acceptation qui ne passe que si sa commande sort en zéro un ensemble de gates vide est un rejet, jamais une acceptation automatique APPLIQUÉ, MAIS DÉSACTIVABLE les absolus non sourcés au commit les constantes à trois décimales sans source, en strict seulement un TODO sans référence, de même les seuils de taille et de forme, chacun réglable sur block, advise ou off les noms de règles eux-mêmes ne peuvent être désactivés : sortie 2 RAPPORT SEUL PAR DÉFAUT la colonne zététique rappel, preuve, vérification adverse, mémorisation avertit une fois par session ; ne bloque que si un fichier à la racine le dit, ou une variable d’environnement et la détection est heuristique : une recherche web suffit INSTRUCTION SEULE les conditions de refus des 97 motifs de raisonnement les règles de jugement : responsabilité unique, règle de trois « Refusal conditions are intent statements, not enforced contracts » « An agent can name a blind spot in its own description and exhibit it » LE PLUS IMPORTANT EST REPRODUCTIBLE Un fichier de deux lignes, un mot absolu et une constante nue, passé au checker sous chaque profil : standard échoue avec une violation bloquante, strict avec deux, et permissive imprime « Errors: 1 (blocking) » puis sort en zéro. Le README affirme les deux. ET RIEN DE TOUT CELA NE S’APPLIQUE HORS DE L’HÔTE « Hooks fire only inside Claude Code's invocation path. Direct terminal commits, CI scripts, and other editors bypass the gates. » Sans Python 3 fonctionnel, les neuf hooks Python échouent ouverts par conception : ils avertissent sur stderr et sortent en zéro.
L’honnêteté, c’est que le projet dit lui-même la plupart de cela. Les conditions de refus sont nommées comme des intentions et non des contrats.23 Les hooks sont documentés comme ne tirant qu’à l’intérieur de l’hôte, donc un commit au terminal contourne tous les gates.24 Et sans Python 3 fonctionnel, les neuf hooks Python échouent ouverts par conception.25 Ce que la documentation ne dit pas, c’est l’exception du profil permissif, et celle-là se reproduit en deux lignes.16
Pièce 03 · la délégation

Le contrat est la seule chose avant une mutation

Quand un agent est lancé dans un dépôt avec les permissions contournées, la question est de savoir ce qui se tient entre le lancement et la copie de travail. La réponse ici est un fichier, validé avant que rien ne soit touché : pas de contrat, pas de fichier de contrat, ou pas d’interpréteur Python refusent chacun le lancement d’emblée.9 Le schéma exige des chemins possédés, des chemins exclus, une autorité de push sans valeur par défaut, des artefacts de rendu, et un oracle d’acceptation qu’il définit comme le signal externe décidant de l’achèvement, jamais un auto-rapport.10

Deux détails élèvent cela au-dessus d’une liste à cocher. Le verrou rejoue toute la validation au moment de l’enregistrement, explicitement pour couvrir la course entre le premier contrôle et le lancement,12 et deux délégations aux chemins qui se recoupent sont refusées plutôt que mises en file, ce que le schéma énonce franchement en admettant que ce n’est pas de la sérialisation.11 L’identité de l’agent est fixée par le site de lancement, au motif déclaré qu’un sous-agent ne doit pas pouvoir forger la sienne.13

ÉTAPE 0 · AVANT MUTATION Contrat obligatoire pas de contrat, pas de fichier, ou pas de python3 → lancement refusé Le validateur 12 motifs de rejet nommés chemins possédés, autorité de push, artefacts de rendu, un oracle Recoupement le contrat doit nommer l’agent effectivement demandé, sinon le lancement est refusé Le verrou revalide pour couvrir la course entre l’étape 0 et ici ; un périmètre qui recoupe est refusé Worktree <repo>/.claude/worktrees/ dans le dépôt, là où la passe de nettoyage regarde Launch l’identité vient du site de lancement : « the subagent cannot forge its own id » L’ORACLE D’ACCEPTATION, EXIGÉ PAR LE SCHÉMA « The EXTERNAL signal that decides completion… never a self-report. » Un gate passe si et seulement si sa commande sort en zéro, et un ensemble vide ou illisible est un rejet plutôt qu’une acceptation automatique. POURQUOI L’EMPLACEMENT DU WORKTREE EST UNE RÈGLE ET NON UNE PRÉFÉRENCE Correction du propriétaire, 2026-09-08 : une campagne avait laissé 43 worktrees détachés et 33 worktrees de branche sous un répertoire temporaire, hors du dépôt et invisibles à la passe de nettoyage, occupant un espace que rien ne récupérerait. Toute consigne nommant un emplacement extérieur a été retirée ce jour-là. Le schéma porte la même discipline : une règle que le validateur n’applique pas est de la documentation, pas un contrat.
La règle du worktree est un rapport d’incident devenu contrainte. Le 2026-09-08, une campagne a laissé quarante-trois worktrees détachés et trente-trois worktrees de branche hors du dépôt, là où la passe de nettoyage ne pouvait pas les voir et où rien ne récupérerait l’espace ; toute consigne nommant un emplacement extérieur a été retirée le jour même.1514 Le projet énonce aussi la limite de l’approche entière : les worktrees isolent les fichiers, pas l’exécution.36 Et une affirmation sur cette boucle n’a aucun artefact derrière elle : qu’elle a convergé de bout en bout sur un dépôt externe, sans journal, ni date, ni verdict dans l’arbre.35
Pièce 04 · les nombres

Ce qui est mesuré, et ce qui a filé sous le gate

Le travail de mesure est ici réel et d’une discipline inhabituelle. Un benchmark apparié compare un skill en ligne à un sous-agent lancé, protocole gelé avant qu’aucun résultat n’existe, cinq répétitions, ordre randomisé, deux évaluateurs aveugles, données brutes et scorées commitées.28 Son résultat n’est pas le plus flatteur : lancer a coûté plus cher à chaque run, et a été plus lent là où l’écart atteignait la significativité.29 La fiche de routage va plus loin et publie un plafond : deux annotateurs ne s’accordent sur la forme que 39 % du temps, donc tout score de routage est rapporté contre 39 et non contre 100.3031 Un auditeur structurel passe sur les 120 fichiers d’agent, et un contrôle de comptes vérifie trente-sept affirmations documentées contre l’arbre.327

Reste la phrase que chaque utilisateur lit. Le bandeau de session imprime quatre nombres, et trois sont faux à cette révision : 63 skills là où il y en a 81, 14 hooks là où il y a 23 enregistrements, 17 outils là où il y en a 57.26 L’index des commandes annonce dix-sept commandes là où l’arbre en porte vingt-sept.27 Le document de comptage se contredit à quatre paragraphes d’écart, et diverge de sa propre commande prescrite sur le nombre d’outils.8 Aucun de ces fichiers n’est dans le registre que lit le contrôle de dérive.7 Le gate fonctionne ; on lui a simplement donné une liste de cinq fichiers, et la phrase la plus visible du produit n’y figure pas.

MESURÉ, PROTOCOLE GELÉ AVANT LE RUN Skill en ligne contre sous-agent lancé n = 5 répétitions, ordre randomisé, deux évaluateurs aveugles, données brutes et scorées commitées. Qualité 9,60 contre 9,90 sur une tâche, 10,00 contre 8,50 sur une autre. Lancer a coûté plus cher à chaque fois : 0,59 $ contre 0,85 $. Horloge murale 47,7 s contre 88,4 s, significatif. L’accord de routage a un plafond, et il est publié Deux annotateurs s’accordent sur la forme 39,0 % du temps. La règle qui suit : « Every shape-routing score is reported against this ceiling, never against 100%. » Kappa de Cohen 0,554 sur 351 tours réels. DÉRIVÉ, ET HORS DU GATE QUI L’ATTRAPERAIT Le bandeau que chaque session imprime 97 reasoning patterns · 63 skills · 14 hooks · 17 tools Mesuré à cette révision : 81 skills, 23 enregistrements de hooks, 57 outils. Trois des quatre nombres sont faux, dans la seule phrase que chaque utilisateur lit. L’index des commandes dit 17 commandes. Il y en a 27. Le document de comptage donne 23 enregistrements dans sa table et 19 dans sa prose, à quatre paragraphes d’écart, et 56 outils là où sa propre commande en rend 57. Le compte de déclencheurs apparaît en 650+, 400+ et 400+ dans le même README. LE GATE QUI FONCTIONNE Un contrôle de comptes vérifie 37 affirmations contre l’arbre et passe. Un auditeur structurel passe 18 contrôles sur 120 fichiers d’agent : aucun bloqueur, aucun avertissement. Les deux ont été rejoués pour ce dossier et reproduits. Les tests sont comptés en suites, jamais en assertions, délibérément. ET POURQUOI IL RATE LE RESTE Son registre nomme cinq fichiers. Le bandeau de session n’en fait pas partie. Ni l’index des commandes, ni les comptes de déclencheurs, ni les deux lignes du document de comptage qui se contredisent. Un gate n’est jamais plus large que la liste qu’on lui donne.
Un gate n’est jamais plus large que la liste qu’on lui donne. C’est la conclusion à garder de cette pièce, et elle dépasse largement ce dépôt : le contrôle anti-dérive est ici authentique, reproductible et passant, et il ne regarde jamais la seule ligne que chaque session imprime.726

Pourquoi c’est la bonne chose à publier

Un projet dont la première règle est « pas de source, dis que tu ne sais pas » appelle exactement ce traitement, et y survit largement. L’application qui compte — contrat, suppression, secrets, acceptation — tient et échoue fermé. Le benchmark rapporte contre l’intérêt de son propre produit. Le score de routage est publié contre un plafond mesuré plutôt que contre un chiffre rond. Ce qui ne tient pas est plus étroit et réparable : une ligne de README qui contredit le checker,17 un budget de contexte documenté reposant sur un hook délibérément retiré,34 et quatre auto-descriptions qui ont dérivé parce que personne ne les a ajoutées à une liste.26278 Les nommer n’est pas une réserve sur l’outil. C’est le standard de l’outil, appliqué à l’outil.

1README.md:17 :17 — « Not a prompt library. A methodology with commit-time enforcement. »
2README.md:47 :47 — « Zetetic Agents are different in one specific way: they can say ‘I don't know.’ »
3README.md:55 :55 — « You don't browse a roster of 97 historical figures. You name the *shape* of your problem. »
4README.md:196 :196 — « Most AI agent libraries ship ‘pretend to be Einstein.’ This ships Einstein's method… Reasoning procedures, not personas. »
5.claude-plugin/plugin.json:25 :25-49 — les vingt-trois agents d’équipe dont l’hôte est informé
6tools/genius-invoker.sh:5 :5-8 — quatre verbes : invoke, list, route, compose. Invoke imprime le fichier d’agent ; aucun modèle n’est appelé nulle part dans le script
7tools/doc-count-check.sh:36 :36-74 — le registre des comptes documentés que le contrôle de dérive vérifie. Il nomme cinq fichiers
8docs/COUNTING.md:35 :35-36 donne 23 enregistrements de hooks et 24 scripts ; :68-69 dit 19 et 20, quatre paragraphes plus loin. :38 donne 56 outils là où sa propre commande prescrite en rend 57
9scripts/spawn-agent.sh:74 :74-92 — l’étape 0 s’exécute avant toute mutation : pas de contrat, pas de fichier de contrat, ou pas de python3 refusent chacun le lancement
10schemas/delegation-contract.schema.yaml:28 :28-40 — les champs obligatoires, dont un oracle d’acceptation décrit comme « The EXTERNAL signal that decides completion… never a self-report » ; :47-58 énumère douze motifs de rejet
11schemas/delegation-contract.schema.yaml:65 :65-70 — « This validator's policy is DENY (not queue-and-serialize)… Serialization (queueing) is not implemented »
12scripts/spawn-agent.sh:165 :165-176 — le verrou rejoue la validation, explicitement pour couvrir la course entre l’étape 0 et le lancement
13scripts/spawn-agent.sh:202 :202-203 — « Identity MUST come from the spawn site, not the subagent: the subagent cannot forge its own id. »
14rules/agent-reference/worktree-protocol.md:10 :10-13 — le worktree vit dans le dépôt, sous .claude/worktrees/, parce que c’est le seul endroit que la passe de nettoyage connaît
15rules/agent-reference/worktree-protocol.md:19 :19-22 — correction du propriétaire du 2026-09-08 : 43 worktrees détachés et 33 worktrees de branche laissés hors du dépôt, invisibles à la passe. Toute consigne nommant un emplacement extérieur a été retirée ce jour-là
16tools/zetetic-checker.sh:301 :301-304 — sous le profil permissif, le checker sort en 0 sans condition, erreurs comptées et affichées. Reproduit sur un fichier de deux lignes : standard échoue avec une violation bloquante, strict avec deux, permissive imprime « Errors: 1 (blocking) » et sort en 0
17README.md:188 :188 — « blocks commits with UNSOURCED keywords… at any profile ». :333 documente permissive comme « everything informational; never blocks ». Les deux ne peuvent pas tenir ensemble
18tools/zetetic-checker.sh:59 :59-65 — une tentative de désactiver une règle par configuration sort en 2 : « Rules themselves (UNSOURCED, MAGICNUMBER, TODONO_REF) cannot be disabled. »
19hooks/stop-zetetic-spine.py:13 :13-21 — rapport seul par défaut, une fois par session ; il ne bloque que sur opt-in explicite par fichier ou variable d’environnement. :112-119 montre que la détection est heuristique, et qu’une seule recherche web la satisfait
20hooks/pre-tool-secret-shield.py:7 :7-9 — « Exits with code 2 (blocking) » quand un appel exposerait des secrets ; :26-31 consigne sa propre limite : écrire un tel fichier est signalé, pas bloqué
21hooks/pre-tool-deletion-gate.py:27 :27-31 — « FAIL-CLOSED ON ‘CANNOT DETERMINE’, not fail-open », avec le contrôle de protection de branche qui l’a motivé, daté et cité
22tools/acceptance_gate.py:29 :29-31 — un gate passe si et seulement si sa commande sort en 0, et un ensemble de gates vide ou illisible est un rejet plutôt qu’une acceptation automatique
23README.md:186 :186 — « Refusal conditions are intent statements, not enforced contracts » ; :288 ajoute qu’un agent « can name a blind spot in its own description and exhibit it anyway »
24README.md:287 :287 — « Hooks fire only inside Claude Code's invocation path. Direct terminal commits, CI scripts, and other editors bypass the gates. »
25hooks/run-python.sh:32 :32-38 — sans Python 3 fonctionnel, les hooks « Fail open: warn on stderr but do not block the session (exit 0) », ce qui rend neuf d’entre eux inopérants
26hooks/session-start.sh:60 :60 — la ligne imprimée à chaque démarrage de session : « 97 reasoning patterns · 63 skills · 14 hooks · 17 tools ». Mesuré à cette révision : 81 skills, 23 enregistrements de hooks, 57 outils
27commands/_index.md:3 :3 — « 17 commands across 6 categories ». L’arbre porte 27 commandes réparties dans 8 répertoires, et les noms listés ne correspondent pas aux chemins par lesquels on les invoque
28tools/bench-agent-cost/README.md:332 :332-335 et :340-354 — le benchmark apparié, pré-enregistré, n = 5, ordre randomisé, deux évaluateurs aveugles, données brutes et scorées commitées
29tools/bench-agent-cost/README.md:451 :451-466 — qualité 9,60 contre 9,90, coût 0,59 $ contre 0,85 $ et horloge murale 47,7 s contre 88,4 s, les deux derniers significatifs
30docs/GOA-SCORECARD.md:36 :36-41 — deux annotateurs s’accordent sur la forme 39,0 % du temps, et la règle qui suit : « Every shape-routing score is reported against this ceiling, never against 100%. »
31docs/GOA-SCORECARD.md:23 :23-27 — kappa de Cohen 0,554 sur 351 tours de conversation réels, 64 désaccords, sept arbitrés par un humain le 2026-08-05
32README.md:399 :399 — les 120 fichiers d’agent passent l’auditeur structurel. Rejoué pour ce dossier : 18 contrôles, aucun bloqueur, aucun avertissement
33hooks/hooks.json:2 :2 — la note de retrait : le hook de contexte « was registered here AND by context-guard@session-optimizer-marketplace simultaneously — confirmed live double-firing… ~55-66K tokens wasted per spurious memory-writer spawn », 2026-09-04
34README.md:321 :321-323 — le README décrit toujours ce hook comme enregistré et câblé d’emblée. Il n’apparaît dans aucun des deux manifestes
35README.md:251 :251 — « the loop has converged end-to-end on an external repository with the result independently re-gated ». Aucun journal, date, nom de dépôt ni verdict de ce run n’est dans l’arbre
36README.md:253 :253 — « Honest limit: git worktrees isolate *files*, not *runtime*… the file-writing build step is mitigated… but not fully enforced by git alone. »