docs: add POC specs, handoffs, and research notes

This commit is contained in:
Dom
2026-06-02 16:28:34 +02:00
parent 18ed6cb751
commit f2e9aac6b7
86 changed files with 27615 additions and 25 deletions

View File

@@ -0,0 +1,120 @@
# Handoff — Fix capture monitor aberrante + sécurisation fallback
**Date** : 2026-05-19
**Branche** : `backup/post-demo-2026-05-19` (HEAD `5ea4960e6`, non commité)
**Missions** : Claude 2 (fix initial) + Claude 2b (sécurisation fallback)
**Bug source** : audit Léa-first runtime, blocage P0 #4`agent_v0/agent_v1/vision/capturer.py` accède aveuglément à `mss.monitors[1]` sans valider ses dimensions. Cas observé en démo GHT 19 mai : `mss` renvoie intermittemment `2560×60` au lieu de `2560×1600`, coords Y divisées ~27×, mémoire persistante empoisonnée.
## Contexte produit
La voie nominale `capture → replay direct → memory` repose sur des coordonnées normalisées via les dimensions de l'écran principal. Une capture acceptant des dimensions aberrantes propage des `(x_pct, y_pct)` faux jusqu'au `TargetMemoryStore` (`core/learning/target_memory_store.py`), qui stocke des fingerprints inexploitables et incrémente `fail_count` sans signal sur la cause. Le bug originel s'auto-amplifie : chaque réutilisation de la mémoire empoisonnée déclenche d'autres échecs silencieux.
## Fichier modifié
- `agent_v0/agent_v1/vision/capturer.py` (309 → 401 lignes)
## Fichier créé
- `tests/unit/test_capturer_monitor_guard.py` (10 tests)
## Périmètre strict
**Non touchés** : `executor.py`, `main.py`, `api_stream.py`, replay engine, `resolve_engine.py`, `replay_memory.py`. Le fix est intégralement contenu côté capture client. Pas de SCP vers Léa Windows réalisé.
## Changements code
### Constantes module-level
```python
MIN_MONITOR_WIDTH = 200
MIN_MONITOR_HEIGHT = 200
MONITOR_MAX_ATTEMPTS = 2
MONITOR_RETRY_DELAY_S = 0.05
```
Seuil 200 px : largement au-dessus du cas observé (60 px) et largement sous toute résolution physique légitime. Marge confortable pour ne pas rejeter une fenêtre RDP/NoMachine ré-dimensionnée. Retry 2× avec 50 ms : couvre le pattern "mss cache stale au premier appel" sans pénaliser le chemin nominal (worst-case 100 ms avant abandon).
### Helpers privés
- `_is_monitor_sane(monitor) -> bool` — prédicat plausibilité dims (None → False, dict avec width/height ≥ seuils → True)
- `_dim_str(monitor) -> str` — formatage compact `WxH` pour les logs (gère None)
- `_acquire_safe_grab(max_attempts, retry_delay_s, allow_secondary_fallback) -> (monitor_dict | None, PIL.Image | None)` — ouvre `mss.mss()`, valide les dims, retry, fallback contrôlé, retour `(None, None)` en cas d'abandon. Logs WARNING par tentative aberrante, ERROR explicite à l'abandon avec distinction des causes.
### Méthodes publiques refactorées
| Méthode | Comportement | Justification |
|---|---|---|
| `capture_full_context` | `_acquire_safe_grab()` → fallback secondaire **autorisé** | Heartbeat ne porte pas de coords client, un écran sain quelconque suffit |
| `capture_dual` | `_acquire_safe_grab(allow_secondary_fallback=False)` → fail-closed | Reçoit `(x, y)` en coords composite, cropper depuis monitor secondaire produirait une image saine mais décalée |
| `capture_active_window` (path standalone) | `_acquire_safe_grab(allow_secondary_fallback=False)` → fail-closed | `win_rect` en coords globales, même risque |
Signatures publiques inchangées : `""`, `{}`, `None` selon le contrat existant en cas d'erreur.
## Décision clé — fail-closed vs recalcul d'offsets
**Choix : fail-closed** sur fallback secondaire pour les méthodes coord-bearing. Pas de translation `(x - monitor.left, y - monitor.top)` car :
1. Translation impose ensuite de vérifier inclusion du clic et de la fenêtre dans le monitor choisi, gérer les fenêtres à cheval, valider les coords positives — surface de bug supérieure à celle qu'on essaie d'éliminer.
2. Le bug est intermittent ; refuser une capture pendant ~100 ms est acceptable, Léa reprend au prochain événement.
3. Aligne avec `feedback_failure_is_learning.md` — un échec explicite vaut mieux qu'une réussite fausse.
## Tests
```bash
source /home/dom/ai/rpa_vision_v3/.venv/bin/activate && \
python -m pytest tests/unit/test_capturer_monitor_guard.py -v
```
**Résultat** : `10 passed in 0.25s`
| # | Test | Mission | Couverture |
|---|---|---|---|
| 1 | `test_capture_full_context_returns_empty_when_monitor_height_aberrant` | 2 | refus dim aberrante height=60 |
| 2 | `test_aberrant_monitor_logs_warning_with_observed_dimensions` | 2 | log WARN contient "2560" et "60" |
| 3 | `test_capture_retries_when_first_monitor_query_is_aberrant` | 2 | retry réussi après 1er appel aberrant |
| 4 | `test_capture_falls_back_to_secondary_monitor_when_primary_aberrant` | 2 | multi-écrans : `capture_full_context` utilise monitors[2] |
| 5 | `test_capture_dual_returns_empty_dict_when_monitor_aberrant` | 2 | `capture_dual` retourne `{}` sur aberration |
| 6 | `test_capture_active_window_returns_none_when_monitor_aberrant` | 2 | `capture_active_window` retourne `None` sur aberration |
| 7 | `test_capture_full_context_succeeds_on_normal_dimensions` | 2 | non-régression chemin nominal |
| 8 | `test_capture_dual_fails_closed_when_only_secondary_monitor_sane` | 2b | `capture_dual` refuse fallback secondaire |
| 9 | `test_capture_active_window_fails_closed_when_only_secondary_monitor_sane` | 2b | `capture_active_window` refuse fallback secondaire |
| 10 | `test_capture_full_context_still_uses_secondary_fallback` | 2b | non-régression : heartbeat accepte toujours le fallback |
Cycle TDD respecté pour tous les RED (1, 3, 5, 8) : test rouge vu avant implémentation. Tests 2, 4, 6, 7, 9, 10 ont validé une propriété exercée par l'implémentation déjà en place mais distincte du test précédent.
## Logs runtime attendus
**Cas nominal** : aucun log de cette garde (silencieux).
**Cas dim aberrante avec retry réussi** :
```
WARNING agent_v0.agent_v1.vision.capturer Monitor[1] dims aberrantes (2560x60, seuil 200x200) — attempt 1/2
WARNING agent_v0.agent_v1.vision.capturer Capture fallback : monitor[1] dim=2560x1600, attempt=2
```
**Cas fallback secondaire (heartbeat)** :
```
WARNING ... Monitor[1] dims aberrantes (2560x60, seuil 200x200) — attempt 1/2
WARNING ... Capture fallback : monitor[2] dim=1920x1080, attempt=1
```
**Cas fail-closed (capture_dual / capture_active_window avec secondaire dispo)** :
```
WARNING ... Monitor[1] dims aberrantes (2560x60, seuil 200x200) — attempt 1/2
WARNING ... Monitor[2] sain (1920x1080) mais fallback secondaire refusé (allow_secondary_fallback=False) — capture cohérente des coords impossible
ERROR ... Capture abandonnée : monitor[1] aberrant après 2 tentatives (dernier vu 2560x60) et fallback secondaire désactivé pour préserver la cohérence des coordonnées
```
**Cas abandon total** :
```
ERROR ... Aucun monitor avec dims plausibles trouvé après 2 tentatives (dernier vu : 2560x60, seuil 200x200) — capture abandonnée
```
## Points ouverts (à tracer post-déploiement)
1. **Seuil 200 px choisi par jugement** — pas par mesure empirique sur l'éventail des dims légitimes (RDP, NoMachine windowed, multi-écran portrait). À relever si un faux rejet apparaît en prod.
2. **Reproduction du bug réel non testée** — les 10 tests utilisent des mocks `mss`. La cause exacte côté mss reste non identifiée. Cette garde **protège** sans **expliquer**. À confirmer en redéployant sur la machine Windows Léa.
3. **SCP vers Léa Windows non fait** — conformément à `feedback_scp_auto_modif_client_windows.md`, le SCP vers `dom@192.168.1.11` est attendu après toute modif `agent_v0/agent_v1/**`. À faire avant le prochain run réel.
4. **Suivi côté serveur potentiellement nécessaire** — si `capture_full_context` (heartbeat) commence à retourner une image issue d'un monitor secondaire en cas de panne intermittente du primary, et si le serveur réutilise ce heartbeat pour pré-check sur des coords (`/resolve_target` fallback heartbeat), la même incohérence coord/image pourrait apparaître côté serveur. **Hors périmètre** missions 2/2b. À tracer comme follow-up éventuel.
5. **Pas de translation x/y dans `capture_dual`/`capture_active_window`** — si un jour on voulait supporter le fallback secondaire proprement, ce serait un chantier séparé (calcul `(x - monitor.left, y - monitor.top)`, validation inclusion, gestion fenêtres à cheval).
6. **Couverture `capture_active_window` quand `full_img` est fourni par l'appelant** — la garde s'applique uniquement au path standalone (sans `full_img`). Le cas le plus fréquent (appel depuis `capture_dual` avec `full_img=img`) est implicitement gardé via la garde de `capture_dual`. Mais un autre appelant qui fournirait un `full_img` issu d'une capture non gardée court-circuiterait la défense. Pas d'appelant identifié actuellement.
## Référence audit
Ce fix résout le blocage **P0 #4** de `docs/AUDIT_LEA_FIRST_RUNTIME_2026-05-19.md`. Les blocages P0 #1 (`record_human_correction` cassé), #2 (`build_workflow_replay` orphelin), #3 (memory gated sur `window_title`) restent ouverts.

View File

@@ -0,0 +1,113 @@
# Handoff — Post-démo GHT 2026-05-19
## TL;DR
**Démo vidéo enregistrée en bout en bout** après une session de 14h (18-19 mai) et **15 jours de bug-chasing** depuis le 5 mai.
⚠️ **Retour d'expérience amer** : on est partis d'un système moins mature mais qui **fonctionnait** (état tag `demo-stable-2026-05-12`, branche `demo/ght-2026-05-08`) et on a dérivé via une cascade de modifs locales jusqu'à un système instable. La démo enregistrée a fonctionné **grâce à des contournements**, pas grâce à une vraie résolution des bugs.
🎯 **Objectif post-démo** : consolider, identifier les vrais bugs racines, restaurer un état stable utilisable pour les prochaines démos sans devoir refaire 14h de bricolage.
## État final livré
- **Vidéo démo** : enregistrée et utilisable
- **Workflow** : `Demo_urgence_3_db` (`wf_483910cdd851_1778750587`) — 46 steps
- **Branche backup git** : `backup/post-demo-2026-05-19` → commit `5ea4960e6` (poussée sur gitea)
- **Tarball complet** : `/home/dom/ai/_archives/rpa_vision_v3_post_demo_20260519_142940.tar.gz` (8.9 Go, sha256 `7ab84f22d5a45b7880cad4efb4466f9e320f3e1e33218ceee267fc93fe7631af`)
## Chronologie résumée de la session (18-19 mai)
### 18 mai
1. Création **page AIVA-URGENCE** autonome (`docs/clients/ght_sud_95/aiva_urgence/`) — interface médicale pour la démo, design dark
2. Intégration AIVA dans le workflow : 6 nouveaux steps insérés (ord 15-20) entre `llm_generate` et `Win+D`
3. Bug **NPM Basic Auth** sur `urgence.labs.laurinebazin.design` → bypass via `location ^~ /aiva-urgence/ auth_basic off;` directement dans `proxy_host/10.conf` (modif hors git, sera écrasée si UI NPM touchée)
4. Bug **`pause_for_human` skip silencieux en mode autonome** → fix `safety_checks` avec `required: false` sur step 1
5. Bug **frontend cache** : Ctrl+Shift+R obligatoire après chaque modif DB pour que VWB envoie le workflow à jour
6. Fix **`api_stream.py:3013`** — enrichir le payload `replay_paused/pause_message/replay_id` dès le premier polling `/replay/next` (sinon gap 1-2s)
7. Création `scripts/cancel-replays.sh` — workaround pour purger les queues serveur (bug Stop VWB)
### 19 mai
8. **Merge workflow `linux_db`** dans Demo_urgence_3_db (suppression ord 36-46, insertion 9 steps de linux_db) via agent
9. **Bypass LLM** : `_handle_t2a_decision_action` + `_handle_llm_generate_action` acceptent maintenant `static_result` / `static_text` → décision déterministe UHCD pour MOREL Catherine (court-circuit Ollama)
10. **Bug `delay_before/delay_after` jamais lus** au runtime → ajout step `wait` explicite + lift `duration_ms` dans `dag_execute.py`
11. **Bug coord côté Léa** : `actual_position Y` divisé par ~27 sur certains clics (mapping client utilise dim écran tronquée `2560×60` au lieu de `2560×1600`)
12. **Bug VWB recapture anchor** : "Recapture" via UI ne régénère PAS le PNG (les 2 anchors `anchor_d467a5411722` et `anchor_bfbffbb47be7` sont **bit-à-bit identiques** alors que capturés à 8 jours d'intervalle)
13. **Bug Léa état mémoire** : la bulle paused n'apparaît plus dans le chat après plusieurs replays consécutifs → résolu par restart Léa Windows
14. Solution pour NoMachine : remplacé le double-clic auto par `pause_for_human` → Dom clique manuellement pendant l'enregistrement
## Bugs racines identifiés (à traiter post-démo, par ordre de gravité)
### 🔴 P0 — Bug "recapture anchor ne régénère pas le PNG" (VWB)
**Symptôme** : à chaque modif, "régression mystérieuse". L'anchor recapturé pointe sur la mauvaise icône car le PNG reste l'ancien.
**Audit** : `visual_workflow_builder/backend/api_v3/capture.py` — chercher si `image_path` est défini AVANT le screenshot, ou si la fonction réutilise un fichier existant.
**Impact** : explique 80% des "ça marchait hier" et des régressions silencieuses entre démos.
### 🔴 P0 — Bug "Stop VWB ne purge pas la queue serveur"
**Symptôme** : relance d'un replay = celui-ci hérite des actions en attente du précédent → Léa reprend au milieu.
**Workaround actuel** : `./scripts/cancel-replays.sh` manuel.
**Vrai fix** : VWB doit appeler `POST /api/v1/traces/stream/replay/<id>/cancel` quand on clique Stop.
### 🔴 P0 — Bug coord côté Léa client (mapping Y cassé sur capture tronquée)
**Symptôme** : `actual_position Y = 0.0099` au lieu de `0.265` → clic en haut de l'écran au lieu de la cible.
**Cause** : `mss.monitors[1]` retourne intermittemment `2560×60` au lieu de `2560×1600` → Léa map `y_pct * 60 = 16 px`.
**Audit** : `agent_v0/agent_v1/core/executor.py:606-617` — ajouter fallback dim minimale (rejeter si `height < 200`).
### ⚠️ P1 — Léa client accumule un état mémoire dégradé
**Symptôme** : après plusieurs pauses consécutives, la bulle paused n'apparaît plus (chat vide alors que le serveur envoie bien `replay_paused: true`).
**Workaround** : restart Léa Windows.
**Vrai fix** : reset propre de `_last_pause_msg_shown`, `_chat_window_ref`, état Tkinter à chaque fin de replay (côté `main.py`).
### ⚠️ P1 — `delay_before` / `delay_after` ignorés au runtime
**Symptôme** : on peut configurer ces champs en DB mais Léa ne les lit pas.
**Fix partiel appliqué** : `dag_execute.py` lift `duration_ms` pour les actions `wait`/`wait_for_anchor`.
**Vrai fix** : faire de même pour `delay_before` et `delay_after` côté executor.py (généraliser).
### ⚠️ P1 — Léa client interprète `action=null + replay_paused=true` comme "fin du replay"
**Symptôme** : main.py désactive `_replay_active` à tort quand le replay est en pause → cleanup UI + bulle invisible.
**Fix proposé** : `executor.py:1875` retourner `True` (au lieu de `False`) quand `replay_paused` est traité.
**Status** : non appliqué (nécessite SCP + restart Léa Windows).
### ⚠️ P2 — Bug VWB frontend cache
**Symptôme** : après modif DB, le frontend continue à envoyer l'ancienne version. Ctrl+Shift+R obligatoire.
**Vrai fix** : invalidation cache automatique côté React quand workflow modifié serveur-side.
## Leçons de méthode (autocritique honnête)
1. **15 jours de dérive** : on a accumulé des modifs locales sans valider à chaque étape qu'on ne dégradait pas l'existant. CLAUDE.md disait "chirurgie itérative supervisée", on a fait l'inverse à plusieurs reprises.
2. **Pas de tests de non-régression entre démos** : à chaque "ça marchait hier", on découvrait par hasard qu'un truc avait changé. Manque de smoke-test reproductible.
3. **Bug VWB recapture anchor non détecté pendant 15 jours** : la cause racine n°1 des régressions silencieuses était invisible. Aurait dû être trouvée plus tôt par un audit "diff PNG anchor avant/après recapture".
4. **Workarounds empilés** : chaque bug a généré un workaround (script cancel-replays.sh, bypass LLM static, pause humaine NoMachine, etc.) au lieu de fixer la cause. Dette technique accumulée.
5. **Recapture en aveugle** : Dom a recapturé plusieurs anchors en pensant fixer le bug, alors que le bug était VWB côté capture (pas Dom).
## État technique en sortie de session
- **Branche actuelle** : `feature/qw-suite-mai` (avec toutes les modifs uncommitted de la session)
- **Branche backup** : `backup/post-demo-2026-05-19` (commit groupé, poussé sur gitea)
- **Référence "ça marchait"** : tag `demo-stable-2026-05-12` (commit `2eeaa806b`), branche `demo/ght-2026-05-08` (commit `56e869c46`)
- **Services actifs** : streaming (5005), VWB backend (5002), VWB frontend (3002), dashboard (5001), worker (5099), agent-chat (5004)
- **Bypass LLM actif** dans `replay_engine.py` : les steps 12/13/14 du workflow utilisent `static_result`/`static_text` → décision UHCD MOREL hardcodée
- **NPM bypass auth** actif dans `proxy_host/10.conf` (sera écrasé si UI NPM touchée)
## Sauvegardes
| Type | Localisation | Détails |
|------|--------------|---------|
| Tarball | `/home/dom/ai/_archives/rpa_vision_v3_post_demo_20260519_142940.tar.gz` | 8.9 Go, sha256 vérifié |
| Branche git | `backup/post-demo-2026-05-19` sur gitea | commit `5ea4960e6`, 627 fichiers incluant 468 anchors |
| Backups DB | `visual_workflow_builder/backend/instance/workflows.db.bak.*` | ~12 .bak DB de la session (chaque modif majeure) |
## Prochaine session — priorités proposées
1. **Comparer avec `demo/ght-2026-05-08`** : identifier ce qui a vraiment régressé depuis l'état "ça marchait" (mais qui était moins mature)
2. **Fixer le bug VWB recapture anchor** (P0) — c'est le boss final, il explique la majorité des régressions silencieuses
3. **Fixer le bug Stop VWB ne purge pas la queue** (P0) — supprime un workaround manuel
4. **Réintégrer le fix `executor.py:1875` (return True sur replay_paused) côté Léa** + SCP + restart Léa Windows
5. **Smoke-test reproductible** : script qui rejoue Demo_urgence_3_db de bout en bout et compare l'état attendu à chaque step (au lieu de tester manuellement)
## Pointeurs utiles
- Mémoire projet : `/home/dom/.claude/projects/-home-dom-ai-rpa-vision-v3/memory/MEMORY.md`
- CLAUDE.md projet : `/home/dom/ai/rpa_vision_v3/CLAUDE.md` (règles de méthode)
- Reset replays : `./scripts/cancel-replays.sh`
- Mockup AIVA-URGENCE : `docs/clients/ght_sud_95/aiva_urgence/` (port 8765, exposé via `https://urgence.labs.laurinebazin.design/aiva-urgence/`)
- Workflow ID démo : `wf_483910cdd851_1778750587`

View File

@@ -0,0 +1,138 @@
# Handoff Claude — Horizon 1 Léa-first
**Date** : 2026-05-20
**Branche** : `backup/post-demo-2026-05-19` (HEAD `5ea4960e6`)
**Session** : sessions du 19-20 mai post-démo GHT
## Contexte
Horizon 1 = pivot Léa-first post-démo GHT. Mission globale comprise : auditer l'état réel du runtime `capture → replay direct → memory`, identifier et corriger ce qui empêche cette voie d'être nominale, préparer la validation client. Cadre : pas de refonte large, pas de retour sur VWB comme outil central, chirurgie supervisée.
Le travail a été découpé par Dom en missions numérotées (1, 2, 2b, 3, 4, 5) avec périmètres serrés et interdits explicites. Ce handoff couvre uniquement ma contribution sur ces missions.
## Travaux réalisés
### Audits (lecture seule, sans modification de code)
| Mission | Objectif | Livrable |
|---|---|---|
| Préliminaire | Inventaire factuel des 15 jours pré-démo GHT (ce qui marche / ce qui casse) | `docs/LESSONS_LEARNED_GHT_2026-05.md` |
| 1 | 10 blocages runtime Léa-first (capture / replay direct / memory) | `docs/AUDIT_LEA_FIRST_RUNTIME_2026-05-19.md` |
| 3 | Cartographie de la perte de `window_title` dans le pipeline mémoire | `docs/AUDIT_WINDOW_TITLE_MEMORY_PATH_2026-05-19.md` |
| 4 | Point d'intégration agent le plus petit pour le contrat `/finalize` enrichi | `docs/AUDIT_FINALIZE_CONTRACT_INTEGRATION_2026-05-20.md` |
| 5 | Préparation validation réelle Windows (fichiers à déployer + smoke test) | `docs/SMOKE_TEST_FINALIZE_REPLAY_2026-05-20.md` |
### Modifications de code
**Faites par moi (missions 2 + 2b)** :
- `agent_v0/agent_v1/vision/capturer.py` — ajout garde dimensions monitor :
- constantes module-level (`MIN_MONITOR_WIDTH=200`, `MIN_MONITOR_HEIGHT=200`, `MONITOR_MAX_ATTEMPTS=2`, `MONITOR_RETRY_DELAY_S=0.05`)
- helpers `_is_monitor_sane`, `_dim_str`, `_acquire_safe_grab(allow_secondary_fallback)`
- refactor `capture_full_context` (fallback secondaire autorisé)
- refactor `capture_dual` (fail-closed sur fallback secondaire)
- refactor `capture_active_window` path standalone (fail-closed)
- `tests/unit/test_capturer_monitor_guard.py` — CRÉÉ, 10 tests TDD
Handoff de ce fix : `docs/handoffs/2026-05-19_handoff_fix_capture_monitor_guard.md`.
**Constatées dans la branche, NON faites par moi** (apparues entre mes missions, probablement faites dans une session parallèle) :
- `agent_v0/agent_v1/main.py` — câblage `set_on_finalize_result` + `_on_finalize_result` + import `dispatch_finalize_result`
- `agent_v0/agent_v1/network/streamer.py` — attribut + setter + invocation `_on_finalize_result` dans `_finalize_session`
- `agent_v0/agent_v1/ui/smart_tray.py` — méthode `offer_finalize_replay` + `_launch_replay_request`
- `agent_v0/agent_v1/finalize_contract.py` — NOUVEAU fichier (untracked)
- `agent_v0/agent_v1/core/executor.py` — modifié (origine antérieure, hors scope mes missions)
### Validations / tests
| Test | Commande | Résultat |
|---|---|---|
| Garde monitor (10 tests TDD) | `source .venv/bin/activate && python -m pytest tests/unit/test_capturer_monitor_guard.py -v` | `10 passed in 0.25s` |
| Import sanity du module modifié | `python -c "from agent_v0.agent_v1.vision.capturer import VisionCapturer, _acquire_safe_grab, _is_monitor_sane, MIN_MONITOR_WIDTH, MIN_MONITOR_HEIGHT, MONITOR_MAX_ATTEMPTS, MONITOR_RETRY_DELAY_S"` | `Import OK ; seuils=200x200, retries=2, delay=0.05s` |
Aucun autre test exécuté (suite complète projet, tests intégration, tests Windows réel).
## Fichiers touchés (effectivement modifiés par moi)
```
agent_v0/agent_v1/vision/capturer.py (modifié — garde monitor)
tests/unit/test_capturer_monitor_guard.py (créé — 10 tests)
```
Plus les 6 documents listés en section Audits ci-dessus.
**Aucune autre modification de code de ma part.** Les autres modifs visibles dans `git status` (main.py, streamer.py, smart_tray.py, finalize_contract.py, executor.py) ne sont pas de mon fait.
## Tests exécutés
```bash
source /home/dom/ai/rpa_vision_v3/.venv/bin/activate && \
python -m pytest tests/unit/test_capturer_monitor_guard.py -v
```
Résultat : **10 passed in 0.25s** (rejet dims aberrantes, log WARNING avec dims observées, retry après aberration, fallback monitor secondaire pour `capture_full_context`, fail-closed sur fallback secondaire pour `capture_dual` et `capture_active_window`, non-régression dim normale).
Cycle TDD respecté : RED observé avant chaque GREEN sur les 4 tests qui ont fait l'objet d'une implémentation neuve (tests 1, 3, 5, 8).
## Points ouverts
### Bugs P0 identifiés mais NON fixés
| # | Origine | Statut |
|---|---|---|
| P0 #1 audit Léa-first | `record_human_correction` double bug (import inexistant + signature obsolète) | **non fixé** |
| P0 #2 audit Léa-first | `build_workflow_replay` orphelin (0 caller runtime) | **non fixé** — note : pertinence à reconsidérer maintenant que le contrat `/finalize` enrichi semble couvrir le besoin |
| P0 #3 audit Léa-first / Mission 3 | `window_title` perdu : asymétrie écriture top-level vs lecture target_spec (`stream_processor.py:1545` vs `:1590-1601`) | **non fixé** |
| P0 #3 audit Léa-first / Mission 3 | Fallback `expected_window_before` morte dans `api_stream.py:3636` (cherche dans target_spec, n'est jamais là) | **non fixé** |
| P0 #4 audit Léa-first | `mss.monitors[1]` aveugle aux dims aberrantes | ✅ **FIXÉ** missions 2 + 2b |
### Validations Windows en attente
| Item | Statut |
|---|---|
| SCP des 5 fichiers vers `dom@192.168.1.11:C:/rpa_vision/agent_v1/` (capturer.py, finalize_contract.py, streamer.py, smart_tray.py, main.py) | **non fait** |
| Reproduction réelle du bug mss monitors aberrant | **non vérifié** (la garde protège sans expliquer la cause exacte) |
| Smoke test 5 minutes `enregistrement → finalize → proposition → replay-session` sur Léa Windows | **non fait** |
| Contrat serveur `/finalize` enrichi renvoie bien `{replay_ready, replay_request, replay_launch}` | **non vérifié** (audité côté agent uniquement, jamais déclenché en condition réelle) |
### État git
- 5 fichiers modifiés non committés (`capturer.py` par moi ; `main.py`, `streamer.py`, `smart_tray.py`, `executor.py` non par moi)
- 1 fichier untracked (`finalize_contract.py`, non par moi)
- 6 documents créés dans `docs/` et `docs/handoffs/` (par moi, non committés)
## Risques / hypothèses
### Sur le déploiement et la synchro client Windows
- **Hypothèse** : le canal de déploiement Windows reste le `sshpass scp` manuel fichier par fichier vers `C:/rpa_vision/agent_v1/`, conforme à `memory/feedback_scp_auto_modif_client_windows.md`. **Non vérifié** : aucun script SCP automatique n'est présent dans le repo, et le dossier `agent_v0/deploy/windows_client/` est obsolète de 2 à 7 semaines selon les fichiers (sert au setup initial, pas à l'incrémental).
- **Risque critique** : `finalize_contract.py` est un fichier neuf untracked. Le réflexe "je SCP les fichiers modifiés" ne le couvre pas. **Si oublié → ImportError au démarrage Léa, agent ne démarre pas**.
- **Risque** : SCP non atomique. Si Léa est relancée entre 2 SCP, état incohérent possible. Mitigation : SCP les 5 fichiers d'abord, **puis** relancer Léa.
- **Hypothèse** : token `RPA_API_TOKEN` est exporté côté session Windows. **Non vérifié** depuis cette session. Sans token → `register` et `finalize` retournent 401 silencieusement.
### Sur le contrat `/finalize` enrichi
- **Observé** : le câblage agent-side consomme un contrat `{replay_ready, replay_request, replay_launch}` (avec `replay_launch.status` ∈ {`started`, `failed`}). **Non vérifié** : le serveur Linux retourne effectivement ce contrat. Si le serveur renvoie encore l'ancien payload, le smoke test s'arrêtera silencieusement après l'étape "Session finalisée" sans crash ni proposition.
### Sur le fix monitor
- **Fait** : la garde protège contre dim aberrante via mocks. **Non vérifié** sur Léa Windows réelle (pas de SCP). La cause exacte côté `mss` reste non identifiée — cette garde **protège sans expliquer**.
- **Hypothèse** : seuil 200 px choisi par jugement, pas par mesure empirique sur l'éventail des dims légitimes. À relever si un faux rejet apparaît en prod.
## Ce que je recommande pour la suite
1. **Committer `finalize_contract.py` et les 5 fichiers modifiés** avant tout SCP. Un fichier untracked qui disparaît dans un `git stash` ou `git checkout` casserait silencieusement Léa au prochain démarrage. Un seul commit groupé `feat(agent): câblage contrat /finalize enrichi + garde dims monitor` aligne aussi les deux chantiers Horizon 1.
2. **Smoke test 5 min sur Léa Windows en suivant `docs/SMOKE_TEST_FINALIZE_REPLAY_2026-05-20.md`** avant tout autre développement. Risque P0 : tant qu'on n'a pas vu le flux complet `enregistrement → finalize → proposition → replay-session` tourner sur Léa réelle, on ne sait pas si le contrat serveur est bien aligné avec le câblage agent.
3. **Fixer les bugs P0 #1 et #3 (Mission 3) dans une mission courte dédiée** :
- `record_human_correction` (2 lignes : import + signature)
- `expected_window_before` fallback (1 ligne dans `api_stream.py:3636` : `action.get(...) or _tspec.get(...)` au lieu de `_tspec.get(...) or _tspec.get(...)`)
Ces 3 lignes débloquent l'apprentissage supervisé et la fallback mémoire, sans dépendre du run Windows.
4. **Reconsidérer le statut de P0 #2 (`build_workflow_replay` orphelin)** maintenant que le contrat `/finalize` enrichi expose `replay_request`. Hypothèse : le besoin du pont capture→replay-direct est résolu par le nouveau contrat. Si vrai → supprimer `workflow_replay.py` (code mort) ou le marquer explicitement obsolète. À trancher avant prochaine session sur le sujet.
5. **Ne pas attaquer le bug P0 #3 racine (window_title posé top-level au lieu de target_spec dans `stream_processor.py:1545`) sans confirmation produit du contrat mémoire**. La correction "rapide" (propager dans target_spec) marche mais n'élimine pas le doublon top-level / target_spec présent dans tout le code. Mieux : décider d'abord si la signature d'écran reste `sha256(window_title)` ou évolue (référence `last_window_info` au niveau session, par exemple).
---
**Conformité aux contraintes** : pas de réécriture historique projet, VWB mentionné une seule fois (recommandation 4, comparaison de pont), pas de proposition de refonte, factuel, court. Aucune modification de code dans cette mission handoff.

