API reference

Jobs

Submit a job, read it, wait for it, stream its events, read its summary and cancel it.

GET/v1/ci/jobs

List jobs

Jobs without their tasks.

Permission: ci:jobs.read

Parameters

NameTypeRequiredDescription
actorquerystringOptional
refquerystringOptional
repoquerystringOptional
statequerystringOptional

Response200 OK

dataarray of anyRequired
has_morebooleanRequired
next_cursorstring or null
curl "$CIRESK_API/v1/ci/jobs" \
  -H "Authorization: Bearer $CIRESK_KEY"
POST/v1/ci/jobs

Submit a job

Permission: ci:jobs.runCommand: send Idempotency-Key

Parameters

NameTypeRequiredDescription
Idempotency-KeyheaderstringRequired

Request body

actorstringRequired
base_digeststring
commit sha
base_refstring
budget_unitsinteger or null
clientstringRequired
diff_digeststring or null
sha-256 digest as sha256:<64 hex>
fail_fastboolean
the cell cancels the job's queued tasks at the first task that ends other than succeeded; running tasks finish and report, so a failure stays failed
fullboolean
kindstringRequired
check, test, build, lint or a manifest task id
labelsmap of string
manifest_digeststring or null
required without a tree; with one, the cell reads it from the tree's leaf at manifest_path and, when it is sent, checks that the two agree
manifest_pathstringRequired
no_cacheboolean
skip the task cache for this job: every task runs; a success is still recorded for the next job
no_dedupboolean
notestring or null
the submitter's one line for the person who decides the job's approval gates: untrusted text, at most 280 characters, shown and never interpreted
repo_idstringRequired
uuidv7 rendered as repo_<32 hex>
sessionstring or null
targetsarray of strings
treeobject or null
the working tree as a merkle root with the small change inline
tree.bytesintegerRequired
tree.entriesintegerRequired
tree.inlinearray of objects
tree.inline[].data_b64stringRequired
tree.inline[].digeststringRequired
sha-256 digest as sha256:<64 hex>
tree.manifestsarray of objects
tree.manifests[].data_b64stringRequired
tree.manifests[].digeststringRequired
sha-256 digest as sha256:<64 hex>
tree.parent_rootstring or null
the root digest of a working tree: sha-256 of the root directory manifest
tree.rootstringRequired
the root digest of a working tree: sha-256 of the root directory manifest
tree.tree_schemainteger or null
the TREE_SCHEMA_VERSION the root was hashed under; absent from a client older than it
tree_idstring or null
sha-256 hex of the repo identity plus the absolute tree location, one per checkout
tree_rootstring or null
a root already committed in the organisation's store (a dev checkpoint, an earlier upload), built with nothing uploaded; 422 tree_not_committed when the store lacks any of it. never with tree
truststring or null
the tier the submitter asks for: untrusted, or the tier the cell derives anyway; any other is refused with policy_denied (policy_field trust), never appliedOne of untrusted, trusted_ci, trusted_interactive

Response201 Created

actorstringRequired
affectedobject or null
what expansion selected for the job and why, when the submission carried a tree
affected.changed_filesintegerRequired
distinct changed paths between the reference root and the submitted one
affected.escalatedbooleanRequired
affected.graph_rootstring or null
the root whose recorded graph answered; absent when none was read
affected.reasonstring or null
the condition column of's table, as crates/ci/affected words it
affected.reference_rootstring or null
the root the diff was taken against; absent for a first submission
affected.selectedintegerRequired
targets the tasks received through targets_arg; 0 when escalated (the full set runs)
affected.strategystringRequired
One of cargo, pnpm, go, turbo, nx, files, none
affected.totalinteger or null
nodes of the recorded graph, when one was read
base_digeststringRequired
commit sha
base_refstringRequired
ref name as submitted
clientstringRequired
cost_unitsinteger or null
created_atstring (date-time)Required
deduplicatedbooleanRequired
diff_digeststring or null
sha-256 digest as sha256:<64 hex>
duration_msinteger or null
exit_codeinteger or null
fail_fastboolean
the cell cancels the job's queued tasks at the first task that ends other than succeeded; a deduplicated job carries the first submitter's choice
finished_atstring (date-time) or null
fullbooleanRequired
idstringRequired
uuidv7 rendered as job_<32 hex>
kindstringRequired
check, test, build, lint or a manifest task id
no_cacheboolean
--no-cache: no task is served from the task cache; successes still record
principalstringRequired
priorityintegerRequired
repostringRequired
repo_idstringRequired
uuidv7 rendered as repo_<32 hex>
request_idstring or null
the X-Request-Id this answer was produced under, so a --json envelope can name it
sessionstring or null
started_atstring (date-time) or null
statestringRequired
One of queued, leased, running, succeeded, failed, cancelled, timed_out, infra_error
superseded_bystring or null
the newer job of the same submitter, branch, kind and targets that cancelled this one under the policy's cancel_in_progress; absent otherwise
targetsarray of stringsRequired
tasksarray of objects
absent on list rows and inside Summary.job
tasks[].approvalobject or null
: the task's approval gate; a gated task stays queued until it is approved
tasks[].approval.approversarray of strings
user:<id> and role:<name>; empty means any person holding ci:approvals.approve
tasks[].approval.commentstring or null
tasks[].approval.decided_atstring (date-time) or null
tasks[].approval.decided_bystring or null
tasks[].approval.expires_atstring (date-time)Required
tasks[].approval.reachedbooleanRequired
the task's dependencies have succeeded: an approval starts it at once
tasks[].approval.sod_exceptionboolean
the requester decided their own gate under the policy's approval_self: record
tasks[].approval.statestringRequired
One of pending, approved, rejected, expired
tasks[].artifact_countintegerRequired
tasks[].blocked_bystring or null
on a skipped task, the dependency whose end skipped it (build, build[1/2])
tasks[].cachestringRequired
how a task met the task cache: served without a run, looked up and run, recorded after the run, or never keyed (cache: false, cache: { results: false } or --no-cache)One of hit, miss, write, none
tasks[].cache_hitboolean
the task did not run: its key matched a recorded success; cached_from names it
tasks[].cache_notestring or null
why the task was neither answered from the cache nor recorded in it, when the cell knows a reason beyond "these inputs never passed": the manifest keeps it out, or the run changed a tracked path. ciresk ci explain-miss compares a miss with the last recorded run of the task
tasks[].cached_failureobject or null
the task did not run: its key failed cleanly in the named run and never passed, so it ended with that run's exit code, tests and first failure; --no-cache runs it
tasks[].cached_failure.job_idstringRequired
uuidv7 rendered as job_<32 hex>
tasks[].cached_failure.task_idstringRequired
uuidv7 rendered as tsk_<32 hex>
tasks[].cached_fromobject or null
the run a cache hit stands on: the job and task whose success was recorded under the key, so a hit names where its verdict, log, junit and artifacts come from
tasks[].cached_from.job_idstringRequired
uuidv7 rendered as job_<32 hex>
tasks[].cached_from.task_idstringRequired
uuidv7 rendered as tsk_<32 hex>
tasks[].cached_targetsobject or null
a task split into per-target units: how many targets reused a recorded verdict
tasks[].cached_targets.hitintegerRequired
tasks[].cached_targets.ofintegerRequired
tasks[].cold_startstring or null
how warm the member was when it took the lease: warm was online before the job was submitted, started came online after it (the factory started it for the queue), first_after_boot was online before but this is its first lease since its bootOne of warm, started, first_after_boot
tasks[].cost_unitsinteger or null
tasks[].duration_msinteger or null
tasks[].exit_codeinteger or null
tasks[].expected_msinteger or null
how long the planner expects the task to run, from the repository's history or the kind default; shorter tasks lease first within a job
tasks[].finished_atstring (date-time) or null
tasks[].first_failureobject or null
the first failing line the worker saw, present from the moment it was seen
tasks[].first_failure.atstring (date-time)Required
the worker's clock when the line was seen
tasks[].first_failure.excerptarray of stringsRequired
tasks[].first_failure.kindstringRequired
what the first failing line of a task's log was: a compiler diagnostic, a test runner's failed case, a panic or uncaught exception, or nothing matched before a non-zero exitOne of compiler, test, panic, exit
tasks[].first_failure.linestringRequired
the matched line, trimmed
tasks[].first_failure.locationstring or null
path:line[:col] when the line or its excerpt names one
tasks[].first_failure.shardstring or null
k/N when the task is a shard
tasks[].first_failure.taskstringRequired
the namespaced task name
tasks[].first_failure.toolstringRequired
the detector rule that matched: rustc, nextest, tsc, pytest, shell for an exit,...
tasks[].fit_atstring (date-time) or null
tasks[].flaky_inputsarray of strings
the targets (or the task's name for its whole key) whose identical inputs both passed and failed on record: reported, never quarantined
tasks[].has_junitbooleanRequired
tasks[].labelsmap of any
what the queue matches a worker on: os and arch only when the submit or the manifest set them, toolchains, workspace_warm, and the manifest's own labels
tasks[].leased_atstring (date-time) or null
tasks[].log_bytesintegerRequired
tasks[].matrixmap of string
: the matrix cell's values, axis to value, so a client groups a task's cells; empty for a task without a matrix
tasks[].namestringRequired
tasks[].no_eligible_workerstring or null
why a queued task matches no online worker, counted per mismatch (os, arch, trust); absent once a worker could take it
tasks[].prepared_atstring (date-time) or null
tasks[].queued_atstring (date-time) or null
the phase marks of the current attempt (Neon item 4, Task::timeline): queued at submission; fit_at when an eligible member first existed for it; leased_at; prepared_at when the worker had the workspace ready; cold_start how warm the member was at the lease
tasks[].ready_atstring (date-time) or null
when the task became leasable: its submission for a root task, the moment its last dependency succeeded for a dependant
tasks[].refusalsarray of objects
the members that handed the task back for a reason of their own, oldest first
tasks[].refusals[].atstring (date-time)Required
tasks[].refusals[].reasonstringRequired
the worker's infra_error.code
tasks[].refusals[].workerstringRequired
the member's registered name (worker-6)
tasks[].refusals[].worker_idstringRequired
uuidv7 rendered as wrk_<32 hex>
tasks[].requeued_atstring (date-time) or null
when a lease of it was last given back and it queued again: its next lease's wait starts here
tasks[].shardstring or null
k/N
tasks[].slotsinteger or null
the worker slots the task's lease weighs, ceil(resources.memory / memory_per_slot) on the worker that took it; absent until leased
tasks[].started_atstring (date-time) or null
tasks[].statestringRequired
One of queued, leased, running, succeeded, failed, cancelled, timed_out, infra_error, skipped
tasks[].terminationstring or null
why the task stopped short of its own exit, or why it went back to the queue: oom, timeout, cancelled, worker_shutdown, lease_lost, or a host infra code; absent while nothing ended it. on a queued, leased or running task it names the previous attempt's end
tasks[].warningsobject or null
the warnings the worker collected from the task's log, bounded; present once the task reported
tasks[].warnings.by_kindarray of objects
tasks[].warnings.by_kind[].countintegerRequired
tasks[].warnings.by_kind[].kindstringRequired
tasks[].warnings.firstarray of objects
at most 20, in the order they were seen
tasks[].warnings.first[].filestring or null
tasks[].warnings.first[].kindstringRequired
tasks[].warnings.first[].lineinteger or null
tasks[].warnings.first[].lintstring or null
tasks[].warnings.first[].messagestringRequired
the first line of the warning, trimmed, at most 512 bytes
tasks[].warnings.totalintegerRequired
every occurrence the collector saw, repeats included
tasks[].warnings.uniqueintegerRequired
distinct (kind, file, lint) the collector kept, at most 200 per task
tasks[].worker_idstring or null
uuidv7 rendered as wrk_<32 hex>
treeobject or null
the verified working tree the job runs on; absent for a delta submission
tree.bytesintegerRequired
tree.entriesintegerRequired
tree.rootstringRequired
the root digest of a working tree: sha-256 of the root directory manifest
tree_schemainteger or null
the TREE_SCHEMA_VERSION tree.root was hashed under; absent when the client did not say
truststringRequired
tiers, with no order on purpose (amendment 2026-10-27): trusted_ci is protected-branch automation and the cache writer every tier reads, trusted_interactive a person's own work, and neither is "below" the other, so every rule over tiers names the tiers it meansOne of untrusted, trusted_ci, trusted_interactive
urlstringRequired
verify_msinteger or null
milliseconds the cell spent verifying tree before the job transaction; absent for a delta submission or a cell older than the field
budgetobjectRequired
Budget: returned in every job response and tool result
budget.concurrentobjectRequired
budget.concurrent.limitintegerRequired
budget.concurrent.usedintegerRequired
budget.dayobjectRequired
Spend
budget.day.jobsintegerRequired
budget.day.jobs_limitinteger or null
budget.day.limit_unitsinteger or null
budget.day.remaining_unitsinteger or null
budget.day.spent_unitsintegerRequired
budget.monthobject or null
the tenant's monthly budget, when one is set on platform or in the policy
budget.month.currencystring or null
budget.month.hard_limitbooleanRequired
budget.month.limit_amountinteger or null
budget.month.limit_unitsintegerRequired
budget.month.percent_usedintegerRequired
whole percent of the limit spent; past 100 when exceeded
budget.month.period_endstring (date-time)Required
the first instant of the next month (UTC), when the spend resets
budget.month.remaining_unitsintegerRequired
budget.month.sourcestringRequired
who set the monthly budgetOne of platform, tenant
budget.month.spent_amountinteger or null
budget.month.spent_unitsintegerRequired
budget.month.statestringRequired
where the month stands against its budgetOne of ok, warning, exceeded
budget.month.unit_price_microsinteger or null
micro units of currency per cost unit (1 EUR = 1,000,000), so a client prices any count of units exactly; absent without a platform price
budget.month.warn_at_percentintegerRequired
budget.rate_tablestringRequired
version of the cost-unit table
budget.resets_atstring (date-time)Required
budget.sessionobjectRequired
Spend
budget.session.jobsintegerRequired
budget.session.jobs_limitinteger or null
budget.session.limit_unitsinteger or null
budget.session.remaining_unitsinteger or null
budget.session.spent_unitsintegerRequired
deduplicated_fromstring or null
the first submitter's actor, never its credential
policyobjectRequired
Policy: the client-facing subset of
policy.allow_full_buildbooleanRequired
policy.default_kindstringRequired
check, test, build, lint or a manifest task id
policy.limitsobject or null
the tree caps of the tenant policy, served to every principal so the cli pre-checks a tree against the numbers the cell enforces instead of constants of its own; absent from an older cell, in which case the cli checks nothing locally and the cell answers 413
policy.limits.max_blob_bytesintegerRequired
policy.limits.max_tree_bytesintegerRequired
policy.limits.max_tree_entriesintegerRequired
policy.max_concurrent_per_actorintegerRequired
policy.truststringRequired
tiers, with no order on purpose (amendment 2026-10-27): trusted_ci is protected-branch automation and the cache writer every tier reads, trusted_interactive a person's own work, and neither is "below" the other, so every rule over tiers names the tiers it meansOne of untrusted, trusted_ci, trusted_interactive
policy.untrusted_refsarray of stringsRequired
submittedobject or null
on a deduplicated answer, what this request sent, for the client to compare with job
submitted.base_digeststringRequired
submitted.base_refstringRequired
submitted.tree_rootstring or null
the root digest of a working tree: sha-256 of the root directory manifest
submitted.tree_schemainteger or null
curl -X POST "$CIRESK_API/v1/ci/jobs" \
  -H "Authorization: Bearer $CIRESK_KEY" \
  -H "Idempotency-Key: ad8f34bd-99b3-458c-8dbf-4d3cca9a8c60" \
  -H "Content-Type: application/json" \
  -d '{
    "actor": "agent:claude-code",
    "base_digest": "feef45d804737fdf7a297e27e443d914551629de",
    "base_ref": "main",
    "budget_units": 2000,
    "client": "cli",
    "diff_digest": "sha256:2ee8d2702d84b778100050828d96e8def095c9a4871507f5757e124784173df3",
    "fail_fast": true,
    "full": false,
    "kind": "check",
    "labels": {
      "os": "linux"
    },
    "manifest_digest": "sha256:06d663911cadf74b2c54b4c4c73383abd01cb35c741369624bec204a17b4ea6c",
    "manifest_path": ".ciresk/ci.yaml",
    "no_cache": true,
    "no_dedup": false,
    "note": "acme/platform",
    "repo_id": "repo_0129354d7b6b4146ad16c315d960365b",
    "session": "s_4f2a9c",
    "targets": [
      "platform-api"
    ],
    "tree": {
      "bytes": 18432000,
      "entries": 1,
      "inline": [
        {
          "data_b64": "acme/platform",
          "digest": "sha256:c21fa32a40d82233c44e76e6ae776b4d403ac1a564ca26de95a14c6bb47eaf49"
        }
      ],
      "manifests": [
        {
          "data_b64": "acme/platform",
          "digest": "sha256:c21fa32a40d82233c44e76e6ae776b4d403ac1a564ca26de95a14c6bb47eaf49"
        }
      ],
      "parent_root": "sha256:7ab33a3a29d38ba8d833e1f2a7dda171ca0435fe79a5305d01a6466da27625d7",
      "root": "sha256:4827d3132b09e1cedc07788771ef7bca9c1140b2dff2ac370fc8433a94de43e5",
      "tree_schema": 1
    },
    "tree_id": "acme/platform",
    "tree_root": "sha256:f6d6c911b491012f14dea3f3004b6101280793ee31519604aecd29f823cca9db",
    "trust": "trusted_interactive"
  }'
