headroom/agent-evals
Tejas Chopra 84f9871e30
fix(agent-evals): Phase 0 — coding-agent accuracy A/B framework (#1037)
## Description

Adds the Phase 0 `agent-evals/` nested project for benchmarking
coding-agent task accuracy with and without Headroom's proxy/compression
path. The project is intentionally separate from the published
`headroom-ai` package and provides the shared A/B framework used by the
stacked Phase 1 PR #1040.

## Type of Change

- [x] New feature (non-breaking change that adds functionality)
- [x] Tests only
- [x] Documentation update

## Changes Made

- Added a three-arm experiment model for direct provider calls, Headroom
passthrough, and Headroom compression.
- Added the resumable orchestrator, run manifest/config models, JSON
logging, and append-only journal handling.
- Added savings capture from Headroom response headers plus scorecard
reporting for resolved rate and savings.
- Added unit tests and live-test markers for provider-key dependent
validation.
- Kept the benchmark project isolated from the product package and
normal Headroom release wheel.

## Testing

- [x] Unit tests pass (`pytest`)
- [x] Linting passes (`ruff check`)
- [x] Type checking passes (`mypy`)
- [x] New tests added for new functionality

### Test Output

```text
agent-evals Phase 0 validation from original PR:
74 unit tests passed
ruff clean
mypy clean

CI on this PR:
changes and commitlint pass; product CI jobs are skipped because this only changes the nested agent-evals project.
```

## Real Behavior Proof

- Environment: local agent-evals development environment with
provider-key dependent live tests skipped unless credentials are
present.
- Exact command / steps: Ran the Phase 0 unit suite, ruff, and mypy for
the nested `agent-evals` project; GitHub CI also ran the repository
change detection and commitlint jobs for this PR.
- Observed result: The Phase 0 framework tests passed locally, static
checks were clean, and GitHub CI reported passing change
detection/commitlint for the PR.
- Not tested: live provider accuracy claims; those require provider keys
and larger benchmark runs and are intentionally covered by live-marked
tests and later stacked phases.

## Review Readiness

- [x] I have performed a self-review
- [x] This PR is ready for human review

Co-authored-by: JerrettDavis <mxjerrett@gmail.com>
2026-06-22 15:01:44 -05:00
..
src/agent_evals fix(agent-evals): Phase 0 — coding-agent accuracy A/B framework (#1037) 2026-06-22 15:01:44 -05:00
tests fix(agent-evals): Phase 0 — coding-agent accuracy A/B framework (#1037) 2026-06-22 15:01:44 -05:00
.gitignore fix(agent-evals): Phase 0 — coding-agent accuracy A/B framework (#1037) 2026-06-22 15:01:44 -05:00
Makefile fix(agent-evals): Phase 0 — coding-agent accuracy A/B framework (#1037) 2026-06-22 15:01:44 -05:00
pyproject.toml fix(agent-evals): Phase 0 — coding-agent accuracy A/B framework (#1037) 2026-06-22 15:01:44 -05:00
README.md fix(agent-evals): Phase 0 — coding-agent accuracy A/B framework (#1037) 2026-06-22 15:01:44 -05:00

agent-evals

End-to-end accuracy A/B framework for Headroom: run trusted coding-agent benchmarks WITH vs WITHOUT Headroom's context-compression proxy and produce a statistically defensible verdict — does compression preserve what the agent can solve, and how much does it save?

This is a self-contained nested project inside the headroom repo. It consumes Headroom only as the system-under-test (via base_url); it is not part of the headroom-ai wheel and is not wired into headroom's make ci-precheck.

The clean A/B (why a proxy helps)

Headroom sits in the request path, so the only variable between arms is base_url:

Arm base_url Headroom mode Isolates
A0_DIRECT provider API none native agent score
A1_PASSTHROUGH localhost:N --no-optimize proxy-hop cost only
B_HEADROOM localhost:M --mode token compression cost (vs A1)

Headline accuracy claim = B vs A1. A1 vs A0 is the transparency sanity check (≈0).

Method (in one line)

Agentic evals are noisy (single-run pass@1 swings several points even at temp 0), so we run paired, multi-run, non-inferiority experiments: same tasks through every arm, K runs each, and a TOST equivalence test on accuracy (win = savings up, accuracy within margin δ).

Phases

  • Phase 0 (this PR) — foundation: 3-arm abstraction, resumable orchestrator, per-task savings capture, proxy-transparency check. Runnable with no benchmark deps and ~no spend.
  • Phase 1 — Aider Polyglot end-to-end (first real accuracy + savings scorecard).
  • Phase 2 — SWE-bench Verified via OpenHands (the headline), per-transform ablation.

See the design spec for the full architecture.

Develop

cd agent-evals
python -m venv .venv && source .venv/bin/activate
make install        # pip install -e ".[dev,stats]"
make gate           # ruff + mypy + pytest  (the agent-evals push gate)
agent-evals show-config

Live tests (spawn a real proxy / hit upstreams) are -m live/-m real_llm and are skipped unless provider keys are present in your environment. Keys come from your shell/.env; they are never read from or written to source.