---
name: autoresearch
description: Autonomous experiment loop with evidence-driven move selection — scales from parameter tuning (directional search) to architecture innovation (structural changes), with git ledger, guard, noise-aware keep/discard, and trend-analysis stop advice. Use when the user asks to optimize a research metric, run an experiment loop, tune hyperparameters, explore architectural changes, or improve model performance iteratively.
argument-hint: <idea>
---

# Autoresearch

自主实验循环。单策略表覆盖两种尺度：**参数级微调**（改大改小/换参数）和**架构级创新**（结构性改动）。

分工：本 skill 负责**运行**循环。任务还没有可跑的任务包（锁定评估 + 开放文件 + program.md）时，先用 `experiment-forge` 锻造。

Session files: `autoresearch.md`, `autoresearch.sh`, `autoresearch.jsonl`, `results.tsv`, `run-<N>.log`.

**契约单一来源**：results.tsv 表头、循环边界、crash/revert、Guard、min_delta、日志命名的权威定义在 `experiment-forge/references/contract.md`。本文件与契约冲突时以契约为准。

## 两种运行模式

| | 交互式（默认） | 无人值守（`claude -p` / program.md 驱动） |
|---|---|---|
| 停止建议 | 只是建议，用户决定 | 不停止；停滞 → 强制"升级"选步 |
| 硬停止 | maxIterations / 用户打断 | maxIterations / timeout |
| 问用户 | 环境选择、计划确认、停滞建议 | 不问（NEVER STOP） |

**被 research-orchestrator 调用时**：视为无人值守 —— Step 2/3 的交互闸门（AskUserQuestion 环境选择、计划确认）**跳过**。环境沿用调用方已确认的选择或任务包 program.md 的约定；若没有任何已确认配置且无法交互，报 `blocked` 而不是擅自假设。orchestrator 的 Gate 已经做过确认，这里不再二次确认。

## Step 0: 前置检查

- 在 git 仓库内运行；若 `git config user.email` 为空，`git commit` 会失败 —— 先补 repo-local 身份（`git config user.name/email`，询问用户或用已有仓库的惯用身份），再进循环。
- 工作树不干净 / detached HEAD → **不再"开专支即可"**（旧规则会让实验 revert 吞掉用户未提交修改）：
  1. 记录基线 SHA：`git rev-parse HEAD`。
  2. 把用户未提交改动固化为独立 commit：`chore: wip snapshot before autoresearch (<tag>)`。实验 revert 链从此只碰 `experiment:` commit，用户工作永远在链外。
  3. 内容级快照：对 scope 内文件做 `sha256sum` 清单，**作为 wip snapshot commit 的一部分提交**（如 `.autoresearch-baseline.sha256`）。清单绝不能留到实验 commit 里——revert 实验 commit 会把其中新增的文件一并删除。收尾/回滚后用 `git show <snapshot-sha>:.autoresearch-baseline.sha256` 与当前文件哈希对比验证，不只看分支名。
  4. detached HEAD → 先建工作分支再进循环。
  无人值守模式同样执行，不跳过。

## Step 1: Gather

如果 `autoresearch.md` 和 `autoresearch.jsonl` 已存在，问用户续跑还是新开。`CHANGELOG.md` 存在则先读最近条目。

否则收集（一次问完）：
- 优化目标、benchmark 命令、指标名/单位/方向
- 可改文件范围（scope）
- **改动尺度（scale）**：三选一 ——
  - `params`：只调参数（超参/配置/小 trick），锁死架构改动
  - `arch`：只做架构/方法级改动，不在参数上磨
  - `auto`（默认）：不设限，每轮由选步表按上轮结果自由决定（参数级和架构级可混用）
- **Guard 命令**（可选但推荐）：每轮必须通过的安全检查（如冒烟测试）
- **min_delta**（可选）：小于此幅度的"改进"视为噪声，触发确认跑
- maxIterations（默认 20；无人值守模式建议 50+ 或 unlimited）

未明确指定 scale 时默认 `auto` 并在确认计划时向用户说明。

## Step 2: Environment

用 `AskUserQuestion` 让用户选：Local / 新 git 分支 / venv / Docker / Modal / RunPod（详见 `docker`、`modal-compute`、`runpod-compute` skills）。没有明确答案不继续。

## Step 3: Confirm

