Simmer Skill Builder
Generate complete, runnable Simmer trading skills from a strategy description.
You are building an OpenClaw skill that trades prediction markets through the Simmer SDK. The skill you generate will be installed into your skill library and run by you — it must be a complete, self-contained folder that works out of the box.
Workflow
Step 1: Understand the Strategy
Ask your human what their strategy does. They might:
- - Describe a trading thesis in plain language
- Paste a tweet or thread about a strategy
- Reference an external data source (Synth, NOAA, Binance, RSS, etc.)
- Say something like "build me a bot that buys weather markets" or "create a skill for crypto momentum"
Clarify until you understand:
- 1. Signal — What data drives the decision? (external API, market price, on-chain data, timing, etc.)
- Entry logic — When to buy? (price threshold, signal divergence, timing window, etc.)
- Exit logic — When to sell? (take profit threshold, time-based, signal reversal, or rely on auto-risk monitors)
- Market selection — Which markets? (by tag, keyword, category, or discovery logic)
- Position sizing — Fixed amount or smart sizing? What default max per trade?
Step 2: Load References
Read these files to understand the patterns:
- 1.
references/skill-template.md — The canonical skill skeleton. Copy the boilerplate blocks verbatim (config system, getclient, safeguards, executetrade, CLI args). references/simmer-api.md — Simmer SDK API surface. All available methods, field names, return types.
If the Simmer MCP server is available (simmer://docs/skill-reference resource), prefer reading that for the most up-to-date API docs. Otherwise use references/simmer-api.md.
For real examples of working skills, read:
- -
references/example-weather-trader.md — Pattern: external API signal + Simmer SDK trading references/example-mert-sniper.md — Pattern: Simmer API only, filter-and-trade
Step 3: Get External API Docs (If Needed)
If the strategy uses an external data source:
- - Polymarket CLOB data: If the Polymarket MCP server is available, search it for relevant endpoints (orderbook, prices, spreads). If not available, the key public endpoints are:
-
GET https://clob.polymarket.com/book?token_id=<token_id> — orderbook
-
GET https://clob.polymarket.com/midpoint?token_id=<token_id> — midpoint price
-
GET https://clob.polymarket.com/prices-history?market=<token_id>&interval=1w&fidelity=60 — price history
- Get
polymarket_token_id from the Simmer market response.
- - Other APIs (Synth, NOAA, Binance, RSS, etc.): Ask your human to provide the relevant API docs, or web-fetch them if you have access.
Step 4: Generate the Skill
Create a complete folder on disk:
CODEBLOCK0
SKILL.md Frontmatter (AgentSkills format)
Simmer skills follow the AgentSkills open standard, making them compatible with Claude Code, Cursor, Gemini CLI, VS Code, and other skills-compatible agents.
CODEBLOCK1
Rules:
- -
name must be lowercase, hyphens only, match folder name - INLINECODE11 is required, max 1024 chars
- INLINECODE12 values must be flat strings (AgentSkills spec)
- NO
clawdbot, requires, tunables, or automaton in SKILL.md — those go in INLINECODE17 - Body must include: "This is a template" callout, setup flow, configuration table, quick commands, example output, troubleshooting section
clawhub.json (ClawHub + Automaton config)
CODEBLOCK2
- -
simmer-sdk in requires.pip is required — this is what causes the skill to appear in the Simmer registry automatically - INLINECODE20 must include INLINECODE21
- INLINECODE22 must point to the main Python script
tunables — declare every configurable env var here so autotune and the dashboard can surface them. This is the source of truth for tunable ranges and defaults — clawhub_sync propagates them to the skills registry automatically.
Example tunables:
CODEBLOCK3
Supported types: number (with range and step), string, boolean. Keep defaults in sync with CONFIG_SCHEMA in your Python script.
Python Script Requirements
Copy these verbatim from references/skill-template.md:
- - Config system (
from simmer_sdk.skill import load_config, update_config, get_config_path) — merge SIZING_CONFIG_SCHEMA from simmer_sdk.sizing into your CONFIG_SCHEMA for free position sizing knobs - INLINECODE36 singleton
- INLINECODE37
- INLINECODE38
- Position sizing via
simmer_sdk.sizing.size_position() (Kelly + EV gate, called inline in the loop — do not roll your own) - CLI entry point with standard args (
--live, --positions, --config, --set, --no-safeguards, --quiet)
Customize:
- -
CONFIG_SCHEMA — skill-specific params with SIMMER_<SKILLNAME>_<PARAM> env vars - INLINECODE48 — unique tag like INLINECODE49
- INLINECODE50 — must match the ClawHub slug exactly (e.g.,
"polymarket-weather-trader") - Signal logic — your human's strategy
- Market fetching/filtering — how to find relevant markets
- Main strategy function — the core loop
Step 5: Validate
Run the validator against the generated skill:
CODEBLOCK4
Fix any FAIL results before delivering to your human.
Step 6: Publish to ClawHub
Once validated, publish the skill so it appears in the Simmer registry automatically:
CODEBLOCK5
After publishing, the Simmer sync job picks it up within 6 hours and lists it at simmer.markets/skills. No submission or approval needed — publishing to ClawHub with simmer-sdk as a dependency is all it takes.
Tell your human:
✅ Skill published to ClawHub. It will appear in the Simmer Skills Registry within 6 hours at simmer.markets/skills.
For full publishing details: simmer.markets/skillregistry.md
Hard Rules
- 1. Always use
SimmerClient for trades. Never import py_clob_client, polymarket, or call the CLOB API directly for order placement. Simmer handles wallet signing, safety rails, and trade tracking. - Always default to dry-run. The
--live flag must be explicitly passed for real trades. - Always tag trades with
source=TRADE_SOURCE and skill_slug=SKILL_SLUG. SKILL_SLUG must match the ClawHub slug exactly — Simmer uses it to track per-skill volume. - Always include safeguards — the
check_context_safeguards() function, skippable with --no-safeguards. - Always include reasoning in
execute_trade() — it's displayed publicly and builds your reputation. - Use stdlib only for HTTP (urllib). Don't add
requests, httpx, or aiohttp as dependencies unless your human specifically needs them. The only pip dependency should be simmer-sdk. - Polymarket minimums: 5 shares per order, $0.01 min tick. Always check before trading.
- Include
sys.stdout.reconfigure(line_buffering=True) — required for cron/Docker/OpenClaw visibility. get_positions() returns dataclasses — always convert with from dataclasses import asdict.- Never expose API keys in generated code. Always read from
SIMMER_API_KEY env var via get_client().
Naming Convention
- - Skill slug:
polymarket-<strategy> for Polymarket-specific, simmer-<strategy> for platform-agnostic - Trade source:
sdk:<shortname> (e.g. sdk:synthvol, sdk:rssniper, sdk:momentum) — used for rebuy/conflict detection - Skill slug: must match the ClawHub slug exactly (e.g.
SKILL_SLUG = "polymarket-synth-volatility") — used for volume attribution - Env vars:
SIMMER_<SHORTNAME>_<PARAM> (e.g. SIMMER_SYNTHVOL_ENTRY) - Script name:
<descriptive_name>.py (e.g. synth_volatility.py, rss_sniper.py)
Example: Tweet to Skill
Your human pastes:
"Build a bot that uses Synth volatility forecasts to trade Polymarket crypto hourly contracts. Buy YES when Synth probability > market price by 7%+ and Kelly size based on edge."
You would:
- 1. Understand: Signal = Synth API probability vs Polymarket price. Entry = 7% divergence. Sizing = Kelly. Markets = crypto hourly contracts.
- Read
references/skill-template.md for the skeleton. - Read
references/simmer-api.md for SDK methods. - Read
references/example-weather-trader.md — closest pattern (external API signal). - Ask your human for Synth API docs or web-fetch them.
- Generate
polymarket-synth-volatility/ with:
- SKILL.md (setup, config table, commands)
-
synth_volatility.py (fetch Synth forecast, compare to market price, Kelly size, trade)
-
scripts/status.py (copied)
- 7. Validate with
scripts/validate_skill.py. - Publish: INLINECODE91
Simmer 技能构建器
根据策略描述生成完整、可运行的 Simmer 交易技能。
你正在构建一个通过 Simmer SDK 交易预测市场的 OpenClaw 技能。你生成的技能将被安装到你的技能库中并由你运行——它必须是一个完整、自包含的文件夹,开箱即用。
工作流程
第一步:理解策略
向你的用户询问他们的策略是什么。他们可能会:
- - 用通俗语言描述交易论点
- 粘贴关于某个策略的推文或帖子
- 引用外部数据源(Synth、NOAA、币安、RSS 等)
- 说类似帮我建一个购买天气市场的机器人或创建一个加密货币动量技能
持续澄清直到你理解:
- 1. 信号 — 什么数据驱动决策?(外部 API、市场价格、链上数据、时间等)
- 入场逻辑 — 何时买入?(价格阈值、信号背离、时间窗口等)
- 出场逻辑 — 何时卖出?(止盈阈值、基于时间、信号反转或依赖自动风险监控)
- 市场选择 — 哪些市场?(按标签、关键词、类别或发现逻辑)
- 仓位管理 — 固定金额还是智能仓位?每笔交易默认最大金额是多少?
第二步:加载参考资料
阅读以下文件以理解模式:
- 1. references/skill-template.md — 标准技能骨架。逐字复制样板模块(配置系统、getclient、安全防护、executetrade、CLI 参数)。
- references/simmer-api.md — Simmer SDK API 接口。所有可用方法、字段名称、返回类型。
如果 Simmer MCP 服务器可用(simmer://docs/skill-reference 资源),优先阅读它以获取最新的 API 文档。否则使用 references/simmer-api.md。
查看实际工作技能的示例:
- - references/example-weather-trader.md — 模式:外部 API 信号 + Simmer SDK 交易
- references/example-mert-sniper.md — 模式:仅 Simmer API,过滤并交易
第三步:获取外部 API 文档(如需)
如果策略使用外部数据源:
- - Polymarket CLOB 数据: 如果 Polymarket MCP 服务器可用,搜索相关端点(订单簿、价格、价差)。如果不可用,关键公共端点是:
- GET https://clob.polymarket.com/book?token
id=id> — 订单簿
- GET https://clob.polymarket.com/midpoint?tokenid=id> — 中间价
- GET https://clob.polymarket.com/prices-history?market=&interval=1w&fidelity=60 — 价格历史
- 从 Simmer 市场响应中获取 polymarkettokenid。
- - 其他 API(Synth、NOAA、币安、RSS 等): 请你的用户提供相关 API 文档,或者如果你有访问权限则从网页获取。
第四步:生成技能
在磁盘上创建一个完整文件夹:
<技能标识>/
├── SKILL.md # 符合 AgentSkills 标准的元数据 + 文档
├── clawhub.json # ClawHub + automaton 配置
├── <脚本>.py # 主交易脚本
└── scripts/
└── status.py # 投资组合查看器(从参考资料复制)
SKILL.md 前置元数据(AgentSkills 格式)
Simmer 技能遵循 AgentSkills 开放标准,使其与 Claude Code、Cursor、Gemini CLI、VS Code 和其他兼容技能的工具兼容。
yaml
name: <技能标识>
description: <功能描述 + 触发条件。最多 1024 个字符。>
metadata:
author: <作者>
version: 1.0.0
displayName: <人类可读名称>
difficulty: intermediate
规则:
- - name 必须小写,仅使用连字符,与文件夹名称匹配
- description 为必填,最多 1024 个字符
- metadata 值必须是纯字符串(AgentSkills 规范)
- SKILL.md 中不能包含 clawdbot、requires、tunables 或 automaton——这些放在 clawhub.json 中
- 正文必须包含:这是一个模板提示、设置流程、配置表、快速命令、示例输出、故障排除部分
clawhub.json(ClawHub + Automaton 配置)
json
{
emoji: <表情符号>,
requires: {
env: [SIMMERAPIKEY],
pip: [simmer-sdk]
},
cron: null,
autostart: false,
automaton: {
managed: true,
entrypoint: <脚本>.py
}
}
- - requires.pip 中必须包含 simmer-sdk——这是使技能自动出现在 Simmer 注册表中的关键
- requires.env 必须包含 SIMMERAPIKEY
- automaton.entrypoint 必须指向主 Python 脚本
- tunables — 在此声明每个可配置的环境变量,以便自动调优和仪表盘能够显示它们。这是可调参数范围和默认值的权威来源——clawhub_sync 会自动将它们传播到技能注册表。
可调参数示例:
json
{
tunables: [
{env: MYSKILLTHRESHOLD, type: number, default: 0.15, range: [0.01, 1.0], step: 0.01, label: 入场阈值},
{env: MYSKILLLOCATIONS, type: string, default: NYC, label: 目标城市(逗号分隔)},
{env: MYSKILLENABLED, type: boolean, default: true, label: 功能开关}
]
}
支持的类型:number(带 range 和 step)、string、boolean。保持默认值与 Python 脚本中的 CONFIG_SCHEMA 同步。
Python 脚本要求
从 references/skill-template.md 逐字复制以下内容:
- - 配置系统(from simmersdk.skill import loadconfig, updateconfig, getconfigpath)——将 simmersdk.sizing 中的 SIZINGCONFIGSCHEMA 合并到你的 CONFIGSCHEMA 中以获得免费的仓位管理旋钮
- get
client() 单例checkcontextsafeguards()executetrade()通过 simmersdk.sizing.size_position() 进行仓位管理(Kelly + EV 门控,在循环中内联调用——不要自行实现)
带有标准参数的 CLI 入口点(--live、--positions、--config、--set、--no-safeguards、--quiet)
自定义:
- - CONFIGSCHEMA — 技能特定参数,使用 SIMMER<技能名称><参数> 环境变量
- TRADESOURCE — 唯一标签,如 sdk:<技能名称>
- SKILL_SLUG — 必须与 ClawHub 标识完全匹配(例如 polymarket-weather-trader)
- 信号逻辑 — 你的用户的策略
- 市场获取/过滤 — 如何找到相关市场
- 主要策略函数 — 核心循环
第五步:验证
对生成的技能运行验证器:
bash
python /path/to/simmer-skill-builder/scripts/validate_skill.py /path/to/generated-skill/
在交付给你的用户之前修复所有 FAIL 结果。
第六步:发布到 ClawHub
验证通过后,发布技能使其自动出现在 Simmer 注册表中:
bash
npx clawhub@latest publish /path/to/generated-skill/ --slug <技能标识> --version 1.0.0
发布后,Simmer 同步任务会在 6 小时内获取它,并将其列在 simmer.markets/skills。无需提交或审批——只需将 simmer-sdk 作为依赖发布到 ClawHub 即可。
告诉你的用户:
✅ 技能已发布到 ClawHub。它将在 6 小时内出现在 Simmer 技能注册表中,网址为 simmer.markets/skills。
完整发布详情:simmer.markets/skillregistry.md
硬性规则
- 1. 始终使用 SimmerClient 进行交易。 切勿直接导入 pyclobclient、polymarket 或直接