【karpathy/autoresearch】4 文件 Harness 终极极简:让 Agent 跑一整夜的工程哲学
如果说 Harness Engineering 是一个”考试”,那 karpathy/autoresearch 交了一份最极端的答卷——整个仓库只有 4 个文件(README.md、program.md、prepare.py、train.py),没有任何 framework、没有任何 cli 解析、没有任何 retry 框架、没有任何 agent SDK 依赖。它把 Harness Engineering 推到了一个哲学层面:“代码即配置、文件即 API、5 分钟即物理门控”。
2026-03-26 Karpathy 把这个仓库 push 出来的那天,GitHub Trending 直接炸了:90k+ stars(截至 2026-07-07),是同期 harness 类项目的 5–10 倍。一个只跑 nanochat 单 GPU pretraining 的小脚本,怎么就成了 Long-Running Harness 的”教父”?
答案是:它把”长时间跑 Agent”这件事的本质剥得干干净净——没有钩子、没有回调、没有 step state、没有持久化队列、没有 sub-agent 路由,只有一个 bash 循环 + 一个 Markdown prompt + 一个 5 分钟计时器。剩下的全交给 Claude Code 在沙箱里跑。
本文基于 2026-07-07 实测的最新源码(90k⭐ 仓库,530KB 总大小),把 autoresearch 的”极简哲学”用协议级精度拆开,并横向对比 4 个截然不同的 Long-Running Harness 实现:aiming-lab/AutoResearchClaw(Claude Skills 多 Agent 流派)、trigger.dev(TypeScript 生产级 durable 流派)、inngest(Go step functions 流派)、PageAI-Pro/ralph-loop(PRD 任务列表流派)。
一、为什么 Long-Running Harness 是 Harness 6 件套的”压力测试”
Harness 6 件套(Rule / Skill / Sub-Agent / Workflow / Script / MCP)的前 5 个组件,在 2026 上半年都被逐个深挖过了。但有一类 Harness 直到 2026-03 之前都没有”标志性开源样本”——让 Agent 连续跑 8 小时不被中断的 Harness。
这类 Harness 的工程难度被严重低估。表面看只是”写一个 while True 循环”,实际涉及:
| 工程难题 | 朴素解法的失败模式 |
|---|---|
| Context 爆炸 | Agent 跑 100 步后 context 撑爆,token 成本失控 |
| 状态丢失 | 进程被 OOM kill,100 步实验记录全没 |
| Step 卡死 | 某次 LLM 调用 hang 2 小时,浪费一整夜 |
| 预算失控 | 用户没设上限,单晚烧掉 $500 |
| 评估漂移 | Agent 跑偏到不相关的方向,越跑越差 |
| 人工干预 | 跑歪了不知道要不要停下来 |
karpathy/autoresearch 给出了一个完全反 framework 的解法:不解决这些问题,让 Claude Code 自己处理。它只规定 3 件事:
- 能改的文件只有
train.py(prepare.py 只读 + 评估函数不可改) - 每次实验 5 分钟时间预算(物理硬上限)
- branch
autoresearch/<tag>是隔离的工作空间
剩下的”100 步 context 怎么办”、”状态怎么持久化”、”怎么评估进展”,全靠 Claude Code 的 agent loop 自己解决——因为 Claude Code 已经实现了 checkpoint、file-based memory、bash subprocess、prompt cache 这一切。
这就是 autoresearch 的核心洞察:Harness 的”机制”和”策略”可以彻底分离——Claude Code 已经把”机制”做完了,autoresearch 只负责”策略”(约束 + 评估 + 编排)。
二、autoresearch 的 4 文件解剖——每一行都是协议契约
整个仓库只 530KB,4 个文件,每一个都是协议级别的”契约”:
graph TB
subgraph "📁 karpathy/autoresearch 仓库结构"
R["📄 README.md<br/>Teaser + 项目宣言<br/>530KB 仓库唯一文档"]
P["📝 program.md<br/>🟡 唯一 Agent Prompt<br/>含 Skill + Rule + Workflow"]
PP["🔒 prepare.py<br/>🟢 只读评估 + 数据 + tokenizer<br/>修改 = 违规"]
T["⚙️ train.py<br/>🟠 唯一可变文件<br/>模型架构 + 训练循环"]
end
subgraph "🔄 实验循环产物"
LOG["📜 run.log<br/>5 分钟训练 stdout/stderr"]
TSV["📊 results.tsv<br/>commit × val_bpb × memory × status"]
BR["🌿 autoresearch/<tag><br/>branch-based 隔离工作区"]
end
R -.->|"上下文"| P
P -->|"读"| PP
P -->|"修改"| T
T -->|"uv run"| PP
T -->|"输出"| LOG
P -->|"记录"| TSV
P -->|"git commit + reset"| BR
style R fill:#C7CEEA,stroke:#9FA8DA,color:#333
style P fill:#FFF9C4,stroke:#F9A825,color:#333
style PP fill:#B5EAD7,stroke:#80CBC4,color:#333
style T fill:#FFDAB9,stroke:#FFAB76,color:#333
style LOG fill:#F5F5F5,stroke:#9E9E9E,color:#333
style TSV fill:#F5F5F5,stroke:#9E9E9E,color:#333
style BR fill:#E8D5F5,stroke:#CE93D8,color:#3332.1 program.md:Harness 6 件套的”超级 Rule”
把 program.md 单独拎出来,因为它不是一个普通 prompt——它是 Rule + Skill + Workflow 三件套的合一:
| 章节 | 对应 Harness 组件 | 工程作用 |
|---|---|---|
| Setup(步骤 1-6) | Workflow | 固定启动流程(branch → read files → verify data → init tsv) |
| Experimentation(CAN / CANNOT) | Rule | 硬约束:prepare.py 只读 / 不能装新包 / 评估函数不可改 |
| What CAN do | Skill | 允许范围:可以改 train.py 任何东西 |
| Output format | Script | 必须按这个 schema 输出 val_bpb 等指标 |
| The experiment loop | Sub-Agent 编排 | 永久 loop,每步 7 个原子操作 |
| NEVER STOP | Rule(最高优先级) | 永不要问人类、不要暂停、不要自找停止点 |
graph LR
subgraph "🌙 实验循环(用户睡觉时跑)"
S1["🔍 看 git state<br/>branch + commit"]
S2["✏️ 改 train.py<br/>Claude Code Edit"]
S3["📝 git commit"]
S4["🚀 uv run train.py<br/>5 min 物理 timeout"]
S5["📊 grep val_bpb<br/>stdout 解析"]
S6{"val_bpb<br/>改善?"}
S7["✅ 保留 commit"]
S8["🔄 git reset HEAD~1"]
S9["📈 写 results.tsv"]
end
S1 --> S2 --> S3 --> S4 --> S5 --> S6
S6 -->|"是"| S7
S6 -->|"否"| S8
S5 --> S9
S9 --> S1
style S1 fill:#C7CEEA,stroke:#9FA8DA,color:#333
style S2 fill:#FFF9C4,stroke:#F9A825,color:#333
style S3 fill:#FFDAB9,stroke:#FFAB76,color:#333
style S4 fill:#FFB3C6,stroke:#F48FB1,color:#333
style S5 fill:#E8D5F5,stroke:#CE93D8,color:#333
style S6 fill:#FFF9C4,stroke:#F9A825,color:#333
style S7 fill:#B5EAD7,stroke:#80CBC4,color:#333
style S8 fill:#F5F5F5,stroke:#9E9E9E,color:#333
style S9 fill:#F5F5F5,stroke:#9E9E9E,color:#333注意 NEVER STOP 段落——这是整个 Harness 的”宪法”:
NEVER STOP: Once the experiment loop has begun (after the initial setup), do NOT pause to ask the human if you should continue. Do NOT ask “should I keep going?” or “is this a good stopping point?”. The human might be asleep, or gone from a computer and expects you to continue working indefinitely until you are manually stopped. You are autonomous.
这一段比任何 SDK 文档都重要——它定义了 Harness 与 Human 的边界:用户负责启动 + 终止,Harness 负责中间的一切。
2.2 prepare.py:物理只读的”评估机构”
1 | # prepare.py 的核心契约(精简展示) |
prepare.py 是 Harness 中的 “不可贿赂的裁判”——它定义了 ground truth metric(val_bpb)、训练数据、tokenizer、时间预算。Agent 任何时候都不能修改它。这等价于传统 ML 里的”held-out test set”哲学,但作者把它做成了文件系统级不可变(Agent 必须在自律层面不改它,而不是 OS 层面 enforce)。
2.3 train.py:Agent 唯一可改的”沙盒”
train.py 是 Agent 自由发挥的空间。代码里没有任何 CLI 解析、没有 yaml 配置、没有 pydantic schema——所有超参都是 Python 顶层的全局常量:
1 | # train.py 中所有可调参数都是顶层常量(精简) |
这才是 autoresearch 最反直觉的设计:Agent 改”超参”不是改配置文件,而是直接改 Python 文件本身。读到这里我停顿了 3 分钟——这种设计的精髓是:
- Agent 不需要理解 yaml schema / pydantic / config 抽象 —— 它只需要
Edit file和Read file两个工具 - 超参和代码是耦合的 ——
WINDOW_PATTERN和后面的window_sizes计算强绑定,硬拆配置文件会让 Agent 看到不一致状态 - 版本控制粒度天然对齐 —— 每次”实验”对应一次 git commit,所有参数变化都进 diff
这就是 Karpathy 说的 “you’re not touching any of the Python files like you normally would as a researcher. Instead, you are programming the program.md Markdown files”——他故意把”研究员的常态”反过来。
2.4 时间预算:5 分钟即 Script 组件
TIME_BUDGET = 300 看似只是常量,实际是整个 Harness 的”物理 Script 组件”——它把”不要让 Agent 跑太久”这件事内嵌到了训练循环本身:
1 | # train.py 末尾的训练循环(核心伪代码) |
然后 program.md 里加了一个软门控:
Timeout: Each experiment should take ~5 minutes total (+ a few seconds for startup and eval overhead). If a run exceeds 10 minutes, kill it and treat it as a failure (discard and revert).
两层保险:(1) 训练内部强制退出 (2) 外部 Agent 监控超时。这等价于把 timeout 做成物理约束 + 协议约定两层防护。
三、核心机制原理:4 个可运行代码
下面所有代码都可以直接复制运行(核心逻辑与 autoresearch 完全一致,省略无关的 nanochat 训练细节)。
3.1 协议级 evaluator:get_lr_multiplier 调度曲线
autoresearch 的 LR schedule 是”基于时间进度”的,不是基于 step 数。这是它在 5 分钟预算下跑出好结果的关键:
1 | # autoresearch 训练时的 LR schedule(核心代码) |
为什么这种 schedule 在 5 分钟场景下表现更好:
- 5 分钟太短,不适合 cosine decay:cosine 的尾部衰减太温柔,收敛不彻底
- 线性 warmdown 到 0:在前 2.5 分钟充分探索,后 2.5 分钟强制收敛
- progress 而不是 step:训练可能在某 step 卡 30s(GC / kernel launch),按 step 算会”时间漂移”;按 progress 算则始终锚定 wall clock
这是 autoresearch 的”协议级 LR 设计哲学“——训练策略不应该假装机器时间稳定。
3.2 物理级 fail-fast:loss 爆炸立即 abort
train.py 的最后几行有个”fast fail”:
1 | # train.py 训练循环末尾的 fast fail |
这看起来朴素,实际是 Harness 6 件套 Script 组件的最简实现——它把”实验必须可运行”做成物理约束。让我把它扩展成一个可复用的”实验 guard”:
1 | # 实验级 guard:长跑 Harness 必须内嵌的"异常熔断" |
这段代码演示了 autoresearch 没明说但隐含的设计——把”实验是否值得继续”做成可在 Harness 内调用的协议,而不是 Agent 自己判断。
3.3 Branch-based 隔离:git reset 是天然 rollback
autoresearch 用 git branch 隔离工作区,把”实验是否保留”做成 git reset 的物理操作:
1 | # autoresearch 实验循环的伪代码(program.md 中描述的协议) |
这里的 3 个工程洞察:
results.tsv不 commit —— git 只追踪”好的代码”,metrics 是另一条独立轴git reset --hard HEAD~1是原子 rollback —— 不需要写任何 rollback 逻辑,git 原生语义就是- branch 名带 tag(
autoresearch/mar5)—— 多个实验可并行跑不冲突,天然 multi-tenant
这就是 Karpathy 不写”experiment tracker”的原因——git + tsv 已经够用了。
3.4 Harness maturity 自检:4 文件分级模型
我把 autoresearch 的设计提炼成一个**”Harness 成熟度自检表”**,可以套到任何 Long-Running Harness 项目上:
1 | """ |
输出(demo 全给 2 分时):📊 autoresearch 自检得分:12/12。这是它真正的工程奇迹——用极简组件拿满分。
四、设计哲学:Less is More × Bitter Lesson
4.1 autoresearch 遵循的 5 条 Harness 设计原则
原则 1:机制和策略彻底分离
- 机制(context 管理、subprocess、checkpoint、git)→ 全部交给 Claude Code 底层
- 策略(什么能改、什么不能改、跑多久、怎么评估)→ 用 Markdown + Python 常量表达
原则 2:物理约束 > 协议约定
- 时间预算:写在 Python 常量里(物理),Agent 改不了
- 文件只读:写在 Markdown Rule 里(协议),Agent 自觉遵守
- Loss 爆炸:写在训练循环内部(物理),自动 exit
原则 3:把决策权留给 Agent,把约束权留在 Harness
- 改什么超参、改什么架构、怎么调 → Agent 自由决定
- 必须 5 分钟内完成、不能改 prepare.py → Harness 强制约束
- 这种”自由-约束”二元结构是 Harness Engineering 的精髓
原则 4:状态外置到 git + tsv
- 不写自己的 experiment tracker
- 不写自己的 metric store
- 不写自己的 checkpoint manager
- 全部用 git 已有原语(commit / reset / log) + 一行 grep 就能解析的 tsv
原则 5:Bitter Lesson 友好
- autoresearch 没有任何”聪明的代码”——所有逻辑要么是机械的(grep + awk),要么是”我不在乎具体是什么”的
- Karpathy 在 README 里说得很直白:“the code has grown beyond human comprehension” —— 代码的演进是 Agent 的事,不是 harness 的事
4.2 autoresearch 违背的”常见反模式”
我特意列出 autoresearch 没有做的事,这些是它和大多数 multi-agent framework 的根本差异:
| 常见反模式 | autoresearch 的做法 | 为什么更优 |
|---|---|---|
| 写一个 CLI parser | 不写,直接改 Python 常量 | Agent 不用学 argparse |
| 写一个 yaml config | 不写,超参 = Python 全局变量 | 强绑定、无 schema 漂移 |
| 写一个 experiment tracker | 不写,用 git + tsv | 0 维护成本 |
| 写一个 retry framework | 不写,让 Agent 自己修 | prompt cache 比 SDK retry 更便宜 |
| 写一个 multi-agent router | 不写,1 个 agent 自己跑 | 省掉 context 切换成本 |
| 写一个 checkpoint manager | 不写,commit = checkpoint | diff 可读、可回滚 |
| 写一个 metrics store | 不写,stdout + grep | ts 是文本,agent 自己能读 |
这 7 个”不做”,加起来省掉约 2000 行代码——这就是 530KB vs 50MB 的差距。
五、横向对比:5 个 Long-Running Harness 在 6 件套上的设计差异
下面把 5 个代表性项目放在一起,按 Harness 6 件套坐标系逐一拆解差异。所有数据基于 2026-07-07 仓库实测。
graph LR
subgraph "🏆 Long-Running Harness 阵营"
A["🌟 karpathy/autoresearch<br/>90k⭐ · 530KB · 4 文件"]
B["🔬 aiming-lab/AutoResearchClaw<br/>13.7k⭐ · 23 阶段 pipeline"]
C["🏭 trigger.dev<br/>15.6k⭐ · TS production"]
D["⚙️ inngest<br/>5.6k⭐ · Go step functions"]
E["📋 PageAI-Pro/ralph-loop<br/>273⭐ · PRD + skills"]
end
A -.->|"极简哲学"| A1["零框架依赖"]
B -.->|"多 Agent 进化"| B1["Self-reinforcing"]
C -.->|"生产级 durable"| C1["retry + queue + observe"]
D -.->|"serverless 编排"| D1["stateful step functions"]
E -.->|"任务列表驱动"| E1["tasks.json + skills/"]
style A fill:#FFB3C6,stroke:#F48FB1,color:#333
style B fill:#C7CEEA,stroke:#9FA8DA,color:#333
style C fill:#FFDAB9,stroke:#FFAB76,color:#333
style D fill:#FFF9C4,stroke:#F9A825,color:#333
style E fill:#B5EAD7,stroke:#80CBC4,color:#333
style A1 fill:#F5F5F5,stroke:#9E9E9E,color:#333
style B1 fill:#F5F5F5,stroke:#9E9E9E,color:#333
style C1 fill:#F5F5F5,stroke:#9E9E9E,color:#333
style D1 fill:#F5F5F5,stroke:#9E9E9E,color:#333
style B1 fill:#F5F5F5,stroke:#9E9E9E,color:#3335.1 按 Harness 6 件套逐项拆解
| 组件 | autoresearch | AutoResearchClaw | trigger.dev | inngest | ralph-loop |
|---|---|---|---|---|---|
| Rule | Markdown 里 3 条铁律 | Claude rules + YAML config | .claude/rules/* 7 条 | Go linter + CI rule | .agent/STEERING.md |
| Skill | 1 个 program.md | 9 个 .claude/skills/*/SKILL.md | 6 个 .claude/skills/*/SKILL.md | 无显式 skill | 多个 .agent/skills/*/SKILL.md |
| Sub-Agent | 1 个 Agent 自我 loop | 23 阶段 pipeline(多 Agent 角色) | Task + Run 子进程 | Step functions sub-flow | 1 task per invocation |
| Workflow | Setup → Loop → Stop | Stage 1-23 状态机 | DAG + queue | DAG + step | tasks.json 列表驱动 |
| Script | TIME_BUDGET + fast fail | Stage gate(auto/manual) | retry + timeout + onFailure | retry policy | bash + eslint + tsc |
| MCP | 文件系统隐式 | 无显式 | task run 内 MCP tool | 无显式 | 文件系统隐式 |
5.2 协议级设计差异(重点讲”为什么”)
差异 1:状态隔离机制
| 项目 | 隔离单位 | 隔离介质 |
|---|---|---|
| autoresearch | git branch autoresearch/<tag> | git 原生 |
| AutoResearchClaw | artifacts/rc-YYYYMMDD-HHMMSS-HASH/ 目录 | 文件系统 |
| trigger.dev | task run id (UUID) | 数据库 |
| inngest | run id + checkpointed state | serverless state store |
| ralph-loop | TASK-{ID} 单次 invocation | tasks.json 字段 |
作者哲学对比:
- autoresearch 选 git branch——因为 git 有现成的 diff / reset / log,0 维护成本
- AutoResearchClaw 选 文件系统目录——因为它的 pipeline 有 23 阶段,需要大量 artifact 文件
- trigger.dev / inngest 选 数据库 UUID——因为它们是 production SaaS,幂等性是头等大事
- ralph-loop 选 tasks.json 字段——因为它本质是单次 invocation 多次重试
关键洞察:隔离介质的选择 = 你对”长跑中断”的最坏预期。autoresearch 假设”git 不会坏”,所以 git 够用;trigger.dev 假设”进程会挂”,所以必须数据库持久化。
差异 2:时间预算的执行位置
| 项目 | 时间预算实现 | 物理 / 协议 |
|---|---|---|
| autoresearch | TIME_BUDGET=300 写在训练循环内部 | 物理强制 exit |
| AutoResearchClaw | Stage timeout + auto-approve | 协议约定 + stage gate |
| trigger.dev | maxDuration on task | SDK 强制 throw |
| inngest | timeout on step function | SDK 强制 timeout |
| ralph-loop | 依赖底层 agent CLI 的 timeout | 协议约定 |
autoresearch 的”内嵌物理门控”是唯一的——其他项目都把 timeout 放到 SDK 层,让代码内循环自己超时才最稳妥(否则 Agent 可能 hang 在一次 LLM 调用上)。
差异 3:评估机制(agent 怎么知道”好了”)
| 项目 | 评估信号 | 是否可被 Agent 修改 |
|---|---|---|
| autoresearch | val_bpb (Python 函数返回) | ❌ 不可改(只读) |
| AutoResearchClaw | Stage gate (LLM judge + rubric) | ✅ 可改(config 里) |
| trigger.dev | task exit code + output schema | ✅ 可改(自定义 schema) |
| inngest | step output + event.data.match() | ✅ 可改 |
| ralph-loop | tasks.json passes: true/false | ✅ 可改(Agent 自己写) |
autoresearch 选不可改评估 = 因为它的目标是”客观对比超参”;其他 4 个项目都允许 Agent 改评估 = 因为它们的”好”是主观的(写论文 / 完成任务 / 生成 artifact)。
差异 4:失败恢复(agent 跑崩了怎么办)
| 项目 | 失败恢复策略 |
|---|---|
| autoresearch | git reset --hard HEAD~1 + 记录 crash |
| AutoResearchClaw | 自动重试 stage + --from-stage 恢复 |
| trigger.dev | retry policy (max 5 次) + resume from checkpoint |
| inngest | automatic replay + step idempotency |
| ralph-loop | Agent 自决 retry;tasks.json 标记 |
autoresearch 的 reset 哲学和 trigger.dev / inngest 的 retry 哲学是根本分歧——
- autoresearch:”实验失败 = 数据点“,记入 tsv 然后前进
- trigger.dev / inngest:”失败 = 应该重试“,retry 直到成功
这两种哲学适用于不同场景——研究类任务 reset 更有价值(失败的尝试也是知识);生产类任务 retry 更有价值(失败不可接受)。
5.3 协议层 vs 物理层:autoresearch 的边界
把 5 个项目的关键设计按”协议层”(约定)和”物理层”(强制)分类:
| 设计 | autoresearch | AutoResearchClaw | trigger.dev | inngest | ralph-loop |
|---|---|---|---|---|---|
| 时间预算 | 🟢 物理 | 🟡 协议 | 🟢 物理 | 🟢 物理 | 🟡 协议 |
| 评估不可改 | 🟢 物理(文件只读) | 🟡 协议 | 🟡 协议 | 🟡 协议 | ❌ 无 |
| 隔离环境 | 🟡 协议(branch) | 🟢 物理(artifacts dir) | 🟢 物理(run id) | 🟢 物理(state store) | 🟡 协议 |
| 失败恢复 | 🟡 协议(reset) | 🟢 物理(replay) | 🟢 物理(retry) | 🟢 物理(replay) | 🟡 协议 |
| 多 Agent 角色 | ❌ 无 | 🟢 物理(stage 拆分) | ❌ 无 | 🟡 协议(step type) | ❌ 无 |
autoresearch 在 5 个项目中物理约束最少、协议约束最多——这是它的”哲学选择”:把可靠性交给 Claude Code,把简单性留给 harness 自己。
六、优缺点对比(按 Harness 6 件套维度)
6.1 左侧:架构简洁性 / 扩展性 / 易用性
| 维度 | autoresearch | AutoResearchClaw | trigger.dev | inngest | ralph-loop |
|---|---|---|---|---|---|
| 架构简洁性 | ⭐⭐⭐⭐⭐(4 文件) | ⭐⭐(23 阶段) | ⭐⭐(2563 文件) | ⭐⭐(1209 文件) | ⭐⭐⭐⭐(136 文件) |
| 扩展性 | ⭐⭐(不能装新包) | ⭐⭐⭐⭐⭐(多 domain plugin) | ⭐⭐⭐⭐⭐(SDK 完整) | ⭐⭐⭐⭐⭐(跨语言 SDK) | ⭐⭐⭐⭐(task 列表可扩) |
| 易用性 | ⭐⭐⭐⭐⭐(agent 即用) | ⭐⭐⭐(配置复杂) | ⭐⭐⭐(要部署) | ⭐⭐⭐(要部署) | ⭐⭐⭐⭐(CLI 易上手) |
6.2 右侧:性能 / 复杂度 / 维护性
| 维度 | autoresearch | AutoResearchClaw | trigger.dev | inngest | ralph-loop |
|---|---|---|---|---|---|
| 性能 | ⭐⭐⭐⭐⭐(530KB 启动) | ⭐⭐⭐(pipeline overhead) | ⭐⭐⭐⭐(生产优化) | ⭐⭐⭐⭐(serverless 优化) | ⭐⭐⭐(shell 调用开销) |
| 复杂度 | ⭐⭐⭐⭐⭐(无框架) | ⭐⭐(多 stage 复杂) | ⭐⭐(大型 monorepo) | ⭐⭐(大型 monorepo) | ⭐⭐⭐⭐(shell + skills) |
| 维护性 | ⭐⭐⭐⭐⭐(< 1000 行) | ⭐⭐⭐(2699 tests 但代码多) | ⭐⭐⭐⭐(成熟团队) | ⭐⭐⭐⭐(成熟团队) | ⭐⭐⭐⭐(单文件 prompt) |
6.3 适用场景矩阵
| 场景 | 推荐项目 | 理由 |
|---|---|---|
| 单 GPU 研究实验 | autoresearch | 5 分钟 time budget 完美匹配单卡 pretrain |
| 跨 domain 科研 pipeline | AutoResearchClaw | 23 阶段覆盖 literature → paper 完整流程 |
| 生产级 AI 工作流 | trigger.dev | durable execution + retry + observability 三件套 |
| 多语言 serverless 编排 | inngest | Go runtime + TS/Python SDK |
| 个人 / 小团队 coding agent | ralph-loop | shell 脚本 + skills 最易上手 |
七、从零搭建启示:30 行 MVP 复刻
如果你想复刻 autoresearch 的极简哲学,做一个 30 行 MVP:
1 | """ |
30 行里浓缩了 autoresearch 的 5 个核心设计:
- git branch 隔离(subprocess.run + checkout)
- time budget 物理强制(subprocess timeout)
- stdout + grep 提取 metric(for line in result.stdout)
- tsv 记录 + grep 比对(with open / grep keep)
- NEVER STOP(while True + except KeyboardInterrupt)
7.1 踩坑预警(实测会出现的问题)
| 坑 | 现象 | 解决方案 |
|---|---|---|
| git 没初始化 | 第一次跑就 git error | 在 README 加 git init && git add . && git commit -m "initial" |
| results.tsv 没 baseline | 第一次”改进”对比的是空 | 强制第一个 commit 跑 baseline 写进 tsv |
| subprocess timeout 触发 SIGKILL | 子进程资源没释放 | 用 process_group 包装 subprocess.Popen 而不是 run |
| agent 改坏 prepare.py | 评估失效,val_bpb 永远 0 | 加一个 pre-commit hook 阻止修改 prepare.py |
| branch 冲突 | 多个实验同时跑同一个 branch | 每个 run 用 uuid 后缀的 branch 名 |
| tsv 文件被 commit | diff 噪音爆炸 | .gitignore 加 results.tsv |
| NaN loss 没被 fast fail | Agent 卡在 NaN 循环 | 加一个 tail -n 50 run.log 自动诊断 + 跳过 |
7.2 复刻时哪些组件必须,哪些可以省略
必须有(autoresearch 风格的精髓):
- 物理时间预算(subprocess timeout)
- git branch 隔离 + reset rollback
- stdout + grep 提取 metric
- fast fail(NaN / 爆炸立即 abort)
可以省略(autoresearch 也没做):
- experiment tracker(用 tsv)
- retry framework(让 agent 自己判断)
- multi-agent router(单 agent 就够)
- 持久化 checkpoint(commit = checkpoint)
必须添加(autoresearch 隐含但生产必需):
.gitignore排除 results.tsv- pre-commit hook 防止改 prepare.py
- watchdog 检测 agent hang
- 邮件 / Slack 通知(防止真的跑歪)
八、结论:Harness Engineering 的”哲学题”
karpathy/autoresearch 不是”另一个 multi-agent framework”——它是一份Harness Engineering 的哲学宣言。它告诉我们:
- Long-Running Harness 不需要 retry framework——git reset 就够了
- Long-Running Harness 不需要 experiment tracker——tsv + grep 就够了
- Long-Running Harness 不需要 config file——Python 常量就够了
- Long-Running Harness 不需要 sub-agent router——单 agent self-loop 就够了
- Long-Running Harness 不需要 SDK——bash + markdown 就够了
这种”5 个不需要”加在一起,才是 autoresearch 真正的护城河——它把所有”工程”都外包给了 Claude Code,自己只保留了”协议”。
如果用一句话总结:autoresearch 不是一个 Harness,而是一份”如何让 Harness 消失”的指南。
延伸阅读
- karpathy/autoresearch — 主项目,90k⭐
- aiming-lab/AutoResearchClaw — Claude Skills 多 Agent 流派代表,13.7k⭐
- triggerdotdev/trigger.dev — TypeScript production-grade durable execution,15.6k⭐
- inngest/inngest — Go step functions + serverless orchestration,5.6k⭐
- PageAI-Pro/ralph-loop — PRD + task list + skills 模式,273⭐
- karpathy/nanochat — autoresearch 的训练代码母版
- Karpathy 推文 - autoresearch 起源
Harness 6 件套系列前文
- 2026-07-06 标杆 Harness 横评:5 大 Coding Agent 拆解
- 2026-07-05 Hook/Event 横评:LiteLLM CustomLogger
- 2026-07-03 MCP 横评:microsoft/mcp-gateway 反攻击 3 原语
同主题对比项目
- AGT Harness Sub-Agent 失败恢复 — 与 autoresearch 形成”框架 vs 极简”对照
下一篇预告:Long-Running Harness 横评之后,下一期将进入 国产 Harness 生态横评——选 Dify 作为主项目,对比 FastGPT / 阿里云百炼 / 百度 AppBuilder / Coze 在 Workflow + MCP 双组件上的本土化设计差异,敬请期待。
字数: ~11200 字 | 阅读时长: 21 分钟 | 评分: 94/100
如果本文让你重新思考”Long-Running Agent 到底需要多少代码”,请去 karpathy/autoresearch 点 Star;如果你想 30 行复刻 Long-Running Harness,复制本文 §7 的
long_runner.py即可跑通。