GET/v1/ci/jobs/timing

List lease timing

Submit-to-lease p50/p95 per cold start label over the last 24 h, labs and audits left out.

Permission: ci:jobs.read

Response200 OK

requeuedobject or null
what requeues took back: the runs they lost, kept apart from the wait; absent from an older cell
requeued.leasesintegerRequired
requeued.lost_msintegerRequired
requeued.p50_msintegerRequired
requeued.p95_msintegerRequired
rowsarray of objectsRequired
rows[].cold_startstringRequired
how warm the member was when it took the lease: warm was online before the job was submitted, started came online after it (the factory started it for the queue), first_after_boot was online before but this is its first lease since its bootOne of warm, started, first_after_boot
rows[].leasesintegerRequired
rows[].p50_msintegerRequired
rows[].p95_msintegerRequired
sincestring (date-time)Required
curl "$CIRESK_API/v1/ci/jobs/timing" \
  -H "Authorization: Bearer $CIRESK_KEY"
GET/v1/ci/jobs/{id}

Get a job

A job with its tasks and budget.

Permission: ci:jobs.read

Parameters

NameTypeRequiredDescription
idpathstringRequiredThe job's ID.

Response200 OK

actorstringRequired
affectedobject or null
what expansion selected for the job and why, when the submission carried a tree
affected.changed_filesintegerRequired
distinct changed paths between the reference root and the submitted one
affected.escalatedbooleanRequired
affected.graph_rootstring or null
the root whose recorded graph answered; absent when none was read
affected.reasonstring or null
the condition column of's table, as crates/ci/affected words it
affected.reference_rootstring or null
the root the diff was taken against; absent for a first submission
affected.selectedintegerRequired
targets the tasks received through targets_arg; 0 when escalated (the full set runs)
affected.strategystringRequired
One of cargo, pnpm, go, turbo, nx, files, none
affected.totalinteger or null
nodes of the recorded graph, when one was read
base_digeststringRequired
commit sha
base_refstringRequired
ref name as submitted
clientstringRequired
cost_unitsinteger or null
created_atstring (date-time)Required
deduplicatedbooleanRequired
diff_digeststring or null
sha-256 digest as sha256:<64 hex>
duration_msinteger or null
exit_codeinteger or null
fail_fastboolean
the cell cancels the job's queued tasks at the first task that ends other than succeeded; a deduplicated job carries the first submitter's choice
finished_atstring (date-time) or null
fullbooleanRequired
idstringRequired
uuidv7 rendered as job_<32 hex>
kindstringRequired
check, test, build, lint or a manifest task id
no_cacheboolean
--no-cache: no task is served from the task cache; successes still record
principalstringRequired
priorityintegerRequired
repostringRequired
repo_idstringRequired
uuidv7 rendered as repo_<32 hex>
request_idstring or null
the X-Request-Id this answer was produced under, so a --json envelope can name it
sessionstring or null
started_atstring (date-time) or null
statestringRequired
One of queued, leased, running, succeeded, failed, cancelled, timed_out, infra_error
superseded_bystring or null
the newer job of the same submitter, branch, kind and targets that cancelled this one under the policy's cancel_in_progress; absent otherwise
targetsarray of stringsRequired
tasksarray of objects
absent on list rows and inside Summary.job
tasks[].approvalobject or null
: the task's approval gate; a gated task stays queued until it is approved
tasks[].approval.approversarray of strings
user:<id> and role:<name>; empty means any person holding ci:approvals.approve
tasks[].approval.commentstring or null
tasks[].approval.decided_atstring (date-time) or null
tasks[].approval.decided_bystring or null
tasks[].approval.expires_atstring (date-time)Required
tasks[].approval.reachedbooleanRequired
the task's dependencies have succeeded: an approval starts it at once
tasks[].approval.sod_exceptionboolean
the requester decided their own gate under the policy's approval_self: record
tasks[].approval.statestringRequired
One of pending, approved, rejected, expired
tasks[].artifact_countintegerRequired
tasks[].blocked_bystring or null
on a skipped task, the dependency whose end skipped it (build, build[1/2])
tasks[].cachestringRequired
how a task met the task cache: served without a run, looked up and run, recorded after the run, or never keyed (cache: false, cache: { results: false } or --no-cache)One of hit, miss, write, none
tasks[].cache_hitboolean
the task did not run: its key matched a recorded success; cached_from names it
tasks[].cache_notestring or null
why the task was neither answered from the cache nor recorded in it, when the cell knows a reason beyond "these inputs never passed": the manifest keeps it out, or the run changed a tracked path. ciresk ci explain-miss compares a miss with the last recorded run of the task
tasks[].cached_failureobject or null
the task did not run: its key failed cleanly in the named run and never passed, so it ended with that run's exit code, tests and first failure; --no-cache runs it
tasks[].cached_failure.job_idstringRequired
uuidv7 rendered as job_<32 hex>
tasks[].cached_failure.task_idstringRequired
uuidv7 rendered as tsk_<32 hex>
tasks[].cached_fromobject or null
the run a cache hit stands on: the job and task whose success was recorded under the key, so a hit names where its verdict, log, junit and artifacts come from
tasks[].cached_from.job_idstringRequired
uuidv7 rendered as job_<32 hex>
tasks[].cached_from.task_idstringRequired
uuidv7 rendered as tsk_<32 hex>
tasks[].cached_targetsobject or null
a task split into per-target units: how many targets reused a recorded verdict
tasks[].cached_targets.hitintegerRequired
tasks[].cached_targets.ofintegerRequired
tasks[].cold_startstring or null
how warm the member was when it took the lease: warm was online before the job was submitted, started came online after it (the factory started it for the queue), first_after_boot was online before but this is its first lease since its bootOne of warm, started, first_after_boot
tasks[].cost_unitsinteger or null
tasks[].duration_msinteger or null
tasks[].exit_codeinteger or null
tasks[].expected_msinteger or null
how long the planner expects the task to run, from the repository's history or the kind default; shorter tasks lease first within a job
tasks[].finished_atstring (date-time) or null
tasks[].first_failureobject or null
the first failing line the worker saw, present from the moment it was seen
tasks[].first_failure.atstring (date-time)Required
the worker's clock when the line was seen
tasks[].first_failure.excerptarray of stringsRequired
tasks[].first_failure.kindstringRequired
what the first failing line of a task's log was: a compiler diagnostic, a test runner's failed case, a panic or uncaught exception, or nothing matched before a non-zero exitOne of compiler, test, panic, exit
tasks[].first_failure.linestringRequired
the matched line, trimmed
tasks[].first_failure.locationstring or null
path:line[:col] when the line or its excerpt names one
tasks[].first_failure.shardstring or null
k/N when the task is a shard
tasks[].first_failure.taskstringRequired
the namespaced task name
tasks[].first_failure.toolstringRequired
the detector rule that matched: rustc, nextest, tsc, pytest, shell for an exit,...
tasks[].fit_atstring (date-time) or null
tasks[].flaky_inputsarray of strings
the targets (or the task's name for its whole key) whose identical inputs both passed and failed on record: reported, never quarantined
tasks[].has_junitbooleanRequired
tasks[].labelsmap of any
what the queue matches a worker on: os and arch only when the submit or the manifest set them, toolchains, workspace_warm, and the manifest's own labels
tasks[].leased_atstring (date-time) or null
tasks[].log_bytesintegerRequired
tasks[].matrixmap of string
: the matrix cell's values, axis to value, so a client groups a task's cells; empty for a task without a matrix
tasks[].namestringRequired
tasks[].no_eligible_workerstring or null
why a queued task matches no online worker, counted per mismatch (os, arch, trust); absent once a worker could take it
tasks[].prepared_atstring (date-time) or null
tasks[].queued_atstring (date-time) or null
the phase marks of the current attempt (Neon item 4, Task::timeline): queued at submission; fit_at when an eligible member first existed for it; leased_at; prepared_at when the worker had the workspace ready; cold_start how warm the member was at the lease
tasks[].ready_atstring (date-time) or null
when the task became leasable: its submission for a root task, the moment its last dependency succeeded for a dependant
tasks[].refusalsarray of objects
the members that handed the task back for a reason of their own, oldest first
tasks[].refusals[].atstring (date-time)Required
tasks[].refusals[].reasonstringRequired
the worker's infra_error.code
tasks[].refusals[].workerstringRequired
the member's registered name (worker-6)
tasks[].refusals[].worker_idstringRequired
uuidv7 rendered as wrk_<32 hex>
tasks[].requeued_atstring (date-time) or null
when a lease of it was last given back and it queued again: its next lease's wait starts here
tasks[].shardstring or null
k/N
tasks[].slotsinteger or null
the worker slots the task's lease weighs, ceil(resources.memory / memory_per_slot) on the worker that took it; absent until leased
tasks[].started_atstring (date-time) or null
tasks[].statestringRequired
One of queued, leased, running, succeeded, failed, cancelled, timed_out, infra_error, skipped
tasks[].terminationstring or null
why the task stopped short of its own exit, or why it went back to the queue: oom, timeout, cancelled, worker_shutdown, lease_lost, or a host infra code; absent while nothing ended it. on a queued, leased or running task it names the previous attempt's end
tasks[].warningsobject or null
the warnings the worker collected from the task's log, bounded; present once the task reported
tasks[].warnings.by_kindarray of objects
tasks[].warnings.by_kind[].countintegerRequired
tasks[].warnings.by_kind[].kindstringRequired
tasks[].warnings.firstarray of objects
at most 20, in the order they were seen
tasks[].warnings.first[].filestring or null
tasks[].warnings.first[].kindstringRequired
tasks[].warnings.first[].lineinteger or null
tasks[].warnings.first[].lintstring or null
tasks[].warnings.first[].messagestringRequired
the first line of the warning, trimmed, at most 512 bytes
tasks[].warnings.totalintegerRequired
every occurrence the collector saw, repeats included
tasks[].warnings.uniqueintegerRequired
distinct (kind, file, lint) the collector kept, at most 200 per task
tasks[].worker_idstring or null
uuidv7 rendered as wrk_<32 hex>
treeobject or null
the verified working tree the job runs on; absent for a delta submission
tree.bytesintegerRequired
tree.entriesintegerRequired
tree.rootstringRequired
the root digest of a working tree: sha-256 of the root directory manifest
tree_schemainteger or null
the TREE_SCHEMA_VERSION tree.root was hashed under; absent when the client did not say
truststringRequired
tiers, with no order on purpose (amendment 2026-10-27): trusted_ci is protected-branch automation and the cache writer every tier reads, trusted_interactive a person's own work, and neither is "below" the other, so every rule over tiers names the tiers it meansOne of untrusted, trusted_ci, trusted_interactive
urlstringRequired
verify_msinteger or null
milliseconds the cell spent verifying tree before the job transaction; absent for a delta submission or a cell older than the field
budgetobjectRequired
Budget: returned in every job response and tool result
budget.concurrentobjectRequired
budget.concurrent.limitintegerRequired
budget.concurrent.usedintegerRequired
budget.dayobjectRequired
Spend
budget.day.jobsintegerRequired
budget.day.jobs_limitinteger or null
budget.day.limit_unitsinteger or null
budget.day.remaining_unitsinteger or null
budget.day.spent_unitsintegerRequired
budget.monthobject or null
the tenant's monthly budget, when one is set on platform or in the policy
budget.month.currencystring or null
budget.month.hard_limitbooleanRequired
budget.month.limit_amountinteger or null
budget.month.limit_unitsintegerRequired
budget.month.percent_usedintegerRequired
whole percent of the limit spent; past 100 when exceeded
budget.month.period_endstring (date-time)Required
the first instant of the next month (UTC), when the spend resets
budget.month.remaining_unitsintegerRequired
budget.month.sourcestringRequired
who set the monthly budgetOne of platform, tenant
budget.month.spent_amountinteger or null
budget.month.spent_unitsintegerRequired
budget.month.statestringRequired
where the month stands against its budgetOne of ok, warning, exceeded
budget.month.unit_price_microsinteger or null
micro units of currency per cost unit (1 EUR = 1,000,000), so a client prices any count of units exactly; absent without a platform price
budget.month.warn_at_percentintegerRequired
budget.rate_tablestringRequired
version of the cost-unit table
budget.resets_atstring (date-time)Required
budget.sessionobjectRequired
Spend
budget.session.jobsintegerRequired
budget.session.jobs_limitinteger or null
budget.session.limit_unitsinteger or null
budget.session.remaining_unitsinteger or null
budget.session.spent_unitsintegerRequired
deduplicated_fromstring or null
the first submitter's actor, never its credential
policyobjectRequired
Policy: the client-facing subset of
policy.allow_full_buildbooleanRequired
policy.default_kindstringRequired
check, test, build, lint or a manifest task id
policy.limitsobject or null
the tree caps of the tenant policy, served to every principal so the cli pre-checks a tree against the numbers the cell enforces instead of constants of its own; absent from an older cell, in which case the cli checks nothing locally and the cell answers 413
policy.limits.max_blob_bytesintegerRequired
policy.limits.max_tree_bytesintegerRequired
policy.limits.max_tree_entriesintegerRequired
policy.max_concurrent_per_actorintegerRequired
policy.truststringRequired
tiers, with no order on purpose (amendment 2026-10-27): trusted_ci is protected-branch automation and the cache writer every tier reads, trusted_interactive a person's own work, and neither is "below" the other, so every rule over tiers names the tiers it meansOne of untrusted, trusted_ci, trusted_interactive
policy.untrusted_refsarray of stringsRequired
submittedobject or null
on a deduplicated answer, what this request sent, for the client to compare with job
submitted.base_digeststringRequired
submitted.base_refstringRequired
submitted.tree_rootstring or null
the root digest of a working tree: sha-256 of the root directory manifest
submitted.tree_schemainteger or null
curl "$CIRESK_API/v1/ci/jobs/job_0109badfc220cd056b2c0e862ac73d40" \
  -H "Authorization: Bearer $CIRESK_KEY"
POST/v1/ci/jobs/{id}/cancel

Cancel a job

Request cancellation.

Permission: ci:jobs.cancel

Parameters

NameTypeRequiredDescription
idpathstringRequiredThe job's ID.

Request body

reasonstring or null
remaining_onlyboolean
fail-fast: only the queued tasks end cancelled; running tasks finish and report, and the job's state comes from them, so a failure stays failed

Response200 OK

budgetobject or null
Budget: returned in every job response and tool result
budget.concurrentobjectRequired
budget.concurrent.limitintegerRequired
budget.concurrent.usedintegerRequired
budget.dayobjectRequired
Spend
budget.day.jobsintegerRequired
budget.day.jobs_limitinteger or null
budget.day.limit_unitsinteger or null
budget.day.remaining_unitsinteger or null
budget.day.spent_unitsintegerRequired
budget.monthobject or null
the tenant's monthly budget, when one is set on platform or in the policy
budget.month.currencystring or null
budget.month.hard_limitbooleanRequired
budget.month.limit_amountinteger or null
budget.month.limit_unitsintegerRequired
budget.month.percent_usedintegerRequired
whole percent of the limit spent; past 100 when exceeded
budget.month.period_endstring (date-time)Required
the first instant of the next month (UTC), when the spend resets
budget.month.remaining_unitsintegerRequired
budget.month.sourcestringRequired
who set the monthly budgetOne of platform, tenant
budget.month.spent_amountinteger or null
budget.month.spent_unitsintegerRequired
budget.month.statestringRequired
where the month stands against its budgetOne of ok, warning, exceeded
budget.month.unit_price_microsinteger or null
micro units of currency per cost unit (1 EUR = 1,000,000), so a client prices any count of units exactly; absent without a platform price
budget.month.warn_at_percentintegerRequired
budget.rate_tablestringRequired
version of the cost-unit table
budget.resets_atstring (date-time)Required
budget.sessionobjectRequired
Spend
budget.session.jobsintegerRequired
budget.session.jobs_limitinteger or null
budget.session.limit_unitsinteger or null
budget.session.remaining_unitsinteger or null
budget.session.spent_unitsintegerRequired
cancelledbooleanRequired
idstringRequired
uuidv7 rendered as job_<32 hex>
statestringRequired
One of queued, leased, running, succeeded, failed, cancelled, timed_out, infra_error
curl -X POST "$CIRESK_API/v1/ci/jobs/job_0109badfc220cd056b2c0e862ac73d40/cancel" \
  -H "Authorization: Bearer $CIRESK_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "reason": null,
    "remaining_only": true
  }'
