recipes/papers/meta-harness.
Playbook for the coding agent:
skills/harness-search.
The object it searches over: the harness.
1. Traces in
Point the recipe at yesterday’s export: a JSONL in any shapeload_traces
reads, or an OTLP JSON batch, which rows_from_otel groups into
conversations. One task per distinct ask. Nothing leaves your machine.
2. The split the agent cannot cross
The holdout is the latest days, whole days, until it holds half the tasks. The proposer reads earlier days only. Train asks that are near-copies of a holdout ask (decontaminate, the 8-gram rule) leave its window too.
out/split.json records it, and the proposal opens by saying which days
decide.
3. What the agent reads
out/proposal.md: every candidate so far as code, its pass@1 on the train
days with an interval over tasks, and its five worst rows. Nothing is
summarized. The proposer’s edge in [2] was raw traces, not digests.
4. What the agent writes
One file, one change, chosen from the worst rows. A candidate definesharness(model) -> wai.Harness. The fingerprint hashes the instructions,
the tool names and the Disclosure fields, so the edit is a new version
without anyone naming it, and every row says which harness made it.
out/selected.json.
5. The gate
Three checks, all printed.- The pick. The candidate that leads the most train tasks, per task the best pass rate across candidates with ties shared. Not the best mean: a mean gained by regressing a subset does not win [4].
- Is it real. On the held-out days the pick beats the baseline with a paired interval that excludes zero, and again on a second model. The held-out tasks the baseline passed every time and the pick failed every time are counted beside it.
- Did it just spend more. Cost per rollout is on the ledger: tokens when
every row carries usage, model calls otherwise. A pick may cost no more
than the baseline (
--cost-margin 0). A candidate that wins by spending more is a frontier point, and the verdict names the margin that would accept it [3].
wai.harness.attribute over the candidate by model grid says whether the
spread is the harness or the model. The agent loops on steps 3 to 5 until
the gate passes or the rounds run out. A search that never clears is a
result too.
6. Report, serve, next day
Every candidate is posted as a harness version, so the Runs page groups the dots by harness. Under the pick, five lines from the ledger: Changed, Moved, Why, Learned, Reproduce. You read one chart and decide. The holdout says what the pick can do on traffic it never saw. The next day says whether that survived. The skill ends by scoring the day after with the same judge and posting oneLiveDay. A flagged rate near the holdout’s
failure rate closes the loop. One well above it makes that day the new
traces.
When the harness is not enough
A search stalls when the model lacks something no prompt supplies. On a legal classification task, harness edits alone reached 50 points and harness plus weight updates reached 70 [5]. On an open model the same held-out test and judge carry over to training: evals, then SFT from traces or GRPO.References
- Zhang, Y. et al. Stop Comparing LLM Agents Without Disclosing the Harness. 2026. Harness variance 7.8x model variance;
Disclosurefollows its checklist. - Lee, Y. et al. Meta-Harness: End-to-End Optimization of Model Harnesses. 2026.
- Wang, Y. et al. Rethinking the Evaluation of Harness Evolution for Agents. 2026. Matched budgets; +0.6 held out when tuned on the scored tasks.
- Agrawal, L. A. et al. GEPA: Reflective Prompt Evolution Can Outperform Reinforcement Learning. ICLR 2026. Selection on the per-task frontier.
- Hebbar, P. et al. SIA: Self Improving AI with Harness and Weight Updates. 2026.
- Lambert, N. Reinforcement Learning from Human Feedback, chapter Evaluation. 2025. The train split picks, the holdout decides.