Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
22 KiB
任务书 18:诊断(每轮提案之前,在当前基线上做诊断实验)
做完以后,每一轮在提案之前多走一段诊断:
- 研究者写诊断解释和诊断实验;
- Jev 合并重复的实验,研究者对每个实验交三个数;
- 程序用信息价值减成本,定这轮做不做、做哪几个实验;
- 实验员把选中的实验写进一份诊断程序,核验员核对,然后跑一次正式运行;
- 程序结算,结果放进本轮提案以及之后全部研究者任务的材料。
同时,消融改成默认关闭。
方法以 docs/方法.md 为准,这次改了这几处:第一部分、第二部分、4.3(开轮之后的"诊断"一段,以及 ② ⑨ ⑫)、第五部分、6.3、6.9–6.11、新增的 6.12、第七、九、十一、十二部分。docs/结构.md 第三部分的步骤清单、第四部分的账本表、"flow 分几部分"表的第 5 行也同步改了。
一份任务书里有三块,按顺序做:
- 第一块:写代码。
- **第二块:写诊断这一段的提示词。**这一块单独提交,提交以后才跑第三块。
- **第三块:真实运行和评估。**从头真实跑 3 份完整研究,按研究质量评估。
本任务书已由用户和监督者在 2026-10-05 一起确定。下面说的"监督者",是在参考项目目录里和用户讨论设计的另一个会话。
开工前先读
CLAUDE.md:全部。docs/方法.md:上面列的改动处全文,以及 6.7(诊断的数学规则大部分沿用它)、6.8、第三部分(材料顺序)。docs/结构.md:第二、三、四、五部分;第八部分 flow、rules、materials、submissions、tasks、runner、workspace、jev 各节。docs/调研/提示词.md:第二块必读。任务书/17-flow-4-消融到收尾.md:消融这一段的写法。诊断的实现、核验、修复、运行、结算,大体照着消融和正向的写法来。WORK_LOG.md:"未完成"里的"B、D 两份完整研究的分析"和"文献精读"两条。这两条说明了为什么要加诊断。- 论文原文在
reference-paper/(不进仓库)。第二块用得到的:human-practice/mly.txt(Ng)、human-practice/platt1964.txt、ai-scientist/popper.pdf、ai-scientist/ai-coscientist.pdf、llm-search/AdaEvolve_2602.20133.txt。
一、第一块:代码
1.1 配置与步骤清单
flow里加一个diagnosis,写法同ablation:{ enabled: false };- 或者
{ enabled: true, perResearcher, maxExperiments }:每人每轮诊断实验上限 A,现行值 2;一次诊断最多做几个实验 D,现行值 4(方法.md 6.11)。 - 两个都是方法参数。
ROUND_STEPS在carryOverPool和proposal之间加诊断的步骤。名字照现有的风格自己起,至少分开这几步:- 诊断解释与实验;
- 判重合并;
- 诊断预测;
- 选诊断实验(决策点,带规则);
- 实现、核验、修复;
- 诊断运行;
- 诊断结算。
- 诊断关掉时,这几步都标"按配置跳过"。
- 消融关掉时,
explanation也跟着跳过(方法.md 4.3 ⑫)。改steps.ts里那句注释,以及 schema 里ablation.enabled: false的说明。 - 选诊断实验的规则只有一条,就是"信息价值减成本"。照选格的做法登记进 rules 的登记表,步骤清单里带规则名和版本。不为它另造别的规则。
- 验收配置
eval/round-zero/research.json不改。第三块用的配置放在eval/diagnosis/research.json:照抄这份,改两处:诊断开(A = 2,D = 4),消融关。
1.2 rules:诊断的数学(方法.md 6.12)
要算的东西
- 成分模型;
- 方向收益 g_d(x) = x − b,外加一个收益为 0 的"都不走";
- 信息价值;
- 价值减成本;
- 选实验,只比较装满的组合;
- 结算:每个实验的结局、确认与否定、世界比特、惊讶、诊断推出的方向。
复用,不另抄一份公式
- 6.7 的成分权重、权重更新、精确积分和部分格网格,现在写在
value.ts里,是按"撑几成"刻度写的。把它抽成能接两种"实测 → 收益"换算的形式:- 消融:撑几成乘 h;
- 诊断:x − b,再和 0 取大。
- 消融的数字必须逐位不变。拿现有的消融测试和 B、D 账本里的选格决定重算对照。
- 确认与否定、世界比特、惊讶,直接用
ablation.ts、bits.ts现有的函数。
和消融不同的地方
- 有一个"都不走"的 0 选项:VOI 公式里两处都和 0 取大。
- 成本固定按 1 次运行算,ĝ₀ 取 max(0, ·)。
- R̂ = ⌈(余额 − 1) ÷ 每批上限⌉。
- 只比较装满的组合:实验数 ≤ D 时只有"全做"一个组合;超过 D 时,比较所有恰好 D 个的组合。
- 平票时按实验编号比。
选实验的决定记录要附上:全部组合的价值、成本、净值,选中的组合,以及每个没选中的实验的原因和净值。数字写到能离线重算的程度,同选格(方法.md 6.7、结构.md 第五部分第 2 条)。
战绩和信息账的 Phase 加一个 diagnosis,按人、按正向 / 诊断 / 消融分开报(方法.md 6.9、6.10)。
测试用独立算出的预期值,不复制实现的公式。至少覆盖:
- 两条解释对一个实验预测相反时信息价值为正,预测一样时信息价值为 0(只剩开放预留的部分);
- 余额 < 2 时不诊断;
- 实验数超过 D 时只比较装满的组合;
- 证据不足的实验不判、不记账;
- 诊断推出的方向:全部实验收益不为正时,记"没有指出能涨分的方向"。
1.3 vocab、submissions、jev
vocab:新加四种提交(方法.md 第五部分表里"诊断"三行):
- 诊断解释与实验;
- 诊断预测;
- 诊断实现(修复同一种);
- 诊断核验。
字段说明照现有提交的写法:每样都有出口。
submissions 收件时查:
- 解释 1 至 M 条,实验 1 至 A 个;
- 诊断预测覆盖"自己每条解释 × 每个合并后的实验",不多不少,三个数严格递增;
- 诊断实验登记的指标只能是"缺了只记缺失";
- 诊断核验的逐个实验结果覆盖全部选中的实验。
jev:
- 诊断实验判重:新加一个问法,照
dedup写,对象是"在当前基线上动一处的诊断实验"。阈值暂用dedup的 0.3,等真实数据再校准,照实写进注释。 - 诊断实验交上来时,查"改动了评测、自相矛盾、太含糊":直接用
freeze那三问。如果问法里的措辞只适合冻结协议,就照dedup的办法加一个变体,不改原问法。 - 诊断程序的代码改动:直接用
diff那五问。
1.4 tasks、runner、workspace:一次运行跑几个实验
运行方式
- 一次诊断运行就是一个容器、一次登记、一次确认启动、一次扣次。runner 的现有规矩(限时、限核、断网、记资源、按容器名恢复)照旧。
- 总时限、核数照任务规定(填圆:120 秒、1 核)。容器里由任务的 harness 按顺序跑每个实验,每个实验分到"总时限 ÷ 实验数"。
- harness 记下每个实验实际用了多久、是不是超时。一个实验超时或跑崩,不影响后面的实验。
每个实验从哪里出发
- 从当前基线的代码,以及产出当前基线的那次正式运行的原始产物出发。
- 这份产物在运行目录里,用只读的方式交给每个实验。
- 怎么交(文件路径、参数还是环境变量),由 tasks 定,写进
TASK.md给实验员看。
判分
- 每个实验交出的答案,用任务现有的校验器和合法化单独判分。
- 判分结果按实验分开记在这一次运行的结果里:分数、合法化、登记的指标、用时、结局。
- 资源用量记整次运行的。
workspace
- 诊断程序存成一个版本,记进冻结代码记录,同时附上每个实验的位置表。
- 实验员的工作目录从当前基线代码取出,再放进那份原始产物。
改动范围
- 改 tasks 和 runner 时,正向运行、消融运行、基线运行的行为一个字节都不能变。
- 用现有测试,加上任务书 17 的一次正向运行定义前后对照来证明。
1.5 ledger、materials
ledger
- 决定加一种:选诊断实验。
- 结算加一种:诊断结算,按轮次唯一。
- 写入时要拒绝"这次诊断运行已经确认启动,才冻结诊断预测",照消融拒绝晚冻结解释的写法。
materials:给谁看什么(方法.md 第三部分、4.3 诊断一段)
- 诊 1
- 当前基线的代码,产出它的那次运行的答案、分数、指标,信念本,上一轮收尾;
- 第 1 轮还要放第零轮的全部记录。
- 诊 2
- 合并后的实验清单(标明作者),全部诊断解释,自己的解释;
- 看不到别人这一步交的数。
- 实现、修复
- 选中的实验原文,当前基线代码,原始产物的路径;
- 修复时还要放核验意见。
- 核验
- 选中的实验原文,以及"当前基线 → 诊断程序"的改动,加上位置表。
- 从 ② 提案开始,本轮之后全部研究者任务
- 公共材料里加"本轮诊断结果"一节:每个实验做了什么、实测、用时、结局,每条解释确认或否定,诊断推出的方向;
- 本轮没诊断时,写原因。
- 实现正向候选的实验员
- 本轮有诊断时,材料里给出诊断程序代码的位置(只读),注明"冻结协议引用诊断实验时作参考"。
- 信念本
- 加"诊断历史"(方法.md 6.10 第 3 条)。
规模
- materials 现在 1930 行,上限 1950,这次一定会超。新上限由用户定,见第五部分。
- 先把诊断材料写清楚,再看能不能和消融材料共用写法。
1.6 flow
怎么走
- 照步骤清单走。方法.md 4.3 诊断一段每一条都要落实。
- 余额 < 2 时,诊 1–诊 4 都不做:不开阶段,不写记录,从余额就能算出"本轮没有诊断"。这一点和"无采纳则没有消融"一样。
- 诊 3 定了"不诊断"时,诊 4 不做。
- 实现:一个实验员任务,对象是本轮诊断。
- 核验:一个核验员任务,交逐个实验的结果。
- 修复:只修不通过的实验,次数上限
maxRepairs。用完仍不通过的实验从这次诊断里拿掉,记"证据不足:核验不通过"。一个都不剩时,写事件,不跑,不扣次。 - 拿掉实验时,诊断程序里对应的代码怎么处理,你定。要求是:跑的只是剩下的实验,而且核验员核过的代码不再改动。
- 诊断运行用
formalRun,用途写diagnosis,对象是本轮诊断。 - 结算、写信念本之后,才开 ② 提案。
阶段编号照消融的写法按"第几次"排。
**"做完以哪条记录为准"**补进结构.md 第八部分 flow 一节的表。
规模
- flow 现在 2118 行,预计加 400–700 行,上限照结构.md 第七部分(3500)。
1.7 审阅
写完后另派一个全新上下文的子 Agent 审阅一轮,只看这几处:
- 诊断运行的登记、扣次和恢复;
- 选诊断实验和诊断结算的输入,是不是照 rules 的类型拼对了;
- 诊断预测冻结早于运行启动;
- 拿掉实验以后跑的是不是剩下的实验;
- 消融的数字是不是逐位不变;
- 正向、消融、基线运行定义是不是没变。
审阅只防 CLAUDE.md"罕见情况怎么办"里的三类情况,提了别的照列不改。
二、第二块:诊断这一段的提示词
2.1 范围
要写的
- 新的任务提示词:诊断解释与实验、诊断预测、诊断实现、诊断修复(如果修复能共用实现那份,就不另写)、诊断核验;
- 四种新提交的字段说明(vocab 的
description)。
要改的
prompts/roles/researcher.md:加上诊断这项工作。只加诊断需要的几句,其余不动。prompts/roles/experimenter.md、verifier.md:加上诊断程序怎么写、怎么核。只加几句。prompts/tasks/proposal.md:加一句,用上本轮的诊断结果。
不改的
- 其余提示词;
tasks/circle_packing/下除TASK.md里"诊断实验怎么拿到原始产物"那一段以外的内容。
2.2 诊断提示词要让模型做到的事
照 docs/调研/提示词.md 第三、四部分写:引导怎么想,不做必填的结构化清单。诊断这一段要讲清楚以下几点。例子只用和题目无关的领域。
- **诊断问的是"剩下的空间在哪",不是"上一步功劳怎么分"。**做法是在当前程序上只动一处,看分数怎么变:
- 换成明显更强、不计时间的版本,看这一步后面还藏着多少;
- 拿掉它,看它现在撑着多少;
- 换一种做法;
- 放宽一个限制。
参考 Ng《Machine Learning Yearning》第 44–45、53–57 章的"优化验证测试"和"按部件看上限",原文是
reference-paper/human-practice/mly.txt。Platt 1964 的"强推断"(同一目录)讲的也是这件事:先列几种互相竞争的解释,再设计能排除其中一些的实验。
- **好的诊断实验,不同解释对它的预测差得远。**大家都预测"涨不了多少"的实验,测了也不改变下一步。研究者之间意见不同的地方最值得测。
- **每条诊断解释要写什么样的实测会推翻它。**写不出来,说明这条解释还不能被检验。
- **以前否掉某条路线的理由,本身也是一条没测过的看法,**可以拿来设计诊断实验。
- **诊断实验只动一处,**交出能判分的答案,用时要放得进分到的那份时间。
- **实验员实现诊断实验时,照写法做,不顺手改进。**任务书 16 查过的"照规格实现"结论可以直接用。
2.3 怎么做
- 读
docs/调研/提示词.md,以及上面提到的论文原文。 - 派子 Agent 再查两样。子 Agent 只读、不写 md,结论直接回复。
- 让模型提出互相竞争的解释,并设计能把它们分开的实验,有哪些写法实际有效:POPPER 的证伪实验设计、co-scientist 的假设与评审、AdaEvolve 停滞时的元指导。原文在
reference-paper/,参考实现的克隆在/home/iomgaa/Projects/RivalBits/reference/。 - 同类系统怎么写"诊断当前瓶颈"的提示。
- 让模型提出互相竞争的解释,并设计能把它们分开的实验,有哪些写法实际有效:POPPER 的证伪实验设计、co-scientist 的假设与评审、AdaEvolve 停滞时的元指导。原文在
- 写。任务提示词里不写字段怎么填,那是字段说明的事。
- 自查泄露:照任务书 17 第 1.2 节第 5 条,用填圆的关键词搜一遍改过的全部文件。关键词至少包括任务书 16、17 用过的那些,再加"联合""半径""LP""起点"。搜到就改掉,搜不到才算过。
- **先提交,再跑。**提示词单独提交一次。之后的真实运行全部用这一版,看到运行结果以后不再改提示词。
三、第三块:真实运行和评估
3.1 跑什么
- 配置用
eval/diagnosis/research.json(诊断开、消融关),从头新跑 3 份完整研究,一直跑到余额用完、停在"导出还没写"。 - 3 份同时跑,同任务书 17 第 3.1 节。CPU 时间与墙钟时间之比照样列出。
- 3 份里挑 1 份,在一次诊断运行确认启动以后、出结果之前,杀一次控制进程再启动。检查三件事:
- 恢复后没有重跑;
- 只扣了一次;
- 每个实验的结果都照常写进去,结算和后面的步骤照常走完。
- 中途出错,照任务书 17 第 3.1 节处理。
- 模型服务的内容审核拦下某份材料(任务书 17 的 E 那种情况)时,这份研究照方法停下,照实记,不改写模型交的文字,不换模型。
3.2 评估:研究质量
不设硬线,结果照实交给用户。
第 1 样:诊断解释和诊断实验的质量。每一轮的诊 1,派一个全新上下文的子 Agent,在看不到诊断结果的情况下读:诊断解释、诊断实验、诊断预测、当前基线代码与它的分数。回答:
- 解释说出了具体的瓶颈吗?写了什么实测会推翻它吗?
- 同一轮几位研究者的解释有没有真正不同?
- 每个实验是不是只动一处?是不是真能把几种解释分开?
- 有没有实验去测以前否掉过的路线的理由?
**第 2 样:选实验。**每轮列出:
- 合并后的实验、各实验的事前合并范围、各组合的信息价值、成本、净值;
- 选了哪几个,或者为什么不诊断。
回答:选中的是不是大家分歧最大的;有没有因为大家意见一致而不诊断,出现了几次(方法.md 第十二部分第 10 条)。
**第 3 样:诊断实现照写法没有、核验员判得对不对。**每次诊断,派一个全新上下文的子 Agent 读:实验原文、当前基线代码、诊断程序、位置表、concerns、核验结论。回答:
- 每个实验是不是只动了写的那一处,有没有偷偷改进别的地方;
- 核验员该判不通过却通过的、不该判却判了的。
**第 4 样:诊断有没有改变走向。**这是这次最要紧的一样。每份研究每一轮一行:
- 诊断推出的方向和它的实测收益;
- 本轮提案里有几条沿这个方向;提案正文有没有引用诊断结果;
- 选批选没选沿这个方向的候选;
- 正向实测,以及沿这个方向的候选比诊断实测高还是低(方法.md 第十二部分第 9 条);
- 采纳了什么。
另列:诊断指出了方向、却没有人沿它提的轮次(第十二部分第 11 条)。
第 5 样:预测准不准、分不分得开。
- 诊 2 预测的落点四段和覆盖率,按人、合并分开报;
- 同一轮各实验合并中位数之间的差距,和任务书 17 里正向候选之间的差距(0.001–0.03)对比。
**第 6 样:整份研究的走向。**每份研究列:
- 每一轮:诊断做没做、几个实验;正向候选;采纳与分数;离已知最好还差多少;
- 分数随轮次的曲线。和任务书 17 的 B、D(没有诊断、消融开)并排,再并上参考项目 15-real-1、15-tight-2、16-real-1。
- 每个跑过的正向候选一行,同任务书 17 第 3.2 节第 6 样的表。
**第 7 样:程序账目。**每份研究列:
- 确认启动的正式运行数(基线、诊断、正向分开)和余额减少的次数,两者应相等;最后余额为 0;
- 每次诊断:选了几个实验,核验几次、修复几次、拿掉了几个,跑了几个;每个实验的用时和结局;
- 诊断预测冻结早于诊断运行确认启动;每轮最多一次诊断结算;
- 余额 < 2 的那一轮没有诊断记录;
- 消融关着:没有消融阶段和解释阶段,账本里有"按配置跳过";
- 杀进程那一次的三条检查。
3.3 怎么算通过
程序部分必须过:
npm run check、npm test全过;- 3 份研究都跑到余额为 0、停在"导出还没写",阶段开关成对;
- 扣掉的次数等于确认启动的运行数;
- 杀进程那一次的三条检查都成立;
- 消融的数字逐位不变(1.2);
- 正向、消融、基线的运行定义没变(1.4)。
**研究质量不设硬线,照实交给用户。**质量不好时,先查是不是 flow 或 materials 写错了:抽一次诊断,看研究者、实验员、核验员"模型调用开始"里存的材料,是否符合方法.md 第三部分和 4.3 诊断一段。材料错了就修,修完重跑;材料对,就照实报告,不再改提示词。
四、正式代码和检验代码分开
照任务书 12 第四部分的 7 条。这次新加的检验代码放 eval/diagnosis/,能复用 eval/full/、eval/lib/ 的就复用。运行目录、审阅结果放 /home/iomgaa/inforsi-eval/<日期-名字>/,不提交。
五、规模
| 模块 | 现在 | 这次 |
|---|---|---|
| flow | 2118 | 加 400–700,上限 3500 |
| rules | 1762 | 加 200–400,上限 2500 |
| materials | 1930 | 上限 1950 一定会超,新上限由用户定,监督者核对时写进结构.md |
| vocab | 1154 | 已超 1150,新上限由用户定,监督者核对时写进结构.md |
| 其余 | — | 照结构.md 第七部分 |
写的过程中,哪个模块超过预计一倍,停下来检查。
六、文档
完成后更新:
docs/结构.md第八部分各模块新导出的函数、类型;flow 一节"做完以哪条记录为准"的表、"谁做、对哪个对象"的表、诊断的阶段编号;新加的eval:命令;WORK_LOG.md:"已完成"补一条。"关键决定"不用你写,监督者核对时补。
不新建 md 文件。方法.md 不用改,有和它对不上的地方,写进报告。
七、验收与报告
做完后本地提交,然后在回复里交一份报告。报告写正文,不把日志全文附进去,日志放在证据目录,报告里给路径。
- 提交号:提示词那次单独列;新增和修改的文件,分
prompts/、src/、tests/、eval/列;各模块行数。 - 提示词:每份写了或改了什么、依据哪条原则或调研结论;泄露自查的关键词和结果;再调研派了哪些子 Agent、查到了什么。
npm run check、npm test的结果,完整输出放证据目录。消融逐位不变、运行定义不变的对照结果。- 程序部分:3 份研究的研究目录、轮数、停下原因;杀进程那一次的三条检查。
- 研究质量:第 3.2 节七样的表和结论。第 4 样单独写一段结论:诊断有没有改变走向。
- 你和这份任务书、结构.md、方法.md 不一致的地方,以及为什么。
- 规则不清楚的地方:哪里让你犹豫、哪里你是靠猜的。没有就写"没有"。没有真实证据的可能情况,在这里提一句就够,不写进 WORK_LOG。
- 正式代码和检验代码分开的自查,逐条写"做到了"或"没做到、为什么"。