fix(replay): bug TypeError log + flag pré-check OCR off par défaut (démo GHT)
Some checks failed
tests / Lint (ruff + black) (push) Successful in 14s
tests / Tests unitaires (sans GPU) (push) Failing after 13s
tests / Tests sécurité (critique) (push) Has been skipped

Diagnostic post-bench E2E (rapport docs/E2E_TEST_RUN_2026-05-08.md) :

1. BUG SILENCIEUX MAJEUR (api_stream.py:4549) — quand le pré-check OCR
   rejette, mon code de rejet hier soir met x_pct=None / y_pct=None.
   Le log structuré faisait result.get('x_pct', 0):.4f → None:.4f →
   TypeError → réponse "analysis_error" qui MASQUE le vrai motif
   "rejected_text_mismatch". Conséquence : pendant toute la session
   du 7 mai soir, les rejets pré-check ont été silencieusement
   transformés en erreurs analyse → cascade locale Léa V1 → clic au pif.
   Fix : `(result.get('x_pct') or 0):.4f` traite None | None | 0
   uniformément.

2. FLAG ENV pré-check OFF par défaut — le pré-check
   _validate_text_at_position introduit hier soir a 2 défauts
   identifiés par le bench E2E sur 8 click_anchor :
   * radius_px=200 trop petit pour les tabs à 2 tokens (Examens
     cliniques, Synthèse Urgences) — OCR voit un crop tronqué
     "Maquette POC ler en cours Codage Statistiques" qui n'inclut
     pas "Examens" → fuzzy match 1/2 = 50% < seuil 0.60 → REJET.
     À radius 300/400 le mot est inclus → match passe.
   * min_token_ratio=0.60 trop strict pour cibles 2 tokens.

   Solution démo : flag env RPA_ENABLE_TEXT_PRECHECK (défaut "false").
   Le pré-check est désactivé par défaut → retour au comportement
   stable d'avant-hier (hybrid_text_direct ≥ 0.80 utilisé direct,
   exemption drift préservée). Code et fonction _validate_text_at_position
   conservés en place pour reprise post-démo après calibrage radius
   adaptatif (≈ 0.17 × min(screen_w, screen_h)) et token_ratio descendu
   à 0.50.

   Pour ré-activer en dev/test : `RPA_ENABLE_TEXT_PRECHECK=true`
   dans .env.local ou env du service rpa-streaming.

