8.7 KiB
SPECS Phase 2.5 Sémantique — POC RPA Vision v3
DRAFT specs pour implémentation — pas encore appliqué — alignement avec arbitrage Plato 2026-06-01 18:18
Date : 2026-06-01
Auteur : Claude (agent Plan), arbitrage Plato/Codex
Statut : DRAFT — à valider par Dom avant implémentation
Référence arbitrage : docs/coordination/inbox_claude/2026-06-01_1818_codex-to-claude_ADDENDUM-agent-plato-archi-semantique.md
Référence addendum initial Claude : 17:45 (OmniParser systématique dans hot path replay) — révoqué par Plato
Principes d'arbitrage retenus
- Garder replay/click/OCR existant comme chemin principal (hot path inchangé)
- Phase 2.5 = post-apprentissage uniquement, jamais en hot path replay
- Demander à l'humain seulement les ambiguïtés utiles
- Sémantique = contexte, pas prérequis de chaque clic
ExternalDecisionClientautour det2a_decision, puis adaptation AIVA- OCR critique renforcé par régions annotées + escalade humaine
Sommaire
- Périmètre Phase 2.5 MVP
- Endpoint à créer
- Identification des écrans distincts
- Stockage des annotations sémantiques
- Réutilisation au replay (autopilote / autonome)
- Compatibilité compétences existantes
- Garde-fous anti-fragilité OmniParser
- Coûts perf attendus
- Tests à prévoir
- Estimation effort implémentation
- Hors scope MVP Phase 2.5
1. Périmètre Phase 2.5 MVP
- Quand : déclenchement à la fin de la phase d'observation, après
POST /api/v1/shadow/stop, avant restitution Option C à l'humain. - Sur quoi : screenshots clés capturés (1 par écran distinct détecté), pas tous les frames.
- Avec quoi : OmniParser réutilisé (déjà présent, adaptateur fragile mais isolé), encapsulé derrière garde-fou anti-fragilité §7.
- Pour quoi : produire un payload structuré
{tables[], forms[], buttons[], text_blocks[]}par écran clé, stocké dans un YAML sémantique séparé du YAML compétence principal. - Non-objectif : Phase 2.5 ne touche pas le chemin replay. Elle enrichit uniquement la compétence apprise.
2. Endpoint à créer
POST /api/v1/lea/screen/analyze côté streaming server (port 5005).
- Entrée :
{session_id: str, screenshot_indexes: int[]}— index des frames capturées en mode léger pendant l'observation. - Sortie :
{screens: [{index, hash, structure: {tables, forms, buttons, text_blocks}}]}. - Idempotence : cache disque sous
data/cache/omniparser/<session>/<index>.json. - Timeout : 30s par screenshot. Dépassement → fallback OCR-seul (docTR text_blocks seuls), flag
degraded: true. - Erreur OmniParser (exception, modèle KO) : fallback OCR-seul + log
logs/omniparser_errors.log. L'endpoint ne renvoie jamais 500 — toujours 200 avec flag dégradé.
3. Identification des écrans distincts
Heuristique de regroupement, exécutée avant l'appel /api/v1/lea/screen/analyze :
- Calcul
imagehash.phashpour chaque frame capturée. - Grouping par similarité : Hamming distance ≤ 8 ⇒ même écran logique.
- Sélection d'un frame représentatif par groupe (premier dans l'ordre temporel, ou celui avec le plus de détections OCR).
- Limite POC : maximum 10 écrans distincts par session. Au-delà, session marquée
too_complexet l'humain est invité à scinder la compétence en sous-compétences (message explicite dans restitution Option C).
4. Stockage des annotations sémantiques
Fichier séparé du YAML compétence principal, suffixe .semantic.yaml.
Chemin : data/competences/candidate/<slug>.semantic.yaml
Structure :
competence_id: facturation_urgence_simple
semantic_version: 1
generated_at: 2026-06-01T18:30:00Z
omniparser_version: <hash adaptateur>
degraded: false
screens:
- screen_id: screen_001
phash: "abc123..."
representative_frame_index: 42
annotations:
- region_id: region_3
bbox: [120, 80, 400, 150]
semantic_label: motif_arrivee
confidence: human_verified
structure:
tables: [...]
forms: [...]
buttons: [...]
text_blocks: [...]
- Séparation stricte : YAML compétence principal reste lisible et minimal.
.semantic.yamlest optionnel. - YAML compétence référence le fichier sémantique par clé
semantic_ref: <slug>.semantic.yamlsi présent.
5. Réutilisation au replay (autopilote / autonome)
OmniParser au replay uniquement si la compétence référence un .semantic.yaml (présence de semantic_ref).
Algorithme :
- Au démarrage du replay d'un écran, calcul
phashdu screen courant. - Si Hamming distance ≤ 8 avec un
screen_idconnu OU même nombre de tables/buttons/forms structurellement → match, application des annotations. - Sinon → divergence :
- Autopilote : escalade humaine via Option C runtime (« écran inattendu, valider ou annoter »).
- Autonome : log incident
logs/replay_incidents.log, stop avec codesemantic_mismatch.
Compétences sans semantic_ref → on saute totalement cette étape (rétrocompat §6).
6. Compatibilité compétences existantes
- Compétences sans
.semantic.yaml⇒ pas de Phase 2.5 au replay, pas d'OmniParser, chemin OCR + template + click inchangé. - Phase 2.5 = opt-in par compétence : seule une compétence apprise après l'activation de Phase 2.5 possédera le fichier sémantique.
- Aucune migration auto des compétences anciennes. Rétrocompat garantie par l'absence de
semantic_ref. - Pas de breaking change sur le format YAML compétence principal — seulement une clé optionnelle.
7. Garde-fous anti-fragilité OmniParser
Adaptateur OmniParser fragile (chemin absolu, dépendances lourdes). Mesures :
- Wrapper try/except global autour de chaque appel OmniParser, fallback OCR-seul (docTR) systématique en cas d'exception.
- Log dédié : toute erreur →
logs/omniparser_errors.logavec stack trace, session_id, frame_index. - Healthcheck au démarrage Phase 2.5 : appel test sur image bidon. Si échec → bascule auto en mode dégradé OCR-seul, log warning, restitution
degraded: true. - Test unitaire obligatoire : mock OmniParser qui lève exception, vérifier que la chaîne aboutit à un
.semantic.yamldégradé valide. - Isolation chemin absolu : config OmniParser (chemin modèle, version) centralisée dans
config/omniparser.yaml, jamais en dur.
8. Coûts perf attendus
- Dev (RTX 5070, OmniParser CPU) : 2 à 5s par screen. Acceptable (principe 5 Dom, hors hot path).
- DGX Spark (cible prod) : < 500ms par screen.
- Coût session typique : 10 screens × 2-5s = 20-50s ajoutés à la fin d'une session d'apprentissage sur dev. Tolérable, asynchrone vis-à-vis humain (restitution Option C peut afficher spinner).
- Pas d'impact sur replay (hot path) tant que pas de
semantic_ref. Avecsemantic_ref, surcoût =phash(négligeable) + OmniParser uniquement en cas de mismatch structure.
9. Tests à prévoir
Unitaires :
- Hash perceptuel + grouping : frames similaires/différentes, vérif Hamming threshold.
- Fallback OCR-seul si OmniParser KO (mock exception, timeout, healthcheck KO).
- Génération
.semantic.yaml: structure valide,degradedcorrectement positionné. - Cap 10 écrans : session avec 15 → marquage
too_complexpropre.
Intégration :
- Flux complet : session shadow → stop → identification écrans → analyse →
.semantic.yamlécrit → Option C. - Replay compétence avec
.semantic.yaml: match nominal, mismatch déclenche escalade autopilote / stop autonome. - Replay compétence sans
.semantic.yaml: chemin legacy intact, aucun appel OmniParser.
Sécurité :
- Injection chemins relatifs/absolus dans
session_idouslugrefusée (regex strict^[a-z0-9_]+$). - Pas d'écriture hors
data/competences/candidate/etdata/cache/omniparser/.
10. Estimation effort implémentation
- ~200-300 lignes Python (endpoint, grouping phash, wrapper OmniParser, écriture YAML, lecture replay).
- ~150 lignes tests.
- Effort moyen, étalable sur 1-2 jours.
- Risque régression faible : ne touche pas hot path replay, opt-in par compétence, rétrocompat totale.
11. Hors scope MVP Phase 2.5
- Détection visuelle de changements d'écran en temps réel pendant le replay (= hot path, révoqué par Plato).
- Annotations sémantiques automatiques par VLM (prérequis trop ambitieux POC).
- Versioning sémantique multi-versions Easily (post-POC).
- Recalcul auto annotations si interface change (post-POC, lié mode rééducation).
- Annotations multi-langues (POC français uniquement).
- Synchronisation
.semantic.yamlentre agents distribués (post-POC).
Fin DRAFT — à valider par Dom avant implémentation. Aucune modification de fichier de prod. Aucun commit.