Skip to content

Verdicts and states

The judge gives each attempt (one submitted change) a verdict. The attempt also moves through a series of states while the judge works on it. This page lists every verdict and every state, with the words the dashboard shows for each. Why agents never judge explains the steps in order. The glossary explains the other terms.

flowchart LR
  S([submitted]) --> Q[queued]
  S --> R[rejected_v0]
  S --> D[duplicate]
  Q --> B[building]
  B --> M[gating and screening,<br/>or verifying]
  M --> J[judged]
  M --> C[confirming]
  C --> J
  C --> A[awaiting_audit]
  C --> W[awaiting_approval]
  C --> P[promoted]
  A --> W
  A --> X[audit_blocked]
  A --> P
  W --> P
  W --> N[declined]
  X --> P
  X --> N

The diagram leaves out three returns to queued: after one infrastructure failure, when the champion changed before confirmation, and when another change became the champion first. After a second infrastructure failure the attempt is errored. The owner can also decline an attempt in awaiting_audit. A patch that does not apply to its parent never becomes an attempt: the submission is refused and counted as a submission_refused event.

A verdict is written once and never changed. A later verdict on the same attempt, such as the confirmation after a screen, is added after it. The dashboard shows the newest one.

Only two verdicts can make an attempt the champion: win_confirmed and goal_progress.

The judge times the change against the champion in blocks: each block runs every case (a cell of the kit) that the contract names, for both, in a random order. It looks at the result after the block counts in acceptance.looks. The contract reference describes each setting named here.

VerdictGiven atMeaningDashboard says
win_screenedScreenThe gain’s interval is above zero, its estimate is at least min_effect, and no guard is broken or unclear. A confirmation follows“looked faster in screening; being confirmed on fresh runs”
neutralScreenThe interval lies inside ± equivalence_band (reason equivalent), or it is above zero but wholly below min_effect (reason gain below min_effect)“no measurable difference”
regressScreenThe interval lies wholly below zero (reason worse)“worse than the champion”
tradeoffScreen or confirmationAt the screen: the change would be a win, but a guard metric got worse by more than its step allowance. At confirmation: a guard got worse by more than its step allowance, or a guard’s total allowance since the seed is spent(the verdict’s name)
infeasibleScreen or confirmationA min or max hard constraint failed(the verdict’s name)
inconclusiveScreenNo decision by the last look, or a guard still unclear at the last look“too noisy, or not checkable, to tell”
win_confirmedConfirmationOn fresh blocks alone, the gain’s interval is above zero, no guard is broken or unclear, and the held-out cases pass“confirmed faster on fresh runs”
not_confirmedConfirmationThe gain did not hold on fresh blocks, a guard stayed unclear, or a held-out case failed“did not hold up on fresh runs”

Reasons name the metric with its estimate and interval, for example flops_per_s 12.40% [8.10%, 16.90%] n=6, and end with ; vs champion seq <n>. When the contract has held-out cases, a failed confirmation shows only confirmation failed, with no figures, so the agents learn nothing about those cases.

The judge checks the change against each goal and compares the result with what the champion meets. Goals checked by a review panel are left out here: the panel reviews only champions.

VerdictGiven atMeaningDashboard says
goal_screenedScreenIt meets a goal the champion does not, and loses none. A confirmation follows“looked like goal progress; being confirmed on fresh runs”
no_progressScreenNo new goal met, none lost“met no new goal”
regressScreenIt fails a goal the champion meets“worse than the champion”
inconclusiveScreenIt could not be checked on a goal the champion meets“too noisy, or not checkable, to tell”
goal_progressConfirmationIn fresh runs the new goals still hold, none is lost or unclear, and the held-out cases pass“confirmed: it meets more goals and loses none”
not_confirmedConfirmationAnything else“did not hold up on fresh runs”
VerdictMeaningDashboard says
invalidThe change’s build failed, or its build or run left files the judge refuses, or the kit’s check failed, or a measured value was impossible (for example not a number)“broken: it failed a correctness check or did not build”
crash_candidateThe change’s run exited with an error or was stopped at a kit limit, or its build was stopped at a kit limit“crashed when run”
crash_infraSomething failed that was not the change’s fault, such as the champion’s own run or a busy device. The judge tries once more. It never counts against the research“the rig failed while measuring it (not the change’s fault)”

The kit manifest reference lists which kit failure gives which verdict.

