Files
iomgaa a0ee4ef7a2 docs: 任务书 10 冻结协议不带答复
答复已在回应、统一的提交记录里,冻结协议只放方法.md 4.3 ⑥ 列的几项,避免同一份内容存两处。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 05:06:38 -04:00

17 KiB
Raw Permalink Blame History

任务书 10:submissions(收件),以及 materials 的几处修改

写 submissions 模块:一份模型提交,收下还是退回。先由程序检查,再问 Jev。开工前先改 materials 的几处地方,这些是监督者核对任务书 09 时发现的。

本任务书已由用户和监督者在 2026-10-03 一起确定。下面说的"监督者",是在参考项目目录里和用户讨论设计的另一个会话。

开工前先读

  • CLAUDE.md:全部,尤其是"罕见情况怎么办"(什么算边界、哪些不算)、"不设默认值"、"测试"。

  • docs/结构.md:

    • 第二部分:submissions 一行,以及"几条边界"里"收不收一份提交,只在 submissions 一处判";
    • 第四部分:账本记录第 3 种(提交与退回)、第 4 种(冻结协议);
    • 第八部分:vocab(SUBMISSION_SCHEMAS、Checklist、JevJudgment)、ledger、tasks(protectedChanges)、workspace(compareVersions)、jev、materials 各节。
  • docs/方法.md:

    • 第五部分:每种提交的字段、三个数严格递增、保障短名、指标登记、延续;
    • 4.2、4.3 ②⑥⑨⑭⑯:哪些提交要过哪些检查、Jev 在哪里判;
    • 6.6:一格的几种结局。
  • WORK_LOG.md:"未完成"里"任务书 09 核对后要改的 materials"7 条、"留给 submissions 的跨字段规则"14 条、"给 submissions"那条、"核验提交 body 的字段说明"那条、"jev 判重材料加关键设定"那条。

  • 参考项目(只读,不要改):

    • /home/iomgaa/Projects/RivalBits/src/rounds/submissions.ts、/home/iomgaa/Projects/RivalBits/src/rounds/task-submissions.ts:程序检查;
    • /home/iomgaa/Projects/RivalBits/src/controller/submit.ts:先程序后 Jev 的顺序、退回文字怎么写。

    这三个文件合起来约 2400 行,真正属于"收不收"的约 750 行;去掉已删的功能和 vocab 已经管的字段形状,剩下的才是要搬的。第五部分列了保留和删除。

一、先改 materials(任务书 09 核对后要改的)

  1. 挑刺的"现在交什么":closing() 里挑刺落进了研究者的通用一句"调用一次交上就完成了",和任务说明"可以交一份或几份,每份调用一次"相反。模型多半照最后一句只交一份。给挑刺单写一句,和提案那句类似。
  2. 上一次为什么被退回,按对象找:账本的退回记录加一个"对象"字段,和提交记录的 target 同义(候选、原提案、消融格,没有对象的写 null)。materials 按"阶段、作者、种类、对象"找本人最后一次被退回的原因。删掉 callPrefix 和按调用编号前缀定位的写法,WORK_LOG 里"同一人同一阶段同一种任务不并行"那条要求随之作废(核对时已删)。ledger 表结构版本号升一级,相应的测试跟着改。
  3. 核验材料删掉 Jev 预扫的概率和阈值(assigned.ts 的"预扫结果"一节):方法里没有这一项。一份实现能走到核验,说明 Jev 已经判过没问题;再把低于阈值的概率给核验员看,等于把 Jev 当提示用。用户的意思是 Jev 当判别条件用,判了就算。
  4. 信念本补"合法化扣掉的分"(方法.md 6.10 第 3 条):在选批历史的每次运行后面加一行。合法化记在判分结果的 extra 里,内容由任务决定,materials 不认识它的字段,就原样写出来。
  5. 删掉"答案出自被关掉的因子,它本该关着"那句(locations.ts 的 answerPathLines):方法里没有,也没有真实证据说明会出现。
  6. 消融核验不通过可以重做(用户 2026-10-03 定,方法.md 4.3 ⑯、6.6):
    • 重做时重发一次"消融实现"任务,材料里放上一次消融核验的结论(哪个因子关错了、核验员写的依据),写法参照正向修复的"退回意见";
    • 一格因为重做次数用完而不跑、记"证据不足"时,这一格没有运行。现在 belief-book.ts 的 cellText 假定"证据不足"的格一定有运行,要改:没有运行时,原因从这一格的事件记录里读(事件由 flow 写,事件的写法在这里定下来、导出给 flow 用);
    • src/rules/ablation.ts 里 insufficient 的注释跟着改。
  7. 三处旧说法:
    • tasks/circle_packing/TASK.md 里"保障写'无'时写 {}",改成和 vocab 一致;
    • src/vocab/submissions.ts 开头注释里的 q₁ ≤ q₅ ≤ q₉,改成严格递增;
    • agents 读代码工具的 offset 参数:提示词里已经不提它了。删掉 offset,单次读的上限照旧。

