Skip to content

ooo run: ~40% of executions fail on verifier false negatives and environment faults — raise run success to ≥80% #2311

Description

@Q00

Measurement (local event store, 2026-07-01 → 08-04, ~/.ouroboros/ouroboros.db)

  • Per execution: 51 completed / 35 failed (59%).
  • Per AC session, 181 failures by cause:
Cause Count Share
Fat-harness verifier failed (unsupported evidence claims: files_touched/tests_passed …) ~100 55%
Verify gate failed: verify_command exited with status 1 19 10%
Provider proxy 502/503 (auth_unavailable, unknown provider for model) ~19 10%
Claude Agent SDK is not installed (SDK runtime selected, SDK absent) 15 8%
Codex configuration drift, misc ~5 3%
  • Of 57 distinct ACs rejected by the verifier, only 13 ever completed on a later attempt (avg 2.4 attempts) — the rejection is systematic, not a phrasing problem.
  • codex_cli persists 0 execution.tool.completed events against 6,830 execution.tool.started, so a rejected leaf cannot be audited after the fact.

Reproduced false negatives (deterministic, _verify_atomic_evidence_against_runtime_messages fed codex-shaped item.started/item.completed events)

A leaf whose transcript shows Edit hello.py and /bin/zsh -lc 'python3 -m pytest --doctest-modules -q hello.py' (real July case exec_33b50bc500a8) is rejected when:

  • the file was written through a shell command (cat > f <<EOF, sed -i, scaffolding, git apply) — no file_change item, no authenticated Bash lease → files_touched unsupported;
  • the Codex completion carries no exit_code, or an empty/truncated aggregated_outputtests_passed unsupported even with 1 passed in the output;
  • task_cwd differs from the worktree the runtime reports → files_touched unsupported.

Root cause: the verifier's ground truth is the shape of the transcript, not the workspace or the harness's own observation. Each runtime encodes tools differently, so every new host needs another matcher (#2245 is one such patch).

Levers

  • L1a ground files_touched in a before/after workspace snapshot the dispatcher takes itself (unforgeable, runtime-independent; unchanged files still rejected).
  • L1b when the transcript cannot prove tests_passed, the harness re-runs the claimed test command with a bounded timeout and uses its own exit code (extends fix(orchestrator): normalize paths and unwrap shell wrappers in fat-harness evidence matching (release blocker) #1591).
  • L1c persist codex tool completions for diagnosability.
  • L2 preflight the selected runtime (SDK importable, backend reachable) before dispatching any AC, and stop classifying proxy auth_unavailable/unknown provider as transient.
  • L3 verify_command exit≠0 — needs per-case data; out of scope here.

Removing 70% of the L1+L2 failure families lifts 59% → ~85%. Measured by 10 live ouroboros run executions of a fixed cli-todo seed before and after, with an independent product smoke as ground truth.

Each lever lands as its own single-subsystem PR referencing this issue.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugReproducible defect or broken behaviorneeds-designMulti-PR epic or architectural change, needs human planning

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions