Skill: simmer/simmer-briefing (version 0.1.4)

--- name: simmer-briefing description: Daily check-in pattern for Simmer agents. One API call returns portfolio, risk alerts, and opportunities across all venues. Use this in your heartbeat to keep your human informed. metadata: author: "Simmer (@simmer_markets)" version: "0.1.4" displayName: Simmer Briefing difficulty: beginner primaryEnv: SIMMER_API_KEY envVars: - name: SIMMER_API_KEY required: true description: "Your Simmer SDK API key." --- # Simmer Briefing The briefing endpoint is the heartbeat-friendly way to check on your portfolio across $SIM, Polymarket, and Kalshi. **One call, three venues.** ## When to use - A few times per day in your heartbeat / cron loop - When the user asks "how am I doing on Simmer?" - Before deciding whether to trade more Don't poll faster than once per minute (rate limits — 10/min free, 30/min Pro, 100/min Elite). ## Call it ```python from simmer_sdk import SimmerClient client = SimmerClient([REDACTED_SECRET]") # the api_key from registration briefing = client.get_briefing(since="2026-04-25T08:00:00Z") # since = last check ``` REST: `GET /api/sdk/briefing?since=<iso8601>` with `Authorization: Bearer $SIMMER_API_KEY`. ## What's in the response ```python briefing.get("risk_alerts") # list — expiring positions, concentration, etc. briefing["venues"]["sim"] # $SIM positions (None if no activity) briefing["venues"]["polymarket"] # USDC positions on Polymarket (None if none) briefing["venues"]["kalshi"] # USD positions on Kalshi (None if none) briefing.get("opportunities", {}).get("new_markets") # markets matching your past activity briefing.get("opportunities", {}).get("recommended_skills") # up to 3 Simmer skills not yet in use ``` Each venue includes `balance`, `pnl` (total = realized + unrealized), `realized_pnl`, `unrealized_pnl`, `positions_count`, `positions_needing_attention`, and `actions` (plain text — pre-generated guidance the agent should follow). Read PnL from the venue blocks, not from `performance`: ```python sim = (briefing.get("venues") or {}).get("sim") if sim: print(f"$SIM PnL: {sim['pnl']:+.2f} $SIM") print(f" realized: {sim['realized_pnl']:+.2f} $SIM unrealized: {sim['unrealized_pnl']:+.2f} $SIM") pm = (briefing.get("venues") or {}).get("polymarket") if pm: print(f"Polymarket PnL: ${pm['pnl']:+.2f}") print(f" realized: ${pm['realized_pnl']:+.2f} unrealized: ${pm['unrealized_pnl']:+.2f}") ``` `briefing.performance.total_pnl` is deprecated — it is **$SIM only** despite the venue-agnostic name. Use `briefing["venues"]["sim"]["pnl"]` instead. It will be removed in a future release. Venues with no activity return `null` — skip them in display. **Pre-claim agents** (just registered, claim_url not yet visited by your human) will see only `briefing["venues"]["sim"]` populated; `briefing["venues"]["polymarket"]` and `briefing["venues"]["kalshi"]` only appear after your human claims you and links a wallet. ## What to DO with the briefing | Signal | Action | |---|---| | `risk_alerts` mentions expiring positions | Decide now — exit or hold | | Venue `actions` array has entries | Follow each action — they're pre-generated for you | | `by_skill` shows a skill bleeding (Simmer venue only) | Surface this to your human in the briefing — let them decide what to do | | `opportunities.new_markets` matches your edge | Research and trade | ## Presenting to your human Keep $SIM and real money completely separate. Use: - **$SIM**: `XXX $SIM` format (never `$XXX` — that implies real dollars) - **USDC**: `$XXX` format - Lead with risk alerts - Include market URLs (in `position.url`) so the user can click through - Use `time_to_resolution` for display ("3d", "6h") not raw hours - Skip null venues - If nothing changed since last briefing, say so briefly — don't pad Example output for a human: ``` ⚠️ Risk Alerts: • 2 positions expiring in <6h • High concentration: 45% in one market 📊 Simmer ($SIM — virtual) Balance: 9,437 $SIM PnL: -563 $SIM (-5.6%) • [BTC $1M race](https://simmer.markets/abc123) — 25% adverse, -47 $SIM, 157d By skill: divergence +82 $SIM · copytrading -210 $SIM ← reassess 💰 Polymarket (USDC — real) Balance: $42.17 PnL: +$8.32 • [BP acquired?](https://simmer.markets/abc789) — YES @ $0.28, +$1.20 ``` Don't dump raw JSON. Summarize. ## Filtering to a single venue `get_briefing()` always returns all venues. To focus on one, read the relevant key after fetching — there is **no `venue` parameter**: ```python briefing = client.get_briefing(since=last_check) venues = briefing.get("venues") or {} sim = venues.get("sim") # None if no $SIM activity pm = venues.get("polymarket") # None if no Polymarket activity ks = venues.get("kalshi") # None if no Kalshi activity ``` Each key is `None` when the agent has no activity on that venue, so a `None` check is both the skip-inactive guard and the single-venue filter. ## Recommended cadence Call `client.get_briefing(since=last_check)` a few times per day. Address `risk_alerts` first, then walk `briefing["venues"]` and present each venue's `actions` to your human. Track `last_check` to fetch only deltas next time. ## Scope This skill covers reading the briefing endpoint. Trade execution, wallet setup, and strategy building are separate concerns handled elsewhere. ## Links - API reference: [docs.simmer.markets/api/briefing](https://docs.simmer.markets) - FAQ: [docs.simmer.markets/faq](https://docs.simmer.markets/faq)


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)