Autoresearch Skill Retrospective
2026-04-08
复盘目标把一套能自己迭代 skill 的方法讲清楚

把 Skill 当成产品来做实验

这份报告想讲清一件事。skill 不是靠感觉越改越好,而是靠一条能复跑、能留痕、能回滚的流程,才会真的进化。两个真实案例已经把这件事跑出来了。

103 轮 import-world-from-book 留下的完整迭代摘要
2 次 keep import-world-from-book 在当前账本里的有效保留
exp-003 web-clipper 当前 accepted baseline
Overview

先认识这两个 skill,再看 autoresearch 为什么成立

先看对象,再看评测,再看 keep。顺序反了,这页就全是黑话。

这份复盘最容易让人看懵的地方,是 keep 和 discard 说了很多,对象却还没介绍清楚。先把一句话版本放在前面。

Object 01

import-world-from-book

它做的事很实在。把小说章节整理成 结构化世界库, 交付的是 `BOOK.md`、`WORLD.md`、`glossary.md`、角色地点势力档案和分批剧情摘要。

Object 02

web-clipper

它也不是聊天题,而是 本地剪藏题。 把 URL 落成 Markdown、本地化图片、可选 `raw.html`,或者只先算出将要落到哪个目录。

Eval

这里的评测不是主观评分

eval 的意思是 固定好例子、坏例子和 validator, 再去看 skill 会不会抓住该抓住的问题,会不会把假成功挡下来。

Keep Rule

不是没坏就算赢

候选版本只有两种理由能 keep。 分数真的更高, 或者分数相同但 明显更简单、更稳。 只是多写一点说明,不算进化。

普通 prompt 调整常常是想到一个点就试一个点。autoresearch 不这么干。它先把合同和评测钉住,再允许候选改法去竞争。最后能不能 keep,不由候选自己说了算。

Runtime
Codex
实际跑 skill 的执行层
Selector
5.4 xhigh
独立挑选最值得一试的候选
Judge
5.4 xhigh
独立决定 keep 还是 discard
Eval
固定 split
固定用例与 validator,不靠主观感觉
Loop Design

最小可复用闭环长这样

这套闭环看着长,核心其实很朴素。改的人别判,判的人别改,外层循环也别绑死在某个会话上。

Contract
先写清 promise、必须保留、禁止漂移和可改范围。这样后面就算整段重写,也不会把原始任务改丢。
Mutate
proposal lanes 负责出候选。谁都可以提方案,但方案只是候选,不会直接晋升成新 baseline。
Select
selector 不直接改文件,只在几个候选方向里挑一个最值得试的,避免多路输出一锅炖。
Evaluate
跑固定 split、固定 validator 和固定对抗集。好坏先用同一把尺子量,再谈要不要晋级。
Judge
judge 看前后分数、回归、失败模式和对抗结果,决定 keep、discard、blocked、escalate 还是 stop。
Persist
每轮都落账本、评审、模型快照和 git 快照。中途停了,下一轮也能接着跑。
不是让模型自己瞎试,而是把 skill 优化变成一条有边界、有证据、有记忆、有人能复查的工程链路。
监督器 supervise_autoresearch_loop.py 只做一件事,盯住控制器别悄悄死掉。
控制器阶段 prepare → mutate → evaluate → decide → post_decision → capture_after → finalize。所以每个结果都能追溯到具体改动和具体判定。
失败记忆 direction_fingerprint、cluster cooldown 和 blocked fingerprints 一起工作。同一个 keep checkpoint 之后,旧坑不会换个说法再撞一次。
Case Study 01

import-world-from-book 把小说章节整理成世界库

它很适合当起手式,因为输入、输出和对照面都很具体。原书在,章节边界在,坏样本也在,所以真假完成很好分。

这个 skill 做什么

它不是让模型随便聊设定,而是把 `raw_text/` 章节目录整理成一个长期可维护的世界库。最终要落出来的是真文件,比如 `BOOK.md`、`WORLD.md`、`glossary.md`,还有角色、地点、势力和剧情摘要。

WORLD.md

交付物是结构化世界库,不是一段漂亮但不可复查的总结。

它的 eval 在看什么

