revert: désactiver self-healing Win+D auto (cercle vicieux)
Revert effectif du commit c969f93a2.
Le Win+D auto au retry 1 produit un cercle vicieux quand combiné avec
le VLM-first qui hallucine systématiquement (positions répétitives
type 0.529/0.874 avec confidence 0.93 sans justification) :
click rate (cible mal localisée par VLM) → no_screen_change
→ Win+D auto → minimise Easily Assure
→ retry click → cible plus visible (Easily masquée par Win+D)
→ no_screen_change → Win+D encore → boucle infernale
Reproduit ce 2026-05-06 sur le workflow Urgence : 10 Win+D dispatchés
en moins de 2 minutes. Régression majeure ressentie par Dom :
"clic partout au pif, aucune action contrôlée".
L'idée du self-healing par gesture reste valide mais demande :
1. un déclenchement plus sélectif (genre overlay/popup détecté
visuellement, pas no_screen_change générique)
2. ou un Alt+Tab plutôt que Win+D (fait passer la fenêtre arrière
sans minimiser l'app cible)
3. ou une vraie analyse "y a-t-il une fenêtre qui obstrue ma cible"
avant de décider du gesture
À retravailler post-démo avec un vrai détecteur d'obstruction.
This commit is contained in:
@@ -1432,38 +1432,14 @@ def _schedule_retry(
|
||||
# Stratégie de retry selon le numéro
|
||||
actions_to_insert = []
|
||||
|
||||
if next_retry == 1 and reason in ("verification_failed", "no_screen_change"):
|
||||
# Auto-recovery par gesture : tenter Win+D ("Afficher le bureau")
|
||||
# avant le 1er retry quand l'action n'a rien changé à l'écran.
|
||||
# Hypothèse : une fenêtre/popup non bloquante obstrue la cible.
|
||||
# Cf. gesture_catalog.win_minimize_all (agent_chat/gesture_catalog.py:84)
|
||||
# et audit project-quality-guardian Cas #2 — self-healing par gesture
|
||||
# archivé le 24/04 dans _archive/dead_code_20260424/, reconnecté ici
|
||||
# côté serveur dans le pipeline de retry plutôt que dans la cascade
|
||||
# ORALoop (qui n'est plus sur le chemin actif du replay).
|
||||
actions_to_insert.append({
|
||||
"action_id": f"recovery_win_d_{uuid.uuid4().hex[:6]}",
|
||||
"type": "key_combo",
|
||||
"keys": ["super", "d"],
|
||||
"_recovery_gesture": "win_minimize_all",
|
||||
})
|
||||
# Petit wait après Win+D pour laisser l'OS terminer l'animation
|
||||
actions_to_insert.append({
|
||||
"action_id": f"wait_recovery_{uuid.uuid4().hex[:6]}",
|
||||
"type": "wait",
|
||||
"duration_ms": 500,
|
||||
})
|
||||
logger.info(
|
||||
"Auto-recovery : injection Win+D avant retry %d/%d (raison: %s)",
|
||||
next_retry, max_retries, reason,
|
||||
)
|
||||
elif next_retry == 2:
|
||||
# Retry 2 : injecter un wait de 2s avant l'action (loading possible)
|
||||
actions_to_insert.append({
|
||||
if next_retry == 2:
|
||||
# Retry 2 : injecter un wait de 2s avant l'action
|
||||
wait_action = {
|
||||
"action_id": f"wait_retry_{uuid.uuid4().hex[:6]}",
|
||||
"type": "wait",
|
||||
"duration_ms": 2000,
|
||||
})
|
||||
}
|
||||
actions_to_insert.append(wait_action)
|
||||
|
||||
actions_to_insert.append(retry_action)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user