chore: instrumentation [REPLAY] pour diagnostic chaîne replay

Ajoute 6 points de log structurés homogénéisés avec le préfixe [REPLAY]
aux endroits clés de la chaîne de replay, pour permettre de suivre
précisément ce qui se passe pendant un test humain et diagnostiquer
les points de rupture sans déduire à l'aveugle.

Points de log :
1. DISPATCH          — /replay/next envoie une action (expected_before/after,
                       resolve_order, has_uia, has_anchor, by_text, strict)
2. RESOLVE_ENTRY     — _resolve_target_sync reçoit la demande (window_title,
                       uia_target, anchor, strict_mode)
3. RESOLVE_EXIT      — résolution terminée (method, coords, score, from_memory)
4. RESOLVE_EXCEPTION — crash rare dans la résolution
5. REPORT            — /replay/result reçoit le rapport agent (success, error,
                       warning, resolution_method, actual_position)
6. VERIFY            — décision finale post-vérification (agent_success,
                       ver_verified, sem_verified, final_success)

Usage : journalctl --user -u rpa-streaming -f | grep REPLAY

Aucune modif de logique, uniquement des logger.info() aux points de
décision critiques. 56 tests E2E + Phase0 restent verts.

Ces logs sont là pour stabiliser la chaîne après les modifications
robustesse du matin (strict control, UIA strict, filtre UIA-aware)
qui ont cassé les replays réels de Dom et ne se voient pas dans les
tests automatisés in silico.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-04-10 22:07:56 +02:00
parent b92cb9db03
commit f82753debe
2 changed files with 84 additions and 4 deletions

View File

@@ -1558,6 +1558,21 @@ def _resolve_target_sync(
"""
anchor_image_b64 = target_spec.get("anchor_image_base64", "")
# [REPLAY] log structuré d'entrée résolution
_window_title_log = target_spec.get("window_title", "") or ""
_resolve_order_log = target_spec.get("resolve_order") or []
_uia_target_log = target_spec.get("uia_target") or {}
_by_text_log = target_spec.get("by_text", "")
_vlm_desc_log = target_spec.get("vlm_description", "")
logger.info(
f"[REPLAY] RESOLVE_ENTRY window='{_window_title_log}' "
f"resolve_order={_resolve_order_log} "
f"has_uia={bool(_uia_target_log)} uia_name='{_uia_target_log.get('name','')[:40]}' "
f"has_anchor={bool(anchor_image_b64)} "
f"by_text='{_by_text_log[:40]}' vlm_desc='{_vlm_desc_log[:40]}' "
f"strict_mode={strict_mode} screen={screen_width}x{screen_height}"
)
# ===================================================================
# PHASE 1 APPRENTISSAGE : Lookup mémoire persistante (Fiche #18)
# ===================================================================