Skip to content

Action

An Action is one Verb performed by a Worker on a Thing, recorded with its status and every Event it emits.

Read as
GuideSpec

Its Approvals and Costs attach to it, so one record shows who did what, and why.

Properties

PropertyTypeRequiredDescription
statusstringrequiredOne of pending, done, failed, canceled, or refused.
reasonstringWhy a pending Action waits: queued, running, retrying, awaitingWorker, awaitingInput, awaitingSource, awaitingAction, or awaitingTime.
modestringrequiredHow the caller invoked it: try, send, or do.
byWorkerThe Worker that performed it.
forPartyThe Party it was done on behalf of.
viastringThe Interface or request it arrived through.
onstringThe Action or Event that caused it, such as the failed attempt a retry follows.
thingstringThe record, at the Version the Action was decided against.
inputjsonThe input it was called with.
createdAtdatetimeWhen it was called.
reservedmoneyThe most this Action may cost, held against its Limits from the check until it settles, billed misses included.

Object

JSON
{
  "$id": "https://api.sb/quietcopy.com/actions/action_1",
  "$type": "Action",
  "status": "pending",
  "reason": "queued",
  "mode": "try",
  "by": "worker_1",
  "for": "party_1",
  "via": "API",
  "on": "Invoice.overdue",
  "thing": "invoice_1@v3",
  "input": {},
  "createdAt": "2026-10-22T12:00:00Z",
  "reserved": {
    "amount": 39,
    "currency": "USD"
  }
}

Relationships

  • An Action acts on one Thing: the Thing an Action changes; a Thing’s history is the Actions that acted on it. actsOn, inverse actedOnBy.
  • An Action has many Approvals: an Approval holds one pending Action that exceeds a Limit or Mandate until someone allows or refuses it. approvals, inverse gates.
  • An Action asks many Questions: a pending Action asks Questions and waits awaitingInput until each is answered or its deadline passes. asks, inverse action.
  • An Action emits many Events: a completed Action emits its Events, which Triggers, Watches and Metrics read. emits, inverse emittedBy.
  • An Action is executed by one Workflow: a Workflow is the durable body of one Action: its steps, retries and waits. executedBy, inverse executes.
  • An Action invokes one Verb: each Action performs one Verb, which fixes its inputs, the Event it emits and its delay window. invokes, inverse invokedAs.
  • An Action posts many Costs: every Cost an Action causes posts to the Startup it ran in, so each Startup’s P&L is complete. posts, inverse postedBy.
  • An Action runs in one Mode: the Mode the caller chose: try stores nothing, send returns a pending Action, do waits for the result. runsIn, inverse modeOf.

Lifecycle

Action lifecycle: pending, done (ends), failed (ends), canceled (ends), refused (ends)pending → done: on Action.donepending → failed: on Action.failedpending → canceled: Action.cancelpending → refused: on Approval.refusedpendingdonefailedcanceledrefused
StateMeaningMoves to
pending (first)Accepted and not finished; its reason names who holds the ball.done on Action.done; failed on Action.failed; canceled by Action.cancel; refused on Approval.refused when the Approval holds this Action
doneIt finished and its effects are written.None: it ends here.
failedIt stopped with an error; a retry is a new Action linked to this one.None: it ends here.
canceledIt was stopped before it finished, and its compensation ran.None: it ends here.
refusedA Guard, a Limit or an Approval refused it, with the reason.None: it ends here.

Verbs

  1. createCreates an Action.
    POST /{namespace}/actionsdoAction.created
  2. getReturns one Action by id.
    GET /{namespace}/actions/{id}readNo Event
  3. listReturns Actions, newest first, one page at a time.
    GET /{namespace}/actionsreadNo Event
  4. answerAnswer gives the reply to an Action’s open Question, through any Interface, and the Action resumes.
    POST /{namespace}/actions/{action}/answerdoAction.answered
  5. askAsk puts a Question to a Party, a Role, or a Worker and holds the Action `pending` with reason `awaitingInput`.
    POST /{namespace}/actions/{action}/askdoAction.asked
  6. attestAttest records a credentialed Human’s signed performance of a Reserved Act that an Action needs to finish.
    POST /{namespace}/actions/{action}/attestdoAction.attested
  7. cancelCancel stops a pending Action, sets its status to `canceled`, and runs its compensation.
    POST /{namespace}/actions/{action}/canceldoAction.canceled
  8. evaluateEvaluate grades an Action’s output against a rubric and records the verdict as an Event.
    POST /{namespace}/actions/{action}/evaluatedoAction.evaluated
  9. pausePause holds a pending Action past the close of its delay window until a watcher resumes, redirects, or cancels it.
    POST /{namespace}/actions/{action}/pausedoAction.paused
  10. redirectRedirect changes a pending Action’s inputs or target inside its delay window, before it runs.
    POST /{namespace}/actions/{action}/redirectdoAction.redirected
  11. resumeResume ends a pause and lets the Action run as reviewed, or reopen what remained of its delay window.
    POST /{namespace}/actions/{action}/resumedoAction.resumed
  12. retryRetry runs a failed Action again as a new Action linked to the one that failed.
    POST /{namespace}/actions/{action}/retrydoAction.retried

