# 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