agentleFS
SpartanLabsXyzSpartanLabsXyz/simmer-sdk/skills/simmer-briefing/SKILL.md

simmer-briefing

Skill56 starsChanged 10 days agoMITView on GitHub

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.

  • Reads credentials

The file

We split this skill into the rules it gives an agent

9 rules. About 0 are common, 6 are distinctive, and 3 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈6

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 3

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    When the user asks "how am I doing on Simmer?"

    line 23
  2. Distinctive:

    Before deciding whether to trade more

    line 24
  3. Distinctive:

    Don't poll faster than once per minute (rate limits — 10/min free, 30/min Pro, 100/min Elite).

    line 26
  4. Very specific:

    Read PnL from the venue blocks, not from performance:

    line 52
  5. Distinctive:

    Keep $SIM and real money completely separate.

    line 81
  6. Very specific:

    Use time_to_resolution for display ("3d", "6h") not raw hours

    line 87
  7. Distinctive:

    If nothing changed since last briefing, say so briefly — don't pad

    line 89
  8. Distinctive:

    Don't dump raw JSON. Summarize.

    line 106
  9. Very specific:

    Call client.get_briefing(since=last_check) a few times per day.

    line 125

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

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

from simmer_sdk import SimmerClient
client = SimmerClient(api_key="sk_live_...")  # 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

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:

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

SignalAction
risk_alerts mentions expiring positionsDecide now — exit or hold
Venue actions array has entriesFollow 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 edgeResearch 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:

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

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.