# 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.