另外两处小改动:

  • jev 判重材料加"关键设定":DedupFactor 加 keySettings,判重的材料里带上它。问题里写着"设定不同就不算同一个改法",现在 Jev 却看不到设定。问法其余部分不动,阈值照旧,也不重新校准。
  • 核验提交 body 的字段说明补一句:同一行同时出现在因子和保障里时,在说明里写一句提醒(方法.md 4.3 ⑨)。

二、submissions 做什么

用"实验员交了候选 r1-c1 的实现"举例:

  1. agents 收到模型的提交,交给 flow 的提交回调。
  2. flow 先把实验员的工作目录存成一个版本(workspace),和本批基线比较,拿到"改了哪些文件"和"代码差异";再用 tasks 的 protectedChanges 算出改了哪些不许改的文件。这些是提交之后才知道的东西,不在对号清单里。
  3. flow 把提交内容、这次任务的对号清单(存在"模型调用开始"记录里的那份)、第 2 步算出的东西一起交给 submissions。
  4. submissions 先做程序检查,有一项不过就退回,不再问 Jev;全过了再问 Jev,有一问判"是"就退回。
  5. submissions 交回"收下 + 用到的 Jev 判断",或者"退回 + 原因 + 用到的 Jev 判断"。flow 照着写账本,agents 原样回给模型。

submissions 不读账本,也不写账本,只看交进来的东西。它只依赖 jev 和 vocab(结构.md 第二部分),不引用 tasks、workspace、materials:要它们算的东西,由 flow 算好传进来。

三、对外提供什么

经 src/submissions/index.ts 导出,函数名由你定。

1. 判一份提交:输入下面这些,全部必填,可以没有的写 null。

  • 提交种类和内容(vocab 的 Submission)、对号清单(vocab 的 ChecklistOf<K>)、Jev 的模型名。

  • 按种类区分的"提交之后才知道的东西",用联合类型写,写不出"挑刺带代码差异"这种组合:

    • 提案:本人本阶段已经收下几条(替换时不算被替换的那条)。超过对号清单的 maxProposals 就退回;
    • 回应:作者那条原提案的内容。submissions 用它拼出冻结协议(见第四部分第 3 条);
    • 实现、修复:代码存成版本了没有。存不了就带 workspace 给的原因;存成了就带改了哪些文件里属于不许改的那些、代码差异块(jev 的 codeHunks 切好的),以及冻结协议里给 Jev 对照的那几项;
    • 消融实现:交的不是"跑不起来"时,同样带"存成了没有"和不许改的文件;
    • 其余种类:没有。

    代码存不了也交给 submissions 退回,这样所有退回都只在这一处判、写法一样。

  • 交回:

    • 收下:用到的 Jev 判断(没问 Jev 的为 null);回应和统一另交回拼好的冻结协议主体(因子、保障、指标、正文、实现条款,就是方法.md 4.3 ⑥"冻结协议包括"那几项),flow 在回应阶段关闭时补上轮次、基线、合并了哪些原提案,写成 materials 的 FrozenProtocol;
    • 退回:原因文字和用到的 Jev 判断。

2. 核验通过没有:给一份已经收下的核验,交回通过或不通过,以及不通过的那几项。任何一项没落实,或者任何一条没有归属的改动判为越界,就是不通过(方法.md 4.3 ⑨)。

3. 消融核验通过没有:给一份已经收下的消融核验、这一格要关的因子、实验员报的一起关的因子。要关的那几个都写了"关着",其余因子都写了"照留",才算通过(方法.md 4.3 ⑯)。

