Aller au contenu
Chapitre 5

Le Jour des Trois Fronts

17 mars 2026 (matin)

Chapitre 5 — Le Jour des Trois Fronts

Sources vérifiées : git log brain 2026-03-17 + git log TetaRdPG, Clickerz, OriginsDigital Commits clés : c69da32 (Clickerz sprint 1) · 49b8aa1 (TetaRdPG sprint 3) · d25bfb7 (OriginsDigital sprint 3) · 3ff5a8a (fix mysql jsonb→json) · 824ed41 (revert synchronize:true) Rapport d’audit : audits/workflows/3-sprints-2026-03-17.md


Le 17 mars 2026, pour la première fois, trois projets entrent en production le même matin.

Pas l’un après l’autre. En parallèle. Entre 06h36 et 07h43 — une heure et sept minutes. Trois agents délégués lancés en fond de fenêtre, le coach en hyperviseur sur la session principale — et un humain qui n’intervient qu’aux gates. La structure coach-as-hypervisor n’était jusqu’ici qu’un pattern dans un fichier yml, testé la même nuit, quelques heures plus tôt, sur SuperOAuth Tier 3. Ce matin-là, elle est mise en terrain réel pour la première fois sur trois fronts simultanés : Clickerz, OriginsDigital, TetaRdPG.

Ça se passe bien. Jusqu’à ce que ça coince.


TetaRdPG — le drift qui aurait dû être détecté

Le premier problème surgit sur TetaRdPG. Le projet NestJS a été bootstrappé depuis un template — template dont la configuration TypeORM pointe vers PostgreSQL. Le VPS, lui, tourne MySQL. psql est introuvable. Les migrations échouent. L’agent délégué remonte un partial : il ne peut pas continuer sans que le drift soit corrigé.

Retour code, patch manuel. À 07h20 :

b506adf — fix(infra): PostgreSQL → MySQL + tsconfig.build exclude frontend/

type: 'postgres' devient type: 'mysql', le scheme de l’URL passe de postgresql:// à mysql://, mysql2 est installé. Puis à 07h38 :

3ff5a8a — fix(mysql): jsonb → json — type non supporté par MySQL

Parce que jsonb est un type PostgreSQL uniquement, et MySQL ne le connaît pas. Cinq commits de correction en vingt-deux minutes, dont deux pour ce seul drift — qui aurait dû être détecté avant la délégation.

Mais c’est entre les deux fix que l’incident critique arrive. À 07h21 :

921873b — fix(deploy): synchronize:true pour premier deploy MySQL — à revert après

synchronize:true. Le flag qui dit à TypeORM de modifier le schéma de la base de données automatiquement, sans migration, sans contrôle. En dev, c’est pratique. En prod, c’est une bombe.

C’est là que la phrase arrive, directe : “j’aurais dû le forcer, mais heureusement coach a arrêté !”

Le coach avait signalé le risque. L’instinct était de passer outre — aller vite, livrer. L’arrêt était légitime. Cinq minutes plus tard, à 07h26 :

824ed41 — fix(security): revert synchronize:true → prod-safe + .env.example placeholders

Le revert. Ce n’est pas un détail : c’est exactement le rôle d’un hyperviseur. Pas empêcher de faire — empêcher de faire une connerie.


OriginsDigital — la fuite silencieuse

Sur OriginsDigital, un autre incident, plus silencieux et plus grave. L’agent délégué loggue son contexte BACT brut dans l’output. Des secrets du brain apparaissent dans les logs. Pas une fuite externe — une fuite interne, dans la trace de la session.

Criticité haute dans le rapport d’audit — une ligne qui ne ressemble pas aux autres : 1 incident — secrets loggués par subagent. Un pattern de sécurité manquant est identifié immédiatement : subagent-secrets-guard. Les agents délégués ne connaissent pas les règles de secrets-guardian — ils n’héritent pas des garde-fous de la session principale.

À créer avant la prochaine session multi-workflow. Sans négociation.


Clickerz — le front propre

Clickerz est le front qui passe sans friction. À 06h36, le sprint 1 step 2 arrive — core economy TypeScript, hook useEconomy, 13 tests Vitest. À 07h09, step 3 — PrestigePanel, MilestoneBar, équilibrage.

c69da32 — feat(sprint1-step2): core economy TS + useEconomy hook (lazy calc) + 13 tests vitest

Le deploy passe. pm2 stable. Le site est live. Pas d’incident, pas de drift, pas de gate humain. La preuve que le pattern fonctionne quand la stack est alignée.


Trois sites, une heure

Malgré les frictions, les trois sites passent en production. clickerz.tetardtek.com, origins.tetardtek.com, tetardpg.tetardtek.com — live, migrations passées, pm2 stable. Le step 4 — deploy SSH direct depuis la fenêtre coach — est le mode le plus fluide. Il n’a jamais échoué.

