Skip to content

Node execution records

Archon captures a node’s execution facts in nodeExecutionRecordSchema. The shared public facts use nodeExecutionMetadataSchema; cache decisions use nodeCacheRecordSchema. Their source is packages/workflows/src/schemas/node-execution.ts. The generated tables below come from these schemas and the separate persisted projection, serializedNodeDataSchema in node-record-serialization.ts.

The node descriptor identifies the authored node and its kind; path identifies its location in the run, including composed structure. An invocation identifies the logical execution, while an attempt identifies one execution attempt within it. Retrying can create another attempt without creating another invocation. invocation.loopPath identifies enclosing loop groups and iterations.

The invocation’s checkout observation captures the checkout at its first attempt. Later attempts and resumed continuations retain it; each attempt can also have its own checkout observation. An observation describes Git content, a positively established non-Git directory, or an unavailable observation. It is evidence, not a policy against dirty starts.

The binding records the provider, requested model, provider-resolved model, tier, effort, session preview, and session origin when available. Requested and resolved models are distinct: Archon does not substitute the requested model for an unreported resolved model. A session preview is for display, not a resume token. The full sessionId is excluded by executionMetadata; the durable session_id is not a public session-resume token surface.

Timing describes the attempt’s start and observed duration. Lifecycle describes start, completion, failure, skip, or suspension. Output can carry runtime text, structured output, declared output paths, and persisted preview/truncation/spill provenance. Diagnostics carry additional execution observations; they are excluded from shared execution metadata along with output and the full session ID.

A measurement is either a reported value (source: provider) or explicitly unavailable. A genuine reported zero is a value; absence never becomes zero. startNodeExecution initializes availability from provider capabilities: unsupported means the provider declares no support, not_reported means support is declared but no value arrived, unknown means support is undeclared, and not_applicable means no provider call happened: the node has no provider, or the attempt failed before calling it. finishNodeExecution retains availability for omitted observations and marks rejected token or non-finite numeric observations invalid. An explicit provider tokensUnknown signal marks token accounting incomplete: at least one paid interval cannot be counted, so retries, resumed loops, and run or fan-out totals stay unavailable while cost continues to accumulate. Ordinary omitted measurements do not invalidate a token total.

The provider capability matrix is the per-provider reporting reference. Support does not guarantee a value on every result or complete nested-agent usage. Archon does not estimate cost or infer turns from event counts.

nodeCostScope maps accounting: node to own and other accounting kinds to total. Historical rows fall back to aggregate: true for total, otherwise own. This scope is a projection rule, not an execution-record field. A total restates spend that other rows may carry, so summing every event double-counts it.

The engine’s resume fold treats composed-instance terminal usage as authoritative for that instance’s scope: its inner observability rows can be missing after a crash. Other aggregate rows restate leaf usage. Use engine-produced run totals rather than constructing an independent client aggregation rule.

Cache decisions carry no new attempt, provider binding, timing, or newly consumed spend. serializeNodeStateRecord projects them as follows. The workflows conformance test checks these action-to-event names against the serializer:

  • Replayed: node_skipped_prior_success, with the reusable output under the normal output keys.
  • Reset: node_always_run_reset, with prior output and its truncation/spill provenance under prior_* keys.
  • Invalidated: node_prior_cache_invalidated, with prior output, prior structured output when present, reason: stale_dependency, and invalidating_deps.

A skipped execution instead carries a lifecycle reason and typed cause. The cause identifies condition evaluation, a condition parse error, timeout, or an upstream failure/skip with its origin. Cache records and skip lifecycle records are separate contracts.

SurfacePayload
archon workflow get <run-id> --jsonRun and terminal information; no full execution record
archon workflow get <run-id> --json --verboseNode summaries with execution metadata reconstructed from durable events when present
archon workflow get <run-id> --json --verbose --eventsDurable event envelopes and serialized data
GET /api/workflows/runs/{runId}Serialized events, with event-level cost_scope when data.cost_usd is numeric; separate run terminal/node summaries
Live emitter and JSONL transcriptShared executionMetadata, excluding output, diagnostics, and the full session ID

The terminal record’s nodes are lifecycle summaries from foldNodeEvents and runNodeStateSchema, not embedded full execution metadata. Historical rows may lack execution metadata. See the API reference for the detail endpoint and the CLI reference for command options.

recordNodeState serializes a captured record into durable events and derived transcript/emitter facts. The durable projection keeps both nested execution facts and existing flat wire keys. Event envelopes supply run identity, node path, and event type; the persisted-data table below describes data, not the envelope or a full in-memory execution record.

getDagResumeSnapshot reads ordered persisted events through readNodeRecordEvent. It restores unfinished invocation metadata and completion metadata, reusable completion output, truncation and spill provenance, structured output, declared output paths, and accounting/usage. Legacy declared_fields are converted to root output paths when declared_output_paths is absent. Failed rows can contribute usage without becoming reusable success. Cache replay inherits reusable completion facts and contributes no new spend; reset and invalidation remove reusable output.

The reader reconstructs lifecycle from the event type and the corresponding error, retryability, typed failure, skip reason/cause, or suspension point. If modern execution metadata is present, its required groups must be complete and its lifecycle valid. The persisted projection also carries diagnostics; being readable does not mean every diagnostic drives resume.

fan_out_instances is a separate durable event: its data.instances restores the first valid instance snapshot for the fan-out wrapper. It is outside the node-record data schema and the tables below.

Persisted keys and event/envelope identities are compatibility contracts. Older rows must remain readable, and older binaries may open the same database. This reference changes no schema, key, or behavior. See the database reference for persistence context.

Generated from the owning Zod schemas with z.toJSONSchema (input mode). Regenerate with bun run generate:node-execution-reference; verify with bun run check:node-execution-reference. The workflows conformance test enforces this block in the repository test suite.

Presence is relative to the containing object: a required child of an optional parent exists only when that parent exists. Array items use []; union rows state their alternative. unknown is unconstrained data. These tables describe fields and alternatives, not every validation constraint.