eval 看的不是文风,而是这个 skill 的审计规则会不会误判完成。原书就是金标准,故意做错的世界库就是坏样本,所以能稳定测出 尾章错位、完成声明造假、交付状态不一致、旧批次污染、断链和占位符 这些问题。

gold eval

原书和坏样本都很具体,所以它适合做成一套固定的真假完成判定题。

Keep 01

exp-005 到底改好了什么

它修的不是文风,而是 假完成。 原来平铺的收尾清单太松,很多完成声明可以靠侧面推断混过去。`exp-005` 把它拆成 `Preflight`、`Final Audit`、`Completion` 三道门,强制要求 completion 相关结论拿出证据。

Keep 02

exp-011 为什么还能再 keep

因为证据还不够硬。`exp-011` 继续收紧 `Completion` 门,把 `BOOK.md` 一致性、`processing_summary.md` 对齐、断链、占位符和尾章原文引用都升成硬检查。重点不是看起来像完成,而是 必须证明自己完成

Discard

后面为什么没有继续 keep

因为后面的轮次没再拿出更强证据。像 `exp-014`、`exp-015` 这类轮次,账本直接是 `10 → 10`,而且写了 `quick pass count stayed flat`。平盘就该 discard,环境出现 drift 风险也该 discard。

Lesson

这个案例真正教会人的

当对象有强金标准时,skill 优化会很像工程修 bug。 每次 keep 都能说清楚 修了哪个洞、加了哪道闸、为什么分数真的涨了

exp-005

第一轮 keep 修的是假完成。原来 section 6 的收尾校验是平铺 checklist,很多 completion 相关结论可以靠侧面推断蒙混过关。`exp-005` 把它拆成三道门,分别是 PreflightFinal AuditCompletion。 其中 Completion 不再允许靠侧面推断成立,而是明确要求 WORLDprocessing_summary、尾章边界、旧批次污染这些结论都有显式证据。

这一轮的 summary 主分是 `7 → 8`。证据文件是 autoresearch-runs/import-world-from-book-phm-loop-20260405/iterations/exp-005/summary.md

exp-011

第二轮 keep 修的是证据质量还不够硬。`exp-011` 继续把 Completion 压紧,新增 `BOOK.md` 一致性、`processing_summary.md` 对齐、断链和占位符、标题层级、以及尾章 `0031` 到 `0033` 的原文引用级校验。重点不是文件存在,而是交付状态和内容证据必须对上。

这一轮的 summary 主分是 `8 → 11`。证据文件是 autoresearch-runs/import-world-from-book-phm-loop-20260405/iterations/exp-011/summary.md

后面为什么没有继续 keep

因为后面的候选没有再拿出更强证据。`exp-012`、`exp-013` 是中断恢复后的清理轮次。`exp-014`、`exp-015` 这类轮次,账本里直接是 `10 → 10`,而且 `notes` 明写 `quick pass count stayed flat`,同时还有 runtime drift 风险记录。按照 keep 规则,这种平盘或受环境污染的轮次就应该 discard。

这个案例最有价值的地方,是每次 keep 都能说清自己修了哪个洞。进化的不是文风,也不是措辞,而是审计规则一步步从看起来完成,变成必须拿证据证明完成。

它也提醒了一个常被忽略的点。autoresearch 的价值,不在于让模型更会编理由,而在于让评测越来越像事实审计。真正带来进步的,是把原来能模糊带过的完成声明,变成必须拿证据说话的交付核查。

还有一个复盘细节很容易写混。`exp-011` 的 iteration summary 里主分到了 11,但当前 bundle 的 baseline.jsonaccepted-baseline.full.json 落盘是 full_pass_count = 10。这里不是打架,而是在提醒我们分清单轮候选的局部分数,和当前 accepted baseline 的整包快照。

当前看懂这个案例的关键
先把它当成真假完成判定题,不要把它当成开放式写作题。
运行开始时间
2026-04-06T10:43:35+00:00
快速 split
smoketrain
晋升 split
devtestadversarial
Case Study 02

web-clipper 把 URL 变成本地剪藏包

这是更贴近生产的一类 skill。难点不在能不能聊网页内容,而在能不能把网页真的落到本地,而且失败时不撒谎。

这个 skill 做什么

它把 URL 变成本地剪藏结果。可能是一个真正落地的文件夹,也可能是 planning-only 的落点路径。产物包括 Markdown、本地化图片、必要时的 `raw.html`,以及非中文原文默认生成的 `*.zh.md`。