The ledger also has two verdicts that nothing in this version records: invalidated, which would replace a verdict whose evidence was withdrawn, and neutral_simplify.

StateMeaningDashboard says
queuedWaiting for the judge. Also after a screen again or a retry“waiting for the judge”
rejected_v0Refused by the static checks before any build: a file outside the editable paths, a forbidden pattern in an added line, a binary file, a link or a submodule, or no change at all. Kept, never built, no verdict“rejected v0”
duplicateThe same change as an earlier attempt of the run. Not judged again“the same change as an earlier attempt”
buildingThe judge is building the change and the champion“being built”
gatingHill climb: each case runs once for both; the change must pass the kit’s check“gating”
screeningHill climb: timed against the champion in blocks“being measured”
verifyingGoal campaign: the goals are being checked“being checked”
confirmingA screened win, waiting for its confirmation or, in a hill climb, in it. A goal campaign’s confirmation shows verifying“being confirmed on fresh runs”
judgedThe judge is done, and the verdict does not make it the champion“judged”
awaiting_auditA promotable result held for the auditor“held for an audit”
awaiting_approvalA promotable result waiting for the owner“waiting for your approval”
audit_blockedThe auditor blocked it. Only the owner can overrule“blocked by the auditor”
promotedIt became the champion“became the champion”
declinedThe owner said no. It never becomes the champion“declined by you”
erroredInfrastructure failed twice. Not counted against the research“failed in the judge”

A lane’s next trial starts only once its last attempt is settled: judged, promoted, rejected_v0, duplicate, errored, awaiting_approval, awaiting_audit or audit_blocked. Attempts in queued, building, screening, confirming, verifying, awaiting_audit or awaiting_approval count as open against the contract’s budget.max_open_attempts.

A promotable result goes to the auditor first when:

  • the agent declared known flaws (trigger known_flaws);
  • in a hill climb, the gain is above acceptance.audit.absolute (trigger absolute), or above acceptance.audit.ratio_to_median times the median of the run’s earlier confirmed gains, once there are three (trigger ratio);
  • in a goal campaign, the contract has an adversarial_checklist (trigger adversarial_checklist).

The auditor answers clear, block or needs_owner. An audit can hold a result back, never pass one: after clear, a result with declared flaws, a gain above the absolute trigger, or a rig or run that promotes only with the owner’s approval still waits for the owner. Without an audit, the promotion policy decides: auto promotes at once, owner_approval waits. Decide what waits for you shows how to answer.

Attempt lists show one word for each attempt, in this order of precedence:

WordWhen
Champion #NIt became champion number N: the current champion or an earlier one. The run’s starting point is champion #1, so the first change to win is #2
BlockedThe auditor blocked it
Needs youIt waits for an audit or for the owner
DeclinedThe owner declined it
PromotedIts state is promoted, but the run’s list of champions does not name it
JudgingIt is queued, building, screening, confirming or verifying, or it has only a screening verdict
DuplicateThe same change as an earlier attempt
Wonwin_confirmed or goal_progress
Brokeninvalid or crash_candidate
Unclearcrash_infra or inconclusive
LostAny other verdict: neutral, regress, tradeoff, infeasible, not_confirmed, no_progress

An attempt with no verdict at all also shows Judging. This includes an attempt in rejected_v0, which never gets a verdict.

A run is a campaign at work on one rig. The rig records one of three states for it, with a reason.

StateSet whenReason recorded
runningThe run is assigned to the rignone
The owner or an agent resumes it (resume_run)none
The smoke check ends and resumes a run it pausedresumed after the smoke check
pausedSomeone pauses it (pause_run)the reason given. The dashboard’s Pause sends what you typed in why (optional), or paused from the dashboard when you typed nothing
Another run is assigned or resumed on the same rig: a rig works on one run at a timereplaced by <run>
The contract’s budget.wall_hours has passed since the run was createdthe wall-time budget is spent
The judge’s time on the run reaches budget.device_hoursthe device-hours budget is spent
The agents’ model spending reaches budget.llm_usdthe model budget is spent ($<amount>)
A full reset is about to wipe the rigwiping
closedA goal campaign meets its goals, and a second, independent check agreesevery required goal is met
The owner accepts a “not possible” proposalnot possible: the owner accepted the evidence
A research campaign’s time is overthe research window is over
A smoke check finishes its own runthe smoke check is done
The harness restarted during a smoke checkits smoke check was interrupted
  • A closed run stays closed. Resuming it is refused with run <run> is closed.
  • A hill climb never closes on its own. It runs until someone pauses it or a budget the contract sets pauses it. Why Thermite runs until the job is done says why.
  • Budgets pause; they do not close. They apply only to runs with agents and a model. When one is spent, no new trial starts, and the run is paused once the running trial ends. wall_hours counts from the run’s creation, paused time included, so a resumed run is paused again. Set a budget or a stop time and Limits and pacing say more.
  • Judging waits with the run. The judge works only on running runs. A paused run’s queued judge jobs stay queued until it resumes.

