202 Accepted immediately and run the work in a background goroutine; poll List runs for results. See the Quartermaster guide.
All endpoints require authentication and are workspace-scoped. Mutating endpoints (
replay, regression) require OWNER or ADMIN role. Mission IDs must belong to the caller’s workspace — cross-tenant IDs return 404 with the same shape as “not found”.Endpoints
Queueing runs
Replay and regression both return 202 Accepted immediately and perform the work in a 10-minute background goroutine. Poll via List runs.Queue a replay
Response:
202 Accepted
Queue a regression
Both must be in the caller’s workspace. The handler checks them independently so a partial spoof still 404s.
Response:
202 Accepted
Results
Poll for run status, results, and per-run token/cost totals.List runs
Response:
200 OK
quartermaster.RunRecord) marks mission_id, baseline_mission_id, candidate_mission_id, result, signature, created_by, and completed_at as omitempty — empty values are dropped from the row, not emitted as ""/null. seed, total_tokens, total_cost_usd, and regressed are always present.
Get a run
crewship eval get <id> (CLI docs).
Request: id is the required run path parameter. Workspace context is
supplied by the optional X-Workspace-ID header (or the authenticated session).
No request body.
Response: 200 OK
Authentication: Send the normal authenticated session or CLI token with
workspace context. Reads require a workspace; there is no additional role
gate. The API returns its standard JSON error object for
401, 400, and
500 responses.
Tenancy and role gates
- All reads + writes scoped to the session’s workspace.
- Decisions on replay/regression require
OWNERorADMIN. - Cross-tenant mission IDs return 404, not 403, to avoid leaking cross-workspace existence.
Journal side-effects
The background worker emitseval.run_started at the start, eval.metric for each computed metric, and eval.regression_detected when a regression run crosses a threshold. Correlate by run_id in the payload.