---
title: "STATUS — Chronowflow — 2026-10-03"
date: 2026-10-03
time: "03:36"
author: agent
publishedBy: code
status: pub
tags: ["status", "chronowflow"]
---

# STATUS — Chronowflow

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

# Fil (Chronowflow) — STATUS

## POC GitHub JahMessenger — 30 septembre 2026

**Worktree :** `[chemin local]` · branche `poc/github-jahmessenger`.  
**Plan :** [PLAN-POC-GITHUB-JAH-2026-09-30.md](docs/PLAN-POC-GITHUB-JAH-2026-09-30.md) ·
[handoff L0→L6](handoffs/2026-09-30-handoff-poc-github-jahmessenger.md).

Lots **L0→L6** livrés dans le worktree (adaptateur GitHub, capture, Carte digression, chaleur, stub Hero).
Source **`github` → `live`** après preuve `FGDidou/JahMessenger` (35 événements REST, token `gh` en
session, sans secret logué).
**Preuves exécutées ce jour (worktree) :** `npm test` **358/358 PASS** (lot initial) · tests ciblés
`sources`/`monitor` **19/19 PASS** (post-live) · `tsc` **0** · `eslint` **0** ·
`npm run build` **PASS** (+ `/api/github`, `/api/hero`). **Branche poussée** `poc/github-jahmessenger`
· tag POC annoté (voir handoff).

**Statut :** **On y reviendra** — POC commit `736a968`, tag **`poc`**, branche poussée ; merge vers `main`
demandé (voir handoff). Worktree conservé.

**Prochaine action FG :** reprendre depuis tag `poc` ou branche `poc/github-jahmessenger` ; recette UI plan §5 ;
redémarrer Fil `:4477` si besoin après `main` à jour.

## Dette résiduelle — close (17 septembre 2026)

**Plan :** [dette résiduelle agents légers](docs/PLAN-DETTE-AGENTS-LEGERS-2026-09-16.md) — §5 **tous
lots clos / worktrees nettoyés**.
**Clôture :** [handoff orchestration](handoffs/2026-09-17-handoff-orchestration-dette-cloture.md).
**Vague 3 :** [handoff](handoffs/2026-09-16-handoff-orchestration-dette-vague-3.md).

**Dette résiduelle close** côté orchestration : lots E1–E7 intégrés ; registre worktree =
seul `Chronowflow` ; handoffs cleanup e2…e6b sur `main`. Branches `dette/*` et
`presentable/*` orphelines (`-d` refusé, pas de `-D`). Dossiers disque résiduels possibles.
**Aucun push.** `npm test` non rejoué à la clôture.

**Prochaine action FG :** trancher `-D` sur orphelines et/ou supprimer dossiers `Chronowflow-e*` ;
sinon usage courant.

La section « À traiter » plus bas est **historique** (15 septembre) : le tableau §3 du plan fait foi.

## Finalisation personnelle — 16 septembre 2026

