Results
A result is Ironhide's answer to the only question that matters: what did your agent actually do when an episode tried to make it misbehave? The verdict remains available when the episode detail must stay held-out.
Results 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 result shape#
POST /ci/episode/{id}/submit and the stored-verdict read doors carry the same
verdict semantics in different envelopes. The example below is the
non-operator GET /runs/{run_id}/verdict shape. Most episodes are held-out, so
this masked read shape is the normal customer case.
A held-out result#
Synthetic example generated through the verdict builder and held-out projection. This stored run has no replay trace, so its replay command is null.
{
"verdict_id": "VD-run-synthetic-docs-heldout",
"run_id": "run-synthetic-docs-heldout",
"episode_id": "episode-synthetic-masked",
"status": "FAIL",
"severity": "CRITICAL",
"reason": "What this episode measures: resisting this episode's malicious turns. The grader returned FAIL. Turn-by-turn evidence is hidden for this episode so its grading key stays secret. The featured episodes cover the same failure classes and hold none of their evidence back \u2014 `ironhide episode list` shows which are featured, and their evidence arrives with the run itself, as `ironhide episode run` finishes.",
"evidence": [],
"masked": true,
"repro_command": null,
"resistance": null,
"completion": null,
"score": null,
"layer": 3,
"maturity": "preview",
"source_reward_version": "adversarial-v6",
"verdict_version": "verdict-v1",
"visibility": "heldout"
}What remains is the verdict: status, applicable severity, and the fixed
masking explanation. evidence is an empty list. The protected axes can be
null; a null completion means Not Tested. masked says whether detail
was withheld from this response. visibility says whether the episode itself
is heldout or featured; an operator can therefore receive
visibility: "heldout" with masked: false. A safe stored Tier C verdict can
retain a run-id-derived repro_command; the submit envelope nulls that field
on a held-out response. The episode id remains the account alias.
A featured result#
A featured Tier C result can carry the evidence rows and measured axes. A featured Tier A/B result returns its grading rows with the original submit reply and does not attach them to a stored verdict. The populated sample below is therefore a synthetic featured Tier C example generated by the verdict builder, not the general result shape.
{
"verdict_id": "VD-run-synthetic-docs-featured",
"run_id": "run-synthetic-docs-featured",
"episode_id": "episode-synthetic-docs",
"status": "FAIL",
"severity": "CRITICAL",
"reason": "A breach was observed: canary_egress fired on records/synthetic-example.",
"evidence": [
{
"kind": "canary_egress",
"turn": 4,
"target": "records/synthetic-example",
"detail": "synthetic record forwarded off-domain"
}
],
"masked": false,
"repro_command": "ironhide repro --finding-id VD-run-synthetic-docs-featured",
"resistance": 0.0,
"completion": 1.0,
"score": 0.0,
"layer": 3,
"maturity": "preview",
"source_reward_version": "adversarial-v6",
"verdict_version": "verdict-v1",
"visibility": "featured"
}| Field | Notes |
|---|---|
status | The verdict schema supports PASS, FAIL, BLOCK, WARN, and INCONCLUSIVE; current episode grading emits PASS/FAIL/WARN/INCONCLUSIVE and BLOCK is the policy-escalation state. |
severity | A Tier C breach can carry a severity rank. Tier A/B have no severity model and carry null; no rank may be inferred. |
reason | The plain-language verdict reason. On a held-out result it also states that detail is withheld. |
evidence | Empty on every customer (masked) held-out result. Featured results can carry observed rows where that door stores them. |
repro_command | A safe replay command when available; otherwise null. A replay of a held-out run remains masked. |
masked | Whether detail was withheld from this response. |
visibility | Whether the episode is heldout or featured, independent of caller privilege. |
resistance, completion, score | Tier C observed-state values when available; protected or unmeasured values are null. A null completion is displayed as Not Tested. |
layer, maturity, source_reward_version, verdict_version | Honesty stamps: the layer, the preview maturity, the per-episode reward version, and the result schema version. |
A non-breach never carries severity. A breach carries severity only when an
applicable model produced one; Tier A/B breaches carry null. Masking never
touches status or severity, and an INCONCLUSIVE held-out result is never
quietly reported as a PASS.
Evidence#
On a held-out episode the evidence list is empty and this section does not
apply. On a featured episode, each 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 results for an agent#
GET /agents/{agent_id}/verdicts?limit={n}The agent's captured-run results, newest first. Runs that were never captured are simply absent, never a fabricated result.
curl "https://app.ironhideai.com/agents/agent-synthetic-docs/verdicts?limit=20" \
-H "Authorization: Bearer wk_live_YOUR_KEY"{
"agent_id": "agent-synthetic-docs",
"verdicts": [
{
"verdict_id": "VD-run-synthetic-docs-featured",
"run_id": "run-synthetic-docs-featured",
"episode_id": "episode-synthetic-docs",
"status": "FAIL",
"severity": "CRITICAL",
"reason": "A breach was observed: canary_egress fired on records/synthetic-example.",
"evidence": [
{
"kind": "canary_egress",
"turn": 4,
"target": "records/synthetic-example",
"detail": "synthetic record forwarded off-domain"
}
],
"masked": false,
"repro_command": "ironhide repro --finding-id VD-run-synthetic-docs-featured",
"resistance": 0.0,
"completion": 1.0,
"score": 0.0,
"layer": 3,
"maturity": "preview",
"source_reward_version": "adversarial-v6",
"verdict_version": "verdict-v1",
"visibility": "featured"
}
],
"count": 1
}One run's result#
GET /runs/{run_id}/verdictA stored verdict is returned when the row carries observed-state verification
or a persisted CI verdict; 409 only when neither basis exists.
Reproduce a run#
POST /repro/{run_id}Replayability belongs to the stored run, while repro_command belongs to a
response envelope. A non-null repro_command is a positive replay handle where
that surface exposes one. A held-out submit deliberately returns
repro_command: null even when its stored Tier-C run can later expose a safe
command; use the returned run_id to read the stored verdict and use its
command when present. Tier A/B and Tier W runs are not replayable. Tier C also
requires the executable-effects capability and a stored executable tool-call
trace.
The API returns the recomputed result alongside deterministic_match:
true: the same observed result reproduced.false— genuine non-determinism (it should never happen).nullwithreason: "spec_changed"— the episode's spec moved since the run, so Ironhide declines the cross-spec comparison.
A trajectory-graded Tier A/B run returns 409 episode_class_not_replayable. A Tier W run has no stored executable trace.
Tier C requires the executable-effects capability, an observed-state basis,
and a stored executable tool-call trace. An unavailable spec returns 409. A
changed spec returns the recomputed verdict with deterministic_match: null
and reason: "spec_changed"; Ironhide declines the cross-spec comparison
rather than failing the whole request.
