AGENTS.md · git:20260623.87fb9b6 · 2026-06-23 · sha256 1b96f8e0f710184c

AGENTS.md git:20260623.87fb9b6A

Immutable. This exact content is served forever at /api/v1/blob/1b96f8e0f710184c.

# AGENTS.md — Simmer SDK

Conventions for AI coding agents and reviewers working in this repo. This is the
**public Python SDK + official skills** for Simmer. See `CONTRIBUTING.md` for PR
hygiene and `README.md` for the client usage patterns. This file captures the
non-obvious rules a reviewer should enforce.

## This repo is public

No secrets, API keys, internal risk thresholds, scoring algorithms, or proprietary
strategy logic. Examples use `sk_live_...` / `sk_test_...` placeholders, never real keys.

## Currency formatting

- **Simmer (simulated) venue:** `$SIM` *suffix* — `100.00 $SIM`.
- **Real venues (Polymarket/Kalshi):** `$` *prefix* — `$100.00`.
- Never `$SIM100.00` or `$100.00 $SIM`.
- When a value or API field could be either, disambiguate by prefixing the field
  name with `sim_` or `usdc_`.

## `live` is a constructor arg, not a per-trade flag

`SimmerClient(..., live=False)` controls paper-vs-real execution for the whole client.
`live=False` previews against the simulated path and places **no real order**. Don't
add a per-call `live=` parameter to trade methods — flag any PR that does.

## Market discovery is recency-windowed

Unfiltered `get_markets()` returns the newest ~1,000 active markets, not the full set.
Code that needs broad coverage must filter (`sort="volume"`, `q=`, `tags=`). A loop
that assumes `get_markets()` sees every market is a bug.

## Wallet signing model

- The SDK signs **locally** — via OWS (`OWS_WALLET`) or a raw `WALLET_PRIVATE_KEY`.
  The Simmer server never holds or sees an external wallet's private key.
- Endpoints that need a browser session token (withdraw, set-allowances,
  place-order-server, wallet create) **cannot** be called from the SDK or an API key.
  SDK code must not pretend to; route users to the dashboard instead.
- DW (deposit-wallet) trading requires activation first (`activate_polymarket_dw`,
  and `activate_combo_dw` for parlays) before `trade()` / `place_combo()` will work.

## Examples must match real client signatures

Doc and skill code examples are bound against the shipped SDK by CI (`skill-example-bind`).
Every `client.<method>(...)` shown in `README.md`, `skills/**/SKILL.md`, or docstrings
must be a real method with real parameter names. Don't introduce illustrative-but-fake
calls — they break the bind gate.

## Skills

- The `simmer` overview skill's canonical source is `skills/simmer/SKILL.md` (the ClawHub
  publish home). Bump `metadata.version` when you change it. Downstream copies (e.g. the
  website's `skill.md`) are **generated** from it — never hand-edit a generated copy.
- User-contributed trading skills belong on ClawHub, not in this repo (see CONTRIBUTING).

## Versioning & publishing

Before republishing to PyPI or ClawHub, bump the version **above the currently published
latest** — a version at or below the live one is silently ignored by installers. Don't
assume the version in source is the published one; check the registry.

## Tests

`pytest tests/`. Keep PRs focused — one fix or one feature; don't mix unrelated changes.