Files
rpa_vision_v3/docs/POC/AUDIT_CHAINE_APPRENTISSAGE_2026-06-01.md

19 KiB

Audit chaîne apprentissage modèle IA — 2026-06-01

DRAFT audit factuel — lecture seule, pas encore appliqué.

Date : 2026-06-01 22:00 Europe/Paris Auteurs : agent Explore Claude (audit primaire) + Claude (synthèse + matérialisation fichier) Statut : DRAFT — relecture Dom/Codex/Qwen attendue Origine demande : Dom 2026-06-01 ~21:40 — « tu pourrais lancer un agent explorateur pour nous remonter la chaîne exact d'apprentissage du modèle d'IA sur lequel j'ai travaillé. Le code existe, mais je pense qu'il a été débranché... »

TL;DR — Constat fort

L'intuition de Dom était JUSTE. La chaîne d'apprentissage est partiellement débranchée depuis plusieurs semaines/mois. Les composants nécessaires pour implémenter ce que Dom a explicité dans ses 5 messages du 2026-06-01 20:46-21:27 (auto-évaluation par répétition, fusion/regroupement compétences immuables, versioning adaptateurs UI, portabilité du modèle appris) existent déjà dans le repo :

  • core/learning/continuous_learner.py644 lignes
  • core/learning/feedback_processor.py176 lignes
  • PrototypeVersionManager (support de ContinuousLearner)
  • TargetMemoryStore, VersionedStore (supports)

Et ils sont tous orphelins : ils ne sont pas importés par les points d'entrée actifs (api_stream.py, run_worker.py, agent_chat/app.py, web_dashboard/app.py, etc.).

En plus : le worker VLM (le composant qui retraite les sessions finalisées avec ScreenAnalyzer/CLIP/FAISS/GraphBuilder) n'a traité aucune session depuis 5 jours (queue vide). Sessions accumulées non passées par le pipeline d'enrichissement profond.

Section meta — Constat de méthode (à dire franchement)

Dom 2026-06-01 ~21:55 : « on vient de passer presque 7 jours à refaire ce que j'avais déjà fait. Il faut arrêter de réinventer la roue. »

C'est un constat factuel et juste. Cet audit (le seul à avoir cartographié l'existant) aurait dû être fait avant :

  • de spécifier P1-SEMANTIQUE comme une nouvelle Phase 2.5 ;
  • de proposer un LoopDetector proactif comme « bonus » alors que ContinuousLearner couvre ce besoin ;
  • de discuter de « désapprentissage » (notion que Dom a explicitement rejetée 21:27) alors que PrototypeVersionManager gère déjà le versioning des prototypes ;
  • de proposer de nouveaux mécanismes de fusion de compétences alors que FeedbackProcessor est conçu pour ça.

Pourquoi cet oubli ? Trois facteurs cumulés :

  1. docs/POC/ (5 docs Dom déposés du 28-29/05 et 01/06) a été lue après rédaction du plan POC Claude du jour (mémorisé comme erreur de méthode dans feedback_lire_docs_poc_avant_depot.md).
  2. Aucun agent n'a été missionné en début de journée pour cartographier l'existant dans core/learning/, core/healing/, core/cognition/. Mon audit Explore de 17:00 a flagué ContinuousLearner et RecoveryLogger comme orphelins mais sans alarmer sur le fait que ces orphelins étaient précisément ce qui était demandé.
  3. Codex a été en mode urgence patch (P0 régression, dashboard test, etc.) et Claude en mode livraison agressive (5 livraisons P1 dans la journée) sans pause cartographie.

Décision opérationnelle à acter : avant tout nouveau module Léa learning, lancer un agent Explore qui vérifie ce qui existe dans core/learning/, core/cognition/, core/healing/, core/training/. Ne pas spec/coder un module avant d'avoir confirmé qu'il n'a pas déjà été codé et débranché par Dom dans une session antérieure.

§1 — Schéma de la chaîne attendue

