Files
InfoRSI/任务书/16-flow-3-实现到采纳.md
2026-10-04 02:59:31 -04:00

289 lines
20 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 任务书 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` 表;
- 参考项目每次运行当时用的提示词在 `/home/iomgaa/rb-acceptance/<运行>/prompts-used/` 下,会话原文在同一目录的 `sessions/` 下。新项目的提示词是以它为底稿改的。
列出你看到的毛病,也列出做得好的地方,每条写清四样:现象、证据位置(库名、表、序号)、提示词里是哪一句引起的、怎么改。
监督者已知的一条,核实后可以直接用: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"条目),不是按上一次提交算。修复材料给"本批基线到上一次提交"的改动,修复后的核验看"本批基线到修复结果",都沿用 materials 现有的做法。(监督者 2026-10-04 更正:原写"上一次提交到这一次的改动另算"是笔误,发修复任务时"这一次"还没写出来。)
- 修完再核验,只核验这次修复过的候选。
- 阶段编号按"第几次"排:`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. 正式代码和检验代码分开的自查,逐条写"做到了"或"没做到、为什么"。