Benchmark integrity for agent skills
An agent benchmark is an experiment, not a batch of impressive transcripts. The model under test must be the model that produced the output, each run must be isolated from prior answers and grading logic, and the score must measure the user’s eventual task rather than only mechanical completion. The 2026-08-11 karpathy-wiki benchmark exposed two invalid attempts before producing a valid low/medium/high comparison: nested model delegation contaminated attribution, and cross-run read leakage exposed prior output and grader code. The failed attempts were stopped, preserved, excluded, and used to harden the harness. The condensed evidence is recorded in the benchmark manifest.Start with the decision
Write down what the benchmark will decide. Examples:- choose a default author profile;
- decide whether a cheaper fallback is good enough;
- verify a skill revision improves retrieval utility;
- qualify a provider adapter without making a semantic-quality claim.
Freeze the experiment
Before the first scoring run, freeze and hash:- skill and directly referenced conventions;
- source fixtures and starting repository state;
- case sequence;
- model/profile matrix;
- deterministic assertions;
- held-out retrieval questions;
- semantic rubric;
- prompt and harness scripts.
Guard model attribution
The model under test must execute the task itself. This rule matters even when the frozen skill says “you are a Claude ingester” or a local config names a provider. The karpathy-wiki Spark attempt completed its first case itself, then invoked a nested Claude CLI during the duplicate case. Without an attribution guard, the resulting wiki would have been scored as Spark even though another model participated. Add a neutral harness guard:Perform the task yourself. Do not invoke or delegate to another model, agent, subagent, agentic CLI, or model-launching hook. Provider-specific identity text in the frozen skill describes its original runtime; apply the procedure without starting that provider.Audit command events after every run. A final message saying “I did it myself” is not evidence; the invocation transcript is.
Guard read isolation
Each candidate may read only the inputs that candidate is supposed to have:- its own starting state and current output;
- the claimed capture or task prompt;
- named evidence;
- the frozen skill and directly referenced helpers.
- user or global memory;
- sibling runs and failed attempts;
- prior model output;
- benchmark graders, rubrics, answer keys, and reports;
- blind-review material and identity maps.
Separate four score layers
One total score hides different failure classes. Keep these layers separate:- Invocation integrity. Did the requested provider, model, and effort run without nested delegation?
- Lifecycle correctness. Did the run finish with valid state, one terminal outcome, correct archives, and no leaked locks or processing files?
- Deterministic content assertions. Are hashes, indexes, deduplication, required fields, and source boundaries present?
- Semantic and retrieval utility. Can a future agent answer realistic questions from authored knowledge without rereading raw evidence?
Grade authored output before source evidence
A knowledge-base benchmark should answer: “What can a future agent recover from the durable wiki?” Raw evidence must not rescue an under-authored page. Use this order:- Read authored pages, indexes, and links.
- Answer held-out questions from authored output.
- Classify each answer as full, partial, or none and cite the authored path.
- Only then inspect raw sources to verify fidelity and identify omissions.
- Inspect deterministic and lifecycle evidence last.
Blind the semantic judge
Prepare identity-sanitized candidate directories. Keep the mapping from candidate identifier to provider/model/effort outside the review tree. The judge should receive only:- candidate-authored output;
- shared source fixtures needed for fidelity checks;
- rubric and instructions;
- candidate-specific deterministic evidence with identity markers removed.
Treat contaminated runs as evidence, not data points
When contamination appears:- Stop the run before more output is produced.
- Preserve transcripts and status in a failed-attempt directory.
- Mark the attempt ineligible; never average it into results.
- Identify whether the failure is product behavior or harness ambiguity.
- Add the smallest neutral guard that restores the original experimental boundary.
- Record the amendment and restart affected configurations from clean fixtures.
Replication and interpretation
One run per configuration can rank that sample; it cannot estimate variance. Use one-run comparisons for directional screening, especially when score gaps are large. Use replicated runs when selecting a production default, when scores are close, or when stochastic behavior is material. Report:- number of independent runs per configuration;
- median and spread when replicated;
- exact model and effort;
- duration and cost when available;
- deterministic, retrieval, and semantic scores separately;
- contamination exclusions and prompt amendments;
- whether final state was clean.
Keep runtime quality gates deterministic
A benchmark qualifies a profile before production. Production should then validate outcomes it can check cheaply: schema, source existence, link resolution, archive completion, terminal run state, and queue cleanliness. Running another LLM as a reviewer after every ingest is not a substitute for a good benchmark. It adds cost and another model dependency while still missing held-out retrieval failures. Re-benchmark when sources, expected output, or semantic skill instructions materially change.Acceptance tests still need the real harness
Unit tests and frozen semantic benchmarks do not prove platform integration. Run disposable real-harness acceptance for:- exact provider/model/effort attribution;
- operator-config interference;
- paths containing spaces;
- missing optional quota tools;
- clean session hooks;
- actual scheduler install/run/uninstall;
- executable permissions and process-group cleanup;
- cold, duplicate, and augmentation flows.
Minimal checklist
- Decision and claim boundary written before execution.
- Skill, fixtures, cases, rubric, and prompt frozen and hashed.
- Model cannot delegate to another model or agentic CLI.
- Run cannot read memory, siblings, graders, or prior output.
- Candidate identity map is outside the blind-review tree.
- Authored output is graded before raw evidence.
- Held-out retrieval questions are scored individually.
- Deterministic and semantic scores remain separate.
- Contaminated attempts are preserved and excluded.
- Amendments are neutral, hashed, and scoped.
- Replication count and interpretation limit are reported.
- Real-harness acceptance covers platform integration.
Evidence
- Provider-aware ingest benchmark manifest records the scores, exclusions, hashes, and interpretation limit.
877e659is the subsequent provider-aware runtime ship.- Codex Spark acceptance separates adapter/lifecycle qualification from semantic model selection.