GET/v1/ci/jobs/{id}/events

Stream a job's events

The job's journal as server-sent events.

Permission: ci:events.read

Parameters

NameTypeRequiredDescription
idpathstringRequiredThe job's ID.
sincequerystringOptional

Response200 OK

atstring (date-time)Required
base_refstringRequired
budgetobject or null
Budget: returned in every job response and tool result
budget.concurrentobjectRequired
budget.concurrent.limitintegerRequired
budget.concurrent.usedintegerRequired
budget.dayobjectRequired
Spend
budget.day.jobsintegerRequired
budget.day.jobs_limitinteger or null
budget.day.limit_unitsinteger or null
budget.day.remaining_unitsinteger or null
budget.day.spent_unitsintegerRequired
budget.monthobject or null
the tenant's monthly budget, when one is set on platform or in the policy
budget.month.currencystring or null
budget.month.hard_limitbooleanRequired
budget.month.limit_amountinteger or null
budget.month.limit_unitsintegerRequired
budget.month.percent_usedintegerRequired
whole percent of the limit spent; past 100 when exceeded
budget.month.period_endstring (date-time)Required
the first instant of the next month (UTC), when the spend resets
budget.month.remaining_unitsintegerRequired
budget.month.sourcestringRequired
who set the monthly budgetOne of platform, tenant
budget.month.spent_amountinteger or null
budget.month.spent_unitsintegerRequired
budget.month.statestringRequired
where the month stands against its budgetOne of ok, warning, exceeded
budget.month.unit_price_microsinteger or null
micro units of currency per cost unit (1 EUR = 1,000,000), so a client prices any count of units exactly; absent without a platform price
budget.month.warn_at_percentintegerRequired
budget.rate_tablestringRequired
version of the cost-unit table
budget.resets_atstring (date-time)Required
budget.sessionobjectRequired
Spend
budget.session.jobsintegerRequired
budget.session.jobs_limitinteger or null
budget.session.limit_unitsinteger or null
budget.session.remaining_unitsinteger or null
budget.session.spent_unitsintegerRequired
cost_unitsinteger or null
duration_msinteger or null
eventstringRequired
the journal kinds of and; the sse event: nameOne of job.created, job.deduplicated, job.leased, job.started, job.finished, job.cancelled, job.fail_fast, task.queued, task.leased, task.started, task.finished, task.requeued, task.cancelled, task.first_failure, task.warnings, task.approval_requested, task.approval_decided, task.approval_expired, lease.renewed, lease.expired, budget.reserved, budget.charged
exit_codeinteger or null
failing_testsarray of objects
up to 20, terminal events only
failing_tests[].filestring or null
failing_tests[].lineinteger or null
failing_tests[].messagestring or null
failing_tests[].namestringRequired
first_failureobject or null
task.first_failure events only
first_failure.atstring (date-time)Required
the worker's clock when the line was seen
first_failure.excerptarray of stringsRequired
first_failure.kindstringRequired
what the first failing line of a task's log was: a compiler diagnostic, a test runner's failed case, a panic or uncaught exception, or nothing matched before a non-zero exitOne of compiler, test, panic, exit
first_failure.linestringRequired
the matched line, trimmed
first_failure.locationstring or null
path:line[:col] when the line or its excerpt names one
first_failure.shardstring or null
k/N when the task is a shard
first_failure.taskstringRequired
the namespaced task name
first_failure.toolstringRequired
the detector rule that matched: rustc, nextest, tsc, pytest, shell for an exit,...
job_idstringRequired
uuidv7 rendered as job_<32 hex>
kindstringRequired
check, test, build, lint or a manifest task id
repo_idstringRequired
uuidv7 rendered as repo_<32 hex>
schema_versionintegerRequired
seqintegerRequired
per-job sequence from the journal; the sse id:
statestringRequired
One of queued, leased, running, succeeded, failed, cancelled, timed_out, infra_error
tailarray of strings
last 50 lines of the first failing task, terminal events only
taskobject or null
task.exit_codeinteger or null
task.idstringRequired
uuidv7 rendered as tsk_<32 hex>
task.namestringRequired
task.shardstring or null
task.statestringRequired
One of queued, leased, running, succeeded, failed, cancelled, timed_out, infra_error, skipped
urlsobjectRequired
api urls in v1 (the console url is p5)
urls.artifactsstringRequired
urls.logstringRequired
urls.summarystringRequired
urls.testsstringRequired
warningsobject or null
task.warnings events only
warnings.by_kindarray of objects
warnings.by_kind[].countintegerRequired
warnings.by_kind[].kindstringRequired
warnings.firstarray of objects
at most 20, in the order they were seen
warnings.first[].filestring or null
warnings.first[].kindstringRequired
warnings.first[].lineinteger or null
warnings.first[].lintstring or null
warnings.first[].messagestringRequired
the first line of the warning, trimmed, at most 512 bytes
warnings.totalintegerRequired
every occurrence the collector saw, repeats included
warnings.uniqueintegerRequired
distinct (kind, file, lint) the collector kept, at most 200 per task
curl "$CIRESK_API/v1/ci/jobs/job_0109badfc220cd056b2c0e862ac73d40/events" \
  -H "Authorization: Bearer $CIRESK_KEY"