A run’s page and its Live header show the run with one label: the first that applies, in this order.

LabelWhen
FinishedThe run is closed
PausedThe run is paused, even when a decision waits in it
ApprovalA result waits for the owner’s approval
DecisionA “not possible” proposal waits for the owner
ReviewThe review panel passed a goal, and the owner has not answered yet
AuditAn audit is open or has blocked a result
RunningOtherwise

What waits in a paused run still shows in Needs you, as for a running one.

A campaign’s page lists its paused and closed runs under Earlier runs, with the state Paused or Finished and, under Why it stopped, the reason the run recorded.

A campaign has no state of its own: its runs do.

  • The Campaigns page (in the sidebar) counts a campaign as at work when one of its runs is running, paused when none runs and one is paused, and finished when every run is closed. Campaigns named rig-check-…, which the smoke check makes, are rig checks. The filters are Active and paused (the default), At work, Paused, Rig checks and All. The default hides finished campaigns and rig checks; All shows every campaign. The Runs column counts each campaign’s runs as “N at work”, “N paused” and “N finished”.
  • The sidebar’s Campaigns section lists up to 12 campaigns that have a run that is not closed. Each shows its most urgent run’s label, in this order: Approval, Decision, Review, Audit, Running, Paused. A paused run’s label is always Paused, so a campaign whose only open run is paused shows Paused.

A campaign appears on the Campaigns page once a rig reports a run of it. A campaign saved on the New campaign page with no run yet is not listed there; its own page says “Saved on control, with no run yet. Start a run.” That page also opens for a campaign assigned over MCP, the REST API or the command line whose run no rig reports now. It then says “Assigned to a rig over the API, MCP or the CLI; no run of it reports now. Start a run.”

An experiment is one thing for a lane to try, in a run’s experiment queue. The harness keeps each run’s experiments in its ledger, and records every change as an event that names who made it. The run page’s History tab has a sentence when an experiment is added, proposed, queued, moved, edited or dropped, and for each hand-out, such as “The teacher pair added ”…” to the queue.” or “The planner gave out round 4: lane-1 on ”…”.”. The Experiments tab shows the experiments themselves; Choose what a run tries next shows how to change them.

StateMeaningOn the Experiments tab
proposedA lane’s idea, waiting for the planner or the owner to queue it or drop itIdeas from the lanes
queuedWaiting its turn. Its place is its index among the queued experiments, 0 firstUp next
assignedA lane’s trial works on itIn progress
doneIts trial ended, with its attempt or the reason there is noneTried
droppedSomeone dropped it, and said why. It stays in the recordTried
  • Only proposed and queued experiments can be edited or dropped, and only queued ones move. A command that breaks this is refused, for example experiment <id> is done: only queued experiments move.
  • One experiment goes to one trial. The planner can give a lane a queued experiment or a lane’s idea.
  • A copied experiment says where it came from. Start a run can begin a new run’s queue with another run’s untried experiments, and with past experiments from the knowledge base folders the campaign may read. Each keeps its first author, and from_run names the run it came from. One from past research ends its details with In <run> (<campaign>) it was <result>., or From <run> (<campaign>). when that run gave it no result. A copied experiment that MCP’s issue_command takes from control’s records gets the same In <run> (<campaign>) it was <result>. line when its item has a result.
  • An interrupted trial’s experiment comes back. When a trial is interrupted (by Pause, Restart the lanes or a harness restart) or fails with an error before it submits, its experiment is done, and a new experiment with the same text goes to the top of the queue. It keeps its author, and its why starts with tried again: its trial on <lane> was interrupted (<old id>), or failed for an error. Its experiment_added event has requeued_from: {experiment, trial, lane, result}, with interrupted or error as the result. History says <author>'s experiment "<title>" went back in the queue: its trial was interrupted., or … its trial failed., such as “The planner’s experiment …” or “Your experiment …”.

