blog.vfg.lol

Après le reboot : ce qui reste vraiment ouvert, mesuré dépôt par dépôt

Un état des lieux de tout le parc après une nuit de clôtures. Trois éclaireurs en lecture seule, une quarantaine de dépôts, trente-six worktrees — et un audit qui a dû se méfier de sa propre ombre.

TL;DR

Après un redémarrage de la machine et une nuit entière de sessions closes une à une, la question était : qu'est-ce qui reste réellement ouvert, partout ? Pas ce que les plans disent, pas ce que les handoffs promettent, mais ce que git et les services répondent maintenant.

Trois éclaireurs en lecture seule ont balayé en parallèle le méta-dépôt, les dix-sept dépôts vivants du manifeste et la racine historique avec ses trente-six worktrees. Résultat, en cinq lignes :

  • La production va bien : les cinq sondes de santé répondent ok.
  • Six lots de travail n'existent qu'en un seul exemplaire, sur un disque local, jamais poussés.
  • Les trois plans écrits la veille n'ont aucune case cochée, alors qu'au moins cinq de leurs items sont faits. Un backlog qui ne sait pas ce qui est fini n'est pas un backlog.
  • Le blog a deux clones, et le manifeste pointe vers le mauvais : 327 commits de retard sur sa branche principale.
  • Le goulot n'est pas le code, c'est la décision humaine : rotation, push, suppression. Tout le reste peut être dispatché.

Le plan qui en sort tient en cinq vagues. La première, sans risque, a été lancée dans la foulée. Ses trois lots sont revenus, et leurs tests ont été rejoués par l'orchestrateur : 28 sur 28, puis 31 sur 31, plus un index de 56 handoffs.


1. Pourquoi refaire un état des lieux, la veille déjà documentée

La nuit précédente avait produit beaucoup d'écrit : huit handoffs entre minuit et sept heures, trois plans, un STATUS transverse de 184 lignes. On pourrait croire qu'il suffit de les relire.

C'est exactement le piège. Un handoff décrit un état daté. Il dit « non poussé » à 1 h 45 ; à 3 h 35, quelqu'un a poussé. Il dit « PR ouverte » ; elle a été fusionnée entre-temps. Relire la prose, c'est reconstruire le passé et l'appeler présent.

La règle du parc est donc inverse : mesurer avant de déduire. Chaque constat de cet article porte une heure (le 2 octobre entre 8 h 45 et 9 h 05) et une commande qui permet de le rejouer. Ce qui n'a pas de commande est rangé dans une colonne à part : « déduit, à tester ».


2. La méthode : trois éclaireurs, zéro écriture

Le parc est trop large pour un seul regard. Il a été découpé en trois zones, chacune confiée à un éclaireur qui n'avait le droit que de lire :

ZoneCe qu'elle couvreQuestions posées
Méta-dépôtle workspace, ses handoffs, ses plans, ses scriptsQuels items sont ouverts ? Quels handoffs ne sont pas triés ? Quel outillage d'orchestration existe déjà ?
Dépôts vivantsles dix-sept projets du manifesteDernier commit, modifications réelles, avance/retard, branches non fusionnées, items ouverts dans STATUS et handoffs
Racine historiqueles dépôts hors manifeste et les worktreesQuels worktrees sont vivants, fusionnés, cassés ? Quel travail n'existe nulle part ailleurs ?

Pendant ce temps, le chef d'orchestre interrogeait directement les services : santé du pont, file des idées en attente, bus d'événements, tâches planifiées, ports à l'écoute, espace disque.

Trois consignes communes, apprises à la dure les semaines précédentes :

  1. Jamais de fetch. Un audit qui rafraîchit les références distantes modifie ce qu'il mesure.
  2. git diff --numstat, jamais git status seul. Sur Windows, la moitié des fichiers « modifiés » ne diffèrent que par leurs fins de ligne.
  3. Les commandes git en --no-optional-locks. Même une lecture peut réécrire l'index ; l'audit ne doit laisser aucune trace.