第 2、3 条判的是"收下之后的结论",不是"收不收"。放在这里,是因为它们和第 1 条一样,都是对一份提交内容做的判断。

四、要做的检查

程序检查

WORK_LOG 那 14 条,加下面几条:

  • 不许改的文件(方法.md 4.3 ⑨):实现、修复、消融实现,改了不许改的文件就退回,原因里写出是哪几个文件。消融实现也查,因为"运行的规矩和正向运行相同"(4.3 ⑯)。
  • 代码存不了:退回,原因原样写 workspace 给的(例如哪个路径是符号链接)。
  • 指标编号不能和已占用的重名:已占用的编号指最终指标、常规辅助指标、之前登记过的假设专用指标,对号清单里的 takenMetricIds 就是这些(WORK_LOG"给 submissions"那条)。

退回原因要写出该写什么。覆盖不全、编号写错时,原因里列出对号清单里该写的全部编号,例如"挑刺编号应当是 r1-a1-1.a2.1、r1-a1-1.a3.1,你写的 r1-a1-1.a2.2 不在里面"。参考项目在真实运行 15-tight-2 第 3 轮里,模型连续抄错挑刺编号,加上这一条之后改好了(参考项目提交 378fe68)。

Jev

提交 问什么 怎么问
回应、统一 冻结条款三问:改动了评测、自相矛盾、太含糊(checkProtocol) 对拼好的冻结协议问一次
实现、修复 代码改动五问(checkHunk) 每个差异块一次。没有差异块的改动(二进制、只改可执行位、空文件增删)Jev 看不到内容,不问
其余 不问 消融实现照参考项目不问:冻结协议里没有登记"关掉以后"的随机性和停止条件,五问没有对照
  • 一份提交的几问全问完再决定。有一问判"是"就退回,原因里列出每一问的问题名、概率、阈值;代码改动还要写出是哪个文件的哪一块,附上那一块的差异原文。参考项目 submit.ts 的退回文字可以借。
  • Jev 调不通、回答读不懂,jev 会报错。submissions 不接住这个错,让它往上抛,flow 按内部错误停下研究。这不是模型交得不对,不能记成退回。
  • 判"是"用的是 jev 交回的 yes。jev 怎么比阈值(现在是严格大于)是 jev 的事,submissions 不再比一次。

回应怎么拼成冻结协议

  • 回应:因子、保障、指标、正文四项,changes 里写了哪一项就整项换成新的,没写就用原提案的。实现条款取回应自己的。答复不进冻结协议:它们已经在回应或统一的提交记录里。materials 的 FrozenProtocol 去掉 replies 和 replyBody,第二次预测要的"挑刺与答复"从这个候选已公开的回应或统一提交里读。
  • 统一:直接用统一提交自己的字段,不再叠原提案。
  • 因子数上限、延续、保障短名、指标这几条规则,对拼好以后的协议查。原提案已经查过的部分,没改就不会出新问题,但拼好再查一遍,写法最简单。
  • 拼法只写在这一处。flow 写冻结协议时用 submissions 交回的结果,materials 读账本里存好的协议,都不再自己拼。

五、参考项目的保留与删除

处理 内容
删除 vocab 字段定义已经管了的形状检查:多字段、少字段、空文字、数组长度、编号写法。Pi 调提交工具之前就按 vocab 查过,agents 把查不过的也报给了提交回调
删除 程序补的编号是否合法、整份能不能规范序列化:编号由程序起,序列化是我们自己的程序
删除 cannotImplement、requirementMap、metricsImplemented、feedbackResponses、codeHash:新项目的字段里没有这些
删除 回应的条款要指向基线里存在的文件、行号不超出、函数名能找到:新项目的条款是自由文字,评测被改由 Jev"改动了评测"那一问判
删除 指标短名不能含".":参考项目拼前缀才需要;新登记的指标"规格写得够不够具体""是不是换个说法测同一个量"两类 Jev 问题;naive 的可行性:方法里都已删除
删除 提案至少一条指标、保障清单不能为空:新项目里没有就交空数组
删除 消融实现的代码不能和完整代码一模一样:没关掉指定的因子,消融核验会查出来,不用在收件时再查一次
删除 因子名称、入口名称不能重复:没有真实证据说明出过问题
不归 submissions 替换的是不是本人刚交的:由 ledger 写入时拒绝(结构.md 第二部分)
不归 submissions 参数 JSON 被截掉一半、必填字段交 null:agents 已经处理了
保留 退回原因里列出该写的编号(真实证据见第四部分)

