Skip to article
Browse documentation +
CONTROLS / ELPIS

Control layers & rule reference

The five layers that decide a payment, and every rule that can refuse or escalate one.

The five layers

Controls run in a fixed order. Earlier layers are absolute; later layers may escalate rather than refuse, precisely because the earlier ones will not let a catastrophic action through.

LayerTypeEffect of a failure
1 — Hard rulesDeterministic arithmetic on factsBlocks (no money moves)
2 — Contract controlsWhat the vault contract itself enforcesBlocks
3 — PolicyInterpreted business policyEscalates to a human
4 — ApprovalThe decision to require a personHolds for approval
5 — SupervisorLLM-assisted review (warn / freeze / escalate)Cannot authorise
Layer 5 can only ever make the system more cautious. There is no code path where a supervisor verdict releases an action that layer 1–4 refused.

Rule reference

Every rule returns a fact other than pass/fail: a stated reason. Rules marked blocking refuse the action; the rest escalate to approval.

Rule idLayerBlocksChecks
math.balance_sufficient1YesThe pool has the liquid funds.
math.min_reserve_preserved1YesThe payment does not breach the pool’s reserve floor.
math.treasury_reserve_preserved1YesThe treasury minimum reserve across pools is kept.
math.committed_funds_protected1YesCommitted obligations stay funded.
math.idempotency_unique1YesThis intent has not already produced an action.
math.max_transaction_size1NoAmount is within the per-transaction limit.
math.daily_autonomous_limit1NoToday’s autonomous spend stays within the daily limit.
math.account_recoverability_requirement1NoThe class meets the account’s minimum recoverability.
contract.escrow_available2NoThe amount is within what the vault will hold in escrow.
contract.spend_ceiling2NoThe vault’s per-transaction and per-day ceilings.
contract.recipient_allowlist2NoThe recipient is on the vault’s allowlist.
contract.freeze_control2NoThe vault is not paused.
policy.recipient_changed3YesThe recipient’s wallet details changed — frozen.
policy.new_counterparty3NoFirst payment to an unknown counterparty.
policy.amount_anomaly3NoAmount is within 3× the counterparty’s own median.
policy.document_anchor3NoA qualifying payment cites its supporting document.
policy.irreversible_scrutiny3NoR4 actions are looked at by a person.
policy.new_counterparties_scrutiny3NoSeveral new counterparties in one window.
policy.prefer_early_strategic_vendors3NoPreference ordering among vendors.
policy.preserve_extra_liquidity3NoHolds more liquidity than the floor requires.

Seeded policy values

The defaults a new organization starts with. All are editable policy rows, not constants.

KeyDefaultControls
min_reserve$10,000Treasury minimum reserve.
daily_autonomous_limit$5,000Maximum autonomous spend per day.
max_transaction_size$25,000Largest single transaction.
escrow_max_amount$15,000Largest amount held in escrow (above it → R4).
document_anchor_threshold$10,000Above it, a payment must cite a document.
new_recipient_max_amount$2,000Largest autonomous first payment.
anomaly_multiplier3Multiple of a counterparty’s median that is “normal”.
obligation_horizon_days30Commitment horizon for reserve maths.
min_runway_days45Minimum runway floor.
invest_horizon_days7Do not invest funds needed within this window.
daily_autonomous_invest_limit$50,000Autonomous investment cap per day.
lazarus_window_minutes30Cancellable window on a staged payment.
onchain_max_per_tx$25,000Vault ceiling — per transaction.
onchain_max_per_day$100,000Vault ceiling — per day.
require_approval_irreversibletrueR4 always needs a human.

Reading a decision

The API returns every rule result, so the reason a payment was refused is never a mystery. The failing rule’s detail states the numbers involved, and blockedBy lists only the blocking failures. See Approval and Supervisor.