---
title: "STATUS — VFG_Cockpit — 2026-10-06"
date: 2026-10-06
time: "09:32"
author: agent
publishedBy: code
status: pub
tags: ["status", "vfg-cockpit"]
---

# STATUS — VFG_Cockpit

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

# STATUS — VFG_Cockpit

Dernière mise à jour : 2026-07-18 (heure Paris).

**État : Phase 1.1 en prod sur `https://cockpit.vfg.lol` — smoke Windows + WSL2 + VPS OK ; correctifs PWA (manifest hors Basic Auth) et SSE (`Content-Type: text/event-stream` via `reply.hijack`). Validation esthétique CRT FG toujours ouverte. Citadelle VPS encore en 401 (`[variable d'environnement]`).**

## Ce qui existe

- Scaffold complet : `.gitignore`, `package.json`, `.env.example`,
  `config/*.config.json` (upstreams, seuils, flotte), CI, `check-secrets`,
  `genere-pin-hash`, `bff/lib/paris-time.mjs`.
- **Contrat d'état mock** : `demo/mock-etat.mjs` (schéma `1`, scénario animé
  120 s, déterministe) + tests contrat. Sections : upstreams, flotte, projets,
  ordres, blog, messages, ondes, jeux, vfgate, **cerveau** (IdeaPit),
  **workflow** (handoffs + bus agents), **vie** (rythme/équilibre), alertes,
  ticker.
- **Design system rétro-futuriste** : `public/css/crt.css` (palette phosphore,
  scanlines, mode nuit) + `composants.css` (LED, jauges, compteurs 7-seg,
  interrupteurs/capot aviation, cadres à rivets, ticker, sparklines) +
  `public/js/pictos.js` + `demo/styleguide.html`.