Field pathType / valuesPresenceAlternative
runIdstringrequired—
Field pathType / valuesPresenceAlternative
pathstringrequired—
Field pathType / valuesPresenceAlternative
nodeobjectrequirednode.kind = "agent"
node.idstringrequirednode.kind = "agent"
node.kind"agent"requirednode.kind = "agent"
node.sourceobjectrequirednode.kind = "agent"; node.source.kind = "inline"
node.source.kind"inline"requirednode.kind = "agent"; node.source.kind = "inline"
node.sourceobjectrequirednode.kind = "agent"; node.source.kind = "command"
node.source.kind"command"requirednode.kind = "agent"; node.source.kind = "command"
node.source.namestringrequirednode.kind = "agent"; node.source.kind = "command"
nodeobjectrequirednode.kind = "exec"
node.idstringrequirednode.kind = "exec"
node.kind"exec"requirednode.kind = "exec"
node.runtime"sh" | "bun" | "uv"requirednode.kind = "exec"
nodeobjectrequirednode.kind = "loop"
node.idstringrequirednode.kind = "loop"
node.kind"loop"requirednode.kind = "loop"
node.commandstringoptionalnode.kind = "loop"
nodeobjectrequirednode.kind = "loop_group"
node.idstringrequirednode.kind = "loop_group"
node.kind"loop_group"requirednode.kind = "loop_group"
nodeobjectrequirednode.kind = "gate"
node.idstringrequirednode.kind = "gate"
node.kind"gate"requirednode.kind = "gate"
nodeobjectrequirednode.kind = "halt"
node.idstringrequirednode.kind = "halt"
node.kind"halt"requirednode.kind = "halt"
nodeobjectrequirednode.kind = "wait"
node.idstringrequirednode.kind = "wait"
node.kind"wait"requirednode.kind = "wait"
nodeobjectrequirednode.kind = "workflow"
node.idstringrequirednode.kind = "workflow"
node.kind"workflow"requirednode.kind = "workflow"
node.fanOuttrueoptionalnode.kind = "workflow"
nodeobjectrequirednode.kind = "compose_fan_out"
node.idstringrequirednode.kind = "compose_fan_out"
node.kind"compose_fan_out"requirednode.kind = "compose_fan_out"
nodeobjectrequirednode.kind = "compose_fan_out_instance"
node.kind"compose_fan_out_instance"requirednode.kind = "compose_fan_out_instance"
node.idstringrequirednode.kind = "compose_fan_out_instance"
Field pathType / valuesPresenceAlternative
invocationobjectrequired—
invocation.idstringrequired—
invocation.startedAtstringrequired—
invocation.loopPatharray<object>required—
invocation.loopPath[]objectitem—
invocation.loopPath[].groupIdstringrequired—
invocation.loopPath[].iterationintegerrequired—
invocation.checkoutStartobjectoptionalinvocation.checkoutStart.kind = "git"
invocation.checkoutStart.kind"git"requiredinvocation.checkoutStart.kind = "git"
invocation.checkoutStart.sampledAtstringrequiredinvocation.checkoutStart.kind = "git"
invocation.checkoutStart.commitstringrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.commit alternative 1
invocation.checkoutStart.commitnullrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.commit alternative 2
invocation.checkoutStart.treestringrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.tree alternative 1
invocation.checkoutStart.treenullrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.tree alternative 2
invocation.checkoutStart.worktreeobjectrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "clean"
invocation.checkoutStart.worktree.status"clean"requiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "clean"
invocation.checkoutStart.worktreeobjectrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.status"dirty"requiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.content"complete" | "incomplete"requiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.stagedintegerrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.unstagedintegerrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.untrackedintegerrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifestobjectrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.pointerobjectrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.pointer.type"archon_artifact"requiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.pointer.run_idstringrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.pointer.pathstringrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.sha256stringrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.entriesintegerrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.cutFromCommitstringoptionalinvocation.checkoutStart.kind = "git"
invocation.checkoutStartobjectoptionalinvocation.checkoutStart.kind = "not_git"
invocation.checkoutStart.kind"not_git"requiredinvocation.checkoutStart.kind = "not_git"
invocation.checkoutStart.sampledAtstringrequiredinvocation.checkoutStart.kind = "not_git"
invocation.checkoutStartobjectoptionalinvocation.checkoutStart.kind = "unavailable"
invocation.checkoutStart.kind"unavailable"requiredinvocation.checkoutStart.kind = "unavailable"
invocation.checkoutStart.sampledAtstringrequiredinvocation.checkoutStart.kind = "unavailable"
invocation.checkoutStart.reason"git_failed" | "unsupported_backend" | "probe_failed"requiredinvocation.checkoutStart.kind = "unavailable"
Field pathType / valuesPresenceAlternative
attemptobjectrequired—
attempt.idstringrequired—
attempt.startedAtstringrequired—
attempt.checkoutStartobjectoptionalattempt.checkoutStart.kind = "git"
attempt.checkoutStart.kind"git"requiredattempt.checkoutStart.kind = "git"
attempt.checkoutStart.sampledAtstringrequiredattempt.checkoutStart.kind = "git"
attempt.checkoutStart.commitstringrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.commit alternative 1
attempt.checkoutStart.commitnullrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.commit alternative 2
attempt.checkoutStart.treestringrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.tree alternative 1
attempt.checkoutStart.treenullrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.tree alternative 2
attempt.checkoutStart.worktreeobjectrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "clean"
attempt.checkoutStart.worktree.status"clean"requiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "clean"
attempt.checkoutStart.worktreeobjectrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.status"dirty"requiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.content"complete" | "incomplete"requiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.stagedintegerrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.unstagedintegerrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.untrackedintegerrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifestobjectrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.pointerobjectrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.pointer.type"archon_artifact"requiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.pointer.run_idstringrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.pointer.pathstringrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.sha256stringrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.entriesintegerrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.cutFromCommitstringoptionalattempt.checkoutStart.kind = "git"
attempt.checkoutStartobjectoptionalattempt.checkoutStart.kind = "not_git"
attempt.checkoutStart.kind"not_git"requiredattempt.checkoutStart.kind = "not_git"
attempt.checkoutStart.sampledAtstringrequiredattempt.checkoutStart.kind = "not_git"
attempt.checkoutStartobjectoptionalattempt.checkoutStart.kind = "unavailable"
attempt.checkoutStart.kind"unavailable"requiredattempt.checkoutStart.kind = "unavailable"
attempt.checkoutStart.sampledAtstringrequiredattempt.checkoutStart.kind = "unavailable"
attempt.checkoutStart.reason"git_failed" | "unsupported_backend" | "probe_failed"requiredattempt.checkoutStart.kind = "unavailable"
Field pathType / valuesPresenceAlternative
bindingobjectrequired—
binding.providerstringoptional—
binding.modelobjectoptional—
binding.model.requestedstringoptional—
binding.model.resolvedobjectrequiredbinding.model.resolved.source = "provider"
binding.model.resolved.source"provider"requiredbinding.model.resolved.source = "provider"
binding.model.resolved.valuestringrequiredbinding.model.resolved.source = "provider"
binding.model.resolvedobjectrequiredbinding.model.resolved.source = "unavailable"
binding.model.resolved.source"unavailable"requiredbinding.model.resolved.source = "unavailable"
binding.model.resolved.reason"unsupported" | "not_reported" | "unknown" | "not_applicable" | "invalid" | "incomplete"requiredbinding.model.resolved.source = "unavailable"
binding.tier"small" | "medium" | "large"optional—
binding.effort"minimal" | "low" | "medium" | "high" | "xhigh" | "max" | "ultra" | "persistent"optional—
binding.sessionPreviewstringoptional—
binding.sessionOrigin"fresh" | "resumed" | "resume-failed-cold"optional—
Field pathType / valuesPresenceAlternative
timingobjectrequired—
timing.startedAtstringrequired—
timing.durationMsnumberoptional—
Field pathType / valuesPresenceAlternative
spendobjectrequired—
spend.tokensobjectrequiredspend.tokens.source = "provider"
spend.tokens.source"provider"requiredspend.tokens.source = "provider"
spend.tokens.valueobjectrequiredspend.tokens.source = "provider"
spend.tokens.value.inputnumberrequiredspend.tokens.source = "provider"
spend.tokens.value.outputnumberrequiredspend.tokens.source = "provider"
spend.tokens.value.cacheReadnumberoptionalspend.tokens.source = "provider"
spend.tokens.value.cacheWritenumberoptionalspend.tokens.source = "provider"
spend.tokens.value.cachePartialtrueoptionalspend.tokens.source = "provider"
spend.tokens.value.totalnumberoptionalspend.tokens.source = "provider"
spend.tokens.value.costnumberoptionalspend.tokens.source = "provider"
spend.tokensobjectrequiredspend.tokens.source = "unavailable"
spend.tokens.source"unavailable"requiredspend.tokens.source = "unavailable"
spend.tokens.reason"unsupported" | "not_reported" | "unknown" | "not_applicable" | "invalid" | "incomplete"requiredspend.tokens.source = "unavailable"
spend.costUsdobjectrequiredspend.costUsd.source = "provider"
spend.costUsd.source"provider"requiredspend.costUsd.source = "provider"
spend.costUsd.valuenumberrequiredspend.costUsd.source = "provider"
spend.costUsd.partialtrueoptionalspend.costUsd.source = "provider"
spend.costUsdobjectrequiredspend.costUsd.source = "unavailable"
spend.costUsd.source"unavailable"requiredspend.costUsd.source = "unavailable"
spend.costUsd.reason"unsupported" | "not_reported" | "unknown" | "not_applicable" | "invalid" | "incomplete"requiredspend.costUsd.source = "unavailable"
spend.stopReasonobjectrequiredspend.stopReason.source = "provider"
spend.stopReason.source"provider"requiredspend.stopReason.source = "provider"
spend.stopReason.valuestringrequiredspend.stopReason.source = "provider"
spend.stopReasonobjectrequiredspend.stopReason.source = "unavailable"
spend.stopReason.source"unavailable"requiredspend.stopReason.source = "unavailable"
spend.stopReason.reason"unsupported" | "not_reported" | "unknown" | "not_applicable" | "invalid" | "incomplete"requiredspend.stopReason.source = "unavailable"
spend.numTurnsobjectrequiredspend.numTurns.source = "provider"
spend.numTurns.source"provider"requiredspend.numTurns.source = "provider"
spend.numTurns.valuenumberrequiredspend.numTurns.source = "provider"
spend.numTurnsobjectrequiredspend.numTurns.source = "unavailable"
spend.numTurns.source"unavailable"requiredspend.numTurns.source = "unavailable"
spend.numTurns.reason"unsupported" | "not_reported" | "unknown" | "not_applicable" | "invalid" | "incomplete"requiredspend.numTurns.source = "unavailable"
Field pathType / valuesPresenceAlternative
accounting"node" | "aggregate" | "instance" | "amendment"required—
Field pathType / valuesPresenceAlternative
lifecycleobjectrequiredlifecycle.status = "started"
lifecycle.status"started"requiredlifecycle.status = "started"
lifecycleobjectrequiredlifecycle.status = "completed"
lifecycle.status"completed"requiredlifecycle.status = "completed"
lifecycleobjectrequiredlifecycle.status = "failed"
lifecycle.status"failed"requiredlifecycle.status = "failed"
lifecycle.errorstringrequiredlifecycle.status = "failed"
lifecycle.retryablefalseoptionallifecycle.status = "failed"
lifecycle.failureKind"fatal" | "transient" | "unknown" | "rate_limited" | "overloaded" | "timeout" | "exec_failed" | "output_contract" | "max_iterations" | "child_failed" | "cancelled" | "config"optionallifecycle.status = "failed"
lifecycle.providerFailureobjectoptionallifecycle.status = "failed"
lifecycle.providerFailure.class"auth" | "quota_exhausted" | "budget_exceeded" | "misconfigured" | "rate_limited" | "overloaded" | "transient" | "unknown"requiredlifecycle.status = "failed"
lifecycle.providerFailure.retryAfterMsintegeroptionallifecycle.status = "failed"
lifecycle.providerFailure.resetAtstringoptionallifecycle.status = "failed"
lifecycle.providerFailure.evidencestringrequiredlifecycle.status = "failed"
lifecycleobjectrequiredlifecycle.status = "skipped"
lifecycle.status"skipped"requiredlifecycle.status = "skipped"
lifecycle.reason"prior_success" | "when_condition" | "when_condition_parse_error" | "trigger_rule" | "timeout"requiredlifecycle.status = "skipped"
lifecycle.causeobjectrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "condition"
lifecycle.cause.kind"condition"requiredlifecycle.status = "skipped"; lifecycle.cause.kind = "condition"
lifecycle.cause.exprstringrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "condition"
lifecycle.causeobjectrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "condition_parse_error"
lifecycle.cause.kind"condition_parse_error"requiredlifecycle.status = "skipped"; lifecycle.cause.kind = "condition_parse_error"
lifecycle.cause.exprstringrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "condition_parse_error"
lifecycle.causeobjectrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "timeout"
lifecycle.cause.kind"timeout"requiredlifecycle.status = "skipped"; lifecycle.cause.kind = "timeout"
lifecycle.causeobjectrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "upstream_failed"
lifecycle.cause.kind"upstream_failed"requiredlifecycle.status = "skipped"; lifecycle.cause.kind = "upstream_failed"
lifecycle.cause.originstringrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "upstream_failed"
lifecycle.causeobjectrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "upstream_skipped"
lifecycle.cause.kind"upstream_skipped"requiredlifecycle.status = "skipped"; lifecycle.cause.kind = "upstream_skipped"
lifecycle.cause.originstringrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "upstream_skipped"
lifecycleobjectrequiredlifecycle.status = "suspended"
lifecycle.status"suspended"requiredlifecycle.status = "suspended"
lifecycle.point"approval" | "interactive_loop" | "writeback" | "child_workflow" | "fan_out"requiredlifecycle.status = "suspended"; lifecycle.point alternative 1
lifecycle.point"wait"requiredlifecycle.status = "suspended"; lifecycle.point alternative 2
Field pathType / valuesPresenceAlternative
outputobjectoptional—
output.textstringrequired—
output.structuredunknownoptional—
output.declaredOutputPathsarray<array<string>>optional—
output.declaredOutputPaths[]array<string>item—
output.declaredOutputPaths[][]stringitem—
output.persistedobjectoptional—
output.persisted.textstringrequired—
output.persisted.truncatedbooleanrequired—
output.persisted.originalBytesnumberoptional—
output.persisted.spillPathstringoptional—
Field pathType / valuesPresenceAlternative
diagnosticsobjectoptional—
diagnostics.iterationnumberoptional—
diagnostics.loopIterationsnumberoptional—
diagnostics.outputTypestringoptional—
diagnostics.commandstringoptional—
diagnostics.statusstringoptional—
diagnostics.maxIterationsnumberoptional—
diagnostics.sessionSourceNodeIdstringoptional—
diagnostics.sessionForkRequestedbooleanoptional—
diagnostics.sessionForkedbooleanoptional—
diagnostics.backgroundTasksIncompletearray<string>optional—
diagnostics.backgroundTasksIncomplete[]stringitem—
diagnostics.childRunIdstringoptional—
diagnostics.blockedOnChildRunIdstringoptional—
diagnostics.fanOutbooleanoptional—
diagnostics.identitystringoptional—
diagnostics.ordinalnumberoptional—
diagnostics.approvalDecisionstringoptional—
diagnostics.exprstringoptional—
diagnostics.mcpUnavailableobjectoptional—
diagnostics.mcpUnavailable.pathstringrequired—
diagnostics.mcpUnavailable.reason"provider_unsupported" | "config_missing"required—
diagnostics.mcpUnavailable.serversarray<string>optional—
diagnostics.mcpUnavailable.servers[]stringitem—
Field pathType / valuesPresenceAlternative
sessionIdstringoptional—
Field pathType / valuesPresenceAlternative
runIdstringrequired—
Field pathType / valuesPresenceAlternative
pathstringrequired—
Field pathType / valuesPresenceAlternative
nodeobjectrequirednode.kind = "agent"
node.idstringrequirednode.kind = "agent"
node.kind"agent"requirednode.kind = "agent"
node.sourceobjectrequirednode.kind = "agent"; node.source.kind = "inline"
node.source.kind"inline"requirednode.kind = "agent"; node.source.kind = "inline"
node.sourceobjectrequirednode.kind = "agent"; node.source.kind = "command"
node.source.kind"command"requirednode.kind = "agent"; node.source.kind = "command"
node.source.namestringrequirednode.kind = "agent"; node.source.kind = "command"
nodeobjectrequirednode.kind = "exec"
node.idstringrequirednode.kind = "exec"
node.kind"exec"requirednode.kind = "exec"
node.runtime"sh" | "bun" | "uv"requirednode.kind = "exec"
nodeobjectrequirednode.kind = "loop"
node.idstringrequirednode.kind = "loop"
node.kind"loop"requirednode.kind = "loop"
node.commandstringoptionalnode.kind = "loop"
nodeobjectrequirednode.kind = "loop_group"
node.idstringrequirednode.kind = "loop_group"
node.kind"loop_group"requirednode.kind = "loop_group"
nodeobjectrequirednode.kind = "gate"
node.idstringrequirednode.kind = "gate"
node.kind"gate"requirednode.kind = "gate"
nodeobjectrequirednode.kind = "halt"
node.idstringrequirednode.kind = "halt"
node.kind"halt"requirednode.kind = "halt"
nodeobjectrequirednode.kind = "wait"
node.idstringrequirednode.kind = "wait"
node.kind"wait"requirednode.kind = "wait"
nodeobjectrequirednode.kind = "workflow"
node.idstringrequirednode.kind = "workflow"
node.kind"workflow"requirednode.kind = "workflow"
node.fanOuttrueoptionalnode.kind = "workflow"
nodeobjectrequirednode.kind = "compose_fan_out"
node.idstringrequirednode.kind = "compose_fan_out"
node.kind"compose_fan_out"requirednode.kind = "compose_fan_out"
nodeobjectrequirednode.kind = "compose_fan_out_instance"
node.kind"compose_fan_out_instance"requirednode.kind = "compose_fan_out_instance"
node.idstringrequirednode.kind = "compose_fan_out_instance"
Field pathType / valuesPresenceAlternative
invocationobjectrequired—
invocation.idstringrequired—
invocation.startedAtstringrequired—
invocation.loopPatharray<object>required—
invocation.loopPath[]objectitem—
invocation.loopPath[].groupIdstringrequired—
invocation.loopPath[].iterationintegerrequired—
invocation.checkoutStartobjectoptionalinvocation.checkoutStart.kind = "git"
invocation.checkoutStart.kind"git"requiredinvocation.checkoutStart.kind = "git"
invocation.checkoutStart.sampledAtstringrequiredinvocation.checkoutStart.kind = "git"
invocation.checkoutStart.commitstringrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.commit alternative 1
invocation.checkoutStart.commitnullrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.commit alternative 2
invocation.checkoutStart.treestringrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.tree alternative 1
invocation.checkoutStart.treenullrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.tree alternative 2
invocation.checkoutStart.worktreeobjectrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "clean"
invocation.checkoutStart.worktree.status"clean"requiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "clean"
invocation.checkoutStart.worktreeobjectrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.status"dirty"requiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.content"complete" | "incomplete"requiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.stagedintegerrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.unstagedintegerrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.untrackedintegerrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifestobjectrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.pointerobjectrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.pointer.type"archon_artifact"requiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.pointer.run_idstringrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.pointer.pathstringrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.sha256stringrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.entriesintegerrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.cutFromCommitstringoptionalinvocation.checkoutStart.kind = "git"
invocation.checkoutStartobjectoptionalinvocation.checkoutStart.kind = "not_git"
invocation.checkoutStart.kind"not_git"requiredinvocation.checkoutStart.kind = "not_git"
invocation.checkoutStart.sampledAtstringrequiredinvocation.checkoutStart.kind = "not_git"
invocation.checkoutStartobjectoptionalinvocation.checkoutStart.kind = "unavailable"
invocation.checkoutStart.kind"unavailable"requiredinvocation.checkoutStart.kind = "unavailable"
invocation.checkoutStart.sampledAtstringrequiredinvocation.checkoutStart.kind = "unavailable"
invocation.checkoutStart.reason"git_failed" | "unsupported_backend" | "probe_failed"requiredinvocation.checkoutStart.kind = "unavailable"
Field pathType / valuesPresenceAlternative
attemptobjectrequired—
attempt.idstringrequired—
attempt.startedAtstringrequired—
attempt.checkoutStartobjectoptionalattempt.checkoutStart.kind = "git"
attempt.checkoutStart.kind"git"requiredattempt.checkoutStart.kind = "git"
attempt.checkoutStart.sampledAtstringrequiredattempt.checkoutStart.kind = "git"
attempt.checkoutStart.commitstringrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.commit alternative 1
attempt.checkoutStart.commitnullrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.commit alternative 2
attempt.checkoutStart.treestringrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.tree alternative 1
attempt.checkoutStart.treenullrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.tree alternative 2
attempt.checkoutStart.worktreeobjectrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "clean"
attempt.checkoutStart.worktree.status"clean"requiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "clean"
attempt.checkoutStart.worktreeobjectrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.status"dirty"requiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.content"complete" | "incomplete"requiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.stagedintegerrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.unstagedintegerrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.untrackedintegerrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifestobjectrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.pointerobjectrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.pointer.type"archon_artifact"requiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.pointer.run_idstringrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.pointer.pathstringrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.sha256stringrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.entriesintegerrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.cutFromCommitstringoptionalattempt.checkoutStart.kind = "git"
attempt.checkoutStartobjectoptionalattempt.checkoutStart.kind = "not_git"
attempt.checkoutStart.kind"not_git"requiredattempt.checkoutStart.kind = "not_git"
attempt.checkoutStart.sampledAtstringrequiredattempt.checkoutStart.kind = "not_git"
attempt.checkoutStartobjectoptionalattempt.checkoutStart.kind = "unavailable"
attempt.checkoutStart.kind"unavailable"requiredattempt.checkoutStart.kind = "unavailable"
attempt.checkoutStart.sampledAtstringrequiredattempt.checkoutStart.kind = "unavailable"
attempt.checkoutStart.reason"git_failed" | "unsupported_backend" | "probe_failed"requiredattempt.checkoutStart.kind = "unavailable"
Field pathType / valuesPresenceAlternative
bindingobjectrequired—
binding.providerstringoptional—
binding.modelobjectoptional—
binding.model.requestedstringoptional—
binding.model.resolvedobjectrequiredbinding.model.resolved.source = "provider"
binding.model.resolved.source"provider"requiredbinding.model.resolved.source = "provider"
binding.model.resolved.valuestringrequiredbinding.model.resolved.source = "provider"
binding.model.resolvedobjectrequiredbinding.model.resolved.source = "unavailable"
binding.model.resolved.source"unavailable"requiredbinding.model.resolved.source = "unavailable"
binding.model.resolved.reason"unsupported" | "not_reported" | "unknown" | "not_applicable" | "invalid" | "incomplete"requiredbinding.model.resolved.source = "unavailable"
binding.tier"small" | "medium" | "large"optional—
binding.effort"minimal" | "low" | "medium" | "high" | "xhigh" | "max" | "ultra" | "persistent"optional—
binding.sessionPreviewstringoptional—
binding.sessionOrigin"fresh" | "resumed" | "resume-failed-cold"optional—
Field pathType / valuesPresenceAlternative
timingobjectrequired—
timing.startedAtstringrequired—
timing.durationMsnumberoptional—
Field pathType / valuesPresenceAlternative
spendobjectrequired—
spend.tokensobjectrequiredspend.tokens.source = "provider"
spend.tokens.source"provider"requiredspend.tokens.source = "provider"
spend.tokens.valueobjectrequiredspend.tokens.source = "provider"
spend.tokens.value.inputnumberrequiredspend.tokens.source = "provider"
spend.tokens.value.outputnumberrequiredspend.tokens.source = "provider"
spend.tokens.value.cacheReadnumberoptionalspend.tokens.source = "provider"
spend.tokens.value.cacheWritenumberoptionalspend.tokens.source = "provider"
spend.tokens.value.cachePartialtrueoptionalspend.tokens.source = "provider"
spend.tokens.value.totalnumberoptionalspend.tokens.source = "provider"
spend.tokens.value.costnumberoptionalspend.tokens.source = "provider"
spend.tokensobjectrequiredspend.tokens.source = "unavailable"
spend.tokens.source"unavailable"requiredspend.tokens.source = "unavailable"
spend.tokens.reason"unsupported" | "not_reported" | "unknown" | "not_applicable" | "invalid" | "incomplete"requiredspend.tokens.source = "unavailable"
spend.costUsdobjectrequiredspend.costUsd.source = "provider"
spend.costUsd.source"provider"requiredspend.costUsd.source = "provider"
spend.costUsd.valuenumberrequiredspend.costUsd.source = "provider"
spend.costUsd.partialtrueoptionalspend.costUsd.source = "provider"
spend.costUsdobjectrequiredspend.costUsd.source = "unavailable"
spend.costUsd.source"unavailable"requiredspend.costUsd.source = "unavailable"
spend.costUsd.reason"unsupported" | "not_reported" | "unknown" | "not_applicable" | "invalid" | "incomplete"requiredspend.costUsd.source = "unavailable"
spend.stopReasonobjectrequiredspend.stopReason.source = "provider"
spend.stopReason.source"provider"requiredspend.stopReason.source = "provider"
spend.stopReason.valuestringrequiredspend.stopReason.source = "provider"
spend.stopReasonobjectrequiredspend.stopReason.source = "unavailable"
spend.stopReason.source"unavailable"requiredspend.stopReason.source = "unavailable"
spend.stopReason.reason"unsupported" | "not_reported" | "unknown" | "not_applicable" | "invalid" | "incomplete"requiredspend.stopReason.source = "unavailable"
spend.numTurnsobjectrequiredspend.numTurns.source = "provider"
spend.numTurns.source"provider"requiredspend.numTurns.source = "provider"
spend.numTurns.valuenumberrequiredspend.numTurns.source = "provider"
spend.numTurnsobjectrequiredspend.numTurns.source = "unavailable"
spend.numTurns.source"unavailable"requiredspend.numTurns.source = "unavailable"
spend.numTurns.reason"unsupported" | "not_reported" | "unknown" | "not_applicable" | "invalid" | "incomplete"requiredspend.numTurns.source = "unavailable"
Field pathType / valuesPresenceAlternative
accounting"node" | "aggregate" | "instance" | "amendment"required—
Field pathType / valuesPresenceAlternative
lifecycleobjectrequiredlifecycle.status = "started"
lifecycle.status"started"requiredlifecycle.status = "started"
lifecycleobjectrequiredlifecycle.status = "completed"
lifecycle.status"completed"requiredlifecycle.status = "completed"
lifecycleobjectrequiredlifecycle.status = "failed"
lifecycle.status"failed"requiredlifecycle.status = "failed"
lifecycle.errorstringrequiredlifecycle.status = "failed"
lifecycle.retryablefalseoptionallifecycle.status = "failed"
lifecycle.failureKind"fatal" | "transient" | "unknown" | "rate_limited" | "overloaded" | "timeout" | "exec_failed" | "output_contract" | "max_iterations" | "child_failed" | "cancelled" | "config"optionallifecycle.status = "failed"
lifecycle.providerFailureobjectoptionallifecycle.status = "failed"
lifecycle.providerFailure.class"auth" | "quota_exhausted" | "budget_exceeded" | "misconfigured" | "rate_limited" | "overloaded" | "transient" | "unknown"requiredlifecycle.status = "failed"
lifecycle.providerFailure.retryAfterMsintegeroptionallifecycle.status = "failed"
lifecycle.providerFailure.resetAtstringoptionallifecycle.status = "failed"
lifecycle.providerFailure.evidencestringrequiredlifecycle.status = "failed"
lifecycleobjectrequiredlifecycle.status = "skipped"
lifecycle.status"skipped"requiredlifecycle.status = "skipped"
lifecycle.reason"prior_success" | "when_condition" | "when_condition_parse_error" | "trigger_rule" | "timeout"requiredlifecycle.status = "skipped"
lifecycle.causeobjectrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "condition"
lifecycle.cause.kind"condition"requiredlifecycle.status = "skipped"; lifecycle.cause.kind = "condition"
lifecycle.cause.exprstringrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "condition"
lifecycle.causeobjectrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "condition_parse_error"
lifecycle.cause.kind"condition_parse_error"requiredlifecycle.status = "skipped"; lifecycle.cause.kind = "condition_parse_error"
lifecycle.cause.exprstringrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "condition_parse_error"
lifecycle.causeobjectrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "timeout"
lifecycle.cause.kind"timeout"requiredlifecycle.status = "skipped"; lifecycle.cause.kind = "timeout"
lifecycle.causeobjectrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "upstream_failed"
lifecycle.cause.kind"upstream_failed"requiredlifecycle.status = "skipped"; lifecycle.cause.kind = "upstream_failed"
lifecycle.cause.originstringrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "upstream_failed"
lifecycle.causeobjectrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "upstream_skipped"
lifecycle.cause.kind"upstream_skipped"requiredlifecycle.status = "skipped"; lifecycle.cause.kind = "upstream_skipped"
lifecycle.cause.originstringrequiredlifecycle.status = "skipped"; lifecycle.cause.kind = "upstream_skipped"
lifecycleobjectrequiredlifecycle.status = "suspended"
lifecycle.status"suspended"requiredlifecycle.status = "suspended"
lifecycle.point"approval" | "interactive_loop" | "writeback" | "child_workflow" | "fan_out"requiredlifecycle.status = "suspended"; lifecycle.point alternative 1
lifecycle.point"wait"requiredlifecycle.status = "suspended"; lifecycle.point alternative 2
Field pathType / valuesPresenceAlternative
runIdstringrequired—
pathstringrequired—
nodeobjectrequirednode.kind = "agent"
node.idstringrequirednode.kind = "agent"
node.kind"agent"requirednode.kind = "agent"
node.sourceobjectrequirednode.kind = "agent"; node.source.kind = "inline"
node.source.kind"inline"requirednode.kind = "agent"; node.source.kind = "inline"
node.sourceobjectrequirednode.kind = "agent"; node.source.kind = "command"
node.source.kind"command"requirednode.kind = "agent"; node.source.kind = "command"
node.source.namestringrequirednode.kind = "agent"; node.source.kind = "command"
nodeobjectrequirednode.kind = "exec"
node.idstringrequirednode.kind = "exec"
node.kind"exec"requirednode.kind = "exec"
node.runtime"sh" | "bun" | "uv"requirednode.kind = "exec"
nodeobjectrequirednode.kind = "loop"
node.idstringrequirednode.kind = "loop"
node.kind"loop"requirednode.kind = "loop"
node.commandstringoptionalnode.kind = "loop"
nodeobjectrequirednode.kind = "loop_group"
node.idstringrequirednode.kind = "loop_group"
node.kind"loop_group"requirednode.kind = "loop_group"
nodeobjectrequirednode.kind = "gate"
node.idstringrequirednode.kind = "gate"
node.kind"gate"requirednode.kind = "gate"
nodeobjectrequirednode.kind = "halt"
node.idstringrequirednode.kind = "halt"
node.kind"halt"requirednode.kind = "halt"
nodeobjectrequirednode.kind = "wait"
node.idstringrequirednode.kind = "wait"
node.kind"wait"requirednode.kind = "wait"
nodeobjectrequirednode.kind = "workflow"
node.idstringrequirednode.kind = "workflow"
node.kind"workflow"requirednode.kind = "workflow"
node.fanOuttrueoptionalnode.kind = "workflow"
nodeobjectrequirednode.kind = "compose_fan_out"
node.idstringrequirednode.kind = "compose_fan_out"
node.kind"compose_fan_out"requirednode.kind = "compose_fan_out"
nodeobjectrequirednode.kind = "compose_fan_out_instance"
node.kind"compose_fan_out_instance"requirednode.kind = "compose_fan_out_instance"
node.idstringrequirednode.kind = "compose_fan_out_instance"
cacheobjectrequiredcache.action = "replayed"
cache.action"replayed"requiredcache.action = "replayed"
cache.outputobjectrequiredcache.action = "replayed"
cache.output.textstringrequiredcache.action = "replayed"
cache.output.structuredunknownoptionalcache.action = "replayed"
cache.output.declaredOutputPathsarray<array<string>>optionalcache.action = "replayed"
cache.output.declaredOutputPaths[]array<string>itemcache.action = "replayed"
cache.output.declaredOutputPaths[][]stringitemcache.action = "replayed"
cache.output.persistedobjectoptionalcache.action = "replayed"
cache.output.persisted.textstringrequiredcache.action = "replayed"
cache.output.persisted.truncatedbooleanrequiredcache.action = "replayed"
cache.output.persisted.originalBytesnumberoptionalcache.action = "replayed"
cache.output.persisted.spillPathstringoptionalcache.action = "replayed"
cacheobjectrequiredcache.action = "reset"
cache.action"reset"requiredcache.action = "reset"
cache.priorobjectrequiredcache.action = "reset"
cache.prior.textstringrequiredcache.action = "reset"
cache.prior.structuredunknownoptionalcache.action = "reset"
cache.prior.declaredOutputPathsarray<array<string>>optionalcache.action = "reset"
cache.prior.declaredOutputPaths[]array<string>itemcache.action = "reset"
cache.prior.declaredOutputPaths[][]stringitemcache.action = "reset"
cache.prior.persistedobjectoptionalcache.action = "reset"
cache.prior.persisted.textstringrequiredcache.action = "reset"
cache.prior.persisted.truncatedbooleanrequiredcache.action = "reset"
cache.prior.persisted.originalBytesnumberoptionalcache.action = "reset"
cache.prior.persisted.spillPathstringoptionalcache.action = "reset"
cacheobjectrequiredcache.action = "invalidated"
cache.action"invalidated"requiredcache.action = "invalidated"
cache.priorobjectrequiredcache.action = "invalidated"
cache.prior.textstringrequiredcache.action = "invalidated"
cache.prior.structuredunknownoptionalcache.action = "invalidated"
cache.prior.declaredOutputPathsarray<array<string>>optionalcache.action = "invalidated"
cache.prior.declaredOutputPaths[]array<string>itemcache.action = "invalidated"
cache.prior.declaredOutputPaths[][]stringitemcache.action = "invalidated"
cache.prior.persistedobjectoptionalcache.action = "invalidated"
cache.prior.persisted.textstringrequiredcache.action = "invalidated"
cache.prior.persisted.truncatedbooleanrequiredcache.action = "invalidated"
cache.prior.persisted.originalBytesnumberoptionalcache.action = "invalidated"
cache.prior.persisted.spillPathstringoptionalcache.action = "invalidated"
cache.invalidatingDepsarray<string>requiredcache.action = "invalidated"
cache.invalidatingDeps[]stringitemcache.action = "invalidated"
Field pathType / valuesPresenceAlternative
nodeobjectoptionalnode.kind = "agent"
node.idstringrequirednode.kind = "agent"
node.kind"agent"requirednode.kind = "agent"
node.sourceobjectrequirednode.kind = "agent"; node.source.kind = "inline"
node.source.kind"inline"requirednode.kind = "agent"; node.source.kind = "inline"
node.sourceobjectrequirednode.kind = "agent"; node.source.kind = "command"
node.source.kind"command"requirednode.kind = "agent"; node.source.kind = "command"
node.source.namestringrequirednode.kind = "agent"; node.source.kind = "command"
nodeobjectoptionalnode.kind = "exec"
node.idstringrequirednode.kind = "exec"
node.kind"exec"requirednode.kind = "exec"
node.runtime"sh" | "bun" | "uv"requirednode.kind = "exec"
nodeobjectoptionalnode.kind = "loop"
node.idstringrequirednode.kind = "loop"
node.kind"loop"requirednode.kind = "loop"
node.commandstringoptionalnode.kind = "loop"
nodeobjectoptionalnode.kind = "loop_group"
node.idstringrequirednode.kind = "loop_group"
node.kind"loop_group"requirednode.kind = "loop_group"
nodeobjectoptionalnode.kind = "gate"
node.idstringrequirednode.kind = "gate"
node.kind"gate"requirednode.kind = "gate"
nodeobjectoptionalnode.kind = "halt"
node.idstringrequirednode.kind = "halt"
node.kind"halt"requirednode.kind = "halt"
nodeobjectoptionalnode.kind = "wait"
node.idstringrequirednode.kind = "wait"
node.kind"wait"requirednode.kind = "wait"
nodeobjectoptionalnode.kind = "workflow"
node.idstringrequirednode.kind = "workflow"
node.kind"workflow"requirednode.kind = "workflow"
node.fanOuttrueoptionalnode.kind = "workflow"
nodeobjectoptionalnode.kind = "compose_fan_out"
node.idstringrequirednode.kind = "compose_fan_out"
node.kind"compose_fan_out"requirednode.kind = "compose_fan_out"
nodeobjectoptionalnode.kind = "compose_fan_out_instance"
node.kind"compose_fan_out_instance"requirednode.kind = "compose_fan_out_instance"
node.idstringrequirednode.kind = "compose_fan_out_instance"
invocationobjectoptional—
invocation.idstringrequired—
invocation.startedAtstringrequired—
invocation.loopPatharray<object>required—
invocation.loopPath[]objectitem—
invocation.loopPath[].groupIdstringrequired—
invocation.loopPath[].iterationintegerrequired—
invocation.checkoutStartobjectoptionalinvocation.checkoutStart.kind = "git"
invocation.checkoutStart.kind"git"requiredinvocation.checkoutStart.kind = "git"
invocation.checkoutStart.sampledAtstringrequiredinvocation.checkoutStart.kind = "git"
invocation.checkoutStart.commitstringrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.commit alternative 1
invocation.checkoutStart.commitnullrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.commit alternative 2
invocation.checkoutStart.treestringrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.tree alternative 1
invocation.checkoutStart.treenullrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.tree alternative 2
invocation.checkoutStart.worktreeobjectrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "clean"
invocation.checkoutStart.worktree.status"clean"requiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "clean"
invocation.checkoutStart.worktreeobjectrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.status"dirty"requiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.content"complete" | "incomplete"requiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.stagedintegerrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.unstagedintegerrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.untrackedintegerrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifestobjectrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.pointerobjectrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.pointer.type"archon_artifact"requiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.pointer.run_idstringrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.pointer.pathstringrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.sha256stringrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.worktree.manifest.entriesintegerrequiredinvocation.checkoutStart.kind = "git"; invocation.checkoutStart.worktree.status = "dirty"
invocation.checkoutStart.cutFromCommitstringoptionalinvocation.checkoutStart.kind = "git"
invocation.checkoutStartobjectoptionalinvocation.checkoutStart.kind = "not_git"
invocation.checkoutStart.kind"not_git"requiredinvocation.checkoutStart.kind = "not_git"
invocation.checkoutStart.sampledAtstringrequiredinvocation.checkoutStart.kind = "not_git"
invocation.checkoutStartobjectoptionalinvocation.checkoutStart.kind = "unavailable"
invocation.checkoutStart.kind"unavailable"requiredinvocation.checkoutStart.kind = "unavailable"
invocation.checkoutStart.sampledAtstringrequiredinvocation.checkoutStart.kind = "unavailable"
invocation.checkoutStart.reason"git_failed" | "unsupported_backend" | "probe_failed"requiredinvocation.checkoutStart.kind = "unavailable"
attemptobjectoptional—
attempt.idstringrequired—
attempt.startedAtstringrequired—
attempt.checkoutStartobjectoptionalattempt.checkoutStart.kind = "git"
attempt.checkoutStart.kind"git"requiredattempt.checkoutStart.kind = "git"
attempt.checkoutStart.sampledAtstringrequiredattempt.checkoutStart.kind = "git"
attempt.checkoutStart.commitstringrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.commit alternative 1
attempt.checkoutStart.commitnullrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.commit alternative 2
attempt.checkoutStart.treestringrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.tree alternative 1
attempt.checkoutStart.treenullrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.tree alternative 2
attempt.checkoutStart.worktreeobjectrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "clean"
attempt.checkoutStart.worktree.status"clean"requiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "clean"
attempt.checkoutStart.worktreeobjectrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.status"dirty"requiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.content"complete" | "incomplete"requiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.stagedintegerrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.unstagedintegerrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.untrackedintegerrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifestobjectrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.pointerobjectrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.pointer.type"archon_artifact"requiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.pointer.run_idstringrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.pointer.pathstringrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.sha256stringrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.worktree.manifest.entriesintegerrequiredattempt.checkoutStart.kind = "git"; attempt.checkoutStart.worktree.status = "dirty"
attempt.checkoutStart.cutFromCommitstringoptionalattempt.checkoutStart.kind = "git"
attempt.checkoutStartobjectoptionalattempt.checkoutStart.kind = "not_git"
attempt.checkoutStart.kind"not_git"requiredattempt.checkoutStart.kind = "not_git"
attempt.checkoutStart.sampledAtstringrequiredattempt.checkoutStart.kind = "not_git"
attempt.checkoutStartobjectoptionalattempt.checkoutStart.kind = "unavailable"
attempt.checkoutStart.kind"unavailable"requiredattempt.checkoutStart.kind = "unavailable"
attempt.checkoutStart.sampledAtstringrequiredattempt.checkoutStart.kind = "unavailable"
attempt.checkoutStart.reason"git_failed" | "unsupported_backend" | "probe_failed"requiredattempt.checkoutStart.kind = "unavailable"
bindingobjectoptional—
binding.providerstringoptional—
binding.modelobjectoptional—
binding.model.requestedstringoptional—
binding.model.resolvedobjectrequiredbinding.model.resolved.source = "provider"
binding.model.resolved.source"provider"requiredbinding.model.resolved.source = "provider"
binding.model.resolved.valuestringrequiredbinding.model.resolved.source = "provider"
binding.model.resolvedobjectrequiredbinding.model.resolved.source = "unavailable"
binding.model.resolved.source"unavailable"requiredbinding.model.resolved.source = "unavailable"
binding.model.resolved.reason"unsupported" | "not_reported" | "unknown" | "not_applicable" | "invalid" | "incomplete"requiredbinding.model.resolved.source = "unavailable"
binding.tier"small" | "medium" | "large"optional—
binding.effort"minimal" | "low" | "medium" | "high" | "xhigh" | "max" | "ultra" | "persistent"optional—
binding.sessionPreviewstringoptional—
binding.sessionOrigin"fresh" | "resumed" | "resume-failed-cold"optional—
timingobjectoptional—
timing.startedAtstringrequired—
timing.durationMsnumberoptional—
spendobjectoptional—
spend.tokensobjectrequiredspend.tokens.source = "provider"
spend.tokens.source"provider"requiredspend.tokens.source = "provider"
spend.tokens.valueobjectrequiredspend.tokens.source = "provider"
spend.tokens.value.inputnumberrequiredspend.tokens.source = "provider"
spend.tokens.value.outputnumberrequiredspend.tokens.source = "provider"
spend.tokens.value.cacheReadnumberoptionalspend.tokens.source = "provider"
spend.tokens.value.cacheWritenumberoptionalspend.tokens.source = "provider"
spend.tokens.value.cachePartialtrueoptionalspend.tokens.source = "provider"
spend.tokens.value.totalnumberoptionalspend.tokens.source = "provider"
spend.tokens.value.costnumberoptionalspend.tokens.source = "provider"
spend.tokensobjectrequiredspend.tokens.source = "unavailable"
spend.tokens.source"unavailable"requiredspend.tokens.source = "unavailable"
spend.tokens.reason"unsupported" | "not_reported" | "unknown" | "not_applicable" | "invalid" | "incomplete"requiredspend.tokens.source = "unavailable"
spend.costUsdobjectrequiredspend.costUsd.source = "provider"
spend.costUsd.source"provider"requiredspend.costUsd.source = "provider"
spend.costUsd.valuenumberrequiredspend.costUsd.source = "provider"
spend.costUsd.partialtrueoptionalspend.costUsd.source = "provider"
spend.costUsdobjectrequiredspend.costUsd.source = "unavailable"
spend.costUsd.source"unavailable"requiredspend.costUsd.source = "unavailable"
spend.costUsd.reason"unsupported" | "not_reported" | "unknown" | "not_applicable" | "invalid" | "incomplete"requiredspend.costUsd.source = "unavailable"
spend.stopReasonobjectrequiredspend.stopReason.source = "provider"
spend.stopReason.source"provider"requiredspend.stopReason.source = "provider"
spend.stopReason.valuestringrequiredspend.stopReason.source = "provider"
spend.stopReasonobjectrequiredspend.stopReason.source = "unavailable"
spend.stopReason.source"unavailable"requiredspend.stopReason.source = "unavailable"
spend.stopReason.reason"unsupported" | "not_reported" | "unknown" | "not_applicable" | "invalid" | "incomplete"requiredspend.stopReason.source = "unavailable"
spend.numTurnsobjectrequiredspend.numTurns.source = "provider"
spend.numTurns.source"provider"requiredspend.numTurns.source = "provider"
spend.numTurns.valuenumberrequiredspend.numTurns.source = "provider"
spend.numTurnsobjectrequiredspend.numTurns.source = "unavailable"
spend.numTurns.source"unavailable"requiredspend.numTurns.source = "unavailable"
spend.numTurns.reason"unsupported" | "not_reported" | "unknown" | "not_applicable" | "invalid" | "incomplete"requiredspend.numTurns.source = "unavailable"
accounting"node" | "aggregate" | "instance" | "amendment"optional—
typestringoptional—
commandstringoptionalcommand alternative 1
commandnulloptionalcommand alternative 2
runtimestringoptional—
providerstringoptional—
modelstringoptional—
tier"small" | "medium" | "large"optional—
effort"minimal" | "low" | "medium" | "high" | "xhigh" | "max" | "ultra" | "persistent"optional—
duration_msnumberoptional—
tokensobjectoptional—
tokens.inputnumberrequired—
tokens.outputnumberrequired—
tokens.cacheReadnumberoptional—
tokens.cacheWritenumberoptional—
tokens.cachePartialtrueoptional—
tokens.totalnumberoptional—
tokens.costnumberoptional—
cost_usdnumberoptional—
stop_reasonstringoptional—
num_turnsnumberoptional—
model_usageobjectoptional—
model_usage.requestedstringoptional—
model_usage.resolvedstringrequired—
errorstringoptional—
retryablefalseoptional—
failure_kind"fatal" | "transient" | "unknown" | "rate_limited" | "overloaded" | "timeout" | "exec_failed" | "output_contract" | "max_iterations" | "child_failed" | "cancelled" | "config"optional—
provider_failureobjectoptional—
provider_failure.class"auth" | "quota_exhausted" | "budget_exceeded" | "misconfigured" | "rate_limited" | "overloaded" | "transient" | "unknown"required—
provider_failure.retryAfterMsintegeroptional—
provider_failure.resetAtstringoptional—
provider_failure.evidencestringrequired—
reason"prior_success" | "when_condition" | "when_condition_parse_error" | "trigger_rule" | "timeout"optionalreason alternative 1
reason"stale_dependency"optionalreason alternative 2
causeobjectoptionalcause.kind = "condition"
cause.kind"condition"requiredcause.kind = "condition"
cause.exprstringrequiredcause.kind = "condition"
causeobjectoptionalcause.kind = "condition_parse_error"
cause.kind"condition_parse_error"requiredcause.kind = "condition_parse_error"
cause.exprstringrequiredcause.kind = "condition_parse_error"
causeobjectoptionalcause.kind = "timeout"
cause.kind"timeout"requiredcause.kind = "timeout"
causeobjectoptionalcause.kind = "upstream_failed"
cause.kind"upstream_failed"requiredcause.kind = "upstream_failed"
cause.originstringrequiredcause.kind = "upstream_failed"
causeobjectoptionalcause.kind = "upstream_skipped"
cause.kind"upstream_skipped"requiredcause.kind = "upstream_skipped"
cause.originstringrequiredcause.kind = "upstream_skipped"
exprstringoptional—
suspend_pointstringoptional—
node_outputstringoptional—
node_output_truncatedbooleanoptional—
node_output_original_bytesnumberoptional—
node_output_spill_pathstringoptional—
structured_outputunknownoptional—
declared_fieldsarray<string>optional—
declared_fields[]stringitem—
declared_output_pathsarray<array<string>>optional—
declared_output_paths[]array<string>item—
declared_output_paths[][]stringitem—
prior_outputstringoptional—
prior_output_truncatedbooleanoptional—
prior_output_original_bytesnumberoptional—
prior_output_spill_pathstringoptional—
prior_structured_outputunknownoptional—
invalidating_depsarray<string>optional—
invalidating_deps[]stringitem—
aggregatebooleanoptional—
iterationnumberoptional—
output_typestringoptional—
statusstringoptional—
maxIterationsnumberoptional—
session_source_node_idstringoptional—
session_fork_requestedbooleanoptional—
session_forkedbooleanoptional—
background_tasks_incompletearray<string>optional—
background_tasks_incomplete[]stringitem—
child_run_idstringoptional—
blocked_on_child_run_idstringoptional—
fan_outbooleanoptional—
identitystringoptional—
ordinalnumberoptional—
approval_decisionstringoptional—
mcp_unavailableobjectoptional—
mcp_unavailable.pathstringrequired—
mcp_unavailable.reason"provider_unsupported" | "config_missing"required—
mcp_unavailable.serversarray<string>optional—
mcp_unavailable.servers[]stringitem—
session_idstringoptional—