Skip to content

The action lifecycle

Every action moves through the same state machine, and the database refuses any edge that isn’t in it.

Every edge as text (22 edges, 15 states)
  • received → authenticated
  • authenticated → evaluated
  • evaluated → denied
  • evaluated → pending_approval
  • evaluated → executing
  • denied → sealed
  • pending_approval → executing
  • pending_approval → denied
  • pending_approval → expired
  • pending_approval → cancelled
  • executing → executed
  • executing → failed
  • executed → witnessing
  • failed → sealed
  • witnessing → verified
  • witnessing → mismatch
  • witnessing → unverifiable
  • verified → sealed
  • mismatch → sealed
  • unverifiable → sealed
  • expired → sealed
  • cancelled → sealed

The diagram is drawn at build time from the Gate’s edge table, the same table a database trigger mirrors. Dashed lines lead to sealed.

  • Denied: received → authenticated → evaluated → denied → sealed. Nothing ran.
  • Approved: evaluated → pending_approval → executing. A person’s countersign moves it on; if no one decides in time it goes to expired, and an agent or admin can move it to cancelled.
  • Ran: executing → executed → witnessing → verified | mismatch | unverifiable → sealed.
  • Failed: executing → failed → sealed. Failed means the tool certainly did not apply.

When Deedglass can’t know whether a tool ran (a timeout, a crash, a lost connection), the action goes executing → executed with execution.status = unknown, then witnessing → unverifiable. There is no other edge for this, and recovery after a crash never invents one.

A later verdict never edits an existing deed. It seals an amendment deed that points to the first.

  • status on the API is a short summary (processing, executed, …); state is the exact lifecycle state. Use state when you need the edge.
  • A sealed action never changes. Undo is a new action, with its own deed.