[Phase 1 — Capture]
  PC Windows agent_v1 → push frames + actions + events
  ↓
  data/training/live_sessions/<machine>/<session>/
     ├ shots/*.png
     ├ actions.jsonl
     └ events.jsonl
  ↓
  finalize() côté api_stream.py
  ↓
  enqueue → data/training/_worker_queue.txt        ← ⚠️ EXISTE, vide depuis 5 jours

[Phase 2 — Enrichissement post-session (worker VLM)]
  run_worker.py poll _worker_queue.txt (10s interval)
  ↓
  StreamProcessor.reprocess_session()
     ├ ScreenAnalyzer (VLM lecture sémantique)
     ├ CLIPEmbedder (embeddings UI)
     ├ FAISS index update
     ├ _enrich_actions_with_intentions (Ollama gemma4 → intention/avant/après)
     └ GraphBuilder (transitions états)
  ↓
  data/training/.../enriched_*.jsonl + index.faiss

[Phase 3 — Construction WorkflowIR]
  build_replay_from_raw_events() → WorkflowIR
  ↓
  data/workflows/<session_id>.json  OU  data/competences/candidate/<slug>.yaml
     selon le chemin (legacy workflow vs nouveau cycle Léa-first 01/06)

[Phase 4 — Apprentissage continu (CŒUR DU DÉBAT)]
  ┌──────────────────────────────────────────────────────┐
  │ ContinuousLearner (644 lignes, ORPHELIN)            │
  │  ├ EMA online sur prototypes                         │
  │  ├ Détection dérive UI (variance temporelle)         │
  │  ├ Variantes de prototypes (clustering)              │
  │  ├ TargetMemoryStore : mémoire des éléments cibles   │
  │  └ PrototypeVersionManager : versioning rollback     │
  │                                                       │
  │ FeedbackProcessor (176 lignes, ORPHELIN)             │
  │  ├ Boucle feedback humain → ajustement prototype    │
  │  └ Fusion observations multiples → compétence       │
  └──────────────────────────────────────────────────────┘
        ↑
        |  Doit être déclenché par : nouvelle session retraitée
        |  Doit produire : score confiance, variantes, dérive
        ↓
  data/learning/prototypes_<state>.json (présent ? à vérifier disque)
  data/learning/feedback_log.jsonl (présent ? à vérifier disque)

[Phase 5 — Boucle retour healing]
  ┌──────────────────────────────────────────────────────┐
  │ RecoveryLogger (ORPHELIN runtime hors VWB)          │
  │ SelfHealingIntegration (VWB seulement)              │
  └──────────────────────────────────────────────────────┘

[Phase 6 — Utilisation au replay (HOT PATH)]
  resolve_engine.py :
     cascade OCR → template matching → VLM grounding
     (PAS de consultation des prototypes ContinuousLearner)  ← rupture
     (PAS de consultation FAISS index appris)               ← rupture

  Si compétence avec .semantic.yaml (Phase 2.5 nouveau 01/06) :
     Phase25Analyzer.match_screen() → annotations sémantiques

[Phase 7 — Fine-tuning VLM (HORS rpa_vision_v3)]
  ~/ai/t2a-finetune/, ~/ai/t2a/, ~/ai/t2a_v2/
  Modèle custom Dom : qwen2.5vl:7b-rpa
  Dataset alimenté manuellement (probablement) ← non-vérifié

§2 — État par phase

Phase Code existe Wired runtime Dernière utilisation effective Verdict
1. Capture live aujourd'hui (sessions live actives) OK
1bis. Enqueue worker (finalize() api_stream.py:2253+) ⚠️ à diagnostiquer Probablement débranché — queue vide 5j alors que sessions live continuent ⚠️ R6 critique
2. Worker VLM post-session (run_worker.py) (réveillé aujourd'hui 18:54 PID 4054092) 0 session traitée depuis 5 jours ⚠️ tourne à vide
2bis. Enrichissement actions (stream_processor.py:1643) (au build) continu, mais perd valeur sans ContinuousLearner OK partiel
3. Construction WorkflowIR (au moment du build) aujourd'hui (P1-LEA-SHADOW livré) OK nouveau cycle
4. ContinuousLearner 644 lignes ORPHELIN Jamais appelé en runtime 🔴 DÉBRANCHÉ
4bis. FeedbackProcessor 176 lignes ORPHELIN Jamais appelé 🔴 DÉBRANCHÉ
4ter. PrototypeVersionManager ORPHELIN (dép ContinuousLearner) Jamais 🔴 DÉBRANCHÉ
5. RecoveryLogger ORPHELIN hors VWB VWB seulement 🔴 DÉBRANCHÉ runtime agent_v1
6. Replay hot path actif OK fonctionnel mais déconnecté de Phase 4
6bis. Phase 2.5 sémantique (livré 20:15) (endpoint dispo) aujourd'hui OK nouveau
7. Fine-tuning VLM hors repo (siblings) n/a (asynchrone manuel) inconnu hors scope audit interne

§3 — Ruptures identifiées

ID Rupture Sévérité Détail Conséquence POC
R1 ContinuousLearner orphelin 🟡 MOYENNE EMA online, dérive UI, variantes prototypes : tous existent mais non câblés. Couvre exactement le besoin "auto-évaluation par répétition" exprimé par Dom 2026-06-01 20:46. Pas d'apprentissage incrémental cross-session. Léa ne s'améliore pas avec l'usage.
R2 PrototypeVersionManager orphelin 🟡 MOYENNE Dépend de R1. Versioning prototypes + rollback. Couvre "versioning des adaptateurs UI" demandé par Dom 21:27. Pas de rollback prototype dégradé. Pas de gestion versions UI.
R3 FeedbackProcessor orphelin 🟠 LOURDE Boucle feedback humain → ajustement prototype. Cœur de la fusion/regroupement vers compétence immuable demandée par Dom 21:27. Léa Phase 4 humaine (corrections) ne nourrit pas le modèle. Apprentissage repart de zéro à chaque session.
R4 RecoveryLogger orphelin runtime 🟢 FAIBLE Healing limité à VWB. Pas de retour boucle sur sessions agent_v1 ratées. Workflows en échec récurrent ne génèrent pas d'insights actionnables.
R5 Phase 2.5 sémantique (livrée aujourd'hui) → utilisation au replay incertaine 🟢 FAIBLE .semantic.yaml produit mais utilisé seulement si Phase25Analyzer.match_screen() est consultée. Wiring à confirmer. Annotations sémantiques apprises peut-être pas exploitées au replay.
R6 Worker queue vide depuis 5 jours malgré sessions live actives 🔴 CRITIQUE Le worker tourne (PID 4054092 actif) mais data/training/_worker_queue.txt est vide. Soit finalize() n'enqueue plus, soit toutes les sessions échouent silencieusement à se finaliser, soit la queue est purgée ailleurs. À diagnostiquer URGENT. 0 enrichissement profond depuis 5 jours. Toutes les sessions live actuelles sont stockées brutes sans ScreenAnalyzer/CLIP/FAISS/GraphBuilder. POC Wallerstein impossible en l'état.

§4 — Modules orphelins inventaire

O1 — core/learning/continuous_learner.py (644 lignes)

  • Rôle : adaptation incrémentale des prototypes UI par EMA online, détection de dérive temporelle, génération de variantes par clustering
  • Importé par : 0 point d'entrée actif (vérifié par grep)
  • Dernière modification git : à confirmer
  • Pourquoi débranché : inconnu — pas de commit disable ou remove visible. Probablement n'a jamais été câblé en runtime depuis sa création (intention de wiring jamais finalisée).
  • Effort rebranchement : MOYEN (2-3 j-h). Nécessite :
    • Hook dans run_worker.py après reprocess_session() pour appeler learner.update(prototypes, new_observations)
    • Chargement initial des prototypes au démarrage worker
    • Persistance prototypes mis à jour : data/learning/prototypes_<state>.json
    • Tests intégration : sessions répétées sur même UI → vérification EMA progresse

O2 — core/learning/feedback_processor.py (176 lignes)

  • Rôle : intègre les feedbacks humains (validate/correct/undo Phase 4 Léa-first) dans le modèle prototype
  • Importé par : 0 point d'entrée actif
  • Effort rebranchement : LOURD (3-5 j-h). Nécessite :
    • Hook dans agent_chat/handlers/learn_action.py (livré aujourd'hui) à chaque POST /shadow/feedback
    • Routage : feedback → FeedbackProcessor → ContinuousLearner
    • Persistance log : data/learning/feedback_log.jsonl
    • Tests : validation step → prototype renforcé ; correction → prototype variante créée

O3 — PrototypeVersionManager

  • Rôle : versionner les prototypes successifs, permettre rollback si nouvelle version dégrade
  • Dépendance : ContinuousLearner (utilise pour stocker versions)
  • Effort rebranchement : FAIBLE (1 j-h) une fois O1 rebranché
  • Couvre la décision Dom 21:27 : « Ce qu'il faut versionner/invalider, ce sont plutôt mappings UI propres à une application/version, sélecteurs/positions/labels OCR, hypothèses fragiles ou obsolètes, compétence mal validée »

O4 — TargetMemoryStore, VersionedStore

  • Rôle : supports de persistance pour les prototypes versionnés
  • Effort : couvert par O1+O3

O5 — RecoveryLogger / SelfHealingIntegration

  • Statut : utilisé par VWB seulement, pas par agent_v1 runtime
  • Effort rebranchement runtime agent_v1 : MOYEN (2 j-h)
  • Priorité : P2 (post-MVP), pas critique POC

§5 — Worker queue R6 — diagnostic urgent

Constat : worker actif PID 4054092 depuis 18:54, log indique poll toutes les 10s sur _worker_queue.txt. Mais 0 traitement depuis le réveil.

Hypothèses à vérifier (par ordre de probabilité) :

  1. finalize() côté api_stream.py:2253+ n'enqueue plus (commit qui a cassé le pipeline)
  2. Les sessions live actuelles ne sont jamais finalisées (problème côté agent_v1 Windows qui ne push pas la fin de session)
  3. La queue est purgée par un autre processus (cron ? cleanup ?)
  4. Path resolution : worker poll un fichier inexistant ou un chemin différent de celui où finalize() écrit

Action recommandée : lancer un agent Explore ciblé sur :

  • git log -p agent_v0/server_v1/api_stream.py | grep -A 20 "finalize\|_worker_queue" pour voir les commits récents touchant à la queue
  • Tester manuellement : finaliser une session test, vérifier que le fichier _worker_queue.txt est touché, vérifier que le worker la dépile
  • Identifier où la rupture est exacte

§6 — Effort global de rebranchement

Composant Effort Priorité POC Wallerstein
R6 — Diagnostic worker queue Faible (1-2 j-h) 🔴 P0 ABSOLU (sinon POC impossible)
O1+O3+O4 — ContinuousLearner + Versioning Moyen (2-3 j-h) 🟠 P1 (apprentissage incrémental)
O2 — FeedbackProcessor Lourd (3-5 j-h) 🟠 P1 (fusion compétences)
O5 — RecoveryLogger runtime Moyen (2 j-h) 🟢 P2 (post-MVP)
Total rebranchement (P0+P1) 6-10 j-h À comparer aux ~15 j-h de spécifications/impl P1 d'aujourd'hui qui les reconstruisaient partiellement de zéro

§7 — Conséquences POC Wallerstein

En l'état actuel (rien rebranché)

  • Aucune session traitée par le pipeline d'enrichissement profond depuis 5 jours (worker tourne à vide). Cumulé des sessions live brutes accumulées : ScreenAnalyzer, CLIP, FAISS, GraphBuilder pas appliqués.
  • Pas d'apprentissage incrémental : chaque démo Léa = repart de zéro. Pas d'auto-évaluation par répétition (alors que Dom le demande explicitement 20:46).
  • Pas de versioning prototypes : si Easily/DPI change d'interface, pas de mécanisme de rollback. (Alors que Dom le demande 21:27.)
  • Pas de portabilité du modèle appris : pas de paquet portable de réflexes/compétences/schémas/détecteurs/mappings, car ce paquet est produit par la chaîne d'apprentissage qui est débranchée. (Alors que Dom dit « point essentiel » 21:27.)
  • Restitution Option C livrée aujourd'hui (P1-LEA-SHADOW) mais trop longue pour sessions 1-2h (recadrage Dom 20:46)
  • Phase 2.5 sémantique livrée mais ne produit pas encore les signaux de confiance/regroupement demandés (recadrage Dom 20:46)

Avec rebranchement P0+P1 (6-10 j-h)

  • Worker pipeline actif → toutes les sessions live enrichies (ScreenAnalyzer/CLIP/FAISS/GraphBuilder)
  • ContinuousLearner alimenté → apprentissage par répétition automatique
  • FeedbackProcessor branché → fusion progressive vers compétences immuables
  • PrototypeVersionManager actif → versioning mappings UI, rollback si dégradation
  • ⚠️ Reste à ajouter : enrichir P1-LEA-SHADOW et P1-SEMANTIQUE avec champs confidence, uncertainties[], repetition_count, distinctions hypothesis/candidate/validated (≈2-3 j-h additionnels)
  • ⚠️ Reste à concevoir : paquet portable séparé de la mémoire patient (décision Dom 21:27 — pas encore couvert par aucune impl, ni avant aujourd'hui ni dans mes livraisons P1) (≈3-5 j-h)

§8 — Plan d'action recommandé

Étape A — IMMÉDIAT (avant tout nouveau dev)

  1. Diagnostic R6 worker queue (1-2 j-h) : pourquoi vide depuis 5 jours malgré sessions live actives
  2. Audit factuel modules orphelins : confirmer le bon état du code de ContinuousLearner, FeedbackProcessor, PrototypeVersionManager (pas de bug bloquant, signatures à jour vis-à-vis du reste du codebase)
  3. Lecture par Dom des modules orphelins pour confirmer qu'ils correspondent bien à son intention historique

Étape B — REBRANCHEMENT (P0+P1)

  1. Rebrancher worker queue (R6) — code probablement minimal, action chirurgicale
  2. Rebrancher ContinuousLearner + supports (O1+O3+O4) avec tests intégration
  3. Rebrancher FeedbackProcessor (O2) + hook dans agent_chat/handlers/learn_action.py (livré aujourd'hui) à chaque POST /shadow/feedback

Étape C — AJUSTEMENTS LIVRAISONS P1

  1. Ajouter confidence, uncertainties[], repetition_count, hypothesis/candidate/validated aux SessionState + payload persist
  2. Phase 2.5 sémantique : enrichir pour produire signaux confiance + regroupement (actions stables vs parasites, invariants vs variables, blocs récurrents)
  3. Option C restitution : raccourcir à « centré incertitudes uniquement », jamais relecture complète

Étape D — PORTABILITÉ (objectif Dom essentiel)

  1. Concevoir paquet portable : export réflexes/compétences/schémas/détecteurs/mappings/plans d'action/métriques, sans mémoire patient ni captures brutes
  2. Mécanisme d'import sur poste tiers
  3. Validation : aucune trace patient dans le paquet exporté

§9 — Sources de l'audit

  • Agent Explore Claude — 2026-06-01 21:50 (audit primaire)
  • Audit Claude antérieur 17:00 (feedback_lea_principes_techniques.md) qui avait flagué ContinuousLearner et RecoveryLogger comme orphelins (mais sans alarme suffisante)
  • Audit Explore worker VLM 17:30 (Claude) qui avait confirmé que worker traite sessions finalisées
  • 5 messages Codex 2026-06-01 20:46-21:37 relayant 5 décisions/clarifications Dom
  • Code source core/learning/, core/healing/, agent_v0/server_v1/, agent_chat/

Fin DRAFT — relecture Dom/Codex/Qwen attendue avant action.

Décision opérationnelle proposée à Dom : suspendre tout nouveau dev de modules d'apprentissage Léa tant que (a) R6 worker queue n'est pas diagnostiqué + corrigé et (b) Dom n'a pas confirmé que les modules orphelins identifiés correspondent à son intention historique.