View File

@@ -0,0 +1,142 @@
# Handoff Horizon 1 — Lea-first
Date : 2026-05-20
Owner : Codex
Contexte : remise en ordre du coeur produit `Lea-first` en excluant `VWB` du chemin nominal court terme.
## 1. Ligne produit retenue
- Coeur produit court terme : `capture -> replay direct -> verification -> memory`
- `VWB` n'est pas la reference produit
- `TargetMemoryStore` est la boucle d'apprentissage utile pour Horizon 1
- La voie `shadow -> WorkflowIR -> ExecutionPlan` reste une direction moyen terme, pas la voie nominale actuelle
## 2. Tickets traites
### T1 — correction humaine -> mémoire persistante
Fichiers :
- `agent_v0/server_v1/replay_learner.py`
- `tests/unit/test_policy_grounding_recovery_learning.py`
Effet :
- `record_human_correction()` repersiste bien dans la mémoire cible
- fallback `window_title` amélioré
### T2 — pause/reprise replay côté agent
Fichiers :
- `agent_v0/agent_v1/core/executor.py`
- `agent_v0/agent_v1/main.py`
- `tests/unit/test_agent_v1_replay_pause_state.py`
Effet :
- `replay_paused=true` ne coupe plus prématurément le mode replay
### T3 — contrat `window_title` pour la mémoire
Fichiers :
- `agent_v0/server_v1/stream_processor.py`
- `agent_v0/server_v1/api_stream.py`
- `tests/unit/test_window_title_memory_path.py`
Effet :
- le flux Lea-first propage `window_title` jusque dans les chemins mémoire importants
### T4 — chaînage produit `finalize -> replay-session`
Fichiers :
- `agent_v0/server_v1/api_stream.py`
- `tests/integration/test_finalize_replay_chain.py`
Effet :
- `POST /api/v1/traces/stream/finalize` reste compatible
- expose maintenant `replay_ready` et `replay_request`
- peut lancer un replay direct avec `launch_replay=true`
- si le lancement échoue, la finalisation reste un succès exploitable
### T5 — intégration agent du contrat `finalize`
Fichiers :
- `agent_v0/agent_v1/network/streamer.py`
- `agent_v0/agent_v1/ui/smart_tray.py`
- `agent_v0/agent_v1/main.py`
- `agent_v0/agent_v1/finalize_contract.py`
- `tests/unit/test_agent_finalize_replay_contract.py`
- `tests/integration/test_client_server_compat.py`
Effet :
- `TraceStreamer` remonte le payload JSON de `/finalize`
- `AgentV1` route ce payload vers une logique légère dédiée
- le systray propose un test immédiat avec consentement humain
- le lancement de test passe par `POST /api/v1/traces/stream/replay-session`
- on ne réutilise pas `_launch_replay()` car cette méthode cible `/replay/start` avec `workflow_id`
## 3. Tests verts
- `pytest -q tests/unit/test_agent_v1_replay_pause_state.py`
- `pytest -q tests/unit/test_window_title_memory_path.py`
- `pytest -q tests/unit/test_agent_finalize_replay_contract.py`
- `pytest -q tests/integration/test_client_server_compat.py -k finalize`
- `pytest -q tests/integration/test_finalize_replay_chain.py`
- `pytest -q tests/unit/test_capturer_monitor_guard.py`
- `pytest -q tests/unit/test_target_memory_store.py`
- `pytest -q tests/unit/test_policy_grounding_recovery_learning.py -k 'ReplayLearner and human_correction'`
Note :
- le fichier complet `tests/unit/test_policy_grounding_recovery_learning.py` reste non portable localement à cause de `pynput`
## 4. Etat du worktree
Modifs runtime principales en cours :
- `agent_v0/agent_v1/core/executor.py`
- `agent_v0/agent_v1/main.py`
- `agent_v0/agent_v1/network/streamer.py`
- `agent_v0/agent_v1/ui/smart_tray.py`
- `agent_v0/agent_v1/vision/capturer.py`
- `agent_v0/server_v1/api_stream.py`
- `agent_v0/server_v1/replay_learner.py`
- `agent_v0/server_v1/stream_processor.py`
- `tests/integration/test_client_server_compat.py`
- `tests/unit/test_policy_grounding_recovery_learning.py`
Nouveaux fichiers runtime/tests :
- `agent_v0/agent_v1/finalize_contract.py`
- `tests/integration/test_finalize_replay_chain.py`
- `tests/unit/test_agent_finalize_replay_contract.py`
- `tests/unit/test_agent_v1_replay_pause_state.py`
- `tests/unit/test_capturer_monitor_guard.py`
- `tests/unit/test_window_title_memory_path.py`
Fichiers hors-scope a ne pas embarquer par reflexe :
- `visual_workflow_builder/backend/instance/workflows.db`
- docs d'audit/handoff/plan si on veut un commit runtime pur
- `.remember/*`
## 5. Recommandation de commit
Point de commit pertinent :
- un commit runtime/tests cohérent `Horizon 1 Lea-first`
Message suggéré :
- `lea-first: stabilize direct replay and finalize contract`
## 6. Prochain objectif
Ne pas ouvrir un nouveau chantier code tout de suite.
Priorité suivante :
- validation réelle du flux :
`fin enregistrement -> finalize -> proposition utilisateur -> replay-session`
Mission de lecture utile à déléguer :
- vérifier le déploiement Windows effectif des fichiers modifiés
- produire une checklist de smoke test réel de 5 minutes
## 7. Décision de reprise
Si nouvelle session :
- repartir à partir de ce handoff
- considérer le bloc `serveur + agent + tests finalize` comme base de référence
- ne pas revenir sur `VWB`
- passer en mode `validation réelle / déploiement / smoke test`

View File

@@ -0,0 +1,100 @@
Contexte
- Projet : `rpa_vision_v3`
- Poste Windows de démo : `dom@192.168.1.11`
- Léa Windows poll le serveur Linux `192.168.1.40:5005`
- Coordination Claude/Codex via `docs/coordination/`
Direction produit
- Ne pas dériver vers une simple “boîte à clic”.
- Cible produit : `capture brute -> post-traitement -> workflow différé compilé -> exécution supervisable`.
- Le `replay-session` direct reste utile pour smoke/debug, mais nest pas la voie produit finale.
- Les “réflexes” (`Enregistrer`, `Ouvrir`, `Copier`, etc.) doivent idéalement devenir des primitives robustes, pas des chorégraphies visuelles fragiles.
État code important déjà en place
- `finalize -> replay-session` validé.
- setup Windows durci par `verify_screen`.
- propagation `expected_window_before` côté serveur.
- relaxation ciblée du seuil pour `switch_tab`.
- garde drift `anchor-template`.
- handler runtime popup `Confirmer l'enregistrement -> Oui` ajouté côté agent dans `executor.py`.
- nouveau patch grounding côté agent :
- rejet des rects système / taskbar
- validation visuelle du crop fenêtre avant usage
- fallback plein écran si le crop ne matche pas visuellement
Derniers fichiers touchés
- `agent_v0/agent_v1/core/executor.py`
- `agent_v0/agent_v1/core/grounding.py`
- `tests/unit/test_executor_verify_window_guard.py`
- `tests/unit/test_policy_grounding_recovery_learning.py`
Validation locale récente
- `./.venv/bin/pytest -q tests/unit/test_executor_verify_window_guard.py`
- `./.venv/bin/pytest -q tests/unit/test_policy_grounding_recovery_learning.py -k GroundingEngine`
- `python3 -m py_compile agent_v0/agent_v1/core/executor.py`
- `python3 -m py_compile agent_v0/agent_v1/core/grounding.py tests/unit/test_policy_grounding_recovery_learning.py`
Déploiement Windows récent
- `C:\\rpa_vision\\agent_v1\\core\\executor.py` mis à jour
- `C:\\rpa_vision\\agent_v1\\core\\grounding.py` mis à jour
- `py_compile` Windows OK pour ces fichiers
Problème infrastructure découvert
- Le serveur Linux nutilise pas réellement le GPU actuellement.
- Symptômes :
- `nvidia-smi` échoue avec `Driver/library version mismatch`
- module noyau NVIDIA `580.126.09`
- libs userspace `580.159.03`
- PyTorch `.venv` : `cuda_available=False`
- Conséquence :
- une partie des résolutions vision reste CPU-bound
- les `Server resolve timeout` à 30s sont fortement amplifiés
- Correctif probable infra :
- reboot Linux pour réaligner driver chargé / libs
- sinon réparation driver NVIDIA
Replays live récents
- `replay_sess_ebb4d998`
- a servi à valider le besoin du handler popup overwrite
- `replay_sess_3c56b8f2`
- lancé avec mauvais `machine_id=bg_DESKTOP-58D5CAC_windows`
- non consommé par Léa
- `replay_sess_595c4947`
- lancé avec le bon `machine_id=DESKTOP-58D5CAC_windows`
- bien consommé par Léa
État exact du replay courant `replay_sess_595c4947`
- `status=running`
- `completed_actions=11/17`
- setup passé
- saisie `test` passée
- nouveau grounding visuel actif, preuve log :
- `Grounding fenêtre validé visuellement via 'test'`
- point de casse courant :
- action `act_raw_74e4e5ec` = clic onglet `Enregistrer sous`
- retry puis `som_anchor_match score=0.74`
- clic exécuté
- `POST-VÉRIF TIMEOUT : 'rpa_vision : Explorateur de fichiers' ≠ '*test - Bloc-notes'`
- action suivante `act_raw_022cb97c` se bloque immédiatement car fenêtre actuelle = `rpa_vision : Explorateur de fichiers`
- Léa repasse en apprentissage supervisé
Important
- Le handler popup overwrite `Oui/Non` na pas encore été réellement exercé sur ce run.
- Le blocage actuel est plus tôt : dérive `Enregistrer sous -> Explorateur`.
- Je nai pas de trace dun `Ctrl+C` dans ce replay courant.
Coordination Claude
- Brief ouvert :
- `docs/coordination/inbox_claude/2026-05-23_1024_codex-to-claude_notepad-saveas-explorer-drift.md`
- Réponse attendue dans :
- `docs/coordination/inbox_codex/`
Actions recommandées pour reprise
1. Lire le brief Claude ci-dessus et sa réponse si elle existe.
2. Vérifier si la machine Windows a bien redémarré Léa proprement.
3. Vérifier létat du replay courant `replay_sess_595c4947`.
4. Si le run est abandonné après reboot, relancer un nouveau `POST /replay-session` avec :
- `session_id=sess_20260520T102916_066851`
- `machine_id=DESKTOP-58D5CAC_windows`
5. Continuer le diagnostic uniquement sur la dérive `Enregistrer sous -> Explorateur`.
6. Garder en tête le problème infra GPU, mais ne pas le mélanger avec le bug fonctionnel de ce replay.

View File

