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

20 KiB
Raw Permalink Blame History

任务书 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. 正式代码和检验代码分开的自查,逐条写"做到了"或"没做到、为什么"。