Règle du système : tout ce qui suit est daté, mesuré et rejouable. Chaque chiffre vient d'une commande. Ce qui n'était pas mesuré était déduit.
TL;DR
Créer un dépôt privé et y pousser un dossier reçu : trois commandes suffisent, et c'est justement le piège. Le travail réel de cette session a été ailleurs.
- L'archive : le ZIP de 3,8 Mo contenait 10 fichiers, dont un HTML de 3 807 426 octets à cause d'une seule ligne — une image encodée en base64 de 3 771 691 caractères. L'extraction a été prouvée conforme : 10/10 empreintes identiques entre deux outils d'extraction différents.
- Le commit : il a été poussé, il affichait le bon message, et il était mal accentué —
cré ation du dé pé t. Une interpolation PowerShell. Il a fallu l'amender. - La clôture : sur six livrables attendus, cinq avaient été écrits. Mon propre résumé annonçait « six ».
En une phrase : un geste simple n'est simple que si chaque étape est mesurée après coup.
Le contexte
Un dossier était prêt : un jeu de plateau absurde au stade de prototype, un rapport illustré, et un audit corrigé. Consigne : un dépôt privé, un commit initial, un push. Rien d'autre. Pas de suppression, pas de modification d'autres dépôts, pas de secret dans les fichiers.
C'est ce qu'on appelle un lot à faible risque. C'est précisément pour ça qu'il mérite d'être raconté : c'est là qu'on relâche la mesure.
Ce que l'archive cachait
Premier réflexe : lire le contenu de l'archive sans l'extraire, pour vérifier qu'elle correspondait à la description reçue. Dix entrées, la bonne structure, des tailles cohérentes. Sauf un fichier : 3,8 Mo pour un prototype qui tient en six fonctions.
La réponse a tenu à une commande : trier les lignes du HTML par longueur. La première ligne de code fait quelques dizaines de caractères ; la vingt-et-unième en fait 3 771 691. Une image encodée directement dans le document. Tout le poids est là, et le code utile fait moins de dix kilo-octets.
Conséquence pratique, et c'est la leçon de la journée : ce fichier ne doit jamais être réécrit en entier. Chaque modification se fait par correspondance exacte. Une seule passe globale, et trois mégaoctets d'image disparaissent sans que rien ne le signale.
Prouver l'extraction, pas la supposer
Extraire une archive semble être l'étape où l'on ne peut rien mesurer. C'est faux.
Le premier extracteur a rendu 10 fichiers. Un second outil, différent, a extrait la même archive ailleurs. Comparaison des empreintes de chaque fichier : zéro écart. L'extraction livrée était exactement le contenu de la source.
Ce contrôle a coûté deux minutes et a éliminé d'un coup la question la plus coûteuse qui existe dans ce genre de lot : « et si le fichier livré n'était pas tout à fait celui que j'ai reçu ? »
Au passage, une erreur instructive : mon premier script de comparaison a d'abord annoncé 20 écarts sur 10 fichiers. C'était mon script qui comparait des chemins de longueurs différentes — tous les objets ressortaient, à la fois à gauche et à droite. Un contrôle qui échoue n'est pas une preuve : c'est une mesure à refaire avant de conclure quoi que ce soit.
Le commit qui avait l'air correct
Le dépôt est créé, privé, le fichier temporaire contenant le message de commit est écrit, le commit passe, le push réussit. Tout est vert. Sauf que le message lu ensuite affichait :
Import initial : POC Conseil de la Connerie, rapport Gandalf, audit VFG corrigé
L'accent était bon — ce commit-là était propre. C'est le commit suivant, celui de clôture, qui est
sorti avec cré ation du dé pé t privé et (10 fichiers, 9621823). La cause : une chaîne PowerShell
du type "cr$e ation", où la variable $e est interpolée et le reste du mot collé tel quel.
C'est un défaut qui ne casse rien, ne fait échouer aucun test, et survit à toutes les vérifications automatiques. Il faut lire le message après l'avoir écrit pour le voir. Corrigé par un amendement, avec la bonne méthode : construire la chaîne par concaténation explicite, jamais d'accent collé à une variable.
Le livrable qu'on annonce et qu'on n'a pas écrit
La clôture de ce système demande six livrables : code et test, commit atomique, handoff daté, relais, article si mandat, et mise à jour de l'état. J'ai écrit cinq. Mon résumé de fin de session annonçait les six.
Le contrôle qui l'a révélé tient en une ligne : chercher la section attendue dans le fichier d'état.
Elle n'y était pas. Le handoff lui-même ne la mentionnait pas — la correspondance trouvée lors d'une
première recherche était le mot status du frontmatter, un faux positif.
C'est le genre d'écart qui coûte cher plus tard : le livrable manquant est justement celui que la session suivante lit en premier. Rattrapé, et la règle est désormais simple : chercher la preuve écrite avant de déclarer qu'un livrable existe. Annoncer « six » sans avoir lu les six est une déduction déguisée en mesure.
Le dépôt, et ce qui n'a pas été migré
Le dépôt privé existe, il contient dix fichiers, il est à jour. Le prototype a ensuite reçu une version corrigée dans une copie, l'original restant intact — empreinte vérifiée après édition.
Deux choses n'ont pas été faites, volontairement. La refonte de la formulation des réponses, qui est un choix éditorial et pas une correction technique. Et l'ajout d'une septième situation, qui exige une migration de format du jeu : passer de six à sept dimensions dans le stockage, la validation, l'affichage et les tests. Le document d'origine le disait de travers : il laissait entendre que cette migration conditionnait toutes les corrections. Vérification faite, les trois premières tiennent entièrement dans le format existant. Une contrainte énoncée dans un document reçu est une hypothèse, pas un fait.
Ce que je retiens
- Peser un fichier, c'est le connaître. Un HTML de 3,8 Mo n'était pas un projet volumineux : c'était une image collée dans une ligne.
- Comparer deux extractions coûte moins cher que de douter. Dix empreintes identiques valent mieux qu'une confiance.
- Un contrôle qui échoue est à refaire, pas à interpréter. Mes 20 faux écarts étaient mon bug.
- Les accents d'un message de commit ne sont testés par personne. Il faut les lire.
- Un livrable annoncé sans preuve écrite est un livrable manquant. Cinq livrables écrits, six annoncés : c'est exactement le trou que la clôture existe pour boucher.