Three Guarantees for an Evolving Agent Harness: An Overview
An overview of three separate questions about harness revisions: generalizing beyond training tasks, retaining earlier capabilities, and admitting a candidate using fresh validation.
Read the paper ↗What it is
- Generalization Does performance on the tasks that shaped a revision carry over to new tasks? Test the revision process's sensitivity by replacing one training task and rerunning everything that follows.
- Retention Does a later revision damage earlier capabilities? Give each update a separate allowance for regression on each earlier task group, then add those allowances across updates.
- Admission Should a proposed revision replace the current version? Compare both on fresh tasks that did not influence the candidate, allowing for the number of comparisons being made.
Why it matters
These checks answer different questions. A candidate can improve on the historical task mix while hurting an earlier group, and a small edit can still depend heavily on its training history. No single successful check establishes all three guarantees.
An evolving agent harness needs more than a score that goes up. It needs separate answers to whether it learned something reusable, whether it kept earlier capabilities, and whether the next revision deserves deployment. I would treat these as separate review questions, not one large safety claim.
A harness here means the instructions, skills, and other surrounding machinery used by an agent. Its evolution state also includes archives and feedback memory: changing a task can change those artifacts and, through them, later revisions. Keep the model and evaluator fixed for the guarantees discussed here.
-
Generalization: Did the revision learn beyond its training examples? Consider a running example: a harness handles API tasks, and one training task teaches it a particular authentication convention. Replace that task with another independent task and rerun the later revisions. If the final harness's loss changes substantially, the process depends strongly on that example. This sensitivity is called replace-one stability; it concerns the whole revision history, not the size of the instruction edit. Under independent task sampling and the replacement assumptions, it controls the magnitude of an expected training-to-population performance gap. But does being insensitive to individual examples prevent later forgetting?
-
Retention: Not by itself. In the same API example, a new instruction can help a new workflow while breaking the earlier authentication convention. Retention therefore needs its own allowance for how much each update may worsen performance on the earlier task distribution. Those allowances add across updates, like spending from a regression budget; the analogy stops at the fact that these are assumed risk limits, not money automatically enforced by the system. Stability helps relate the original training results to the original task distribution. The budget limits subsequent damage to that distribution. What check can establish whether a proposed revision is worth accepting now?
-
Admission: Compare the candidate and the current harness on the same fresh tasks. For our API example, both versions face each newly drawn workflow, and we compare their losses task by task. Fix the candidates before drawing these tasks, and account for every candidate and round being checked. If the candidate's estimated loss increase remains negative after adding an uncertainty margin, it can pass this admission rule. The margin guards against sampling error; it does not make previously inspected tasks fresh. A candidate edited after seeing the validation results needs a new independent draw. And improvement on a mixture of historical workflows can still hide damage to one workflow: should that group receive its own retention check?
The three linked pages below unpack these mechanisms separately. My main practical takeaway is to keep their conclusions separate too: an average validation gain is not a retention certificate, and neither is proof of performance on tomorrow's workload.
Read the deep dive
Why People Wanted It
An agent harness can preserve instructions, skills, and feedback across tasks. That gives later revisions a history to learn from—but also a history to overfit, overwrite, or repeatedly inspect during validation.
The real question was never just whether the next score improved. Did performance generalize beyond the tasks used to construct the harness? Did older capabilities survive? And was the proposed replacement evaluated independently of its construction?
This page is the overview. Each mechanism has its own standalone page, because each has different assumptions and a different conclusion.
The Core Move
Separate sensitivity to training history, accumulated historical regression, and the decision to deploy a candidate.
Write for the deployed harness and for its loss on task , averaged over execution randomness. Lower loss is better. A task distribution describes which tasks are sampled; its risk is the harness's average loss on those draws:
The checks below concern different relationships between this population risk, observed task losses, and revisions over time. They are not interchangeable certificates.
Why Generalization Is About the Whole Revision Path
For readers going beyond the basic distinction, the important technical boundary is what gets rerun in a replacement experiment.
Replace one training task with an independent draw, then rerun all downstream updates using coupled randomness: corresponding runs share their auxiliary random choices. Feedback, archives, and selection must be rerun too. Compare the resulting harnesses on the original sampled task.
The resulting average sensitivity controls the magnitude of an expected generalization gap under independent task sampling and replace-one exchangeability. It does not bound the gap in every run, and a small code edit does not establish small sensitivity.
Replace-One Stability and Expected Generalization develops the replacement construction and its bound. The question left open is retention: what if later revisions consistently hurt an earlier task group?
Why Retention Requires a Separate Budget
For readers going beyond the basic distinction, retention adds an assumption about each later transition—not another interpretation of stability.
Let mean risk on the task distribution from round . If every later update may increase that risk by at most its assigned allowance, the total increase is bounded by the sum of those allowances. This follows because consecutive risk differences cancel when added.
These are historical-risk assumptions, not automatically enforced limits. Checking them requires groupwise uncertainty control for the deployed composition, including merged edits and shared routers. An improvement averaged across historical groups does not establish that each group stayed within budget.
Retention Through Accumulated Regression Budgets derives the bound and separates it from original-round generalization. The question left open is admission: how do we test the next candidate without evaluating it on tasks that shaped it?
Why Admission Requires a Fresh Comparison
For readers going beyond the basic distinction, the key admission condition is independence conditional on the prior history.
Fix the candidates, then draw new independent validation tasks from the uniform mixture of historical task distributions. Evaluate each candidate and the current harness on the same tasks. Estimate the candidate's loss increase and add an uncertainty margin accounting for all candidates and rounds. Accept only a negative upper bound.
The pairing defines a direct loss difference on each task. Freshness prevents candidate construction from adapting to the validation draw. Neither keeping a reused set secret nor correcting for the number of comparisons restores that independence.
Fresh Validation for Harness Admission gives the confidence bound and its deployment rule. Its remaining question is scope: improvement on this historical mixture says nothing by itself about arbitrary future workloads or every historical group.
Minimal Causal Code
This schematic PyTorch loop shows only the admission decision, not a trainer or a stability estimator. propose must fix at most K candidates before draw_fresh samples independent tasks from the historical mixture. loss returns a tensor of bounded, execution-averaged task losses. The deployed state changes only after the comparisons.
import math
import torch
def evolve(state, propose, draw_fresh, loss, T, K, m, delta):
margin = math.sqrt(2 * math.log(K * T / delta) / m)
for k in range(1, T + 1):
candidates = list(propose(state, k))
assert len(candidates) <= K
tasks = draw_fresh(k, m)
with torch.no_grad():
baseline = loss(state, tasks)
upper_bounds = [
(loss(candidate, tasks) - baseline).mean().item()
+ margin
for candidate in candidates
]
if upper_bounds:
best = min(range(len(candidates)), key=upper_bounds.__getitem__)
if upper_bounds[best] < 0:
state = candidates[best] # visible deployment update
return state
What You Gain, and What You Lose
You gain a map of three different obligations: control sensitivity to training tasks, bound later damage to earlier groups, and independently assess proposed replacements.
You do not gain an unconditional guarantee. Stability needs the stated task-sampling assumptions. Retention needs separately justified historical-risk budgets. Admission consumes fresh validation data and certifies the historical mixture, not arbitrary future distributions.
The effective sample size counts independent tasks, not repeated executions of the same task. Correlated sessions need grouping or dependence-aware analysis. Without a justified evaluator-to-target discrepancy bound, validation certifies evaluator-defined loss only.
Generalization, retention, and admission answer separate questions; follow their separate assumptions before combining their conclusions.