“3 projets déployés en prod en ~15 minutes.”

15 minutes pour le deploy. Une heure pour les trois sprints. Tout ça pendant que le brain, dans la même session, livre des API Key, forge des visions de Cosmos, et écrit ses propres chapitres.


Les patterns qui survivent à la session

Ce qui reste après la session, c’est moins les livraisons que ce qu’elles ont produit comme savoir. Six patterns capturés dans le toolkit — pas depuis des articles, depuis des erreurs réelles :

PatternSource
coach-as-hypervisor3 workflows parallèles — friction fenêtre séparée → Agent tool
agent-permissions-inheritancesubagent bloqué sur Write — même cause sur les 3 projets
cross-workflow-dep-scanSuperOAuth dep non détectée avant step 3 OriginsDigital
typeorm-mysql-migrationtype:'postgres' vs VPS MySQL — 2 retours code TetaRdPG
typeorm-jsonb-to-jsonDataTypeNotSupportedError MySQL — jsonb inconnu
subagent-secrets-guardSecrets loggués dans output subagent — OriginsDigital

Chacun a une date, un commit, un contexte. Chacun ne sera plus jamais un aller-retour.

“4 jours pour découvrir ça par la pratique, c’est le bon rythme.”

La phrase résume quelque chose de plus large. Le kernel n’a pas été construit depuis des spécifications. Il a été construit depuis des frictions — des blocages qui, une fois traversés, deviennent des règles. L’INIT du hyperviseur doit scanner les stacks avant de déléguer. Les subagents n’héritent pas du settings.json projet. Les cross-dependencies inter-projets doivent être détectées avant le step 1, pas pendant le step 3.

Ces règles n’existaient pas le matin du 17 mars. Elles existent le soir.


L’apprentissage comme métrique

Il y a une dernière chose que ce chapitre doit nommer. L’autonomy rate de la session est à 83% — en dessous de la cible de 90%. Mais les deux gates humains non planifiés ont tous les deux été légitimes : aucun n’était réflexe, aucun n’était de la friction inutile. Le parasite gate rate est à 0%.

“on réduit le gate:human sur des choses qui sont acquises, c’est ça l’apprentissage non ?”

Oui. C’est exactement ça. Un gate qui disparaît n’est pas un abandon de contrôle — c’est la preuve que la chose est acquise. Le brain apprend. L’humain recule là où le système a prouvé qu’il tient.

Et c’est aussi le moment où quelque chose se clarifie. Le brain repo et les repos projets sont séparés — des mondes différents avec des git log différents. Le brain ne contient pas le code des projets. Il contient les règles qui permettent de les construire. Le kernel vit d’un côté. Les sprints vivent de l’autre. Et les patterns de ce matin sont le pont entre les deux — les leçons du terrain qui remontent dans le kernel.

“comme ça c’est parfait !”


Ce qui a été construit

  • clickerz.tetardtek.com — sprint 1 : core economy TS, prestige, 13 tests, deploy (c69da32, 06:36)
  • origins.tetardtek.com — sprint 3 : vision B2B, refonte Tailwind, LandingPage Pricing, deploy (d25bfb7, 06:36)
  • tetardpg.tetardtek.com — sprint 3 : EconomyModule TetardCoin, TwitchModule EventSub, 36 tests, deploy (49b8aa1, 07:10)
  • Première exécution complète du pattern coach-as-hypervisor sur 3 workflows simultanés
  • Six patterns versés dans toolkit/bact/patterns/ le lendemain (d28ed71, 18 mars, 17:16)

Décisions clés

  • Le coach a le droit d’arrêter. synchronize:true revert en 5 minutes. Le gate humain était légitime — c’est le rôle exact de l’hyperviseur.
  • Les subagents ne sont pas protégés par défaut. Le pattern subagent-secrets-guard naît d’une fuite réelle. La sécurité ne se propage pas par magie — elle se câble explicitement.
  • Les patterns naissent des frictions. Six patterns capturés, zéro théorisé. Tous issus d’erreurs réelles sur des projets réels.
  • La séparation brain/projets est structurelle. Le brain ne contient pas le code — il contient les règles. Les repos sont séparés. Les patterns font le pont.
  • 83% d’autonomie, 0% de friction parasite. Les gates qui restent sont tous légitimes. Les gates qui disparaissent sont des preuves d’apprentissage.

Citations

“j’aurais dû le forcer, mais heureusement coach a arrêté !”

“comme ça c’est parfait !”

“4 jours pour découvrir ça par la pratique, c’est le bon rythme”

“on réduit le gate:human sur des choses qui sont acquises, c’est ça l’apprentissage non ?”

“3 projets déployés en prod en ~15 minutes”