The Action Contract
An Action represents what an owner has done with a Finding: approved it (dispatching an executor), dismissed it, or initiated a drill-down conversation. Approvals write a new row to vsa-{stage}-avx-actions. The Action carries a copy of the Finding’s evidence so its audit record stands independently of subsequent Finding updates.
| Field | Type | Semantics |
|---|---|---|
|
|
String ( |
Stable UUID, set on creation. |
|
|
String |
Foreign key to the originating Finding. Never null. |
|
|
String |
The identity that created the Action: owner, dealer, fleet operator, or product engineer. |
|
|
Object |
Who decided, from the verified token, never from the request body: |
|
|
String (enum) |
|
|
|
ISO-8601 UTC |
Immutable creation timestamp. |
|
|
ISO-8601 UTC |
Set on creation; updated on every status transition. Callers use this to surface staleness. |
|
|
String (enum) |
Which executor handles this Action: |
|
|
String |
The downstream system’s reference ID, populated by the executor after successful dispatch. For |
|
|
String (state machine) |
|
|
|
String (enum) |
The intent: |
|
|
JSON object |
Executor-specific payload. For |
|
|
Array of objects |
Copied from the originating Finding at approval time. Later Finding updates do not modify an approved Action’s evidence. |
|
|
Array of objects |
Immutable log of every status transition. Each entry carries |
Action lifecycle
-
Approval — An owner, fleet operator or product engineer approves a Finding, or a fleet’s auto-approval rule matches it. The Action row is written at
pending_executionwithdecided_byanddecision, then passes throughregistry.dispatch(). -
Guardrails —
dispatch()refuses a guarded action kind that the required person did not decide (an operator for fleet kinds, a product engineer for engineering kinds), andcomplete_recallwithout a completed service record. A refused Action is recordeddeclinedwith the guardrail named; it never reaches an executor. See Guardrails in the dispatch path. -
Dispatch — The executor calls the target system, sets
target_refon success, and transitions toexecutedorin_progressdepending on whether the target confirms completion immediately or defers it. -
Progress — For deferred targets such as a DMS repair order, incoming status events project forward:
in_progress→completed. A repair order DMS closes fromDraft,InProgressorAwaitingPartsprojects tocancelled, with the sentence "DMS closed the repair order before the work was done." -
Terminal failure — A target that refuses the work sets
declined. Exhausted retries or a malformed request setfailed, which fires the dual escalation described in The Executor Pattern. -
Dismissal — The owner taps Dismiss before approving. The route transitions a synthetic Action to
dismissed, writes feedback to the demotion table, and closes the card.