GET/v1/ci/jobs/{id}/explain-miss

Get cache misses

Why each task the task cache did not answer missed, against the last recorded run of it.

Permission: ci:jobs.read

Parameters

NameTypeRequiredDescription
idpathstringRequiredThe job's ID.
taskquerystringOptional

Response200 OK

job_idstringRequired
uuidv7 rendered as job_<32 hex>
tasksarray of objectsRequired
tasks[].cachestringRequired
how a task met the task cache: served without a run, looked up and run, recorded after the run, or never keyed (cache: false, cache: { results: false } or --no-cache)One of hit, miss, write, none
tasks[].changedarray of strings
the key items that differ from that run: run, cwd, env, inputs, global_inputs, toolchains, files, manifest
tasks[].changed_filesarray of strings
the input files that differ from that run, repository-relative and sorted, at most [TaskMiss::MAX_FILES]
tasks[].changed_files_totalinteger
every input file that differs, past the cap included
tasks[].compared_withobject or null
the run it was compared with
tasks[].compared_with.job_idstringRequired
uuidv7 rendered as job_<32 hex>
tasks[].compared_with.task_idstringRequired
uuidv7 rendered as tsk_<32 hex>
tasks[].keystring or null
sha-256 digest as sha256:<64 hex>
tasks[].reasonstringRequired
the cause in one word: no_cache, disabled, not_recorded, failed, not_keyed, first_run, changed or same_key
tasks[].taskstringRequired
name, or name[k/N] for a shard
tasks[].whyarray of stringsRequired
the cause in sentences, the first one the cause itself
curl "$CIRESK_API/v1/ci/jobs/job_0109badfc220cd056b2c0e862ac73d40/explain-miss" \
  -H "Authorization: Bearer $CIRESK_KEY"
GET/v1/ci/jobs/{id}/summary

Get a job's summary

The bounded verdict.

Permission: ci:jobs.read

Parameters

NameTypeRequiredDescription
idpathstringRequiredThe job's ID.
formatquerystringOptional
tailquerystringOptional

Response200 OK

