Approvals

Every consequential change waits for a yes.

What does a 15%+ discount actually look like getting approved? The flow parks, the order locks, and finance sees the request in the approvals inbox — record snapshot, who did what when, all in one panel. Approve to release it, reject with a comment to send it back, and a stalled request escalates on its own. A change the ObjectOS AI Builder makes to a live app that already holds records waits too: it is saved as a draft and goes live when a person publishes it.

ObjectOS product surface connecting business data, applications, and AI agents
AI Writes metadata Objects, permissions, workflows, tools
Human Reviews diff Business authority, data access, approvals
Runtime Enforces policy UI, APIs, audit, MCP, actions
4 ways
Route to a user, role, team, or manager hierarchy
Locked
Records hold still while a decision is pending
Recorded
Every request, decision, and escalation is audited

Sign-off as metadata

The approval policy fits in one review.

This is that discount chain: finance reviews first (any one responder), executives confirm (unanimous), the record stays locked throughout, and at most two revision round-trips. The policy itself is a compact definition anyone can read.

import { defineFlow } from '@objectstack/spec';

export const DiscountApproval = defineFlow({
  name: 'sales_discount_approval',
  label: 'Discount Approval',
  type: 'autolaunched',
  nodes: [
    {
      id: 'start',
      type: 'start',
      label: 'On Large Discount',
      config: {
        objectName: 'sales_order',
        triggerType: 'record-after-update',
        condition: 'discount > 15 && discount != previous.discount',
      },
    },
    {
      id: 'finance_review',
      type: 'approval',
      label: 'Finance Review',
      config: {
        approvers: [{ type: 'role', value: 'finance' }],
        behavior: 'first_response',
        lockRecord: true,
        maxRevisions: 2,
      },
    },
    {
      id: 'exec_review',
      type: 'approval',
      label: 'Executive Review',
      config: {
        approvers: [{ type: 'role', value: 'exec' }],
        behavior: 'unanimous',
        lockRecord: true,
      },
    },
    { id: 'approved', type: 'end', label: 'Approved' },
    { id: 'rejected', type: 'end', label: 'Rejected' },
  ],
  edges: [
    { id: 'e1', source: 'start', target: 'finance_review' },
    { id: 'e2', source: 'finance_review', target: 'exec_review', label: 'approve' },
    { id: 'e3', source: 'finance_review', target: 'rejected', label: 'reject' },
    { id: 'e4', source: 'exec_review', target: 'approved', label: 'approve' },
    { id: 'e5', source: 'exec_review', target: 'rejected', label: 'reject' },
  ],
});

The approval model

Follow the discount through both sign-offs

Approvers resolve against the same identity model as permissions, so reorganizations do not break sign-off chains — and every step below lives in one definition.

A two-step chain

Finance reviews first, executives confirm, sequenced in one flow — finance is “first response wins”, executives are “must be unanimous”, and each step sets its own behavior.

Approvers resolved from the org

Route to the finance role, a team, or up the requester’s manager hierarchy — resolved against live identity at request time, so personnel changes never mean editing flows.

Stalls escalate themselves

Finance hasn’t touched it in three days? The request escalates and reminds automatically — processes stop dying in one inbox.

Locking and send-back

While the decision is pending the order holds still — nobody edits past the reviewer. Finance can also return it for revision: sales fixes the discount and resubmits, at most twice (maxRevisions: 2).

Every decision on the record

Who was asked, who answered, which snapshot they saw, and when — a complete, immutable trail behind every approval, ready for audit.

The approvals inbox

The screen approvers actually work in

The open-source console ships an approvals inbox — not a link in an email, but a workbench with context where decisions actually happen.

Three tabs

“My pending” (waiting on me), “Submitted by me” (where are mine), and “All” (paginated overview) — each row shows the process, record, submitter, status, and time.

Decide with context, in a side panel

Open any row: the record snapshot, the step-by-step action timeline, approve/reject buttons, and a comment box — no hunting through other screens for context.

Recall and return for revision

Submitters can recall their own requests; reviewers can return for revision instead of a flat reject — with status colors for pending, approved, rejected, recalled, and returned.

Built for high-volume approvers

j/k to move, Enter to open, a/r to approve or reject — clearing a queue of requests never touches the mouse.

The AI governance gate

Once an app is live with data, AI changes wait for a person

This is the mechanism that keeps AI-written software governable once real records depend on it: an agent’s change to a live app does not ship on its own — it waits for a person. On the open runtime that is your git diff; on ObjectOS Cloud it is a draft that a person publishes.

Changes to a live app wait as a draft

On ObjectOS Cloud, the AI Builder publishes a first build right away. Once the app is live and holds records, a change to its objects, fields, actions, or flows is saved as a draft instead, and it goes live only when a person publishes it.

The diff is the request

On the open runtime, your coding agent’s change is ordinary metadata in a git diff, so reviewers see exactly what would change — schema, authority, automation — not a description of it, and merge it like any other change.

Business decisions use approval steps

A flow approval step can hold an AI-triggered refund or bulk update for a person’s sign-off, with the same inbox, locking, and decision record as any other approval.

Decision surface

What changes, who reviews it, what runs

Business needAI writesRuntime supplies
Discounts above 15% need financeAn approval step on the changeRouting, the inbox, locking, decision records
Big refunds need two approvalsA multi-step chainSequenced sign-off with escalation and send-back
Nothing stalls in one inboxA timeout and an escalation pathAutomatic escalation and reminders
AI changes to a live app get a human checkThe metadata change itselfA draft a person publishes on ObjectOS Cloud; your git review on the open runtime

Review checklist

An approval review should confirm

  • Every high-consequence action names its approval path.
  • Routing uses roles and hierarchy, not hardcoded people.
  • Timeouts and escalation are defined for every step.
  • Records lock while decisions are pending.
  • AI changes to a live app with records wait for a person — a draft to publish on ObjectOS Cloud, the git diff on the open runtime.

FAQ

Frequently asked questions

Are approvals a separate system from flows?

No — an approval is a durable step inside a flow. That keeps one execution model for the whole process: the flow pauses, people decide, the flow resumes.

What is open source here, and what does ObjectOS add?

Multi-step approvals, approver resolution, escalation, record locking, the audit trail, and the three-tab inbox with its side panel, comments, recall, return-for-revision, and keyboard shortcuts ship in the open-source ObjectStack Console, Apache-2.0. ObjectOS adds the in-app AI Builder (a preview on Enterprise). On ObjectOS Cloud it publishes a first build right away, and a change to a live app that already holds records is saved as a draft for a person to publish. Business decisions such as the discount above still go through flow approval steps.

Next pages

Keep building the evaluation packet.