Markdown

目标是本地剪藏产物,不是网页阅读问答。

它的 eval 在看什么

它的 eval 很像真实验收。看的是 路由准不准、preflight 挡没挡住、`dir/inbox/fetch` 模式对不对、`output_dir` 报得真不真、产物有没有真的落地、失败时会不会假装成功

9 维

路由、预检、路径、产物、翻译、快照、本地化、复用性和操作约束都会被看见。

Keep 01

exp-001 修了什么

它先修 路由假阳性。 用户只是想总结网页,不是要本地剪藏,这种请求不该进入 `web-clipper`。`exp-001` 把这类误路由挡住了。

Keep 02

exp-002 修了什么

它继续修 该接的没接住。 明确要求本地剪藏的请求,即使页面不稳,也应该进入 wrapper 流程,而不是被错误地挡在 skill 外。

Keep 03

exp-003 为什么成了最终 baseline

因为 planning-only 的 `dir` 模式也被修顺了。用户只是先问落点路径时,旧版会误判成没走 `web-clipper`。`exp-003` 把这个口子补上,所以当前 accepted baseline 最终停在它。

Discard

后面为什么几乎全是 discard

因为从 `exp-003` 开始,关键维度已经接近满分。后面的候选如果只是 `1.0 → 1.0`,又没有明显更简单,就不该 keep。像 `exp-027` 这种,就是典型的 没退步,但也没前进

exp-001

第一轮 keep 修的是路由假阳性。用户只是想总结网页,不是想生成本地剪藏包,这种请求本来不该进入 `web-clipper`。`exp-001` 把这类误路由挡住了,`routing confirmation` 从 `2/3` majority pass 修到 `3/3 pass`。

exp-002

第二轮 keep 修的是路由不只要挡错,还要接住该接的。明确要求本地剪藏的请求,即使页面不稳,也应该进入 wrapper 流程。于是这一轮同时清掉了 summarize 请求的 `route_false_positive`,以及显式剪藏请求的 `route_false_negative`。

exp-003

第三轮 keep 修的是 planning-only 的 `dir` 模式。用户有时只是先问,如果剪藏这条 URL,会落到哪个本地目录。旧版会把这类任务误判成没走 `web-clipper`。到了 `exp-003`,`dev_dir_mode_should_only_plan_path` 从 expected pass、actual fail,回到了 expected pass、actual pass,`selected_target` 也恢复成 `web-clipper`。

后面为什么几乎全是 discard

因为从 `exp-003` 开始,当前 accepted baseline 在关键维度上已经接近满分。后面的候选如果还是 `1.0 → 1.0`,又没有明显更简单,就不该 keep。`exp-027` 就是典型,它 `7/7 adversarial matches`,却仍然因为 flat-result rule 被丢掉。另一批候选则更直接,出现新 mismatch 或保护指标回退,所以只能 discard。

Accepted
exp-003
当前 accepted baseline
All Keeps
3
整个 bundle 历史 keep 次数
After exp-003
137
之后有结论但没新增 keep
Discard
134
整个账本里的 discard 数

当前 accepted baseline 是 exp-003-dir-planning-routing-keep-2026-04-06,对应 keep 提交号 4cd8712905a36b4cc5943ac71d27f89aafc89bec。整个账本目前是 `3 keep / 134 discard / 3 blocked`。真正有学习价值的,是 exp-003 之后那 137 次没有新增 keep 的平台期。

Platform Lesson 这段平台期告诉我们的不是系统没用,而是系统终于开始认真拒绝无价值改动。成熟 skill 的 autoresearch,不该靠热闹来证明自己在进化。

更细一点看,控制器已经把失败方向按 cluster 冷却。当前状态里有 11 个 cooled-down failure cluster,blocked_direction_fingerprints_since_last_keep 已累计到 30。意思很直接。同一个 keep checkpoint 之后,已经证明无效的方向,不该被下一轮重新包装再撞一次。

成熟 skill 的 autoresearch 不是越跑越兴奋,而是越跑越会拒绝没有价值的改动。
Lessons

被这次实践反复证明有效的原则

真正有用的经验不是技巧,而是约束。每条约束都在真实运行里拦下过错误方向。

