Execution Layer for Odoo
Approvals.
How destructive and high-impact actions are gated: risk classes, the payload-bound Prepare, Approve, Execute sequence, four-eyes approval through Odoo's own activity inbox, and the approval error codes.
Some actions should never happen on an AI’s say-so alone. The Execution Layer gates them behind a server-side approval that a person, who can be someone other than the one who asked, has to grant.
Risk classes
Actions are grouped into risk classes, and the destructive ones are gated by default: deleting records, mass updates, validating an invoice, confirming an order, sending outbound mail. You choose which classes require approval and who approves them.
Prepare, approve, execute
When a risk-classed action arrives, the layer does not run it. It stages the exact change
server-side and refuses the call with APPROVAL_REQUIRED, opening an approval request:
prepare the exact change is staged, server-sideapprove a person signs off on that exact payloadexecute only the approved payload runsThe agent then retries the identical call with the returned approval_request_id, and it executes.
The token is bound to the payload
The approval token binds the user, the tool, the model, the record ids, an exact hash of the
payload, and the policy version. If anything drifts after approval, the write is refused as
APPROVAL_STALE. You cannot approve “update this order” and have the AI quietly change a different
field or a different record.
Four-eyes, through Odoo
Approval happens in Odoo, through the activity inbox and notifications, never through a tool the AI can call. That is what enforces approver is not the asker: the person who reviews and clicks Approve or Deny is a real Odoo user acting in Odoo, and it can be a manager rather than the requester.
The states an agent sees
An approval flows through machine-readable states, so an agent can respond correctly:
APPROVAL_REQUIREDthe action was staged; a person must decide.APPROVAL_PENDINGthe request exists and is still awaiting a decision.APPROVAL_STALEthe payload changed after approval; it is invalid.APPROVAL_DENIEDa person declined it.
The full list is in the error codes reference. Every approval, and every denial, is recorded in the audit.
Next: evidence and audit.