La nuit où neuf commits sont partis sans moi
Un soir de mai, je laisse une session ouverte sur un projet annexe, le genre qu'on tient le week-end quand on a envie de coder pour rien. La consigne est simple, l'agent enchaîne /goal sur /goal. Je dîne, je couche les enfants, je lis vingt pages sur la trace photographique, je m'endors. Au matin, je trouve neuf commits autonomes propres, chacun ancré sur un artefact validé matériellement comme R15 l'exige depuis la v0.6. Aucun travail perdu. Aucun stall. Et, le détail qui m'arrête sur le seuil de mon bureau avec mon café à la main, aucun session log.
Neuf commits, zéro log
Le skill /close-session n'a pas été déclenché parce que son trigger naturel n'est jamais arrivé : un humain qui décide qu'il a fini sa séance et tape la commande. Je n'avais pas fini la séance, je dormais. Le skill /challenger n'a pas été convoqué non plus, faute de bug à fixer. La discipline doctrinale, dans cette nuit-là, ne tenait à rien parce que les triggers d'invocation supposaient une main humaine sur le clavier, et qu'il n'y en avait plus.
Ce que R15 sauvait, ce qu'elle ne voyait pas
R15 a fait son travail. Commit chaque artefact dès qu'il franchit son oracle matériel, ne pas batcher. Neuf artefacts, neuf commits. Si la session avait stallé au huitième, j'aurais retrouvé huit unités de travail validées, pas un seul gros patch perdu dans un crash silencieux.
Pourtant je vois, en relisant le log, deux phénomènes distincts qu'il fallait des règles distinctes pour cadrer. La persistance du travail relève de la cadence de commits, puisqu'un agent qui meurt n'emporte rien dans sa tombe. La dérive de raisonnement relève d'un autre dispositif, celui qui rattrape un agent enchaînant cinq décisions plausibles sans qu'aucune voix extérieure ne lui rappelle de douter. R15 sait sauver. Elle ne sait pas réveiller.
Le mécanisme de la dérive n'a rien de malicieux. Le reinforcement learning from human feedback n'entraîne pas un modèle à demander spontanément à être contredit, il l'entraîne à plaire au prompteur. Quand le prompteur dort, plus personne ne pousse à la friction. La complaisance n'apparaît pas, elle remonte simplement à la surface comme une nappe qu'aucun barrage ne retient plus.
Le prototype méta-hook
Le prototype est sobre. Un hook PostToolUse qui décompte les invocations consécutives d'agents background, de sub-agents délégués, ou de commandes /goal enchaînées sans message humain intermédiaire substantiel. Au-delà de cinq, le hook déclenche un prompt système qui force l'invocation de falsify-before-fix ou de close-session selon le contexte. Le compteur reset sur tout message utilisateur de plus de vingt caractères, hors OK, yes, proceed qui ne corrigent rien et ne questionnent rien.
Cinq n'est pas mesuré, c'est un choix doctrinal. Trop bas et le hook devient un parasite qui s'allume sur chaque session normale. Trop haut et la dérive a déjà eu lieu quand il s'allume. Cinq couvre empiriquement la fenêtre où, dans mon usage, une session passe de productive à autonome au-delà du raisonnable. Je révise si la pratique le démontre. Il vit sur le projet laboratoire, pas sur l'ERP, là où il bénéficie d'une urgence moindre, d'une infrastructure hook user-scope déjà en place, et d'une tolérance haute pour des expérimentations qui rendraient un ERP de production grincheux.
Ce que la nuit a fermé
Le pattern est sec : la discipline tient quand un humain invoque les triggers, tombe quand l'autonomie prend la main. C'est une asymétrie, et qu'on peut tenter de corriger par un dispositif. Ne pas la nommer reviendrait à coder à l'oreille au moment précis où l'oreille humaine n'écoute plus.
Si un autre dev solo Claude Code a une expérience comparable de session prolongée sans intervention, ou un dispositif différent qui couvre le même angle, j'écoute. Les commentaires deviennent inputs pour la version suivante du toolkit.
Counterpart Toolkit v0.7, amendement R15. Prototype méta-hook autonomy-detection.sh sur projet laboratoire. Source : github.com/michelfaure/doctrine-counterpart/blob/main/CLAUDE.md
Top comments (0)