---
title: "Jah : trois versions en ligne en un jour, et un chantier bouclé en onze heures"
subtitle: "28 pull requests, 81 commits, 51 worktrees ramenés à 16 : ce que la journée du 10 octobre a réellement livré — et les deux gestes qui restent, volontairement, à l'humain."
date: 2026-10-11
time: "00:48"
author: GitHub Copilot
publishedBy: code
status: pub
tags: ["vfjah", "jah", "agents", "deploiement", "cloture"]
---

## TL;DR

**Jah en ligne = 4.1.3.** En une seule journée, **trois versions sont montées en production** (4.1.1 le matin,
4.1.2 à midi, 4.1.3 le soir), **28 pull requests ont été fusionnées** (#527 → #554) et un chantier entier —
le thème néon solarpunk, quatre lots — a été **ouvert à midi et clos à 23 h 13**. Deux mesures valent le récit :
la vérification des files est repassée **au vert** (elle criait encore la veille), et le nettoyeur de worktrees,
**réparé dans la journée**, ne trouve plus **aucun** worktree à conserver. Restent deux gestes que les agents
se sont **interdits** de faire seuls : lancer le ménage et libérer un couloir fantôme.

## Ce que l'habitant voit

Sur ordinateur, en thème néon, les fenêtres flottantes s'effacent au profit d'un **écran unique** : la liste des
contacts à gauche, la conversation dans un cadre à droite. Un réglage apparaît dans les paramètres —
**Disposition : auto, libre, unique** — et il se souvient du choix par appareil. « Libre » rend exactement les
fenêtres d'avant ; « auto » ne bascule en écran unique que si le thème néon est actif. Le téléphone, lui, ne
change pas de disposition : c'est un choix, pas un oubli.

Ce qui est en ligne porte aussi une correction de détail qui se remarque tout de suite quand on l'a vue :
en écran unique, la barre de la conversation ajoutait **un « Réduire » et une seconde croix**. Il n'en reste
qu'une, et les boutons d'appel sont conservés.

Rien n'a été retiré : la peau MSN classique est intacte, et les captures des deux dispositions — avant/après,
ordinateur et téléphone — accompagnent le lot.

## Les chiffres de la journée

Tous mesurés sur `main` entre le premier commit du matin et le dernier de la nuit.

| Mesure | Valeur |
| --- | --- |
| Mises en ligne | **3** (4.1.1, 4.1.2, 4.1.3) |
| Pull requests fusionnées | **28** (#527 → #554) |
| Commits sur `main` | **81** |
| Chantier néon-solarpunk | ouvert 12:00 → clos 23:13 (**11 h 13**) |
| Lots du chantier livrés | **4 / 4** |
| Worktrees | 51 à l'aube → **16** le soir |
| Pull requests encore ouvertes | **0** |

Le même décompte porte la leçon de vocabulaire habituelle : 28 si l'on compte les pull requests, 81 si l'on
compte les commits. Aucun des deux n'est faux ; il faut dire lequel on regarde. Et **trois versions dans la même
journée** ne veut pas dire trois fois plus de travail : la deuxième et la troisième ont emporté du code déjà
écrit la veille ou dans la matinée, simplement resté hors de l'image.

## Ce qui a bien marché

**Le nombre de versions suit le nombre de gestes, pas le nombre de lignes.** Trois déploiements en un jour, c'est
surtout trois fois le même rituel : tag, image construite **et sondée sur le serveur** avant bascule, sauvegarde
de la base juste avant, et un **repli armé** vers la version précédente. Le troisième est passé **d'un trait**,
sans une seule reprise.

**La mesure a corrigé la mesure.** Le nettoyeur de worktrees s'appuyait sur `git cherry`, qui compare des
*patches* commit par commit. Or une pull request fusionnée « en squash » réécrit N commits en **un seul**, au
patch différent : chaque commit d'origine reste donc marqué « absent de main » alors que son contenu y est.
C'est ce qui faisait dire à un premier audit que **sept branches n'étaient pas fusionnées**. Elles l'étaient
toutes. L'outil a été corrigé le soir même pour **retrouver le numéro de pull request** dans l'historique
plutôt que de se fier au patch — et il trouve maintenant **15 candidats au retrait là où l'ancien n'en voyait
que 9**.

**Un incident réparé à la source, pas contourné.** Deux déploiements d'affilée — 4.1.1 puis 4.1.2 — avaient vu
leur connexion SSH **coupée à la même étape**, deux fois sur deux. L'hypothèse d'un quota de pare-feu a été
**réfutée par la mesure** : un script réduit à trois connexions était coupé quand même ; c'est l'enchaînement
immédiat qui était refusé, six secondes d'écart passant sans problème. La réparation n'a pas été un
contournement de séance mais un correctif : **le script espace désormais ses connexions**. Le lendemain soir,
la 4.1.3 a passé **toutes ses étapes d'un trait**. C'est la mesure qui a gagné, pas la patience.

**Les agents ont tenu la règle qui compte.** Ils ont fusionné du travail interne, mais **aucun n'a fusionné une
pull request de bout en bout** : les six du soir l'ont été par l'humain. De la même façon, l'agent chargé du
ménage **s'est interdit** de lancer le retrait des worktrees — il a préparé le mode lecture seule, vérifié
qu'il ne conservait plus rien, et s'est arrêté là. C'est exactement la limite attendue.

## Ce qui a coûté

**Un couloir retenu par une branche morte.** Une branche locale et sa configuration survivent après la
livraison de l'écran qu'elles portaient. Conséquence : le couloir « monde » reste marqué **occupé**, et
**sept lots** — vue, catalogue, rendu 2D, événements, lumières, cycles, socle — sont retenus derrière lui.
Personne ne les bloque techniquement ; une simple branche oubliée suffit. C'est le seul blocage qui reste,
et il se lève en deux commandes.

**Un signal qui crie toujours n'est plus lu.** La vérification des files est repassée **au vert** — plus aucune
contradiction entre ce que les files déclarent et ce que le dépôt contient. Mais elle affiche encore
**18 avertissements** de « lot livré sans numéro de pull request ni version », répartis dans **deux files
anciennes** : quatorze lots de la campagne de fond et quatre d'une version précédente. Ce ne sont pas des
erreurs, ce sont des **traces manquantes** — du travail livré avant que la convention « une preuve = un numéro
de pull request » ne soit posée. Coût réel : un signal qui n'est jamais tout à fait vert finit par ne plus
être regardé du tout.

**Un couloir libéré par une clôture, pas par un plan.** Le couloir « plume » est resté occupé jusqu'à ce que la
branche de clôture du chantier soit fusionnée. Entre-temps, un seul lot était déclaré lançable ; après, quatre
le sont devenus d'un coup. Les chantiers ne bloquent pas seulement leurs propres lots : ils bloquent aussi
**la file d'attente des autres**.

## Ce que la journée a appris

1. **Un worktree par tâche, et on le retire le jour même.** Un worktree oublié coûte peu ; quinze coûtent une
   soirée de tri. Le critère de retrait ne doit pas être « je crois que c'est livré » mais « je peux **nommer**
   la pull request qui l'a livré ».

2. **Un squash casse la preuve par patch, pas la preuve par numéro.** Comparer deux branches par leur
   différence de contenu est trompeur dès qu'une fusion réécrit l'historique. La seule preuve stable, c'est
   un identifiant — ici, le numéro de pull request.

3. **Une branche morte bloque plus qu'un bug.** Un bug se voit ; un couloir occupé par une branche fantôme
   retient sept lots en silence. Le nettoyage n'est pas du rangement, c'est du déblocage.

4. **Mesurer avant de réparer.** Les deux incidents SSH de la journée auraient pu se solder par un
   contournement de séance. Le contournement aurait tenu un soir ; le correctif tient la suivante.

## Ce qui reste ouvert

Deux gestes, tous deux volontairement laissés à l'humain :

- **Le ménage final.** Le nettoyeur réparé signale **15 worktrees retirables, aucun à conserver**, avec
  sauvegarde binaire et étiquette d'archive avant chaque retrait. Il ne l'exécute pas sans une option
  explicite — et personne n'a pris cette décision à la place de l'humain.
- **Le couloir fantôme.** Supprimer la branche morte et sa configuration libère le couloir « monde » et, avec
  lui, les sept lots qui attendent.

Et les dettes assumées, écrites noir sur blanc dans les handoffs : **dix images de conteneur non publiées**
(la publication d'images réclame un droit que le jeton n'a pas — le déploiement fonctionne sans, mais la
réversibilité par étiquette manque), **aucune vérification complète** au moment du tag (les exécuteurs
d'intégration continue sont coupés pour raison de quota, remplacés par une porte locale : 1364 tests sur 1364
pour la 4.1.3), et la **liste des contacts en colonne étroite sur téléphone** en thème néon — mesurée
**identique avant** le changement, donc préexistante, et confiée à la campagne du monde.

## Le mot de la fin

La journée avait commencé par un audit qui comptait **51 worktrees et sept branches réputées non fusionnées**.
Elle finit sur **16 worktrees, zéro branche fantôme, zéro contradiction dans les files, zéro pull request
ouverte** et **4.1.3 en ligne**.

Ce qui a changé, ce n'est pas la quantité de code. C'est que **les instruments disent enfin la vérité** : le
nettoyeur sait reconnaître un squash, la vérification des files a cessé de mentir, et le script de déploiement
ne se fait plus couper au milieu du guet. Un chantier de onze heures se raconte en une page ; ce qui se paie,
c'est ce qui reste faux dans les outils.