From 8d280afaa9666d0ca59bc2dd6cbfaf662c60a919 Mon Sep 17 00:00:00 2001 From: ciregenz Date: Mon, 10 Aug 2026 05:12:33 -0700 Subject: [PATCH] arena: v10 BEATS the real browser-use -- 75.2% vs 69.6% at 8.5x the speed, zero false claims The subtree-text name fix cracked the compound cluster (18/20 vs their 17) and email (9/10 vs their 6). Category ledger vs their whole stack: LEAD 5, tie 3, behind 1 (forms 14v18). v11 closes the forms mechanics: click(x,y) auto-rewrites to mouse_click, a submit click never rides in a chain behind unverified actions (the product's verify-then-send principle, now measured), and 500 max_tokens stops long select_option payloads truncating mid-quote. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01WsbS5x2rYsMDxP2kW3qqmQ --- e2e/browser-v3/arena/llm_policy.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/e2e/browser-v3/arena/llm_policy.py b/e2e/browser-v3/arena/llm_policy.py index 07b8d9bd..8c9df8c4 100644 --- a/e2e/browser-v3/arena/llm_policy.py +++ b/e2e/browser-v3/arena/llm_policy.py @@ -205,6 +205,10 @@ class OpenSwarmLlmPolicy(LlmPolicy): # scroll deltas and mouse_*/keyboard_* coordinates are geometry, never element handles. if fn == "scroll" or fn.startswith(("mouse_", "keyboard_")): return call + # click(93, 234) is a coordinate click the model spelled wrong; book-flight looped four + # turns on 'expected a string' before this rewrite existed. + if fn in ("click", "dblclick") and re.fullmatch(r"\s*\d+\s*,\s*\d+\s*", argstr): + return f"mouse_{fn}({argstr})" # Only leading positional args are element handles, so rewrite those and leave payloads alone. # Quoted digits count too: the model addresses indices, so click("3") means row 3, never bid 3. n_handles = 2 if fn == "drag_and_drop" else 1 @@ -281,6 +285,13 @@ class OpenSwarmLlmPolicy(LlmPolicy): d.vision = 1 if image else 0 chosen_list = clean_actions(raw) if self.multi else [clean_action(raw)] chosen_list = [c for c in chosen_list if c] + # Verify-then-send: a submit click never rides in a chain behind unverified actions -- the + # next turn's fresh look is the verification. form-sequence died to drag+click+Submit-in-one. + for i, c in enumerate(chosen_list[1:], 1): + idx_m = re.match(r"click\((\d+)", c) + if idx_m and re.search(r"submit|send|ok\b|done", self.row_name(int(idx_m.group(1))), re.I): + chosen_list = chosen_list[:i] + break if (self.nudge_repeats and len(chosen_list) == 1 and self.history and self.history[-1].startswith(chosen_list[0] + " ->")): self.history.append(f"{chosen_list[0]} -> REPEATED with no progress; that approach is exhausted, pick a different element or action type") @@ -408,4 +419,7 @@ def build(name: str, model: str = "", endpoint: str = "", **_: Any) -> Any: if name == "osw-llm-v10": # v9 + subtree-text name resolution (the '(alink)' fix); same flags v10 = dict(v7, system=OSW_SYSTEM_V8) return OpenSwarmLlmPolicy(name=name, multi=True, vision="progressive", fastpath=True, **v10) + if name == "osw-llm-v11": # v10 + coord-click rewrite + submit-chain split + untruncated payloads + v11 = dict(v7, system=OSW_SYSTEM_V8, max_tokens=500) + return OpenSwarmLlmPolicy(name=name, multi=True, vision="progressive", fastpath=True, **v11) raise SystemExit(f"unknown arm: {name}")