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
| Property | Type | Required | Description |
|---|---|---|---|
status | string | required | One of pending, done, failed, canceled, or refused. |
reason | string | Why a pending Action waits: queued, running, retrying, awaitingWorker, awaitingInput, awaitingSource, awaitingAction, or awaitingTime. | |
mode | string | required | How the caller invoked it: try, send, or do. |
by | Worker | The Worker that performed it. | |
for | Party | The Party it was done on behalf of. | |
via | string | The Interface or request it arrived through. | |
on | string | The Action or Event that caused it, such as the failed attempt a retry follows. | |
thing | string | The record, at the Version the Action was decided against. | |
input | json | The input it was called with. | |
createdAt | datetime | When it was called. | |
reserved | money | The most this Action may cost, held against its Limits from the check until it settles, billed misses included. |
Object
{
"$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, inverseactedOnBy. - An Action has many Approvals: an Approval holds one pending Action that exceeds a Limit or Mandate until someone allows or refuses it.
approvals, inversegates. - An Action asks many Questions: a pending Action asks Questions and waits
awaitingInputuntil each is answered or its deadline passes.asks, inverseaction. - An Action emits many Events: a completed Action emits its Events, which Triggers, Watches and Metrics read.
emits, inverseemittedBy. - An Action is executed by one Workflow: a Workflow is the durable body of one Action: its steps, retries and waits.
executedBy, inverseexecutes. - An Action invokes one Verb: each Action performs one Verb, which fixes its inputs, the Event it emits and its delay window.
invokes, inverseinvokedAs. - 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, inversepostedBy. - An Action runs in one Mode: the Mode the caller chose:
trystores nothing,sendreturns a pending Action,dowaits for the result.runsIn, inversemodeOf.
Lifecycle
| State | Meaning | Moves 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 |
done | It finished and its effects are written. | None: it ends here. |
failed | It stopped with an error; a retry is a new Action linked to this one. | None: it ends here. |
canceled | It was stopped before it finished, and its compensation ran. | None: it ends here. |
refused | A Guard, a Limit or an Approval refused it, with the reason. | None: it ends here. |
Verbs
createCreates an Action.POST /{namespace}/actionsgetReturns one Action by id.GET /{namespace}/actions/{id}listReturns Actions, newest first, one page at a time.GET /{namespace}/actionsanswerAnswer gives the reply to an Action’s open Question, through any Interface, and the Action resumes.POST /{namespace}/actions/{action}/answeraskAsk puts a Question to a Party, a Role, or a Worker and holds the Action `pending` with reason `awaitingInput`.POST /{namespace}/actions/{action}/askattestAttest records a credentialed Human’s signed performance of a Reserved Act that an Action needs to finish.POST /{namespace}/actions/{action}/attestcancelCancel stops a pending Action, sets its status to `canceled`, and runs its compensation.POST /{namespace}/actions/{action}/cancelevaluateEvaluate grades an Action’s output against a rubric and records the verdict as an Event.POST /{namespace}/actions/{action}/evaluatepausePause holds a pending Action past the close of its delay window until a watcher resumes, redirects, or cancels it.POST /{namespace}/actions/{action}/pauseredirectRedirect changes a pending Action’s inputs or target inside its delay window, before it runs.POST /{namespace}/actions/{action}/redirectresumeResume ends a pause and lets the Action run as reviewed, or reopen what remained of its delay window.POST /{namespace}/actions/{action}/resumeretryRetry runs a failed Action again as a new Action linked to the one that failed.POST /{namespace}/actions/{action}/retry
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.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | required | Action.done. |
at | datetime | required | When it happened. |
seq | integer | Its position in the namespace, one more than the Event before; any seq is a cursor into the history. | |
data | json | required | The Thing as the Action left it. |
data.action | Action | required | The Action as the change left it. |
data.action.status | string | required | One of pending, done, failed, canceled, or refused. |
data.action.reason | string | Why a pending Action waits: queued, running, retrying, awaitingWorker, awaitingInput, awaitingSource, awaitingAction, or awaitingTime. | |
data.action.mode | string | required | How the caller invoked it: try, send, or do. |
data.action.by | Worker | The Worker that performed it. | |
data.action.for | Party | The Party it was done on behalf of. | |
data.action.via | string | The Interface or request it arrived through. | |
data.action.on | string | The Action or Event that caused it, such as the failed attempt a retry follows. | |
data.action.thing | string | The record, at the Version the Action was decided against. | |
data.action.input | json | The input it was called with. | |
data.action.createdAt | datetime | When it was called. | |
data.action.reserved | money | The most this Action may cost, held against its Limits from the check until it settles, billed misses included. | |
data.previous.status | string | required | The status before this Event: pending. |
{
"$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.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | required | Action.failed. |
at | datetime | required | When it happened. |
seq | integer | Its position in the namespace, one more than the Event before; any seq is a cursor into the history. | |
data | json | required | The Thing as the Action left it. |
data.action | Action | required | The Action as the change left it. |
data.action.status | string | required | One of pending, done, failed, canceled, or refused. |
data.action.reason | string | Why a pending Action waits: queued, running, retrying, awaitingWorker, awaitingInput, awaitingSource, awaitingAction, or awaitingTime. | |
data.action.mode | string | required | How the caller invoked it: try, send, or do. |
data.action.by | Worker | The Worker that performed it. | |
data.action.for | Party | The Party it was done on behalf of. | |
data.action.via | string | The Interface or request it arrived through. | |
data.action.on | string | The Action or Event that caused it, such as the failed attempt a retry follows. | |
data.action.thing | string | The record, at the Version the Action was decided against. | |
data.action.input | json | The input it was called with. | |
data.action.createdAt | datetime | When it was called. | |
data.action.reserved | money | The most this Action may cost, held against its Limits from the check until it settles, billed misses included. | |
data.error | string | required | The error it stopped with; its page gives the fix. |
data.previous.status | string | required | The status before this Event: pending. |
{
"$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.
| Operation | owner | admin | member | viewer |
|---|---|---|---|---|
Action.create | Yes | Yes | Yes | No |
Action.get | Yes | Yes | Yes | Yes |
Action.list | Yes | Yes | Yes | Yes |
Action.answer | Yes | Yes | Yes | No |
Action.ask | Yes | Yes | Yes | No |
Action.attest | Yes | Yes | Yes | No |
Action.cancel | Yes | Yes | Yes | No |
Action.evaluate | Yes | Yes | Yes | No |
Action.pause | Yes | Yes | Yes | No |
Action.redirect | Yes | Yes | Yes | No |
Action.resume | Yes | Yes | Yes | No |
Action.retry | Yes | Yes | Yes | No |
Call it
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:, for the game studio that asked, mode: and status:, and emits Order.refunded.