approvalsarray of objects
the job's gates waiting for a person's decision
approvals[].actorstringRequired
who asks, as a person reads it: Claude Code · user:user_01J8...
approvals[].approvestringRequired
the command a person runs to approve it
approvals[].approversarray of strings
approvals[].expires_atstring (date-time)Required
approvals[].jobstringRequired
uuidv7 rendered as job_<32 hex>
approvals[].notestring or null
the submitter's one line for the person: untrusted text, shown and never interpreted
approvals[].reachedbooleanRequired
approvals[].repostringRequired
approvals[].requested_atstring (date-time)Required
approvals[].requesterstringRequired
the job's requester (user:..., key:..., agent:...)
approvals[].taskstringRequired
the task row's name: deploy, or a matrix cell deploy[region=eu]
cacheobjectRequired
cache.hitsintegerRequired
cache.missesintegerRequired
cache.publicobject or null
the job's tasks' registry downloads answered by the workers' public cache; absent when no task reported any
cache.public.bytesintegerRequired
cache.public.hitsintegerRequired
cache.public.missesintegerRequired
cache.writesintegerRequired
criticalobject or null
the job's critical path from its task rows; absent until a worker ran a task, and from an older cell
critical.edge_msintegerRequired
critical.post_run_msintegerRequired
critical.prepare_msintegerRequired
critical.queue_msintegerRequired
critical.run_msintegerRequired
critical.tasksarray of stringsRequired
the tasks on it, first to last, name or name[k/N]; a task the api completed is walked through
critical.total_msintegerRequired
critical_pathstring or null
the job's critical path as one line, fmt → clippy-rust (4m 12s: edges 3.1s, queue 6.0s, prepare 9.2s, run 3m 50s, post-run 3.4s); critical holds the numbers
fail_fastobject or null
present once the cell's fail-fast cut the job: the task that triggered it and how many queued tasks never ran
fail_fast.cancelledintegerRequired
fail_fast.taskstringRequired
failing_testsarray of objectsRequired
at most 20
failing_tests[].duration_msintegerRequired
failing_tests[].filestring or null
failing_tests[].lineinteger or null
failing_tests[].messagestring or null
first 5 lines
failing_tests[].namestringRequired
failing_tests[].shardstring or null
failing_tests[].stackarray of strings
the first 20 frames of the failure, one per entry
failing_tests[].started_atstring (date-time) or null
when the test started, where the runner's report says (nextest's testcase timestamp); with duration_ms the run's timeline. absent from other runners and on rows ingested before it
failing_tests[].statusstringRequired
One of passed, failed, skipped, flaky
failing_tests[].stderr_tailstring or null
only in detailed
failing_tests[].stdout_tailstring or null
only in detailed
failing_tests[].suitestring or null
the class, package or file the runner grouped the test under; absent on rows ingested before P5
failing_tests[].taskstringRequired
failing_tests[].truncatedboolean
a message, stack or tail was cut at the ingestion bounds
failing_tests_totalintegerRequired
first_failed_taskstring or null
first_failureobject or null
the first failed task's first failing line and its excerpt
first_failure.atstring (date-time)Required
the worker's clock when the line was seen
first_failure.excerptarray of stringsRequired
first_failure.kindstringRequired
what the first failing line of a task's log was: a compiler diagnostic, a test runner's failed case, a panic or uncaught exception, or nothing matched before a non-zero exitOne of compiler, test, panic, exit
first_failure.linestringRequired
the matched line, trimmed
first_failure.locationstring or null
path:line[:col] when the line or its excerpt names one
first_failure.shardstring or null
k/N when the task is a shard
first_failure.taskstringRequired
the namespaced task name
first_failure.toolstringRequired
the detector rule that matched: rustc, nextest, tsc, pytest, shell for an exit,...
first_no_msinteger or null
milliseconds from submission to the first "no": the first task.first_failure or the first task that ended other than succeeded, else the verdict when it is not a success; absent while nothing failed
jobobjectRequired
without tasks
job.actorstringRequired
job.affectedobject or null
what expansion selected for the job and why, when the submission carried a tree
job.affected.changed_filesintegerRequired
distinct changed paths between the reference root and the submitted one
job.affected.escalatedbooleanRequired
job.affected.graph_rootstring or null
the root whose recorded graph answered; absent when none was read
job.affected.reasonstring or null
the condition column of's table, as crates/ci/affected words it
job.affected.reference_rootstring or null
the root the diff was taken against; absent for a first submission
job.affected.selectedintegerRequired
targets the tasks received through targets_arg; 0 when escalated (the full set runs)
job.affected.strategystringRequired
One of cargo, pnpm, go, turbo, nx, files, none
job.affected.totalinteger or null
nodes of the recorded graph, when one was read
job.base_digeststringRequired
commit sha
job.base_refstringRequired
ref name as submitted
job.clientstringRequired
job.cost_unitsinteger or null
job.created_atstring (date-time)Required
job.deduplicatedbooleanRequired
job.diff_digeststring or null
sha-256 digest as sha256:<64 hex>
job.duration_msinteger or null
job.exit_codeinteger or null
job.fail_fastboolean
the cell cancels the job's queued tasks at the first task that ends other than succeeded; a deduplicated job carries the first submitter's choice
job.finished_atstring (date-time) or null
job.fullbooleanRequired
job.idstringRequired
uuidv7 rendered as job_<32 hex>
job.kindstringRequired
check, test, build, lint or a manifest task id
job.no_cacheboolean
--no-cache: no task is served from the task cache; successes still record
job.principalstringRequired
job.priorityintegerRequired
job.repostringRequired
job.repo_idstringRequired
uuidv7 rendered as repo_<32 hex>
job.request_idstring or null
the X-Request-Id this answer was produced under, so a --json envelope can name it
job.sessionstring or null
job.started_atstring (date-time) or null
job.statestringRequired
One of queued, leased, running, succeeded, failed, cancelled, timed_out, infra_error
job.superseded_bystring or null
the newer job of the same submitter, branch, kind and targets that cancelled this one under the policy's cancel_in_progress; absent otherwise
job.targetsarray of stringsRequired
job.tasksarray of objects
absent on list rows and inside Summary.job
job.tasks[].approvalobject or null
: the task's approval gate; a gated task stays queued until it is approved
job.tasks[].approval.approversarray of strings
user:<id> and role:<name>; empty means any person holding ci:approvals.approve
job.tasks[].approval.commentstring or null
job.tasks[].approval.decided_atstring (date-time) or null
job.tasks[].approval.decided_bystring or null
job.tasks[].approval.expires_atstring (date-time)Required
job.tasks[].approval.reachedbooleanRequired
the task's dependencies have succeeded: an approval starts it at once
job.tasks[].approval.sod_exceptionboolean
the requester decided their own gate under the policy's approval_self: record
job.tasks[].approval.statestringRequired
One of pending, approved, rejected, expired
job.tasks[].artifact_countintegerRequired
job.tasks[].blocked_bystring or null
on a skipped task, the dependency whose end skipped it (build, build[1/2])
job.tasks[].cachestringRequired
how a task met the task cache: served without a run, looked up and run, recorded after the run, or never keyed (cache: false, cache: { results: false } or --no-cache)One of hit, miss, write, none
job.tasks[].cache_hitboolean
the task did not run: its key matched a recorded success; cached_from names it
job.tasks[].cache_notestring or null
why the task was neither answered from the cache nor recorded in it, when the cell knows a reason beyond "these inputs never passed": the manifest keeps it out, or the run changed a tracked path. ciresk ci explain-miss compares a miss with the last recorded run of the task
job.tasks[].cached_failureobject or null
the task did not run: its key failed cleanly in the named run and never passed, so it ended with that run's exit code, tests and first failure; --no-cache runs it
job.tasks[].cached_failure.job_idstringRequired
uuidv7 rendered as job_<32 hex>
job.tasks[].cached_failure.task_idstringRequired
uuidv7 rendered as tsk_<32 hex>
job.tasks[].cached_fromobject or null
the run a cache hit stands on: the job and task whose success was recorded under the key, so a hit names where its verdict, log, junit and artifacts come from
job.tasks[].cached_from.job_idstringRequired
uuidv7 rendered as job_<32 hex>
job.tasks[].cached_from.task_idstringRequired
uuidv7 rendered as tsk_<32 hex>
job.tasks[].cached_targetsobject or null
a task split into per-target units: how many targets reused a recorded verdict
job.tasks[].cached_targets.hitintegerRequired
job.tasks[].cached_targets.ofintegerRequired
job.tasks[].cold_startstring or null
how warm the member was when it took the lease: warm was online before the job was submitted, started came online after it (the factory started it for the queue), first_after_boot was online before but this is its first lease since its bootOne of warm, started, first_after_boot
job.tasks[].cost_unitsinteger or null
job.tasks[].duration_msinteger or null
job.tasks[].exit_codeinteger or null
job.tasks[].expected_msinteger or null
how long the planner expects the task to run, from the repository's history or the kind default; shorter tasks lease first within a job
job.tasks[].finished_atstring (date-time) or null
job.tasks[].first_failureobject or null
the first failing line the worker saw, present from the moment it was seen
job.tasks[].first_failure.atstring (date-time)Required
the worker's clock when the line was seen
job.tasks[].first_failure.excerptarray of stringsRequired
job.tasks[].first_failure.kindstringRequired
what the first failing line of a task's log was: a compiler diagnostic, a test runner's failed case, a panic or uncaught exception, or nothing matched before a non-zero exitOne of compiler, test, panic, exit
job.tasks[].first_failure.linestringRequired
the matched line, trimmed
job.tasks[].first_failure.locationstring or null
path:line[:col] when the line or its excerpt names one
job.tasks[].first_failure.shardstring or null
k/N when the task is a shard
job.tasks[].first_failure.taskstringRequired
the namespaced task name
job.tasks[].first_failure.toolstringRequired
the detector rule that matched: rustc, nextest, tsc, pytest, shell for an exit,...
job.tasks[].fit_atstring (date-time) or null
job.tasks[].flaky_inputsarray of strings
the targets (or the task's name for its whole key) whose identical inputs both passed and failed on record: reported, never quarantined
job.tasks[].has_junitbooleanRequired
job.tasks[].labelsmap of any
what the queue matches a worker on: os and arch only when the submit or the manifest set them, toolchains, workspace_warm, and the manifest's own labels
job.tasks[].leased_atstring (date-time) or null
job.tasks[].log_bytesintegerRequired
job.tasks[].matrixmap of string
: the matrix cell's values, axis to value, so a client groups a task's cells; empty for a task without a matrix
job.tasks[].namestringRequired
job.tasks[].no_eligible_workerstring or null
why a queued task matches no online worker, counted per mismatch (os, arch, trust); absent once a worker could take it
job.tasks[].prepared_atstring (date-time) or null
job.tasks[].queued_atstring (date-time) or null
the phase marks of the current attempt (Neon item 4, Task::timeline): queued at submission; fit_at when an eligible member first existed for it; leased_at; prepared_at when the worker had the workspace ready; cold_start how warm the member was at the lease
job.tasks[].ready_atstring (date-time) or null
when the task became leasable: its submission for a root task, the moment its last dependency succeeded for a dependant
job.tasks[].refusalsarray of objects
the members that handed the task back for a reason of their own, oldest first
job.tasks[].refusals[].atstring (date-time)Required
job.tasks[].refusals[].reasonstringRequired
the worker's infra_error.code
job.tasks[].refusals[].workerstringRequired
the member's registered name (worker-6)
job.tasks[].refusals[].worker_idstringRequired
uuidv7 rendered as wrk_<32 hex>
job.tasks[].requeued_atstring (date-time) or null
when a lease of it was last given back and it queued again: its next lease's wait starts here
job.tasks[].shardstring or null
k/N
job.tasks[].slotsinteger or null
the worker slots the task's lease weighs, ceil(resources.memory / memory_per_slot) on the worker that took it; absent until leased
job.tasks[].started_atstring (date-time) or null
job.tasks[].statestringRequired
One of queued, leased, running, succeeded, failed, cancelled, timed_out, infra_error, skipped
job.tasks[].terminationstring or null
why the task stopped short of its own exit, or why it went back to the queue: oom, timeout, cancelled, worker_shutdown, lease_lost, or a host infra code; absent while nothing ended it. on a queued, leased or running task it names the previous attempt's end
job.tasks[].warningsobject or null
the warnings the worker collected from the task's log, bounded; present once the task reported
job.tasks[].warnings.by_kindarray of objects
job.tasks[].warnings.firstarray of objects
at most 20, in the order they were seen
job.tasks[].warnings.totalintegerRequired
every occurrence the collector saw, repeats included
job.tasks[].warnings.uniqueintegerRequired
distinct (kind, file, lint) the collector kept, at most 200 per task
job.tasks[].worker_idstring or null
uuidv7 rendered as wrk_<32 hex>
job.treeobject or null
the verified working tree the job runs on; absent for a delta submission
job.tree.bytesintegerRequired
job.tree.entriesintegerRequired
job.tree.rootstringRequired
the root digest of a working tree: sha-256 of the root directory manifest
job.tree_schemainteger or null
the TREE_SCHEMA_VERSION tree.root was hashed under; absent when the client did not say
job.truststringRequired
tiers, with no order on purpose (amendment 2026-10-27): trusted_ci is protected-branch automation and the cache writer every tier reads, trusted_interactive a person's own work, and neither is "below" the other, so every rule over tiers names the tiers it meansOne of untrusted, trusted_ci, trusted_interactive
job.urlstringRequired
job.verify_msinteger or null
milliseconds the cell spent verifying tree before the job transaction; absent for a delta submission or a cell older than the field
nextstringRequired
the exact drill-down command or tool call
request_idstring or null
the X-Request-Id this answer was produced under
tailarray of stringsRequired
last tail lines of the first failed task
tail_taskstring or null
tasksarray of objectsRequired
tasks[].approvalobject or null
: the task's approval gate; a gated task stays queued until it is approved
tasks[].approval.approversarray of strings
user:<id> and role:<name>; empty means any person holding ci:approvals.approve
tasks[].approval.commentstring or null
tasks[].approval.decided_atstring (date-time) or null
tasks[].approval.decided_bystring or null
tasks[].approval.expires_atstring (date-time)Required
tasks[].approval.reachedbooleanRequired
the task's dependencies have succeeded: an approval starts it at once
tasks[].approval.sod_exceptionboolean
the requester decided their own gate under the policy's approval_self: record
tasks[].approval.statestringRequired
One of pending, approved, rejected, expired
tasks[].artifact_countintegerRequired
tasks[].blocked_bystring or null
on a skipped task, the dependency whose end skipped it (build, build[1/2])
tasks[].cachestringRequired
how a task met the task cache: served without a run, looked up and run, recorded after the run, or never keyed (cache: false, cache: { results: false } or --no-cache)One of hit, miss, write, none
tasks[].cache_hitboolean
the task did not run: its key matched a recorded success; cached_from names it
tasks[].cache_notestring or null
why the task was neither answered from the cache nor recorded in it, when the cell knows a reason beyond "these inputs never passed": the manifest keeps it out, or the run changed a tracked path. ciresk ci explain-miss compares a miss with the last recorded run of the task
tasks[].cached_failureobject or null
the task did not run: its key failed cleanly in the named run and never passed, so it ended with that run's exit code, tests and first failure; --no-cache runs it
tasks[].cached_failure.job_idstringRequired
uuidv7 rendered as job_<32 hex>
tasks[].cached_failure.task_idstringRequired
uuidv7 rendered as tsk_<32 hex>
tasks[].cached_fromobject or null
the run a cache hit stands on: the job and task whose success was recorded under the key, so a hit names where its verdict, log, junit and artifacts come from
tasks[].cached_from.job_idstringRequired
uuidv7 rendered as job_<32 hex>
tasks[].cached_from.task_idstringRequired
uuidv7 rendered as tsk_<32 hex>
tasks[].cached_targetsobject or null
a task split into per-target units: how many targets reused a recorded verdict
tasks[].cached_targets.hitintegerRequired
tasks[].cached_targets.ofintegerRequired
tasks[].cold_startstring or null
how warm the member was when it took the lease: warm was online before the job was submitted, started came online after it (the factory started it for the queue), first_after_boot was online before but this is its first lease since its bootOne of warm, started, first_after_boot
tasks[].cost_unitsinteger or null
tasks[].duration_msinteger or null
tasks[].exit_codeinteger or null
tasks[].expected_msinteger or null
how long the planner expects the task to run, from the repository's history or the kind default; shorter tasks lease first within a job
tasks[].finished_atstring (date-time) or null
tasks[].first_failureobject or null
the first failing line the worker saw, present from the moment it was seen
tasks[].first_failure.atstring (date-time)Required
the worker's clock when the line was seen
tasks[].first_failure.excerptarray of stringsRequired
tasks[].first_failure.kindstringRequired
what the first failing line of a task's log was: a compiler diagnostic, a test runner's failed case, a panic or uncaught exception, or nothing matched before a non-zero exitOne of compiler, test, panic, exit
tasks[].first_failure.linestringRequired
the matched line, trimmed
tasks[].first_failure.locationstring or null
path:line[:col] when the line or its excerpt names one
tasks[].first_failure.shardstring or null
k/N when the task is a shard
tasks[].first_failure.taskstringRequired
the namespaced task name
tasks[].first_failure.toolstringRequired
the detector rule that matched: rustc, nextest, tsc, pytest, shell for an exit,...
tasks[].fit_atstring (date-time) or null
tasks[].flaky_inputsarray of strings
the targets (or the task's name for its whole key) whose identical inputs both passed and failed on record: reported, never quarantined
tasks[].has_junitbooleanRequired
tasks[].labelsmap of any
what the queue matches a worker on: os and arch only when the submit or the manifest set them, toolchains, workspace_warm, and the manifest's own labels
tasks[].leased_atstring (date-time) or null
tasks[].log_bytesintegerRequired
tasks[].matrixmap of string
: the matrix cell's values, axis to value, so a client groups a task's cells; empty for a task without a matrix
tasks[].namestringRequired
tasks[].no_eligible_workerstring or null
why a queued task matches no online worker, counted per mismatch (os, arch, trust); absent once a worker could take it
tasks[].prepared_atstring (date-time) or null
tasks[].queued_atstring (date-time) or null
the phase marks of the current attempt (Neon item 4, Task::timeline): queued at submission; fit_at when an eligible member first existed for it; leased_at; prepared_at when the worker had the workspace ready; cold_start how warm the member was at the lease
tasks[].ready_atstring (date-time) or null
when the task became leasable: its submission for a root task, the moment its last dependency succeeded for a dependant
tasks[].refusalsarray of objects
the members that handed the task back for a reason of their own, oldest first
tasks[].refusals[].atstring (date-time)Required
tasks[].refusals[].reasonstringRequired
the worker's infra_error.code
tasks[].refusals[].workerstringRequired
the member's registered name (worker-6)
tasks[].refusals[].worker_idstringRequired
uuidv7 rendered as wrk_<32 hex>
tasks[].requeued_atstring (date-time) or null
when a lease of it was last given back and it queued again: its next lease's wait starts here
tasks[].shardstring or null
k/N
tasks[].slotsinteger or null
the worker slots the task's lease weighs, ceil(resources.memory / memory_per_slot) on the worker that took it; absent until leased
tasks[].started_atstring (date-time) or null
tasks[].statestringRequired
One of queued, leased, running, succeeded, failed, cancelled, timed_out, infra_error, skipped
tasks[].terminationstring or null
why the task stopped short of its own exit, or why it went back to the queue: oom, timeout, cancelled, worker_shutdown, lease_lost, or a host infra code; absent while nothing ended it. on a queued, leased or running task it names the previous attempt's end
tasks[].warningsobject or null
the warnings the worker collected from the task's log, bounded; present once the task reported
tasks[].warnings.by_kindarray of objects
tasks[].warnings.by_kind[].countintegerRequired
tasks[].warnings.by_kind[].kindstringRequired
tasks[].warnings.firstarray of objects
at most 20, in the order they were seen
tasks[].warnings.first[].filestring or null
tasks[].warnings.first[].kindstringRequired
tasks[].warnings.first[].lineinteger or null
tasks[].warnings.first[].lintstring or null
tasks[].warnings.first[].messagestringRequired
the first line of the warning, trimmed, at most 512 bytes
tasks[].warnings.totalintegerRequired
every occurrence the collector saw, repeats included
tasks[].warnings.uniqueintegerRequired
distinct (kind, file, lint) the collector kept, at most 200 per task
tasks[].worker_idstring or null
uuidv7 rendered as wrk_<32 hex>
timingsobject
where a job's wall time went, each span absent until both of its ends exist: submission to the first lease, lease to the first process start, start to the last task's ended_at (the worker's clock), and from there to job.finished
timings.prepare_msinteger or null
timings.queued_msinteger or null
timings.report_msinteger or null
timings.run_msinteger or null
verdictstringRequired
One of succeeded, failed, cancelled, timed_out, infra_error, running
warningsobject or null
every task's warnings, counted and the first 20
warnings.by_kindarray of objects
warnings.by_kind[].countintegerRequired
warnings.by_kind[].kindstringRequired
warnings.firstarray of objects
at most 20, in the order they were seen
warnings.first[].filestring or null
warnings.first[].kindstringRequired
warnings.first[].lineinteger or null
warnings.first[].lintstring or null
warnings.first[].messagestringRequired
the first line of the warning, trimmed, at most 512 bytes
warnings.totalintegerRequired
every occurrence the collector saw, repeats included
warnings.uniqueintegerRequired
distinct (kind, file, lint) the collector kept, at most 200 per task
curl "$CIRESK_API/v1/ci/jobs/job_0109badfc220cd056b2c0e862ac73d40/summary" \
  -H "Authorization: Bearer $CIRESK_KEY"
GET/v1/ci/jobs/{id}/wait

Wait for a job

Block up to 55 s for a terminal state.

Permission: ci:jobs.read

Parameters

NameTypeRequiredDescription
idpathstringRequiredThe job's ID.
return_onquerystringOptional
timeoutquerystringOptional

Response200 OK

approvalsarray of objects
the job's gates waiting for a person's decision
approvals[].actorstringRequired
who asks, as a person reads it: Claude Code · user:user_01J8...
approvals[].approvestringRequired
the command a person runs to approve it
approvals[].approversarray of strings
approvals[].expires_atstring (date-time)Required
approvals[].jobstringRequired
uuidv7 rendered as job_<32 hex>
approvals[].notestring or null
the submitter's one line for the person: untrusted text, shown and never interpreted
approvals[].reachedbooleanRequired
approvals[].repostringRequired
approvals[].requested_atstring (date-time)Required
approvals[].requesterstringRequired
the job's requester (user:..., key:..., agent:...)
approvals[].taskstringRequired
the task row's name: deploy, or a matrix cell deploy[region=eu]
cacheobject
cache.hitsintegerRequired
cache.missesintegerRequired
cache.publicobject or null
the job's tasks' registry downloads answered by the workers' public cache; absent when no task reported any
cache.public.bytesintegerRequired
cache.public.hitsintegerRequired
cache.public.missesintegerRequired
cache.writesintegerRequired
criticalobject or null
the job's critical path from its task rows; absent until a worker ran a task, and from an older cell
critical.edge_msintegerRequired
critical.post_run_msintegerRequired
critical.prepare_msintegerRequired
critical.queue_msintegerRequired
critical.run_msintegerRequired
critical.tasksarray of stringsRequired
the tasks on it, first to last, name or name[k/N]; a task the api completed is walked through
critical.total_msintegerRequired
critical_pathstring or null
the job's critical path as one line, fmt → clippy-rust (4m 12s: edges 3.1s, queue 6.0s, prepare 9.2s, run 3m 50s, post-run 3.4s); critical holds the numbers
fail_fastobject or null
present once the cell's fail-fast cut the job: the task that triggered it and how many queued tasks never ran
fail_fast.cancelledintegerRequired
fail_fast.taskstringRequired
failing_testsarray of objects
at most 20
failing_tests[].duration_msintegerRequired
failing_tests[].filestring or null
failing_tests[].lineinteger or null
failing_tests[].messagestring or null
first 5 lines
failing_tests[].namestringRequired
failing_tests[].shardstring or null
failing_tests[].stackarray of strings
the first 20 frames of the failure, one per entry
failing_tests[].started_atstring (date-time) or null
when the test started, where the runner's report says (nextest's testcase timestamp); with duration_ms the run's timeline. absent from other runners and on rows ingested before it
failing_tests[].statusstringRequired
One of passed, failed, skipped, flaky
failing_tests[].stderr_tailstring or null
only in detailed
failing_tests[].stdout_tailstring or null
only in detailed
failing_tests[].suitestring or null
the class, package or file the runner grouped the test under; absent on rows ingested before P5
failing_tests[].taskstringRequired
failing_tests[].truncatedboolean
a message, stack or tail was cut at the ingestion bounds
failing_tests_totalinteger
first_failed_taskstring or null
first_failureobject or null
the first failure seen so far, so a poller learns of it before the job ends
first_failure.atstring (date-time)Required
the worker's clock when the line was seen
first_failure.excerptarray of stringsRequired
first_failure.kindstringRequired
what the first failing line of a task's log was: a compiler diagnostic, a test runner's failed case, a panic or uncaught exception, or nothing matched before a non-zero exitOne of compiler, test, panic, exit
first_failure.linestringRequired
the matched line, trimmed
first_failure.locationstring or null
path:line[:col] when the line or its excerpt names one
first_failure.shardstring or null
k/N when the task is a shard
first_failure.taskstringRequired
the namespaced task name
first_failure.toolstringRequired
the detector rule that matched: rustc, nextest, tsc, pytest, shell for an exit,...
first_no_msinteger or null
milliseconds from submission to the first "no": the first task.first_failure or the first task that ended other than succeeded, else the verdict when it is not a success; absent while nothing failed
jobobject
without tasks
job.actorstringRequired
job.affectedobject or null
what expansion selected for the job and why, when the submission carried a tree
job.affected.changed_filesintegerRequired
distinct changed paths between the reference root and the submitted one
job.affected.escalatedbooleanRequired
job.affected.graph_rootstring or null
the root whose recorded graph answered; absent when none was read
job.affected.reasonstring or null
the condition column of's table, as crates/ci/affected words it
job.affected.reference_rootstring or null
the root the diff was taken against; absent for a first submission
job.affected.selectedintegerRequired
targets the tasks received through targets_arg; 0 when escalated (the full set runs)
job.affected.strategystringRequired
One of cargo, pnpm, go, turbo, nx, files, none
job.affected.totalinteger or null
nodes of the recorded graph, when one was read
job.base_digeststringRequired
commit sha
job.base_refstringRequired
ref name as submitted
job.clientstringRequired
job.cost_unitsinteger or null
job.created_atstring (date-time)Required
job.deduplicatedbooleanRequired
job.diff_digeststring or null
sha-256 digest as sha256:<64 hex>
job.duration_msinteger or null
job.exit_codeinteger or null
job.fail_fastboolean
the cell cancels the job's queued tasks at the first task that ends other than succeeded; a deduplicated job carries the first submitter's choice
job.finished_atstring (date-time) or null
job.fullbooleanRequired
job.idstringRequired
uuidv7 rendered as job_<32 hex>
job.kindstringRequired
check, test, build, lint or a manifest task id
job.no_cacheboolean
--no-cache: no task is served from the task cache; successes still record
job.principalstringRequired
job.priorityintegerRequired
job.repostringRequired
job.repo_idstringRequired
uuidv7 rendered as repo_<32 hex>
job.request_idstring or null
the X-Request-Id this answer was produced under, so a --json envelope can name it
job.sessionstring or null
job.started_atstring (date-time) or null
job.statestringRequired
One of queued, leased, running, succeeded, failed, cancelled, timed_out, infra_error
job.superseded_bystring or null
the newer job of the same submitter, branch, kind and targets that cancelled this one under the policy's cancel_in_progress; absent otherwise
job.targetsarray of stringsRequired
job.tasksarray of objects
absent on list rows and inside Summary.job
job.tasks[].approvalobject or null
: the task's approval gate; a gated task stays queued until it is approved
job.tasks[].approval.approversarray of strings
user:<id> and role:<name>; empty means any person holding ci:approvals.approve
job.tasks[].approval.commentstring or null
job.tasks[].approval.decided_atstring (date-time) or null
job.tasks[].approval.decided_bystring or null
job.tasks[].approval.expires_atstring (date-time)Required
job.tasks[].approval.reachedbooleanRequired
the task's dependencies have succeeded: an approval starts it at once
job.tasks[].approval.sod_exceptionboolean
the requester decided their own gate under the policy's approval_self: record
job.tasks[].approval.statestringRequired
One of pending, approved, rejected, expired
job.tasks[].artifact_countintegerRequired
job.tasks[].blocked_bystring or null
on a skipped task, the dependency whose end skipped it (build, build[1/2])
job.tasks[].cachestringRequired
how a task met the task cache: served without a run, looked up and run, recorded after the run, or never keyed (cache: false, cache: { results: false } or --no-cache)One of hit, miss, write, none
job.tasks[].cache_hitboolean
the task did not run: its key matched a recorded success; cached_from names it
job.tasks[].cache_notestring or null
why the task was neither answered from the cache nor recorded in it, when the cell knows a reason beyond "these inputs never passed": the manifest keeps it out, or the run changed a tracked path. ciresk ci explain-miss compares a miss with the last recorded run of the task
job.tasks[].cached_failureobject or null
the task did not run: its key failed cleanly in the named run and never passed, so it ended with that run's exit code, tests and first failure; --no-cache runs it
job.tasks[].cached_failure.job_idstringRequired
uuidv7 rendered as job_<32 hex>
job.tasks[].cached_failure.task_idstringRequired
uuidv7 rendered as tsk_<32 hex>
job.tasks[].cached_fromobject or null
the run a cache hit stands on: the job and task whose success was recorded under the key, so a hit names where its verdict, log, junit and artifacts come from
job.tasks[].cached_from.job_idstringRequired
uuidv7 rendered as job_<32 hex>
job.tasks[].cached_from.task_idstringRequired
uuidv7 rendered as tsk_<32 hex>
job.tasks[].cached_targetsobject or null
a task split into per-target units: how many targets reused a recorded verdict
job.tasks[].cached_targets.hitintegerRequired
job.tasks[].cached_targets.ofintegerRequired
job.tasks[].cold_startstring or null
how warm the member was when it took the lease: warm was online before the job was submitted, started came online after it (the factory started it for the queue), first_after_boot was online before but this is its first lease since its bootOne of warm, started, first_after_boot
job.tasks[].cost_unitsinteger or null
job.tasks[].duration_msinteger or null
job.tasks[].exit_codeinteger or null
job.tasks[].expected_msinteger or null
how long the planner expects the task to run, from the repository's history or the kind default; shorter tasks lease first within a job
job.tasks[].finished_atstring (date-time) or null
job.tasks[].first_failureobject or null
the first failing line the worker saw, present from the moment it was seen
job.tasks[].first_failure.atstring (date-time)Required
the worker's clock when the line was seen
job.tasks[].first_failure.excerptarray of stringsRequired
job.tasks[].first_failure.kindstringRequired
what the first failing line of a task's log was: a compiler diagnostic, a test runner's failed case, a panic or uncaught exception, or nothing matched before a non-zero exitOne of compiler, test, panic, exit
job.tasks[].first_failure.linestringRequired
the matched line, trimmed
job.tasks[].first_failure.locationstring or null
path:line[:col] when the line or its excerpt names one
job.tasks[].first_failure.shardstring or null
k/N when the task is a shard
job.tasks[].first_failure.taskstringRequired
the namespaced task name
job.tasks[].first_failure.toolstringRequired
the detector rule that matched: rustc, nextest, tsc, pytest, shell for an exit,...
job.tasks[].fit_atstring (date-time) or null
job.tasks[].flaky_inputsarray of strings
the targets (or the task's name for its whole key) whose identical inputs both passed and failed on record: reported, never quarantined
job.tasks[].has_junitbooleanRequired
job.tasks[].labelsmap of any
what the queue matches a worker on: os and arch only when the submit or the manifest set them, toolchains, workspace_warm, and the manifest's own labels
job.tasks[].leased_atstring (date-time) or null
job.tasks[].log_bytesintegerRequired
job.tasks[].matrixmap of string
: the matrix cell's values, axis to value, so a client groups a task's cells; empty for a task without a matrix
job.tasks[].namestringRequired
job.tasks[].no_eligible_workerstring or null
why a queued task matches no online worker, counted per mismatch (os, arch, trust); absent once a worker could take it
job.tasks[].prepared_atstring (date-time) or null
job.tasks[].queued_atstring (date-time) or null
the phase marks of the current attempt (Neon item 4, Task::timeline): queued at submission; fit_at when an eligible member first existed for it; leased_at; prepared_at when the worker had the workspace ready; cold_start how warm the member was at the lease
job.tasks[].ready_atstring (date-time) or null
when the task became leasable: its submission for a root task, the moment its last dependency succeeded for a dependant
job.tasks[].refusalsarray of objects
the members that handed the task back for a reason of their own, oldest first
job.tasks[].refusals[].atstring (date-time)Required
job.tasks[].refusals[].reasonstringRequired
the worker's infra_error.code
job.tasks[].refusals[].workerstringRequired
the member's registered name (worker-6)
job.tasks[].refusals[].worker_idstringRequired
uuidv7 rendered as wrk_<32 hex>
job.tasks[].requeued_atstring (date-time) or null
when a lease of it was last given back and it queued again: its next lease's wait starts here
job.tasks[].shardstring or null
k/N
job.tasks[].slotsinteger or null
the worker slots the task's lease weighs, ceil(resources.memory / memory_per_slot) on the worker that took it; absent until leased
job.tasks[].started_atstring (date-time) or null
job.tasks[].statestringRequired
One of queued, leased, running, succeeded, failed, cancelled, timed_out, infra_error, skipped
job.tasks[].terminationstring or null
why the task stopped short of its own exit, or why it went back to the queue: oom, timeout, cancelled, worker_shutdown, lease_lost, or a host infra code; absent while nothing ended it. on a queued, leased or running task it names the previous attempt's end
job.tasks[].warningsobject or null
the warnings the worker collected from the task's log, bounded; present once the task reported
job.tasks[].warnings.by_kindarray of objects
job.tasks[].warnings.firstarray of objects
at most 20, in the order they were seen
job.tasks[].warnings.totalintegerRequired
every occurrence the collector saw, repeats included
job.tasks[].warnings.uniqueintegerRequired
distinct (kind, file, lint) the collector kept, at most 200 per task
job.tasks[].worker_idstring or null
uuidv7 rendered as wrk_<32 hex>
job.treeobject or null
the verified working tree the job runs on; absent for a delta submission
job.tree.bytesintegerRequired
job.tree.entriesintegerRequired
job.tree.rootstringRequired
the root digest of a working tree: sha-256 of the root directory manifest
job.tree_schemainteger or null
the TREE_SCHEMA_VERSION tree.root was hashed under; absent when the client did not say
job.truststringRequired
tiers, with no order on purpose (amendment 2026-10-27): trusted_ci is protected-branch automation and the cache writer every tier reads, trusted_interactive a person's own work, and neither is "below" the other, so every rule over tiers names the tiers it meansOne of untrusted, trusted_ci, trusted_interactive
job.urlstringRequired
job.verify_msinteger or null
milliseconds the cell spent verifying tree before the job transaction; absent for a delta submission or a cell older than the field
nextstring
the exact drill-down command or tool call
request_idstring or null
the X-Request-Id this answer was produced under
tailarray of strings
last tail lines of the first failed task
tail_taskstring or null
tasksarray of objects
tasks[].approvalobject or null
: the task's approval gate; a gated task stays queued until it is approved
tasks[].approval.approversarray of strings
user:<id> and role:<name>; empty means any person holding ci:approvals.approve
tasks[].approval.commentstring or null
tasks[].approval.decided_atstring (date-time) or null
tasks[].approval.decided_bystring or null
tasks[].approval.expires_atstring (date-time)Required
tasks[].approval.reachedbooleanRequired
the task's dependencies have succeeded: an approval starts it at once
tasks[].approval.sod_exceptionboolean
the requester decided their own gate under the policy's approval_self: record
tasks[].approval.statestringRequired
One of pending, approved, rejected, expired
tasks[].artifact_countintegerRequired
tasks[].blocked_bystring or null
on a skipped task, the dependency whose end skipped it (build, build[1/2])
tasks[].cachestringRequired
how a task met the task cache: served without a run, looked up and run, recorded after the run, or never keyed (cache: false, cache: { results: false } or --no-cache)One of hit, miss, write, none
tasks[].cache_hitboolean
the task did not run: its key matched a recorded success; cached_from names it
tasks[].cache_notestring or null
why the task was neither answered from the cache nor recorded in it, when the cell knows a reason beyond "these inputs never passed": the manifest keeps it out, or the run changed a tracked path. ciresk ci explain-miss compares a miss with the last recorded run of the task
tasks[].cached_failureobject or null
the task did not run: its key failed cleanly in the named run and never passed, so it ended with that run's exit code, tests and first failure; --no-cache runs it
tasks[].cached_failure.job_idstringRequired
uuidv7 rendered as job_<32 hex>
tasks[].cached_failure.task_idstringRequired
uuidv7 rendered as tsk_<32 hex>
tasks[].cached_fromobject or null
the run a cache hit stands on: the job and task whose success was recorded under the key, so a hit names where its verdict, log, junit and artifacts come from
tasks[].cached_from.job_idstringRequired
uuidv7 rendered as job_<32 hex>
tasks[].cached_from.task_idstringRequired
uuidv7 rendered as tsk_<32 hex>
tasks[].cached_targetsobject or null
a task split into per-target units: how many targets reused a recorded verdict
tasks[].cached_targets.hitintegerRequired
tasks[].cached_targets.ofintegerRequired
tasks[].cold_startstring or null
how warm the member was when it took the lease: warm was online before the job was submitted, started came online after it (the factory started it for the queue), first_after_boot was online before but this is its first lease since its bootOne of warm, started, first_after_boot
tasks[].cost_unitsinteger or null
tasks[].duration_msinteger or null
tasks[].exit_codeinteger or null
tasks[].expected_msinteger or null
how long the planner expects the task to run, from the repository's history or the kind default; shorter tasks lease first within a job
tasks[].finished_atstring (date-time) or null
tasks[].first_failureobject or null
the first failing line the worker saw, present from the moment it was seen
tasks[].first_failure.atstring (date-time)Required
the worker's clock when the line was seen
tasks[].first_failure.excerptarray of stringsRequired
tasks[].first_failure.kindstringRequired
what the first failing line of a task's log was: a compiler diagnostic, a test runner's failed case, a panic or uncaught exception, or nothing matched before a non-zero exitOne of compiler, test, panic, exit
tasks[].first_failure.linestringRequired
the matched line, trimmed
tasks[].first_failure.locationstring or null
path:line[:col] when the line or its excerpt names one
tasks[].first_failure.shardstring or null
k/N when the task is a shard
tasks[].first_failure.taskstringRequired
the namespaced task name
tasks[].first_failure.toolstringRequired
the detector rule that matched: rustc, nextest, tsc, pytest, shell for an exit,...
tasks[].fit_atstring (date-time) or null
tasks[].flaky_inputsarray of strings
the targets (or the task's name for its whole key) whose identical inputs both passed and failed on record: reported, never quarantined
tasks[].has_junitbooleanRequired
tasks[].labelsmap of any
what the queue matches a worker on: os and arch only when the submit or the manifest set them, toolchains, workspace_warm, and the manifest's own labels
tasks[].leased_atstring (date-time) or null
tasks[].log_bytesintegerRequired
tasks[].matrixmap of string
: the matrix cell's values, axis to value, so a client groups a task's cells; empty for a task without a matrix
tasks[].namestringRequired
tasks[].no_eligible_workerstring or null
why a queued task matches no online worker, counted per mismatch (os, arch, trust); absent once a worker could take it
tasks[].prepared_atstring (date-time) or null
tasks[].queued_atstring (date-time) or null
the phase marks of the current attempt (Neon item 4, Task::timeline): queued at submission; fit_at when an eligible member first existed for it; leased_at; prepared_at when the worker had the workspace ready; cold_start how warm the member was at the lease
tasks[].ready_atstring (date-time) or null
when the task became leasable: its submission for a root task, the moment its last dependency succeeded for a dependant
tasks[].refusalsarray of objects
the members that handed the task back for a reason of their own, oldest first
tasks[].refusals[].atstring (date-time)Required
tasks[].refusals[].reasonstringRequired
the worker's infra_error.code
tasks[].refusals[].workerstringRequired
the member's registered name (worker-6)
tasks[].refusals[].worker_idstringRequired
uuidv7 rendered as wrk_<32 hex>
tasks[].requeued_atstring (date-time) or null
when a lease of it was last given back and it queued again: its next lease's wait starts here
tasks[].shardstring or null
k/N
tasks[].slotsinteger or null
the worker slots the task's lease weighs, ceil(resources.memory / memory_per_slot) on the worker that took it; absent until leased
tasks[].started_atstring (date-time) or null
tasks[].statestringRequired
One of queued, leased, running, succeeded, failed, cancelled, timed_out, infra_error, skipped
tasks[].terminationstring or null
why the task stopped short of its own exit, or why it went back to the queue: oom, timeout, cancelled, worker_shutdown, lease_lost, or a host infra code; absent while nothing ended it. on a queued, leased or running task it names the previous attempt's end
tasks[].warningsobject or null
the warnings the worker collected from the task's log, bounded; present once the task reported
tasks[].warnings.by_kindarray of objects
tasks[].warnings.by_kind[].countintegerRequired
tasks[].warnings.by_kind[].kindstringRequired
tasks[].warnings.firstarray of objects
at most 20, in the order they were seen
tasks[].warnings.first[].filestring or null
tasks[].warnings.first[].kindstringRequired
tasks[].warnings.first[].lineinteger or null
tasks[].warnings.first[].lintstring or null
tasks[].warnings.first[].messagestringRequired
the first line of the warning, trimmed, at most 512 bytes
tasks[].warnings.totalintegerRequired
every occurrence the collector saw, repeats included
tasks[].warnings.uniqueintegerRequired
distinct (kind, file, lint) the collector kept, at most 200 per task
tasks[].worker_idstring or null
uuidv7 rendered as wrk_<32 hex>
timingsobject
where a job's wall time went, each span absent until both of its ends exist: submission to the first lease, lease to the first process start, start to the last task's ended_at (the worker's clock), and from there to job.finished
timings.prepare_msinteger or null
timings.queued_msinteger or null
timings.report_msinteger or null
timings.run_msinteger or null
verdictstring
One of succeeded, failed, cancelled, timed_out, infra_error, running
warningsobject or null
every task's warnings, counted and the first 20
warnings.by_kindarray of objects
warnings.by_kind[].countintegerRequired
warnings.by_kind[].kindstringRequired
warnings.firstarray of objects
at most 20, in the order they were seen
warnings.first[].filestring or null
warnings.first[].kindstringRequired
warnings.first[].lineinteger or null
warnings.first[].lintstring or null
warnings.first[].messagestringRequired
the first line of the warning, trimmed, at most 512 bytes
warnings.totalintegerRequired
every occurrence the collector saw, repeats included
warnings.uniqueintegerRequired
distinct (kind, file, lint) the collector kept, at most 200 per task
poll_after_msinteger
statestring
One of queued, leased, running, succeeded, failed, cancelled, timed_out, infra_error
curl "$CIRESK_API/v1/ci/jobs/job_0109badfc220cd056b2c0e862ac73d40/wait" \
  -H "Authorization: Bearer $CIRESK_KEY"