失敗 / 無效果動作的修復策略引擎

當動作沒有效果或落點錯誤時,代理需要一個*策略*決定下一步該試什麼——重新定位重試、微調座標、 把目標捲入視野、等待重試,或放棄並升級。self_healing / locator_repair 只修復*無法 解析*的定位器(找不到元素);當元素找到並點擊了卻無效果時,它們無能為力。loop_guard*偵測*卡住的迴圈——沒有戰術選擇或退避。step_repair 正是缺少的控制器:它消費一個效果判定 (例如來自 action_effect),並驅動有界的重試迴圈,每輪選擇下一個尚未嘗試的戰術。

純標準函式庫狀態機;每個副作用——執行動作、驗證、套用戰術、睡眠——都是注入的可呼叫物件, 因此迴圈完全確定性、可在無裝置下單元測試。不匯入 PySide6

無頭 API

from je_auto_control import (plan_repair, run_with_repair, RepairPolicy,
                             classify_effect)

# 只要規劃
plan_repair("no_op")              # ['wait_retry', 'relocate', 'nudge']
plan_repair("changed_elsewhere")  # ['escalate']

# 以注入接縫驅動迴圈
outcome = run_with_repair(
    act=lambda: click(*target),
    verify=lambda: not is_no_op(before(), after()),
    apply_tactic=apply,                 # 例如 relocate / nudge 目標
    verdict_for=lambda: classify_effect(before(), after(), action).effect,
    policy=RepairPolicy(max_attempts=3))
print(outcome.ok, outcome.tactics_used)

plan_repair 回傳某判定(字串如 no_op / changed_elsewhereEffectVerdict 字典)的有序戰術,截到 max_attempts;``next_tactic`` 回傳下一個尚未試過的。 run_with_repair 執行 act 然後 verify;失敗時套用戰術直到成功或耗盡,回傳 RepairOutcome``(``ok / attempts / tactics_used / detail)。RepairPolicy 限制嘗試次數並列出允許的戰術。

執行器指令

AC_plan_repair``(``verdict / max_attempts{count, tactics})以 MCP 工具 ac_plan_repair``(唯讀)及 Script Builder 指令 **Plan Repair Tactics**(位於 **Native UI** 分類下)形式提供。(實際的 ``run_with_repair 迴圈因接受注入可呼叫物件,由 Python 驅動。)