fix(om2w-eval): actor-aware settle window — peerd's 31.0% was undercounted#199
Open
jonybur wants to merge 1 commit into
Open
fix(om2w-eval): actor-aware settle window — peerd's 31.0% was undercounted#199jonybur wants to merge 1 commit into
jonybur wants to merge 1 commit into
Conversation
…bug finding The eval scores a task only once the whole flow goes silent for SETTLE_MS (the quiet-settle window). It was a fixed 15s, which covered the orchestrator's inter-event gaps but NOT the web actor's own reply-synthesis: after the actor finishes navigating it goes silent for one more model call (~20-40s on a slow model) before its reply-wake re-enters the orchestrator with the real answer. The window closed in that gap and captured the orchestrator's intermediate "I'll report back" ack as the final answer — on ~40% of the full-300 failures. Proven: re-running 42 such failures with the window widened, 34/37 went from an ack to a substantive answer; the full 300 with ONLY the settle changed went 33.1% -> 41.1% (Claude judge, McNemar p=0.011) — the first significant lever in the thread. This was measurement, not capability — the agent gets the answer, the eval read it a beat too early. The fix keeps the window tight (15s) but makes it ACTOR-AWARE: hold it open while a web-actor delegation is in flight (turn/actor-start..turn/actor-done) so the synthesis gap can't trigger capture, and settle normally once no actor is outstanding. Fast tasks settle in 15s; async tasks wait for the actor, not a padding constant — same substance recovery as a blanket 60s without taxing every task +45s. Still bounded by the task's own timeoutMs if an actor never reports done. Also adds --task-ids=<file> to run-om2w.mjs (run an arbitrary failure cluster, not a contiguous shard) — the tool that made the diagnosis tractable — and documents the finding as section 5 of the web-thread benchmark report.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The finding
peerd's Online-Mind2Web score (31.0% full-300, PR #193) was undercounted by a harness measurement bug, not a capability gap.
The eval scores a task only once the whole flow goes silent for a quiet-settle window (added originally to stop scoring the delegation ack instead of the answer — see §6 of the web-thread doc). That window was a fixed 15s. It covered the orchestrator's inter-event gaps but not the web actor's own reply-synthesis: after the actor finishes navigating, it goes silent for one more model call (~20–40s on a slow model) before its reply-wake re-enters the orchestrator with the real answer. The window closed in that gap and captured the orchestrator's intermediate "On it, I'll report back" ack as the final answer — on ~40% of the full-300 failures.
The proof
This is a legitimate correction, not a thumb on the scale — a real user does get the answer; 15s was simply too short a silence to wait for an async browser round-trip.
The fix
Not a bigger fixed timeout (that taxes every task +45s). The settle is now actor-aware: hold the window open while a web-actor delegation is in flight (
turn/actor-start..turn/actor-done), keep it tight (15s) otherwise. Fast tasks settle in 15s; async tasks wait for the actor, not a padding constant. Still bounded by the task's owntimeoutMsif an actor never reports done. Validated: reproduces the same 34/37-class substance recovery as a blanket 60s, without the per-task tax.Also in this PR
--task-ids=<file>onrun-om2w.mjs— run an arbitrary failure cluster instead of a contiguous offset/count shard (the tool that made the failure diagnosis tractable).docs/benchmarks/2026-07-web-thread.md.Notes
bun run typecheck,eslint,bun test ./tests(2827 pass) all green. The settle logic is browser-context; it's validated empirically via the ack-cluster re-run rather than a unit test.