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.
Concrete document shape
{
"presetId": "spot-swapper",
"sanctionsList": [],
"perTxCapUsd": 1000,
"max24hOutflowUsd": 10000,
"venues": {
"uniswap": {
"chainAllowlist": [11155111],
"assetUniverse": [
{
"chainId": 11155111,
"address": "0x1111111111111111111111111111111111111111"
}
],
"recipientAllowlist": [
"0x2222222222222222222222222222222222222222"
],
"contractAllowlist": [
{
"address": "0x3333333333333333333333333333333333333333",
"selectors": ["0x12345678"],
"label": "Placeholder router"
}
],
"allowedSides": {
"placeholder-asset": ["BUY", "SELL"]
}
}
}
}All values above are placeholders, not a recommended policy.
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. |
max24hOutflowUsd | number | Required and non-negative; must be greater than or equal to perTxCapUsd. |
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[] | Yes | Allowed effective recipients. |
contractAllowlist | {address, selectors, label?}[] | No | Each entry has an address, selector array, and optional label. |
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. |
maxPortfolioLeverage | number | Yes | Required and non-negative. |
maxExposurePerProtocol | record of numbers | No | Optional venue exposure caps. |
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 management is a dashboard and UI-session operation in this preview:
writes require a Privy bearer session, and agent API keys cannot read or write
their policy. Do not include a policy document in POST /transactions; configure
and activate it before submitting the proposed action.