Nava Guardian policy model
Developer Preview
A Nava Guardian policy is a concrete, versionless document attached to a versioned service record. The active version is resolved for the agent when Nava Guardian evaluates a proposed action.
Venue-specific schema examples
These are abridged schema illustrations, not accepted write bodies or complete stored documents. They intentionally omit preset-owned fixed values; the service fills and retains those values when it applies the sparse authoring model described below.
Spot swapper
{
"presetId": "spot-swapper",
"sanctionsList": [],
"perTxCapUsd": 1000,
"max24hOutflowUsd": 10000,
"venues": {
"uniswap": {
"chainAllowlist": [11155111],
"assetUniverse": [
{
"chainId": 11155111,
"address": "0x1111111111111111111111111111111111111111"
}
],
"recipientAllowlist": [
"0x2222222222222222222222222222222222222222"
]
}
}
}Perp trader
{
"presetId": "perp-trader",
"sanctionsList": [],
"perTxCapUsd": 1000,
"max24hOutflowUsd": 10000,
"venues": {
"hyperliquid": {
"network": "testnet",
"assetUniverse": ["ETH"],
"maxUpdateLeverage": 3,
"maxPortfolioLeverage": 2,
"maxExposurePerProtocol": {
"hyperliquid": 5000
}
}
}
}All values in both examples are placeholders, not recommended policies.
Root and shared fields
| Field | Type | Rules |
|---|---|---|
presetId | string | Required. Identifies the preset used to fill the policy. |
sanctionsList | address[] | Required in the concrete document. Addresses pass the policy address validator. |
perTxCapUsd | number | Required and non-negative. Enforced by the published per-transaction USD cap check when price data is available; missing price data fails closed. |
max24hOutflowUsd | number | Required and non-negative; must be greater than or equal to perTxCapUsd. Enforced as a rolling 24-hour cap for supported Uniswap swaps and Hyperliquid orders, using retained spend for the action's venue; missing state or valuation fails closed. |
venues | object | Required, strict, and must contain at least one supported venue block. A venue is allowed only when its block is present. |
The root object, venue map, venue blocks, chain-scoped address objects, and
contract-allowlist entries are strict objects: unknown keys are rejected. The
allowedSides and maxExposurePerProtocol maps intentionally accept
venue-native string keys.
EVM address fields use the service's EIP-55 address validator and are normalized
with getAddress; a non-address or wrong-checksum mixed-case value is rejected.
Function selectors must match a four-byte 0x-prefixed hexadecimal value.
Uniswap venue block
| Field | Type | Required | Rules |
|---|---|---|---|
chainAllowlist | integer[] | Yes | EVM chain IDs. |
assetUniverse | {chainId, address}[] | Yes | Each asset is identified by integer chain ID and token contract address, not a symbol. |
recipientAllowlist | address[] | No | Omit the field to disable the external-recipient check. An empty array permits only the agent's own registered wallets. A populated array permits those wallets plus the listed addresses. |
contractAllowlist | {address, selectors, label?}[] | No | Each entry has an address, selector array, and optional label. Selector enforcement applies only to target contracts included in this list; an unlisted target is not_checked, not denied by this check. |
allowedSides | record of side arrays | No | Values use BUY, SELL, LONG, or SHORT. |
Hyperliquid venue block
| Field | Type | Required | Rules |
|---|---|---|---|
network | mainnet or testnet | Yes | Pins the policy to one Hyperliquid environment. |
assetUniverse | string[] | Yes | Venue-native market symbols, not asset indexes. |
allowedSides | record of side arrays | No | Values use BUY, SELL, LONG, or SHORT. |
maxUpdateLeverage | number | Yes | Required and non-negative. Caps the leverage requested by a Hyperliquid updateLeverage action. |
maxPortfolioLeverage | number | Yes | Required and non-negative. Caps projected gross notional divided by account equity for an order; missing or stale account state fails closed. |
maxExposurePerProtocol | record of numbers | No | When hyperliquid is configured, caps projected gross Hyperliquid exposure for an order; missing or stale state fails closed. |
The entire Hyperliquid policy and evaluation path is Developer Preview.
Authoring and versioning
The Developer Preview write model accepts a sparse preset overlay rather than an arbitrary
concrete document. It exposes presetId, optional shared cap overrides, and
optional Uniswap or Hyperliquid overrides. Omitted values inherit the preset;
fixed preset values such as sanctionsList and some contract fields are retained.
An override cannot add a venue that is absent from the selected preset.
Policy documents do not contain their own version. A write returns
{ policyId, version, document }; an active-policy read returns
{ version, document }; and each version-history entry returns
{ version, document, createdAt, active }. A write appends a version, activation
moves the active pointer to an existing version, and copying creates an
independent version for the target agent.
Policy writes remain a dashboard and UI-session operation in this preview and require a Privy bearer session. Agent API keys can read their own active policy and state, but cannot write, activate, copy, or roll back policy versions. Configure and activate the policy before requesting a verdict. Do not pass a policy document through the MCP tool, SDK request, or advanced REST request.