---
title: "STATUS — JahMessenger-admin-v2-e — 2026-10-07"
date: 2026-10-07
time: "09:31"
author: agent
publishedBy: code
status: pub
tags: ["status", "jahmessenger-admin-v2-e"]
---

# STATUS — JahMessenger-admin-v2-e

_Article généré automatiquement depuis le STATUS.md de JahMessenger-admin-v2-e — 2026-10-07. Les chemins locaux, les hôtes internes et les noms de variables ont été neutralisés._

# STATUS

## Session

> **06/10 ~03:50 — Admin : on feuillette les cartes, une à la fois.** [Handoff](handoffs/2026-10-06-0350-cloture-admin-design-v2.md). Quatre lots sont sur `main` : coquille [#356](https://github.com/FGDidou/JahMessenger/pull/356), villages [#357](https://github.com/FGDidou/JahMessenger/pull/357), soirées et ponts [#358](https://github.com/FGDidou/JahMessenger/pull/358), exploitation [#359](https://github.com/FGDidou/JahMessenger/pull/359). Invitations, comptes et maintenance ([#360](https://github.com/FGDidou/JahMessenger/pull/360)) ont été fusionnés dans la branche coquille, pas dans `main` : [#361](https://github.com/FGDidou/JahMessenger/pull/361) les ramène. **Live inchangé 4.0.24.** Pas de tag, pas de déploiement (runners off). **R2 non coché.**

> **06/10 ~02:30 — 4.0.24 EN LIVE : hotfix papillon déployée à la main, vu de ses yeux.** [Handoff](handoffs/2026-10-06-0230-deploy-4024-live.md). Chaîne **hors CI** (runners off) : release 4.0.24 ([#348](https://github.com/FGDidou/JahMessenger/pull/348) fusionnée) + [#347](https://github.com/FGDidou/JahMessenger/pull/347) (trace) → **image `ghcr.io/fgdidou/jahmessenger:4.0.24` @ `sha256:445cb5ab…`, construite sur le VPS** (le poste n'a pas Docker), poussée GHCR (PAT FG `write:packages`), **sondée à l'écart** (`/readyz` 4.0.24) puis `bash deploy.sh jah 4.0.24 --backup` : backup `jah-20261006-001959`, voile posé avant l'arrêt, hub *Healthy*, `/readyz` **4.0.24**, repli armé vers 4.0.23. **Sonde externe** : `/readyz` 4.0.24, `/ws` 401, `RestartCount=0`, `LogConfig` json-file/10m/3 (OPS-09). **Maintenance posée/levée en live** pour la mue (chenille → cocon → papillon). **Issue [#343](https://github.com/FGDidou/JahMessenger/issues/343) fermée.** **Notif didou + Telegram** envoyée (ingress, `notify_telegram:true`, relais VFGate confirmé). **Article** [4.0.24 : déployer à la main, et voir le papillon](https://blog.vfg.lol/devblog/posts/vfjah/2026-10-06-jah-deployer-a-la-main-4-0-24.md) (catalogue 736). ⚠️ **PAT FG à révoquer** (passé par le chat).

> **06/10 ~01:50 — Suite du dispatch : preuve BUG-PAPILLON sur le clone, AUDIT-QG clos, worktrees qualifiés, BLOG-01/02 publiés.** [Handoff](handoffs/2026-10-06-0150-suite-dispatch-1006.md). **BUG-PAPILLON** (#344 déjà sur `main`) : **preuve visuelle sur le clone prod** — chenille → cocon → papillon pendant un arrêt de maintenance, et bandeau « Reconnexion… » **sans** overlay hors maintenance ; chemin réel `server.close()` → `realtime.shutdown()` exercé (les signaux n'aboutissent pas par TerminateProcess sous Windows → harnais local). Captures 1280×800 + 390×844 → `handoffs/captures/2026-10-06/` + `preuve-papillon.json` ; **issue [#343](https://github.com/FGDidou/JahMessenger/issues/343) prête à fermer**. **AUDIT-QG** : **P-04 clos** (0 `dead-export`, cliquet à zéro) ; **P-06 confirmé** (11 lectures / 0 écriture) ; **batterie unité+intégration rejouée Node 24.19 — 1068 tests, 1066 ✓, 0 ✗, 2 skip** ; addendum daté dans REGISTRE + SYNTHESE. **Worktrees** : inventaire **corrigé** (le `merged` du 05/10 testait le HEAD du dépôt, toujours « oui ») → 10 worktrees à commits uniques, décision proposée (retirer 13, conserver `t1b`+L08+racine) ; 2 worktrees non protégés sauvés par refs. Retrait = **action FG (§14)**. **BLOG-01/02 publiés** : [ciblé ≠ FULL](https://blog.vfg.lol/devblog/posts/vfjah/2026-10-05-jah-cible-ne-vaut-pas-full.md) + [Retours](https://blog.vfg.lol/devblog/posts/vfjah/2026-10-05-suivre-tes-retours.md) — catalogue **735**, flux **476**, pages **HTTP 200** ; RAPPORT **0/0** (divergence levée).

> **06/10 ~01:27 — Ordonnanceur : sync propre, BUG-PAPILLON livré (PR #344), HYGIENE fait.** [Handoff](handoffs/2026-10-06-0127-session-ordonnanceur-1006.md). **V0 sync** : local divergé `19/1` et 17 fichiers sales → `0/0` propre sur `origin/main` (`6339f4d`) ; hybride (restes `jah-tools` + skills) mis de côté en stash, rien d'unique perdu. **BUG-PAPILLON** : cause = `shutdown()` fermait toujours `reason:'restart'` ; **rouge d'abord** (`actual 'restart' / expected 'maintenance'`) puis correctif `src/realtime/realtime.mjs` ; porte PR verte (1068 tests, 0 échec, 2 skip env) ; **PR [#344](https://github.com/FGDidou/JahMessenger/pull/344)** (issue [#343](https://github.com/FGDidou/JahMessenger/issues/343)), CI non exécutée (workflows off). **HYGIENE** : worktrees **48 → 17**, branches **89 → 27** (63 purgées) ; L08 préservé ; pièges ignorés (`.metrics`, `.claude`, logs) sauvés dans `../_hygiene-preserved-1006/` ; `.tools` (133 Mo Node portable) non copié (re-téléchargeable). Reste : fusionner #344, qualifier les 15 worktrees non fusionnés. **Clôture (06/10 ~01:29)** : **#344 fusionnée par FG pendant la session** (merge `fd3111a`, correctif sur `main`, pas encore déployé) ; **#345 `CLEAN`, en attente de fusion FG** ; issue #343 à fermer après vérification ; article possible inscrit au handoff (pas de mandat).

> **06/10 ~01:00 — Clôture session (outillage visuel + blog + dispatch).** [Handoff](handoffs/2026-10-06-0100-cloture-session-1006.md). Résumé : plan dispatchable ([#333](https://github.com/FGDidou/JahMessenger/pull/333), file 4.1.0 remise vraie) ; **hub + matrices de priorités + nav partagée + instantané régénérable** ([#334](https://github.com/FGDidou/JahMessenger/pull/334)–[#338](https://github.com/FGDidou/JahMessenger/pull/338)) ; **D1 tranché = GitHub privé → dépôt dédié `jah-tools`** ([#339](https://github.com/FGDidou/JahMessenger/pull/339), pointeur [#340](https://github.com/FGDidou/JahMessenger/pull/340)) ; **article publié** [Le worktree était un détour](https://blog.vfg.lol/devblog/posts/metaprojet/2026-10-06-0054_le-worktree-etait-un-detour.md). **0 PR ouverte.** Prochaine action : dispatcher les P0 `BUG-PAPILLON` ∥ `HYGIENE`.

> **06/10 — Outillage visuel sorti vers un dépôt dédié (`jah-tools`).** Décision FG **D1 = GitHub privé**. L'outillage d'organisation (hub, matrices de priorités, kanban des lots, « où on bute », état des vues STAB) vit désormais dans **jah-tools** (https://github.com/FGDidou/jah-tools, privé ; dépôt voisin) — retiré de JahMessenger par [#339](https://github.com/FGDidou/JahMessenger/pull/339). Ici : pointeur [`docs/plans/outillage-deplace.md`](docs/plans/outillage-deplace.md) + `npm run tools`. Écrire dans `jah-tools` désormais : `npm run boards` (instantané), `npm run metrics`, `npm run stab-vues`. **JahStyle** (design) rejoint le même espace de travail VS Code (`JahMessenger.code-workspace`) pour homogénéiser l'aspect.

> **06/10 — Outillage agents : deux séances « hors voie normale » outillées (hors produit).** Ajout de deux paires **skill + agent** découvrables (skill `.agents/skills/<nom>/SKILL.md`, agent `.github/agents/<nom>.agent.md`), sans aucun code produit ni dépendance (§12).
> **`clone-prod-local`** (+ agent `Jah Cloneur Prod`) : monte un Jah local sur une **copie jetable des données de prod** (village PTR « à la main ») — mesure, copie **lecture seule** du backup + `files` de `jah-hub-1`, mot de passe local, piège **CRLF** des migrations, démarrage sur `data/clone-prod/`, sonde `/readyz`, connexion, destruction. **Prouvé en réel le 06/10** : Jah **4.0.23** local sur backup `jah-20261005-215910-142.db`, connexion `fg@jah` OK, vrais contacts/salons visibles.
> **`local-player`** (+ agent `Jah Joueur Local`) : joue dans l'interface locale à la place de FG via les outils navigateur (cliquer, écrire, naviguer, capturer), **local seulement**, sans secret, un geste vérifié à la fois, bug = reproduction (pas correctif).
> Indexés dans `.agents/README.md`, `CLAUDE.md`, `AGENTS.md`, `.cursor/rules/jah-core.mdc`. **[PR #337](https://github.com/FGDidou/JahMessenger/pull/337)** (brouillon, base `main`, mode CI `affected`). Lint vert (1363 fichiers). [Handoff](handoffs/2026-10-06-0030-cloture-skills-agents-clone-player.md).

> **Plan dispatchable (05/10) :** [`docs/plans/plan-2026-10-05-dispatch-parallele.md`](docs/plans/plan-2026-10-05-dispatch-parallele.md) — lots priorisés pour agents parallèles. Constat : **48 worktrees** pour ~4 chantiers utiles ; **21 branches déjà fusionnées** ; la file 4.1.0 marquait `pret` 7 lots déjà live (corrigés en `livre` ce jour). **P0 = `BUG-PAPILLON` (overlay de maintenance, test rouge d'abord) ∥ `HYGIENE` (recycler worktrees/branches).** Gelé : train 4.1.0 (L07/L08/L09/L10) et portes humaines. PR #332 = superseded (à fermer). Un agent = un lot = **un worktree réutilisé**.

> **Consigne FG du 05/10 — ménage :** quota Actions de 2000 minutes épuisé ; les dix workflows sont désactivés manuellement (état GitHub vérifié). FG effectue toutes les fusions de cette passe. L’agent prépare les lots et preuves locales, sans réactiver les workflows, lancer un run, créer un tag ou déployer. Aucun vert local ne vaut préprod runner. Nouvelle instruction FG : issues CI/CD et métriques de runs mises de côté pendant cet arrêt.

> Avancement : [PR #326](https://github.com/FGDidou/JahMessenger/pull/326) documentaire fusionnée par FG (06ff944) ; sauvegardes vérifiées. Reprises de releases immutables intégrées par #327 (df64a81). Archives intégrées par #329 (7c263b7). Concurrence et garde d’état reprises dans une PR locale regroupée, avec bilan du ménage. Porte locale sur la reprise finale : 602 unitaires réussis, zéro échec, deux contrôles Docker non exécutés ; lint/audit verts en 38,8 s. Restitution des 16 worktrees modifiés et 35 fichiers vérifiée. #317 fermé sur preuve existante. 33 worktrees et 31 branches retirés après preuve ; 48 worktrees conservés. Root sale et L08 inchangés ; junctions et fichiers ignorés non qualifiés conservés. [Handoff de reprise](handoffs/2026-10-05-menage-reprise-locale.md). [Répartition local/cloud proposée](docs/plans/plan-2026-10-05-relais-local-cloud.md) : local récupération/M3/ménage, cloud C1/C2 intégré par #330, scopes exclusifs ; compression des PR cohérentes autorisée par FG, une PR à la fois. #230/#312/#313 réconciliées et fermées ; #316 clôturée ; #318 ouverte jusqu’à fusion M3 ; #319 ouverte pour Q-I différé, Q-G cloud intégré par #330.

> **05/10 — Issues CI-flux / préprod en pause** (#312–#315) : label `pause:ci-minutes`, fermées `not_planned` (runners off). PAT cloud documenté dans [`docs/plans/cloud-pat-droits.md`](docs/plans/cloud-pat-droits.md) (Issues R/W prouvé ; Actions pas encore). Attente plan agent « Bilan » pour travail parallèle hors CI.

> **05/10 — Outillage : skill `hotfix-hors-ci` déposé (hors produit).** Séance d'hotfix prod **sans CI/CD** documentée en skill complet (`.agents/skills/hotfix-hors-ci/SKILL.md`) : autorisation FG (porte §14 serveur), mesure d'état, gate locale, image sondée à la main, `deploy.sh jah <v> --backup`, `/readyz`, retour arrière. **Aucun déploiement effectué à ce stade** (4.0.23 déployée juste après, cf. entrée ci-dessous). [Handoff](handoffs/2026-10-05-2337-skill-hotfix-hors-ci.md). Lint vert (1352 fichiers).

> **05/10 ~23:43 — `hotfix-hors-ci` Track A exécutée : 4.0.23 en live (deploy manuel, runners off).** Autorisation FG (« déploie à la main »). Mesures : live **4.0.22**, hub `jah-hub-1` healthy, `jah.deployed`=4.0.22 (repli), image 4.0.23 **absente** du serveur, GHCR **privé** (`unauthorized`). `compose.yml` serveur **sans** OPS-09 → `scp` des 5 fichiers `ops/*` (5 empreintes SHA256 serveur = locales). `docker login ghcr.io` (jeton `gh` `read:packages`, piped) → `bash deploy.sh jah 4.0.23 --backup` : pull digest `sha256:6a625e5f…` (= manifeste), backup `jah-20261005-214254-588.db`, voile, hub *Healthy*, `/readyz` **4.0.23**, re-`up` → `docker logout`. Sonde externe : `/readyz` **4.0.23**, `/ws`+Origin **401**, CSP conforme ; `RestartCount=0`, pas de boucle. **OPS-09 désormais appliqué en prod** (`json-file`/`10m`/`3`). Repli = `bash deploy.sh jah 4.0.22`. [Handoff](handoffs/2026-10-05-2343-deploy-manuel-4023-live.md).

> **05/10 — À VÉRIFIER (mandat du relais, non tranché) : l'overlay « papillon » de maintenance ne s'affiche pas pendant une mise à jour.** Constat par **lecture du source (pas une mesure)** : un `deploy.sh` pose le voile par la **CLI** (processus séparé, hub non notifié) puis **redémarre** (`reason: 'restart'`) ; côté client, `events.mjs:197` ne montre l'overlay que si `reason === 'maintenance'`, et `realtime.mjs:130` met `reconnecting` (bandeau) pour un `restart` — comportement **voulu** pour un arrêt propre (testé). Donc l'habitant voit « Reconnexion… », jamais chenille → cocon → papillon. Chemin complet + pistes A/B/C dans le handoff. **Prochaine action : test rouge d'abord** (scénario pose CLI + restart), ticket `bug-prod`. Ne pas livrer de correctif sans rouge reproduit.

> **05/10 ~23:59 — Agent `Jah Déployeur Hors-CI` testé en réel ; 4.0.24 bloquée (jeton GHCR read-only).** Agent créé (`.github/agents/jah-deployeur-hors-ci.agent.md`). Test : aller-retour **4.0.23 → 4.0.22 → 4.0.23** vert sur `jah.vfg.lol` (retour arrière **prouvé**, EXIT=0 chaque étape) ; garde **fail-closed** prouvée (`deploy.sh jah 4.0.24` → `unauthorized`, EXIT=1, prod intacte). **4.0.24 non déployée : elle n'existe pas** — pas de bump, pas de tag, pas d'image. Et **publier une nouvelle image est impossible** : le jeton `gh` n'a que **`read:packages`** (sonde `docker push` → `permission_denied`). Un vrai test 4.0.24 exige `write:packages` (décision FG, §14) + un contenu de version. Live inchangé **4.0.23**. [Article publié](https://blog.vfg.lol/devblog/posts/vfjah/2026-10-06-0003_jah-deployer-a-la-main-quand-la-ci-est-morte.md) (blog vfjah, catalogue 730, dérive 0/0). **Ping Telegram : non envoyé** — aucun jeton dans la session (`TELEGRAM_NOTIFY_*` absent, VFGate 401, FG_Pulse 4330 éteint) → **repli fichier** `_ssot/monitoring-events.jsonl` (rattrapable). [Handoff](handoffs/2026-10-05-2359-test-agent-deployeur-4024.md).

| | |
| --- | --- |
| **Porte machine** | Live **4.0.24** (06/10, **deploy manuel hors CI**) : correctif BUG-PAPILLON promu à la main. `/readyz` **4.0.24** ; image `ghcr.io/fgdidou/jahmessenger:4.0.24` @ `sha256:445cb5ab…`. Backup `jah-20261006-001959` ; repli `deploy.sh jah 4.0.23`. **OPS-09 appliqué** (`json-file` / `10m` / `3`). Campagne STAB 13/13 en 4.0.22. **TodoStatut** : BLOG-01/02 **publiés** ; issue **#343 fermée**. #246 reste ouverte pour **OPS-02** (sauvegardes hors serveur). |
| **Porte V2** | Post-STAB autonome terminé : quatre PR #322–#325 fusionnées ; tag **v4.0.23** sur main, FULL **1332/1332, zéro skip**, image préprod publiée sous hold. [Preuve](docs/plans/preuves/2026-10-05-post-stab-v2/manifest.json), [run](https://github.com/FGDidou/JahMessenger/actions/runs/37288280186). Aucun deploy CI ; **promue en live par deploy manuel** (05/10) ; live **4.0.23**. OPS-09 vérifié runner **puis appliqué en prod**. |
| **Live** | `v4.0.24` (06/10 : correctif BUG-PAPILLON, **deploy manuel**) — `/readyz` **4.0.24**. Précédents : 4.0.23, 4.0.22, 4.0.21, 4.0.20. |
| **File machine (agents)** | STAB prod **13/13** tous `livre` en live (00–10). Vague 5 file 4.1.0 : **OPS-09** `livre` (**deploy manuel** 05/10) ; L08 `wip-local` (ne pas toucher). |
| **Hors live** | L08 (`JahMessenger-L08`) ; stash AUDIT. PRs dormantes fermées : #262, #264, #278. **Canal Telegram agent→FG à réparer** (jetons locaux 401 ; §14). |
| **Pont ops** | Gate appliqué ; #172 en `main` ; preuve DM Telegram→Jah = Lot 2 (auto) ; **rotator token reporté** (rappel ci-dessous, non bloquant) — `docs/plans/fond-2026-10-01.md` |
| **Humain dormant** (pas de ping ; agent gère rappels) | **Rappel rotator** bot (ordre FG 01/10 : FG un jour) ; **rappel vote DA V5** avatars A/B/C (gelé) ; œil 4.0.8 ; R2 / soirée / cutover ; allumages Lundi/Bal/Crieur/push **restent off** jusqu’à phrase « allume X » (pas de sollicitation) ; Boum allumée (0021) ; F1–F11 / Q9-05 / Q10 |

**05/10 — Campagne STAB 13/13 en live 4.0.22.** STAB-10 métriques ([#305](https://github.com/FGDidou/JahMessenger/pull/305)) : modes CI, coût des relances, lots campagne ; viewer `docs/metrics/etat.html` ; fix main rouge tags (`fetch-tags`). FULL `eb6592e` vert → release `v4.0.22` (preuve parent FULL) → deploy [37266429140](https://github.com/FGDidou/JahMessenger/actions/runs/37266429140). `/readyz` **4.0.22**. REGISTRE anomalies STAB → `ferme`. Relais : [handoffs/2026-10-05-0510-cloture-stab10-live-4022.md](handoffs/2026-10-05-0510-cloture-stab10-live-4022.md).

**05/10 — Audit + captures clôture (Cursor Cloud).** Instantané stab-vues **4.0.22 / 13/13**, métriques strict, kanban, PNG sous `handoffs/captures/2026-10-05/`. Audit global qualité / exécution / agentique : [chemin local] _(réservé version locale)_. Handoff : [handoffs/2026-10-05-0720-audit-cloture-campagne-stab.md](handoffs/2026-10-05-0720-audit-cloture-campagne-stab.md). Blog public `/jah-stab-vues` encore à republier (hors porte).

**05/10 — STAB-09 en live 4.0.21.** Mesure d'abord (HUD 250 ms travaillant onglet caché) → correctif ([#298](https://github.com/FGDidou/JahMessenger/pull/298)) → FULL `e7456e8` vert → release `--ci-verified`. Deux rouges préexistants qualifiés au passage (`stab-vues` environnement-dépendant, `.catch` d'un test d'appels). Live **4.0.21**. Suite : STAB-10 (cloud) — **fait** en 4.0.22.

**05/10 — PR-B en live 4.0.20 (handoff `interrompu`).** [#287](https://github.com/FGDidou/JahMessenger/pull/287) fusionnée ; FULL vert `74be1aa` ; release `--ci-verified` ; deploy Release [37254532148](https://github.com/FGDidou/JahMessenger/actions/runs/37254532148) **success** ; `/readyz` **4.0.20**. Leçon agents [#291](https://github.com/FGDidou/JahMessenger/pull/291). Relais : [handoffs/2026-10-05-0215-prb-release-interrompu.md](handoffs/2026-10-05-0215-prb-release-interrompu.md).

**05/10 — Chantier CI flux (hors porte STAB).** Plan SSOT [`docs/plans/ci-flux-preprod-light.md`](docs/plans/ci-flux-preprod-light.md) (lots 1–8) — **lot 0 livré** : [#301](https://github.com/FGDidou/JahMessenger/pull/301) fusionnée (`fbf85ae`). Clôture session [`handoffs/2026-10-05-0652-cloture-session-ci-flux-preprod-light.md`](handoffs/2026-10-05-0652-cloture-session-ci-flux-preprod-light.md). **Relais remplacé par V2** : aucune collecte de stabilité ni skip dans FULL ; voir le plan de récupération et ménage du 05/10.

**05/10 — TodoStatut blog `a-publier`.** Articles prêts dans Jah (branche `cursor/article-cible-ne-vaut-pas-full-da50`) : méthode [ciblé ≠ FULL](docs/articles/2026-10-05-jah-cible-ne-vaut-pas-full.md) + produit [Retours](docs/articles/2026-10-05-suivre-tes-retours.md) ; brouillon CI flux [`2026-10-05-jah-ci-flux-preprod-light.md`](docs/articles/2026-10-05-jah-ci-flux-preprod-light.md). Prochaine passe : `node scripts/post.mjs … --live` depuis RAPPORT (sans push auto).

**05/10 ~03:40 — clôture session (outillage visu + lecture).** Hors porte machine, aucun code produit. Page publique [blog.vfg.lol/jah-stab-vues](https://blog.vfg.lol/jah-stab-vues) scindée en **état live** (régénérable, `npm run stab-vues`) + **instantané 04/10 conservé** (vues 1–8). `scripts/stab-vues.mjs` + 6 tests verts. Dépôt local resynchronisé : `main` était divergé (ahead 1 périmé / behind 34) → réaligné sur `origin/main` `19a7287`, sauvegarde sur `backup/main-99d3b6a-2026-10-05` ; remote fantôme `cloud-agent-notes` purgé. **Inventaire du travail laissé en worktree** : 74 worktrees, **24 avec du travail**, **14 avec commits non fusionnés**, 10 branches au remote supprimé — audit rejouable [chemin local]. Aucun nettoyage fait (§14). Relais : [handoffs/2026-10-05-0340-cloture-stab-vues-inventaire.md](handoffs/2026-10-05-0340-cloture-stab-vues-inventaire.md).

**05/10 ~20:30 — PÉRIMÈTRE OUTILLAGE VISUEL (hors produit), clôture WIP.** À lire comme une **zone à part du dev produit Jah** : ce lot ne touche que les **vues d'avancement**. Générateurs : `npm run stab-vues` (état live + compteurs CI + **instantané daté 05/10** : tags réels × lots par version) et `npm run chantier-lots` (kanban depuis les files). Blog à jour : `/jah-stab-vues` (instant 05/10, 04/10 archivé), `/jah-lots`, hub + **carte de l'outillage** `/prototypes/apercus/2026-10-05-cartographie-outillage-visuel.html`. Constat : **3 « chantier des lots »** dont 2 manuels jamais mis à jour → un **dépôt parallèle dédié** est la réponse. **PR [#304](https://github.com/FGDidou/JahMessenger/pull/304)** (instantané + carte, diff additif). **Prochain handoff : créer le repo parallèle dédié à ces outils** et y déplacer `scripts/{stab-vues,chantier-lots,metrics*}` + pages + tests ; JahMessenger ne garde qu'un pointeur. Relais : [handoffs/2026-10-05-2030-cloture-wip-outillage-visuel.md](handoffs/2026-10-05-2030-cloture-wip-outillage-visuel.md).

**Qualité** : Q0 [#69](https://github.com/FGDidou/JahMessenger/pull/69), Q1 [#72](https://github.com/FGDidou/JahMessenger/pull/72), Q2 [#73](https://github.com/FGDidou/JahMessenger/pull/73), Q3 [#70](https://github.com/FGDidou/JahMessenger/pull/70), Q4 [#71](https://github.com/FGDidou/JahMessenger/pull/71), Q5 [#74](https://github.com/FGDidou/JahMessenger/pull/74), Q6 via [#78](https://github.com/FGDidou/JahMessenger/pull/78) (#77 fermée), Q7 [#78](https://github.com/FGDidou/JahMessenger/pull/78), Q8 [#75](https://github.com/FGDidou/JahMessenger/pull/75), Q9 [#76](https://github.com/FGDidou/JahMessenger/pull/76), J6-05 [#80](https://github.com/FGDidou/JahMessenger/pull/80), lint Q5 [#81](https://github.com/FGDidou/JahMessenger/pull/81).

**Qualité** : Q0 [#69](https://github.com/FGDidou/JahMessenger/pull/69), Q1 [#72](https://github.com/FGDidou/JahMessenger/pull/72), Q2 [#73](https://github.com/FGDidou/JahMessenger/pull/73), Q3 [#70](https://github.com/FGDidou/JahMessenger/pull/70), Q4 [#71](https://github.com/FGDidou/JahMessenger/pull/71), Q5 [#74](https://github.com/FGDidou/JahMessenger/pull/74), Q6 via [#78](https://github.com/FGDidou/JahMessenger/pull/78) (#77 fermée), Q7 [#78](https://github.com/FGDidou/JahMessenger/pull/78), Q8 [#75](https://github.com/FGDidou/JahMessenger/pull/75), Q9 [#76](https://github.com/FGDidou/JahMessenger/pull/76), J6-05 [#80](https://github.com/FGDidou/JahMessenger/pull/80), lint Q5 [#81](https://github.com/FGDidou/JahMessenger/pull/81).

## Session post-STAB V2 — autonome, production retenue

Instruction FG : [plan V2](docs/plans/plan-2026-10-05-post-stab-leger.md). V2 clôturée : #322–#325 fusionnées, tag v4.0.23, FULL et image verts au premier essai ; prod **retenue en 4.0.22** à la clôture V2, **promue ensuite en live** par deploy manuel (**4.0.23** le 05/10, **4.0.24** le 06/10 — bandeau Session, [handoff 0230](handoffs/2026-10-06-0230-deploy-4024-live.md)). Live actuel = **4.0.24**. V1 archivée ; aucune porte humaine ajoutée.

| Lot | Besoin | Représentation | Contrainte | Action | Preuve | Récompense |
| --- | --- | --- | --- | --- | --- | --- |
| A (Vérifié préprod) | PR moins coûteuses | Plan CI/jobs | FULL tag main ; hold | Adapter outils/règles | Contrats rouges puis verts + runner | Fusion courte fiable |
| B (Vérifié préprod) | Logs bornés | Compose hub | Aucun serveur modifié | Rotation 10m × 3 | Résolu + inspect runtime | Stockage borné après promotion |
| C (Prouvé) | Parcours démontré | Tag/SHA/digest/runs | Même artefact ; live 4.0.22 à la clôture V2 | Préparer, fusionner, taguer | FULL + image préprod + manifeste | Preuve récupérable sans FG |

Périmètre A : scripts check/ci-plan/release/tag-proof, workflows CI/release/image/promotion/deploy, tests de contrat et règles associées. Aucun code produit ni nouvelle dépendance. A : #323 fusionnée, run 37284420072 court + préprod verts, FULL skipped. Périmètre B : ops/compose.yml, preuve avant/après, notes et relais ; aucun serveur modifié. Critère B : logging résolu et effectivement appliqué à json-file / 10m / 3 sur runner. #246 reste ouverte jusqu’à production.

## Live

`https://jah.vfg.lol/readyz` = **`4.0.24`** (06/10 : correctif BUG-PAPILLON, **deploy manuel hors CI** — [handoff](handoffs/2026-10-06-0230-deploy-4024-live.md)). Image `ghcr.io/fgdidou/jahmessenger:4.0.24` @ `sha256:445cb5ab…`. Backup `jah-20261006-001959` ; repli `deploy.sh jah 4.0.23`. **OPS-09** (`json-file` / `10m` / `3`). Précédents : 4.0.23, 4.0.22, 4.0.21, 4.0.20. Histoire : `CHANGELOG.md`, `CHANGELOG-USER.md`, `docs/plans/archive/2026-09/`.

## Portes ouvertes

| Porte | État |
| --- | --- |
| Machine (produit) | Néant : S0–S19 machine en prod (S11 inclus). Restent S15-03/04 et S16 sur ordre FG |
| R2 phases 4–6 | Humain, après usage réel (compteurs Admin → Portes R2) |
| Soirée test / cutover | Humain (README) |
| Qualité | Q0–Q9 machine fusionnés ; Q9-05 / Q10 / F1–F11 hors scope |

## Mécaniques du §10 (six maillons)

Tous les maillons ci-dessous sont **Livré** sauf mention. Aucun « Concept ». F7 (déplacer hors STATUS) : décision FG.

| Mécanique | Besoin | Représentation | Contrainte | Action | Preuve | Récompense |
| --- | --- | --- | --- | --- | --- | --- |
| Wizz / duel (§10.2) | Signe à distance | Fenêtre, ⚡, combo | Secousse ; silence heures calmes | Rendre en 2 min | Serveur marque rendu | DUEL ; styles/badges |
| Accueil Wizz (Ann. B) | Se sentir attendu | didou + Wizz | Un geste montré | Rendre à didou | Une fois / compte | Souvenir + toast |
| Fou rire (§10.3) | Rire ensemble | Puces + badge | 3 rieurs / 10 min | Réagir 😂 | Compte distinct | Pluie + souvenir |
| GIFothèque (§10.3) | Blagues du cercle | Onglet ♥ | Village seulement | Partager / garder | Accès voisin | Fans |
| Amitié (§10.1) | Lien sans compter | Pousse / jardin | Réciprocité, plafond | Se répondre | Serveur, plafonds | Palier + Lulu |
| Styles Wizz (§10.2) | Jouer, pas harceler | Menu ▾ / badges | Déblocage rendu | Rendre | Styles refusés sinon | Emotes |
| Clins d'œil / Lulu (§10.4) | Geste sans écrire | Anim 2–3 s | Paliers | Envoyer | Serveur | Lulu à deux |
| Monde (§10.7) | Se retrouver | Place, maisons | Village honnête | Marcher, bulle | Autorité serveur | Croiser les siens |
| Ondes / fils / jardin | Vie sans spy | Onde, fil, plante | Double accord | Écrire / montrer fil | Trames inspectées | Fil / jardin |
| Gestes sync | Tope-là | Invite + étincelles | 2 cases, 2 s | Tope-là, câlin, danse | Distance + fenêtre | Amitié |
| Bonne nuit / papillon | Partir sans frein | 🌙, chenille | Résumé, pas reproche | Bonne nuit | Session close | Papillon |
| Quêtes IRL (§10.11) | S'entraider IRL | Tableau | Pas de push | Confirmer croisé | Membres seuls | Objet + étincelles |
| Rituels (§10.6) | RDV sans pression | Kiosque, carte | Caché jusqu'à l'heure | Répondre / signer | Horloge simulée | Révélation |
| Rassemblement | Trace collective | Cercle 📸 | ≥3, 60 s | Entrer le cercle | Serveur compte | Photo + cadre |
| Le Lundi | Sourire lundi | Nuage | Dissipe au 10ᵉ moment | Vivre ; ranger | Horloge | **Éteint** (admin) |
| Boîte à idées | Enrichir banques | `#quete`… | 10/j ; FG range | Écrire à didou | Étiquette + auteur | Merci privé |
| Robot Crieur | Nouvelles voisines | Tricorne / `#gazette` | Source + 280 car. | Lire / taire | Sources FG | **Éteint** (admin) |
| Talents (§10.12) | Reconnu sans score | 🌟 / ailes | Réciprocité | Vivre moments | `talent_log` | Titre + S12 |
| Étincelles / chantiers | But commun | Terrains | Pas de solde perso | Moments + vote | Trace moment | Lieu ouvert |
| Objets-souvenirs | Garder moments | Chambre | Visiteur = membre | Poser / offrir | Serveur | Cadeau = moment |
| Activités (§10.5) | Rire à deux | Menu / Arcade | Bornes grisées | Inviter / jouer | Tours vérifiés | Carte-souvenir |
| Perles / capsules / fantômes | Histoire | Musée, coffres | Accord / date / seul | Proposer / sceller | Muet avant | Cérémonie |
| Bal masqué (ph. 8) | Devinettes | Masques 30 min | ≥3 ; 1/j | Ouvrir / deviner | Garde hub | **Éteint** (admin) |
| Jam Scène | Musique à plusieurs | Micro + notes | Silence 20 s → repos | Jouer | Débit / blocage | Partition |
| Boum vendredi | Soirée récurrente | Disco 21–23 h | Allumée 0021 | Danser / ranger | Heure + village | **Allumée** |
| Lac | Moment d'il y a 1 an | Ponton | À deux | Pêcher | Tiers exclus | Carte |
| Cinéma | Album ensemble | Écran | Projectionniste | `cinema.slide` | Schéma + fuzzing | Rire |
| Serre | Amitiés anciennes | Fleurs | À soi ; ≥1 an | Visiter | Tiers exclus | Fleurs |

Appels (§11 ph. 7) : six maillons **Livré** (besoin → récompense) — voir CHANGELOG ph. 7.

## Critères d'acceptation finaux (SPEC §15)

| # | Critère (résumé) | Machine | FG |
| --- | --- | --- | --- |
| 1 | Deux téléphones + PC : invitation → appels, push, PWA | E2E phases 1–7 ; live alpha.13 | Soirée réelle |
| 2 | Monde honnête (bulles, ondes, fils, village endormi) | `monde*.test`, E2E ph. 4 | Feeling village vide |
| 3 | Village : étincelles, chantier, objets | `village.test`, E2E ph. 5 | Premier chantier R2 |
| 4 | Quête IRL confirmée croisée | `quetes.test`, E2E ph. 6 | 5 quêtes R2 |
| 5 | Import legacy + « Il y a un an » | `import` / bascule (tests) | Cutover données réelles |
| 6 | Bonne nuit ; pas de push jeu | intégration + E2E | Compteur R2 Bonne nuit |
| 7 | Redémarrage sans perte / vague toasts | ops / backup / E2E | Constat live |
| 8 | Checklist §8 + `npm audit` sans haute | CI FULL | — |
| 9 | Charte §2 couverte | table §2 ci-dessous + tests | — |
| 10 | Tags v4.x.0 GHCR réversibles | release → GHCR | Tags stables S15-04 |
| 11 | Look MSN + monde (captures) | artefacts PR | Œil produit |

## Charte de jeu (§2)

| Règle | Où c'est tenu |
| --- | --- |
| 1 Réciprocité | Wizz rendus ; amitié = réponses ; styles au rendu |
| 2 Rien ne se perd | Scores / paliers / déblocages ne baissent pas ; plante s'endort |
| 3 Pas de classement | Aucun score affiché ; palier privé au fil |
| 4 Pas de pression lecture | `chat.read` → ses appareils seulement |
| 5 Consentement à deux | GIF / fil : double accord |
| 6 Calme par défaut | Heures calmes ; Occupé coupe le son Wizz |
| 7 Tous les âges | Grand confort partout (monde compris) |
| 8 Toujours une sortie | Jeux rangeables ; messagerie reste |
| 9 Pull par défaut | Push seulement DM / Wizz / @ / appel adressés |
| 10 Session terminable | Bonne nuit ; assoupissement 30 min |
| 11 Jamais de faux vivant | Hors ligne = hors ligne ; démo assumée |
| 12 Loot plutôt que karma | Pas de monnaie ; étincelles collectives |
| Préambule | Toast MDP hérité non bloquant ; Nouveautés à la demande |

## Couverture checklist §8

| Point | État |
| --- | --- |
| 1–7 | Livré (XSS/CSP/sessions/CSRF/mdp/invitations/autorisations) — tests + E2E |
| 2 CSP | Écart validé : `trusted-types jah-sw` (pas `'none'`) |
| 8 Entrées | Plafonds ph. 1–6 ; rituel **280** (pas 500 du SPEC) |
| 9–12 | Fichiers, GIF sans SSRF, fuzzing, fermé par défaut |
| 13 Vie privée | Logs sans contenu ; export/suppression ; Q1 [#72](https://github.com/FGDidou/JahMessenger/pull/72) : file ponts, rétention, pouls/capsules vs bloqués ; GC fichiers **réel** depuis 4.0.6 (DQ11 levé, #183) |
| 14–20 | Backups, CI/préprod, autorité monde, frontières, blocage monde, preuves quête, bulles |

## Actions humaines requises (FG)

Détail des préparations machine : `docs/plans/suite.md` §5 et fiches S15/S16 (actives) ; closes en `archive/2026-09/`.

1. Secrets serveur / `DEPLOY_*` : **posé** (27/09). Ponts : README › Brancher les ponts.
2. DNS `jah` : **fait**. `jah-pre` reporté.
3. Coturn / STUN : prêt éteint — README › Allumer le TURN (S10).
4. Relire banques (quêtes, questions, Lundi, Crieur, bal) et allumer ou non.
5. Dessin Lulu (5 PNG) ; recalibrage après un mois (S15-03).
6. Tags stables v4.x.0 (S15-04) ; S16 sur ordre.
7. Copie backups hors serveur (hebdo) ; `restore-check` mensuel.
8. Veille prod : configurée (#64), workflow désactivé avec les autres sur consigne FG du 05/10.
9. Boum : **allumée** (0021) ; éteindre via Admin si besoin.
10. **Qualité (§5 `qualite.md`)** — décisions FG du **29/09** :
    - **CN-04B** : *on accepte* — un diff de docs reste en mode `lint` ; le job « Lint seul »
      couvre déjà les liens et les chemins cités. Ne pas modifier `ci-plan.mjs`.
    - **Exports morts (W3)** : les 148 avertissements du 29/09 sont une mesure historique.
      Lint du 05/10 : 1351 fichiers vérifiés, aucun constat ; ne pas reprendre ce compteur comme dette active.
    - **Node 24** : poste vérifié en 24.19.0 le 05/10 ; cloud C1/C2 en 24.21.0.
    - **Teaser** : *on le garde* (`docs/teaser/`, hors image Docker).
    - **R4** (branches/worktrees morts) : **fait** le 29/09.
    - F1 `[variable d'environnement]` ; F2 erratum SPEC (`docs/plans/qualite-spec-erratum.md`) ;
    F3 `docs/runbooks/` vs README long ; F5 `typescript` en dev (Q9-05) ;
    F6 qui fusionne ; F7 six maillons hors STATUS ;
    F8–F11 (Q10) : villages client, retirer message, démo prod, rôle `visiteur`.
    - **Contenus** : FG relit au fur et à mesure ; un **mode interne de validation des textes**
      proposés est à prévoir (à cadrer — nouvelle fonctionnalité, donc Q10).
11. Q9-05 / Q10 / §7 : listés dans `qualite.md` — **pas démarrés** ici. Ce qui reste côté machine
    (R2 sur décision « on nettoie », R3 et R4 faits, R5 sur accord Node 24, R6, doubles) :
    `docs/plans/archive/2026-09-30/suite-2026-09-29.md` (R1–R6, archivé) ; version sans jargon : `archive/2026-09-30/reprendre-en-simple.md`.

## Liste de mise en service (`jah.vfg.lol`)

Un seul hôte (décision FG 26/09). Caddy → loopback `:5240`. Live = **v4.0.24** (06/10 ; correctif BUG-PAPILLON, **deploy manuel hors CI** — [handoff](handoffs/2026-10-06-0230-deploy-4024-live.md)). Cutover : README › Cutover. Soirée test : README › Soirée test.

## Plans

Relais produit 04/10 (STAB live 4.0.18) : `handoffs/2026-10-04-2315-cloture-session-jah-stab.md`. Relais outillage visu : `handoffs/2026-10-04-2316-cloture-outil-visu-avancement.md`. Pack agentique : `handoffs/2026-10-04-2108-pack-agentique-local.md`.
Relais du 03/10 : `handoffs/2026-10-03-1805-cloture-v4.0.16-tipis.md` (tipis en 4.0.16 ; article [Place en tipis](https://blog.vfg.lol/devblog/posts/vfjah/2026-10-03-la-place-en-tipis.md)). File 4.1.0 : `docs/plans/plan-2026-10-03-suite.md` ; état : `docs/plans/lots/file-4.1.0.json` (vague 5 : OPS-09). File STAB : `docs/plans/lots/file-stabilisation-4.0.x.json` (alignée live 4.0.18 à la reprise 05/10).
V5 / JahStyle : clôture integrate [`handoff-2026-10-01-2326-cloture-kimi-v5.md`](docs/plans/handoff-2026-10-01-2326-cloture-kimi-v5.md) (relais [`0706`](docs/plans/handoff-2026-10-01-0706-kimi-v5-relais.md)) — [JahStyle](https://github.com/FGDidou/JahStyle) ; porte humaine : **vote DA V5 étape 3** (ouverte).
File prioritaire : [STAB reprise 05/10](docs/plans/plan-2026-10-05-stab-prioritaire.md) ; train 4.1.0 reporté pendant stabilisation : `docs/plans/plan-2026-10-03-suite.md` (état : `docs/plans/lots/file-4.1.0.json`) ; `fond-2026-10-01.md` ne garde que la vague C (VFGate). Périmés le 01/10 : `docs/plans/archive/2026-10-01/fond-2026-09-30.md`, `docs/plans/hotfix-2026-09-30.md`.
Méthode : `docs/plans/discipline-livraison.md`. Relais ponts : `docs/plans/handoff-2026-10-01-ponts-identifiants.md` (H1).
Actifs : `docs/plans/lots/`, `docs/plans/README.md`, `suite.md`, `suite-S15.md`, `suite-S16.md`, `qualite.md`, `ci-tests.md`. Closes : `docs/plans/archive/2026-09/`, `archive/2026-09-30/`, `archive/2026-10-01/`.

Méga-dossier des audits, revues et rapports : [chemin local] (index _(réservé version locale)_). Campagne audit v2 (docs, SHA `408d8e8`) : [chemin local] — [PR #85](https://github.com/FGDidou/JahMessenger/pull/85) **fusionnée** ; re-vérification livrée : `contre-revue/RAPPORT-REVERIFY.md`. Cadres #84 (analyse) et #82 (revue croisée V) **fusionnés** ; teaser vidéo [PR #79](https://github.com/FGDidou/JahMessenger/pull/79) **fusionnée** (`scripts/teaser/`, hors image). Restent ouverts côté FG : N-01 CN-04B (`ci:full` vs diff docs) et runtime Node ≥24. Note CI : deux flakes E2E sous charge (S12-02, R7-07) — R7-07 corrigé ([#87](https://github.com/FGDidou/JahMessenger/pull/87)), S12-02 non reproduit.

**05/10 — Clôture V2** : [handoff](handoffs/2026-10-05-post-stab-v2-execution.md). SHA edf06586c622dc10fedfb388c7f8134ecb7e3c0c ; digest sha256:6a625e5fb4e3d47de82b4e54320f377b6650e1bc7bf1c57459874db179feebf2. Compose résolu et Docker effectif : json-file / 10m / 3. Publication de preuve en prerelease ; production non déployée, aucune action FG requise pour la V2.


**05/10 — Récupération et ménage autorisés, en cours.** [Plan](docs/plans/plan-2026-10-05-recuperation-menage.md), inventaire sauvegardé _(réservé version locale)_. Production retenue ; aucun nouveau tag.