L'incident qui pose la question
Mardi 20 mai, fin d'après-midi. Niran lève la tête de son laptop et dit, en posant une canette de soda sur le bureau : « Computer use, là, pour pousser la maquette sur le site — c'est pas plus rapide ? »
Je lui réponds sans me retourner : « Dix fois le coût tokens d'une session normale. Pour cliquer sur trois boutons. »
Silence. Il rouvre son éditeur. Françoise passe dans le couloir en lançant à personne en particulier : « Bon allez, on y va » — elle parle d'autre chose, mais le timing est parfait.
Cette scène, dans des variantes, je l'ai vécue une trentaine de fois sur les deux derniers mois. Pas sur le code, sur le dispositif autour du code, cet outillage qui encadre la session Claude Code, qui charge le contexte, qui contraint la sortie, qui interrompt la course. On parle beaucoup des prompts et peu des prothèses. Voici les douze outils qui ont survécu à soixante jours de production solo sur un ERP de cent dix-huit mille lignes. Certains sont restés. Un a été jeté. Un est contesté. J'ai compté matériellement avant d'écrire, ls ~/.claude/skills/ retournant trois fichiers, ls ~/.claude/hooks/ en retournant six, ls ~/tef-erp/.claude/agents/ en retournant un. À l'heure où j'écris, le compte tient à douze.
Le contexte qui survit à la session
(1) CLAUDE.md racine projet, KEPT. Six versions en trente-deux jours, chargé automatiquement par Claude Code à l'ouverture de session, source unique des conventions de stack. Sans lui, l'agent redécouvre à chaque session que Next 16 n'est pas le Next.js de son training data, et il faut une heure pour qu'il cesse d'écrire des handlers onClick en Server Components. Avec, la première itération sait déjà ce qui est interdit. Le ROI se mesure en minutes économisées par session, multiplié par cinq à dix sessions par jour.
(2) Mémoire persistante user-scope, KEPT. Environ quatre-vingts fichiers indexés dans ~/.claude/agent-memory/, organisés par feedback, projet, référence. La règle qui m'a évité le plus de récidives s'appelle feedback_db_constraints_phase_zero. Avant toute feature qui filtre ou insère, lister UNIQUE/CHECK/FK en DB, parce que ces contraintes sont invisibles dans le TypeScript et conditionnent le design. La mémoire user transcende les projets, et un audit cross-scope a détecté un drift entre l'index et le repo en moins d'une heure parce qu'elle avait une politique de canonisation explicite.
(3) Règles ~/tef-erp/.claude/rules/, KEPT. Dix-huit fichiers actuellement, chacun documentant un invariant projet et la raison historique qui l'a produit. liste-rouge.md a empêché trois imports CSV de réactiver des contacts virés. cache-auth-contract.md documente que lib/cache.ts bypasse la RLS et que tout caller doit vérifier l'auth en amont. C'est de la doctrine de code, pas de la doctrine méta, et c'est ce qui rend le sous-agent capable de refuser une refacto qui violerait l'invariant.
Les dispositifs invocables
(4) Skills, trois fichiers actifs, KEPT. challenger, close-session, rembrandt-conventions. La skill qui m'a converti s'appelle falsify-before-fix, instance opérationnelle de R4 du Counterpart Toolkit. Cinq à dix minutes de protocole en amont du fix évitent trente à quatre-vingt-dix minutes de cycle fix-puis-rollback quand la première hypothèse plausible se révèle fausse. ROI six à dix-huit fois par incident. Une règle textuelle en CLAUDE.md ne suffisait pas, puisque j'avais R4 sous les yeux depuis trois semaines quand j'ai commit le mauvais fix le six mai. Un skill, c'est un mécanisme matériel qui se charge automatiquement sur les mots-clés « fix », « bug », « hotfix », et qui impose son protocole dans la session active.
(5) Hooks user-scope, six fichiers actifs au 21/05/2026, KEPT. secret-scanner.sh, deploy-safeguard.sh, audit-memory-reminder.sh, check-workaround-assumed.sh, pre-bulk-mutation-count-staleness.sh, r15-autonomous-counter.sh. Note de dérive : le brief initial documentait cinq hooks, le comptage matériel en retourne six — r15-autonomous-counter.sh a été ajouté en juillet comme prototype de méta-hook R15 et figurait déjà dans ~/.claude/hooks/ au moment de la rédaction. Le total tenu dans l'article reste douze outils ; le sixième hook est un raffinement de l'outil 5, pas un treizième outil distinct. Le hook deploy-safeguard.sh est parti de deux patterns interdits (vercel --prod et supabase db push), il en couvre six aujourd'hui après qu'une commande déguisée a failli passer entre les mailles. Backport vers la source publique de la doctrine en quarante-huit heures. Aucun secret n'a fuité en chat depuis le déploiement, et le hook bloque avant la commande, pas avant le commit.
Sur check-workaround-assumed.sh, la v0.2 incluait les patterns « fix » et « temp », empiriquement soixante pour cent de faux positifs sur les commits conventional-commits préfixés fix:. La v0.3 a resserré sur le vocabulaire réel du workaround, et le hook est passé d'agaçant à utile.
# ~/.claude/hooks/check-workaround-assumed.sh
# v0.3 reformulation: pattern narrowed to actual workaround vocabulary.
# v0.2 included "fix" and "temp" — empirically too broad (60% false positives
# on conventional-commits `fix:` prefix and template/tempdir collisions).
# Test against the author's last 50 commits before promoting to error.
(6) Sub-agent agent-challenger projet-scope, KEPT. Format de sortie imposé Tool / Question / Refutation criterion. Du désaccord matériel, jamais du « are you sure? » émotionnel qui pousse à réviser sans fait nouveau. Quand je demande au challenger d'attaquer une hypothèse d'incident, il produit trois sondes conçues pour réfuter, pas pour confirmer, chaque sonde portant ses trois champs, et la sortie reste brute. C'est l'inverse de l'agent de complaisance, et c'est ce que vise le Counterpart Toolkit dans son ensemble.
L'observabilité matérielle
(7) Sondes drift Supabase quotidiennes, KEPT. ADR-0039 documente cinq sondes qui tournent chaque nuit. sonde_contacts_orphelins_inscrits aurait empêché un incident d'émargement le quatorze mai si elle avait existé quinze jours plus tôt, et c'est elle qui a ensuite servi à détecter seize contacts inscrits sans nom ou sans prénom. Le délai médian apparition-vers-détection d'une divergence silencieuse est passé d'invisible à 35,3 jours sur quatre-vingt-dix jours glissants. La cible doctrine est trente jours, on s'en approche.
(8) Sentry withMonitor plus Sentry.flush(2000) sur crons serverless, KEPT. Quatorze avril, quarante-et-un timeouts faux positifs parce que les crons Vercel se terminaient avant l'envoi à Sentry. Le Sentry.flush(2000) en finally a éliminé la classe entière. SLO bas volume égale anomaly above bounds, jamais seuil pourcentage. Un cron qui passe d'un échec par jour à trois déclenche en anomalie statistique sans déclencher en seuil.
La délégation et l'arbitrage
(9) Sub-agent agent-erp-tef, CONTESTED. L'agent surestime build et ESLint sans sortie brute, et a récidivé le huit mai en poussant un warning ADR-0042 silencieux sur main. Je continue à le solliciter pour les tâches multi-fichiers complexes à deux conditions. Sortie brute exigée (jamais « le build passe » sans stdout), et toute migration DDL produit un fichier supabase/migrations/ committé avec son path dans le rapport. Le contested tient à l'absence d'alternative, puisque éditer à la main reste plus sûr mais plus lent.
(10) agent-academique (série DEV.to), KEPT. Protocole trois passes, charpente, chair, voix. Cinquante drafts en quarante jours. Hors-stack code, même principe d'effort déplacé vers le dispositif plutôt que vers l'exécution. ROI invisible par session, visible sur quarante jours.
(11) Computer use MCP, DROPPED. Coût tokens prohibitif, à peu près dix fois une session normale. La décision est explicite, puisque computer use exige une validation préalable qui n'est jamais accordée sauf cas où aucune alternative MCP dédiée n'existe pour la cible. En soixante jours, je l'ai invoqué deux fois, pour Photos macOS et un PDF natif. Tout le reste passe par les MCP dédiés (Slack, Gmail, Airtable, Supabase, WordPress) ou par Chrome MCP. Le dropped ici n'est pas un rejet de l'outil, c'est une discipline d'usage chiffrée.
(12) Doctrine Counterpart Toolkit v0.7, KEPT. Seize règles opérationnelles en deux cents lignes, install par ./install.sh --yes /path/to/project. Six versions en trente-deux jours, quatre relecteurs externes intégrés, ROI cumulé sur R4 (falsify), R6 (Live/Snapshot/Cache), R10 (silent failure forbidden). La méta-doctrine qui rend les onze outils précédents cohérents entre eux, sans laquelle chacun resterait un patch local sans grammaire commune.
Ce que j'ai appris du catalogue
Le pattern saute aux yeux. Les outils qui survivent sont ceux qui interrompent la course au moment où la complaisance se compose, la mienne et celle de l'agent. CLAUDE.md interrompt l'oubli de stack, les skills interrompent le réflexe avant le fix, les hooks interrompent la commande avant qu'elle tape la base, les sondes interrompent le drift avant que la prod craque. Computer use, lui, n'interrompt rien et prolonge la course en générant des tokens. C'est pour ça qu'il a sauté.
L'outil contesté, agent-erp-tef, est le plus instructif. Il n'interrompt pas sa propre complaisance, et produit du build vert qui ne l'est pas. Si je devais le réparer, je lui imposerais un protocole de sortie brute, comme falsify-before-fix impose ses sondes au moment du fix.
Quand un outil ne sait pas vous interrompre, il vous accompagne dans le drift. Quand il vous interrompt, il commence à valoir son coût.
Verdict matériel au 21 mai 2026, sur un ERP de 118 808 lignes, soixante jours de production solo. Doctrine de référence : Counterpart Toolkit v0.7, licence CC-BY-4.0, github.com/michelfaure/doctrine-counterpart. Prénoms et scènes recomposés.
Top comments (0)