agent.allocation is the invocation-start budget and attribution snapshot, not shared-wallet
holdings or a signing boundary. Construction fails if Circuit cannot build it.
balances contains fungible inventory; size comes from amountRaw, not display USD. Every balance
and position names its asset: the identity that network’s operations take, unchanged. positions
is a closed union narrowed on network: hypercore positions carry signed size and Hyperliquid
metadata, and ethereum:137 positions carry shares and Polymarket metadata.
asset is the string that network’s operations take: a contract address or mint for transfers and
swaps; on hypercore a balance’s asset is the token index (0 is Core USDC) while an order’s
asset comes from agent.data (BTC, xyz:GOLD) or spotMarkets.list() (HYPE/USDC);
KRAKEN:XBT matches a Kraken catalog base or quote; a position’s asset goes into orders and
triggers. tokenId is null unless the balance is an ERC-1155 id. Circuit asset keys are not exposed.
The snapshot is immutable for one invocation. Track dependent effects locally; the next trigger
receives committed changes. Amounts and sizes remain exact strings. See
wallets and allocations.