An Action is kept forever and never edited: it has no update or delete.

Events

Events no Verb emits. Each Verb’s Event is in the Verbs table above; every Event is delivered in the same shape.

Action.done

An Action’s work finished and its effects are written. Raised by the runtime.

FieldTypeRequiredDescription
namestringrequiredAction.done.
atdatetimerequiredWhen it happened.
seqintegerIts position in the namespace, one more than the Event before; any seq is a cursor into the history.
datajsonrequiredThe Thing as the Action left it.
data.actionActionrequiredThe Action as the change left it.
data.action.statusstringrequiredOne of pending, done, failed, canceled, or refused.
data.action.reasonstringWhy a pending Action waits: queued, running, retrying, awaitingWorker, awaitingInput, awaitingSource, awaitingAction, or awaitingTime.
data.action.modestringrequiredHow the caller invoked it: try, send, or do.
data.action.byWorkerThe Worker that performed it.
data.action.forPartyThe Party it was done on behalf of.
data.action.viastringThe Interface or request it arrived through.
data.action.onstringThe Action or Event that caused it, such as the failed attempt a retry follows.
data.action.thingstringThe record, at the Version the Action was decided against.
data.action.inputjsonThe input it was called with.
data.action.createdAtdatetimeWhen it was called.
data.action.reservedmoneyThe most this Action may cost, held against its Limits from the check until it settles, billed misses included.
data.previous.statusstringrequiredThe status before this Event: pending.
JSON
{
  "$id": "https://api.sb/quietcopy.com/events/event_1",
  "$type": "Event",
  "name": "Action.done",
  "at": "2026-10-22T12:00:00Z",
  "data": {
    "action": {
      "$id": "https://api.sb/quietcopy.com/actions/action_1",
      "$type": "Action",
      "status": "done",
      "reason": "queued",
      "mode": "try",
      "by": "worker_1",
      "for": "party_1",
      "via": "API",
      "on": "Invoice.overdue",
      "thing": "invoice_1@v3",
      "input": {},
      "createdAt": "2026-10-22T12:00:00Z",
      "reserved": {
        "amount": 39,
        "currency": "USD"
      }
    },
    "previous": {
      "status": "pending"
    }
  },
  "seq": 1
}

Action.failed

An Action stopped with an error before it finished; a retry is a new Action. Raised by the runtime.

FieldTypeRequiredDescription
namestringrequiredAction.failed.
atdatetimerequiredWhen it happened.
seqintegerIts position in the namespace, one more than the Event before; any seq is a cursor into the history.
datajsonrequiredThe Thing as the Action left it.
data.actionActionrequiredThe Action as the change left it.
data.action.statusstringrequiredOne of pending, done, failed, canceled, or refused.
data.action.reasonstringWhy a pending Action waits: queued, running, retrying, awaitingWorker, awaitingInput, awaitingSource, awaitingAction, or awaitingTime.
data.action.modestringrequiredHow the caller invoked it: try, send, or do.
data.action.byWorkerThe Worker that performed it.
data.action.forPartyThe Party it was done on behalf of.
data.action.viastringThe Interface or request it arrived through.
data.action.onstringThe Action or Event that caused it, such as the failed attempt a retry follows.
data.action.thingstringThe record, at the Version the Action was decided against.
data.action.inputjsonThe input it was called with.
data.action.createdAtdatetimeWhen it was called.
data.action.reservedmoneyThe most this Action may cost, held against its Limits from the check until it settles, billed misses included.
data.errorstringrequiredThe error it stopped with; its page gives the fix.
data.previous.statusstringrequiredThe status before this Event: pending.
JSON
{
  "$id": "https://api.sb/quietcopy.com/events/event_1",
  "$type": "Event",
  "name": "Action.failed",
  "at": "2026-10-22T12:00:00Z",
  "data": {
    "action": {
      "$id": "https://api.sb/quietcopy.com/actions/action_1",
      "$type": "Action",
      "status": "failed",
      "reason": "queued",
      "mode": "try",
      "by": "worker_1",
      "for": "party_1",
      "via": "API",
      "on": "Invoice.overdue",
      "thing": "invoice_1@v3",
      "input": {},
      "createdAt": "2026-10-22T12:00:00Z",
      "reserved": {
        "amount": 39,
        "currency": "USD"
      }
    },
    "error": "conflict",
    "previous": {
      "status": "pending"
    }
  },
  "seq": 1
}

Permissions

Which Access level may call each Verb. One-way Verbs wait their delay window.

Operationowneradminmemberviewer
Action.createYesYesYesNo
Action.getYesYesYesYes
Action.listYesYesYesYes
Action.answerYesYesYesNo
Action.askYesYesYesNo
Action.attestYesYesYesNo
Action.cancelYesYesYesNo
Action.evaluateYesYesYesNo
Action.pauseYesYesYesNo
Action.redirectYesYesYesNo
Action.resumeYesYesYesNo
Action.retryYesYesYesNo

Call it

Text
Cancel the latest action.

Example

Bea, the Billing Specialist at a voice-actor marketplace, runs Order.refund on a $90 Order. The Action records by: Bea, for the game studio that asked, mode: do and status: Done, and emits Order.refunded.