先做 eval,再谈优化

金标准不稳,后面所有高分都只是噪声。`import-world-from-book` 能进化得干净,就是因为原书对照面够强,失败模式能被一条条咬住。

修改和评判必须解耦

同一个模型既改又判,结果会迅速自我合理化。proposal lanes、selector、judge 需要分角色,至少 judge 要独立。

允许大改,但只打一个 failure cluster

不要把 skill 优化限制成一轮磨一个小 bullet。整段重写是允许的,但要清楚这一轮到底在修哪类失败,否则赢了也说不清为什么赢。

失败假设要带着结果一起入账

只记录失败没用,得把当时的设计假设、触碰的 section、目标 case、实际结果一起写下来,下一轮才能避免撞同样的墙。

keep 标准不能是没坏

等分时不自动 keep。要么分数真的涨,要么明显更简单、更稳、更贴近合同。`exp-027` 被丢掉,就是这个原则在发挥作用。

最外层一定要可脱离 agent 独立运行

持续实验不能寄托在单个会话活着。外层脚本负责循环、状态、恢复和留痕,agent 只是某些阶段的执行单元,不是主控。

Starter Pack

如果同事下周要开一个新的 skill autoresearch

开工标准其实不玄。关键是从第一天开始,就把以后复盘和回滚会用到的证据留下来。

最小落地版本先别求全。先保证目标 skill 能被固定案例稳定评估,原始需求被写成合同,评测分出快筛和晋升两层,修改和评判拆角色,外层运行包能自己循环。

如果一开始资源有限,不必马上把 proposal lanes 拉满。更值得先做的,是把 run bundle 结构搭对。因为一旦状态、分数、改动、失败假设和提交都开始留存,后面整条链路才会真的长出学习能力。

必须先准备好的
固定 eval 套件、固定 validator、合同化目标、mutable paths、keep 和 discard 后处理
一开始就要记录的
每轮假设、前后分数、分维度变化、失败 cluster、direction fingerprint、keep 提交号、模型配置快照
最容易做错的
让目标 skill 自己兼任 judge,或者没有把失败方向沉淀下来,导致看似在探索,其实在原地绕圈
真正的完成标准
出现了可解释的 keep,并且团队能说清楚它为什么比原版更好,出了问题还能回滚到任一保留版本
Appendix

这份复盘直接引用过的关键证据

下面这些路径都来自本地运行资产。它们是这份报告的依据,不是回忆。

import-world keep 证据
autoresearch-runs/import-world-from-book-phm-loop-20260405/iterations/exp-005/summary.mdautoresearch-runs/import-world-from-book-phm-loop-20260405/iterations/exp-011/summary.mdautoresearch-runs/import-world-from-book-phm-loop-20260405/experiment-ledger.tsv
import-world 运行状态
autoresearch-runs/import-world-from-book-phm-loop-20260405/runtime/loop.status.jsonautoresearch-runs/import-world-from-book-phm-loop-20260405/runtime/supervisor.status.jsonautoresearch-runs/import-world-from-book-phm-loop-20260405/baseline.json
web-clipper profile
autoresearch-runs/web-clipper-autoresearch-bundle-probe/profiles/codex-live-fixture.yaml
web-clipper 当前控制器状态
autoresearch-runs/web-clipper-autoresearch-bundle-probe/controller-state.jsonautoresearch-runs/web-clipper-autoresearch-bundle-probe/experiment-ledger.tsv
exp-003 行为修正证据
autoresearch-runs/web-clipper-autoresearch-bundle-probe/iterations/exp-003/decision-summary.mdautoresearch-runs/web-clipper-autoresearch-bundle-probe/reports/full-codex-live-exp-002-postkeep/validation-summary.jsonautoresearch-runs/web-clipper-autoresearch-bundle-probe/reports/full-codex-live-exp-003-postedit/validation-summary.json
flat-result discard 证据
autoresearch-runs/web-clipper-autoresearch-bundle-probe/iterations/exp-027/decision.json
外层脚本
autoresearch-runs/web-clipper-autoresearch-bundle-probe/scripts/supervise_autoresearch_loop.py/Users/atou/codex-skills-macmini-local/skills/skill-autoresearch/scripts/run_autoresearch_loop.py