> ## Documentation Index
> Fetch the complete documentation index at: https://docs.simmer.markets/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> Notable changes to Simmer — platform, SDK, and agent-facing APIs.

***

## 2026-07-13 — `simmer-sdk` 0.22.3: `client.get_outcomes()` for settlement-accurate skill metrics

Released [`simmer-sdk` 0.22.3](https://pypi.org/project/simmer-sdk/0.22.3/) on PyPI. New `client.get_outcomes()` method returns settlement-accurate skill outcome summaries for autoresearch metric verification and skill-health signals.

The method returns v1 cash-flow fields (`trades`, `pnl`, `wins`, `losses`) for backward compatibility, plus new v2 settlement-accurate fields sourced from venue-dispatch realized outcomes: `settled_pnl` (sum of realized P\&L across resolved markets), `resolved_markets`, `settled_wins`, `settled_losses`, and `confidence_breakdown` by data source (`settlement`, `native`, `mirror`). The v2 fields correctly attribute buys held to resolution — a buy-and-hold winner now appears in `settled_wins` where v1 `wins` only counted sell rows. Accepts optional `skill_slug` (defaults to the running skill's slug) and `since` (ISO-8601 datetime range filter).

`pip install --upgrade simmer-sdk` to pick it up.

***

## 2026-07-09 — `/api/sdk/markets` now signals capped discovery windows

`GET /api/sdk/markets` now makes the discovery cap explicit. The endpoint returns at most 1,000 matching markets for a search window, then applies `limit`/`offset` inside that window. When a query hits the ceiling, the raw API response includes `truncated: true` and `capped_at_limit: true`; `total` is the capped window size, not the full Simmer catalog count.

For broad scans, filter before paging: use `tags=`, `q=`, `venue=`, `sort=volume|recent`, and `max_hours_to_resolution=` to split the catalog into narrower slices. Each filter is applied before the cap, so `tags=world-cup&sort=volume` returns the top World Cup markets in that slice. This is a discovery-read limit only; market import flows remain uncapped by this window.

***

## 2026-06-29 — `simmer-sdk` 0.22.0: smart order-type defaults for Polymarket trades

Released [`simmer-sdk` 0.22.0](https://pypi.org/project/simmer-sdk/0.22.0/) on PyPI. `client.trade()` no longer forces `order_type="FAK"` when you omit it. The omitted type now flows through to Simmer's backend smart default: GTC for sells, FAK for buys.

If your strategy relied on implicit FAK behavior for every Polymarket order, pass `order_type="FAK"` explicitly going forward. Otherwise, omitted buy orders keep immediate-fill behavior while omitted sells can rest on the book instead of being killed immediately.

`pip install --upgrade simmer-sdk` to pick it up.

***

## 2026-06-27 — `simmer-sdk` 0.21.0: fill price, fee field, and exact-share buy guard

Released [`simmer-sdk` 0.21.0](https://pypi.org/project/simmer-sdk/0.21.0/) on PyPI. This release adds two new `TradeResult` fields and tightens the buy-side parameter contract.

**`TradeResult.fill_price`** is the effective average fill price per share — equivalent to `cost / shares_filled` but now surfaced directly. Use it instead of `new_price` to compute per-share economics without the division. **`TradeResult.fee_rate_bps`** exposes the taker fee rate in basis points (currently 0 on Polymarket; previously the field returned `None`). Both fields are useful for post-trade analysis and for skills that need to verify fill quality on short-window fast markets like crypto Up/Down 5m/15m.

On the buy side, passing `shares` to `client.trade()` on a buy now raises `ValueError` instead of silently ignoring the parameter. Buys are always sized by `amount` (USDC to spend); `shares` is valid only on sells. If you want to buy exactly N shares, compute `amount = N * price` (plus a small buffer for tick rounding) and pass an explicit `price` limit — see [Trading Guide > Sizing a buy](/trading-guide#sizing-a-buy-amount-vs-shares) for the exact pattern.

***

## 2026-06-26 — DOGE and BNB fast markets now auto-indexed

DOGE and BNB Up/Down fast markets, across both 5-minute and 15-minute windows, are now auto-discovered and indexed alongside BTC, ETH, SOL, and XRP. They appear in `client.get_fast_markets()`, `find_markets()`, and `check_market_exists()` without manual slug construction.

This is a server-side catalogue update; no SDK upgrade is required as long as your client is already calling the existing fast-market and discovery methods.

***

## 2026-06-23 — New `market_source` field on trades

`client.get_trades()` and `GET /api/sdk/trades` now include a `market_source` field on every trade row: `"polymarket"`, `"kalshi"`, or `null` for native Simmer markets. This is the origin venue of the mirrored market, not the venue where the trade was recorded.

The field matters most for sim-venue entries. A sim trade still has `venue="sim"`, so `market_source` is the way to tell whether that simulated trade mirrored a Polymarket market, a Kalshi market, or a native Simmer market. Existing clients receive the field automatically in the response payload.

***

## 2026-06-18 — `simmer-sdk` 0.20.3: Deposit-wallet combo trading

Released [`simmer-sdk` 0.20.3](https://pypi.org/project/simmer-sdk/0.20.3/) on PyPI. Agents using a deposit wallet (the default funding model for V2 trading) can now place combo (parlay) orders. Previously only plain-EOA / self-custody wallets could place combos; DW users received a confusing error at settlement.

To enable: call `client.activate_combo_dw()` once before your first combo order. This is a gasless one-time approval that runs through Simmer's relayer — it adds the combo exchange as an approved spender on your deposit wallet. Per-agent scoping is also supported via `client.activate_combo_dw(agent_id="...")`. The SDK checks for the approval on every `place_combo()` call and surfaces a clear `"run activate_combo_dw() first"` error if the activation step was skipped.

`pip install --upgrade simmer-sdk` to pick it up.

***

## 2026-06-16 — Portfolio now includes Polymarket combo positions

`client.get_portfolio()` and `GET /api/sdk/portfolio` now return a `combos` array containing any open Polymarket combo/parlay positions alongside the existing flat CTF positions. Each combo includes its legs, size, payout fields, status, timestamps, and holder address.

Combo count and exposure are included in the Polymarket venue bucket while legacy flat position counts remain unchanged. Agents using the combo trading flow can now track those positions through the standard portfolio endpoint instead of a separate manual lookup.

***

## 2026-06-16 — `simmer-sdk` 0.20.0: V2 orders now attributed to Simmer's builder code

Released [`simmer-sdk` 0.20.0](https://pypi.org/project/simmer-sdk/0.20.0/) on PyPI. V2 orders placed through the SDK now default to Simmer's Polymarket builder code for attribution instead of zero bytes. Prior to this release the `builder` field defaulted to zero unless the operator set `POLY_BUILDER_CODE`, so external and self-custody operators — roughly half of all SDK volume — were shipping unattributed orders. The managed-wallet (server-side) path was already attributed; this release closes the external cohort.

Attribution precedence is: explicit `builder_code` argument → `POLY_BUILDER_CODE` environment variable → Simmer's default. To attribute to your own builder profile, pass `builder_code=...` or set `POLY_BUILDER_CODE`. Pass `ZERO_BYTES32` to opt out entirely. The builder code is a public on-chain attribution identifier, not a secret, and Simmer's builder profile carries **0% maker/taker fees** — attribution adds no cost to operators' trades. Because orders are signed client-side, old installs keep current behavior until upgraded.

`pip install --upgrade simmer-sdk` to pick it up.

***

## 2026-06-16 — `simmer-sdk` 0.19.2: `trade()` rounds to venue precision instead of rejecting full-precision floats

Released [`simmer-sdk` 0.19.2](https://pypi.org/project/simmer-sdk/0.19.2/) on PyPI. `client.trade()` previously raised `ValueError` when `amount` had more than 2 decimal places or `shares` more than 5, requiring every skill to add a `round(cost, 2)` workaround. Planner and Kelly sizing routinely produces values like `16.489550245148255`; without this fix, those trades silently dropped on live runs — the World Cup copytrader lost 3 of 10 trades to this bug alone.

`trade()` now quantizes `amount` to 2 decimals and `shares` to 5 before submission, logging at debug level when it rounds. Sub-precision values that quantize to `0` are still rejected — a `$0` order is never valid. This is input-precision quantization only; the tick-aware rounding of on-chain maker/taker amounts in `signing.py` is unchanged and the two layers never double-round.

`pip install --upgrade simmer-sdk` to pick it up.

***

## 2026-06-15 — `simmer-sdk` 0.19.1: `find_markets()` now reaches the full active catalogue

Released [`simmer-sdk` 0.19.1](https://pypi.org/project/simmer-sdk/0.19.1/) on PyPI. `find_markets(query)` previously fetched an unfiltered `get_markets(limit=100)` window and filtered client-side, so any market outside the newest-N server window was invisible — most visibly a large portion of live World Cup markets that agents could see on the dashboard but not discover via `find_markets()`. It now pushes the query to the server-side `q` filter, which is applied before the window cap, so older-but-active markets are found. Queries shorter than 2 characters fall back to the previous windowed scan.

Trading was never affected — this is a discovery-only fix, and `get_markets(tags=..., q=..., sort="volume")` already reached these markets. The companion MCP tool `simmer_get_markets` (simmer-mcp 3.4.3) also gains a tool-description note clarifying that unfiltered browse is windowed and to pass `tags`/`q`/`sort` to reach a full category.

`pip install --upgrade simmer-sdk` to pick it up.

***

## 2026-06-15 — `/api/sdk/markets` default ordering is now liquidity-first

The default ordering of `get_markets()` (and `GET /api/sdk/markets`) when you don't pass a `sort` parameter is now **liquidity-first**: active markets come back ordered by 24h trading volume (`volume_24h DESC`, ties broken by recency), the same as `sort="volume"`. A plain `get_markets()` call now surfaces liquid, tradeable markets instead of the newest imports.

This is the change the 0.17.31 note below (2026-06-12) flagged as coming "after June 19" — it shipped a few days ahead of that. If your strategy depends on newest-first ordering, pin `sort="recent"` (or the legacy alias `sort="created"`) and your results are unchanged; that pin has been available since 0.17.31. Filtered discovery is unaffected — `q=` and `tags=` have always applied before the result window, regardless of sort.

***

## 2026-06-14 — `simmer-sdk` 0.19.0: `simmer backtest` self-serve tape download

Released [`simmer-sdk` 0.19.0](https://pypi.org/project/simmer-sdk/0.19.0/) on PyPI. `simmer backtest` no longer requires a local tape. Omit `--tape` and pass `--window 30d` (or `--t0`/`--t1`) and the engine fetches the appropriate slice from Simmer's backend tape service (`POST /api/backtest/tape`), slices the canonical Polymarket dataset server-side, and caches it under `~/.simmer/tapes/`. The public Hugging Face dump's CDN serves at \~0.44 MB/s — too slow for practical client-side slicing; the backend stages the dataset into fast object storage and slices intra-datacenter.

```bash theme={null}
simmer backtest ./my-skill --entrypoint run.py --t0 2026-03-01 --t1 2026-03-08
simmer backtest ./my-skill --entrypoint run.py --window 30d
```

New flags `--max-markets` and `--min-volume` clamp the server-side slice (server caps at 1000 markets); `--base-url` defaults to `SIMMER_API_URL` or production. The programmatic API `run_backtest(...)` now accepts `tape=None` to trigger a fetch, plus `max_markets`, `min_volume`, and `base_url` kwargs. `--tape <local>` stays as a BYO escape hatch. Data coverage currently ends around 2026-05-05.

`pip install --upgrade simmer-sdk` to pick it up.

***

## 2026-06-13 — `simmer-sdk` 0.18.0: `simmer backtest` — local historical backtesting, plus Hyperliquid signing (preview)

Released [`simmer-sdk` 0.18.0](https://pypi.org/project/simmer-sdk/0.18.0/) on PyPI. The new `simmer backtest` console command replays an **unmodified** skill bundle against historical prediction-market data before you risk capital — the missing *historical* leg alongside the existing live-forward modes (sim-venue, dry-run, paper-trade). Install the extra and run it:

```bash theme={null}
pip install 'simmer-sdk[backtest]'
simmer backtest ./my-skill --entrypoint run.py --tape ./slice \
    --t0 2026-03-01 --t1 2026-03-08 [--cadence 12h] [--out report.json]
simmer backtest --demo        # bundled offline demo, no tape needed
```

The engine runs locally, replaying your real skill subprocess against a frozen, look-ahead-safe replay server, and returns pnl, hit-rate, drawdown, trades, decisions, buy-and-hold / random baselines, realism gaps, and a reproducible `config_hash`. There's a programmatic mirror at `simmer_sdk.backtest.run_backtest(...)`. Self-serve tape download (`--window`) lands in a follow-up; for now pass `--tape <local-slice>` or `--demo`.

This release also adds an opt-in **Hyperliquid** venue adapter (`pip install 'simmer-sdk[hyperliquid]'`, reached via `client.hyperliquid`) for HIP-4 outcome-market signing. It is preview-only: signing is validated offline, but end-to-end funded trading is still pending and default trading behavior is unchanged.

`pip install --upgrade simmer-sdk` to pick it up.

***

## 2026-06-12 — `simmer-sdk` 0.17.32: Binance-trio skills read signals from Simmer's data plane

Released [`simmer-sdk` 0.17.32](https://pypi.org/project/simmer-sdk/0.17.32/) on PyPI. The three Binance-momentum skills — `polymarket-fast-loop`, `polymarket-fast-scaler`, and `polymarket-btc-up-down-trader` — now read their BTC momentum signal from Simmer's data plane via `client.get_candles()` instead of calling `api.binance.com` directly. They use closed candles only, and under the backtest replay harness the same call is clamped to the frozen tick — so these skills are now backtestable with `simmer backtest` (0.18.0) rather than silently fetching live, future-relative data during a replay.

`pip install --upgrade simmer-sdk` to pick it up.

***

## 2026-06-12 — `simmer-sdk` 0.17.31: `venue`/`sort`/`tags` discovery filters, and an upcoming default-ordering change

Released [`simmer-sdk` 0.17.31](https://pypi.org/project/simmer-sdk/0.17.31/) on PyPI. `client.get_markets()` gains three keyword-only arguments for market discovery. `sort="volume"` ranks results by 24h trading volume, so liquid, tradeable markets come first; this is now the recommended way to browse for trading candidates. `tags="world-cup"` filters by market tags (comma-separated, all tags must match). `venue="sim"`, `venue="polymarket"`, or `venue="kalshi"` filters by trading venue. Positional call sites from earlier versions are unaffected.

The `venue` filter also fixes a server-side bug: `GET /api/sdk/markets?venue=sim` previously mapped to an internal source filter that matched almost nothing, so it silently returned a near-empty list. `venue=sim` now correctly returns all active markets, since every market is paper-tradeable on the sim venue. The same fix applies to `/api/sdk/fast-markets`. Unrecognized `venue` or `sort` values now return a `warning` field in the response instead of failing silently.

One behavior to know about: unfiltered `get_markets()` browse returns a server-capped slice of the catalog (the newest \~1,000 of all active markets), not the full set. To reach a specific older market, filter with `q=` or `tags=`. **Planned change:** in a release after June 19, the default ordering of unfiltered browse will flip from newest-first to liquidity-first (equivalent to `sort="volume"`), so a plain `get_markets()` call surfaces tradeable markets instead of the newest imports. If your strategy depends on newest-first ordering, pin `sort="recent"` now and nothing will change for you. **Update (2026-06-15):** this shipped a few days early — the liquidity-first default is now live (see the 2026-06-15 entry above). The `sort="recent"` pin still preserves newest-first.

`pip install --upgrade simmer-sdk` to pick it up.

***

## 2026-06-12 — Two new Polymarket skills on ClawHub: World Cup Copytrader and Fast Scaler

Alongside the 0.17.31 SDK release, two new trading skills published to ClawHub.

**`polymarket-worldcup-copytrader`** copies the auto-curated top World Cup traders on Polymarket. Unlike the base `polymarket-copytrading` skill, which needs a manually maintained wallet list, this one fetches its leader set automatically from Simmer's daily World Cup curation — the top copyable WC sharps, screened by slippage-adjusted copy-PnL. It aggregates positions across all leaders size-weighted, detects conflicting signals, and filters stale or drifting wallets. It defaults to dry-run and sim-first (`--venue sim`); point it at real USDC only once you've watched it on the synthetic venue. Because copytrading executes without per-trade approval, treat it as novel-risk automation. Install with `clawhub install polymarket-worldcup-copytrader`.

**`polymarket-fast-scaler`** (v1.0.0) is a magnitude-gated BTC 5-minute fast-market strategy. It fires only when short-term BTC momentum clears its magnitude gate — the regime its backtest found EV-positive — and scales position size across three conviction tiers. It was live-tested for 48 hours on a real Polymarket wallet, honoring its budget cap. Install with `clawhub install polymarket-fast-scaler`.

`pip install --upgrade simmer-sdk` for the SDK; browse published skills with `clawhub search polymarket`.

***

## 2026-06-10 — `simmer-sdk` 0.17.29: security hardening for signing flows

Released [`simmer-sdk` 0.17.29](https://pypi.org/project/simmer-sdk/0.17.29/) on PyPI. This release adds client-side validation for server-supplied EIP-712 signing batches before local wallets sign activation, redemption, or wrap transactions. The SDK now refuses unexpected batch payloads instead of asking external wallets, OWS, or per-agent wallets to sign them.

The validation checks that each prepared batch targets pinned Polymarket contracts, uses an allowed selector, and names a pinned spender. The SDK also rejects non-HTTPS `base_url` values except for loopback development URLs, and adds upper version bounds on signing-critical dependencies so fresh installs do not silently pick up incompatible signing libraries.

Upgrade is recommended for anyone signing locally, including external-wallet, OWS, and per-agent wallet flows:

```bash theme={null}
pip install --upgrade simmer-sdk
```

***

## 2026-06-08 — `simmer-sdk` 0.17.28: `get_markets(q=...)` keyword search

Released [`simmer-sdk` 0.17.28](https://pypi.org/project/simmer-sdk/0.17.28/) on PyPI. `client.get_markets()` now accepts a `q` keyword-search argument that filters active markets by question (min 2 chars, case-insensitive). The backend `/api/sdk/markets` endpoint already supported `q`; this release brings the SDK signature in line with the documented `get_markets(q="bitcoin", limit=5)` example in the Quickstart and Trading Guide. Existing callers without `q` continue to receive all active markets.

`pip install --upgrade simmer-sdk` to pick it up.

***

## 2026-06-06 — `simmer-sdk` 0.17.27: truthful venue logging and per-agent raw-key setup

Released [`simmer-sdk` 0.17.27](https://pypi.org/project/simmer-sdk/0.17.27/) on PyPI. The SDK no longer reads or mentions `TRADING_VENUE` during client initialization as if that environment variable selected where trades go. The active venue is set by `SimmerClient(..., venue=...)` or `SimmerClient.from_env(venue=...)`, still defaults to `sim`, and live Polymarket trading still requires explicitly passing `venue="polymarket"`. The startup log now calls out PAPER mode for `sim` and LIVE mode for real-funds venues.

This release also adds raw-private-key support for per-agent Polymarket CLOB credential caching. Browser-backed per-agent wallets can now run `client.update_agent_wallet_creds(agent_id="...")` with `WALLET_PRIVATE_KEY` set; the SDK derives CLOB API credentials locally with `py-clob-client` and uploads the encrypted credential payload through the existing agent-wallet endpoint. OWS callers keep using `client.update_agent_wallet_creds(ows_wallet_name="...")`.

`pip install --upgrade simmer-sdk` to pick up both fixes.

***

## 2026-06-02 — Trade-path reliability sweep

Several Polymarket trade and redemption paths have been tightened after live-user failures. The SDK settings endpoint now reports the correct V2 deposit-wallet balance for pUSD users instead of showing `polymarket_usdc_balance = 0`, and a stale `sdk_user_settings_safe` view was resynced so trade-path queries no longer fail with `column s.portfolio_cap_pct does not exist`.

Redemption handling is also stricter around edge cases users could see in the dashboard or SDK. External deposit-wallet redemption prepare calls now check on-chain payout readiness before returning signable typed data, so markets in the `neg_risk_not_determined` window surface as not-yet-redeemable instead of failing later at the relayer. Portfolio `redeemable_count` now excludes losing neg-risk legs that would redeem for \$0, and managed-wallet sweep logic now double-checks zero balances before writing a skip marker.

No SDK upgrade is required for the server-side fixes. If your agent cached settings or portfolio responses during the affected window, refresh them before making a sizing or redemption decision.

***

## 2026-06-01 — Per-agent and Elite auth hardening

Per-agent API keys now scope `/agents/me`, `/trades`, `/positions`, `/portfolio`, and `/positions/expiring` to the agent's own wallet and account context. This fixes cases where per-agent calls could reflect parent-user data instead of the agent-specific view, which was confusing for multi-strategy Elite setups and unsafe for clean per-agent accounting.

Tier gates now consistently treat Elite as including Pro access, auth caches are invalidated when agent-wallet rows change, and wallet status checks no longer trust stale allowance flags. Per-agent wallets also track spender-version state, so Simmer only re-checks on-chain approvals when the spender set changes instead of repeatedly doing the same RPC work.

If you run Elite agents with separate wallets, no migration step is needed. Re-authenticate or restart long-running agents if they were started before this hardening pass and still hold old cached auth state.

***

## 2026-05-31 — Dashboard onboarding and creator surfaces

The dashboard now has a clearer path for users who already have an agent runtime, such as Hermes, OpenClaw, or a custom host. The start flow separates "create a new agent" from "connect an existing runtime", and wallet activation now checks actual trading readiness: deposit wallet deployed, CLOB allowances set, and usable balance funded.

Creator and discovery surfaces also got more practical. Utility-skill trend charts now show cumulative installs instead of an empty trading-volume line, the Skills page has Official/Community plus category filters matching the Markets layout, the start page install banner has Any Agent / ClawHub / MCP tabs, and Markets can show per-category featured-skill banners.

These changes are dashboard-only. If you are connecting an existing runtime, start from the connect-existing path and complete the wallet readiness checklist before expecting live Polymarket orders to pass preflight.

***

## 2026-05-30 — `simmer-sdk` 0.17.25: news-recency guard and DCA scaffold

Released [`simmer-sdk` 0.17.25](https://pypi.org/project/simmer-sdk/0.17.25/) on PyPI. The new `simmer_sdk.guards.news_recency_veto` module gives fast Polymarket strategies a defensive check for short-dated markets immediately after known macro-news events such as CPI, FOMC, nonfarm payrolls, and earnings. The guard is wired into `polymarket-fast-loop` and `polymarket-mert-sniper` by default; set `enable_news_veto=false` only if your strategy intentionally handles that window.

This release also adds a `polymarket-dca-eval-trader` scaffold in the SDK repo's `skills/` directory. It is a paper-safe staged-entry template with three tranches, per-market and daily exposure caps, and an eval-envelope simulator for drawdown-shaped constraints. It is marked as a scaffold and is not yet published to ClawHub or included in the pip wheel.

Upgrade with `pip install --upgrade simmer-sdk`. Existing fast-loop and mert-sniper users should leave the news veto enabled unless they have their own event-timing controls.

***

## 2026-05-30 — Polymarket positions now use PolyNode on-chain data

Simmer moved Polymarket position source-of-truth from the Polymarket CLOB data API to PolyNode's on-chain indexer. Positions now have better coverage around pre-resolution and post-redemption states, including awaiting-resolution UI pills, per-agent deposit-wallet routing, and cost-basis handling for redeemed wins.

This reduces dependence on a single vendor feed for position visibility. Users should see fewer missing or stale Polymarket positions in Portfolio, and per-agent wallets get a cleaner position book that matches the wallet actually trading.

No API shape migration is required for ordinary `client.get_positions()` callers. Treat the improved position records as the same endpoint with a stronger data source underneath.

***

## 2026-05-29 — `simmer-sdk` 0.17.24: bulk top-of-book quotes

Released [`simmer-sdk` 0.17.24](https://pypi.org/project/simmer-sdk/0.17.24/) on PyPI. `client.get_markets()` and `client.get_positions()` now expose `best_bid`, `best_ask`, `best_bid_size`, `best_ask_size`, `spread`, and `quote_ts`, so agents can scan candidates and monitor held positions without calling `executable-price` once per market.

The quote fields are sourced from Simmer's existing order-book cache, with `quote_ts` indicating the snapshot time (typically up to about 30 seconds old). Position quotes use held-side semantics: pure NO-side holders receive the NO token's `best_bid` as their exit price, while YES-only and dual-held positions use the YES side. Use `executable-price` when you need depth-aware fill estimates for a specific order size.

***

## 2026-05-28 — Per-agent wallets (Elite)

Elite users can now run each Simmer agent from its own dedicated on-chain wallet. Every agent gets its own balance, position book, and risk envelope — strategies no longer share an account. Free and Pro tiers continue to use a single user-primary wallet across all agents.

The "one wallet per strategy" pattern is how profitable Polymarket market-makers already work. It gives you three things at once: **performance attribution** (per-strategy PnL is measurable on its own, not muddied by the other agents trading from the same address), **risk isolation** (when one strategy bleeds, the damage stays inside that agent's wallet), and **copytrade-legible history** (a clean one-strategy-per-wallet on-chain footprint that's independently readable, the green-flag pattern copytraders look for).

The per-agent EOA is custodied on your agent host via [`openwallet.sh`](https://openwallet.sh) — Simmer never holds the key. Activation runs from the SDK on the agent's machine: `client.update_agent_wallet_creds(ows_wallet_name=...)`. The dashboard wizard at **Agents → Wallet → Fund and activate trading** walks you through funding the deposit wallet and setting CLOB allowances. See the [per-agent wallets guide](/agents) for the full setup.

***

## 2026-05-24 — Hyperliquid HIP-4 catalog (read-only Stage 1)

Simmer now ingests Hyperliquid HIP-4 prediction markets into the market catalog. This is the first venue expansion beyond Polymarket and Kalshi: agents can discover Hyperliquid markets through the same market listing surfaces, and the dashboard shows Hyperliquid venue chips so those markets are easy to distinguish.

This stage is **read-only**. Hyperliquid markets may appear in `client.get_markets()` responses with Hyperliquid-specific identifiers such as `hyperliquid_outcome_id` and `hyperliquid_question_id`, but trade execution is not wired yet. Trading paths will land in a later stage; for now, treat Hyperliquid records as catalog and research data, not executable venues.

***

## 2026-05-24 — `simmer-mcp` listed on the official MCP Registry

`simmer-mcp` is now discoverable on the [official MCP Registry](https://registry.modelcontextprotocol.io) as `io.github.adlai88/simmer-mcp`. MCP clients that pull from the registry (Claude Desktop, Claude Code, Cursor, and others) can find and install it directly. The install config hasn't changed — `npx -y simmer-mcp` with an optional `SIMMER_API_KEY` for Pro tools.

***

## 2026-05-19 — Aligned auto risk monitor defaults to documented behavior

The `sdk_user_settings` table shipped in April with `default_stop_loss_pct = 0.20` and `default_take_profit_pct = 0.50` — values that pre-dated a March policy update and were never reconciled. For approximately six weeks, the auto risk monitor (`auto_risk_monitor_enabled = true`) was attaching stop-loss at -20% and take-profit at +50% to new positions, while the [Settings reference](/api/overview#settings) said SL=50% and TP=off (prediction markets resolve naturally).

The DB column defaults and SDK code constants now match the documented values: stop-loss 50%, take-profit off, max position \$100. **Existing monitors are not touched** — open positions keep their original thresholds until they close. **Customized settings are preserved** — if you previously set your own values via `PATCH /api/sdk/user/settings`, they stand.

If you'd been relying on the implicit -20% stop-loss as a tighter exit, set it explicitly: `client.update_settings(default_stop_loss_pct=0.20, default_take_profit_pct=0.50)`. See the [Settings reference](/api/overview#settings) for the full schema.

***

## 2026-05-01 — `simmer-sdk` 0.13.0: ergonomic constructors

Released [`simmer-sdk` 0.13.0](https://pypi.org/project/simmer-sdk/0.13.0/) on PyPI. Adds two classmethods so callers never have to read `os.environ` directly: `SimmerClient.from_env()` reads `SIMMER_API_KEY` from the environment and auto-detects `WALLET_PRIVATE_KEY` and `OWS_WALLET` if set. `SimmerClient.with_ows_wallet(name)` is the same idea with the OWS wallet name passed explicitly.

```python theme={null}
# Before
client = SimmerClient(api_key=os.environ["SIMMER_API_KEY"])

# After
client = SimmerClient.from_env()
client = SimmerClient.with_ows_wallet("my-agent-wallet")
```

No behavior change in the regular `SimmerClient(api_key=..., ...)` constructor — these are sugar. They exist so skill bundles and bots can keep `import os` out of their entrypoints, which helps the [ClawHub](https://clawhub.ai) scanner verdict on community-installed skills.

`pip install --upgrade simmer-sdk` to pick them up. See the [SDK Initialization](/sdk/overview#initialization) section for the full pattern.

***

## 2026-04-26 — Heads-up: Polymarket V2 migration on April 28

Polymarket is upgrading its CLOB exchange on **April 28, 2026 at \~11:00 UTC**. The new V2 exchange uses **pUSD** (a 1:1-backed wrapper around USDC.e) as the collateral token. Every pUSD is redeemable for one USDC.e, on-chain, with no deadline.

For most Simmer users this is a one-click migration: log in, click **Migrate to V2** on the dashboard banner, done. Your USDC.e balance becomes the same dollar amount in pUSD, and Polymarket trading continues normally. Kalshi, sim, and your already-resolved positions are unaffected.

After cutover, V1 orders are rejected with `order_version_mismatch`. There is **no deadline** to migrate — your USDC.e remains safe and convertible at any time. You only need to migrate before your next Polymarket trade.

Full detail, including the external-wallet path and FAQ, lives in the [V2 Migration guide](/v2-migration).

***

## 2026-04-25 — `simmer-sdk` 0.12.1: OWS unregistered users fix

Released [`simmer-sdk` 0.12.1](https://pypi.org/project/simmer-sdk/0.12.1/) on PyPI. Patch release.

The SDK was injecting `wallet_address` into every trade payload when `OWS_WALLET` was set. The server then routed the trade through the per-agent-wallet validation path, which requires a row in `user_agent_wallets`. OWS-configured users who hadn't gone through dashboard agent registration saw `Agent wallet not found or not owned by you` on every trade. The SDK now only sends `wallet_address` when the wallet is actually registered for per-agent isolation; the user-level linked-wallet path handles everyone else.

`pip install --upgrade simmer-sdk` to pick up the fix.
