BrainHarness Autoresearch
Use when user wants to optimize, improve, benchmark, or evaluate a skill's prompt. Triggers on "optimize skill", "improve skill prompt", "benchmark skill", "eval skill", "run autor…
ZHANG Ning
@zning1994
Install
$ openclaw skills install @zning1994/brainharness-autoresearchbrainharness-autoresearch
Previously published as
brainforge-autoresearch, with earlier namesautoresearch/openclaw-autoresearch. Renamed for the BrainHarness marketplace; functionality unchanged.
Autonomous prompt optimization for AI agent skills. Runs controlled experiments to find better prompt variants using the Karpathy autoresearch pattern: generate hypothesis, mutate prompt, evaluate, repeat.
When to use
- 用户说"优化一下这个 skill" / User says "optimize this skill's prompt"
- 用户要对比不同 prompt 版本的效果 / User wants to benchmark prompt variants
- 用户说"run autoresearch on X" / "eval skill X" / "improve skill X"
- 用户对 skill 输出质量不满,想系统性改进 / User is unhappy with skill output quality and wants systematic improvement
Do not use:
- 一次性的小改动(直接改 prompt 即可) / One-off prompt tweaks — just edit the prompt directly
- 调试某个特定失败 case / Debugging a specific failure — investigate the root cause instead
- Skill 脚本本身有 bug(代码逻辑问题不是 prompt 问题) / Skill script has a bug — fix the code, not the prompt
Requirements
- Python 3.10+
autoresearch.pyscript in the skill directory- LLM API access (MiniMax, OpenAI, or Anthropic)
- Target skill must have a prompt file (SKILL.md, SYSTEM.md, or similar)
Procedure
Always follow these steps in order: (1) Create eval.json, (2) Run autoresearch command, (3) Review results and apply best prompt.
Step 1: Gather context
Before running, you need:
| Parameter | Description | Example |
|---|---|---|
--target | Path to the skill directory or prompt file to optimize | ../workspace/skills/brain-search/SKILL.md |
--evals | Path to eval definition JSON file | eval.json |
--provider | LLM provider for running experiments | minimax (default), openai, anthropic |
--runs | Number of runs per experiment (statistical significance) | 5 (default) |
--max-experiments | Maximum experiments before stopping | 30 (default) |
--dashboard | Open live results dashboard in browser | flag, no value |
Step 2: Create eval.json
Define test inputs and evaluation criteria. Each eval is a binary pass/fail check.
{
"test_inputs": [
"search for latest AI agent frameworks",
"find news about LLM inference optimization",
"搜一下 transformer 架构的最新进展"
],
"evals": [
{
"name": "has_sources",
"type": "rule",
"rule": "regex",
"pattern": "(https?://|Source:|来源:)"
},
{
"name": "no_hallucinated_urls",
"type": "rule",
"rule": "banned_phrases",
"phrases": ["example.com", "placeholder.url"]
},
{
"name": "sufficient_detail",
"type": "rule",
"rule": "word_count",
"min": 50,
"max": 500
},
{
"name": "contains_summary",
"type": "rule",
"rule": "contains",
"values": ["summary", "key findings", "结论"]
},
{
"name": "no_apology_prefix",
"type": "rule",
"rule": "not_contains",
"values": ["I apologize", "I'm sorry, but"]
},
{
"name": "actionable_output",
"type": "llm",
"question": "Does the response provide actionable information the user can immediately use (links, specific facts, concrete next steps)?",
"pass_description": "The response contains specific actionable items like URLs, concrete facts, or clear next steps",
"fail_description": "The response is vague, generic, or lacks specific actionable information"
}
]
}
Rule types:
| Rule | Parameters | Description |
|---|---|---|
regex | pattern | Pass if regex matches output |
banned_phrases | phrases (list) | Pass if NONE of the phrases appear |
word_count | min, max (optional) | Pass if word count is within range |
contains | values (list), optional match: "any" (default) or "all" | Pass if any/all values appear in output (case-insensitive) |
not_contains | values (list) | Pass if NONE of the values appear in output (case-insensitive) |
LLM eval type:
| Field | Description |
|---|---|
type | Must be "llm" |
name | Unique name for this eval |
question | What to ask the judge LLM about the output |
pass_description | Description of what a passing output looks like |
fail_description | Description of what a failing output looks like |
See eval-guide.md for detailed guidance on writing effective evals.
Step 3: Run autoresearch
python autoresearch.py \
--target ../workspace/skills/brain-search/SKILL.md \
--evals eval.json \
--provider minimax \
--runs 5 \
--max-experiments 30 \
--dashboard
Step 4: Review results and apply changes
The script writes results to results.tsv in the working directory. Each row is one experiment:
experiment_id parent_id mutation_description avg_score pass_rate evals_detail prompt_diff
Find the best performing variant:
cat results.tsv | sort -k4 -nr | head -5
Apply the winning prompt to your skill by copying the optimized prompt text to replace the original.
Example: optimizing brain-search
User: brain-search 的搜索结果经常缺少来源链接,帮我优化一下
完整流程:
1. 创建 eval.json:
{
"test_inputs": [
"search for latest news on OpenAI",
"搜一下最新的 AI 芯片进展",
"find recent papers on RAG optimization",
"what happened with Anthropic this week",
"查查 GPU 价格趋势"
],
"evals": [
{
"name": "has_urls",
"type": "rule",
"rule": "regex",
"pattern": "https?://[^\\s]+"
},
{
"name": "min_2_sources",
"type": "rule",
"rule": "regex",
"pattern": "https?://[^\\s]+.*https?://[^\\s]+"
},
{
"name": "structured_output",
"type": "llm",
"question": "Is the output well-structured with clear sections?",
"pass_description": "Output uses clear structure like bullets or headers",
"fail_description": "Output is a wall of text without clear structure"
}
]
}
2. 运行命令:
python autoresearch.py \
--target ../workspace/skills/brain-search/SKILL.md \
--evals eval.json \
--runs 5 \
--max-experiments 20
3. 查看并应用结果:
- 检查 results.tsv 找最高分变体
- 查看 mutation_description 了解关键改动
- 将最佳 prompt 应用到原始 SKILL.md
Failure handling
| Issue | Action |
|---|---|
| LLM API rate limit | Script auto-retries with backoff; if persistent, reduce --runs |
| Target file not found | Check path, must be readable prompt/skill file |
| All experiments score 0 | Evals may be too strict — review eval definitions, loosen criteria |
| Script crashes mid-run | Results already written to results.tsv are preserved; re-run continues |
Gotchas
- 每次实验会调用 LLM 多次(runs x test_inputs x llm_evals),注意 API 用量 / Each experiment makes multiple LLM calls — watch API usage
- LLM eval 本身有噪声,
--runs设高一点(5+)才有统计意义 / LLM evals are noisy, use 5+ runs for statistical significance - Rule evals 比 LLM evals 更稳定、更便宜,优先用 rule / Rule evals are more stable and cheaper — prefer them
- Baseline 分数太低(< 20%)说明 eval 定义可能有问题,先修 eval / If baseline score is very low, fix evals first
- 优化 prompt 不能解决架构问题(比如搜索 API 本身返回差结果) / Prompt optimization cannot fix architectural issues
Top skills in this category
Agent Browser
@matrixyHeadless browser automation CLI optimized for AI agents with accessibility tree snapshots and ref-based element selection
Browser Use
@shawnpanaAutomates browser interactions for web testing, form filling, screenshots, and data extraction. Use when the user needs to navigate websites, interact with w...
Playwright MCP
@spiceman161Browser automation via Playwright MCP server. Navigate websites, click elements, fill forms, extract data, take screenshots, and perform full browser automation workflows.
Playwright (Automation + MCP + Scraper)
@ivangdavilaAutomates, tests, and debugs browsers with Playwright: locators, auto-waiting, traces, CI runs, and MCP browser control. Use when a test is flaky, times out, or fails only in CI or headless; when a locator matches multiple elements or the wrong one (strict mode violation); when clicks need force, waits become sleeps, or networkidle never settles; for storageState and login setup, request mocking and HAR replay, uploads and downloads, iframes and shadow DOM, popups and dialogs, screenshot diffs that change per machine, trace and report artifacts, sharding a slow suite, device and permission emulation, accessibility checks, driving a real browser through Playwright MCP, extracting data from JS-rendered pages, or porting a Cypress, Puppeteer, or Selenium suite to Playwright. Not for maintaining an existing Cypress or Puppeteer suite (cypress, puppeteer) or for work a plain HTTP request answers (http).
Browser Automation
@peytoncasperAutomate web browser interactions using natural language via CLI commands. Use when the user asks to browse websites, navigate web pages, extract data from websites, take screenshots, fill forms, click buttons, or interact with web applications.