@@ -0,0 +1,142 @@
# Handoff Codex — LeaBench / Grounding / Supervision equipe
Date : 2026-05-24 22:06 Europe/Paris
Auteur : Codex
Statut memoire Codex : `OK`, mais handoff ecrit pour reprise propre ou nouvelle session.
## Position projet
Lea ne doit pas etre une boite a clics. Direction maintenue :
`observe -> verifier preconditions -> agir -> stabiliser -> juger -> apprendre uniquement sur preuve saine`
Decisions non negociables :
- cloud models = analyse offline uniquement, apres anonymisation explicite ;
- runtime Lea reste controle par notre code ;
- aucun modele externe ne prend le controle direct de Windows ;
- corrections humaines et memory ne sont apprises que si coordonnees et contexte sont sains ;
- pas de branchement runtime experimental sans tests et rollback.
## Commits recents importants
- `debd7b423 feat(evaluation): add local Ollama LeaBench adapter`
- `6544ebe3f feat(evaluation): add 16 LeaBench cases from replay failures`
- `10136f0ee feat(agent): add standalone anchor-relative resolver`
- `054279feb feat(evaluation): add LeaBench model prompt packs`
- `ea1f57afb feat(evaluation): add LeaBench computer-use scorer`
- `345762330 fix(agent): respect server visual reject before text fallback`
- `b1b32187b fix(agent): P0.6 guard human corrections`
- `ad24d16d8 fix(executor): P0.9 double-check stabilité post-transition fenêtre`
## Etat code
LeaBench :
- `core/evaluation/computer_use_bench.py`
- `tools/lea_bench.py`
- `benchmarks/computer_use/cases/notepad_replay_failures_2026-05-24.jsonl`
- `benchmarks/computer_use/cases/leabench_extended_2026-05-24.jsonl`
- 4 cas Notepad initiaux + 16 cas etendus = 20 cas total.
- Les 16 cas etendus ont `screenshot_path` reels et sont valides.
Prompt packs :
- `--write-prompt-pack` ajoute a LeaBench.
- Le prompt pack ne fuite pas `expectation` ni `click_region`.
Adaptateur Ollama local :
- `core/evaluation/ollama_lea_bench_adapter.py`
- `tools/lea_bench_ollama.py`
- tests mockes dans `tests/unit/test_ollama_lea_bench_adapter.py`
- aucun run live Ollama n'a ete lance apres implementation, pour eviter contention GPU/Ollama pendant Lea.
Anchor relative :
- `agent_v0/agent_v1/core/anchor_relative.py`
- `agent_v0/agent_v1/core/anchor_catalog.py`
- `tests/unit/test_anchor_relative.py`
- Phase 1 standalone acceptee et committee.
- Pas de branchement `executor.py`.
- Garde Codex ajoute : `target_out_of_bounds`.
## Verifications passees
Commandes importantes deja passees :
```bash
python3 -m pytest -q tests/unit/test_computer_use_bench.py tests/unit/test_ollama_lea_bench_adapter.py tests/unit/test_anchor_relative.py
python3 -m py_compile core/evaluation/ollama_lea_bench_adapter.py tools/lea_bench_ollama.py
python3 tools/lea_bench.py --cases benchmarks/computer_use/cases/notepad_replay_failures_2026-05-24.jsonl --repo-root . --json
python3 tools/lea_bench.py --cases benchmarks/computer_use/cases/leabench_extended_2026-05-24.jsonl --repo-root . --json
```
Resultats :
- 25 tests verts sur les 3 modules.
- 4 cas Notepad valides.
- 16 cas etendus valides.
- baseline all-abstain sur 16 cas : 10/16 correct, 0 dangereux.
## Coordination lue
Claude :
- `2026-05-24_2230_claude-to-codex_qwen-leabench-prompt-spec.md`
- `2026-05-24_2230_claude-to-codex_anchor-relative-phase1-result.md`
- `2026-05-24_2230_claude-to-codex_leabench-cases-enrichis.md`
Gemini :
- `2026-05-24_2315_gemini-to-codex_leabench-adapters-and-cases-v1.md`
- `2026-05-24_2345_gemini-to-codex_cloud-adapters-privacy-spec.md`
- `2026-05-24_2355_gemini-to-codex_continual-learning-alignment.md`
Messages envoyes :
- `docs/coordination/inbox_claude/2026-05-24_2206_codex-to-claude_memory-health-check-and-handoff.md`
- `docs/coordination/outbox_gemini/2026-05-24_2206_codex-to-gemini_memory-health-check-and-handoff.md`
- `docs/coordination/outbox_gemini/2026-05-24_2208_codex-to-gemini_quality-frame-source-discipline.md`
## Points de vigilance
Deploiement Léa Windows :
- Verifie le 2026-05-24 vers 22:18 : `C:\rpa_vision\agent_v1\core\executor.py` date du 24/05 20:24, taille 176068 bytes.
- Marqueurs absents cote Windows : `skip_text_fallback_after_server_reject`, `drain_guard_s`, `below_threshold`.
- Conclusion : `b1b32187b` P0.6 et `345762330` R1 ne sont pas deployes cote client Windows.
- Ne pas relancer de replay live avant backup + SCP du `agent_v0/agent_v1/core/executor.py` local actuel vers Windows, puis relance Lea.
Gemini cloud/privacy :
- Ne pas accepter comme verite les IDs API `gpt-5.5`, `claude-opus-4.7`, etc. sans verification officielle.
- Distinguer vision offline vs computer-use natif vs runtime Lea.
- Ne pas coder d'adaptateur cloud maintenant.
- Regle imposee a Gemini : chaque claim doit etre classe `SOURCE_OFFICIELLE_VERIFIEE`, `SOURCE_PRIMAIRE_NON_OFFICIELLE`, `HYPOTHESE`, `PROPOSITION_PROJET` ou `A_VERIFIER`.
- Toute mention de modele/API/benchmark sans source officielle reste non decision-ready.
GPU/Ollama :
- Ne pas lancer `tools/lea_bench_ollama.py` si Lea est active.
- Lancer uniquement quand Dom confirme que Lea est idle.
Git :
- Beaucoup de docs non suivis dans `docs/`, `docs/coordination/`, `docs/recherche/`.
- Ne pas nettoyer/revert.
- Les commits techniques recents sont propres ; les docs coordination restent souvent untracked volontairement.
## Prochaine action recommandee
Si Dom confirme que Lea est idle :
```bash
python3 tools/lea_bench_ollama.py \
--cases benchmarks/computer_use/cases/leabench_extended_2026-05-24.jsonl \
--repo-root . \
--model qwen2.5vl:7b-rpa \
--output benchmarks/computer_use/predictions/qwen25vl_extended_2026-05-24.jsonl
python3 tools/lea_bench.py \
--cases benchmarks/computer_use/cases/leabench_extended_2026-05-24.jsonl \
--repo-root . \
--predictions benchmarks/computer_use/predictions/qwen25vl_extended_2026-05-24.jsonl \
--json
```
Sinon :
- attendre les reponses memory-health de Claude et Gemini ;
- preparer Phase 2 `GroundingGuard` sur design/test plan uniquement ;
- ne pas brancher runtime avant arbitrage.
## Resume court pour reprise
On a stabilise l'axe evaluation avant de continuer a corriger au feeling. LeaBench existe, il a 20 cas reels, un prompt pack neutre, et un adaptateur Ollama local teste sans GPU. `anchor_relative` existe en Phase 1 standalone. Prochaine decision : lancer Qwen local quand Lea est idle, puis utiliser le score pour decider quoi brancher dans `GroundingGuard`.

View File

