Files
rpa_vision_v3/docs/SYNTHESE_11AVRIL_MATIN.md
Dom 447fbb2c6e
Some checks failed
security-audit / Bandit (scan statique) (push) Successful in 12s
security-audit / pip-audit (CVE dépendances) (push) Successful in 10s
security-audit / Scan secrets (grep) (push) Successful in 8s
tests / Lint (ruff + black) (push) Successful in 13s
tests / Tests unitaires (sans GPU) (push) Failing after 14s
tests / Tests sécurité (critique) (push) Has been skipped
chore: sauvegarde complète avant factorisation executor
Point de sauvegarde incluant les fichiers non committés des sessions
précédentes (systemd, docs, agents, GPU manager).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-20 17:03:44 +02:00

337 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Synthèse — 11 avril 2026 (préparée pendant ton absence)
Ce document résume ce qui s'est passé pendant ton absence. Lecture : ~10 minutes.
## 🎯 À lire en premier (60 secondes)
**Score global guardian : 6.8/10** — direction bonne, 5 commits du jour propres sans régression, mais **3 points critiques** à adresser.
### Les 3 actions à faire en rentrant (ordre de priorité)
1. **🔴 P0 — Committer `replay_failure_logger.py`** (fichier utilisé partout mais pas tracké git, un fresh clone ne démarre plus). 15 minutes. Bloquant absolu. Guardian item C1.
2. **🔴 P0 — Corriger l'asymétrie `Fenêtre incorrecte` strict → pause apprentissage** (même pattern que `no_screen_change strict` du commit `7cc03f6f1`, mais sur une autre branche). 1-2h. C'est exactement le bug qui a cassé ton test chirurgical ce matin (tu vas voir la timeline dans Partie 1). Guardian item C2.
3. **🔴 P1 — Premier replay Notepad E2E réussi pour activer Phase 1 apprentissage**. La DB `data/learning/target_memory.db` est **vide** (0 entrée). La greffe est câblée mais Léa n'a pas encore appris une seule fois en conditions réelles. Tu pourras l'activer dès que #2 est fait. Guardian item E4.
### Les 3 choses à savoir absolument
- **Test chirurgical** : échec propre au premier clic parce que Bloc-notes n'était plus au premier plan sur la VM (focus perdu). La chaîne stricte a fait exactement son job de protection (3 retries puis stop), mais elle est retombée dans la branche retry+stop legacy au lieu de la pause d'apprentissage. **C'est la preuve vivante du bug #2 ci-dessus.**
- **VWB est un piège** pour le nettoyage de workflows — bug DB runtime + bridge Léa→VWB qui perd 90% de l'info. **Recommandation agent VWB** : écrire un petit outil dédié (200 lignes, 1 jour) plutôt que réparer VWB (4-5 jours). Détails en Partie 4.
- **Code agent en 3 copies divergentes** : source à jour, deploy copy très en retard (sans UIA), worktree migration sans `replay_failure_logger.py`. Merger le worktree EN L'ÉTAT casserait le démarrage. C4 du guardian.
### Ce qui va vraiment bien 🟢
- Les 5 commits de la journée (`b92cb9db0`, `f82753deb`, `9188bd7df`, `a21f1ea9f`, `7cc03f6f1`) sont tous propres, bien documentés, testés et sans régression
- L'instrumentation `[REPLAY]` permet un debug multi-étages lisible
- La Phase 1 apprentissage est une greffe minimale et non-intrusive (exactement comme prévu dans le plan)
- Le fix de C (`7cc03f6f1`) montre la rigueur post-correction : re-lecture des feedbacks mémoire, pas de rustine
- Tests E2E + unit (hors VWB) toujours verts : 56/56
Le détail complet ci-dessous, partie par partie.
---
## Partie 1 — Résultat du test chirurgical
### Protocole
- Replay `replay_free_3935cd0b` lancé sur la session `sess_20260411T084629_2d588e`
- 3 actions injectées : click `Fichier` → wait 800ms → click `Enregistrer`
- Chaque click en mode `success_strict=True`, `expected_before='test.txt Bloc-notes'`
- Les gardes B (score + drift) et C (pause apprentissage) sont en place
### Timeline
```
09:31:09 DISPATCH test_chir_1_fichier (click Fichier)
09:31:11 REPORT success=False error="Fenêtre incorrecte: 'Program Manager' (attendu: 'test.txt Bloc-notes')"
09:31:11 VERIFY final_success=False
09:31:11 DISPATCH retry1
09:31:12 REPORT success=False error="Fenêtre incorrecte: 'Program Manager' ..." (identique)
09:31:13 DISPATCH wait_retry (2s)
09:31:16 DISPATCH retry2
09:31:17 REPORT success=False error="Fenêtre incorrecte: 'Program Manager' ..." (identique)
09:31:18 DISPATCH retry3
09:31:19 REPORT success=False error="Fenêtre incorrecte: 'Program Manager' ..." (identique)
09:31:19 Replay échoué à test_chir_1_fichier_retry3 après 3 retries: status=error
```
### Analyse critique
**Ce qui a BIEN fonctionné** (à conserver) :
- `_validate_match_context` côté agent Windows : a détecté le mismatch de fenêtre active (`Program Manager` vs `test.txt Bloc-notes`)
- **Pas de clic dans le vide** : la pré-vérif stricte refuse de cliquer quand la fenêtre active n'est pas celle attendue, exactement comme prévu
- Instrumentation `[REPLAY]` parfaitement lisible : chaque étape, chaque erreur, chaque retry
- Retry automatique × 3 avec wait interleaved
**Ce qui a MAL fonctionné** (à corriger) :
1. **`Bloc-notes` n'était plus au premier plan** quand le test a démarré. La fenêtre active sur la VM était `Program Manager` (= le bureau Windows). Hypothèses :
- Tu as fermé Bloc-notes avant de partir
- Un événement Windows a volé le focus (notification, chat Léa, etc.)
- Bloc-notes était minimisé
2. **L'erreur `Fenêtre incorrecte` en mode strict retombe dans la branche retry+stop** (réflexe RPA classique), **pas** dans la pause apprentissage. C'est une **incohérence** avec le correctif C que j'ai fait pour `no_screen_change` : les deux devraient avoir le même traitement.
### Ce qu'il aurait fallu faire
Dans `api_stream.py`, la branche qui traite l'erreur `Fenêtre incorrecte` devrait :
- En mode **strict** : `status = "paused_need_help"` avec `pause_message = "Je m'attendais à voir 'test.txt Bloc-notes' mais je vois 'Program Manager'. Peux-tu me montrer la bonne fenêtre ?"` → queue intacte, attente d'intervention humaine
- En mode **legacy** (non strict) : retry × 3 puis continue (comportement actuel)
C'est **symétrique** au correctif C (`no_screen_change strict → pause apprentissage`). À faire dans un prochain commit.
### Ce que ça valide quand même
Malgré l'échec sur un problème environnemental (focus perdu), **la chaîne stricte complète fonctionne** :
- Pré-vérif stricte ✅
- Retry automatique ✅
- Arrêt propre après retries ✅
- Instrumentation lisible ✅
- Pas de clic "aveugle" dans le désordre ✅
On a juste besoin d'aligner le traitement d'erreur sur la philosophie d'apprentissage.
---
## Partie 2 — Dettes techniques connues (pré-audit)
En attendant le rapport du project-quality-guardian, voici ce que je sais déjà :
### Dettes hautes (connues et documentées)
1. **`agent_v0/deploy/windows_client/agent_v1/core/executor.py`** : 1302 lignes de divergence non committée avec le dev copy. Risque à chaque nouveau packaging Windows.
2. **Module `replay_failure_logger.py`** : importé dans `api_stream.py` mais PAS tracké dans git. Bug pré-existant signalé par le subagent VWB tout à l'heure. À vérifier : soit le fichier existe sur disque (ignoré par gitignore), soit l'import est cassé silencieusement.
3. **Migration `agent_v0/` → top-level** : non mergée, dans un worktree (`.claude/worktrees/agent-a0ebc90f/`). Trois commits prêts mais en attente de ton review.
4. **`visual_workflow_builder/backend/instance/workflows.db`** : modifié non committé depuis le début de la session. Probablement des données de test.
5. **`live_session_manager.py`** : modifié non committé. Dans l'état initial de la session, devrait être committé séparément ou ignoré.
### Dettes moyennes
6. **`_a_trier/`** : dossier de code/scripts à trier, jamais nettoyé. Grande taille, pollue les grep.
7. **`archives/`** : ancien code archivé dans le dépôt. Grossit le repo.
8. **Phase 1 apprentissage activable mais non testée en conditions réelles** : `TargetMemoryStore` est branché mais aucune session n'a encore déclenché un `memory_record_success` ni un `memory_lookup HIT`. Attend le premier replay complet qui réussit.
9. **Agent Windows dev vs deploy vs build/Lea/** : trois copies parallèles du code agent, avec divergences possibles à chaque modification.
### Dettes basses
10. **Clics parasites d'arrêt d'enregistrement** : systématiquement capturés dans les sessions (clic sur systray, icône Léa, bouton Arrêter). À filtrer côté captor (ex: ignorer les N dernières secondes, ou tout clic sur fenêtre Léa).
11. **Phrases types non externalisées** : `pause_message`, `error_description`, etc. sont hardcodées dans le code. Doivent passer en JSON/YAML i18n-ready.
12. **Service `worker` (port 5099)** : toujours inactif. Le worker VLM qui compile les sessions en workflows n'est pas lancé. Résultat : les sessions enregistrées ne sont jamais compilées automatiquement en ExecutionPlan.
---
## Partie 3 — Ce que j'ai fait pendant ton absence (commits)
Aucun commit pendant ton absence. Juste :
- Lancement du test chirurgical (échec propre comme analysé)
- Lancement de 2 agents d'audit en background
- Création de ce document de synthèse
---
## Partie 4 — Résultat des agents d'audit
### Audit projet global — **TERMINÉ** ✅
**Score global** : **6.8/10** — direction technique bonne, 5 commits du jour propres et sans régression, mais **incohérence philosophique non corrigée** + dette de cohérence multi-copies.
#### 🔴 Les 3 choses à savoir en rentrant (synthèse exécutive du guardian)
1. **Phase 1 apprentissage est techniquement branchée MAIS `data/learning/target_memory.db` est VIDE (0 entrée).** Aucun replay n'a encore survécu au post-cond strict pour cristalliser. Ça veut dire que **tu n'as pas encore vu Léa apprendre**, tu as juste câblé l'apprentissage. Le premier replay qui passe en entier déclenchera la boucle.
2. **Asymétrie strict pré-vérif vs post-vérif** (gros point) : le fix `7cc03f6f1` corrige `no_screen_change strict → paused_need_help`, mais **la branche `Fenêtre incorrecte` en pré-vérif strict retombe toujours en retry+stop legacy**. C'est une **violation directe de `feedback_failure_is_learning.md` sur un chemin différent**. Même pattern, même oubli. C'est exactement ce qui a cassé ton test chirurgical ce matin.
3. **Trois copies divergentes du code agent** :
- `agent_v0/agent_v1/` (source à jour avec UIA, grounding, policy, recovery)
- `agent_v0/deploy/windows_client/agent_v1/` (1303 lignes non committées, **sans `uia_helper.py`**)
- `.claude/worktrees/agent-a0ebc90f/` (migration top-level, **sans `replay_failure_logger.py`**)
Tout packaging Windows depuis la deploy copy manque UIA + tous les fix du 10-11 avril. Si tu merges le worktree EN L'ÉTAT, ça casse le démarrage serveur.
#### Cohérence vision / implémentation
5 principes directeurs de la mémoire :
| # | Principe | Statut | Remarque |
|---|---|---|---|
| A1 | 100% visuel (pas de raccourcis inventés) | ✅ Respecté | Grep OK côté replay V4 |
| A2 | LLM 100% local (Ollama) | ⚠️ **Violé dans VWB** | `vlm_provider.py` priorise OpenAI/Gemini/Anthropic avant Ollama, 3 clés cloud dans `.env.local` |
| A3 | Léa n'est pas une boîte à clic | ⚠️ Partiel | Infra en place mais DB vide + asymétrie pré-vérif |
| A4 | Échec = apprentissage, pas arrêt | ⚠️ Partiel | Fix `no_screen_change` OK, pas `Fenêtre incorrecte` |
| A5 | Citrix / 100% vision | ✅ Cohérent | UIA est accélérateur local VM, cascade visuelle reste le core |
**Violation critique découverte** : `visual_workflow_builder/backend/vlm_provider.py` ligne 53-72 — la classe `VisionHub` priorise `OpenAI (gpt-4o) → Gemini → Anthropic → Ollama en dernier`. Importé par `app.py:165`. **Un client déployé avec les mêmes clés d'env enverrait ses écrans médicaux à OpenAI.** Grave.
#### État des fonctionnalités (14 fonctions)
| # | Fonctionnalité | Statut | Preuve |
|---|---|---|---|
| B1 | Agent V1 streaming (capture Windows) | ✅ OK | `executor.py` 2177L, /replay/next pollé |
| B2 | Streaming server `api_stream.py` | ✅ OK | 4401L, rpa-streaming active running |
| B3 | SomEngine (YOLO + docTR + VLM) | ✅ OK (dormant dans cascade) | `_resolve_by_som` défini mais appelé seulement en V4 resolve_order |
| B4 | Resolve cascade (OCR/template/VLM/grounding/SoM) | ✅ OK | `_resolve_target_sync:1530` |
| B5 | Contrôle strict étapes (title_match) | ⚠️ OK post, **incohérent pré** | Cf point #2 ci-dessus |
| B6 | UIA local (lea_uia.exe) | ⚠️ **OK source, ABSENT deploy** | `deploy/windows_client/.../core/` n'a pas `uia_helper.py` |
| B7 | TargetMemoryStore Phase 1 | ⚠️ Greffe OK, **DB vide** | `SELECT COUNT(*) FROM target_memory` → 0 |
| B8 | Instrumentation `[REPLAY]` | ✅ OK | 13 logs structurés |
| B9 | Garde qualité résolution | ✅ OK | 7 tests unitaires inline |
| B10 | `no_screen_change strict → pause` | ✅ OK | commit `7cc03f6f1` |
| B11 | VWB | ⚠️ Audit séparé — BROKEN en écriture | Voir section VWB ci-dessous |
| B12 | Fédération (`core/federation/`) | ✅ Import OK, non testée | |
| B13 | Module auth (`core/auth/`) | ✅ Partiellement branché | |
| B14 | Workers systemd | ⚠️ Mixte | streaming/agent-chat/api OK, dashboard inactive, worker 5099 NOT LISTENING, healthcheck failed |
#### Dettes techniques — 20 items priorisés (rapport complet)
**🔴 Priorité haute** (5 items) :
| # | Lieu | Nature | Effort |
|---|---|---|---|
| **C1** | `agent_v0/server_v1/replay_failure_logger.py` | **Fichier ni tracké ni gitignoré**, importé à `api_stream.py:29`. **Un `git clone` ne peut plus démarrer le serveur.** | < 15 min (git add) |
| **C2** | `api_stream.py` branche `Fenêtre incorrecte` | Asymétrie avec fix `7cc03f6f1` — bloquer avec `paused_need_help` au lieu de retry+stop | 1-2h |
| **C3** | `deploy/windows_client/agent_v1/core/executor.py` | 1303 insertions non committées, manque `uia_helper.py` + `grounding.py` + `policy.py` + `recovery.py` | Demi-journée |
| **C4** | `.claude/worktrees/agent-a0ebc90f/` | Worktree ne contient pas `replay_failure_logger.py` → merge cassera l'import | 1-2h |
| **C5** | `tests/unit/test_som_integration.py::test_resolve_success` | Mock cassé par refactoring, cible `api_stream._get_som_engine_api` au lieu de `resolve_engine.*` | 30 min |
**🟡 Priorité moyenne** (7 items) :
- **C6** : `vlm_provider.py` cloud-first (violation A2) — 1-2h
- **C7** : `live_session_manager.py` 118 lignes non committées (code propre utile) — 30 min
- **C8** : Worker port 5099 inactif (sessions jamais compilées en ExecutionPlan) — 1-2h
- **C9** : Services systemd healthcheck + artifact-retention failed — 30 min
- **C10** : Scaffold vide `agent_v1/` top-level — < 15 min
- **C11** : 22 fichiers en `M` non committés (diffus) — demi-journée triage
- **C12** : `core/detection/vlm_config.py` non tracké — 10 min
**🟢 Priorité basse** (8 items) :
- **C13** : `_a_trier/` 561 Mo + `visual_workflow_builder/_a_trier/` 7.6 Go
- **C14** : 2 venvs VWB → 15.6 Go disque
- **C15** : `core/execution/target_resolver.py` (3495L V3 dormant)
- **C16** : README.md obsolète (décembre 2024)
- **C17** : `web_dashboard/app.py.bak_20260304_2225`
- **C18** : `archives/` 21 Mo committé dans le repo
- **C19** : 53 TODO/FIXME/HACK dans Python
- **C20** : `data/training/live_sessions/` 5.1 Go sans rotation
#### Régressions potentielles depuis le matin
**Aucune nouvelle régression** introduite par les 5 commits du jour. L'incohérence `Fenêtre incorrecte` est **pré-existante** (branche legacy qui aurait dû être corrigée en même temps). Guardian a vérifié les 4 branches de `/replay/result` (lignes 3090-3330) — elles s'enchaînent proprement, pas d'interaction non triviale entre D1-D5.
#### Recommandations priorisées du guardian
| # | Priorité | Action | Effort | Justification vision |
|---|---|---|---|---|
| **E1** | **P0** | Committer `replay_failure_logger.py` | < 15 min | Empêche tout fresh clone/deploiement |
| **E2** | **P0** | Corriger asymétrie `Fenêtre incorrecte``paused_need_help` | 1-2h | Respect `feedback_failure_is_learning.md` + débloque test chirurgical |
| **E3** | **P1** | Sync deploy copy avec source + ajouter uia_helper/grounding/policy/recovery | Demi-journée | Sans ça Léa n'a pas accès à ses propres progrès sur VM |
| **E4** | **P1** | **Premier replay E2E réussi** pour activer Phase 1 (Notepad propre, 2 fois, vérifier target_memory.db) | 1-2h | **Seule façon de prouver que Léa apprend vraiment** |
| **E5** | **P1** | Décider du sort du worktree (compléter ou refaire) | 1-2h | Éviter dette multi-copies |
| **E6** | **P2** | Gater `vlm_provider.py` derrière env var (violation 100% local) | 1-2h | Respect `feedback_local_only.md` |
| **E7** | **P2** | Relancer worker 5099 + vérifier compilation sessions | 1-2h | Pipeline apprentissage cassé en bout |
| **E8** | **P2** | Committer `live_session_manager.py` | 30 min | Dette git |
| **E9** | **P3** | Réparer test_som_integration | 30 min | Suite unit verte |
| **E10** | **P3** | Nettoyer 2 venvs VWB | 30 min | 15.6 Go disque |
### Audit VWB — **TERMINÉ** ✅
**TL;DR : VWB est un piège pour notre besoin. Recommandation = Option A (petit outil dédié 1 jour).**
#### État global
Partiellement fonctionnel en **lecture**, **CASSÉ en écriture** (bug runtime trivial), et **gravement amputé en contenu** (bridge Léa→VWB perd 90% de l'information). Le scaffolding est là, la chaîne end-to-end ne fonctionne pas.
#### Bug bloquant immédiat
Le processus 1800738 (vwb-backend:5002) tient un handle sur une version **supprimée** de `workflows.db` (6 file descriptors sur `(deleted)`). Toute écriture → `sqlite3.OperationalError: attempt to write a readonly database`. Un `systemctl --user restart rpa-vwb-backend` règle ce point — mais les vrais problèmes restent.
#### Ambiguïtés structurelles (dette)
| Problème | Impact |
|---|---|
| `frontend/` (vieux, inactif) vs `frontend_v4/` (actif) | Confusion à chaque lecture code |
| `app.py` (5002, avec api_v3) vs `app_lightweight.py` (5003, SANS api_v3) | Deux backends parallèles |
| `db/models.py` (legacy) vs `instance/workflows.db` SQLAlchemy (api_v3) | **Deux DB parallèles** — workflows visibles ici ≠ workflows visibles là |
#### Ce qui marche côté code (vérifié)
- `GET /api/v3/learned-workflows` : liste 126 workflows Léa sur disque
- Routes CRUD Step : add/update/delete/reorder (existent backend + client TS)
- PropertiesPanel 1415 lignes — édite délais, texte, direction, hover_duration
- UI drag-and-drop ajout step via tool palette → React Flow
- `POST /api/v3/execute-windows` : proxy vers streaming server, fonctionnel
#### Ce qui manque (critique pour le nettoyage)
1. **Import compound = coquille vide** : 95% des edges Léa sont des actions `type: compound` avec 10-40 sous-étapes (clic + waits + text_input lettre par lettre). Le bridge crée **UN seul step VWB** pour toute la compound → *"Impossible de nettoyer ce qu'on ne voit pas"*
2. **Pas d'auth VWB → streaming server** : `requests.get(...)` sans header Authorization, donc `streaming_server_available: false`. VWB ne voit que les workflows déjà compilés (max 4 avril), pas les sessions récentes
3. **Pas de screenshots attachés** : les `shots/*.png` de session ne sont jamais liés aux steps importés
4. **Pas de réordonnancement UI** : `reorderSteps` existe backend + client, mais **aucun composant React ne l'appelle**
5. **Édition target_spec absente** : PropertiesPanel n'a **aucun champ** `x_pct`, `y_pct`, `target_role`, `target_text`, `vlm_description`. Impossible de corriger un faux positif
6. **Pas d'ingestion raw events** : `live_events.jsonl`, `build_replay_from_raw_events`, `execution_plan_to_actions` ne sont pas importés dans VWB
7. **Pas de liste "sessions récentes"** : aucun endpoint VWB qui liste les `sess_*` sur disque
8. **Zéro test** sur le pont Léa ↔ VWB
#### Effort de réparation estimé
| Item | Effort |
|---|---|
| Restart service (fix DB readonly) | 5 min |
| Ajouter auth Bearer VWB → :5005 | 30 min |
| Décomposer actions compound en N steps VWB | **1 jour** |
| Attacher screenshots aux steps | **1 jour** |
| Édition target_spec dans PropertiesPanel | 0.5 jour |
| Drag-to-reorder UI | 0.5 jour |
| Endpoint `/live-sessions` + importer raw | **1-2 jours** |
| Tests minimal | 0.5 jour |
| **Total** | **4-5 jours** |
Et encore, **on hériterait de la dette** (deux DB, deux backends, zéro test, frontend abandonné).
#### Recommandation — 3 options
**Option A (recommandée) — Outil dédié léger, 1 jour**
Écrire un petit Flask (200 lignes) qui :
1. Liste les sessions `live_sessions/*/sess_*` sur disque
2. Charge `live_events.jsonl` via `build_replay_from_raw_events` (existe déjà dans `stream_processor.py:1279`)
3. Affiche la liste linéaire des actions + screenshots `shots/` correspondants
4. Checkbox "supprimer cette étape" + édition texte simple
5. Re-sérialise et POST vers `/api/v1/traces/stream/replay/raw`
**Évite toute la complexité VWB** et cible exactement le besoin : "supprimer 3 clics parasites et relancer".
**Option B — Réparer VWB minimalement (2 jours)** — restart + auth + décomposer compound. Hérite de toute la dette UX.
**Option C — Abandonner VWB** — suggéré par l'accumulation de dette (126 workflows "pending_review", zéro test sur le pont, deux backends, frontend abandonné)
**Vote de l'agent VWB** : *"Option A. Le besoin réel est 'supprimer 3 clics parasites et relancer' — c'est 30 secondes d'UX, pas un Visual Workflow Builder."*
**Mon vote aussi** : **A**. Parce que ça sert directement notre prochain test replay. B prend plus de temps qu'il ne nous fait gagner. C laisse la dette pourrir.
---
## Partie 5 — Actions recommandées quand tu rentres
Par ordre de priorité :
### P0 — À faire dans les 10 premières minutes de ton retour
1. **Vérifier sur la VM** que Bloc-notes est bien fermé (ou pas), et si possible ce qui a volé le focus
2. **Lire la partie 1** de cette synthèse (résultat test chirurgical)
3. **Lire les rapports des 2 agents** (sections 4)
### P1 — À discuter avec moi
4. **Corriger l'incohérence `Fenêtre incorrecte strict → pause apprentissage`** (même pattern que C)
5. **Décider** : on continue à stabiliser le replay avec des tests manuels, OU on passe à l'intégration d'OS-Atlas-Base-7B comme grounder, OU on attaque VWB comme outil de correction ?
6. **Externaliser les phrases types** en JSON i18n (petit commit)
### P2 — Plus tard dans la journée
7. Merger la migration `agent_v0/` → top-level (worktree déjà prêt)
8. Investiguer le fichier `replay_failure_logger.py` (importé, pas tracké)
9. Démarrer le worker VLM pour que les sessions soient compilées en workflows
### P3 — Semaine prochaine
10. Nettoyer `_a_trier/` et `archives/`
11. Sync de l'agent deploy copy avec le dev
12. Implémenter le filtre "ignore clics de fin d'enregistrement" côté captor
---
*Document généré automatiquement pendant l'absence de Dom. Sera mis à jour avec les rapports des agents d'audit.*