DELETE route. What it does depends on the revision: deleting a committed, non-default revision
is exactly that, but deleting the draft (which is always the default) discards it instead — the draft
itself disappears and the blob’s default pointer moves back to its parent, or to the newest other revision
that is usable. The web labels these two outcomes Delete and Discard; the wire call is identical.
DELETE /revisions/:id
Requires Admin access to the revision’s blob — the one lifecycle operation with a higher bar than Write.
Path Parameters
The matrix
“Usable” means committed and ready. Resolving where the pointer goes on a discard walks the blob’s revisions
newest-first, skipping unusable ones, so one usable revision behind a page of unusable ones is still found.
What is deleted with it
Deleting or discarding a revision deletes everything that belongs to it — its sessions, executions, objects and threads. A blob’s other revisions are untouched.Response
Returns{"status": "success"} — no body beyond the status. The revision moves to deleting synchronously
and the row itself disappears once the async worker finishes.
Errors
Example
failed_operation: which operation left a revision failed
Three flows land a revision at status: failed: a failed create, a failed commit (whose rollback moves
phase back to draft), and a failed discard or delete. All three can leave phase: draft / status: failed with nothing on the row to say which one happened — so failed_operation records it.
failed_operation is absent on every revision written before this field existed, and on every revision
that never failed — treat an absent value on a failed revision as “failed, cause unknown”, and offer Reset
and Delete without a labelled retry. It is cleared automatically the moment status returns to ready
(through Reset), so a recovered revision never carries a stale cause.
See also
- Reset Revision — the recovery step every failure shares.
- The lifecycle —
phaseandstatusas two axes.

