925 issues, zéro coda
Mon jeu faisait sonner ses chutes en lignes détachées : 58 % des 925 issues finissaient en coda. Deux jours d'écriture de masse outillée plus tard : zéro. Récit d'une passe où la mesure a corrigé l'intuition à chaque lot, y compris sur mes propres titres de commit.
Un tic d'écriture, rendu comptable
Les événements d'EREME vivent dans un seul fichier de données : à l'époque de la passe, 86 événements, chacun avec ses intros (le joueur en lit une par tirage), ses libellés d'options, et ses issues, le texte qui raconte ce qu'un choix a produit. En tout, 925 chaînes d'issue.
Le procédé dominant du corpus : un paragraphe, puis une à trois phrases isolées sur des lignes détachées, qui font sonner la chute. Je l'appelle la coda. Ce qui l'a rendue attaquable, c'est une définition opérationnelle : dans les données, la coda, c'est tout ce qui suit le premier saut de ligne d'un texte. À partir de là, elle se compte. Au départ : 539 issues sur 925 en portaient une, 58,3 %. En signes : environ 33 000 dans les issues, 4 000 de plus dans les intros. Trente-sept mille signes de chutes qui sonnent.
L'outillage d'abord, aucune data touchée
Le premier commit de la passe ne modifie pas un seul texte. Il construit l'outil : un extracteur qui sort les chaînes joueur des fichiers de données vers un corpus à clé stable, et un injecteur qui les remet en place par remplacement d'octets, sans jamais re-sérialiser le JSON. Ce détail n'est pas de l'élégance gratuite : le dépôt était partagé, une autre session livrait la carte vivante sur les mêmes fichiers pendant que je réécrivais les textes. L'injection ne touche que ses propres octets ; l'indentation, l'ordre des clés et la ligne voisine qu'une autre session vient d'éditer ne bougent pas. L'aller-retour est prouvé en quatre temps, dont un mode qui réécrit tout le corpus et vérifie l'identité à l'octet, et un sabordage.
En face, un auditeur mesure en lecture seule : longueurs par type de texte, part de coda, et surtout le « coût de lecture d'un événement joué », calculé comme le joueur le vit : une intro médiane, tous les libellés, une issue médiane. Pas la somme du corpus : le vécu.
La mesure corrige l'intuition
Première tranche : 366 textes réécrits, la coda tombe de 58,3 à 28,2 %. Et première surprise, citée du commit : « Le gain n'est pas où je l'attendais, et c'est la mesure qui le dit. La médiane ne bouge que de 228 à 208 ; le P90, lui, tombe de 449 à 279. » Le commit suivant en tire la règle : « Le joueur ne décroche pas sur une médiane, il décroche sur le pire écran de la soirée. » Le pire écran du jeu passera de 65 secondes de lecture à 35.
La suite est un sprint mesuré : douze commits en 67 minutes le deuxième matin, un lot réécrit, réinjecté, vérifié et commité toutes les cinq minutes environ. La coda descend par paliers, 14,4 %, 11 %, 7,4 %, 3,6 %, et le commit du palier à 11 % note honnêtement : « Le gain tombe à 11 %, et c'est l'information. » Le gisement se tarissait, la mesure le disait avant l'ennui.
La passe a aussi refusé une cible. L'auditeur proposait une médiane d'issue à 130 signes ; elle n'a jamais été atteinte, et c'est documenté : « en dessous de 190, l'issue cesse de dire ce que le choix a coûté, et c'est tout ce qu'elle a à dire. » La médiane finale : 192. Les cibles étaient annotées « proposées, pas actées » dans le code de l'auditeur ; celle-là est restée une proposition.
Ce que mes titres exagéraient
En recomptant tout dans les données pour écrire ces lignes, j'ai aussi mesuré mes propres commits. Le titre du lot des intros annonce « moitié moins de mots » ; la mesure dit moins 30 % (13 729 mots vers 9 608 ; en signes, 76 480 vers 53 236), et le corps du commit, plus honnête que son titre, disait déjà moins 30. Ce qui a vraiment été divisé par deux, c'est le maximum : la plus longue intro passe de 618 à 270 signes. Même prudence sur le chiffre totem : « les 925 issues » du commit de clôture est une couverture d'audit, 86 événements sur 86 jugés, plus une coda nulle part ; les textes réellement réécrits sont 688.
Zéro est un résultat
Le lot de clôture laisse le fichier à zéro coda. Et la discipline a tenu : depuis la passe, treize événements et soixante et une issues sont entrés dans le jeu, le fichier en compte aujourd'hui 986, toujours sans une seule coda. Un commentaire de l'auditeur garde la trace d'un dernier piège : la mesure faisait tomber le rapport précisément le jour où un type de texte atteignait zéro, parce que zéro était traité comme une absence de donnée. « Zéro coda est un résultat, pas une absence de donnée. »
Tout n'est pas tombé sous la règle. Les épilogues de fin de voyage, eux, gardent leurs lignes détachées : ils se lisent une fois par voyage, à l'arrivée, au moment où le joueur veut justement qu'on lui raconte. Le commit qui les épargne le dit : « couper là, ce serait appliquer la cible sans la comprendre. »
La leçon
J'aimais mes codas. C'est exactement pour ça qu'il fallait les compter avant de les juger : un procédé d'écriture qu'on aime est un procédé qu'on ne voit plus. La mesure a dit ce qu'il pesait, trente-sept mille signes, le pire écran à une minute de lecture ; la réécriture a rendu chaque chute au paragraphe qui la méritait ; et la règle ne survit que parce qu'elle reste comptée sur tout ce qui entre depuis.