TL;DR
Le teaser de Jah — cliquez sur l'image pour ouvrir le guide illustré et sa vidéo de 3 min 18.
Quatre jours après le brief initial, Jah Messenger est en ligne en v4.0.0-alpha.10 sur
jah.vfg.lol, avec 21 migrations, 905 cas de test déclarés, 856 fichiers suivis par
le lint et cinq dépendances runtime en tout et pour tout.
Ce qui vient de se passer : une campagne d'audit v2 a relu le dépôt, ses docs et le live ; elle a produit une trentaine de constats, dont aucun P0 ; la revue croisée et la contre-revue indépendante ont rejoué les constats un à un ; un second agent a produit une re-vérification finale ; et le dernier flake E2E connu a été corrigé (#87).
Ce qui reste : une décision FG bloquante (un label CI qui ne gagne pas sur un diff de docs), 148 exports morts qui attendent un cliquet, et une liste de relectures humaines (contenus, allumages, ton des événements) qui ne se cochent jamais depuis un agent.
Ce qui n'est pas vrai, autant le dire tout de suite : aucun vrai habitant n'a encore utilisé Jah. Les portes R2, la soirée test et le cutover du village restent ouvertes, et c'est très bien.
Ce que cet article complète : un guide illustré — le teaser vidéo de 3 min 18 et vingt captures du vrai produit, prises par les tests de bout en bout.
1. Où en est Jah, en une minute
https://jah.vfg.lol/readyz répond {"status":"ready","version":"4.0.0-alpha.10"}.
| Repère | Valeur vérifiée le 2026-09-29 |
|---|---|
| Live | v4.0.0-alpha.10 |
| Commits | 630 |
| Pull requests fusionnées | 84 |
| Fichiers suivis par le lint | 856 |
| Cas de test déclarés | 905 |
| Fichiers de test | 84 unitaires, 51 d'intégration, 45 E2E, 1 perf |
| Migrations | 21 |
| Dépendances runtime | 5 |
| Lignes de code | ~17 600 (src/), ~23 400 (ui/), ~21 000 (test/) |
| PR ouvertes | aucune |
Le projet a démarré le 25 septembre. Il a aujourd'hui quatre jours.
Les 84 PR se répartissent ainsi sur ces quatre jours : 3 le 25, 31 le 26, 15 le 27, 21 le 28,
14 le 29. Trois signatures dans le git log : FG (les fusions), des sessions Claude, et un agent
Cursor — plus, depuis peu, GitHub Copilot.
Ce qui a été livré depuis le récit « du brief à la prod » du 27 septembre :
- les neuf lots de qualité Q0 à Q9 : vie privée, robustesse, client, serveur, docs, outillage ;
- la suite S0 à S19 de tout ce qui restait à faire, portée par des vagues d'agents en parallèle ;
- les quatre nouveaux lieux : Observatoire, Lac, Cinéma, Serre ;
- le mini-jeu J1–J6, la réparation R0–R7, le teaser vidéo de 3 min 18 ;
- dix versions alpha successives, chacune déployée par la CI jusqu'à
/readyz.
Le guide illustré suit le même plan : le teaser vidéo et vingt captures du vrai produit, écran par écran.
2. Le guide visuel : le teaser et vingt captures
Tout est dans blog.vfg.lol/vfjah : le teaser vidéo de 3 min 18 et vingt captures du vrai produit, prises à 1280×800 par les tests de bout en bout du projet — aucune maquette, aucune retouche.
La vidéo
La vidéo fait 40 Mo : elle ne pèse pas sur chaque lecture d'article, elle vit dans le guide. Cliquez sur l'image, ou ouvrez blog.vfg.lol/vfjah.
Entrer

Parler

Le monde

La vraie vie

Les rituels

Les quatre nouveaux lieux

L'état réel

