docs: 新增任务书 16(flow 第 3 部分:实现到采纳,含实验员、核验员提示词)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-04 02:10:05 -04:00
parent 55df57d43d
commit 9a4a0c81e9
2 changed files with 290 additions and 1 deletions
+288
View File
@@ -0,0 +1,288 @@
# 任务书 16:flow 第 3 部分(实现到采纳)与这一段的提示词
这是 flow 四部分里的第 3 部分(`docs/结构.md` 第三部分"flow 分四部分写,各自验证")。做完以后,研究能从选批往下走:
1. 实验员按冻结协议实现;
2. 核验员核对,不通过就退回修复,再核验;
3. 正式运行;
4. 整批公开;
5. 采纳。
写完采纳决定后停下,原因写"消融还没写(任务书 17)"。
一份任务书里有三块,**按顺序做**:
1. **第一块:改提示词。**实验员、核验员这一段的提示词。前几次改研究者提示词以后,研究质量都明显提升(任务书 13、15),用户 2026-10-04 定:这一段的提示词同样先诊断再改。改完先提交,再做后面两块。
2. **第二块:写代码。**写 `src/flow` 的 ⑨–⑫。
3. **第三块:真实运行和评估。**从头真实跑 3 次,按研究质量评估。
本任务书已由用户和监督者在 2026-10-04 一起确定。下面说的"监督者",是在参考项目目录里和用户讨论设计的另一个会话。
## 开工前先读
- `CLAUDE.md`:全部。尤其是"测试"一节:flow 的验收看研究质量;正式代码和检验代码完全分开。
- `docs/方法.md`:
- 第三部分:角色与材料;
- 4.3 ⑨–⑫;
- 第五部分:实现、核验、修复三种提交;
- 第六部分:采纳线、余额、信息账;
- 第九部分:中断与恢复,运行次数怎么扣。
- `docs/结构.md`:
- 第三部分:步骤清单,以及"flow 分四部分写,各自验证";
- 第四部分:账本记录;
- 第八部分:flow、materials、submissions、jev、workspace、tasks、runner、agents、rules 各节。
- `docs/调研/提示词.md`:提示词怎么写的调研结论。第一块必读。
- `任务书/14-flow-2-开轮到选批.md`:第二部分的写法(派任务、阶段开关、"做完以哪条记录为准"),这次照着往下接。
- `任务书/15-冲分与先想后看-重测.md` 和 `/home/iomgaa/inforsi-eval/2026-10-04-route-compare/report.txt`:上一次的路线对照,第三块要复用它的脚本。
- `WORK_LOG.md`:"关键决定"最后几条;"未完成"里"给 flow"的条目,第六部分列了哪几条归这次。
- 参考项目(只读,不要改):`/home/iomgaa/Projects/RivalBits/src/controller/` 下实现、核验、正式运行、采纳的部分。看它怎么做,不照搬结构。
## 一、第一块:改这一段的提示词
### 1.1 范围
可以改的:
- `prompts/roles/experimenter.md`、`prompts/roles/verifier.md`;
- `prompts/tasks/implementation.md`、`repair.md`、`verification.md`;
- `src/vocab/submissions.ts` 里实现、修复、核验这几种提交的**字段说明**(`description`),因为"现在交什么"是从字段说明生成的。只改措辞,不改字段的结构、类型、必填与否;vocab 上限 1150 行。
不改的:
- 研究者的全部提示词:上一轮已经改过,事先定好不再调;
- 消融实现、消融核验的提示词:第 4 部分再看;
- `tasks/circle_packing/` 下的任务文件。
### 1.2 怎么做
1. **读调研结论。**`docs/调研/提示词.md` 全文。那两次调研查的是"怎么让研究者提出方向",第三部分的写法原则通用,第二部分的内容不直接适用于实验员和核验员。
2. **针对这一段再调研。**派子 Agent 去查。参考项目的克隆在 `/home/iomgaa/Projects/RivalBits/reference/`。子 Agent 只读、不写 md,结论直接回复。值得查的方向:
- 照一份写定的规格写代码时,怎么让模型只做规格里的事、不顺手"改进":aider、SWE-agent、OpenHands、aideml、MLAgentBench、openevolve 的实现类提示词;
- 代码审查、核对实现和规格是否一致,怎么写才能查出实质问题、又不乱判不通过:AI-Scientist 的审稿提示、SWE-agent 和 OpenHands 的审查提示、co-scientist 的反思步骤;
- 被退回以后怎么修:只改被指出的地方,不重写一遍。
3. **拿真实记录诊断。**读参考项目高分运行里实验员、核验员实际交了什么、被退回了什么:
- 账本在 `/home/iomgaa/rb-acceptance/{16-real-1,15-real-1,15-tight-2,14-real-1,12-real-2}/board.sqlite`,只读,用 `sqlite3 -readonly`;
- 提交在 `submissions` 表,阶段编号里带 `implement`、`verify`;退回在 `audit` 表;轻量检查的计次在 `check_uses` 表;
- 参考项目当时的提示词在它的 git 历史和 `prompts-used/` 下。新项目的提示词是以它为底稿改的。
列出你看到的毛病,也列出做得好的地方,每条写清四样:现象、证据位置(库名、表、序号)、提示词里是哪一句引起的、怎么改。
监督者已知的一条,核实后可以直接用:15-tight-2 第 1 轮 c2,核验员发现实验员把线性规划里"圆到四面墙"的约束行和右端值对错了位,解的不是协议写的那个线性规划,判不通过;修复一次后通过,然后才正式运行。这是核验起作用的例子,改提示词不要把这种能力改丢了。
另外注意一件事:研究者的提示词现在写着"正向实验只管冲分"(提交 ff5c8dd)。实验员和核验员不一样:实验员照冻结协议忠实实现,不替研究者"冲分"、不顺手加改进;核验员只对照协议核对。实验员读得到研究者的提交,看看这句会不会影响他。
4. **改。**照 `docs/调研/提示词.md` 第三、四部分的原则写。同一段内容只放一处:角色提示词里的内容不在任务提示词里再写一遍,任务提示词里不写字段怎么填(那是字段说明的事)。
5. **自查泄露。**照 `docs/调研/提示词.md` 第四部分最后一条:
- 改完用填圆的关键词搜一遍你改过的全部文件,搜到就改掉,搜不到才算过;
- 例子只用和题目无关的领域,不出现任何填圆的做法、数值或参考项目跑出来的具体经历。
6. **先提交,再写代码和跑。**提示词改完单独提交一次。之后的真实运行全部用这一版,**看到运行结果以后不再改提示词**。这是事先定好的规则:结果不管好坏都照实收下,交给用户。
## 二、第二块:代码
### 2.1 管哪些步骤
config 的 `ROUND_STEPS` 从 `implementation` 到 `adopt`:
- `implementation`、`verification`、`repair`:实现、核验、修复;
- `forwardRun`:正式运行;
- `publish`、`informationAccount`:整批公开、信息账;
- `adopt`:采纳。
写完采纳决定后,走到 `listCells` 时停下,原因写"消融还没写(任务书 17)"。代码按"第 r 轮"写,不写死 1。
### 2.2 怎么走(方法.md 4.3 ⑨–⑫)
**实现**
- 本批每个入选候选派一个实验员任务,对象是候选。不同候选的实验员同时跑。
- 实验员的工作目录:从本批基线(materials 的 `Board.baselineOf`)取出的代码。
- 交上来以后,flow 先做三件事,再交给 submissions 判定:
1. 用 workspace 存成一个版本;
2. 和本批基线比较,用 jev 的 `codeHunks` 切成差异块;
3. 用 tasks 的 `protectedChanges` 查有没有改不许改的文件。
以上三步的结果拼成 submissions 要的 `known.code`。存不成版本时,照 `known` 的另一种形状交。
- 协议规则里引用的指标,要换成原登记的定义("给 flow"条目)。materials 的实验员材料里已经有这一步,把它导出来共用,不另写一份。
- 收下的实现,把代码版本和因子位置表写进冻结代码记录(`code`)。
**轻量检查**
- agents 已经有轻量检查工具,它调 `SessionTask.lightCheck`。由 flow 接上:取出实验员当前的工作目录,用 tasks 的 `lightCheck` 和 runner 跑,用 `readLightCheck` 读结果。
- 次数上限(`config.lightChecks.maxCount`)和每次时长(`seconds`)由 flow 计、由 flow 限。
- 次数按每次模型调用计,不写进账本:会话文件里本来就留着每次检查。只有用户自己杀进程重启才可能多查几次,按"单用户不防误操作"不为它加记录(监督者定)。
**核验**
- 实现阶段关闭后,每个候选派一个核验员任务,对象是候选。
- 材料里"起点到候选的改动"由 flow 用 workspace 的 `compareVersions` 算出来,交给 materials。"没有归属的改动"由 materials 现算。
- 用 submissions 的 `verificationOutcome` 判通过没有。
**修复**
- 核验阶段关闭后,不通过的候选才派修复任务,对象是候选,交给这个候选原来那位实验员("给 flow"条目:修复任务要在核验阶段关闭后再发)。
- 实验员从他上一次交的代码接着改,工作目录取出那个版本。
- 修复交上来,差异块仍按**本批基线**算("给 flow"条目),不是按上一次提交算;修复材料里给的"上一次提交到这一次的改动"另算。
- 修完再核验,只核验这次修复过的候选。
- 阶段编号按"第几次"排:`r<轮>-implementation`、`r<轮>-verification-1`、`r<轮>-repair-1`、`r<轮>-verification-2`……第几次从账本里数,不另存。
- 修复次数用完(`config.maxRepairs`)仍不通过:这个候选不跑,不扣运行次数,写一条事件写明原因(方法.md 4.3 ⑨)。materials 现在只有消融格的"不跑"事件名,正向的补一个。
**正式运行**
- 通过核验的候选,用 flow 已有的 `formalRun` 跑,用途写 `forward`。
- 先登记(占名额),确认容器启动后才扣次数,再判分、写结果。这些 `formalRun` 已经做好了。
- 一批里的正式运行**一个接一个跑**,不同时跑(监督者定)。原因:候选多半写着"跑到某个秒数就停",同时跑的容器抢 CPU,会直接改变分数。
- "没启动"的处理照基线:写完"没启动"就停下,下次启动起新编号重跑。
**整批公开与信息账**
- 不写记录。本批全部运行有了结果(或者有了"不跑"事件),这两步就算做完。
- 公开靠采纳决定:materials 的 `Board.runPublic` 以本轮采纳决定的出现为准。
- 信息账从预测和运行结果现算(结构.md 第四部分"能现算的不存")。
**采纳**
- 用 rules 的 `adopt` 和 `adoptionLine`。输入:本批每个有有效分数的候选、本批基线分数、方向、ε。
- 写一条决定,种类 `adopt`。没有候选过线时也写,`adopted` 为 null("给 flow"条目:本轮正向运行靠它公开)。
### 2.3 每一步以哪条记录为准算做完
接着 `docs/结构.md` 第八部分 flow 一节的那张表往下加:
| 步骤 | 看到哪条记录算做完 |
|---|---|
| `implementation` | 这一轮实现阶段的关闭记录 |
| `verification`、`repair` | 每个入选候选都已结束这一段:要么最近一次核验通过,要么修复次数用完、有"不跑"事件。中间每次核验、修复阶段各有开关记录 |
| `forwardRun` | 每个通过核验的候选,最近一次正向运行有结果,而且不是"没启动" |
| `publish`、`informationAccount` | 不写记录:`forwardRun` 做完就算做完 |
| `adopt` | 本轮的采纳决定(`decision`,种类 `adopt`) |
### 2.4 共用动作要补的
- "派一个模型任务"现在写死给研究者用。按角色补上实验员和核验员:
- 模型取配置里对应的角色;
- 角色提示词按角色取;
- 实验员有工作目录(取出的代码)、轻量检查、`known.code`;
- 核验员和修复材料要传 `changes`。
- 实验员、核验员的编号:materials 只有 `researcherId`,补上这两种角色的。
- `View.lastCall` 和 `done` 现在假定是研究者,确认对实验员、核验员也对。
### 2.5 规模
flow 现在 1105 行,预计加 450–650 行,上限照结构.md 第七部分的 2000–3500。materials 只补导出和一个事件名,不超过 1950 行。
## 三、第三块:真实运行和评估
### 3.1 跑什么
- 用第一块改好的提示词,配置照 `eval/round-zero/research.json`,只换研究编号。
- **从头新跑 3 份研究**,跑到第 1 轮采纳后停下。不接着跑任务书 15 的三份:提示词改了,恢复时程序核对提示词哈希会停下,这是方法规定的(方法.md 第九部分),不为此改程序。
- **一个接一个跑**,不同时跑,同一台机器上也不和别的研究同时跑。原因同 2.2"正式运行"。
- 3 次里挑 1 次,在第一个正式运行确认启动以后、出结果之前,杀一次控制进程再启动。检查:
- 恢复时按容器名找到这次运行,接着等它,没有重跑;
- 这次运行只扣了一次;
- 结果照常写进去,后面的步骤照常走完。
- 中途出错先查原因:
- 是程序的毛病,按 CLAUDE.md 修了重跑,修了什么写进报告;
- 是服务一时调不通,接着跑(`node eval/lib/cli.ts --resume --dir <研究目录>`)。
### 3.2 评估:研究质量
用户 2026-10-04 定的五样。不设硬线,结果照实交给用户。
**第 1 样:实现照协议没有。**
- 每个跑过的候选,派一个全新上下文的子 Agent。
- 给它:冻结协议全文、本批基线代码、最终代码(核验通过的那一版)、实验员交的因子位置表和"担心"。
- 让它逐条对照实现条款、因子、保障,回答:有没有漏做;有没有协议里没有的"改进";位置表对不对。每条附代码位置。
- 结论直接回复,不写 md。
**第 2 样:核验员判得对不对。**
- 同一个子 Agent 再看核验员每次交的逐项结论,找出:
- 该判不通过却判了通过的;
- 不该判不通过却判了不通过的。
- 有修复的,看修复是不是只改了被指出的地方。
**第 3 样:押注和实测对比。**每个跑过的候选一行:
- 路线代号:用任务书 15 附录一的分类,从冻结协议判;
- 合并后的一成、一半、九成三个数;
- 三位研究者各自第二次预测的一半那个数;
- 作者自评(检验脚本直接读账本,不受封存影响);
- 实测分数;
- 实测落在合并范围的哪一段。
再单列一项:能走到最好的那类路线(整题联合优化、或挪全部圆心加多起点的完整路线),实测比押的高还是低、差多少。这份数据之后还要用来检验"让 Jev 比较上限"的想法(`WORK_LOG.md` 未完成里 Jev 押注一条)。
**第 4 样:分数和参考项目第 1 轮对比。**
- 从参考项目 5 次高分运行的账本里取第 1 轮各正向候选的分数和采纳结果,和我们 3 次并排列。
- 参考项目第 1 轮采纳的分数在 1.55 到 2.632 之间。分数存在哪张表你自己查。
- 注意:参考项目那几次的提示词带着填圆的具体做法,这一项它们占了便宜。
**第 5 样:程序账目。**每次运行列:
- 确认启动的正式运行数,和余额减少的次数,两者应相等;
- 每个候选核验了几次、修复了几次、最后跑没跑;
- 修复用完不跑的,有没有扣次数、有没有写事件;
- 轻量检查每次调用用了几次、有没有超过上限;
- 杀进程那一次的三条检查。
**另外:第零轮到选批的路线对照。**这 3 份研究会重新跑一遍第零轮和第 1 轮前半段,提示词和任务书 15 相同。用 `eval/route/` 的脚本对它们做同样的 A–J 对照表,和任务书 15 的 3 次并排,看结果能不能重复。阅读问卷照任务书 15 附录一。
### 3.3 怎么算通过
**程序部分必须过**:
- `npm run check`、`npm test` 全过;
- 3 次运行都走到采纳后停下,每个阶段开关成对;
- 扣掉的次数等于确认启动的运行数;
- 杀进程那一次的三条检查都成立。
**研究质量不设硬线,照实交给用户。**
质量不好时,先查是不是 flow 或 materials 写错了:抽一次运行,看实验员、核验员"模型调用开始"里存的材料,是否符合方法.md 第三部分和 4.3 ⑨。材料错了就修,修完重跑。材料对,就照实报告,**不再改提示词**(第一块第 6 条)。
## 四、正式代码和检验代码分开
照任务书 12 第四部分的 7 条。这次新加的检验代码放 `eval/round-one/` 或新目录 `eval/forward/`,共用的工具放 `eval/lib/`。运行目录、审阅结果都放 `/home/iomgaa/inforsi-eval/<日期-名字>/`,不提交。
## 五、文档
完成后更新:
- `docs/结构.md` 第八部分 flow 一节:
- "做完以哪条记录为准"的表,加上第 2.3 节的几行;
- "谁做、对哪个对象"的表,加上实现、核验、修复;
- 修复的阶段编号怎么排;
- 正式运行一个接一个跑;
- 新加的 `eval:` 命令。
- `docs/结构.md` 第八部分 materials 一节:补上新导出的函数和新事件名。
- `WORK_LOG.md`:
- "已完成"补一条;
- 删掉这次做到的"给 flow"条目;
- "关键决定"不用你写,监督者核对时补。
不新建 md 文件。
## 六、"给 flow"的条目里归这次的
`WORK_LOG.md`"未完成"里的:
- 没采纳时也写一条采纳决定(adopted 为 null),本轮正向运行靠它公开;修复任务要在核验阶段关闭后再发。
- 修复的差异块按本批基线算,切好交给 submissions。
- 问 Jev 查代码改动时,冻结协议里引用的指标要换成原登记的定义(导出共用,不另写一份)。
其余几条(选格种子、轮末动作、解封、消融格、`cannotRun`)归第 4 部分,留着。
## 七、审阅
这次写到了运行次数怎么扣、核验结论怎么驱动修复和不跑、采纳决定,都是账本里"驱动实际动作的决定"(方法.md 第九部分)。写完后另派一个全新上下文的子 Agent 审阅一轮,只看:
- 第 2.2 节的修复循环;
- 正式运行的登记、扣次和恢复;
- 采纳决定。
审阅只防 CLAUDE.md"罕见情况怎么办"里的三类情况,提了别的照列不改。
## 八、验收与报告
做完后本地提交,然后在回复里交一份报告。监督者会对着实际文件、账本和评估输出逐项核对:
1. 提交号:提示词那次单独列;新增和修改的文件,分 `prompts/`、`src/`、`tests/`、`eval/` 列;`src/flow` 和 materials 的总行数。
2. **提示词**:
- 诊断出的毛病和做得好的地方,按第 1.2 节第 3 条的四样写;
- 每份提示词改了什么、依据哪条毛病或哪条原则;
- 泄露自查用的关键词和搜索结果;
- 再调研派了哪些子 Agent、查到了什么。
3. `npm run check`、`npm test` 的完整输出。
4. 程序部分:3 次运行的研究目录、停下原因;杀进程那一次的三条检查。
5. 研究质量:第 3.2 节五样的表和结论,以及路线对照的 A–J 表。
6. 3 次运行每个入选候选一行:名称、路线代号、核验几次、修复几次、跑没跑、实测分数、采纳没有。
7. 你和这份任务书、结构.md、方法.md 不一致的地方,以及为什么。
8. **规则不清楚的地方**:哪里让你犹豫、哪里你是靠猜的。没有就写"没有"。没有真实证据的可能情况,在这里提一句就够,不写进 WORK_LOG。
9. 正式代码和检验代码分开的自查,逐条写"做到了"或"没做到、为什么"。