diff --git a/agent_v0/agent_v1/core/executor.py b/agent_v0/agent_v1/core/executor.py index 85733c2ca..8d12e16d8 100644 --- a/agent_v0/agent_v1/core/executor.py +++ b/agent_v0/agent_v1/core/executor.py @@ -1862,6 +1862,23 @@ class ActionExecutorV1: max_runtime_dialog_handles, ) continue + # P0.9 — double-check de stabilité post-transition (~0.5s). + # Race condition observée sur replay_sess_56c10222 act 11 : + # la fenêtre attendue ('Enregistrer sous') peut matcher + # brièvement puis disparaître (dialog auto-fermée par un + # clic parasite ultérieur, ou focus change OS). Sans + # double-check, on valide une transition qui n'est plus là. + if matched and expected_after and not runtime_dialog_handled: + time.sleep(0.5) + recheck_info = get_active_window_info() + recheck_title = recheck_info.get("title", "") + if not _matches_expected_window(recheck_title): + logger.warning( + f"P0.9 transition instable : matched '{post_title}' " + f"puis '{recheck_title}' à T+0.5s ≠ '{expected_after}'" + ) + matched = False + post_title = recheck_title if matched: if runtime_dialog_handled: result["warning"] = "runtime_dialog_handled_post_verify"