3. Un audit qui doit se méfier de lui-même

Trois fois pendant la mesure, le terrain a bougé sous les pieds des éclaireurs — et trois fois, la bonne réponse a été de ne pas conclure trop vite.

Un autre agent écrivait pendant qu'on mesurait

Le méta-dépôt a changé de tête à 8 h 49, en plein audit : une autre session venait de committer sa propre clôture. Dans le dépôt de la messagerie, la branche courante a changé entre deux passages d'un même éclaireur, et trois worktrees enregistrés ont disparu entre deux mesures.

Conséquence pratique : aucun lot de la suite ne touche ces deux checkouts. Chaque lot reçoit son propre worktree, créé exprès, à côté.

Quatre-vingt-douze fichiers « modifiés » en trois minutes

Entre 8 h 28 et 8 h 31, quatre-vingt-douze fichiers ont vu leur date changer dans une dizaine de worktrees. Première lecture : un agent travaille partout à la fois. Mesure : contenu identique partout, numstat vide. Un outil avait réécrit des fichiers à l'identique.

Un éclaireur avait d'abord classé un worktree cassé comme « actif » sur la foi de ces dates. La recherche complète (plus de cinq minutes) l'a corrigé. La date d'un fichier n'est pas une preuve d'activité.

« Zéro test » n'était pas zéro test

En rejouant les tests d'un lot livré, la première commande a répondu : un test, zéro réussi, un échec. Alarme ? Non : la commande passait un dossier à node --test au lieu de la liste des fichiers, et sous Windows ce n'est pas la même chose. Rejouée à l'identique de ce que l'agent avait utilisé : 28 tests, 28 réussis. Un « échec » de l'instrument n'est pas un échec du code.


4. Ce qui a été mesuré

Le système

ÉlémentRésultat
Santé de productionpont, passerelle, monde RPG, jeu IRL, site tiers : ok ×5
Tâches planifiéestoutes relancées au reboot ; dernier résultat 0
Hub agentique localéteint ; le bus d'événements n'a rien reçu depuis le 15 juin
File d'idées de la messagerie14 tâches à faire, dans un sprint nommé « juin » jamais clos
Disque système6,7 Go libres : assez pour bloquer les tests du blog

Le bus d'événements figé depuis trois mois et demi est le constat le plus discret et peut-être le plus parlant : le tableau de bord qu'on regarderait pour savoir ce qui tourne ne reçoit plus rien. Hypothèse (non mesurée) : la cause est l'arrêt du hub, pas l'arrêt des émetteurs.

Le méta-dépôt

  • 56 handoffs dans docs/handoffs/, dont 36 sans statut et aucun index.
  • La règle écrite dit « handoffs/ à la racine, date au format jour-mois-année » ; la pratique est « docs/handoffs/, date au format année-mois-jour ». La divergence est signalée depuis la veille et n'est pas tranchée.
  • Trois plans du 2 octobre : zéro case cochée. Au moins cinq items sont pourtant soldés : un jeton de télémétrie rebranché, une procédure de triage écrite, un runbook « publier n'est pas déployer » rédigé, un manifeste commité, deux correctifs livrés sur des branches locales.
  • Un script de sonde non commité est inexécutable : toutes ses variables ont été avalées par un shell au moment de l'écriture.
  • L'outillage d'orchestration existe en morceaux : un dev-meta riche (statut, vérification, diff sécurisé, clôture), une vue live HTML qui masque les secrets, un gabarit de lot écrit noir sur blanc — mais aucune commande pour dispatcher.

Les dix-sept dépôts vivants

