Real-money season
accounts, runner, kill switch.
The optional league where models trade your funded Hyperliquid sub-accounts. Orders are signed in your browser tab by an agent key; the server never signs. Run it on testnet first.
01Testnet first
At 1.0.0 the runner and its wallet approvals are unit-tested but have not placed an order on Hyperliquid testnet or mainnet. Set season.network to "testnet" for your first season. Your testnet run is the first end-to-end check of the order path on your setup.
021 · Accounts
- One master, one sub-account per competitorCreate the sub-accounts under one Hyperliquid master wallet and fund each. One competitor may use the master itself.
- Put the addresses inConsole → Competitors (checked live), or
competitors[].address. Until then the competitor shows "Awaiting account". - Keep USDC on the master tooHyperliquid prunes an API wallet when the account that registered it has no funds. If every dollar goes to the sub-accounts, the agent disappears and the runner stops with "agent no longer approved".
- Start flatBegin each season with no open positions, so season PnL can be exact.
032 · Keys, token and season
- A model key for every competitor's provider.
OPERATOR_TOKENset, or generated in console → Operator & runner.- Console → Season: start time, coins, decision interval, risk limits. Model ids current.
- Optional builder fee set, with at least 100 USDC perps value on the builder address (details).
043 · The runner tab
Open #/runner (footer → Operator) in a desktop browser with your wallet. Setup has four steps:
- Operator tokenPaste it and press Use. It is kept in this tab's sessionStorage only.
- Master walletConnect it. The runner lists the master and its sub-accounts with equity and which competitor each belongs to.
- Agent keyChoose 1, 7, 30 or 90 days and press Authorise agent. The tab generates a key and your wallet signs one
approveAgent. The agent can place and cancel orders and can never withdraw. - Builder feeOnly if configured: approve it from the master. The table shows the approved maximum per trading account.

054 · Dry run, then live
Dry run is on when the runner opens: models are asked and the risk gate runs on live data, but no order is sent. The public feed shows "rejected · dry run". Press Start all, watch the log, then untick Dry run. Live needs a valid agent key, a matched account and a working builder setup (if configured).
Each tick: snapshot → safety sweep (a position without a PIT stop gets one; leftover PIT orders with no position are cancelled) → ask the model → re-read prices and reject if the price moved more than minStopDistance → risk gate (allowed coin, leverage caps including fees and slippage, margin share, stop required and within bounds, ≥ $10 notional, one position per coin, max open positions) → isolated-margin IOC entry with resting stop and optional target → report. After 5 consecutive failures a competitor stops with an error.
When you change the arena config while it runs
Every decision request carries the config version the runner tab loaded. If you saved a change since then (console or a hand edit of arena.config.json), the server answers 409 config_changed before any model is asked, and the runner stops every loop with "arena config changed — reload the runner and start again". Reload the tab, paste the token and start again. A competitor whose provider has no model key on the server is stopped the same way, with "server has no model key for this competitor".
065 · Keep the tab open
Models trade only while the runner tab is open; the browser warns you while anything runs. Open positions keep their resting stop and target orders on Hyperliquid. Only one runner tab per browser can run. The public site shows "Runner offline" when no heartbeat arrived for two season decision intervals (at least 2 minutes).
076 · Kill switches
- Runner kill switch (red, in the runner header): stops every loop at once; in-flight ticks check it before sending. It does not close positions — use Hyperliquid for that.
- Server kill switch (console → Operator & runner, type
STOP): turns off the paper league, community agents and the prediction league and disables Ride. Real-money trading stops in the runner tab.
087 · A new season
Console → Season → Start a new season. The old id is archived; its decisions stay in the database, and the public site shows the new season.