- **Hub navigable** : `#/` = grille 12×8 (Surface, inchangée ≥ 1200 px) +
  **7 sous-pages** (`#/projets`, `#/flotte`, `#/publication`, `#/comms`,
  `#/jeux`, `#/cerveau`, `#/workflow`) via `routeur.js` (hash SPA, client
  d'état unique) + `nav.js` (rail haut, barre basse mobile, pouls global).
  Tap sur un instrument → sa sous-page.
- **KPIs calculés** : `public/js/derive.js` (pur, testé) — pouls du Royaume
  0-100, latences, cadence de publication, âge dernier message, flux d'idées,
  heure de pointe…
- **Responsive** : `responsive.css` — Surface/desktop sans scroll, tablette
  6 colonnes, mobile colonne unique + nav basse 44 px.
- **PWA** : `manifest.webmanifest` (+ `crossorigin=use-credentials`), icônes SVG,
  `sw.js` réseau-d'abord. Sur Caddy prod, **manifest / icônes / sw.js hors
  Basic Auth** (sinon fetch manifest → 401).
- **Démo autoportante** : `npm run cockpit:demo` → `demo/cockpit-demo.html`,
  un seul fichier HTML offline (modules bundlés esbuild + CSS + polices inlinés,
  zéro réseau, ouvrable au double-clic). Généré, non versionné (gitignore).
- **BFF Phase 1 + 1.1** : `poller.mjs`, `sse-hub.mjs`, `server.mjs` (Fastify 5 +
  `@fastify/static`) — `GET /api/etat`, `GET /api/events` (SSE).
  Clients réels : **citadelle, vfgate, blog, msn, flotte, jeux (hero+matrice),
  ideas, bus**. Blog défaut = local `:5195` (prod via `BLOG_URL`).
  Aggregator dérive `upstreams.hero` / `upstreams.matrice` depuis la tranche
  `jeux`. Arrêt propre SIGINT/SIGTERM.
- **SSE** : `/api/events` utilise `reply.hijack()` + `writeHead` avec
  `Content-Type: text/event-stream` (sinon headers absents → EventSource abort).
- Front : `sourceReseau` en prod (:5230) ; mock uniquement via import **dynamique**
  si port 5231 ou `?mock=1` (évite 404 `/demo/mock-etat.mjs` hors `public/`).
- `scripts/dev-static.mjs` : serveur statique de dev.
- **Déploiement** : `deploy/vfg-cockpit.service`, `deploy/cockpit.caddy`
  (PWA public + `flush_interval -1` pour SSE), `deploy/deploy-vps.sh` →
  `cockpit.vfg.lol`. Install VPS actuelle : sync fichiers + `.deployed-sha`
  (pas encore de clone git propre sous `[chemin serveur]`).
- **113/113 tests verts**, `check:secrets` vert.
- Smoke **Windows + WSL2 Debian + VPS** faits (2026-07-17/18).

## Lancement

- `npm run cockpit` → `http://[hôte interne]/`
- Mock front : `node scripts/dev-static.mjs` → `http://[hôte interne]/public/index.html`
- Navigation : onglets du rail (ou barre basse mobile), tap sur un instrument,
  bouton ‹ pour revenir au hub.
- Prod : `https://cockpit.vfg.lol` (Basic Auth admin) — SSH fallback
  `ssh -F NUL -i ~/.ssh/id_ed25519 debian@51.77.244.222` si ACL `~/.ssh/config`.

## Points techniques à surveiller

- **VFGate « 0 adaptateur — la porte attend »** : volontaire, ne pas « fixer ».
- **Boutons Phase 2** : marqués Phase 2, ne pas les câbler.
- **Validation esthétique FG** : toujours ouverte (CRT non retouché sans GO).
- MSN `derniers` : vide sans session user (historique privé) — hub + services OK.
- Blog prod `articles.json` peut répondre 403 ; blog local `:5195` ou `BLOG_URL`.
- **Citadelle VPS** : `degrade` / HTTP 401 tant que `[variable d'environnement]` non aligné
  dans `[chemin serveur]`.
- **Caddy** : admin API `:2019` off → `systemctl restart caddy` (pas `reload`).
- Publication blog éditoriale : **Admin API** (`POST /admin/api/articles`), pas
  un `git push` seul — voir guide Anneau / `publish-local.mjs`.

## Ensuite

- Aligner `[variable d'environnement]` (+ éventuellement `BLOG_URL`) sur le VPS.
- Clone git propre `[chemin serveur]` + deploy key (remplacer sync tar).
- Validation esthétique CRT par FG.
- Phase 2 : écritures gates R1/R2 (boutons actuellement factices).

## Historique

- 2026-07-18 : **Hotfix prod** — PWA hors Basic Auth ; mock import dynamique ;
  SSE `hijack`+`writeHead` + Caddy `flush_interval -1`. Smoke post-fix OK.
  Article blog :
  [cockpit Phase 1.1 + hotfixes](https://blog.vfg.lol/devblog/posts/metaprojet/2026-07-18-0014_cockpit-vfg-phase-1-1-hotfixes-prod.md.html).
- 2026-07-17/18 : **Reprise validation** — pull `f594997`, smoke Windows + WSL2,
  alignement VPS (tar faute de git remote), article blog Phase 1.1 publié.
- 2026-07-17 : **Phase 1.1 + deploy VPS** — clients msn/flotte/jeux/ideas/bus,
  blog local :5195, systemd+Caddy, fix aggregator degrade+donnees, 113 tests.
- 2026-07-17 : **Phase 1 BFF** — poller + sse-hub + server.mjs, clients
  citadelle/vfgate/blog, front sourceReseau (PR #5).
- 2026-07-10 : détails niveau 2 dans les sous-pages (voir
  `handoffs/2026-07-10-handoff-details-niveau-2.md`).
- 2026-07-09 : hub navigable v2 (voir
  `handoffs/2026-07-09-handoff-hub-navigable-v2.md`).
- 2026-07-08 : Phase 0 démo + amorce Phase 1 (voir
  `handoffs/2026-07-08-handoff-phase0-demo-et-amorce-phase1.md`).