Inclus aussi :
- docs/E2E_TEST_RUN_2026-05-08.md (rapport agent test E2E ~1700 mots)
- tests/e2e/urgence_aiva_demo_expected.yaml (tolérances re-écrites)
- tests/e2e/fixtures/urgence_aiva_demo/live/*.png (8 fixtures
  recapturées headless 1920x1080 pour itérer demain)
- _ocr_inventory.json + _run_resolve_results.json (raw runs)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-05-08 10:09:23 +02:00
parent f8dc3c3af4
commit 56e869c467
13 changed files with 970 additions and 82 deletions

View File

@@ -1,81 +1,138 @@
workflow_session_id: test_e2e_sess_20260507T220822_c91f30
screenshot: /home/dom/ai/rpa_vision_v3/data/training/live_sessions/bg_DESKTOP-58D5CAC_windows/shots/heartbeat_1773792436.png
# Attendus E2E pour wf_a38aeebea5e6_1778162737 (Urgence_aiva_demo).
#
# Mis à jour 2026-05-08 sur fixtures Easily Assure capturées en live
# (`tests/e2e/fixtures/urgence_aiva_demo/live/*.png`, headless Chrome
# 1920x1080) — donc representatives du screen tel que vu par Léa.
#
# Tolérance : la résolution de coordonnées varie de quelques pixels d'un
# run à l'autre (anti-aliasing OCR, EasyOCR non déterministe). On se
# limite donc à valider :
# - status (OK / FAIL)
# - method (préfixe)
# - score ≥ seuil
# - position dans une bbox attendue (en pourcentages, large)
#
# Steps NON couverts ici :
# - 1, 4-7, 9, 11, 13, 15-16, 19, 21 (extract_text, keyboard_shortcut,
# type_text, t2a_decision, pause_for_human → exécutés serveur ou
# simulés client, pas de dépendance à la cascade visuelle).
#
# Couverts (click_anchor) :
# 3, 8, 10, 12, 14, 17, 18, 20.
#
# Steps 18 (Coller textarea DPI) et 20 (Justification) attendus en
# pause_supervisée si l'écran courant est la maquette urgences (et non
# aiva-vision) — cf. §"Limitations fixtures" du rapport.
workflow_id: wf_a38aeebea5e6_1778162737
fixtures_dir: tests/e2e/fixtures/urgence_aiva_demo/live
generated_at: '2026-05-08'
screen_size_default: [1920, 1080]
steps:
- order: 1
action_id: wait_before_start
action_type: wait
by_text: ''
method: simulated
score: 0.0
x_pct: null
y_pct: null
status: OK
diag: wait simulé
elapsed_ms: 1.013040542602539
- order: 2
action_id: replay_free_74c2d90b
action_type: pause:user_request
by_text: ''
method: ''
score: 0.0
x_pct: null
y_pct: null
status: PAUSED
diag: 'Léa : j''ai trouvé ces dossiers : []. Pour la démo je vais traiter MOREL
Catherin'
elapsed_ms: 0.0
- order: 3
action_id: step_288d0bceea90_1778162737752
action_type: click
by_text: '25003284'
method: fallback
score: 0.0
x_pct: 0.5
y_pct: 0.5
status: FAIL
diag: template_matching_failed
elapsed_ms: 1064.7194385528564
- order: 4
action_id: step_288d0bceea90_1778162737752_retry1
action_type: click
by_text: '25003284'
method: fallback
score: 0.0
x_pct: 0.5
y_pct: 0.5
status: FAIL
diag: template_matching_failed
elapsed_ms: 1075.0248432159424
- order: 5
action_id: wait_retry_381c1b
action_type: wait
by_text: ''
method: simulated
score: 0.0
x_pct: null
y_pct: null
status: OK
diag: wait simulé
elapsed_ms: 12.79759407043457
- order: 6
action_id: step_288d0bceea90_1778162737752_retry2
action_type: click
by_text: '25003284'
method: fallback
score: 0.0
x_pct: 0.5
y_pct: 0.5
status: FAIL
diag: template_matching_failed
elapsed_ms: 1037.236213684082
- order: 7
action_id: step_288d0bceea90_1778162737752_retry3
action_type: click
by_text: '25003284'
method: fallback
score: 0.0
x_pct: 0.5
y_pct: 0.5
status: FAIL
diag: template_matching_failed
elapsed_ms: 1051.6366958618164
- order: 3
action_type: click_anchor
by_text: '25003284'
fixture: live/landing.png
expected:
resolved: true
method_prefix: hybrid_text_direct
score_min: 0.80
x_pct_range: [0.01, 0.10] # IPP en début de ligne, colonne gauche
y_pct_range: [0.18, 0.30] # 1ère ligne tableau patients
max_elapsed_ms: 5000
- order: 8
action_type: click_anchor
by_text: 'Examens cliniques'
fixture: live/dossier_motif.png
expected:
resolved: true
method_prefix: hybrid_text_direct
score_min: 0.80
x_pct_range: [0.18, 0.30] # tab gauche-centre
y_pct_range: [0.10, 0.16] # bandeau onglets
max_elapsed_ms: 5000
notes: |
Régression confirmée 2026-05-08 sur cette cible : pre-check OCR
(radius 200) ne capte pas le mot "Examens" (tronqué) et fait crash
le log RESOLVE_EXIT (NoneType format). Voir rapport
docs/E2E_TEST_RUN_2026-05-08.md, correctif #1 et #2.
- order: 10
action_type: click_anchor
by_text: 'Imagerie'
fixture: live/dossier_examens-cliniques.png
expected:
resolved: true
method_prefix: hybrid_text_direct
score_min: 0.80
x_pct_range: [0.20, 0.32]
y_pct_range: [0.10, 0.16]
max_elapsed_ms: 5000
- order: 12
action_type: click_anchor
by_text: 'Notes médicales'
fixture: live/dossier_imagerie.png
expected:
resolved: true
method_prefix: hybrid_text_direct
score_min: 0.80
x_pct_range: [0.20, 0.32]
y_pct_range: [0.10, 0.16]
max_elapsed_ms: 5000
- order: 14
action_type: click_anchor
by_text: 'Synthèse Urgences'
fixture: live/dossier_notes-medicales.png
expected:
resolved: true
method_prefix: hybrid_text_direct
score_min: 0.80
x_pct_range: [0.22, 0.36]
y_pct_range: [0.10, 0.16]
max_elapsed_ms: 5000
notes: |
Régression confirmée — même cause que step 8 : pre-check radius 200
voit 0/2 tokens. Correctif #1 résout.
- order: 17
action_type: click_anchor
by_text: 'Codage'
fixture: live/dossier_synthese-urgences.png
expected:
resolved: true
method_prefix: hybrid_text_direct
score_min: 0.80
x_pct_range: [0.10, 0.20]
y_pct_range: [0.04, 0.08] # bouton barre de menu (top)
max_elapsed_ms: 5000
- order: 18
action_type: click_anchor
by_text: 'Coller ou saisir le dossier patient'
# Cette cible est sur la page aiva-vision (https://aiva-vision.test/...)
# PAS sur la maquette urgences. À documenter avec une fixture dédiée
# ou exécuter en démo réelle.
fixture: live/dossier_codage.png # placeholder — devrait être aiva-vision
expected:
resolved: false # avec le placeholder
reason: vlm_and_template_all_failed
method_prefix: strict_vlm_template_failed
notes: |
Fixture non représentative — l'agent doit naviguer vers
aiva-vision (étape 17 ouvre Codage onglet, qui redirige vers
la page aiva). À recapturer sur le replay réel.
- order: 20
action_type: click_anchor
by_text: 'Justification de la décision'
fixture: live/dossier_codage.png # idem step 18
expected:
resolved: false
reason: vlm_and_template_all_failed
method_prefix: strict_vlm_template_failed
notes: |
Idem step 18 — page aiva-vision non capturée dans cette suite.