SignalConstat
Modifications réelles non commitéesune seule vraie : des fichiers de données d'exécution dans le hub, plus un fichier de déploiement identique à la version distante
Divergencele hub a 4 commits locaux et 2 distants à intégrer — sans conflit de contenu
STATUS en retard sur gitpasserelle (« non poussé » alors que poussé ; « PR ouverte » alors que fusionnée), monde RPG (« tag à faire » alors que deux tags existent)
Branche par défaut étrangeun petit dépôt de test a pour branche distante par défaut une branche de session d'agent
Dormants (> 14 jours)sept dépôts entre 75 et 113 jours, deux à 17 jours

Les worktrees

Trente-six dossiers dans la racine des worktrees :

ClasseNombreLecture
Fusionnés, élagables19branche entièrement dans la branche principale, rien de local
Actifs non fusionnés11en attente de merge, ou jamais poussés
Dormant non fusionné1articles déjà publiés sous une autre version — à comparer
Cassés6plus de lien git
Mal rangé1un clone autonome posé parmi les worktrees

Les six cassés méritent un mot, parce que le handoff de la veille proposait de les supprimer :

  • deux sont vides : suppression sans risque ;
  • deux sont des copies du monde RPG sans une ligne unique : suppression sans risque ;
  • un n'est pas un worktree du tout : c'est le dossier qui contient l'outil de nettoyage des worktrees. Le supprimer, c'était jeter le balai avec la poussière ;
  • un contient un fichier de test de 101 lignes absent de tout l'historique git, référencé par un script qui pointe vers un dossier qui n'existe plus. C'est du travail jamais commité : à récupérer avant toute suppression.

Le travail qui n'existe qu'en un exemplaire

C'est la liste qui justifie à elle seule l'audit. Six lots de commits n'existent sur aucun serveur :

OùQuoi
Passerelle6 commits d'un agent qui répond sur la messagerie avec un modèle local
Blogun correctif du classement des handoffs, et le triage de 84 handoffs
Méta-dépôtla détection de dérive par rapport au serveur dans dev-meta
Dépôt système4 commits d'un correctif de déploiement
Triage des handoffs2 commits

Une panne de disque, et ces heures de travail disparaissent. D'où la priorité P0 qui suit.


5. Le plan : cinq vagues, une seule séance humaine

Le principe est celui du gabarit de lot déjà éprouvé :

  • un lot = un agent = un worktree exclusif ;
  • test d'abord ;
  • commit local, jamais de push ;
  • l'orchestrateur rejoue la vérification lui-même.

Quatre niveaux de porte décident qui agit :

PorteQui agitExemples
R0l'agent seullecture, mesure, test
R1l'agent, puis vérification par un autrecode borné avec test
R2décision de FGquel clone est le bon, archiver ou maintenir
R3FG exécutesecrets, production, push, suppression
VagueQuiContenu
1 — lancée3 agentsélargir le détecteur de secrets ; option --root pour dev-meta ; index des handoffs et resynchronisation des plans
0 — une séance FGhumain, ~1 hchantier sécurité ; pousser d'abord ce qui n'existe qu'en un exemplaire ; trancher le clone du blog, le sprint de juin, les dormants ; autoriser l'élagage ; libérer le disque
2 — hygièneagents, après la séancehooks de commit dans les dix-sept dépôts, scan en CI, élagage, réalignement du hub, STATUS recalés, diagnostic du bus
3 — produitun agent par dépôtbacklogs de la messagerie, du monde RPG, du ledger, de la passerelle…
4 — connaissanceagentsarticles manquants, mémoire rafraîchie, skill de planification

La vague 0 est volontairement une seule séance. Toutes les décisions humaines du parc y sont regroupées : plutôt que d'interrompre FG douze fois dans la journée, on lui présente un dossier unique, une fois.


6. Premier retour de la vague 1

Le lot « --root » est revenu en deux minutes et demie, avec deux commits locaux.

Le problème réglé. Un worktree du méta-dépôt ne voyait aucun projet, parce que le manifeste décrit des chemins relatifs à la racine du workspace. Mesure de l'agent : sans l'option, 22 erreurs « absent requis » ; avec --root, 23 projets ok — exactement comme depuis la racine.

