Simmer Autoresearch
Autonomous experiment loop for trading skill optimization: try ideas, keep what works, discard what doesn't, never stop.
Based on pi-autoresearch (MIT).
Tools
init_experiment— configure session (name, skill_slug, metric, unit, direction). Call again to re-initialize with a new baseline.run_experiment— runs skill command, times it, captures output.log_experiment— records result. UsekeepONLY when the primary metric improved vs the baseline.discardif worse or unchanged. Zero trades ormetric=0is no-signal —discard, neverkeep.crashif the skill failed.checks_failedif post-run validation failed.keepauto-commits via git; the others auto-revert. Always include secondarymetricsdict. State the before→after comparison indescription(e.g.,"entry_threshold 0.05→0.03; $12→$18 pnl, keep"). Optionally includeasi(Actionable Side Information) for structured diagnostics.backtest_experiment— replay historical trades against new config without live execution. Fast config tuning (seconds vs hours). Requires trades withsignal_data(SDK 0.9.17+).
Setup
- Pick a skill to optimize and a primary metric (usually P&L).
git checkout -b autoresearch/<skill>-<date>- Read the skill source code thoroughly — understand what it does before mutating.
- Write
autoresearch.md— session spec with goal, metrics, how to run, constraints. - Write
autoresearch.sh— single command that runs the skill and outputs results. - Commit both files.
init_experiment→ run baseline withrun_experiment→log_experiment→ start looping.
autoresearch.md template
# Autoresearch: <goal> ## Objective <What we're optimizing and the workload.> ## Metrics - **Primary**: <name> (<unit>, lower/higher is better) - **Secondary**: <name>, <name>, ... ## How to Run `./autoresearch.sh` — runs the skill for one cycle. ## Constraints - Only modify files in <skill directory> - Do not change SDK core code - Sim venue only (no real money)
The Loop
Each iteration:
- Form a hypothesis (what change might improve the metric?)
- Mutate skill code or config
run_experiment— execute the skilllog_experiment— compare metric to baseline. Improved →keep. Worse or equal →discard. Crashed →crash. Include the before→after comparison indescription.
Code mutations > config tuning. Structural changes (new data sources, different models, alternative strategies) find bigger wins than parameter tweaks.
Use backtest_experiment for fast config exploration before committing to live runs.
Rules
- Primary metric is king. Improved →
keep. Worse or equal →discard. Secondary metrics rarely override this — only discard a primary improvement if a secondary metric degraded catastrophically, and explain why indescription. - No signal =
discard, neverkeep. If the experiment produced 0 trades,metric=0, or no measurable signal, this is a degenerate run — the skill stopped doing the thing you're trying to optimize. Discard so the next iteration tries something different. If you see this twice in a row, stop the loop and investigate the skill itself before mutating further. A dead loop produces meaningless commits and burns runs. - State the comparison in
description. Everylog_experimentshould make the before→after explicit (e.g.,"reduced entry threshold 0.05→0.03; $12→$18 pnl, 4→6 trades, keep"). This is load-bearing for future iterations and for the dashboard to reason about your decisions. - Never skip the baseline run. The first experiment establishes the reference point.
- Always log — even crashes. The data matters for confidence scoring.
- Check confidence before trusting results. >=2x noise floor = likely real. <1x = within noise. 1-2x = marginal, re-run to confirm.
- Don't chase noise. If confidence is low, the improvement may be random. Try a different approach instead of refining a noisy one.
- Don't thrash. Repeatedly reverting the same idea? Try something structurally different.
- Simpler is better. Removing code for equal perf =
keep. Ugly complexity for tiny gain = probablydiscard. - Write ideas to autoresearch.ideas.md. Promising but deferred optimizations go here. Check it for experiment paths.
NEVER STOP. The user may be away for hours. Keep the loop running until interrupted.
Crash Recovery
- Baseline crash -> autoresearch pauses. The skill is misconfigured or the run command is wrong. Fix, then call
init_experimentto start fresh. - 3 consecutive crashes -> autoresearch pauses. Something is systematically broken. Investigate: read crash outputs, check git status, try running manually.
- Context compaction -> re-read
autoresearch.mdandautoresearch.jsonlto restore context.
Configuration
Set via environment variables on the MCP server:
| Variable | Default | Purpose |
|---|---|---|
SIMMER_API_KEY | (required) | API key for dashboard sync and backtest |
SIMMER_API_URL | https://api.simmer.markets | API base URL |
AUTORESEARCH_MAX_EXPERIMENTS | 50 | Max experiments per session (0 = unlimited) |


