Repository navigation
bench: silent-saves, score any GUI agent on saves that go wrong (stacked on #1303) - #1352
Merged
Merged
Conversation
One runner (openadapt-flow silent-saves --agent <adapter>) drives an executor through MockMed while its fault server breaks the save, and scores each item from the store read before and after. Fault set 1.0.0 uses only kinds already published in EFFECT_E2E.md and the scoreboard's claims run. Baselines are rebuilt from committed scoreboard rows; no new runs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…om prevention - proof.py renders four claims-run items side by side: the agent's final message and the store before and after, with verify-run's verdict. The run kept no screenshots; the screen panel is a labeled local re-render. - $0 reference runs of the screen-script, with and without the read-back. - screen-script reads the banner and error in one page evaluation; the old two-call read raced MockMed's re-render under optimistic. - README leads with the one-command runner and reports detection apart from prevention, which fault set 1.0.0 does not measure. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tifact inventory Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…h a regex CodeQL py/polynomial-redos on the FAULT pattern. An exact line match also fails closed if the hook changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 19, 2026
# Conflicts: # CAPABILITIES.md # packages/flow/public-artifacts.json
Member
Author
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.
Stacked on #1303. This branch starts at #1303's head, so until #1303 merges the diff below also shows #1303's changes. This PR adds only:
packages/flow/benchmark/silent_saves/(new)silent-savescommand inpackages/flow/openadapt_flow/__main__.pyCAPABILITIES.md's command listpackages/flow/public-artifacts.json(fault_set.json,baselines.json), fromscoreboard/refresh_inventory.shWhat it is
A standalone benchmark that any GUI agent or harness can be scored on. It measures how often a run reports success while the system of record holds a wrong, partial, duplicate or missing save, or has lost another record. It reports task success, time and cost alongside.
--agenttakesscreen-script($0 reference that trusts the screen),claude-computer-use(the scoreboard's agent; refuses without--allow-paid),openadapt-program:<jit cache>,command:<shell command>(any language: the task arrives in env vars and the report goes back as JSON), orpython:<module>:<class>.--readbackgates the claim onopenadapt-flow verify-run. Each item is scored from the store read before and after; the executor's report never decides the verdict.fault_set.json, 1.0.0, protocolsilent-saves/2026-10-19.1):ok,no_persist,partial,duplicate,wrong_record,stale,optimistic. These are the claims run's kinds, and a test checks that each one appears in EFFECT_E2E.md andclaims.py. Nothing comes from the private corpus or tuned thresholds.http://127.0.0.1:<port>/#tasks. A proxy sets the fault in MockMed's script and forces it onto every save, so an executor that posts to the API directly still gets the fault. The proxy also blocks reset and delete.baselines.py→baselines.json; no new paid runs). This is detection: every fault in 1.0.0 happens on the server after the save is sent, so the question is whether the run reports it truthfully. Prevention (stopping before a wrong save) is not measured by 1.0.0, and the README says so. The program's two fault items are detection too.scoreboard/raw/mockmed/claims/2026-10-19-bscoreboard/raw/mockmed/claims/2026-10-19-bscoreboard/raw/mockmed/agent/2026-10-18-ascoreboard/raw/mockmed/program/2026-10-18-averify-run refuted all 30 bad saves the agent reported as successes, after they had landed, and confirmed all 5 clean saves.
Proof and reference runs
proof/*.png(rendered byproof.py): four claims-run items side by side. Each shows the agent's final message, verbatim, next to the store before the run and what it held after, with verify-run's verdict. The claims run kept no screenshots, so the screen panel is MockMed re-rendered locally with the same fault and note, and each image says so.proof/evidence.jsonholds the rows and verdicts taken from the run's verify-run baselines and receipts (the baseline salt is left out).results/: $0 runs of the built-inscreen-scriptexecutor, 35 items each. On its own it reported 30 of 30 bad saves as successes; with--readback, 0 of 30, with 0 of 5 clean saves blocked.openadapt-programadapter runs, but the scoreboard's admitted program was compiled from a page that sends an idempotency key, so its record check expects that key. Under this protocol (no key) it reports failure on clean saves. A trial with one item per fault (not committed) got 0 of 6 bad saves as success and 1 of 1 clean save as failed. A fair program row needs a program admitted under this protocol.Apps
MockMed only. OpenEMR comes once the scoreboard session's injector is pushed. openIMIS comes after that. Both will run as external fixtures pulled at run time, with no GPL or AGPL files shipped.
Choices worth a look
openadapt-flow silent-saves, notbench silent-saves, becausebenchalready takes a positional bundle path. The benchmark parses its own arguments (prefix_chars="+"passes them through) and runs from a source checkout only, since the wheel ships nobenchmark/.benchmark/effectbench(MIT) already measures SWER over a simulated environment. This PR drives a real browser app, so a computer-use agent can be scored as is. The README links the two. Merging them is a follow-up.benchmark/silent_saves/tests.packages/flow's pytesttestpathsdoes not collect them, so CI does not run them yet.Tests
python -m pytest benchmark/silent_saves/tests -q(frompackages/flow): 17 passed. This includes both browser tests (the screen-script reports all 6 bad-save kinds as successes; the read-back catches them) and a check that the README's results table matchesbaselines.json. Also passed:tests/test_capabilities_map.py, andruff checkon the new files. Before 11:30 only single test files were run, per the coordinator.🤖 Generated with Claude Code