Repository navigation
Conversation
…s own scorer `python -m openadapt_flow.verifier_audit run --target module:factory --out DIR` replays each task's reference trajectory with mechanical faults and asks the environment's own scorer for a verdict. Families: unauthorized side effect, wrong record, wrong value, duplicate, partial write, late write (after the success claim), optimistic success, and an incidental-change positive control. Ground truth never comes from the scorer. The target reads the end state through its own path, and a fault whose effect matches the reference is degenerate and excluded. A family never sees a verdict; the runner picks the first candidate whose replayed effect differs, then scores it. The report gives per-family false-accept and false-reject rates with Wilson 95% intervals and counterexamples with effect diffs; an append-only ledger makes reruns resume. Adapters: a self-contained toy target used by the tests, AgentDojo (in process) and AppWorld (a worker in AppWorld's own interpreter, which pins pydantic 1). Both benchmarks are imported at run time; no benchmark code is copied. Private family sets plug in with --families-module. This generalizes the method of "Finding Blind Spots in AppWorld and WorkArena Task Verifiers" (Abrich, 2026).
Redaction now digests edit text, call and harness errors and excluded-task details. A crashed census replay moves on to the next candidate instead of counting as an effect. The ledger records its target, families and redaction mode and refuses a mismatched resume; harness and scorer errors are retried. The AppWorld worker tags responses with a request id, moves fd 1 to stderr, logs stderr and times out. partial_write no longer emits a duplicate candidate.
|
Review (Grok), head 17ca171: APPROVE, with one fix I'd like before merge What I ran:
Design checks that hold up (read in the runner):
Probes on the toy target (a scratch script, not added to the PR):
Not tested: the AgentDojo and AppWorld adapters (neither benchmark is installed here), and the appworld_worker subprocess path. |
Signed-off-by: abrichr <[email protected]>
|
Conflict integration at Range-diff of the non-merge topic commits: WSL validation: 17 tests passed; lint, formatting, mypy (11 files), release consistency and the source-boundary check passed. Main's engine-generality check fails on the unchanged The separate transient reference-scorer ERROR request in Grok's review remains unchanged. This update resolves the merge conflict; those two items need disposition before merge. The PR-body correction is limited to 14 → 17 tests. |
|
Review (Grok), head 01ff57a: BLOCK (red CI; the merge itself is fine) The merge 01ff57a (parents 17ca171, main 9ec50e4) only resolves conflicts. Still open:
The 14 → 17 PR-body fix is done. |
|
Addressed in d6df929, replying to the block (comment 6651857936):
The PR body's test count now reads 18: the 17 you noted plus the new test. |
# Conflicts: # packages/flow/CHANGELOG.md
Independent adversarial review: APPROVEReviewed head 158330f (merge of main into d6df929; the merge changes none of the PR's 14 files). My three earlier BLOCK points are addressed: the docstring is generic, lint and the unit shard are fixed, and the :ERROR control row now resumes. Local verifier_audit tests: 18/18 pass. PR CI at this head: 22/22 non-skipped checks pass, including the three flow core unit shards, critical, and lint. Not checked: running the audit against a real third-party environment's scorer. |
What
python -m openadapt_flow.verifier_audit run --target module:factory --out DIRtests a benchmark or RL environment's own scorer, not an agent. It replays each task's reference trajectory with mechanical faults and records where the scorer accepts a wrong end state or rejects a legitimate one.Families (
families_spec()prints them asopenadapt.verifier-audit.families/v1):How it stays honest
cells.jsonlis append-only, so an interrupted audit resumes without rescoring.--redactdigests arguments and effects for targets whose data may not be shared in the clear.Adapters
targets/toy.py: a self-contained target used by the tests.targets/agentdojo.py(MIT): in process.targets/appworld.py(Apache-2.0): drivesappworld_worker.pyin AppWorld's own interpreter, because AppWorld pins pydantic 1.Both benchmarks are imported at run time from the user's install. No benchmark code is copied into the package. Private family sets plug in with
--families-module.Tests
tests/test_verifier_audit.py: 18 tests on the toy target. A field-only scorer shows false accepts, a strict scorer catches every harmful family, and the control is accepted. Also covered: refusals, retarget selection, ledger resume (including a control the scorer errored on), redaction, single-replay mode, Wilson bounds and the family spec.ruff checkandruff format --checkare clean.Design:
packages/flow/docs/VERIFIER_AUDIT.md.