展示完整计划（目标、命令、范围、环境、Guard、min_delta、迭代数、模式），用户确认后才启动。

## Step 4: 循环

初始化：建专支 `autoresearch/<tag>`，创建 session files，**先跑 baseline（不改任何代码）并记录为 iteration 0**。

每一轮：

### 4.1 Review（读历史，别凭记忆）
- 读 `results.tsv` 最近 10-20 行 + `git log --oneline -20`
- 上轮是 keep → `git diff HEAD~1` 看具体改动
- 明确：什么worked、什么failed、什么没试过

### 4.2 选步（策略表，证据驱动）

| 选步 | 触发 | 动作 |
|---|---|---|
| 跟进 follow | 上轮改进 | 同杠杆同方向再进一步 |
| 反转 reverse | 上轮变差 | 同杠杆反方向 |
| 换杆 switch | 上轮无变化 | 换参数/换模块 |
| 升级 escalate | plateau（连续 5 轮无 keep） | 合并历次 near-miss / 结构性改动 / 读参考文献找角度 |
| 简化 simplify | 指标持平但代码更少 | 保留，记 keep（简洁性胜利） |

这是策略指导不是状态机 —— 每轮在 jsonl 里记 `move` 类型和理由。

**尺度约束（scale）对选步表的裁剪**：
- `params`：**禁用 escalate**（不做架构改动）。plateau 时不升级，而是换杆到未试过的参数/重新扫范围；真没参数可动了就向用户报告并建议是否解除限制。
- `arch`：**跳过参数微调**，follow/reverse/switch 都作用于模块/结构层面；参数只作为新架构的配套调整。
- `auto`：全表可用，尺度切换由证据驱动。

### 4.3 Modify + Commit
- 原子改动（一个逻辑单元），只在 scope 内
- commit message 前缀 `experiment: {描述}`，记录 SHA

### 4.4 Run（防上下文爆炸）
```bash
<benchmark 命令> > run-<N>.log 2>&1   # 每迭代独立日志，禁止覆盖 / tee / 直接输出
grep "^<metric_name>:" run-<N>.log    # 只提取指标行
```
grep 为空 = 崩溃，`tail -n 50 run-<N>.log` 看栈。results.tsv 的 iteration 列与日志文件号一一对应，可对账。

### 4.5 Verify（噪声防护）
- 改进幅度 < min_delta → **确认跑**：重跑 1-2 次取中位数再判定
- 指标非数字/提取失败 → 记 `metric-error`，revert

### 4.6 Guard（如配置）
Guard 失败 → 无论指标如何都 revert，记 `guard-fail`。可重试一次不同实现，仍失败则换方向。

### 4.7 Decide（六态）
- **keep**：指标改进（超 min_delta）且 Guard 过 → 分支前进
- **discard**：指标变差 → `git revert HEAD --no-edit`（**不用 reset —— 失败保留在历史里供学习**）
- **crash**：运行崩溃 → 语法/导包错误立即免费修复重跑；运行时错误最多自动修 3 次；修不好 revert 记 crash
- **no-op**：本轮无有效改动
- **blocked**：外部依赖失效（数据集/服务/权限）

### 4.8 Log
`results.tsv`（TAB 分隔）：`iteration timestamp commit metric delta guard status move description`
`autoresearch.jsonl`：完整 JSON 行（hypothesis、files changed、wall time、evidence pointer）

### 4.9 Checkpoint（每 5 轮）
趋势分析：keep 率、连续 discard 数、delta 递减、最大单次飞跃。
输出建议：**continue / change-strategy / stop**（交互式=建议；无人值守=change-strategy 时强制 escalate）。

### 4.10 停滞规则
连续 10 轮无 keep：
- 交互式 → 停下来向用户汇报趋势和建议
- 无人值守 → 自动执行升级选步（合并 near-miss / 激进重构 / 换 hypothesis 空间），记入 jsonl

## Step 5: 收尾

循环结束（达成/停滞/上限/打断）时输出：
- 总迭代数、keep/discard/crash 分布、baseline → 最终指标、提升 %
- Top 3 最有效改动 + 最大失败教训
- 最优 commit 指针（`git log` 定位）
- CHANGELOG 追加条目；关键结论按全局约定写 provenance

## Subcommands

- `autoresearch <text>` — 启动/续跑
- `autoresearch off` — 停止，保留数据
- `autoresearch clear` — 清除状态重来