**Plan courant :** [trois lots essentiels](docs/PLAN-ESSENTIEL-VERSION-PRESENTABLE-2026-09-16.md).
**Suivi :** [handoff d'intégration](handoffs/2026-09-16-handoff-presentable-integration.md).
Le [plan initial](docs/archives/PLAN-REFLEXION-VERSION-PRESENTABLE-2026-09-16.md) est archivé pour réflexion.
Usage personnel, version maintenue à `0.4.0`, aucun push ni publication dans ce lot.

Le LAN existant est intégré. Base remesurée : **309 tests PASS**. Une installation propre a révélé
un verrouillage `cn` incohérent : corrigé, puis `npm ci` réussi dans le worktree de validation.
Les preuves finales des trois lots sont consignées dans le handoff, sans confondre fixtures navigateur,
lecture Git réelle et transport de présence VFG.

### Preuves exécutées — vérification du 16 septembre 2026

| Périmètre | Contrôles réellement exécutés | Résultat |
| --- | --- | --- |
| `main` après intégration des lots | `npm test` | **309/309 PASS** · 0 échec · 0 ignoré |
| idem | `npx next typegen` puis `npx tsc --noEmit` | exit **0** (obligatoire : `.next/types` périmé après suppression de routes) |
| idem | `npx eslint src tests scripts` | **0 erreur / 0 avertissement** |
| idem | `npm run build` | **PASS** · **9 routes** (`/`, `/_not-found`, `blog`, `chronos`, `flows`, `git`, `journal`, `pulse`, `telegram`, `debug/flux`) |
| Preuve captation (fixtures + chaîne vivante) | `node tests/capture.browser.mjs` | **PASS — 11 assertions** |
| Recette autonome (sans VFG) | `node tests/presentable.browser.mjs` | **PASS** — 5 interceptions, workflow, panne/reprise, mobile |
| Lecture Git réelle | `GET /api/flows?days=7&repos=…` | **65 items** · `chronos=up/21` `pulse=up/6` `git=up/40` · références **identiques** au `git log` réel |
| Origines dev | `isCsrfOriginAllowed` de Next.js | `127.0.0.1`, `localhost`, IP LAN **autorisés** ; hôte inconnu **bloqué** |
| **Transport de présence VFG** | `node tests/workflow.browser.mjs` + `PRESENCE_EMITTER` réel | **PASS — 2 assertions, EXIT 0** |
| idem — traversée | `GET :4344/v1/events` après émission | événements `source: "vfgate"` · cycle `started → progress → completed` · `git_branch: main` |
| idem — spool | `%LOCALAPPDATA%\VFG\agent-presence` | **aucun `spool.jsonl`** : livraison directe, sans repli différé |
| **Agent natif réel observé** | `GET :4344/v1/query/agents/active` | session `claude-code`, `synthetic: false`, `RainbowPiano`, 33 outils |
| idem — ledger | `GET :4344/v1/events?limit=1000` | **132 événements**, **tous** `source: "vfgate"`, `device: "claude-code"` |
| idem — interface | vue **Présence**, capture navigateur | tuile `ACTIF`, client · 33 outils · dépôt · dossier · « activé il y a 4s », **aucune erreur JS** |

### Preuve de présence — ce qui est réellement prouvé

**A. Transport par le harnais** (session étiquetée `workflow-browser-<timestamp>`) :

- `node tests/workflow.browser.mjs` → **`PASS` sur les 2 assertions, `EXIT=0`** (création, brief, copie de
  secours, flux réel, liaison, résultat, rechargement, **retrait après rétention 60 s**, mobile, aucune erreur JS).
- Chronos expose les événements correspondants avec `source: "vfgate"` et le cycle de vie complet
  (`started` → `progress` avec `tool_count: 1` → `completed`). C'est la preuve que VFGate **a reçu et
  publié**, pas seulement renvoyé `200`.
- Aucun événement n'est resté en attente dans le spool : la livraison est directe.

**B. Observation d'un agent natif réel** — la preuve qui manquait, obtenue le 16 septembre 2026 :

| Fait mesuré | Valeur observée |
|---|---|
| Session | `e931043c-f98d-47fb-8975-6ee229ac6476`, `synthetic: false` |
| Client / device | `claude-code` (agent natif, pas le harnais) |
| Dépôt / branche | `RainbowPiano`, `main` — un autre dépôt que Fil |
| Volume | **132 événements**, `progress` 123 · `subagent.started` 4 · `subagent.completed` 4 · `started` 1 |
| Provenance | **132/132** portent `source: "vfgate"` et `device: "claude-code"` |
| État dans Fil | `ACTIF` puis `stale`, tuile avec **33 outils**, dossier réel, suggestion de liaison |

Fil a donc capté, classé et rendu l'activité d'un agent **réellement en train de travailler**, sans
aucune émission artificielle de cette session. La tuile affiche le client, le compte d'outils, le dépôt
et le dossier — exactement les champs attendus, et aucun autre.

**Ce qui reste non prouvé :** le rendu depuis un **second appareil physique**. La pagination Chronos est
partielle (1 000 événements lus, réponse bornée) : **132** est un compte observé sur cette fenêtre, pas
une garantie sur la totalité de la session.

### Piège réparé le 2026-09-16 — mode LAN et boucle locale

`npm run dev:lan` démarre Next sur `0.0.0.0`, qui devient le hostname de démarrage. Or Next.js 16
n'autorise d'office que `localhost` et `**.localhost` : `http://[hôte interne]` était donc **refusé**,
le websocket HMR recevait un 403 et la page restait figée sur « Chargement de ton espace… », **sans
erreur console**. `LOOPBACK_HOSTS` (`127.0.0.1`, `::1`) est désormais toujours déclaré dans
`allowedDevOrigins`. Vérifié dans un navigateur réel : les trois origines rendent l'application.

## Historique — reprise DeepSeek du 15 septembre 2026

[Plan détaillé par sous-tâche](docs/PLAN-REPRISE-DEEPSEEK-2026-09-15.md) : L1 tests obligatoires → L2 mesures Chronos → correction conditionnelle → L3 fusion → L4 retrait → L5 usage optionnel. Une sous-tâche active, lots séquentiels. Base observée `2b167ee` ; arbre propre avant ce dépôt documentaire. Aucun test ni service relancé pour ce plan. Prochaine action : **L1.1**. [Handoff de reprise](handoffs/2026-09-15-handoff-plan-reprise-deepseek.md).

Les SHA, écarts Git et PID dans les sections historiques ci-dessous ne constituent pas un état courant ; les relever à la reprise.

**Version**: 0.4.0  
**Tag historique**: `v0.4.0` local — publication distante non revérifiée ; ne contient pas les corrections personnelles courantes. Tags locaux : `v0.1.0-init-prompt-gen`, `v0.2.0`, `v0.4.0`
**Port**: 4477  
**Rôle**: captation des flux de travail existants (ranger · catégoriser · scorer · taguer · journaliser · surveiller) + mindmap chronologique  
**Package**: `fil@0.4.0`  
**Process docs**: [docs/PROCESS-DOCUMENTATION.md](docs/PROCESS-DOCUMENTATION.md) (mapping Rainbow → Fil, allègement volontaire)

État relu le **15 septembre 2026**. HEAD : `1e03088` (`refactor: retrait de l'alias mort pulseActHaystack`). Branche `main` : **+4** locaux vs `origin/main` (pas de push). *(Photo datée ; le 16 septembre, `origin/main...main` → `0 0`.)*

### Preuves exécutées (ce lot — refacto R0)

| Périmètre | Contrôles réellement exécutés | Résultat |
| --- | --- | --- |
| Refacto R0 (Tâches A et B) | `npm test` | **293/293 PASS** · 0 échec · 0 ignoré (baseline mesurée **279**) |
| idem | `npx tsc --noEmit` | exit **0** |
| idem | `npx eslint src tests` | **0 erreur / 0 avertissement** |
| idem | `npm run build` | **PASS** · **7 routes** (`blog` `chronos` `flows` `git` `journal` `pulse` `telegram`) |
| idem | `grep` duplication | `readJson` 4→**1** · `AbortController` 5→**0** · enveloppe 2→**1** · alias mort **0** |

**Non exécuté (décision de session) :** aucune preuve navigateur pour ce lot — comportement revu comme
neutre sur les seuls chemins lus et testés. Aucune mesure de latence.

### Preuves exécutées (prototype — usage réel)

| Périmètre | Contrôles réellement exécutés | Résultat |
| --- | --- | --- |
| Chaîne locale sondée | `Get-NetTCPConnection` sur 4477 / 4344 / 4330 / 5191 / 5210 | Fil · Chronos · Pulse · VFGate **écoutent** ; VFJah **libre** (conforme : `declared`) |
| `/api/flows?days=7&repos=…` | requête HTTP réelle | **63 items** · 3 sources `up` (chronos 20 · pulse 10 · git 36) · `mergedDuplicates` **3** · couverture `partial` |
| `/api/journal?days=7` | requête HTTP réelle | **7 jours calendaires** · jour courant 17 items · **10 repliés** (`excluded`) · couverture `partial` |
| **Parcours captation** | `node tests/capture.browser.mjs` | **PASS — 11 assertions** (rendu `860c184`) |
| **Boucle de travail** | `node tests/workflow.browser.mjs` + émetteur de présence réel | **PASS — 2 assertions**, retrait après rétention confirmé |

**Piège rencontré et réparé** : un `npm run build` lancé pendant qu'un `next start` tournait réécrit
`.next/static` avec de nouveaux hachages ; le processus en place continuait de servir un HTML construit
sur les anciens → **1 chunk en 404** → l'app restait sur « Chargement de ton espace… ». Arrêt du PID,
relance, contrôle **9/9 chunks en 200**. Voir
[handoff prototype](handoffs/2026-09-15-handoff-prototype-captation-prouve.md).

**`activeMinutes: 0` est honnête** : les actes Pulse sont repliés en `ambient` (comptés dans `excluded`)
et les items de travail (Chronos, git) ne portent aucune durée mesurée. Un item sans durée contribue 0.

**Errata — réconcilié par mesure :** `STATUS.md` annonçait **279** tests, le handoff D5 annonçait **259**.
La mesure donne **279** avant ce lot : le chiffre du handoff D5 était **périmé** (écrit avant l'ajout des
20 tests de `dedupe` / `flows-to-nodes`).

---

## Livré

- **Produit Fil 0.4.0** — P0/P1 du [plan prioritaire](docs/PLAN-PRIORITAIRE-2026-09-15.md) ; captation WP0→WP8 ([plan](docs/PLAN-CAPTATION-FLUX.md)) ; Flux / Journal / Santé sur instantané partagé ; fils nestés Carte + anti-doublon inter-sources.
- **Refacto R0 (lot courant)** — `src/lib/envelope.ts` + `src/lib/fetch-json.ts` ; supprime la duplication de décodage d'enveloppe, de `readJson` et des couples abort/timeout ; alias mort retiré. Plan : [docs/PLAN-REFACTO-R0-2026-09-15.md](docs/PLAN-REFACTO-R0-2026-09-15.md).
- **Tutoriels** — [WORKFLOW-BASIQUE](docs/WORKFLOW-BASIQUE.md) (porte d’entrée) · [WORKFLOW-COMPLET](docs/WORKFLOW-COMPLET.md).
- **POC `vfg-gate-trigger/`** — harnais d’observation hors `src/` (`--dry` / `--live` / `--presence`) ; étape plan 1 close ; docs AUDIT / PLAN / README / ARTICLE / HANDOFF.
- **Consignes agents** — `AGENTS.md` · `CLAUDE.md` · `.cursor/rules/00-fil.mdc` · skills `cw-boot` / `cw-verify` / `cw-handoff`.
- **Process documentation** — mapping Rainbow→Fil ; index titres devblog ; sections état / preuves / prochaine action FG alignées.
- **Devblog** — **huit** articles `status: ready` dans [`docs/devblog/`](docs/devblog/) (captation, chaîne présence, hygiène, ports, plan prioritaire, fils nestés, tutoriel deux étages, process Rainbow→Fil) ; [`vfg-gate-trigger/ARTICLE-BLOG.md`](vfg-gate-trigger/ARTICLE-BLOG.md) = renvoi ; index à jour (aucun titre « prévu » orphelin).

Détail todos historiques : tableau [Phase / todos](#phase--todos) plus bas.

---

## Vérifications

### Preuves exécutées (héritées — non rejouées dans le lot process-docs)

| Périmètre | Source | Verdict / mesure |
| --- | --- | --- |
| POC vfg-gate-trigger (dry + live `--presence`, helpers, syntaxe) | [`vfg-gate-trigger/VERIFICATION.md`](vfg-gate-trigger/VERIFICATION.md) — session ~16:36–16:38, révision **`c662246`** | **PASS** · `--dry` → `mock-only` · live présence → Chronos + Fil (`TROUVÉE`, `state=active`) |
| Produit Fil (fils nestés + anti-doublon) | [handoff](handoffs/2026-09-15-handoff-fils-nestes-antidoublon.md) | **279** tests · `tsc` 0 · eslint 0/0 · build PASS · navigateur (doublons fusionnés, fils visibles) |
| Plan prioritaire / captation | handoffs plan prioritaire + WP7/WP8 | Preuves datées dans chaque handoff (ne pas les recompter ici) |
| Boot VFG (lot process-docs) | `node scripts/dev-meta.js boot --project Fil` | exit **0** (2026-09-15T14:58:59Z UTC, clôture) |

### Non exécuté / non rejoué (ce lot process-docs)

- Rejeu `simulate-trigger.mjs` (dry/live) — on s’appuie sur `VERIFICATION.md` existant.
- `npm test` / `tsc` / `eslint` / `build` / Playwright Fil racine — **non relancés** pour l’alignement documentaire.
- Étapes plan POC **0.4 / 0.5** — hors ownership Fil / hors exécution ici. (**0.6** fait ailleurs — RainbowPiano `playwright.capture.config.ts` défaut `5183`, aligné `playwright.config.ts`.)
- Aucun `docs:check` / `docs:test` — **volontairement absents** du dépôt Fil ([process](docs/PROCESS-DOCUMENTATION.md)).

---

## À traiter

- **Refacto R0 — clos.** Trois lots commités, aucun push : `a2ff021` (plan) · `dfa2bee` (D4+D2/D3) ·
  `1e03088` (D6). Plan de référence :
  [`docs/PLAN-REFACTO-R0-2026-09-15.md`](docs/PLAN-REFACTO-R0-2026-09-15.md) — table de progression à
  jour, critère d'acceptation **corrigé après mesure** (le critère « diff négatif » du plan était faux :
  le lot remplace 11 définitions dupliquées mais ajoute des modules documentés et 14 tests).
- **Prochaine action FG (bloquant chaîne / hors Fil produit)** :
  1. **0.5** — Identifier le PID qui sert `:5191` (sonde clôture : `24972` = `node src/server.js`, health ok, `/settings/env` expose encore des clés runtime → pas encore le `main` masqué) ; arrêter puis relancer l’API depuis `[chemin local]` `main` (**pas** depuis le chantier Fil).
  2. **0.4** — Arbitrage humain : rotation des tokens exposés pendant l’audit (ne pas consignier de valeurs).
  3. Optionnel : smoke [filters/delete-all](handoffs/2026-09-15-handoff-fil-filters-delete-all.md) quand Fil `:4477` est up.
- **0.6 fait** (RainbowPiano) : `playwright.capture.config.ts` défaut `5183` (aligné `playwright.config.ts`).
- Optionnel Fil : seuils de profondeur Carte face aux fils automatiques ; retirer le log `[FlowMapSync]` ; arbitrer double représentation Pulse (Inbox + Carte) — [handoff fils nestés](handoffs/2026-09-15-handoff-fils-nestes-antidoublon.md).
- Dette technique ouverte : `fil-store.tsx` (672 lignes, merge/prune inlinés) ; `tests/live-flux-mindmap.test.ts` creux (`importOrSkip` **skip** au lieu d'échouer) ; 800 ms **partagé** par les deux appels de `/api/chronos` — qualifié de « point de fragilité le plus probable » dans [`vfg-gate-trigger/AUDIT.md`](vfg-gate-trigger/AUDIT.md). Extrait **sans être corrigé** par le lot R0 : la correction demande une mesure de latence réelle.
- Éditorial : **huit** billets prêts listés dans [docs/devblog/README.md](docs/devblog/README.md) ; publication live blog **non** affirmée ici.
- Lots R0 commités (`a2ff021` · `dfa2bee` · `1e03088`) ; **pas de push** sans demande.
- Filters/delete-all : déjà dans le produit (STATUS todos ✅) — reste smoke FG, pas une implémentation ouverte.

Handoff de ce lot : [handoffs/2026-09-15-handoff-refacto-d6-alias-mort.md](handoffs/2026-09-15-handoff-refacto-d6-alias-mort.md) (+ [Tâche A](handoffs/2026-09-15-handoff-refacto-d4-d2-d3.md)).  
Handoff précédent (process-docs) : [handoffs/2026-09-15-handoff-process-documentation.md](handoffs/2026-09-15-handoff-process-documentation.md).

---

## Phase / todos

| id | Statut | Notes |
|----|--------|-------|
| scaffold-next | ✅ | Next.js 16 App Router · Tailwind 4 · shadcn |
| modele-noeuds | ✅ | Session · ThoughtNode · sources · seuils profondeur |
| chronarbre-ui | ✅ | Layout L→R, Dense/Large, repli branches |
| capture-manuelle | ✅ | Barre bas + parent focus / racine |
| capture-auto-demo | ↪ | Remplacé par Chronos live (polling 750 ms) |
| persist-local | ✅ | `fil.workspace.v1` (décisions + captures manuelles) · Chronos/ponts RAM only · migration `fil.session.v2` |
| alertes-profondeur | ✅ | WARN ≥4 · CRITICAL ≥5 · bandeau + Remonter |
| zip-export | 🚫 | **Retiré** le 2026-09-16 — `/get-zip`, `/download` et `public/fil-chronoflow.zip` supprimés (archive datée de la v0.1) |
| ponts-vfg | ↪ | Pulse · Telegram · Blog : Inbox RAM ✅ ; git livré dans Flux ; IdeaPit non câblé |
| pont-pulse | ✅ | `api/pulse` · `pulse-to-fil` · poll → Inbox (plus chronarbre) |
| pont-telegram | ✅ | `api/telegram` · `telegram-to-fil` · poll → Inbox |
| pont-blog | ✅ | `api/blog` · `blog-to-fil` · poll → Inbox |
| ponts-ui-poll | ✅ | `fil-app` poll 1500 ms · Inbox view (hors mindmap) |
| chronos-agent-grid | ✅ | `/api/chronos` · polling 1500 ms (10 s en arrière-plan) · reconstruction `agent.turn` sans localStorage |
| chronos-agent-tests | ✅ | Mapping état, aliases contrat, reconstruction/collision |
| chronos-agent-fields | ✅ | `agent-fields.ts` — prompt, modèle, tokens in, repo, dossier |
| chronos-agent-lifecycle | ✅ | Hide terminal only (finished 60s · failed/interrupted 5min) · silence → stale visible · legacy 90s unused |
| chronos-agent-dismiss | ✅ | `fil.agent.dismiss.v1` · hide vue only (ledger append-only) |
| chronos-to-fil | ✅ | `buildFilPatchFromChronos` → ids stables `fil:agent:*` / `fil:event:*` |
| chronos-mindmap-sync | ✅ | `AgentGrid.onSnapshot` → `buildFilPatchFromChronos` → `upsertChronosPatch` → `pruneChronosNodes` |
| debug-flux-crud | ✅ | `/debug/flux` · `debug-flux-store` · merge poll · panel inject — **page dev uniquement** depuis le 2026-09-16 (`notFound()` en production) |
| delete-bloc | ✅ | `applyDeleteBloc` · UI détail · dismiss Chronos vue-only |
| fil-view-filters | ✅ | source chips (blog/pulse/telegram off by default) · max depth |
| fil-delete-all | ✅ | `applyDeleteAllFil` · header « Supprimer tout » · dismiss agents · marqueur `cleared` (pas de résurrection démo) |
| blog-root-cap | ✅ | `fil:blog:root` + max 5 posts · default filter hide blog |
| workspace-model | ✅ | Project/Task/Link/InboxTriage · `workspace-types` + `useWorkspace` · persist dans `fil.workspace.v1` |
| execution-link | ✅ | Suggestions repo/path à confirmer · `execution-link.ts` · PresenceLinkHints + Inbox |
| ui-nav-workspace | ✅ | Nav Présence / Projets / Tâche / Inbox / Carte · Reprendre (clipboard brief) |
| flux-registry | ✅ | `flows/sources.ts` — registre unique des sources (statut `live`/`declared`, fraîcheur `stream`/`archive`) |
| flux-model | ✅ | `flows/{types,classify,tags,score,scope,items}.ts` — fonctions pures : catégorie · tags · score 0–100 + `reasons[]` |
| flux-noise-keep | ✅ | Le bruit n'est plus supprimé : `category: "noise"` (dépriorisé, compté, jamais perdu) — 201 items récupérés |
| flux-chronos-adapter | ✅ | `flows/from-chronos.ts` — `agent.turn` + `act` + `presence` (les 209 `act` étaient ignorés) |
| flux-pulse-adapter | ✅ | `flows/from-pulse.ts` — tout acte identifié devient un item, plus de hard-drop |
| flux-git-adapter | ✅ | `flows/from-git.ts` + `flows/server/git-source.ts` — `git log` seul (jamais de diff), racine de dépôt exigée |
| flux-git-api | ✅ | `/api/git` — borné (40/dépôt, 120 total), fail-open, dépôt invalide → erreur explicite, jamais un commit inventé |
| flux-api | ✅ | `/api/flows` — agrégat catégorisé/tagué/scoré · fail-open · `no-store` |
| flux-monitor | ✅ | `flows/monitor.ts` — santé par source + `lagMs` · fail-open prouvé · `healthSummary` |
| flux-journal | ✅ | `flows/journal.ts` — rollup par jour local · minutes actives mesurées · `dispersionIndex` |
| flux-journal-api | ✅ | `/api/journal` — `?day=` / `?days=` · dérivé, jamais un second ledger |
| flux-capture-shared | ✅ | `flows/server/capture.ts` — collecte unique partagée par `/api/flows` et `/api/journal` |
| flux-journal-fold | ✅ | Le journal replie `noise`/`ambient` (comptés dans `excluded`/`byCategory`) — 141 items → 4 de travail |
| flux-discipline | ✅ | `flows/discipline.ts` — focus projet (pénalité `hors-focus`) · budget par source (surplus → 1 ligne compteur) · `suggestFocusSlug` |
| flux-focus-ui | ✅ | Bouton « Concentrer sur X » · pénalité affichée en tête de ligne (jamais tronquée) |
| flux-budget-ui | ✅ | Ligne compteur épinglée en haut et exemptée du filtre catégorie (plafond jamais silencieux) |
| capture-browser-test | ✅ | `tests/capture.browser.mjs` — parcours captation : onglets, santé, items, focus, journal, fail-open, mobile |
| flux-view-logic | ✅ | `flows/view.ts` — filtres, recherche, pagination Top-N, badges santé, résumés de jour (purs) |
| flux-health-ui | ✅ | `flow-health-strip.tsx` — bandeau par source · `empty` distingué de `down` (vérifié navigateur) |
| flux-ui | ✅ | Onglet Flux — catégories, tags, score, recherche, plafond Top-20 |
| flux-journal-ui | ✅ | Onglet Journal — sélecteur de jour, rollup, top items, repliés rendus visibles |
| flux-repo-client | ✅ | Le client transmet les `Project.repoPath` → source git `up(13)`, 8 items git visibles |
| flux-turn-collapse | ✅ | `collapseChronosTurns` — 1 item par session (compteur tours/outils) |
| flux-privacy | ✅ | `sanitizeFlowPayload` — prompt/diff/clipboard/message_content retirés, titres bornés 120 |
| delete-cleared | ✅ | Marqueur `cleared` — « Supprimer tout » reste vide après rechargement (vérifié navigateur) |
| multi-session | ⬜ | Une session démo hardcodée |
| lint-react-hooks | ✅ | ESLint clean (0 erreur, 0 warning) — `npx eslint src tests` |
| flux-git | ✅ | Adaptateur git livré (WP3) — source promue `live` après preuve sur dépôt réel (11 commits) |
| anti-dispersion | ✅ | Focus projet · Top-N · bruit replié · budget par source · alerte dispersion (WP7) |
| fils-nestes-carte | ✅ | `flows/to-nodes` + dédup inter-sources · pont Flux → Carte (2026-09-15) |
| vfg-gate-trigger-poc | ✅ | Harnais observation hors `src/` · VERIFICATION PASS (dry + live présence) |
| refacto-coercion-r0 | ✅ | `coerce.ts` — coercion partagée (−41 lignes, 8 copies supprimées) |
| refacto-d5-stale-notice | ✅ | `staleReadNotice` partagé · garde-fou anti-ré-inline |
| refacto-d4-d2-d3-envelope | ✅ | `envelope.ts` + `fetch-json.ts` — `readJson` 4→1 · abort 5→0 · divergence `errorDetail` paramétrée |
| refacto-d6-alias-mort | ✅ | Alias `pulseActHaystack` retiré (`PULSE_SPAM_PATTERNS` conservé) |

## Déployé (local)

| Composant | Statut |
|-----------|--------|
| `npm run dev` → http://[hôte interne] | ✅ |
| `npm run build` | ✅ (2026-09-15 — TS + routes ponts + modules flux ; preuve héritée handoffs) |
| `npm run lint` | ✅ 0 erreur / 0 warning (preuve héritée) |
| Backend / API | — (client-only + proxy Chronos/Pulse/Blog) |
| Remote git | ✅ privé GitHub (init release) |

## Non activé (volontaire)

- Ingest réel IdeaPit / Signal Ledger
- Auth / multi-appareils / sync serveur
- MCP produit
- Mutation / delete Chronos (interdit — hide = vue Fil seulement)
- Catalogue docs / `docs:check` (allègement documenté)

## POC vfg-gate-trigger — 2026-09-15

- Dossier [`vfg-gate-trigger/`](vfg-gate-trigger/) : harnais VFGate → Chronos → Fil, **hors** `src/`.
- Étape 1 du plan POC livrée ; preuves : [`VERIFICATION.md`](vfg-gate-trigger/VERIFICATION.md) **PASS** (révision test `c662246`).
- Suite hors Fil : **0.5** (VFGate `main`), **0.4** (tokens) ; **0.6** fait (RainbowPiano `playwright.capture.config.ts` → `5183`).
- Article long : ownership autre agent (`ARTICLE-BLOG.md` → index [devblog](docs/devblog/README.md)).

## Plan captation — WP0 → WP8 livrés (2026-09-15)

Plan maître : `docs/PLAN-CAPTATION-FLUX.md`. Synthèse : bruit conservé (`noise`), journal replié honnête, monitoring `empty` ≠ `down`, anti-dispersion (focus + budget), scénario navigateur `tests/capture.browser.mjs`. Preuves détaillées dans les handoffs captation — **non rejouées** dans le lot process-docs.

## Run

```powershell
cd [chemin local]
npm install
npm run dev
# → http://[hôte interne]

npm run build
npm start
```