La surprise. Le script de synchronisation des ports, réputé « cassé », ne plantait pas : il régressait en silence. Le relancer aurait effacé sept ports et l'historique de trois collisions résolues, parce que sa source amont est moins complète que l'instantané qu'il écrase. L'agent a ajouté :

  • un mode --dry-run ;
  • un refus d'écraser quand des ports seraient perdus ;
  • onze tests.

Le correctif de la source amont reste une décision à part.

Une collision qu'aucun outil ne voyait. Le port de la messagerie est déclaré par deux projets dans le manifeste. Le vérificateur de ports ne lit qu'une des deux sections et répond donc « libre ». C'est un faux négatif structurel, documenté et laissé à la décision humaine.

Vérification rejouée par l'orchestrateur : 28 tests, 28 réussis.

Le détecteur de secrets élargi

Le deuxième lot a ajouté au scanner du workspace les familles que l'audit de sécurité de la nuit avait trouvées et qu'il laissait passer :

  • jetons de bot ;
  • en-têtes Bearer ;
  • affectations NOM_TOKEN= dans du Markdown ou du YAML ;
  • segments aléatoires dans des URL de serveurs MCP ;
  • mots de passe écrits en prose.

Ce qu'il apporte en plus :

  • Une sortie masquée par construction. Chemin, ligne, type et trois caractères au plus. Un scanner qui affiche ce qu'il trouve est lui-même une fuite ; la nuit précédente en avait fait l'expérience.
  • Un mode « contenu indexé », prêt pour un hook de commit.
  • Des faux positifs évités et testés : variables, gabarits, changeme, ***.

Résultat : 31 tests, 31 réussis, rejoués par l'orchestrateur. Passé sur le méta-dépôt, il retrouve les constats déjà connus de l'audit de sécurité, en sortie masquée. La preuve qu'il voit enfin ce qu'il ne voyait pas.

L'index des handoffs et les plans resynchronisés

Le troisième lot a classé les 56 handoffs du méta-dépôt, chacun avec une preuve :

StatutNombre
Clos14
Ouverts11
Remplacés5
Inconnus26

La classe « inconnu » était explicitement autorisée. Mieux vaut 26 inconnus honnêtes que 26 « clos » supposés : la preuve manquait le plus souvent parce qu'elle vit sur le serveur ou dans un autre dépôt.

Les trois plans ont été recochés, case par case, avec preuve en fin de ligne :

PlanCases cochées
Plan d'actions2 sur 16
Plan de vision0 sur 6
Plan de suite8 sur 20

Les livraisons faites sur des branches locales ne sont pas cochées : « livré » n'est pas « soldé » tant que le travail n'existe qu'en un exemplaire.


7. Ce qu'on en retient

  1. Un plan non resynchronisé ment par omission. Zéro case cochée sur des items faits : le prochain agent aurait refait le travail. La resynchronisation est un lot à part entière, avec preuve par case.
  2. « Cassé » n'est pas « supprimable ». Sur six worktrees cassés, un contenait l'outil de nettoyage, un autre du travail jamais commité.
  3. L'audit doit savoir qu'il n'est pas seul. Un autre agent committait pendant la mesure, un outil réécrivait des dates : sans numstat ni horodatage, les deux auraient produit de faux constats.
  4. Le goulot est la décision, pas l'exécution. Les agents savent livrer un lot testé en quelques minutes. Ce qui attend depuis des jours, ce sont des gestes que seul un humain a le droit de faire. Les regrouper en une séance est le levier le plus rentable du plan.

Prochaine étape

  • Séance FG (vague 0) : chantier sécurité, pushes des exemplaires uniques, décisions R2.
  • Pousser les trois branches de la vague 1 (porte R3, après relecture du diff).
  • Vague 2 : brancher le détecteur élargi en hook de commit, dépôt par dépôt.

source markdown

Concepts de cet article

handoffworktreedériveMCP

Partage le plus de concepts avec