Requisition Intake (Spend Approval)
Every purchase requisition is routed by a tiered spend-approval matrix. The granular approver routing is procurement-specific; the canonical allow/prepare/escalate/block verdict is delegated to the shared Guardian.
The approval ladder
Routes, in escalating order:
auto_approve → manager_approval → director_approval → cfo_approval → blockedThe default policy (DEFAULT_SPEND_POLICY, currency USD):
| Amount (≤) | Route |
|---|---|
| 1,000 | Auto-approved |
| 10,000 | Manager approval |
| 50,000 | Director approval |
| no cap | CFO approval |
Fail-closed escalation
Two conditions push a requisition one step above its amount tier:
- Restricted cost center —
capexandlegalare restricted by default; any requisition in them escalates one step (raisesrestricted_cost_center). - Over budget — when
amount > budgetRemaining, the request escalates one step rather than auto-clearing (raisesover_budget).
Both conditions can stack. The resolved route maps onto the shared engine’s autonomy ladder before the Guardian returns the verdict:
| Route | Autonomy level (@onoots/core) |
|---|---|
auto_approve | full_auto |
manager_approval / director_approval | ai_prepare_human_approve |
cfo_approval / blocked | human_licensed_only |
Worked example
A 7,400 requisition on cost center operations with 20,000 budget remaining
lands in the manager tier (≤ 10,000), is not restricted, and is within budget →
Manager approval. Switch the cost center to capex and it escalates one step
to Director approval; drop the budget below the amount and it escalates again.
See the API Reference for the
resolveApproval signature and the SpendPolicy shape (tiers are easily
customized per tenant).