Tried lists every experiment that is done or dropped, newest first. Its Result column says what became of each:

ResultWhen
<attempt>: <outcome>Its trial submitted an attempt. The outcome is the attempt’s outcome word, such as Won or Lost, followed by , waits for you while it waits for your approval
<attempt>: not judged yetIts trial submitted an attempt that control has no record of yet
no attemptThe worker stopped without submitting
no attempt: <reason>Its trial ended without an attempt: interrupted, error, wall (its time ran out), turns (the turn cap) or context (the model’s context was full)
finished: its research is in the run's notesA research task whose trial ended on its own. Its sources, claims and findings are its result
dropped by <who>: <why>Someone dropped it: you (the owner, or an operator for the owner) or the planner. An idea dropped with its Drop button under Ideas from the lanes has the why the owner dropped this idea

The filter chips above the table each show a count, and group the results by the attempt’s outcome word:

ChipResults
AllEvery row
WinsChampion #N, Promoted or Won, and every attempt that waits for you: Needs you, or one that waits for your approval
Not betterLost: not better than the champion. A regress verdict (slower, or a goal lost) reads Lost, so it is here
Broken or blockedBroken or Blocked
Other resultsUnclear, Declined, Duplicate and Judging
Research finishedfinished: its research is in the run's notes. Shown only when there are some
No attempt or droppedno attempt, no attempt: <reason>, <attempt>: not judged yet and dropped by <who>: <why>

Beside the chips, two lists narrow the rows further: Every direction (the Direction column) and Anyone added it (the Added by column). Each offers only the values in the table. The chip and both lists apply together.

ThingStatesMeaning
Trial endingsubmitted, no_submission, finished, interrupted, turns, wall, context, errorWhy a trial ended: it submitted; it stopped without submitting; a research trial ended on its own; a pause, reset or restart ended it; the turn cap; its time ran out; the model’s context was full; an error
Judge jobqueued, leased, done, failed, blockedA job is blocked after three lease expiries or harness restarts. The ledger also allows cancelled, which nothing sets
Judge job kindvalidate, confirm, evaluate, calibrateTaken lowest priority number first: validate 40 (or 60 for a new champion), confirm 50, evaluate 100, calibrate 200
Goal checkmet, unmet, inconclusive, not_runnableOne check of one goal. A threshold goal is met only when every case’s interval is on the passing side
Goal (on the champion)untouched, verified, unmet, attempted, not_runnableThe champion’s goals: not checked yet, met, unmet, unclear, cannot be checked. The dashboard shows each goal’s latest check: “met”, “unmet”, “inconclusive”, “not runnable” or “waiting on another goal”
Audit decisionclear, block, needs_ownerThe auditor’s answer. The dashboard shows “waiting for the auditor”, “waiting for you (no auditor configured)”, “blocked by the auditor”, “cleared by the auditor” or “passed to you”
Reviewpanel review_passed or review_failed; owner accepted or rejectedA goal checked by a review panel counts as met only when the owner accepts it
“Not possible” proposalaccepted, rejectedAccepting closes the run. Rejecting reopens the approach families it used
Approach familylive, exhaustedA family becomes exhausted when a “not possible” proposal counts it as refuted
Research claimverified, draftVerified when every quote is found word for word in its archived source and every number in the claim is in its quotes. A draft lists its problems. Workers in every mode may record claims
Research findingsupported (a finding), draftA finding counts when every claim it cites is verified and every number in it is in those claims. A draft finding lists its problems. See Campaign modes
Epoch sourceplanner, fallbackWho gave out the epoch’s work, which the dashboard calls a round. planner: the planner model, and History says “The planner planned round N: …”. fallback: the fixed rules, used in a hill climb or goal campaign when the planner has no model, is off, or gave no usable plan: lanes take queued experiments in order. History then says why: “(by the fixed rules: no model)”, “(by the fixed rules: the planner is off on this rig (Edit rig))” or “(by the fixed rules: the model gave no usable plan, because …)”, with the reason; after more than one try, each try’s reason in turn: “try 1: …; try 2: …”. A research run’s rounds are always fallback, with plan: "research" in their epoch_started event: the research plan fills the queue on purpose, and History says “The research plan set round N: …”
Promotion policyauto, owner_approvalSet for the run when it is assigned, or the rig’s default

Signed commands lists the states of a command, and Stop, restart, remove or reset a rig the steps of a full reset.