六、测试

不花钱的测试,放进 npm test:

  • 14 条跨字段规则和第四部分加的几条,每条至少一个"该退回"的例子,再有一个"都对、收下"的例子。收下的例子要用不问 Jev 的种类(预测、挑刺、解释等),或者在程序检查那一步就退回,不会走到 Jev。
  • 退回原因里列出了对号清单里该写的编号。
  • 回应拼冻结协议:changes 只改一项时,其余几项取原提案的;统一不叠原提案。预期值按方法.md 手写。
  • 核验通过没有、消融核验通过没有:各有通过和不通过的例子。
  • 第一部分 materials 的几处:每条都有能重现原问题的测试。挑刺的"现在交什么"不再写"调用一次就完成";退回按对象找到的是本人这个对象的,不是别的对象的;核验材料里没有 Jev 的概率;信念本里有合法化的原样记录;消融格不跑、记"证据不足"时信念本照样写得出来。

真实 Jev 的测试:jev 的地址写死在代码里,不为测试改成可配置。走到 Jev 的路径放进现有的 npm run test:jev(要花钱、要联网,不进 npm test):

  • 一份写得好的回应,三问都没判"是",收下;
  • 一份把评测改掉的回应(例如冻结协议里写"改 validate.py 的容差"),退回,原因里有这一问的概率和阈值;
  • 一份实现,切出的差异块每块问一次,交回的判断条数等于块数。

报告里贴出这几次的实际结论和概率。

审阅:收不收决定了什么能进账本,写完派一个全新上下文的子 Agent 审阅一轮。告诉审阅者:

  • 每条意见先回答"不写会怎样";
  • 只防三类:没人操作也会发生的、模型正常工作时就会做的、出错后发现不了的;
  • 模块之间传错参数、有人用 shell 故意破坏,都只列出不改;
  • 下面这些已经判断过不用防,除非有新证据:因子或入口名称重复;消融代码和完整代码一模一样;对号清单本身写错(那是 materials 的事,不算边界)。

审阅意见逐条判断,采纳或不采纳都在报告里写理由。

七、规模与文档

  • submissions 预期 400–600 行,不含测试。参考项目真正属于"收不收"的约 750 行,去掉已删的功能以后约 300–350 行,再加上拼冻结协议和两个"通过没有"。超过 600 行就停下来检查。materials 改完不超过 1850 行。
  • 完成后更新:
    • docs/结构.md 第七部分:submissions 的行数改成 400–600;
    • docs/结构.md 第八部分:补 submissions 对外的函数和类型,每项一句话;ledger 一节写上退回记录的对象字段;materials、jev 两节按第一部分改了的地方跟着改;
    • WORK_LOG.md:在"已完成"补一条;删掉"未完成"里已做的:任务书 09 核对后要改的 7 条、14 条跨字段规则、"给 submissions"那条、核验 body 那条、判重加关键设定那条。
  • 不新建 md 文件。

八、验收与报告

做完后本地提交,然后在回复里交一份报告,监督者会对着实际文件逐项核对:

  1. 提交号,新增和修改的文件列表,每个文件的行数,submissions 的总行数,materials 改完后的总行数。
  2. npm run check、npm test、npm run test:jev 的完整输出。
  3. 三份退回原因的实际文字:一份覆盖不全的、一份改了不许改的文件的、一份 Jev 判"是"的。
  4. 第一部分每一条怎么改的,对应哪个测试。
  5. 审阅意见逐条:内容、采纳或不采纳、理由。
  6. 你和这份任务书、结构.md、方法.md 不一致的地方,以及为什么。
  7. 规则不清楚的地方:读 CLAUDE.md、结构.md、方法.md 时,哪里让你犹豫、哪里两份文件说法不一致、哪里你是靠猜的。没有就写"没有"。没有真实证据的可能情况,在这里提一句就够,不写进 WORK_LOG。