cause points back at what triggered it.
Two attempts at one node
Attempt
string
required
Globally unique within the document.At most 200 characters.
string
required
The node this attempt tries.At most 200 characters.
integer
1-based ordinal within the node.
string
Logical agent/role that ran the attempt (not a volatile runtime locator).At most 200 characters.
string
The agent harness that ran the attempt, e.g.
claude-code, codex.At most 100 characters.string
Reasoning-effort label as configured, e.g. low, medium, high, xhigh, max. Open set; producers must not fold it into the model label.At most 100 characters.
How this attempt came to run: which scanned attempt launched it through a CLI, in which workspace, or that an unscanned program did.
What part the attempt played in the run (lead, planner, dev, reviewer, …), with the tier and evidence the label rests on.
enum
required
Current or terminal status. queued: created, not started yet. working: running now. The terminal statuses are done, failed, rejected, canceled, settled_unverified and lost, each carrying the meaning outcome.result gives it. When terminal, an outcome record should be present and outcome.result must equal status.One of:
queued, working, done, failed, rejected, canceled, settled_unverified, lost.string
Opaque correlate to the underlying harness session/transcript id, for producers that can join the two. Never transcript content.At most 500 characters.
string
The workflow piece id this attempt executes.At most 200 characters.
integer
Repair round, 1-based.
string
Working folder, opaque.At most 1000 characters.
- Attempt ids MUST be unique in the document (E101), and
nodeMUST name an existing node (E112). ncounts attempts at the same node from 1. From 0.3,roundcounts repair rounds of the workflow from 1, andvertexnames the workflow piece the attempt executes.actoris a logical agent or role, never a runtime locator.sessionis an opaque correlate to the harness session, never its content.settingis present only when the attempt ran with a setting other than its configuration’s setting for that piece. It is outside the configuration id, so a consumer that pools runs by id checks attempt settings too.
Status and outcome
status is one of queued, working, or a terminal status: done, failed, rejected, canceled, settled_unverified or lost.
- A terminal attempt SHOULD carry an
outcome(W131), andoutcome.resultMUST equalstatus(E130). - An attempt that is not terminal SHOULD NOT carry an outcome (W132).
enum
required
Terminal result. done: accepted. failed: attempted and did not succeed. rejected: refused by a review or a gate. canceled: stopped before it settled on its own. settled_unverified: settled without a parseable acceptance signal. lost: the runtime vanished.One of:
done, failed, rejected, canceled, settled_unverified, lost.string
How the result is known. verified: mechanically checked (tests, provenance receipt). reported: the actor asserted it through a typed envelope. heuristic: inferred. asserted: bare claim. Missing evidence must be treated as
asserted, never upgraded.Recommended values (open set): verified, reported, heuristic, asserted.string
Node id of the gate or review that produced this acceptance signal, when one did.At most 200 characters.
viaSHOULD name the node, a gate or a review, whose decision produced the result (W141).
Evidence tiers
An outcome says how its result is known.- A consumer MUST treat a missing
evidenceasasserted, never as anything stronger. - A producer MUST NOT raise a tier without new mechanical evidence.
verified, heuristic and reported with the meaning given on Run graph. See Evidence for why the tiers matter.
Model and effort
The model is an object, not a string. Reasoning effort is a separate field on the attempt.string
The label exactly as the producer knew it, always preserved (e.g.
fable·xhigh, opus5.xhigh). Canonicalization is the consumer’s job; the raw label is the ground truth.At most 200 characters.string
Canonical provider model id when known, e.g.
claude-fable-5.At most 200 characters.string
Coarse family label for grouping attempts by model family, e.g.
fable, opus5, sol5.6.At most 100 characters.string
e.g.
anthropic, openai.At most 100 characters.How the model label is known: verified from per-request usage records, reported from a harness field, heuristic from a name pattern.
model.rawMUST keep the label exactly as the producer knew it. Mapping raw labels to canonical ids is the consumer’s job;id,familyandproviderare the producer’s best knowledge.effortis an open set (low,medium,high,xhigh,max, and whatever comes next). A producer MUST NOT fold effort into the model label: it does not build a fused label such asfable·xhighitself. When the source already wrote one,rawkeeps it as written, and effort that is known separately goes ineffort.
Cause
string
required
Why this attempt exists. initial: the first attempt for its node. sent_back: a review rejected earlier work. gate_failed: an acceptance gate failed. followup: continuation of earlier work. superseded: replaces an earlier attempt. other: a trigger that fits none of the named values.Recommended values (open set):
initial, sent_back, gate_failed, followup, superseded, other.string
The earlier attempt id this cause points back to.At most 200 characters.
string
Who triggered it (reviewer, operator, policy rule).At most 200 characters.
cause.refSHOULD name an existing attempt (W140).otheris for triggers that fit none of the named types.
Origin, role and phase
Three optional records say how an attempt came to run, what part it played, and when in the run it happened. Each carries an evidence tier. An attempt need not carry them, but a record that is present MUST carry every field it lists, withnull for what is unknown.
Origin
How the attempt came to exist. Every field is present; an unknown value is an explicit null, never an absent key.string | null
required
Attempt id of the launcher, when a scanned attempt started this one through a CLI. A
launch edge from the launcher’s node to this attempt’s node must exist. null when no scanned attempt is the launcher (top-level, unknown, or external). Must be null when external is true: the two contradict each other.At most 200 characters.string | null
required
Workspace the launched harness reported as its working directory (an opaque locator, as run.workspace); null when unknown.At most 500 characters.
boolean | null
required
true when the harness reports it was launched by another program (e.g. codex originator
codex_exec) but no scanned attempt is the launcher: launched by an unscanned session, which is not the same as not launched. false when the attempt is known not to have been launched that way (a top-level session, or one whose launcher is in launched_by). null when the harness gives no signal.The launch mechanism, e.g.
codex exec, claude -p, via_script: tools/review.sh; null when unknown.required
launched_byMUST name an existing attempt other than this one (E119), and alaunchedge from the launcher’s node to this attempt’s node MUST exist (E161).external: truewith a non-nulllaunched_byis a contradiction (E165).
Role
What the attempt did in the run. All three fields are present; evidence is null when there is nothing to cite.string | null
required
Open set. Recommended vocabulary: lead (top-level session that spawned or launched others), solo (top-level session that did not), planner, dev, reviewer, cli (launched through a CLI with no role signal), subagent. null when the role is unknown; the key is always present and the tier stays required beside it.At most 100 characters.
required
What the label rests on, e.g. “declared type
Plan” or launch command mentions review; null when nothing can be cited.Phase
When in the run the attempt happened. All three fields are present; evidence is null when there is nothing to cite.string | null
required
Open set. Recommended vocabulary: build (during the lead’s activity), post (after the lead ended, e.g. a post-build review), external (outside the run’s workspace). null when the phase is unknown; the key is always present and the tier stays required beside it.At most 100 characters.
required