Le guide suit l'ordre dans lequel on découvre Jah :
| Section du guide | Ce qu'on y voit |
|---|---|
| Entrer | la carte d'invitation et son QR, la connexion MSN, le bureau |
| Parler | une conversation privée, un salon, le fou rire collectif |
| Le monde | le village en jeu, la carte avec son zoom, les bâtiments |
| La vraie vie | le tableau des quêtes IRL, un rassemblement, « Ma page » |
| Les rituels | « Bonne nuit », un appel vidéo, Jah Live |
| Les nouveaux lieux | Observatoire, Lac, Cinéma, Serre |
| L'état réel | les Nouveautés, et le tableau de ce qui est éteint |
Deux points de méthode, parce qu'ils disent quelque chose du projet.
D'abord, la vidéo n'est pas dans l'article. Le moteur du blog échappe volontairement tout HTML
brut : une balise <video> sortirait en texte. Le teaser vit donc dans une page autonome, servie
par la même machine, à côté de ses propres assets — et l'article y renvoie. Bonus : les 40 Mo ne
pèsent pas sur chaque lecture d'article.
Ensuite, ces assets sont montés en statique, pas servis par le handler générique du serveur.
Celui-ci lit le fichier entier en mémoire à chaque requête : 40 Mo par affichage, pas de requêtes
Range — dont un lecteur vidéo a besoin pour se déplacer — et un type MIME faux
(application/octet-stream, parce que sa table ne connaît pas .mp4). Trois défauts qu'un montage
statique corrige d'un coup, et qui auraient été invisibles en local sur un fichier de test léger.
3. Ce que le produit sait faire, aujourd'hui
Le détail vit dans CHANGELOG-USER.md, écrit « comme à des amis ». En résumé, ce qui est
allumé et utilisable : le cœur MSN (contacts, fenêtres, Wizz, salons), le village persistant
(avatars, place, jardins, chantiers, objets-souvenirs), les appels audio/vidéo, le push, la PWA,
les quêtes IRL à confirmation croisée, les rituels (question du dimanche, « Il y a un an », Bonne
nuit), les talents, le mini-jeu, Ma page façon Skyblog, les visites entre villages, Jah Live,
le Lac, le Cinéma, la Serre, l'Observatoire, et la Boum du vendredi.
Ce qui est livré mais éteint, volontairement :
| Éteint | Pourquoi |
|---|---|
| Le Lundi | FG doit relire ses trois phrases avant de l'allumer |
| Le bal masqué | même raison, quatre phrases — et il attend que la garde de présence soit en place |
| Le Robot Crieur | attend qu'un voisin ait quelque chose à lui écrire |
| Les ponts Discord / Matrix / WhatsApp | « emménager avant d'enrichir » : après la soirée test |
| Le TURN pour les appels en 4G | prêt, éteint ; l'allumage est un acte serveur |
| La GC des fichiers supprimés | encore en dry-run par défaut — un constat d'audit confirmé |
C'est un choix, pas un retard : la charte dit « calme par défaut » et « jamais de faux vivant ». Un événement qu'on n'a pas relu reste éteint.
4. L'audit v2 : ce qu'il a trouvé
Une campagne d'audit en trois couches a relu le dépôt cette semaine.
- Une analyse préparatoire : catalogue de constats, contrats de vérification, prompt maître.
- Une campagne exécutée : inventaire fichier par fichier, fiches de preuve, relevés du live.
- Deux contre-revues : une machine (qui rejoue les constats dans le code) et une indépendante (lecteur distinct qui traite les rapports comme des hypothèses adverses), puis une re-vérification finale par un second agent.
Verdict global : aucun P0. Une trentaine de constats, dont plusieurs confirmés et corrigés en doc. Les plus intéressants :
| Constat | Réalité vérifiée |
|---|---|
STATUS citait encore alpha.9 alors que alpha.10 était en ligne | corrigé |
Un diff de docs reste en mode lint même avec le label ci:full | confirmé, documenté, décision FG |
| La GC des fichiers est en dry-run par défaut | confirmé |
/demo.html est servi en production alors que le SPEC dit le contraire | confirmé |
| 148 exports de fonctions jamais importées ailleurs | confirmé, non bloquant |
.agents/UI.md citait une exception périmée sur chat.mjs | corrigé |
Et le plus savoureux : la campagne d'audit ne passait pas son propre lint. Vingt et une
erreurs — chemins de lecteur Windows dans les rapports, liens relatifs morts, un fichier .md
sans saut de ligne final. Le lint maison refuse un chemin de poste dans la prose, et il avait
raison : un rapport daté qui cite l'arborescence de la machine qui l'a écrit n'aide personne. La
campagne a été assainie jusqu'à zéro erreur avant d'être considérée livrable.
C'est la meilleure illustration de la règle du dépôt : un contrôle qui ne s'applique pas à lui-même ne contrôle rien.
5. La qualité, close sur la machine
Neuf lots, tous fusionnés, chacun avec sa preuve :
| Lot | Ce qu'il a fermé |
|---|---|
| Q0 | La vérité des docs : STATUS à l'heure, plans archivés, index réparés |
| Q1 | La vie privée : compte supprimé, copies de DM chez les ponts, rétention |
| Q2 | La robustesse : connexion, minuteurs, reprise après coupure |
| Q3 | Le client et le réseau : reconnexion, premier écran, erreurs lisibles |
| Q4 | La CI : tests affectés, cache, couverture des aires |
| Q5 | L'exploitation : veille, backups, runbooks |
| Q6 | Le serveur : rangement des routes, factorisation |
| Q7 | Le client partagé : constantes du protocole, catalogue des souvenirs |
| Q8 | La documentation rationalisée |
| Q9 | L'outillage : ESLint, exports morts, observabilité |
Une chose importante à dire : docs/plans/qualite.md garde encore 57 cases [ ] alors que
les lots sont livrés. Ce n'est pas un mensonge, c'est un plan historique : un bandeau en tête
le dit, et recocher proprement avec la ligne Preuve : de chaque tâche est un travail de docs à
part entière. Il est désormais rangé comme tel.
6. Les chiffres de la sécurité et des tests
Les partis pris n'ont pas bougé :
- Cinq dépendances runtime, pas une de plus. Tout le reste — validation de schéma, rate-limit, migrations, lint, release, Web Push (RFC 8291/8292), nettoyage EXIF, QR code, moteur du monde — est écrit à la main.
- Tout est fermé par défaut : toute route
/apiexige une session, toute mutation un jeton CSRF, et une route publique doit être marquée comme telle. - Aucune donnée réelle dans le dépôt ; la préprod travaille sur une copie anonymisée.
- Journaux sans contenu : ni message, ni jeton, ni cookie ; IP hachées avec un sel tournant.
- Un blocage est indiscernable d'une absence.
- Preuve par la mutation : pour chaque garde importante, on retire le correctif et on vérifie que le test échoue. Un test qui passe avec et sans le correctif ne prouve rien.
Les tests sont passés de 466 cas (27 septembre) à 905 cas déclarés aujourd'hui, dont 45 fichiers E2E joués à plusieurs navigateurs, un ordinateur et un téléphone côte à côte.
Et un aveu honnête : la batterie runtime complète n'a pas encore été certifiée sur Node ≥ 24 en local. La CI tourne bien en Node 24 sur chaque fusion ; la machine de FG est en Node 22. C'est noté comme un lot de reprise, pas caché.
7. Ce qui reste — côté machine
Six lots, rangés dans un plan de reprise (docs/plans/suite-2026-09-29.md) :
| Lot | Sujet | Bloqué par |
|---|---|---|
| R1 | Un label CI qui gagne sur un diff de docs | décision FG |
| R2 | Les 148 exports morts, en cliquet de trois PR | préférence FG |
| R3 | Recocher les fiches qualité avec leur preuve | rien |
| R4 | Ranger 3 branches et 15 worktrees morts | rien |
| R5 | Node ≥ 24 en local, puis runtime certifié | environnement |
| R6 | Les doubles A–B, en paire indépendante | disponibilité |
Les trois branches distantes restantes sont des vestiges : leur contenu est déjà dans main.
Le piège a été vérifié et évité — fusionner ce qui est déjà fusionné, ou pire, fusionner un
préfixe plus ancien, aurait été une régression silencieuse. Elles se suppriment, elles ne se
fusionnent pas.
8. Ce qui reste — et qui n'appartient qu'à FG
C'est la partie la plus importante de cet état des lieux. Un agent peut écrire du code, des tests, des migrations et des docs. Il ne peut pas décider à la place de FG :
- CN-04B — le label
ci:fullne gagne pas sur un diff de docs. Soit on change le code de planification, soit on l'assume et on le coche. Il faut choisir. - Le sort du teaser — 42 Mio de vidéo
mp4dans l'historique Git. À garder, à passer en LFS, ou à transformer en asset de release. - F1 —
JAH_SESSION_SECRETest exigé mais sans effet. À retirer, ou à transformer en poivre. - F2 — les écarts SPEC ↔ réel, listés et prêts dans un fichier d'erratum. Aucune décision n'y a été inventée.
- F10 — la démo est servie en production. 404 en prod, ou erratum du SPEC.
- F11 — le rôle
visiteur, remplacé dans les faits par les visites de la phase 8. - L'allumage du Lundi, du bal, du Crieur, des ponts, du TURN — après relecture du ton.
- Les tags stables
v4.x.0, quand « les portes sont passées ». - Le recalibrage d'amitié, d'étincelles et des coûts des lieux, après un mois d'usage réel.
- Les portes R2 : dix habitants qui ont dit « Bonne nuit », un premier chantier inauguré, cinq quêtes IRL confirmées.
Et la porte la plus importante de toutes, celle qu'aucun agent ne franchira : la soirée test, puis le cutover du village. Il n'y a pas encore eu un seul vrai habitant sur Jah. Tout ce qui est écrit ici décrit une machine prête — pas un jeu qui a vécu.
9. Ce que Jah n'est pas encore
Pour finir sur du vrai plutôt que sur du chiffre :
- Aucun usage réel. Pas un habitant, pas un message de famille, pas un chantier ouvert par un vrai village. Toutes les portes R2 sont ouvertes.
- Le vrai Lulu n'existe pas. Cinq PNG attendent le dessin de FG ; en attendant, Lulu est dessiné nœud par nœud en SVG.
- Les contenus attendent une relecture. Les 30 quêtes du cercle, les 100 questions du dimanche, les textes de didou et le ton des événements à risque — tout cela est écrit et testé, rien n'est relu par un humain.
- La préprod
jah-pren'existe pas. Un seul hôte aujourd'hui ; le DNS était prévu, il est reporté.
Ce qui est vrai en revanche : le dépôt dit la vérité sur lui-même. Il dit ce qui est en ligne, il dit ce qui est éteint, il dit ce qui n'est pas vérifié, et il refuse de cocher une porte qu'un agent ne peut pas constater. C'est ce qui rend le reste possible.
10. Où suivre ça
- Le site : jah.vfg.lol
- Le guide illustré et le teaser : blog.vfg.lol/vfjah
- Les nouveautés, écrites pour les habitants : le fichier
CHANGELOG-USER.mddu dépôt - Le récit du démarrage : l'article précédent de cette série, « Jah Messenger v4 : du brief à la prod en vingt-sept heures »
La suite se joue sur deux terrains : quelques décisions de FG, et une soirée test avec de vrais gens. Le reste est prêt.
