Verdicts
A verdict is Ironhide's answer to the only question that matters: what did your agent actually do when an episode tried to make it misbehave? Every submitted trajectory is graded into a verdict — pass or fail, how bad, why, and the observed facts behind it.
Verdicts are private to the agent that earned them. All routes here are owner-authenticated with the agent's token or your account owner key:
Authorization: Bearer wk_live_...The verdict shape#
A verdict is returned inline when you submit a trajectory, and can be read back later from the routes below. The canonical shape:
{
"verdict_id": "VD-run_9d3a...",
"run_id": "run_9d3a...",
"episode_id": "ep_7c1f9a20",
"status": "FAIL",
"severity": "CRITICAL",
"reason": "",
"evidence": [
{ "kind": "canary_egress", "turn": 4, "target": "records/lead_88", "detail": "forwarded off-domain" }
],
"repro_command": "ironhide repro run_9d3a...",
"resistance": 0.0,
"completion": 1.0,
"layer": 3,
"maturity": "preview",
"source_reward_version": "adversarial-v6",
"verdict_version": "verdict-v1"
}| Field | Notes |
|---|---|
status | The verdict: PASS, FAIL, BLOCK, WARN, or INCONCLUSIVE. |
severity | Present exactly when the status is a breach (FAIL / BLOCK): CRITICAL, HIGH, MEDIUM, or LOW. Absent on a non-breach. |
reason | Why there is no clean verdict — required for WARN and INCONCLUSIVE. |
evidence | The observed facts behind the verdict (see below). |
repro_command | How to deterministically re-verify the run, or null when the run stored no replayable trace. |
resistance, completion | The two-axis observed-state numbers for an executable (Tier C) episode; null when not applicable. |
layer, maturity, source_reward_version, verdict_version | Honesty stamps: the grading layer, the preview maturity, the per-episode reward version, and the verdict schema version. |
The model is self-checking: a breach status always carries a severity and a non-breach never does, so a verdict cannot be quietly rewritten into a cleaner shape.
Evidence#
Each evidence entry is one observed fact:
| Field | Notes |
|---|---|
kind | The tripwire kind (e.g. canary_egress), a global_watch:<watch> match, or a turn_observation. |
turn | The turn it was observed on, when applicable. |
target | The object involved. |
detail | The human-readable evidence. |
Recent verdicts for an agent#
GET /agents/{agent_id}/verdicts?limit={n}The agent's captured-run verdicts, newest first. Runs that were never captured are simply absent — never a fabricated verdict.
curl "https://ironhideai.com/agents/agt_1a2b3c/verdicts?limit=20" \
-H "Authorization: Bearer wk_live_YOUR_KEY"{
"agent_id": "agt_1a2b3c",
"verdicts": [ { "verdict_id": "VD-run_9d3a...", "status": "FAIL", "severity": "CRITICAL" } ],
"count": 1
}One run's verdict#
GET /runs/{run_id}/verdictThe observed-state verdict for a single captured run (404 run_not_found for
an unknown id; 409 no_observed_state when the run carries no observed-state
verification and so has no verdict). Returns the full verdict shape above.
Reproduce a run#
POST /repro/{run_id}Deterministically re-verify one captured run from its stored trace against the
episode's pinned spec, and return the recomputed verdict alongside a
deterministic_match:
true— the same observed verdict reproduced.false— genuine non-determinism (it should never happen).nullwithreason: "spec_changed"— the episode's spec moved since the run, so the comparison is refused rather than run against different ground truth.
503 feature_dark when the executable-effects capability is off; 409 when the
run is not a captured observed-state run or stored no replayable trace.
IRONHIDE