@@ -0,0 +1,127 @@
# Handoff Claude — Phase 2 Notepad live réussi, passage session fraîche
- **Date** : 2026-05-25 09:10
- **Auteur** : Claude (session 18h→09h, ~15h continue)
- **Contexte** : live Bloc-notes `replay_sess_e96e5822` réussi 18/18, dialog handler runtime validé en prod. Dom demande session fraîche avant Phase 2 wiring.
## État mémoire honnête (au moment du handoff)
**Solide** :
- Modèle Mandat/Protocoles/Scènes v0.3 (vocabulaire complet, boucle 8 étapes, contrat d'action)
- 4 découvertes structurantes (D1 source/deploy, D2 expected_state mort, D3 single in-flight, D4 LearningManager dormant)
- 3 dataclasses créées hier (Trace, SceneExpected, Precondition+Recovery) — commit `7bb8d543a`
- Discipline rollback (tags, .bak Windows, sshpass `'loli'`)
- Contraintes Codex (4 fichiers en lecture seule)
- Pipeline de coordination (inbox_claude/inbox_codex)
**Friction qui commence** :
- Précision sur les `file:line` exacts (re-grep nécessaire)
- Détail diff par diff des 14 commits
- Détails fins des 7 tests manquants WP4
**Recommandation Claude** : session fraîche maintenant = la bonne décision. Confiance baisse sur les détails fins après ~15h continue.
## Décisions conceptuelles à conserver
1. **Léa est mandatée, pas commandée** : reçoit une fin, choisit le chemin, qualifie le retour.
2. **Un protocole est une grammaire d'action autour d'une intention** (≠ workflow scripté).
3. **Autonomie d'initiative, pas d'entêtement** + délégation tutorée 5 niveaux (N0 observation → N4 autonomie habituelle, contextuel selon protocole/app/client/tuteur/période).
4. **Précondition = état attendu vérifiable avant l'action** (formulation Dom).
5. **Priorité protocoles** : mieux connu → moins risqué → plus court.
6. **Apprentissage uniquement sur résultat qualifié** ; désapprentissage gradué (réduire confiance / restreindre périmètre / quarantaine / supprimer).
7. **Méta-cognition minimale** : 4 critères agrégés (score / ancre / scène / prédiction) → AGIR / DEMANDER / ABSTENTION.
8. **Rejet sémantique domine fallbacks opportunistes** (règle d'or — déjà gagnée pour close_tab via commit `345762330`).
## Workpacks produits ce matin (à intégrer)
| ID | Sujet | Livrable inbox_codex | Conclusion clé |
|---|---|---|---|
| WP1 (0905) | Inventaire source vs deploy | `2026-05-25_0905_WP1-inventaire-source-deploy.md` | **Risque CRITIQUE** : 9 fichiers divergents, 50% codebase deploy obsolète de 20j. NE PAS RESYNC avant démo. Porter d'abord `monitor_resolution` deploy→source. |
| WP2 (0905) | SceneExpected wiring | `2026-05-25_0905_WP2-scene-expected-wiring.md` | Point injection : `_attach_scene_expected()` dans stream_processor.py l.1368. Plan B (hors zone interdite Codex) recommandé passe 1. Flag `RPA_SCENE_EXPECTED` OFF. |
| WP3 (0905) | expected_state → Precondition | `2026-05-25_0905_WP3-expected-state-precondition.md` | Mapping Notepad : `Precondition(window_title_must_contain=["Sans titre","Untitled"])` + `Recovery(Ctrl+N, wait 400ms)`. Nouveau module isolé `precondition_inference.py`. Flag `RPA_PRECONDITION_INFER`. |
| WP4 (0905) | Single in-flight tests + factorisation | `2026-05-25_0905_WP4-single-inflight-tests-factorisation.md` | Helper `_find_in_flight_action()` remplace blocs api_stream.py:3074-3095 et 3138-3159. 3 tests critiques (1 vert, 1 xfail attendu, 1 limitation Q7). |
## Documents stratégiques à relire au redémarrage
Dans cet ordre :
1. `docs/architecture/MODELE_MANDAT_PROTOCOLS_LEA_2026-05-25_v0.3_ARBITRAGES_DOM.md` — modèle de base
2. `docs/architecture/CARTOGRAPHIE_BRIQUES_MANDAT_PROTOCOLS_2026-05-25.md` — carto initiale Codex
3. `docs/plans/PLAN_PHASE2_TRACE_MANDAT_PROTOCOLS_2026-05-25.md` — plan d'exécution Phase 2
4. `docs/coordination/inbox_codex/2026-05-25_0626_claude-to-codex_rapport-complet-phase-attente.md` — vue d'ensemble pour reprise
5. `docs/coordination/inbox_codex/2026-05-25_0905_claude-to-codex_WP{1,2,3,4}*.md` — les 4 derniers WP
6. `docs/coordination/inbox_claude/2026-05-25_0855_codex-to-claude_live-notepad-success-speed-followup.md` — preuve live + 3 axes follow-up
## Commits Phase 2 / cognition (état branche `backup/post-demo-2026-05-19`)
```
7bb8d543a feat(cognition): dataclasses Trace + SceneExpected + Precondition (Phase 2.1) ← Claude
[commits Codex Phase 2.0 grounding + précondition Notepad + single in-flight]
debd7b423 feat(evaluation): add local Ollama LeaBench adapter ← Codex
6544ebe3f feat(evaluation): add 16 LeaBench cases from replay failures ← Claude
10136f0ee feat(agent): add standalone anchor-relative resolver ← Claude
054279feb feat(evaluation): add LeaBench model prompt packs ← Codex
ea1f57afb feat(evaluation): add LeaBench computer-use scorer ← Codex
345762330 fix(agent): respect server visual reject before text fallback ← Codex
b1b32187b fix(agent): P0.6 guard human corrections ← Codex
ad24d16d8 fix(executor): P0.9 double-check stabilité post-transition fenêtre ← Claude
a76f3db68 feat(executor): P1 DialogResolver serveur en fallback ← Claude
9a029a221 fix(executor): timeout 120→30s ← Claude
5ed1810ef fix(memory): rejeter coords (0,0) et hors [0,1] ← Claude
c9878f0a7 fix(validator-v2): override success=False uniquement sur TERMINATE
```
Tags rollback récents : `rollback/pre-cognition-dataclasses-2026-05-25_0610`, et tous les tags P0.x/P1 d'hier.
## Risques restants
1. **Désynchronisation source/deploy** (D1) : critique, ne pas resync avant démo. Porter `monitor_resolution` deploy→source en priorité quand Codex libère executor.py.
2. **Race lock 3349/3470** (D3) : commentaire "race bénigne" accepte le double dispatch. Faible risque démo (Léa unique), à traiter post-démo.
3. **`expected_state` mort** (D2) : produit par gemma4 mais jamais lu. WP3 propose le wiring sans gros refactor.
4. **autonomous_planner orphelin** (D4) : 1019 LOC, endpoints HTTP 410. À archiver post-démo.
5. **Fixtures `replay_failures/` non versionnées** : si purgé, LeaBench casse. Décision Dom : versionner post-démo.
## Ce que Claude doit faire dans la prochaine session
1. **Relire les 6 documents stratégiques ci-dessus** (15 min)
2. **Vérifier l'état d'avancement Codex** sur le test live `replay_sess_e96e5822` + 3 axes follow-up (perf, trimming, test offline)
3. **Attendre arbitrage Codex** sur l'ordre d'intégration des 4 WP avant tout patch
4. **Respecter les 4 fichiers en lecture seule** : `executor.py`, `api_stream.py`, `replay_engine.py`, `grounding.py` (tant que Codex n'a pas explicitement libéré)
5. **Continuer la discipline rollback** : tag avant chaque modif, commit atomique, tests verts avant
6. Si patch validé par Codex : utiliser sshpass `SSHPASS='loli' sshpass -e scp/ssh dom@192.168.1.11` pour SCP Windows
## Ce que Claude ne doit PAS faire
- ❌ Modifier runtime sans accord explicite Codex
- ❌ Toucher aux 4 fichiers interdits tant que Codex pilote
- ❌ Réveiller `autonomous_planner`, `ORALoop`, `LearningManager` (modules dormants identifiés)
- ❌ Refactor `report_action_result` (700 lignes, 4 écritures, fragile)
- ❌ Refactor `resolve_engine._resolve_target_sync` (cascade VLM)
- ❌ Resync brutale source/deploy avant démo
- ❌ Activer `DialogResolver` serveur en live alors qu'il est déjà OK côté Léa
- ❌ Modifier schéma `target_memory.db` (5 backups en prod)
- ❌ Spawner d'agents pour du brainstorming si question est ciblée (overkill — réservé aux explorations larges et workpacks parallèles)
## Infos opérationnelles
- **Démo DPI** : `http://192.168.1.40:8765/` (Easily, pour tests futurs post-Bloc-notes)
- **Léa Windows** : 192.168.1.11, SSH password `loli`, exec via sshpass
- **rpa-streaming** : systemd user sur Linux, port 5005
- **Branche** : `backup/post-demo-2026-05-19`
- **DB target_memory** : `/home/dom/ai/rpa_vision_v3/data/learning/target_memory.db` (25 entrées valides, 0 poison (0,0))
## Inventaire complet des messages coordination 2026-05-24 → 2026-05-25
**inbox_claude/** (de Codex à Claude) : 25 messages depuis 2026-05-23 (le vieux `notepad-saveas-explorer-drift` reste open en option B, classé non-actionable).
**inbox_codex/** (de Claude à Codex) : ~30 messages depuis 2026-05-23.
Trop pour les lister, mais les plus récents (24h) :
- 13 messages de 2026-05-24 18h → 22h (P0.6 à P1, R1, anchor_relative, LeaBench cases, Qwen spec, GroundingGuard, observations Dom)
- 12 messages de 2026-05-25 02h → 09h (brainstorming Mandat/Protocoles v0.2/v0.3, cartographies A1-A4 + carto complémentaire, dataclasses cognitives, 4 WP, rapport phase attente)
---
**Statut handoff** : prêt pour redémarrage session fraîche. Bonne reprise.
Auteur : Claude

View File

@@ -0,0 +1,261 @@
# Handoff Codex — Notepad success / Phase 2 cognitive
Date : 2026-05-25 09:04 Europe/Paris
Auteur : Codex
Statut memoire Codex : OK pour supervision, mais session fraiche recommandee avant nouvelle phase de programmation lourde.
## TL;DR
Le test live Bloc-notes est passe de bout en bout.
- Replay : `replay_sess_e96e5822`
- Source : `sess_20260520T102916_066851`
- Machine : `DESKTOP-58D5CAC_windows`
- Resultat live : `18/18`, `0` echec, `0` retry, `0` non-verifie
- Point critique valide : dialogue Windows `Confirmer l'enregistrement` absorbe sans aide humaine
- Signal cle : `warning='runtime_dialog_handled_post_verify'`
Conclusion produit : le scenario n'est plus seulement une boite a clic. Lea a reussi a poursuivre son intention d'enregistrement malgre un dialogue systeme connu.
## Position projet a conserver
Lea doit etre pilotee comme un collaborateur visuel :
`mandat -> intention -> scene attendue -> precondition -> action -> retour observe -> apprentissage sain`
Principes non negociables :
- Ne pas traiter Lea comme un replay de pixels.
- Verifier l'etat reel avant les gestes sensibles.
- Ne pas apprendre depuis un succes douteux ou une correction humaine parasite.
- Les dialogues connus doivent etre absorbes dans la fenetre active, avec verification que le dialogue disparait.
- Les dialogues inconnus doivent produire du doute type et une demande d'aide, pas un clic opportuniste.
- Claude doit etre delegue largement avant toute phase longue ; Codex garde supervision, arbitrage, integration et live.
Directive persistante ajoutee :
- `docs/coordination/CODEX_MEMO_STRATEGIE_SUPERVISION_2026-05-24.md`
## Travail realise depuis le precedent handoff
### Correctifs runtime / tests locaux
Fichiers modifies cote Codex :
- `agent_v0/agent_v1/core/executor.py`
- `agent_v0/agent_v1/core/grounding.py`
- `agent_v0/server_v1/api_stream.py`
- `agent_v0/server_v1/replay_engine.py`
- `tests/integration/test_replay_session_trim_neutral.py`
- `tests/unit/test_env_setup.py`
- `tests/unit/test_executor_verify_window_guard.py`
- `tests/unit/test_grounding_engine.py`
Points fonctionnels :
- Grounding : respecte les rejets serveur explicites, notamment les rejets `close_tab_*`, `drift_*`, `below_threshold`.
- Replay setup Notepad : ouverture d'un document vierge avec `Ctrl+N` et verification de scene Bloc-notes.
- API replay : garde single in-flight partielle pour eviter plusieurs actions concurrentes.
- Executor Windows : handler de dialogue runtime connu revu pour travailler dans la fenetre active, cliquer le bouton attendu, puis verifier que la fenetre a change.
Tests passes :
```bash
.venv/bin/python -m py_compile agent_v0/agent_v1/core/executor.py tests/unit/test_executor_verify_window_guard.py
.venv/bin/python -m pytest -q tests/unit/test_executor_verify_window_guard.py
```
Resultat : tests `test_executor_verify_window_guard.py` verts.
Note : `python3 -m pytest` systeme echoue car `pynput` absent ; utiliser `.venv/bin/python`.
### Deploiement Windows
Deploiements effectues vers Lea Windows :
- `C:\rpa_vision\agent_v1\core\grounding.py`
- `C:\rpa_vision\agent_v1\core\executor.py`
Verifications :
- `python -m py_compile C:\rpa_vision\agent_v1\core\executor.py` OK cote Windows.
- `grounding.py` egalement compile OK apres SCP precedent.
- Lea a ete relancee par Dom avant le live test.
Attention : SSH a ensuite echoue avec `Too many authentication failures`; ne pas supposer que SSH est disponible sans corriger l'auth.
## Resultat live important
Ancien replay annule proprement :
- `replay_sess_37dd7cdf` -> `cancelled`
- verification : `active=0`
Nouveau replay propre :
- `replay_sess_e96e5822`
- lance apres redemarrage Lea et focus ecran 1
- termine avec succes selon logs :
- `Replay replay_sess_e96e5822 termine avec succes : 18/18 actions`
- metriques : `4 resolves [anchor_template=1, grounding_vlm=1, semantic_close_tab_hotkey=1, som_anchor_match=1] score_moy=0.94 temps_moy=10755ms`
Point critique :
- action : `act_raw_a8dbaaac`
- intention : enregistrer le document dans `Enregistrer sous`
- dialogue apparu : `Confirmer l'enregistrement`
- serveur OCR n'a pas trouve `Oui` via OCR-only
- agent/runtime a quand meme gere le dialogue
- report :
- `success=True`
- `warning='runtime_dialog_handled_post_verify'`
- `resolution_method='anchor_template'`
Interprétation :
- La brique "dialogue connu dans fenetre active + verification post-clic" fonctionne sur le cas Notepad.
- Le comportement doit maintenant devenir un test offline, pas rester une anecdote live.
## Problemes observes pendant le live
### Performance
Le demarrage et l'execution sont trop lents.
Observations :
- Environ 60 s entre preparation et demarrage effectif.
- Premier dispatch double :
- deux `DISPATCH act_setup_sess_open_run` quasiment simultanes.
- puis `dispatch_orphan_resent` a 50 s.
- Resolution moyenne loggee : environ `10755ms` par resolve.
Priorite prochaine : mesurer separement build replay, dispatch, attente report agent, resolve VLM/OCR/template.
### Single in-flight incomplet
Le live confirme les objections Claude :
- double dispatch initial encore visible ;
- la garde single in-flight ne couvre pas toute la fenetre de race ;
- ajouter tests avant refactor.
WP4 Claude recommande :
- tests d'abord ;
- helper `_find_in_flight_action(session_id, machine_id, replay_id)`;
- test concurrent probablement `xfail` tant que la race n'est pas corrigee proprement.
### Trimming hors objectif
Le replay a termine une derniere action `ouvrir le lien vers le dossier specifie`.
Ce n'est pas un echec du live, mais c'est hors mandat "saisir et enregistrer un texte".
Conclusion : le trimming doit etre pilote par objectif/intention, pas seulement par fin brute du recording.
### Source/deploy a clarifier
Claude WP1 signale une divergence massive entre :
- `agent_v0/agent_v1/`
- `agent_v0/deploy/windows_client/agent_v1/`
Mais le live valide semble utiliser `C:\rpa_vision\agent_v1\...`.
Ne pas lancer de resync massif avant verification du chemin reel d'execution Windows.
Action prochaine :
- confirmer le `CommandLine` du process Windows ;
- exposer ou logger un `AGENT_VERSION` avec hash/timestamp ;
- documenter une politique unique de deploiement.
## Coordination lue / envoyee
Retours Claude lus :
- `docs/coordination/inbox_codex/2026-05-25_0626_claude-to-codex_rapport-complet-phase-attente.md`
- `docs/coordination/inbox_codex/2026-05-25_0640_claude-to-codex_carto-complementaire-agent_chat-WM-ORA.md`
- `docs/coordination/inbox_codex/2026-05-25_0610_claude-to-codex_synthese-workpacks-A-B-C.md`
- `docs/coordination/inbox_codex/2026-05-25_0905_claude-to-codex_WP1-inventaire-source-deploy.md`
- `docs/coordination/inbox_codex/2026-05-25_0905_claude-to-codex_WP2-scene-expected-wiring.md`
- `docs/coordination/inbox_codex/2026-05-25_0905_claude-to-codex_WP3-expected-state-precondition.md`
- `docs/coordination/inbox_codex/2026-05-25_0905_claude-to-codex_WP4-single-inflight-tests-factorisation.md`
Messages Codex envoyes a Claude :
- `docs/coordination/inbox_claude/2026-05-25_0845_codex-to-claude_delegation-max-phase2-supervision.md`
- `docs/coordination/inbox_claude/2026-05-25_0855_codex-to-claude_live-notepad-success-speed-followup.md`
- `docs/coordination/inbox_claude/2026-05-25_0904_codex-to-claude_handoff-session-fraiche.md`
Claude doit produire son handoff miroir dans `docs/handoffs/`.
## Arbitrage courant
Ordre recommande pour prochaine session :
1. Lire ce handoff puis lire le handoff Claude miroir.
2. Verifier `git status` et ne rien revert.
3. Figer le succes live par un test offline minimal sur `runtime_dialog_handled_post_verify`.
4. Traiter performance/dispatch :
- ajouter les tests WP4 critiques ;
- factoriser seulement apres tests ;
- mesurer build/dispatch/resolve.
5. Ensuite seulement brancher transport inerte `SceneExpected` / `Precondition` cote serveur, flag OFF par defaut.
6. Ne pas activer de blocage runtime `scene_expected.required=true` tant que les tests et le chemin Windows reel ne sont pas clarifies.
Ce qu'il ne faut pas faire au redemarrage :
- Pas de resync massif `deploy/windows_client` avant verification.
- Pas de refactor large `api_stream.report_action_result`.
- Pas de reveil `autonomous_planner`, `ORALoop`, `LearningManager`.
- Pas de nouveau replay live avant d'avoir decide si on mesure performance ou si on teste une correction.
- Pas de commit composite melangeant runtime, docs et experiences.
## Git / etat worktree
Worktree sale attendu. Ne pas nettoyer automatiquement.
Modifies techniques connus :
- `agent_v0/agent_v1/core/executor.py`
- `agent_v0/agent_v1/core/grounding.py`
- `agent_v0/server_v1/api_stream.py`
- `agent_v0/server_v1/replay_engine.py`
- `tests/integration/test_replay_session_trim_neutral.py`
- `tests/unit/test_env_setup.py`
- `tests/unit/test_executor_verify_window_guard.py`
- `tests/unit/test_grounding_engine.py`
Nombreux docs non suivis dans `docs/`, `docs/coordination/`, `docs/recherche/`, `docs/plans/`, `docs/architecture/`.
Ne pas les supprimer ; ce sont des artefacts de coordination et recherche.
## Commandes utiles
Lister replays actifs :
```bash
TOKEN=$(grep '^RPA_API_TOKEN=' .env.local | cut -d= -f2- | tr -d "'\"")
curl -sS -H "Authorization: Bearer $TOKEN" \
http://localhost:5005/api/v1/traces/stream/replays |
python3 -c "import sys,json; d=json.load(sys.stdin); active=[r for r in d.get('replays', []) if r.get('status') in ('running','paused_need_help','busy')]; print('active=', len(active)); [print(r.get('replay_id'), r.get('status'), r.get('completed_actions'), '/', r.get('total_actions')) for r in active]"
```
Logs live Notepad :
```bash
journalctl --user -u rpa-streaming --since '2026-05-25 08:50:00' --no-pager |
rg "e96e5822|runtime_dialog|Confirmer|REPORT|VERIFY|dispatch_orphan|termine"
```
Tests unitaires executor :
```bash
.venv/bin/python -m pytest -q tests/unit/test_executor_verify_window_guard.py
```
## Resume court pour reprise
Le live Bloc-notes a reussi. Le dialogue `Confirmer l'enregistrement` est absorbe sans humain, ce qui valide la correction fenetre active/dialogue connu. Les deux vrais chantiers suivants sont maintenant la fiabilite du dispatch et la vitesse. Le modele cognitif reste : objectif explicite, scene attendue, precondition, action, retour. Ne pas repartir dans une rustine de clic ; transformer le succes en test, puis stabiliser la chaine.

View File

@@ -0,0 +1,262 @@
# Handoff Codex — Demo Aiva-urgence v2 / repetition humaine
- `Auteur`: Codex
- `Date`: 2026-05-26, fin de journee
- `Reprise visee`: 2026-05-27
- `Contexte`: preparation demo client Aiva-vision / Aiva-urgence, repetition avec Dom comme humain challenge
## 1. Decision produit du jour
Produit clarifie :
- `Aiva-vision` est le socle universel qui apprend les interfaces.
- `Léa` est le collaborateur agent qui observe, lit, agit, demande et apprend.
- `Aiva-urgence` est le plugin metier de la demo sante.
Principe Dom acte :
- qualite d'abord ;
- le client sait que nous sommes en POC ;
- en contexte hospitalier, un arret propre vaut mieux qu'une action fausse ;
- Léa doit savoir dire "je ne sais pas" ou "montrez-moi".
## 2. Scenario demo retenu
Scenario cible :
1. Léa lit la liste des passages aux urgences.
2. Elle decrit le tableau sans enumerer fragilement tous les IPP.
3. Elle propose : traiter tous les dossiers ou un dossier precis.
4. Dom choisit `MOREL Catherine / IPP 25003284`.
5. Léa ouvre le dossier et verifie le bandeau : `25003284`, `MOREL`, `Catherine`.
6. Léa collecte les 5 onglets :
- `Motif d'admission`
- `Examens cliniques`
- `Imagerie`
- `Notes medicales`
- `Synthese Urgences`
7. `Synthese Urgences` reste dans le perimetre live : lecture haut + bas, avec validation par marqueurs.
8. Léa demande ou consigner les informations.
9. Sortie prioritaire : tableur OnlyOffice visible.
10. Validation finale humaine obligatoire.
## 3. Scroll : arbitrage corrige
Dom a rappele que VWB n'avait pas eu de probleme de scroll.
Verification code :
- VWB et replay utilisent le contrat `extract_text_scroll` :
- OCR haut ;
- `ctrl+end` ;
- wait ;
- OCR bas ;
- concat ;
- retour `ctrl+home`.
Correction d'arbitrage :
- ne plus retirer `Synthese Urgences` par prudence abstraite ;
- cible live = 5 onglets ;
- degrade 4 onglets uniquement si echec concret non recupere.
Marqueurs obligatoires bas synthese :
- `CCMU`
- `GEMSA`
- `J12.1`
- `Consultation externe`
Principe qualite :
> Scroll reussi = geste envoye + changement visuel constate + donnees attendues relues.
Docs :
- `docs/coordination/active/2026-05-26_arbitrage-scroll-vwb-reference.md`
- `docs/coordination/active/2026-05-26_principe-apprentissage-scroll-securise.md`
## 4. Repetition humaine du 2026-05-27
Dom sera "l'humain challenge".
Il peut :
- interrompre ;
- refuser une lecture ;
- demander une preuve ;
- demander une reprise depuis un onglet ;
- demander OnlyOffice ;
- verifier que Léa ne conclut pas sans validation.
Regle orale Claude a retenir :
> Une reponse Léa doit toujours contenir une preuve, une question ou un arret. Jamais une affirmation seule.
Docs a relire avant repetition :
- `docs/coordination/active/2026-05-26_runbook-repetition-humain-challenge-demo-v2.md`
- `docs/coordination/inbox_codex/2026-05-26_2230_claude-to-codex_SCRIPT-oral-lea-humain-challenge.md`
- `docs/coordination/active/2026-05-26_etat-preparation-repetition-2026-05-27.md`
## 5. OCR IPP/chiffres
Benchmark local :
- Tesseract lit les 11 IPP exacts sur `landing_wide.png`.
- EasyOCR reste bon pour le texte continu, mais moins fiable sur les IPP secondaires.
- Preprocessing OpenCV global rejete : regressions marqueurs et latence.
- docTR utile pour structure/bboxes, pas meilleur que Tesseract pour les chiffres.
Patch implemente :
- `core/llm/ocr_extractor.py`
- ajout `extract_digits_tesseract_from_image(...)` ;
- ajout `engine` sur `extract_table_from_image(...)`.
- `core/llm/__init__.py`
- export de la nouvelle fonction.
- `agent_v0/server_v1/replay_engine.py`
- `extract_table` transmet maintenant `engine` ;
- le normaliseur accepte `variable_name` pour `extract_table`.
- `tests/unit/test_ocr_extractor_tesseract.py`
- tests unitaires nouveaux.
- `tests/integration/test_t2a_extract.py`
- test integration `variable_name` + `engine="tesseract"`.
Workflow raccorde :
- BDD : `visual_workflow_builder/backend/instance/workflows.db`
- Workflow : `Demo_urgence_3_db`
- ID : `wf_483910cdd851_1778750587`
- Step : `step_79c40f5a8342_1778750587`
- Modification : `parameters.engine = "tesseract"` sur `extract_table`.
Backup BDD :
- `visual_workflow_builder/backend/instance/workflows.db.backup_2026-05-26_ocr_tesseract_demo3`
Doc :
- `docs/coordination/active/2026-05-26_patch-ocr-tesseract-ipp.md`
## 6. Verifications passees
Tests :
```bash
pytest -q tests/unit/test_ocr_extractor_tesseract.py tests/integration/test_t2a_extract.py
```
Resultat :
- OK
- 40 tests passes
Compile :
```bash
python3 -m compileall -q core/llm/ocr_extractor.py core/llm/__init__.py agent_v0/server_v1/replay_engine.py tests/unit/test_ocr_extractor_tesseract.py tests/integration/test_t2a_extract.py
```
Resultat : OK.
Verification capture :
```bash
python3 -c "from core.llm.ocr_extractor import extract_digits_tesseract_from_image; print(extract_digits_tesseract_from_image('output/playwright/easily_dryrun_2026-05-26/landing_wide.png', pattern=r'^25\\d{6}$'))"
```
Resultat : 11/11 IPP exacts.
Etat services au dernier check :
- `http://127.0.0.1:8765/` accessible.
- `http://127.0.0.1:5005/health` OK.
- `http://127.0.0.1:5004/api/status` OK.
- OnlyOffice : `/snap/bin/onlyoffice-desktopeditors`.
- Tesseract : `/usr/bin/tesseract`, langues `eng`, `fra`, `osd`.
## 7. Coordination
Qwen :
- a valide le principe scroll securise ;
- a valide l'architecture OCR multi-moteur par zone ;
- a recu les infos de patch et raccord workflow.
Claude :
- a retracte la recommandation 4 onglets ;
- cible 5 onglets confirmee ;
- a livre le script oral "humain challenge".
Derniers messages lus :
- `docs/coordination/inbox_codex/2026-05-26_2149_qwen-to-codex_ACK-apprentissage-scroll-securise.md`
- `docs/coordination/inbox_codex/2026-05-26_2215_claude-to-codex_ACK-scroll-vwb-reformulation-discours.md`
- `docs/coordination/inbox_codex/2026-05-26_2230_claude-to-codex_SCRIPT-oral-lea-humain-challenge.md`
## 8. Points d'attention demain
1. Commencer par lire les nouveaux retours dans `docs/coordination/inbox_codex/`.
2. Verifier les services avant repetition :
- maquette `8765` ;
- streaming `5005` ;
- agent chat `5004` ;
- OnlyOffice ;
- Tesseract.
3. Rejouer le scenario avec Dom comme challengeur, pas comme assistant de demo.
4. Logger les moments ou Léa :
- cite une preuve ;
- demande confirmation ;
- s'arrete ;
- reprend apres correction.
5. Verifier que `Synthese Urgences` est tentee en 5e onglet.
6. Si scroll incomplet :
- ne pas exploiter l'onglet ;
- annoncer la limite ;
- demander confirmation humaine.
7. Si divergence OCR sur IPP :
- ne pas trancher ;
- demander confirmation.
8. OnlyOffice doit etre visible avant validation finale.
## 9. Worktree
Le worktree est deja tres modifie par plusieurs chantiers/collaborateurs.
Ne pas revert les changements non lies.
Changements Codex de cette fin de journee a surveiller :
- `core/llm/ocr_extractor.py`
- `core/llm/__init__.py`
- `agent_v0/server_v1/replay_engine.py`
- `tests/unit/test_ocr_extractor_tesseract.py`
- `tests/integration/test_t2a_extract.py`
- `visual_workflow_builder/backend/instance/workflows.db`
- `visual_workflow_builder/backend/instance/workflows.db.backup_2026-05-26_ocr_tesseract_demo3`
- docs sous `docs/coordination/active/` et inbox Claude/Qwen crees le 2026-05-26 soir.
Attention : `agent_v0/server_v1/replay_engine.py` contenait deja d'autres modifications hors patch OCR dans le diff global. Ne pas les attribuer automatiquement au patch OCR.
## 10. Premiere action conseillee demain
Lire :
```bash
find docs/coordination/inbox_codex -maxdepth 1 -type f -printf '%TY-%Tm-%Td %TH:%TM %f\n' | sort | tail -20
```
Puis lancer un smoke :
```bash
curl -fsS http://127.0.0.1:8765/ >/tmp/aiva_easily_health.html
curl -fsS http://127.0.0.1:5005/health
curl -fsS http://127.0.0.1:5004/api/status
pytest -q tests/unit/test_ocr_extractor_tesseract.py tests/integration/test_t2a_extract.py
```
Ensuite repetition humaine avec Dom.
Auteur : Codex

View File

@@ -0,0 +1,141 @@
# Handoff Codex - Reprise micro-apprentissage Lea P0
Date: 2026-05-27 21:35
Reprise prevue: 2026-05-28 matin
Pilote: Codex
Participants: Dom, Qwen, Claude
## Etat de fin de soiree
La demo metier / VWB n'est plus l'axe principal immediat. Le travail est recentre sur le coeur d'apprentissage de Lea.
Decision centrale:
- Unite de travail: **competence courte verifiee**.
- Cette competence est une couche de classification / promotion au-dessus de la chaine existante Graph / FAISS / Shadow / Replay / Memoire.
- On ne cree pas une nouvelle chaine d'apprentissage.
Chaine existante a reutiliser:
- `core/pipeline/workflow_pipeline.py`
- `core/graph/graph_builder.py`
- `core/graph/node_matcher.py`
- `core/embedding/faiss_manager.py`
- `core/embedding/state_embedding_builder.py`
- `core/workflow/shadow_observer.py`
- `core/workflow/shadow_validator.py`
- `core/learning/target_memory_store.py`
- `agent_v0/server_v1/replay_memory.py`
- `agent_v0/server_v1/replay_learner.py`
- `agent_v0/server_v1/replay_verifier.py`
- `tools/session_cleaner.py`
- `agent_chat/gesture_catalog.py`
- `core/knowledge/ui_patterns.py`
## Fait aujourd'hui
- Capture clavier systeme corrigee pour `Win+S` / `key_combo`.
- Consolidation preserve maintenant `key_combo`.
- Session cleaner corrige: plus d'affichage `<built-in method keys...>`.
- Health technique OK: RAM/VRAM/swap/Ollama acceptables; seul risque residuel = VLM cold start.
- Dashboard Base de connaissances identifie comme point d'inventaire:
- 13 666 vecteurs FAISS,
- 63 sessions,
- 29 workflows,
- 28 reflexes natifs,
- 3 machines.
- Qwen et Claude ont ete remis dans la boucle via leurs inbox fichiers.
## Retours agents lus
Claude:
- `docs/coordination/inbox_codex/2026-05-27_1959_claude-to-codex_CONTRAT-competence-courte-verifiee-P0.md`
- `docs/coordination/inbox_codex/2026-05-27_2040_claude-to-codex_PLAN-P1-contrat-p0-message-warning.md`
- `docs/coordination/inbox_codex/2026-05-27_2123_claude-to-codex_ACK-correction-session-wins-existe.md`
Qwen:
- `docs/coordination/inbox_codex/2026-05-27_2010_qwen-to-codex_AVIS-corrige-reuse-lea-core-complete.md`
- `docs/coordination/inbox_codex/2026-05-27_2044_qwen-to-codex_INVENTAIRE-offline-competences-existantes.md`
- `docs/coordination/inbox_codex/2026-05-27_2055_qwen-to-codex_INVENTAIRE-offline-competences-existantes.md`
Correction importante:
- Le retour Qwen 20:55 disait que `sess_20260527T185155_98ad9a` n'existait pas.
- Verification Codex: elle existe bien.
- Corrections envoyees:
- `docs/coordination/inbox_qwen/2026-05-27_2122_codex-to-qwen_CORRECTION-session-wins-existe.md`
- `docs/coordination/inbox_claude/2026-05-27_2122_codex-to-claude_CORRECTION-session-wins-existe.md`
## Session P0 confirmee
Ne pas recapturer Win+S pour P0.
Chemins confirmes:
- `data/training/live_sessions/streaming_sessions/sess_20260527T185155_98ad9a.json`
- `data/training/live_sessions/DESKTOP-58D5CAC_windows/sess_20260527T185155_98ad9a/live_events.jsonl`
- `data/training/live_sessions/DESKTOP-58D5CAC_windows/sess_20260527T185155_98ad9a/shots/`
Objectif P0:
- extraire le segment propre: etat initial -> `Win+S` -> `Rechercher/SearchHost.exe`,
- couper les evenements apres postcondition,
- ignorer les clics systray/pythonw,
- creer `data/competences/observed/open_windows_search.yaml`,
- verifier sans promouvoir `stable`.
## Objectifs demain matin
1. Figer le segment propre P0.
2. Creer le premier YAML `open_windows_search.yaml` en `observed` ou `candidate`.
3. Ajouter un validateur leger du schema competence, sans runtime lourd.
4. Brancher `message_contract.py` en mode warning sur le premier chemin de pause.
5. Lancer les tests de non-regression:
- capture clavier / key_combo,
- session cleaner,
- message contract,
- validateur YAML si ajoute.
6. Rejouer supervise seulement si Dom donne GO runtime.
## Regles a ne pas casser
- Pas de coordonnees comme savoir durable.
- Pas de nouvelle chaine parallele.
- Pas de promotion stable depuis dashboard / FAISS seul.
- Pas d'inference methode depuis postcondition seule.
- `SearchHost.exe` prouve l'etat, pas la methode.
- Messages Lea visibles: toujours dire intention, attendu, vu, demande.
- VLM en fallback seulement si fenetre/process/OCR simple ne suffisent pas.
## Repartition demain
Codex:
- implementation minimale,
- tests,
- verification disque/runtime,
- integration des retours Qwen/Claude.
Qwen:
- finaliser l'inventaire offline exploitable,
- corriger son inventaire avec la session P0 confirmee,
- identifier les prochains candidats sans nouvelle capture.
Claude:
- verrouiller le contrat YAML minimal,
- guider l'integration `message_contract.py` en warning,
- verifier les invariants de promotion.
## Premiere action recommande demain
Commencer par une lecture rapide de ce handoff, puis ouvrir:
- `docs/coordination/inbox_codex/2026-05-27_2040_claude-to-codex_PLAN-P1-contrat-p0-message-warning.md`
- `docs/coordination/inbox_codex/2026-05-27_2044_qwen-to-codex_INVENTAIRE-offline-competences-existantes.md`
- `data/training/live_sessions/streaming_sessions/sess_20260527T185155_98ad9a.json`
Ensuite seulement: patch minimal.

View File

@@ -0,0 +1,468 @@
# Handoff Codex - fin de soiree 2026-06-01 - reprise POC bi-turbo
Date: 2026-06-01 soir, Europe/Paris.
Auteur: Codex.
Statut: handoff de reprise. Aucun commit.
Ce handoff complete et remplace pour la reprise le handoff plus ancien :
`docs/handoffs/2026-06-01_handoff_codex_p0-p1-lea-session-propre.md`.
## Message court pour la prochaine session
Dom arrete ce soir pour se reposer. Demain, reprise "bi-turbo", mais l'objectif reste court terme :
- POC presentable/testable rapidement.
- Consolider ce qui existe.
- Arreter de recoder des briques deja implementees.
- Utiliser Claude et Qwen activement.
- Codex ne code pas seul.
- Qwen reste quality gate anti-doublon.
- Claude execute les correctifs courts.
- Codex orchestre et valide.
## Decisions Dom a ne pas perdre
1. Ne pas repartir sur VWB comme produit.
2. POC court terme d'abord : capture humaine fiable, replay precis, apprentissage consolide, test humain.
3. L'audit global ne doit pas devenir une phase longue. Il sert a aller plus vite.
4. Regle anti-reimplementation globale projet, pas seulement apprentissage :
- chercher l'existant,
- raccorder/consolider si possible,
- remplacer seulement si l'existant est clairement insuffisant.
5. Apprentissage Lea :
- pas de validation exhaustive de longues sessions,
- auto-evaluation par repetition,
- convergence sur repetitions,
- questions uniquement en mode copilote / prise de main / apprentissage supervise,
- aucune question pendant observation passive.
6. Les humains sont imparfaits :
- hesitations,
- erreurs de clic,
- retours arriere,
- corrections,
- pauses,
- bruit ecran.
Lea doit distinguer action utile, parasite, correction, hesitation.
7. Confidentialite DPI :
- donnees DPI exploitables localement sur DGX / hopital car necessaires pour trancher,
- aucune information ne sort du milieu hospitalier,
- artefacts portables sans memoire patient, captures DPI brutes, identifiants patients,
- attention au risque de memorisation par modele/adapters/embeddings si export naif.
8. Portabilite importante :
- exporter/importer les reflexes, competences, schemas, detecteurs, mappings, plans d'action, metriques,
- reduire duree d'apprentissage sur nouvelles machines,
- ne pas exporter la memoire patient.
9. Ne pas laisser de "a surveiller plus tard" flou :
- si un risque peut couter 10x plus tard, mettre maintenant un garde-fou minimal,
- acceptable POC seulement si le risque est contenu et documente.
## Etat coordination au moment du handoff
Derniers messages importants a lire dans cet ordre demain :
1. `docs/coordination/inbox_codex/2026-06-01_qwen-to-codex-claude_LEVEE-GO-P1-SEMANTIQUE.md`
- Qwen confirme GO P1-SEMANTIQUE, conditionnel leve.
2. `docs/coordination/inbox_codex/2026-06-01_2240_claude-to-codex_LEVEE-GO-conditionnel-Qwen-P1-SEMANTIQUE.md`
- Claude livre executor + timeout OmniParser + tests.
3. `docs/coordination/inbox_codex/2026-06-01_qwen-to-codex_REVUE-GLOBALE-ANTI-DOUBLON-REBRANCHEMENT.md`
- Qwen confirme R6 worker queue, FAISS, graph, learning orphelins, plan P0/P1/P2.
4. `docs/coordination/inbox_codex/2026-06-01_2200_claude-to-codex_ACK-5-decisions-Dom-+-audit-chaine-apprentissage-debranchee.md`
- Claude confirme chaine apprentissage partiellement debranchee.
5. `docs/POC/AUDIT_CHAINE_APPRENTISSAGE_2026-06-01.md`
- Audit detaille de la chaine apprentissage.
6. `docs/coordination/inbox_claude/2026-06-01_2222_codex-to-claude_GO-EXECUTION-POC-court-terme-R6-semantique-learning.md`
- GO Claude sur P0/P1 court terme.
7. `docs/coordination/inbox_qwen/2026-06-01_2222_codex-to-qwen_ACK-verdict-global-et-role-quality-gate.md`
- Qwen confirme comme quality gate attendu.
Important : apres le dernier recadrage Dom sur "a surveiller plus tard", Qwen a confirme que P1-SEMANTIQUE contient maintenant les 5 garde-fous demandes.
## Statut par lot
### P0 revocation / agent registry
Statut: probablement OK POC, non commite.
Travail applique dans le worktree :
- `agent_v0/server_v1/agent_registry.py`
- `agent_v0/server_v1/api_stream.py`
- tests P0 autour revocation/replay/enroll.
Qwen a livre et confirme :
- `/register`, `/stream/event`, `/replay/next`, `/replay/result`, `/finalize`, `/replay-session` gardes/testes.
- Strict default/unknown quand registry non vide.
Tests annonces/constates plus tot :
- `30 passed, 1 xfailed`, puis Qwen a annonce `32 passed, 1 xfailed`.
Attention :
- `api_stream.py` avait deja un tres gros diff avant Codex/Qwen/Claude.
- Toute modification dans ce fichier doit etre chirurgicale.
### P1-PERSIST
Statut: GO conditionnel POC, pas prod.
Claude a livre :
- `core/competences/persist.py`
- endpoint `/api/v1/lea/competences/candidate/persist` en fin de `api_stream.py`
- tests unit/integration/security.
Qwen a classe :
- acceptable POC,
- prod a durcir.
Risques/restes :
- couplage token <-> machine_id pas implemente,
- rate limiter in-memory,
- idempotence 201 vs 200,
- audit failure rollback YAML recommande.
### P1-LEA-SHADOW
Statut: GO Qwen.
Claude a livre :
- `agent_chat/handlers/learn_action.py`
- `agent_chat/handlers/__init__.py`
- `agent_chat/state/`
- modifications `agent_chat/app.py`
- route `POST /api/learn/start`
- rebranchement bouton Windows vers `/api/learn/start`
- `agent_v0/agent_v1/network/lea_orchestrator_client.py`
- modifications UI `chat_window.py`, `smart_tray.py`.
Qwen avait mis NO-GO puis a leve :
- `machine_id` ajoute dans `SessionState` et payload persist,
- `datetime.now(timezone.utc)`,
- guard anti-CONFIRM sans nom,
- route `/api/learn/start`.
Point important Dom :
- questions seulement en prise de main / supervision,
- pas pendant observation passive.
### P1-SEMANTIQUE
Statut: GO Qwen confirme, conditionnel leve.
Claude a livre puis corrige :
- `core/semantic/phase25_analyzer.py`
- `core/semantic/__init__.py`
- endpoint `/api/v1/lea/screen/analyze` dans `api_stream.py`
- tests `tests/unit/test_phase25_semantic.py`
- tests `tests/integration/test_phase25_semantic_integration.py`
Qwen a d'abord mis GO conditionnel :
- `analyze_frames` synchrone dans endpoint async,
- timeout OmniParser declare mais pas applique.
Claude a corrige :
- `run_in_executor` dans endpoint,
- timeout effectif OmniParser via `ThreadPoolExecutor(max_workers=2)`,
- fallback docTR,
- logs `logs/omniparser_errors.log`,
- tests annonces `35 passed / 0 failed`.
Qwen a confirme les garde-fous Dom :
- concurrence bornee,
- comportement si pool sature,
- fallback degrade,
- log explicite,
- tests/preuves.
Risque residuel accepte POC :
- un thread timeoutte ne peut pas etre tue en Python,
- contenu par pool borne + timeout + fallback + logs.
Codex n'a pas encore rerun localement les tests apres le dernier patch Claude. A faire demain si besoin :
```bash
.venv/bin/python -m py_compile core/semantic/phase25_analyzer.py agent_v0/server_v1/api_stream.py
.venv/bin/python -m pytest tests/unit/test_phase25_semantic.py tests/integration/test_phase25_semantic_integration.py -q
```
Note : les tests timeout peuvent durer environ 30s.
### R6 worker queue / enrichissement profond
Statut: P0 court terme, bloqueur POC si non resolu.
Qwen confirme :
- `data/training/_worker_queue.txt` existe, 0 octets, cree le 29 mai.
- Worker actif mais tourne a vide.
- Dernier traitement worker il y a plusieurs jours.
- Artefacts enriched/FAISS/graph stales.
- Sessions live recentes presentes :
- `sess_20260529T144652_5a2e96`
- `sess_20260529T154427_f95956`
Codex a confirme que ces dossiers existent :
- `data/training/live_sessions/DESKTOP-58D5CAC_windows/sess_20260529T144652_5a2e96`
- `data/training/live_sessions/DESKTOP-58D5CAC_windows/sess_20260529T154427_f95956`
- `data/training/_worker_queue.txt` = 0 octets.
Cause probable Qwen :
- `_enqueue_to_worker()` echoue silencieusement ou n'ecrit pas vraiment,
- logs serveur non accessibles,
- queue creee mais write absent.
GO donne a Claude a 22:22 :
1. Ajouter log critique avec `exc_info=True` dans `_enqueue_to_worker`.
2. Re-enqueue les deux sessions du 29 mai si elles existent.
3. Prouver queue -> worker -> artefacts ou logs exploitables.
Pas encore de livraison Claude R6 au moment du handoff.
Demain, premiere action :
- lire nouveaux messages Claude/Qwen,
- si pas de livraison R6, relancer Claude sur R6,
- ne pas partir sur autre chantier avant d'avoir statue R6.
### Existing learning modules
Statut: a rebrancher apres R6, pas a recoder.
Modules existants cites par Claude/Qwen :
- `core/learning/continuous_learner.py`
- `core/learning/feedback_processor.py`
- `core/learning/target_memory_store.py`
- `core/learning/versioned_store.py`
- `core/learning/learning_manager.py`
- `core/training/training_data_collector.py`
- `core/training/offline_trainer.py`
- `core/training/model_validator.py`
- `core/training/session_analyzer.py`
- `core/healing/learning_repository.py`
Verdict Qwen :
- `ContinuousLearner`: existant a rebrancher, couvre auto-evaluation par repetition.
- `FeedbackProcessor`: existant a rebrancher, couvre fusion/regroupement feedback.
- `target_memory_store` / `versioned_store`: existants a rebrancher.
- certains modules comme `learning_manager` / `quality_validator` sont deja branches ailleurs.
Ordre conseille apres R6 :
1. verifier signatures reelles,
2. hook minimal apres session enrichie,
3. hook feedback shadow -> FeedbackProcessor,
4. seulement ensuite enrichir payloads `confidence`, `uncertainties[]`, `repetition_count`, statuts `hypothesis/candidate/validated`.
### FAISS
Statut: actif partiellement, a consolider court terme uniquement si impact POC clair.
Qwen :
- FAISS actif localement dans plusieurs branches runtime.
- FAISS alimente par `reindex()`, `add_embedding()`, import pack.
- GlobalFAISS jamais consulte.
- save/load existent mais jamais appeles : index perdus au redemarrage.
- `replay_memory.py` n'utilise pas FAISS.
Decision court terme :
- FAISS persistence minimale = P1 demain si faible risque.
- GlobalFAISS consultation = P2 apres tests humains.
- Ne pas refondre FAISS maintenant.
Composants a garder en tete :
- `core/embedding/faiss_manager.py`
- `core/federation/faiss_global.py`
- `core/embedding/clip_embedder.py`
- `core/embedding/state_embedding_builder.py`
- `core/visual/visual_embedding_manager.py`
- `agent_v0/server_v1/replay_memory.py`
- tests `tests/unit/test_faiss_*`, `tests/unit/test_learning_pack.py`.
### Graph
Statut: actif, mais a reconnecter mieux avec Phase25 plus tard.
Qwen :
- graphe produit apres sessions via `finalize_session()` -> `GraphBuilder` -> `workflows/*.json`.
- utilise par WorkflowRunner, NodeMatcher, ExecutionLoop.
- compat apprentissage par repetition via DBSCAN / LearningState.
- NO-GO partiel sur distinction semantique action / hesitation / correction.
- P1-SEMANTIQUE ne doit pas devenir un format parallele long terme : a reconnecter au graphe.
Decision court terme :
- pas de refonte graphe maintenant.
- R6 d'abord pour que sessions repassent par enrichissement.
- Phase25 -> graphe = P1/P2 apres R6 si faible risque.
## Worktree / hygiene
Le worktree est tres sale. Ne pas revert ce que l'on n'a pas fait.
Commande observee :
```bash
git status --short
```
Points a retenir :
- `docs/POC/PREREQUIS_DSI_DGX_SPARK_2026-06-01.docx` est modifie par Dom : ne pas toucher.
- `api_stream.py` a un tres gros diff avec zones Qwen + Claude + modifications anterieures.
- Beaucoup de fichiers modifies/untracked predatent la session.
- Pas de commit sans GO explicite Dom.
- Si commit demain, probablement split logique :
1. P0 revocation Qwen,
2. P1 persist Claude,
3. P1 shadow + learn/start + bouton Windows,
4. P1 semantic,
5. R6 worker queue,
mais seulement apres revue et validation.
## Commandes utiles demain
Lire les derniers messages :
```bash
find docs/coordination/inbox_codex -maxdepth 1 -type f -newermt '2026-06-01 22:20:00' -printf '%T@ %TY-%Tm-%Td %TH:%TM %p\n' | sort -nr | head -80
find docs/coordination/inbox_codex -maxdepth 1 -type f -iname '*claude*' -printf '%T@ %TY-%Tm-%Td %TH:%TM %p\n' | sort -nr | head -30
find docs/coordination/inbox_codex -maxdepth 1 -type f -iname '*qwen*' -printf '%T@ %TY-%Tm-%Td %TH:%TM %p\n' | sort -nr | head -30
```
Verifier R6 fichiers/queue :
```bash
ls -l data/training/_worker_queue.txt
find data/training/live_sessions -maxdepth 3 -type d \( -name 'sess_20260529T144652_5a2e96' -o -name 'sess_20260529T154427_f95956' \) -print
rg -n "def _enqueue_to_worker|_worker_queue|enqueue" agent_v0/server_v1/api_stream.py agent_v0/server_v1/run_worker.py agent_v0/server_v1/stream_processor.py
```
Verifier P1-SEMANTIQUE localement :
```bash
.venv/bin/python -m py_compile core/semantic/phase25_analyzer.py agent_v0/server_v1/api_stream.py
.venv/bin/python -m pytest tests/unit/test_phase25_semantic.py tests/integration/test_phase25_semantic_integration.py -q
```
Tests P0 revocation a rerun si besoin :
```bash
.venv/bin/python -m py_compile agent_v0/server_v1/api_stream.py agent_v0/server_v1/agent_registry.py
.venv/bin/python -m pytest tests/unit/test_api_stream_revocation_gaps.py tests/integration/test_replay_single_inflight.py tests/integration/test_agents_enroll_api.py -q
```
## Plan de reprise recommande demain
### Etape 0 - Lire coordination
1. Lire ce handoff.
2. Lire les derniers `inbox_codex` apres 22:20.
3. Si Claude a livre R6, lire sa livraison.
4. Si Qwen a donne un nouveau verdict, le prioriser.
### Etape 1 - Clore P1-SEMANTIQUE
Statut deja GO Qwen.
Action Codex :
- rerun tests cibles si temps,
- si tests OK, marquer P1-SEMANTIQUE OK POC.
Ne pas ajouter de nouveau correctif sauf echec test reel.
### Etape 2 - R6 worker queue
Priorite P0.
Si Claude a livre :
1. Lire livraison.
2. Demander ou lire revue Qwen.
3. Verifier localement :
- queue ecrite,
- worker depile,
- artefacts/logs,
- pas d'effet de bord.
Si Claude n'a pas livre :
- relancer Claude avec le GO 22:22.
- garder Qwen en copie/review.
Definition of done R6 :
- une session test finalisee passe par worker,
- preuve disque ou logs exploitables,
- cause exacte documentee,
- pas de silencieux.
### Etape 3 - Rebrancher l'existant learning
Uniquement apres R6 prouve.
Ordre :
1. `ContinuousLearner` hook minimal apres session enrichie.
2. `FeedbackProcessor` hook minimal depuis feedback shadow.
3. `VersionedStore` / `TargetMemoryStore` si deja requis par les hooks.
4. Tests integration courts.
Ne pas creer nouveau module learning.
### Etape 4 - FAISS persistence minimale
Seulement si R6 OK et impact POC clair.
Objectif :
- save/load appele au bon moment,
- index pas perdu au redemarrage,
- tests existants adaptes si necessaire.
Ne pas traiter GlobalFAISS multi-postes maintenant.
### Etape 5 - Test humain E2E
Quand R6 + P1 green :
- utiliser `docs/demo/test-humain-e2e-poc.md` si present,
- verifier capture -> hypotheses -> persist -> replay -> verdict,
- ne pas chercher la quasi-prod avant d'avoir un cycle humain reel.
## Points a ne pas oublier
- Dom veut aller vite, mais solide.
- Dom est inquiet que l'on recode deja fait : toujours chercher l'existant.
- Dom veut Claude et Qwen utilises.
- Ne pas coder seul sans coordination.
- Les YAML sont checkpoints transitoires, pas memoire finale.
- Portabilite reste objectif majeur mais ne doit pas bloquer le POC sauf risque DPI.
- Donnees DPI utiles localement doivent rester exploitables ; ne pas anonymiser au point de perdre la capacite de trancher.
- Artefacts exportables doivent etre nettoyes/pseudonymises/sans memoire patient.
- Les tests humains manquent cruellement : ne pas repousser indefiniment.
## Dernier statut en une ligne
P1-LEA-SHADOW et P1-SEMANTIQUE sont GO Qwen pour POC ; le prochain vrai P0 est R6 worker queue/enrichissement profond, puis rebrancher ContinuousLearner/FeedbackProcessor existants sans recoder.

View File

@@ -0,0 +1,128 @@
# Handoff Codex — P0/P1 Léa, session propre
- `Date`: 2026-06-01 18:15 Europe/Paris
- `Contexte`: Dom demande qualité top, pas de régression, travail coordonné avec Claude/Qwen et agents.
- `Contrat produit`: Léa apprend par démonstration depuis Léa/agent-chat. Dashboard = admin/supervision/QA/promotion. VWB = outil admin/récupération uniquement.
## Décisions actives
| Sujet | Décision |
|---|---|
| Apprentissage | Départ depuis Léa (`agent-chat`, bouton/tray existant), pas bouton dashboard |
| Artefact durable | YAML `candidate/`, pas `stable` sans promotion admin |
| Runtime | Shadow existe mais est orphelin ; à raccorder |
| Lecture sémantique | Remarques Claude retenues : OmniParser runtime, Phase 2.5, agents externes, OCR qualité |
| Démo/POC | Pas de CLI opérateur ; CLI seulement dev/test |
| VLM | Pas de mock VLM en démo/POC |
## Messages lus
| Auteur | Fichier | Résumé |
|---|---|---|
| Qwen | `docs/coordination/inbox_codex/2026-06-01_qwen-to-codex_DIAGNOSTIC-P0-SINGLE-INFLIGHT.md` | Root cause P0 confirmé : early return `paused_need_help` renvoyait `status: ok` |
| Claude | `docs/coordination/inbox_codex/2026-06-01_1745_claude-to-codex_ADDENDUM-archi-Lea-lecture-semantique-agent-externe.md` | Ajout essentiel : lecture sémantique, OmniParser runtime, `ExternalDecisionClient`, OCR qualité |
| Qwen | `docs/coordination/inbox_codex/2026-06-01_qwen-to-codex_SYNTHESE-Q1-Q4-AGENTS-PARALLELES.md` | Shadow orphelin, `persist` absent, révocation non effective, micro-warnings |
## Dispatchs déposés
| Destinataire | Fichier |
|---|---|
| Claude | `docs/coordination/inbox_claude/2026-06-01_1812_codex-to-claude_GO-MAX-AGENTS-P0-P1-lea-quality-no-regression.md` |
| Qwen | `docs/coordination/inbox_qwen/2026-06-01_1812_codex-to-qwen_GO-MAX-AGENTS-P0-P1-lea-quality-no-regression.md` |
## Changements locaux effectués
### P0 replay single-inflight
Fichier touché : `agent_v0/server_v1/api_stream.py`
Changement Codex : dans la branche `paused_need_help` quand la queue est vide avant fin, l'early return renvoie maintenant :
```python
{
"status": "recorded",
"replay_status": replay_state["status"],
"pause_reason": "paused_need_help",
}
```
Important : `api_stream.py` avait déjà un énorme diff local avant ce changement. Ne pas revert. Le changement Codex est uniquement ce retour P0.
### Warnings dashboard Tester
Fichiers touchés par agent interne `Huygens` :
- `web_dashboard/templates/knowledge_base.html`
- `tests/unit/test_dashboard_routes.py`
Changements :
- Confirmation avant lancement d'une compétence qui ressemble à Win+R / Exécuter.
- Blocage/alerte du verdict `Valide` si aucune `step_results` ni evidence exploitable.
- Test HTML ciblé ajouté.
## Tests exécutés
| Commande | Résultat |
|---|---|
| `.venv/bin/python -m py_compile agent_v0/server_v1/api_stream.py` | OK |
| `.venv/bin/python -m pytest tests/integration/test_replay_single_inflight.py::test_concurrent_dispatch_and_result_no_double_increment -q` | OK |
| `.venv/bin/python -m pytest tests/integration/test_replay_single_inflight.py -q` | `10 passed, 1 xfailed` |
| `.venv/bin/python -m pytest tests/unit/test_dashboard_routes.py -q` | `30 passed` |
| `.venv/bin/python -m pytest tests/integration/test_replay_watchdog.py tests/integration/test_replay_resume_preserves_original_action.py::TestReplayResumePreservesOriginalAction::test_resume_dispatch_backfills_retry_pending_for_watchdog -q` | `11 passed` |
| `.venv/bin/python -m pytest tests/unit/test_dashboard_routes.py tests/unit/test_competence_verdicts.py tests/unit/test_competence_promotions.py tests/unit/test_competence_to_vwb_preview.py tests/unit/test_competence_catalog_loader.py tests/unit/test_vwb_supervised_pause_runtime.py tests/unit/test_lea_competence_verdict_api.py tests/integration/test_replay_single_inflight.py -q` | `75 passed, 1 xfailed` |
| `git diff --check -- agent_v0/server_v1/api_stream.py web_dashboard/templates/knowledge_base.html tests/unit/test_dashboard_routes.py ...` | OK |
Warnings attendus : `RequestsDependencyWarning` et `pynvml FutureWarning`.
## Agents internes Codex
| Agent | ID | Statut | Résumé |
|---|---|---|---|
| Lorentz | `019e83f4-6f94-77f2-aab4-82395ca62562` | Terminé | Confirme P0 Qwen ; risque faible ; follow-up : harmoniser payload complet de l'early return |
| Huygens | `019e83f4-b4b4-76b1-a9bc-49a3ec7b93fc` | Terminé | Patch warnings dashboard appliqué ; tests ciblés OK |
| Descartes | `019e83f4-85db-7a73-ba37-6b68938dd725` | Terminé | Révocation runtime non effective ; `/replay/next` public ; `touch_last_seen()` mort ; ré-enrollment admin_revoke à bloquer |
| Plato | `019e83f4-9b9f-7b63-904e-25befda0354a` | Terminé | Confirme faisabilité, mais recommande MVP prudent : Phase 2.5 post-apprentissage, pas OmniParser partout dans le hot path replay |
## Résultat agent Plato — architecture sémantique
Constats :
- OmniParser existe (`core/detection/omniparser_adapter.py`) mais reste fragile : chemin absolu, fallback souvent silencieux.
- ScreenAnalyzer existe et est conceptuellement propre, mais le streaming court-circuite l'initialisation lourde en mode léger.
- `t2a_decision` est réel et utilisable comme premier agent métier interne.
- `ExternalDecisionClient` n'existe pas encore.
- Confiance OCR actuelle insuffisante pour autonomie métier : certaines confiances sont approximatives.
- Des bypass `static_result` / `static_text` existent et doivent être interdits en démo/POC hors tests.
MVP recommandé :
1. Garder le P0 replay/click/OCR existant comme chemin principal.
2. Ajouter une Phase 2.5 post-apprentissage uniquement : snapshots sémantiques `{screen_id, window_title, screenshot_path, elements[]}`.
3. Demander à l'humain seulement les ambiguïtés utiles.
4. Brancher les résultats comme contexte, pas comme prérequis de chaque clic replay.
5. Démarrer `ExternalDecisionClient` autour de `t2a_decision`, puis adapter HTTP AIVA.
6. Prioriser OCR critique par régions annotées + escalade humaine si confiance basse.
## Prochains P0/P1
| Priorité | Sujet | Action recommandée |
|---|---|---|
| P0 | Revue/commit P0 replay + warnings | Relire diff final, décider commit |
| P0 POC | Révocation effective minimale | Ajouter garde registre côté serveur, retirer `/replay/next` des publics, appeler `touch_last_seen`, empêcher ré-enroll `admin_revoke` |
| P1 | `candidate/persist` | Créer endpoint `POST /api/v1/lea/competences/candidate/persist` + tests YAML |
| P1 | `agent-chat` -> Shadow | Raccorder bouton/chat Léa au cycle `start/stop/understanding/feedback/build/persist` |
| P1 | Lecture sémantique | D'abord Phase 2.5 post-apprentissage + snapshots, puis adapter OmniParser runtime, puis `ExternalDecisionClient` |
| P1 | Worker VLM | Vérifier/remettre green avant test humain sérieux |
## Points de vigilance
- Worktree très sale : ne pas revert les changements non identifiés.
- `docs/POC/PREREQUIS_DSI_DGX_SPARK_2026-06-01.docx` a été modifié par Dom : ne pas toucher.
- `api_stream.py` contient des changements préexistants massifs ; isoler les futurs patches.
- Token global : limitation encore forte. Le patch révocation minimale ne protège pas contre spoof d'un autre `machine_id` actif avec token global.
- Ne pas mettre OmniParser/VLM dans le hot path replay sans mesure perf/VRAM.
- Interdire les bypass `static_result` / `static_text` dans les workflows démo/POC.
- Session propre recommandée maintenant : oui, après lecture de ce handoff.
— Codex

View File

@@ -0,0 +1,160 @@
# HANDOFF Qwen — Fin de session 2026-06-01
- `Auteur`: Qwen
- `Date`: 2026-06-01 ~23:00 Europe/Paris
- `Prochaine reprise`: 2026-06-02 matin (bi-turbo)
- `Dom`: malade, en repos
---
## Bilan de la journée
**19 messages Codex lus, 12 ACK/revues déposés, 5 agents parallèles lancés, 1 revue globale 5 missions.**
| Lot | Statut | Verdict Qwen |
|-----|--------|-------------|
| **P0 révocation** | ✅ Livré + testé (32 passed, 1 xfail) | GO |
| **P0 single-inflight** | ✅ Patch `paused_need_help` `"ok"``"recorded"` | GO |
| **P1-PERSIST** | ✅ Livré par Claude (39 tests) | GO conditionnel (token↔machine_id reporté) |
| **P1-LEA-SHADOW** | ✅ Livré + corrigé NO-GO (62 tests) | GO — NO-GO levé |
| **P1-SEMANTIQUE** | ✅ Livré + corrigé GO conditionnel (35 tests) | GO — conditionnel levé |
| **Rebranchement bouton Windows** | ✅ Livré (9 tests) | GO |
| **Dashboard test competence** | ✅ Livré | GO |
| **C-alpha/B/gamma** | ✅ Livrés (chaîne complète) | GO |
| **Audit anti-doublon global** | ✅ 5 missions, 4 agents | Verdict déposé |
| **Plan tests humains E2E** | ✅ `docs/demo/test-humain-e2e-poc.md` | Prêt |
| **Guide test humain batch 1** | ✅ `docs/demo/test-humain-batch1.md` | Prêt |
---
## État des lieux — ce qui est fait
### Chaîne complète (de bout en bout)
```
Bouton Windows 🎓 → /api/learn/start → Shadow start → observation humaine
→ Shadow stop → understanding (Option C) → feedback → build → persist
→ YAML candidate → Dashboard "Tester" → replay supervisé → verdict
→ promotion dry-run → write-back YAML → audit trail
```
### P0 sécurité
- 6 endpoints runtime protégés par `_guard_agent_registry_access`
- Révocation effective (agent uninstalled → 403)
- `touch_last_seen()` actif
- `/replay/result` garde inconditionnel
- `/replay-session` garde ajouté
### Audit anti-doublon
**9 modules orphelins identifiés**, tous fonctionnels, aucun doublon significatif avec P1 du jour :
| Module | Rôle | Statut |
|--------|------|--------|
| `ContinuousLearner` (644 lignes) | Auto-évaluation par répétition, drift | À rebrancher P1 |
| `FeedbackProcessor` (176 lignes) | Feedback humain → ajustement | À rebrancher P1 |
| `VersionedStore` (520 lignes) | Snapshot/rollback learning | À rebrancher P1 |
| `TargetMemoryStore` (460 lignes) | Mémoire cibles UI | À rebrancher P1 |
| `learning_manager.py` (180 lignes) | Transitions états workflow | **Déjà rebranché** |
| `quality_validator.py` (460 lignes) | Validation qualité | **Déjà rebranché** |
| + 5 modules `core/training/` et `core/healing/` | Training, analyse, recovery | À rebrancher P1/P2 |
### R6 worker queue — CONFIRMÉ
- `_worker_queue.txt` vide depuis le 29 mai
- Worker actif (PID 4054092) mais ne traite rien depuis 5 jours
- 2 sessions finalisées non traitées
- Correctif : logger.critical dans `_enqueue_to_worker` + ré-enqueue manuel
### FAISS / Graphe
- FAISS : actif dans 4 branches runtime mais **persistance cassée** (save/load jamais appelés)
- Graphe : GO actif, produit après sessions, utilisé par replay, compatible répétition
- **Pas de doublon** entre graphe et P1-SEMANTIQUE, mais **pas de connexion** non plus
---
## État des lieux — ce qui reste à faire
### P0 — Immédiat (demain matin)
| Action | Fichier | Effort |
|--------|---------|--------|
| R6: logger `_enqueue_to_worker` + ré-enqueue sessions | `api_stream.py` | ~10 lignes |
| P1-SEMANTIQUE: le conditionnel est levé ✅ | — | Fait |
### P1 — Après P0
| Action | Effort | Impact |
|--------|--------|--------|
| Rebrancher ContinuousLearner | ~30-50 lignes | Auto-évaluation par répétition (décision Dom) |
| Rebrancher FeedbackProcessor | ~20 lignes | Hook dans learn_action.py |
| FAISS persistance (save/load) | ~20 lignes | Index perdus au redémarrage |
| Connecter Phase25 au graphe | ~30-50 lignes | Enrichir nodes, pas format parallèle |
### P2 — Après tests humains
| Action | Impact |
|--------|--------|
| Classification edges graphe (intention) | Distinguer action/hésitation/correction |
| GlobalFAISS consultation | Multi-postes |
| Confidence + repetition_count payload | Décision Dom auto-évaluation |
| Portabilité learning pack | Export DGX |
### Test humain E2E — PRÊT
- `docs/demo/test-humain-e2e-poc.md` — protocole 9 phases
- `docs/demo/test-humain-batch1.md` — guide 3 compétences
- Critère GO : ≥ 2/3 compétences batch 1 passent le cycle complet
---
## Décisions Dom actées (à respecter)
1. **Observation passive sans question** — Léa n'interrompt pas l'humain pendant l'observation
2. **Questions faible confiance seulement en prise de main** — copilote/supervisé uniquement
3. **Auto-évaluation par répétition** — Léa apprend à force d'observer/rejouer, pas par restitution lourde
4. **Données DPI exploitables localement** — DGX local, pas de sortie hors site
5. **Artefacts portables sans mémoire patient** — export réflexes/compétences, pas de captures brutes
6. **Noyau compétence stable + adaptateurs UI versionnés** — pas de "désapprentissage"
7. **Anti-doublon global** — chercher l'existant avant de coder, rebrancher avant de remplacer
8. **Pas de "surveiller plus tard" sans garde-fou** — contenir les risques maintenant
---
## Règles coordination
- **Qwen** = quality gate anti-doublon + revue bloquante
- **Claude** = exécution terrain des correctifs
- **Codex** = coordination + validation locale
- Inbox pattern : `docs/coordination/inbox_X/` pour messages, `syntheses/` pour rapports
- Réponses courtes et actionnables
---
## Points de vigilance pour demain
1. **Dom est malade** — il revient en bi-turbo mais peut être fatigué. Privilégier les tests humains courts.
2. **R6 est le seul bloquant technique** — sans worker, pas d'enrichissement FAISS/graph. Le correctif est trivial (~10 lignes).
3. **Pas de nouveau dev avant rebranchement** — Dom a été clair : on ne code pas de nouvelles features avant d'avoir rebranché l'existant.
4. **Test humain avant tout** — le protocole est prêt. Le plus important est de lancer un test réel avec Dom opérateur.
5. **P1-SEMANTIQUE GO** — le conditionnel est levé, mais c'est post-R6 en priorité.
---
## Fichiers clés à connaître
| Fichier | Rôle |
|---------|------|
| `docs/demo/test-humain-e2e-poc.md` | Protocole test humain E2E |
| `docs/demo/test-humain-batch1.md` | Guide 3 compétences batch 1 |
| `docs/POC/AUDIT_CHAINE_APPRENTISSAGE_2026-06-01.md` | Audit chaîne apprentissage (Claude) |
| `inbox_codex/...REVUE-GLOBALE-ANTI-DOUBLON-REBRANCHEMENT.md` | Revue globale Qwen 5 missions |
| `data/competences/candidate/*.yaml` | 6 compétences candidates |
| `data/competence_verdicts/verdicts.jsonl` | Verdicts supervisés |
| `data/training/_worker_queue.txt` | Queue worker (vide — à ré-enqueue) |
---
*Auteur : Qwen — Bonne nuit Dom, repose-toi bien !*

View File

@@ -0,0 +1,16 @@
Lis `docs/coordination/README.md` puis traite tous les fichiers avec `Statut: open` dans `docs/coordination/inbox_claude/`.
Priorité actuelle :
- `docs/coordination/inbox_claude/2026-05-23_1024_codex-to-claude_notepad-saveas-explorer-drift.md`
Contraintes :
- répondre dans `docs/coordination/inbox_codex/`
- respecter la convention de nommage
- ne pas modifier le fichier source
- patch minimal et tests si tu implémentes
- ne pas mélanger ce bug avec le handler popup overwrite déjà traité
Point de contexte utile :
- le grounding visuel agent a déjà été durci et validé
- le blocage courant nest plus la popup `Oui/Non`
- la cause à analyser est la dérive après clic `Enregistrer sous` vers `rpa_vision : Explorateur de fichiers`

View File

@@ -0,0 +1,56 @@
# Handoff Claude — 2026-05-25 soir
## État validé
- Smoke live Bloc-notes `replay_sess_1c0bfb42` : 16/16, 0 pause, score 0.94, temps moyen 4793 ms.
- Lot tests : `88 passed, 1 xfailed` (race concurrent polls documentée).
- VRAM agent_chat : 0 (libéré par C1+C1b+C1c+C1d).
- Build skip : 271 ms mesuré Codex (vs 91s historique).
- Profil démo actif sur Linux : `RPA_SKIP_INTENTION_ENRICHMENT=true`, `RPA_SKIP_BUILD_VISION=true`, `RPA_EASYOCR_GPU=0`, `AGENT_CHAT_ENABLE_OWL=0`, `AGENT_CHAT_ENABLE_UI_DETECTION=0`.
## Décisions actées
- Démo cible **Easily** (pas Bloc-notes) — Dom referra la capture à la main.
- D5-v2 = API préparatoire (qwen3.5 JSON), non consommée runtime.
- D5-v3a mini-fix : `num_ctx=4096` posé sur 3 sites bbox `resolve_engine.py`.
- D5-v3b helper bbox : reporté post-démo.
- D5-v3c Windows `num_ctx=8192` : NOGO avant freeze (fallbacks non triggered en smoke).
- C-P1 OCR tolérance préfixe : patch posé (`_text_match_fuzzy` + 14 tests).
- C-P3 bulle Léa : OK pour démo sans patch.
## Travaux en attente
- Capture réelle Easily par Dom selon protocole `inbox_codex/2026-05-25_1735_claude-to-codex_protocole-capture-easily-lea.md` (6 arbitrages à trancher avec Codex).
- Codex doit ACK : rapport unifié C-P1/C-P2/C-P3 (1720) + protocole Easily (1735).
- Commit/freeze du lot stabilisation par Codex (pas par Claude).
- Smoke équivalent Easily à faire (R7 ouvert).
## Risques bloquants seulement
- **R1** `RPA_GROUNDING_MODEL` ambigu (D5-v2 qwen3.5 vs legacy qwen2.5vl bbox) — NE PAS set globalement. D5-v3b résout post-démo.
- **R7** pas de smoke Easily équivalent (démo cible Easily). À faire avant freeze.
- Worktree large/sale — Codex groupera commits avant freeze.
## Fichiers importants
- `docs/coordination/active/2026-05-25_runbook-profil-demo-smoke.md` — runbook démo
- `docs/coordination/active/2026-05-25_etat-courant.md` — file active
- `docs/coordination/syntheses/2026-05-25_synthese-direction.md` — synthèse jour
- `docs/coordination/inbox_codex/2026-05-25_1720_claude-to-codex_REPONSE-taches-projet-ocr-d5v3c-lea.md` — C-P1/C-P2/C-P3
- `docs/coordination/inbox_codex/2026-05-25_1735_claude-to-codex_protocole-capture-easily-lea.md` — C-P4 Easily
## Prochaine action recommandée
Attendre ACK Codex sur C-P1+C-P2+C-P3 (rapport 1720) et sur le protocole Easily (1735). Ensuite : assister Dom pour la capture Easily selon protocole.
## Ce qu'il ne faut pas faire demain
- NE PAS set `RPA_GROUNDING_MODEL=qwen3.5:9b` globalement (casse les 3 sites bbox legacy).
- NE PAS toucher `agent_v0/agent_v1/core/executor.py` (Windows, reporté D5-v3c post-démo).
- NE PAS redéployer Windows sans GO Codex.
- NE PAS lancer de live replay sans GO Dom explicite.
- NE PAS commit (Codex groupe).
- NE PAS rouvrir D5-v3b helper bbox tant que lot perf/stabilité pas figé.
- NE PAS mettre de secret en clair dans `docs/coordination/` (placeholder).
- NE PAS copier mécaniquement le YAML `urgence_aiva_demo_expected.yaml` comme scénario (Dom recapture à la main).
- NE PAS spawner d'agent pour brainstorming ciblé (overkill, déjà cadré matin).

View File

@@ -0,0 +1,105 @@
# Handoff Claude — 2026-05-26 soir
## Rôle réassigné aujourd'hui
Dom m'a réassigné le rôle de **chef de projet** (priorisation + pilotage Codex), avec arbitrages stratégiques validés par Dom. Pas exécutant supervisé.
Feedback durable sauvé en mémoire : `feedback_depose_par_defaut.md` — ACK/reformulation/addendum vont directement dans `inbox_codex/` sans demander confirmation préalable.
## Pivot majeur de la journée
Démo Paris **du 21 mai → annulée/reportée**. Nouvelle démo cible **2026-06-01** (J-5 au matin du 27/05).
Le scénario démo a pivoté plusieurs fois aujourd'hui :
- Bloc-notes → Easily
- Ancien workflow `Urgence_aiva_demo`**scénario v2 collecte multi-onglets + transposition**
- Sortie : **OnlyOffice** (`/snap/bin/onlyoffice-desktopeditors`), pas LibreOffice (absent)
## État validé au 26/05 22:30
**Code & patch** :
- Patch OCR Tesseract IPP livré (Codex) : `extract_digits_tesseract_from_image()` + `extract_table(engine="tesseract")` dans `core/llm/ocr_extractor.py`. 40 tests OK. **11/11 IPP exacts** sur `landing_wide.png` (vs 8/11 EasyOCR brut).
- Workflow `Demo_urgence_3_db` (`wf_483910cdd851_1778750587`) branché : step `step_79c40f5a8342_1778750587` `extract_table` ajout `parameters.engine = "tesseract"`. Sauvegarde DB : `workflows.db.backup_2026-05-26_ocr_tesseract_demo3`.
- Healthcheck Linux OK (Codex matin) : `rpa-streaming` + `rpa-agent-chat` actives, profil démo systemd OK, ollama ps vide, baseline `api_stream` ~1.1 Go VRAM noté.
- Benchmark OCR fait : Tesseract champion chiffres/IPP, EasyOCR conserve texte continu. docTR utile pour bboxes/zonage si besoin futur. Preprocessing OpenCV global = régression, **pas activé par défaut**.
- Dry-run Easily v2 fait (Codex) : MOREL Catherine / IPP 25003284 lisible. Synthèse Urgences nécessite scroll obligatoire (CCMU/GEMSA/J12.1 en bas).
**Infra démo prête** :
- Maquette Easily : http://127.0.0.1:8765/
- Streaming :5005 OK, agent chat :5004 OK
- OnlyOffice + Tesseract (eng/fra/osd) dispo
## Décisions stratégiques actées
- **Périmètre live = 5 onglets** par défaut (Motif, Examens, Imagerie, Notes, Synthèse). Bascule 4 onglets = exception sur échec concret pendant répé, pas pré-décidée.
- **Vocabulaire produit** : Aiva-vision = plateforme universelle apprenante / Léa = agent d'interaction / Aiva-urgence = plugin métier santé.
- **Fail-safe valorisé** : Léa qui dit "je ne sais pas / montre-moi" = **succès produit**, pas échec. NOGO = actions dangereuses, pas demandes de confirmation.
- **Scroll = compétence apprise** : geste + changement visuel + marqueurs. Pas un raccourci fixe.
- **Démo réelle, pas de trucage** : pas de hardcode, pas de bidouille, pas de validation auto, pas de saut silencieux.
- **PII levée** : c'est une maquette, tout est fictif. MOREL Catherine / 25003284 OK.
## Demain — répétition humain challenge (2026-05-27)
Dom joue l'humain réel qui challenge Léa : interrompt, refuse, demande preuves, demande reprise.
Runbook : `docs/coordination/active/2026-05-26_runbook-repetition-humain-challenge-demo-v2.md`
Mon dernier livrable (22:30) couvre la dimension orale : 17 phrases-réponses Léa par catégorie (sélection / scroll / OnlyOffice / refus) + 4 phrases transitions + 8 NOGO comportementaux. Pattern minimum à tenir : **preuve / question / arrêt — jamais affirmation seule**.
## Mes 7 livrables déposés aujourd'hui (inbox_codex/)
1. `0920_claude-to-codex_reprise-session-plan-j6-demo.md` — reprise session
2. `1030_claude-to-codex_CHECKLIST-easily-capture-trace.md` — checklist capture
3. `2130_claude-to-codex_DEMO-v2-script-failsafe-onlyoffice.md` — script démo v2
4. `2145_claude-to-codex_ADDENDUM-demo-v2-dryrun-integration.md` — addendum dry-run
5. `2155_claude-to-codex_ACK-arbitrage-onglets-bascule-discours.md` — ACK 5/4/3 onglets
6. `2215_claude-to-codex_ACK-scroll-vwb-reformulation-discours.md` — ACK scroll VWB
7. `2230_claude-to-codex_SCRIPT-oral-lea-humain-challenge.md` — script oral challenge
## Travaux en attente
- **Répétition humain challenge 2026-05-27** (Dom + Codex), avec mes scripts oraux comme support
- **Capture réelle Easily** par Dom à finaliser après répé si la maquette demande des ajustements
- **Commits propres lot stabilisation** (Codex) — bloqués jusqu'à après capture+répé
- **Healthcheck Windows** — bloqué tant que Dom n'a pas fourni secret SSH non persistant
- **Smoke équivalent Easily** (R7) — post-capture, avant freeze 2026-06-01
## Risques bloquants
- **Synthèse Urgences scroll fragile** : à valider concrètement en répé. Si marqueurs CCMU/GEMSA/J12.1/Consultation externe absents après retry → bascule 4 onglets effective.
- **Divergence OCR EasyOCR/Tesseract** sur IPP : Léa doit demander confirmation, jamais trancher seule.
- **Pattern freeze NoMachine Windows** : toujours non résolu, mais hors scope démo Linux/OnlyOffice.
## Sources de vérité actives (ordre de lecture Codex)
1. `active/2026-05-26_cadrage-produit-aiva-vision.md`
2. `active/2026-05-26_arbitrage-dom-demo-reelle-poc.md`
3. `active/2026-05-26_principe-dom-apprentissage-fail-safe.md`
4. `active/2026-05-26_scenario-operatoire-demo-lea-v2-collecte-transposition.md`
5. `active/2026-05-26_arbitrage-scroll-vwb-reference.md`
6. `active/2026-05-26_principe-apprentissage-scroll-securise.md`
7. `active/2026-05-26_arbitrage-sortie-transposition-onlyoffice.md`
8. `active/2026-05-26_benchmark-ocr-local-captures-easily.md`
9. `active/2026-05-26_patch-ocr-tesseract-ipp.md`
10. `active/2026-05-26_runbook-repetition-humain-challenge-demo-v2.md`
11. `active/2026-05-26_etat-preparation-repetition-2026-05-27.md`
## Prochaine action recommandée à la reprise
À l'ouverture de session demain :
1. Lire `inbox_claude/` pour voir si Codex a déposé un ACK sur le script oral 22:30, ou des INFO de fin de soirée.
2. Lire `active/` pour voir si un nouveau doc a été produit pendant la nuit (post-répé éventuelle).
3. Reprendre le rôle de pilotage projet, attendre instruction Dom sur priorité du jour (préparation finale démo / ajustements post-répé / autre).
## Ce qu'il ne faut pas faire demain
- Ne pas proposer de "retirer Synthèse Urgences" du périmètre par prudence abstraite — rétracté à deux reprises aujourd'hui (addendum 21:45 puis ACK 22:15). Bascule 4 onglets = exception sur échec concret.
- Ne pas mentionner LibreOffice (absent côté Linux).
- Ne pas re-proposer "patch avant benchmark OCR" — l'ordre est verrouillé : benchmark d'abord, patch ensuite.
- Ne pas commiter (Codex groupe les commits).
- Ne pas lancer de live replay sans GO Dom explicite.
- Ne pas mettre de secret en clair dans `docs/coordination/`.
- Ne pas empiéter sur le périmètre Qwen/Anscombe (OCR benchmark, audit pipeline read-only).
- Ne pas attendre validation Dom pour déposer un ACK/reformulation côté Codex — feedback "dépose par défaut" actif (cf. `feedback_depose_par_defaut.md`).
- Ne pas refaire un parcours linéaire dans les scripts oraux — c'est mode humain challenge, le pattern "preuve / question / arrêt" est non négociable.

View File

@@ -0,0 +1,70 @@
# Prompt de reprise Claude — 2026-05-28 matin
> A coller (ou referencer) dans une nouvelle session Claude Code pour repartir propre.
## Contexte
Tu es chef de projet sur `rpa_vision_v3` (alias commercial `aiva-vision`), pilote Codex sur le pivot micro-apprentissage Lea. Le P0 du jour est `ouvrir_recherche_windows` a partir de la session `sess_20260527T185155_98ad9a`.
Hier (2026-05-27) :
- Cadrage `MicroEpisode` comme **annotation/promotion au-dessus** de la chaine existante Graph/FAISS/WorkflowPipeline/TargetMemoryStore (pas de nouvelle chaine).
- Brique `message_contract.py` ecrite par Codex (35 tests verts).
- Plan P1 livre cote Claude (YAML schema, 7 sites warning, predicate `window_title_in`, 4 tests, risques).
## A lire d'abord (ordre important)
1. `docs/handoffs/2026-05-27_handoff_codex_micro_apprentissage_lea_p0_reprise_2026-05-28.md` — handoff Codex
2. `docs/coordination/active/2026-05-28_plan-matin-micro-apprentissage-lea-p0.md` — plan matin actif
3. `docs/coordination/inbox_codex/2026-05-27_1959_claude-to-codex_CONTRAT-competence-courte-verifiee-P0.md` — contrat `MicroEpisode` (14 sections, transitions observed→candidate→supervised→stable)
4. `docs/coordination/inbox_codex/2026-05-27_2039_claude-to-codex_PLAN-P1-contrat-p0-message-warning.md` — plan P1 (YAML schema final, 7 sites warning avec lignes precises, predicate, 4 tests)
5. `docs/coordination/syntheses/2026-05-27_1956_codex_ADDENDUM-chaine-apprentissage-graph-faiss.md` — recadrage Dom : ne pas reinventer la chaine
## Priorites du jour (cf. PREP Codex 21:35)
1. Garder `MicroEpisode` = annotation/promotion au-dessus de Graph/FAISS, jamais en remplacement.
2. Finaliser `data/competences/observed/open_windows_search.yaml` (schema dans le PLAN P1 §1).
3. Guider le branchement `message_contract.py` en mode **warning** (helper `emit_or_warn`, 7 sites lignes precises dans PLAN P1 §2).
4. Verifier que les messages visibles respectent le format 4 champs : INTENTION / ATTENDU / VU / DEMANDE.
5. Refuser toute derive boite a clic ou chaine parallele.
## 5 decisions §13 a acter avec Dom
1. Validateur YAML chez Codex ou Claude ?
2. Helper `emit_or_warn` dans `message_contract.py` ou nouveau module ?
3. Branchement warning : 1 site d'abord ou 6 en bloc ?
4. Demotion stable→supervised : N=2 ou N=3 echecs ?
5. Promotion AUTO stable : automatique apres T3 ou validation Dom obligatoire ?
## Invariants
- Pas de patch sans GO Dom matin.
- Pas de recapture Win+S (session P0 existe : 3 chemins confirmes).
- Pas de bypass Graph / FAISS / TargetMemoryStore.
- Pas de coordonnees codees en dur ; jamais de boite a clic.
- Pas de message generique visible (`un element`, `cette action`, `Validation requise`).
- Ne pas modifier `agent_v0/agent_v1/core/executor.py` ni `core/grounding.py`.
- Pas de live replay / restart service / redeploiement Windows sans GO.
- Pas de commit (Codex groupe les commits).
- Secrets : pas en clair dans `docs/coordination/` (placeholder OK).
## Etat session P0
Session : `sess_20260527T185155_98ad9a` (23 events, machine `DESKTOP-58D5CAC_windows`).
Chemins :
- `data/training/live_sessions/streaming_sessions/sess_20260527T185155_98ad9a.json`
- `data/training/live_sessions/DESKTOP-58D5CAC_windows/sess_20260527T185155_98ad9a/live_events.jsonl`
- `data/training/live_sessions/DESKTOP-58D5CAC_windows/sess_20260527T185155_98ad9a/shots/`
Sequence clef : event #02 focus `Acces vocal → Rechercher (SearchHost.exe)` precede event #03 `key_combo ["win","s"]` (effet release-only). Heartbeats #07/#11/#13 confirment `active='Rechercher'`. Parasites a filtrer : #00 (Acces vocal), #15-22 (systray + pythonw).
Marqueur succes retenu : `window_title in {"Rechercher"} OR app_name == "SearchHost.exe"`.
## Canal coordination
Lecture Codex : `docs/coordination/inbox_claude/`
Depot Claude → Codex : `docs/coordination/inbox_codex/`
Polling : par defaut, depose direct (ACK/reformulation/addendum) sans demander confirmation.
## Premier reflexe attendu
Lire les 5 fichiers ci-dessus, faire un `ls -lt docs/coordination/inbox_claude/ | head -5` pour les eventuels messages nuit, puis demander GO Dom sur les 5 decisions §13 avant tout patch ou ecriture YAML.

View File

@@ -0,0 +1,23 @@
Lis dabord `docs/handoffs/2026-05-23_handoff_codex_lea_replay_resume.md`, puis vérifie `docs/coordination/inbox_codex/` pour toute réponse Claude récente.
Contexte à reprendre :
- projet `rpa_vision_v3`
- replay live courant : `replay_sess_595c4947`
- blocage actuel : dérive après clic sur longlet `Enregistrer sous` vers `rpa_vision : Explorateur de fichiers`
- le patch grounding visuel est déjà déployé sur Windows et actif
- le handler popup overwrite `Confirmer l'enregistrement -> Oui` est déjà codé mais pas encore exercé sur ce run
- problème infra séparé : GPU Linux non exploitable (`driver/library mismatch` NVIDIA)
Objectif immédiat :
1. vérifier si la machine a redémarré et si Léa est revenue
2. si besoin, relancer un `replay-session` avec :
- `session_id=sess_20260520T102916_066851`
- `machine_id=DESKTOP-58D5CAC_windows`
3. continuer uniquement le diagnostic/fix sur la dérive `Enregistrer sous -> Explorateur`
4. lire et intégrer la réponse Claude si elle existe
5. ne pas repartir de zéro ni rouvrir les sujets déjà clos
Rappels importants :
- utiliser `docs/coordination/` pour les briefs Claude
- ne pas mélanger le bug fonctionnel courant avec le problème infra GPU
- ne pas retirer le nouveau grounding visuel sans preuve contraire

View File

@@ -0,0 +1,19 @@
Lis d'abord :
1. `docs/handoffs/2026-05-25_handoff_codex_notepad_success_phase2.md`
2. le handoff Claude miroir du 2026-05-25 s'il existe dans `docs/handoffs/`
3. `docs/coordination/inbox_codex/` pour les messages Claude plus recents
Contexte court :
- Replay Bloc-notes live reussi : `replay_sess_e96e5822`, `18/18`, `0` echec.
- Point critique valide : `Confirmer l'enregistrement` traite sans aide humaine via `runtime_dialog_handled_post_verify`.
- Prochains chantiers : figer le succes par test offline, traiter vitesse/dispatch, clarifier chemin Windows reel, puis transport inerte `SceneExpected` / `Precondition`.
Regles de reprise :
- Ne pas faire de gros code sans deleguer a Claude.
- Ne pas resync `deploy/windows_client` avant verification du chemin reel execute par Lea.
- Ne pas relancer de replay live tant que l'objectif de test n'est pas clair.
- Utiliser `.venv/bin/python` pour les tests Python.
- Ne rien revert dans le worktree sale sans demande explicite Dom.

View File

@@ -0,0 +1,140 @@
# Handoff Codex — reprise soir 2026-05-25
- `Auteur`: Codex
- `Date`: 2026-05-25 soir Europe/Paris
- `Contexte`: stabilisation Lea / demo cible 2026-06-01
- `Role Codex`: direction technique, arbitrage, integration, tests finaux
## Etat valide
1. Smoke Notepad post-recablage valide :
- replay `replay_sess_1c0bfb42`
- resultat `completed`, `16/16`, `0 failed`, `0 retries`, `0 pause Lea`
- gardes memoire valides :
- `window_transition_requires_visual_confirmation`
- `generic_button_missing_context`
- dialogue remplacement absorbe via `runtime_dialog_handled_post_verify`
2. Profil demo Linux actif et coherent :
- `RPA_SKIP_INTENTION_ENRICHMENT=true`
- `RPA_SKIP_BUILD_VISION=true`
- `RPA_EASYOCR_GPU=0`
- `AGENT_CHAT_ENABLE_OWL=0`
- `AGENT_CHAT_ENABLE_UI_DETECTION=0`
3. R6 EasyOCR leve par Gemini :
- conserver la modification `easyocr_gpu_enabled(default=False)`
- objectif : pas d'allocation VRAM EasyOCR cachee
4. Bulle Lea :
- correctif scrollable/compact present
- Claude juge OK demo
- pas de patch supplementaire ce soir
## Decisions actees
- Notepad `16/16` valide le recablage, mais ne prouve pas encore la robustesse. Il faudra planifier une serie 10-15 runs avant de parler de stabilite forte.
- Pas de migration globale `qwen3.5` avant D5-v3b/D5-v3c.
- Runtime demo reste `qwen2.5vl` bbox legacy avec `num_ctx=4096`.
- `qwen3.5` = benchmark isole / API preparatoire JSON, pas runtime global.
- D5-v3c Windows `num_ctx=8192` = report post-demo.
- Easily avec Lea reel = chantier reporte apres-demain, pas demain.
- Secrets/docs = dette secondaire pour l'instant, a traiter avant commit public.
## Travail collegues a lire a la reprise
Lire les derniers messages dans `docs/coordination/inbox_codex/`, en particulier :
- `2026-05-25_1720_claude-to-codex_REPONSE-taches-projet-ocr-d5v3c-lea.md`
- `2026-05-25_1735_claude-to-codex_protocole-capture-easily-lea.md`
- `2026-05-25_2030_gemini-to-codex_REPONSE-taches-projet-perf-qwen-risques.md`
- `2026-05-25_2045_gemini-to-codex_GRILLE-demo-intelligence-facilite.md`
- `2026-05-25_2100_gemini-to-codex_PROPOSITION-demo-metier-avancee.md`
Messages de preparation de fin de soiree envoyes :
- `docs/coordination/inbox_claude/2026-05-25_2018_codex-to-claude_TACHES-preparation-sans-runtime.md`
- `docs/coordination/inbox_gemini/2026-05-25_2018_codex-to-gemini_TACHES-preparation-sans-runtime.md`
Dom demande aussi a Claude et Gemini de produire leurs handoffs soir.
## Patch OCR Claude
Claude annonce avoir pose :
- `agent_v0/server_v1/resolve_engine.py`
- `tests/unit/test_text_match_fuzzy_prefix.py`
Objet : accepter un OCR prefixe partiel, ex. `Enregi` pour `Enregistrer`, avec garde-fous :
- `len(observed) >= 4`
- `len(observed) >= 50% len(expected)`
- `expected.startswith(observed)`
A faire a la reprise :
1. verifier le diff soi-meme ;
2. lancer le test cible ;
3. arbitrer `ACK/NACK` a Claude ;
4. decider si seuil 50% ou 60%.
Commande cible :
```bash
.venv/bin/python -m pytest tests/unit/test_text_match_fuzzy_prefix.py -q
```
## Prochaines actions recommandees
Priorite courte :
1. `git status --short`
2. Lire nouveaux handoffs Claude/Gemini s'ils existent.
3. Verifier patch OCR Claude + test cible.
4. Repondre ACK/NACK a Claude.
5. Planifier protocole smoke Notepad 10-15 runs, sans le lancer sans GO Dom.
Priorite moyenne :
1. Decoupage worktree en commits propres.
2. Ne pas committer docs avant scan/sanitisation minimal.
3. Preparer, plus tard, capture Easily avec Lea reelle.
## A ne pas faire demain
- Ne pas lancer chantier Easily.
- Ne pas migrer `qwen3.5` en global.
- Ne pas set `RPA_GROUNDING_MODEL=qwen3.5:9b`.
- Ne pas redeployer Windows pour D5-v3c.
- Ne pas lancer 10-15 smokes sans fenetre de controle et GO Dom.
- Ne pas faire de grand nettoyage worktree non supervise.
- Ne pas archiver/supprimer messages coordination sans synthese.
## Commandes utiles lecture seule
```bash
git status --short
find docs/coordination/inbox_codex -type f -printf '%TY-%Tm-%Td %TH:%TM %p\n' | sort | tail -20
systemctl --user is-active rpa-streaming.service
curl -fsS http://127.0.0.1:5005/health
ollama ps
```
Pour les endpoints proteges, charger `.env.local` sans afficher le token :
```bash
set -a; . ./.env.local; set +a
curl -fsS -H "Authorization: Bearer $RPA_API_TOKEN" http://127.0.0.1:5005/api/v1/traces/stream/replays
```
## Risques restants
- Robustesse replay non prouvee statistiquement : un seul Notepad 16/16.
- Worktree tres sale, nombreux fichiers modifiés/non suivis.
- Docs historiques avec secrets : secondaire ce soir, bloquant avant publication/commit docs.
- Scenario demo client encore a concevoir : le client veut voir intelligence/facilite, pas seulement boutons.
- Capture Easily reelle devra utiliser patient fictif et eviter PII.
## Dernier mot
Le socle a enfin passe un vrai smoke propre. La bonne discipline maintenant : petits lots, delegation, verification, pas de migration globale ni nouveau chantier lourd avant reprise controlee.

View File

@@ -0,0 +1,114 @@
# Prompt reprise Gemini — 2026-05-25
Tu es Gemini, collègue de revue indépendante sur le projet Léa/RPA Vision.
Contexte local :
- Repo : `/home/dom/ai/rpa_vision_v3`
- Canal d'échange : fichiers Markdown dans `docs/coordination/`
- Tu réponds à Codex dans `docs/coordination/inbox_codex/`
- Format attendu : court, factuel, avec `ACK/NACK`, fichiers lus, risques, recommandations.
## Rôle attendu
Tu n'es pas le pilote principal. Ton rôle est :
- revue indépendante ;
- contrepoint technique ;
- détection d'angles morts ;
- validation ou NACK des décisions Codex/Claude ;
- pas de patch sauf anomalie critique explicitement justifiée.
Codex garde l'arbitrage. Claude exécute/analyse. Dom tranche les choix produit/demo.
## À lire en priorité
Lis dans cet ordre :
1. `docs/coordination/README.md`
2. `docs/coordination/active/2026-05-25_etat-courant.md`
3. `docs/coordination/syntheses/2026-05-25_synthese-direction.md`
4. `docs/coordination/registre/2026-05-25_decisions.md`
5. `docs/coordination/registre/2026-05-25_arbitrages-runbook-demo.md`
6. `docs/coordination/active/2026-05-25_execution-profil-demo-linux.md`
7. `docs/coordination/active/2026-05-25_runbook-profil-demo-smoke.md`
8. `docs/coordination/index/2026-05-25_messages-cles.md`
Ensuite seulement, lis les derniers messages si besoin :
- `docs/coordination/inbox_codex/2026-05-25_1900_claude-to-codex_D5v3a-mini-fix-resultat.md`
- `docs/coordination/inbox_codex/2026-05-25_1920_gemini-to-codex_ACK-revue-D5v3a-minifix.md`
- `docs/coordination/inbox_codex/2026-05-25_1645_claude-to-codex_runbook-demo-livre.md`
- `docs/coordination/inbox_claude/2026-05-25_1640_codex-to-claude_INFO-profil-demo-linux-active.md`
## État courant résumé
La démo client est reportée au 2026-06-01. On stabilise proprement.
Ce qui est validé :
- C2d-bis : `RPA_SKIP_BUILD_VISION=true` + short-circuit `vision_info.text`.
- Gain perf build confirmé par Codex après restart : `skip_ms=253`, `speedup=209.7x`.
- D5-v3a mini-fix : `num_ctx=4096` explicite sur les 3 appels bbox legacy serveur.
- Agent_chat ne charge plus OWL/UI detection et n'occupe plus la VRAM.
- Profil démo Linux actif via drop-ins systemd.
- Smoke offline OK.
Ce qui n'est PAS fait :
- Pas de smoke live.
- Pas de healthcheck Windows avec secret.
- Pas de commit.
- Pas de D5-v3b.
- Pas de modification Windows executor.
## Flags actifs côté Linux
`rpa-streaming.service` :
- `RPA_SKIP_INTENTION_ENRICHMENT=true`
- `RPA_SKIP_BUILD_VISION=true`
- `RPA_EASYOCR_GPU=0`
- `RPA_VALIDATOR_V2_ENABLED=true`
- `RPA_DIALOG_RESOLVER_ENABLED=true`
`rpa-agent-chat.service` :
- `AGENT_CHAT_ENABLE_OWL=0`
- `AGENT_CHAT_ENABLE_UI_DETECTION=0`
Important : ne PAS recommander d'activer globalement `RPA_GROUNDING_MODEL=qwen3.5:9b`.
Raison : conflit avec les callers bbox legacy qui attendent qwen2.5vl/bbox_2d.
## Points critiques à garder en tête
- `generate_grounding()` D5-v2 est une API préparatoire JSON `{x_pct,y_pct,confidence}`. Elle n'est pas encore consommée par les callers runtime.
- Les chemins bbox legacy restent qwen2.5vl, avec `num_ctx=4096` explicite depuis D5-v3a.
- Le healthcheck Linux peut afficher WARN si `qwen2.5vl` n'est pas résident à froid ; ce WARN est acceptable avant smoke live.
- Le test perf peut réchauffer qwen2.5vl en `CONTEXT=8192` via chemin full historique ; Codex l'a ensuite stoppé avec `ollama stop`.
- Windows executor contient encore des `num_ctx=8192`, report D5-v3c.
- Le worktree est large et sale : pas de commit/freeze sans tri Codex.
- Ne jamais stocker de secret réel dans les docs ; utiliser placeholders.
## Ce que Codex attend de toi maintenant
Mission de reprise :
1. ACK que tu as repris le contexte.
2. Vérifie que la structure de coordination est compréhensible.
3. Vérifie que le profil démo Linux actif ne contient pas de contradiction évidente.
4. Propose une checklist GO/NOGO courte pour la prochaine étape :
- healthcheck Windows ;
- smoke live court Bloc-notes.
5. Signale tout NACK bloquant avant smoke live.
Contraintes :
- Pas de patch code.
- Pas de restart service.
- Pas de live replay.
- Pas de D5-v3b.
- Répondre dans `docs/coordination/inbox_codex/` avec un fichier nommé :
`2026-05-25_HHMM_gemini-to-codex_ACK-reprise-contexte.md`
Auteur du prompt : Codex

View File

@@ -0,0 +1,33 @@
# Handoff Gemini — 2026-05-25 SOIR
## 1. État validé
- **Performance** : C2d-bis validé (build vision skip ~270ms, speedup ~210x).
- **Stabilisation VRAM** : D5-v3a (num_ctx=4096) colmaté sur les appels bbox legacy.
- **Profil Démo Linux** : Actif (drop-ins systemd), validé par smoke live Bloc-notes (`16/16`).
## 2. Décisions actées
- **Scénario Démo** : Passage d'un "waouh visuel" à une démo "métier" (lecture tableaux, extraction champs, saisie).
- **Architecture** : Maintien strict de `qwen2.5vl` pour le runtime démo ; `qwen3.5` réservé au benchmark/audit.
- **R6 EasyOCR** : Validé et conservé (respect de `RPA_EASYOCR_GPU=0`).
## 3. Travaux en attente
- **Configuration Easily** : Définir les `ExtractionSchema` (champs patients) pour le nouveau scénario métier.
- **Sanitisation Docs** : Nettoyage des secrets identifiés (G-P3).
- **Benchmark VLM** : Exécution du protocole isolé qwen2.5 vs qwen3.5.
## 4. Risques bloquants seulement
- **Secrets Git** : `docs/AUDIT_20260404.md` contient des clés API réelles. **Interdiction de push/publier sans purge.**
## 5. Fichiers importants
- `core/extraction/field_extractor.py` (Cœur de la démo métier demain).
- `agent_v0/server_v1/resolve_engine.py` (Contient le mini-fix VRAM).
- `docs/coordination/registre/2026-05-25_decisions.md` (Source de vérité).
## 6. Prochaine action recommandée
- **Lancer le Healthcheck Windows** (avec secret non persistant) pour valider l'agent avant le smoke métier Easily.
## 7. Ce qu'il ne faut pas faire demain
- **Ne pas activer `RPA_GROUNDING_MODEL=qwen3.5:9b` globalement.**
- **Ne pas modifier le code de `agent_v1` (Windows)** sans plan de déploiement validé.
Auteur : Gemini

View File

@@ -0,0 +1,85 @@
# Prompt reprise Gemini — 2026-05-26 matin
- `Auteur`: Codex
- `Date`: 2026-05-26 10:09 Europe/Paris
- `Contexte`: reprise J-6 démo Easily 2026-06-01
- `But`: permettre à Gemini de redémarrer vite sans relire tout l'historique
## État court
Le socle technique a été stabilisé hier soir :
- Smoke Bloc-notes `replay_sess_1c0bfb42` validé `16/16`, `0 failed`, `0 retries`, `0 pause Léa`.
- Profil démo Linux actif :
- `RPA_SKIP_INTENTION_ENRICHMENT=true`
- `RPA_SKIP_BUILD_VISION=true`
- `RPA_EASYOCR_GPU=0`
- `AGENT_CHAT_ENABLE_OWL=0`
- `AGENT_CHAT_ENABLE_UI_DETECTION=0`
- Runtime démo maintenu sur `qwen2.5vl` bbox legacy.
- `qwen3.5` reste benchmark/API préparatoire, pas runtime global.
- Patch OCR Claude `_text_match_fuzzy` ACK par Codex : tolérance préfixe `Enregi` / `Enregistrer`, seuil conservé à 50%.
- D5-v3c Windows `num_ctx=8192` reporté post-démo.
## État ce matin
Codex a distribué les tâches :
- Claude : `docs/coordination/inbox_claude/2026-05-26_0925_codex-to-claude_TACHES-reprise-easily-healthcheck-trace.md`
- Gemini : `docs/coordination/inbox_gemini/2026-05-26_0925_codex-to-gemini_TACHES-reprise-demo-metier-risques.md`
Healthcheck local Codex :
- `rpa-streaming.service`: actif
- `rpa-agent-chat.service`: actif
- `5005/health`: healthy
- `5004/api/status`: online
- `ollama ps`: aucun modèle résident
- `tools/lea_healthcheck.py`: WARN uniquement car `qwen2.5vl:7b-rpa` non résident
- Windows non testé : pas de secret SSH disponible dans la session Codex
## Ce que Gemini doit faire maintenant
Répondre uniquement à cette tâche :
`docs/coordination/inbox_gemini/2026-05-26_0925_codex-to-gemini_TACHES-reprise-demo-metier-risques.md`
Réponse attendue dans :
`docs/coordination/inbox_codex/2026-05-26_HHMM_gemini-to-codex_REPONSE-demo-metier-risques.md`
Format attendu : court, ACK/NACK explicite, directement utilisable par Dom/Codex.
## Contenu attendu
1. **Scénario métier minimal Easily**
- 6 à 10 actions maximum.
- Montrer intelligence + facilité, pas performance technique.
- Inclure au moins une lecture métier et une saisie contrôlée.
- Ne pas reprendre mécaniquement un workflow historique VWB.
2. **Critères client de réussite**
- 5 critères maximum, visibles par un client non technique.
3. **Risques bloquants démo**
- Seulement les risques qui justifient NOGO avant capture/replay.
- Distinguer technique, métier, conformité.
4. **Phrase qwen**
- Une formulation courte expliquant pourquoi on ne migre pas `qwen3.5` globalement avant la démo.
## Contraintes non négociables
- Pas de runtime.
- Pas de benchmark.
- Pas de migration modèle.
- Pas de replay live.
- Pas de redéploiement Windows.
- Pas de données patient réelles.
- Ne pas bloquer sur secrets/docs : dette à traiter avant publication, pas avant préparation locale.
## Décision si contexte incomplet
Si Gemini manque d'information, il doit répondre avec les hypothèses minimales plutôt que relancer une enquête longue.
Auteur : Codex

View File

@@ -0,0 +1,161 @@
# Handoff Qwen — Session 2026-05-26 soir → 2026-05-27
- `De`: Qwen
- `Date`: 2026-05-26 22:30 Europe/Paris
- `Contexte`: fin de session soir, reprise demain
- `Équipe`: Dom (arbitre), Codex (coordinateur), Claude/Claudettes (collègues), Qwen (moi)
---
## État du projet — ce qui a été fait ce soir
### Session de reprise (20h44 → 22h30)
1. **Lecture du prompt de reprise** (`PROMPT_REPRISE_QWEN_2026-05-26_SOIR.md`)
- Cadrage Aiva-vision / Léa / Aiva-urgence
- Scénario démo v2 : collecte multi-onglets → transposition OnlyOffice
- Limites non négociables Dom
2. **Première analyse**`2026-05-26_2044_qwen-to-codex_REPRISE-analyse-scenario-v2.md`
- ACK/NACK, 8-lignes résumé, 5 risques, 5 critères, 3 vérifications
- Recommandation : dry-run contrôlé
3. **Deuxième passe après lecture 5 sources actives**`2026-05-26_2050_qwen-to-codex_DELTA-apres-lecture-sources-actives.md`
- Corrections : `/api/analyse` n'est pas un endpoint vision, orthographe `Easily`
- 3 risques bloquants : extract_text_scroll, grounding maquette, sortie transposition
- Proposition transposition : .xlsx via openpyxl, fallback .txt
4. **Audit technique dry-run + OnlyOffice**`2026-05-26_2101_qwen-to-codex_AUDIT-technique-dryrun-onlyoffice.md`
- 8 ancres critiques à valider
- Seuils GO/NOGO par onglet
- Fallbacks F1-F4
5. **Seuils et fallbacks après dry-run**`2026-05-26_2113_qwen-to-codex_SEUILS-fallbacks-apres-dryrun.md`
- Seuils affinés sur données réelles du dry-run
- 4 fallbacks techniques documentés
6. **Rapport P0 OCR écran**`2026-05-26_2117_qwen-to-codex_RAPPORT-P0-ocr-ecran.md`
- Diagnostic pipeline OCR (EasyOCR, docTR, Tesseract)
- Architecture multi-moteur par zone
- Cold start vs interface apprise
- **Mis à jour** : docTR CPU repositionné comme moteur de zonage P0
7. **Retour benchmark OCR**`2026-05-26_2148_qwen-to-codex_RETOUR-benchmark-ocr-capitalisation.md`
- Tesseract 11/11 IPP en 0,47s ✅
- EasyOCR 8/11 IPP, bon sur texte continu
- Preprocessing OpenCV : régression, pas d'amélioration
- Architecture multi-moteur : chiffres→Tesseract, texte→EasyOCR, structure→docTR
- 5 règles de capitalisation
8. **ACK apprentissage scroll sécurisé**`2026-05-26_2149_qwen-to-codex_ACK-apprentissage-scroll-securise.md`
- GO/NOGO sur marqueurs après scroll (CCMU, GEMSA, J12.1, Consultation externe)
- Scroll réussi = geste + changement visuel + données relues
### Exploration web (solutions similaires)
- Agent-S : réflexion in-context, Best-of-N sampling, grounding dédié
- UI-TARS : grounding GUI par coordonnées, reinforcement learning
- Claude Computer Use : 22% OSWorld, scroll/drag difficiles
- OpenAI Operator : **abandonné** (août 2025)
- Différentiateur Aiva-vision : "l'agent qui sait s'arrêter" — défendable en domaine réglementé
### Exploration codebase
- Agent explorateur a scanné 880 fichiers Python, 39 sous-modules core/
- Pipeline complet compris : capture → streaming → analyse → grounding → execution → replay
---
## État technique connu — décisions actives
### OCR
- **EasyOCR brut** : moteur par défaut pour texte continu (inchangé)
- **Tesseract** : patch appliqué pour IPP/chiffres (`extract_digits_tesseract_from_image()`, `extract_table(engine="tesseract")`)
- **docTR CPU** : moteur de zonage pour band patient, synthèse, bboxes
- **Preprocessing OpenCV** : ❌ reporté (régression mesurée)
- **PaddleOCR** : ❌ post-démo
- **VLM OCR texte** : ❌ exclu J-6
### Workflow
- `Demo_urgence_3_db` / `wf_483910cdd851_1778750587` : step `extract_table` → Tesseract
- BDD backupée : `workflows.db.backup_2026-05-26_ocr_tesseract_demo3`
- 5 onglets préparés, live prudent possible en 4 si scroll échoue
### Démo
- Cible : 2026-06-01
- Répétition humaine : demain (Dom challengeur)
- Dossier cible : `MOREL Catherine / IPP 25003284`
- Sortie : `.xlsx` ouvert dans OnlyOffice (`/snap/bin/onlyoffice-desktopeditors`)
- Profil démo Linux actif (flags skip vision, EasyOCR CPU)
---
## Documents actifs à connaître
### Sources actives prioritaires
1. `docs/coordination/active/2026-05-26_cadrage-produit-aiva-vision.md`
2. `docs/coordination/active/2026-05-26_arbitrage-dom-demo-reelle-poc.md`
3. `docs/coordination/active/2026-05-26_principe-dom-apprentissage-fail-safe.md`
4. `docs/coordination/active/2026-05-26_scenario-operatoire-demo-lea-v2-collecte-transposition.md`
5. `docs/coordination/active/2026-05-26_audit-ancien-workflow-urgence-aiva.md`
### Documents ajoutés ce soir
- `docs/coordination/active/2026-05-26_benchmark-ocr-local-captures-easily.md`
- `docs/coordination/active/2026-05-26_arbitrage-scroll-vwb-reference.md`
- `docs/coordination/active/2026-05-26_principe-apprentissage-scroll-securise.md`
- `docs/coordination/active/2026-05-26_synthese-retours-claude-qwen-demo-v2-ocr.md`
- `docs/coordination/active/2026-05-26_dryrun-easily-v2-captures-ocr-onlyoffice.md`
- `docs/coordination/active/2026-05-26_arbitrage-sortie-transposition-onlyoffice.md`
- `docs/coordination/active/2026-05-26_mission-p0-ocr-ecran-lea.md`
- `docs/coordination/active/2026-05-26_mission-P0-ocr-ecran-qwen.md`
### Runbook
- `docs/coordination/active/2026-05-26_runbook-repetition-humain-challenge-demo-v2.md`
---
## Fichiers produits ce soir (inbox_codex)
| Fichier | Type |
|---------|------|
| `2026-05-26_2044_qwen-to-codex_REPRISE-analyse-scenario-v2.md` | Analyse initiale |
| `2026-05-26_2050_qwen-to-codex_DELTA-apres-lecture-sources-actives.md` | Delta sources |
| `2026-05-26_2101_qwen-to-codex_AUDIT-technique-dryrun-onlyoffice.md` | Audit technique |
| `2026-05-26_2113_qwen-to-codex_SEUILS-fallbacks-apres-dryrun.md` | Seuils/fallbacks |
| `2026-05-26_2117_qwen-to-codex_RAPPORT-P0-ocr-ecran.md` | Rapport OCR (mis à jour) |
| `2026-05-26_2137_qwen-to-codex_SYNTHESE-benchmark-5-onglets.md` | Synthèse collectif |
| `2026-05-26_2148_qwen-to-codex_RETOUR-benchmark-ocr-capitalisation.md` | Retour benchmark |
| `2026-05-26_2149_qwen-to-codex_ACK-apprentissage-scroll-securise.md` | ACK scroll |
---
## Ce qui reste à faire / à surveiller demain
1. **Répétition humaine** — Dom challengeur, critères GO/NOGO stricts
2. **Résultats de la répétition** — ajuster si nécessaire
3. **Patchs potentiels** — selon résultats répétition (scroll, grounding)
4. **Préparation démo 2026-06-01** — J-5 après demain
---
## Mémoire construite ce soir
- `user/dom_constraints.md` — Limites non négociables Dom
- `project/aiva_vision_demo.md` — Contexte démo Aiva-vision
- `feedback/qwen_avoidances.md` — Ce que Qwen doit éviter
- `feedback/dom_doctr_preference.md` — DocTR puissant pour zonage
- `feedback/qwen_proactive_improvements.md` — Qwen doit proposer des idées
- `project/aiva_vision_product_philosophy.md` — Collaborateur administratif, pas RPA
- `reference/coordination_process.md` — Coordination par fichiers Markdown
---
## Notes personnelles Qwen
- Le positionnement produit est **collaborateur administratif supervisé**, pas RPA "boîte à clic"
- Notre avantage : "l'agent qui sait s'arrêter" — pas un bug, une feature en domaine réglementé
- Architecture : Aiva-vision (socle universel) + plugins métier (accélérateurs d'apprentissage)
- Cycle Léa : apprendre → essayer → se planter → humain rattrape → consolide → indépendant
- L'exploration web montre que personne n'a résolu le computer use fiable (Claude 22%, OpenAI a abandonné)
---
*Auteur : Qwen*

View File

@@ -0,0 +1,208 @@
# Prompt reprise Qwen — Aiva-vision / Léa / Aiva-urgence
- `Auteur`: Codex
- `Date`: 2026-05-26 20:41 Europe/Paris
- `Contexte`: remplacement de Gemini comme collègue d'analyse
- `Objectif`: permettre à Qwen de contribuer efficacement à la préparation démo 2026-06-01
## Ton rôle
Tu rejoins une équipe de coordination autour du projet **Aiva-vision**.
Tu ne pilotes pas le runtime. Tu es attendu comme collègue d'analyse technique et produit :
- relire les sources actives ;
- détecter les contradictions ;
- challenger les risques ;
- proposer des checklists courtes ;
- aider à préparer une démo réelle, solide et défendable pour les POC.
Tu dois répondre de façon opérationnelle, courte, structurée, sans tunnel de réflexion.
## Produit
### Aiva-vision
Aiva-vision est la plateforme générique.
Elle apprend des interfaces existantes, interagit avec elles, et permet de greffer des plugins métier.
Le positionnement est universel : santé aujourd'hui, aéronautique ou autres secteurs demain.
### Léa
Léa est l'agent d'interaction d'Aiva-vision.
Elle doit :
- observer l'écran ;
- lire les données affichées ;
- dialoguer avec l'utilisateur ;
- demander confirmation ;
- reporter des informations dans d'autres outils ;
- apprendre quand elle ne sait pas ;
- s'arrêter plutôt que faire une mauvaise action.
### Aiva-urgence
Aiva-urgence est le plugin métier santé utilisé pour la démo.
Il aide à traiter des dossiers urgences et à qualifier/requalifier un passage :
- Forfait Urgences ;
- hospitalisation / requalification UHCD-MCO.
## Cadrage démo
Le client a déjà vu un vrai scénario filmé. Le 2026-06-01, il veut voir en vrai.
Dom impose :
- pas de trucage ;
- pas de bidouillage ;
- pas de succès simulé ;
- pas de hardcode pour faire illusion ;
- si Léa ne sait pas, elle s'arrête et demande de l'aide.
Dans le monde hospitalier, un arrêt sûr est préférable à une action dangereuse.
La démo est courte, mais elle prépare les POC.
## Scénario cible actuel
La base opérationnelle est :
`docs/coordination/active/2026-05-26_scenario-operatoire-demo-lea-v2-collecte-transposition.md`
Résumé :
1. Léa observe la liste des passages aux urgences.
2. Léa décrit le tableau : colonnes, dossiers, statuts.
3. Léa propose : traiter tous les dossiers ou un dossier en particulier.
4. Dom choisit un dossier, probablement `MOREL Catherine / 25003284`.
5. Léa ouvre le dossier.
6. Léa parcourt les onglets :
- `Motif d'admission`
- `Examens cliniques`
- `Imagerie`
- `Notes médicales`
- `Synthèse Urgences`
7. Léa collecte les informations, y compris avec scroll/ascenseur si nécessaire.
8. Léa demande où consigner les informations :
- Excel ;
- Word ;
- base de données ;
- autre plateforme/environnement.
9. Léa reporte les informations collectées.
10. Léa s'arrête pour validation humaine.
Le coeur de la démonstration : **lecture écran précise -> collecte multi-onglets -> choix utilisateur -> transposition dans un autre outil**.
## État technique connu
Validé :
- Smoke Bloc-notes `replay_sess_1c0bfb42` : `16/16`, `0 failed`, `0 retries`, `0 pause Léa`.
- Profil démo Linux actif :
- `RPA_SKIP_INTENTION_ENRICHMENT=true`
- `RPA_SKIP_BUILD_VISION=true`
- `RPA_EASYOCR_GPU=0`
- `AGENT_CHAT_ENABLE_OWL=0`
- `AGENT_CHAT_ENABLE_UI_DETECTION=0`
- Runtime démo visuel : `qwen2.5vl` bbox legacy.
- Ne pas migrer globalement vers `qwen3.5`.
- `qwen3.5` reste benchmark/API préparatoire.
- Patch OCR préfixe `Enregi` / `Enregistrer` ACK, seuil 50%.
- EasyOCR GPU désactivé par défaut.
- D5-v3c Windows `num_ctx=8192` reporté post-démo.
Maquette :
- service `rpa-mockup-easily.service` actif ;
- endpoint `http://127.0.0.1:8765/healthz` OK ;
- maquette Windows attendue : `http://192.168.1.40:8765/index.html`.
Important :
- `/api/analyse` utilise le modèle texte `qwen2.5:7b`, pas `qwen2.5vl`.
- `qwen2.5vl:7b-rpa` sert au grounding visuel/replay.
- l'ancien workflow `Urgence_aiva_demo` contient des briques utiles mais ne doit pas être rejoué tel quel.
## Documents à lire dans cet ordre
1. `docs/coordination/active/2026-05-26_cadrage-produit-aiva-vision.md`
2. `docs/coordination/active/2026-05-26_arbitrage-dom-demo-reelle-poc.md`
3. `docs/coordination/active/2026-05-26_principe-dom-apprentissage-fail-safe.md`
4. `docs/coordination/active/2026-05-26_scenario-operatoire-demo-lea-v2-collecte-transposition.md`
5. `docs/coordination/active/2026-05-26_audit-ancien-workflow-urgence-aiva.md`
Compléments utiles :
- `docs/coordination/inbox_codex/2026-05-26_1030_claude-to-codex_CHECKLIST-easily-capture-trace.md`
- `docs/coordination/inbox_codex/2026-05-26_1145_gemini-to-codex_REPONSE-demo-metier-risques.md`
- `docs/handoffs/PROMPT_REPRISE_CODEX_2026-05-25_SOIR.md`
## Méthode de travail
Le repo utilise une coordination par fichiers Markdown.
Pour écrire à Codex :
`docs/coordination/inbox_codex/YYYY-MM-DD_HHMM_qwen-to-codex_SUJET.md`
Format attendu :
- `De`: Qwen
- `A`: Codex
- `Date`: horodatage Europe/Paris
- `Statut`: ACK / NACK / proposition
- réponse courte et actionnable.
Ne pas écrire de rapport long sauf demande explicite.
Toujours distinguer :
- faits vérifiés ;
- hypothèses ;
- recommandations ;
- risques bloquants.
## Limites non négociables
- Pas de replay live sans GO explicite Dom.
- Pas de redéploiement Windows.
- Pas de restart service sans demande Codex/Dom.
- Pas de migration globale modèle.
- Pas de `RPA_GROUNDING_MODEL=qwen3.5:9b`.
- Pas de patch runtime sans demande.
- Pas de secret dans les docs.
- Pas de patient réel : la maquette est fictive.
- Pas de proposition cosmétique ou truquée.
## Ce que tu dois éviter
- Ne pas vendre une autonomie totale immédiate.
- Ne pas réduire Aiva-vision à la maquette Easily.
- Ne pas présenter Aiva-urgence comme tout le produit.
- Ne pas proposer l'ancien `Urgence_aiva_demo` comme scénario tel quel.
- Ne pas recommander une action risquée pour "faire passer la démo".
- Ne pas inventer des capacités absentes du code.
## Première tâche attendue
Après lecture des documents prioritaires, produis un fichier :
`docs/coordination/inbox_codex/YYYY-MM-DD_HHMM_qwen-to-codex_REPRISE-analyse-scenario-v2.md`
Contenu demandé :
1. ACK/NACK du cadrage produit.
2. Résumé du scénario v2 en 8 lignes maximum.
3. 5 risques NOGO maximum.
4. 5 critères de réussite client maximum.
5. Les 3 points techniques à vérifier avant capture.
6. Une seule recommandation prioritaire pour rendre Léa "super solide et agile" sur cette démo.
Ne propose pas encore de patch.
Auteur : Codex