docs: 结构.md flow 一节补第 4 部分(消融到收尾、轮末解封、研究结束、eval:full 命令)

来源:任务书 17 第五部分。materials 一节无新增导出(消融格的角色编号复用正向的
experimenterId/verifierId)。
This commit is contained in:
2026-10-04 14:14:44 -04:00
parent 0ae495f8e8
commit 0694303153
+34 -2
View File
@@ -586,11 +586,11 @@ Jev 是一个判别器,和程序检查地位相同,不单独成一种记录
### flow ### flow
下面是 `src/flow/index.ts` 导出的全部内容,以后 plugin 也只用它。flow 只经各模块的 `index.ts` 用它们;正式代码里没有为检验写的参数、环境变量、回放模式或假实现(CLAUDE.md"测试")。这一节对应 flow 第 1–3 部分(任务书 12、14、16):骨架、研究开始、第零轮,以及第 r 轮从开轮到采纳;采纳决定写完后走到 `listCells` 停下,原因"消融还没写(任务书 17)"。轮次按"第 r 轮"写,不写死 1;现在走得到的只有第 1 轮。 下面是 `src/flow/index.ts` 导出的全部内容,以后 plugin 也只用它。flow 只经各模块的 `index.ts` 用它们;正式代码里没有为检验写的参数、环境变量、回放模式或假实现(CLAUDE.md"测试")。这一节对应 flow 第 1–4 部分(任务书 12、14、16、17):骨架、研究开始、第零轮、第 r 轮从开轮到收尾、一轮接一轮直到余额用完;余额为 0 时走到 `export` 停下,原因"导出还没写"(导出还没写)。轮次按"第 r 轮"写,不写死轮数。
- `runStudy(input)`:推进一份研究,直到停下。输入三样,都必填:研究目录;配置(新研究交 `checkConfig` 检查过的配置,接着跑一份已有的研究写 null,以账本里冻结的那份为准;两者对不上就报错);"停下"信号。每次启动走同一条路:打开账本;新研究先冻结配置,本机已有 `inforsi-<研究编号>` 的镜像就说明研究编号用过了,报错停下,要换一个编号(编号重复的新研究会把旧研究遗留的同名容器当成自己的运行);已有研究的,核对冻结的配置、镜像还在、提示词哈希没变(开发入口开着时提示词可以变);给开始了没结束的模型调用补写结束(出错、"进程中断"、墙钟时间测不到);按容器名问 Docker 核对登记了没结果的正式运行(没启动的写"没启动"退还名额,启动了的补写确认启动、等它、判分、写结果,问不到的写"状态未知"事件并停下);然后进主循环:读账本 → 问"下一步做什么" → 做这一步 → 回到开头。主循环里 `docker run` 没启动的,写完"没启动"结果(退还名额、记下 Docker 报错原文)就停下,停下原因带上报错原文,本进程不重跑;下次启动时照旧起新编号重跑。恢复时补写的"没启动"不停下。 - `runStudy(input)`:推进一份研究,直到停下。输入三样,都必填:研究目录;配置(新研究交 `checkConfig` 检查过的配置,接着跑一份已有的研究写 null,以账本里冻结的那份为准;两者对不上就报错);"停下"信号。每次启动走同一条路:打开账本;新研究先冻结配置,本机已有 `inforsi-<研究编号>` 的镜像就说明研究编号用过了,报错停下,要换一个编号(编号重复的新研究会把旧研究遗留的同名容器当成自己的运行);已有研究的,核对冻结的配置、镜像还在、提示词哈希没变(开发入口开着时提示词可以变);给开始了没结束的模型调用补写结束(出错、"进程中断"、墙钟时间测不到);按容器名问 Docker 核对登记了没结果的正式运行(没启动的写"没启动"退还名额,启动了的补写确认启动、等它、判分、写结果,问不到的写"状态未知"事件并停下);然后进主循环:读账本 → 问"下一步做什么" → 做这一步 → 回到开头。主循环里 `docker run` 没启动的,写完"没启动"结果(退还名额、记下 Docker 报错原文)就停下,停下原因带上报错原文,本进程不重跑;下次启动时照旧起新编号重跑。恢复时补写的"没启动"不停下。
- `StudyInput`(类型):上面三样输入。 - `StudyInput`(类型):上面三样输入。
- `StudyEnding`(类型):两种结局之一:停下(附原因,同时写一条停下事件),或被用户停下(正在跑的模型会话立即停,正在跑的容器不管,下次启动由恢复入口接着等)。"研究结束"第 4 部分才有。 - `StudyEnding`(类型):两种结局之一:停下(附原因,同时写一条停下事件),或被用户停下(正在跑的模型会话立即停,正在跑的容器不管,下次启动由恢复入口接着等)。现在走得到 `export`:余额用完就停在那里,原因"导出还没写"。
研究目录里放:`ledger.sqlite` 账本;`repo.git` 代码版本的裸仓库;`runs/<运行编号>/` 一次正式运行(取出的代码、运行目录、日志、判分目录、校验器日志);`calls/<调用编号>/` 一次模型调用(工作目录、会话文件、能读的代码版本)。取出代码、建运行目录和判分目录时目标都是新建的空目录。容器名 `inforsi-<研究编号>-<运行编号>`,判分容器另加 `-judge`。同一份研究的全部运行用同一个种子:研究编号经 vocab 的 `hash` 取前 8 位十六进制转成整数,冻结进研究配置记录。 研究目录里放:`ledger.sqlite` 账本;`repo.git` 代码版本的裸仓库;`runs/<运行编号>/` 一次正式运行(取出的代码、运行目录、日志、判分目录、校验器日志);`calls/<调用编号>/` 一次模型调用(工作目录、会话文件、能读的代码版本)。取出代码、建运行目录和判分目录时目标都是新建的空目录。容器名 `inforsi-<研究编号>-<运行编号>`,判分容器另加 `-judge`。同一份研究的全部运行用同一个种子:研究编号经 vocab 的 `hash` 取前 8 位十六进制转成整数,冻结进研究配置记录。
@@ -612,6 +612,15 @@ Jev 是一个判别器,和程序检查地位相同,不单独成一种记录
| `forwardRun` | 每个通过核验的候选最近一次正向运行有结果,而且不是“没启动” | | `forwardRun` | 每个通过核验的候选最近一次正向运行有结果,而且不是“没启动” |
| `publish`、`informationAccount` | 不写记录:`forwardRun` 做完就算做完;公开靠本轮采纳决定,信息账从预测和结果现算 | | `publish`、`informationAccount` | 不写记录:`forwardRun` 做完就算做完;公开靠本轮采纳决定,信息账从预测和结果现算 |
| `adopt` | 本轮的采纳决定(`decision`,种类 `adopt`),没有过线者也写,`adopted` 为 null | | `adopt` | 本轮的采纳决定(`decision`,种类 `adopt`),没有过线者也写,`adopted` 为 null |
| `listCells` | 不写记录:采纳了而且被采纳改法有 2 个以上因子才走 ⑬–⑰,格从采纳决定和冻结协议现算;否则这几步什么都不写,直接到收尾(方法.md 4.3 ⑫) |
| `explanation` | 这一轮解释阶段的关闭记录(阶段编号 `r<轮>-explanation`);本轮没有消融时不开这个阶段 |
| `selectCells` | 本轮的选格决定(`decision`,种类 `cells`);没选中的格不另写事件,原因和"含它的最好组合"都在这条决定里 |
| `ablationImplementation`、`ablationVerification` | 每个选中的格都已结束这一段:交了"跑不起来",或最近一次核验通过,或重做次数用完、有"不跑"事件。阶段编号 `r<轮>-ablationImplementation-1`、`r<轮>-ablationVerification-1`、`-2`……第几次从账本数,不另存 |
| `ablationRun` | 每个通过核验的格,最近一次消融运行有结果,而且不是"没启动" |
| `settle` | 本轮的结算记录(`settlement`,按轮次唯一),以及同一事务里的押的因子决定(`decision`,种类 `bet`) |
| `wrapUp` | 收尾阶段的关闭记录,以及本轮选中的每个候选都有解封记录(`unseal`) |
| 一轮接一轮 | 每轮开头用 `runBalance` 从运行记录现算余额;余额为 0 不再开新轮 |
| `export` | 现在不做:走到这里停下,原因"导出还没写" |
| 按配置跳过的步骤 | 一条"按配置跳过"事件(`skippedByConfig`),写明步骤(第 r 轮的步骤写 `r<轮>-<步骤>`)和 config 给的原因 | | 按配置跳过的步骤 | 一条"按配置跳过"事件(`skippedByConfig`),写明步骤(第 r 轮的步骤写 `r<轮>-<步骤>`)和 config 给的原因 |
研究者阶段没开就开,名单是全部研究者(本轮名单就是冻结的配置);每个任务都有被收下的提交之后才关。 研究者阶段没开就开,名单是全部研究者(本轮名单就是冻结的配置);每个任务都有被收下的提交之后才关。
@@ -629,6 +638,10 @@ Jev 是一个判别器,和程序检查地位相同,不单独成一种记录
| 实现 | 每个入选候选一个实验员,从本批基线取工作目录,不同候选同时实现 | 候选 | | 实现 | 每个入选候选一个实验员,从本批基线取工作目录,不同候选同时实现 | 候选 |
| 核验 | 每个待核验候选一个核验员;首次核验本批全部,之后只核验刚修复的候选 | 候选 | | 核验 | 每个待核验候选一个核验员;首次核验本批全部,之后只核验刚修复的候选 | 候选 |
| 修复 | 只给核验不通过的候选,交原实验员,从上次提交的代码接着改 | 候选 | | 修复 | 只给核验不通过的候选,交原实验员,从上次提交的代码接着改 | 候选 |
| 解释 | 每位研究者一个任务 | 无 |
| 消融实现 | 每个选中的格一个实验员;第一次从被采纳的完整代码取工作目录,重做时从上一次交的这一格代码接着改;不同格同时实现 | 消融格 |
| 消融核验 | 每个交了代码的格一个核验员;首次核验全部,之后只核验刚重做的格 | 消融格 |
| 收尾 | 每位研究者一个任务 | 无 |
没做完的任务派不派,按这个任务最近一次调用怎么结束的来定(任务书 12 第 2.3 节;第 2 部分从"一个人"细到"一个人对一个对象",任务书 14 第 2.3 节)。认是哪个任务,看"模型调用开始"里存的材料带的对象。没有调用、被用户停下、出错(含"进程中断")都派;没交的,开发入口关着就停下(交不出合格提交按内部错误,方法.md 4.3 ②),开着就再派。能派的先全派。一次派发里有任务没交上(没交或出错),不再开新的会话,已经在跑的不打断,等这次派发的会话全部结束后停下。 没做完的任务派不派,按这个任务最近一次调用怎么结束的来定(任务书 12 第 2.3 节;第 2 部分从"一个人"细到"一个人对一个对象",任务书 14 第 2.3 节)。认是哪个任务,看"模型调用开始"里存的材料带的对象。没有调用、被用户停下、出错(含"进程中断")都派;没交的,开发入口关着就停下(交不出合格提交按内部错误,方法.md 4.3 ②),开着就再派。能派的先全派。一次派发里有任务没交上(没交或出错),不再开新的会话,已经在跑的不打断,等这次派发的会话全部结束后停下。
@@ -663,6 +676,17 @@ Jev 是一个判别器,和程序检查地位相同,不单独成一种记录
- 通过核验的候选用既有 `formalRun`,用途 `forward`;先登记占名额,确认启动才扣次,再独立判分记结果。**一批内一个接一个跑**,避免抢 CPU 改变按秒停下的程序成绩。没启动的处理同基线:本进程停下,下次启动起新编号。 - 通过核验的候选用既有 `formalRun`,用途 `forward`;先登记占名额,确认启动才扣次,再独立判分记结果。**一批内一个接一个跑**,避免抢 CPU 改变按秒停下的程序成绩。没启动的处理同基线:本进程停下,下次启动起新编号。
- 本批全部有结果或“不跑”事件后,用 rules 的 `adopt`(内部用 `adoptionLine`),只传有效实测分数、本批基线分数和任务的方向、ε、已知最好;写种类 `adopt` 的决定,即使 `adopted` 为 null 也写。materials 据此公开本轮正向运行。 - 本批全部有结果或“不跑”事件后,用 rules 的 `adopt`(内部用 `adoptionLine`),只传有效实测分数、本批基线分数和任务的方向、ε、已知最好;写种类 `adopt` 的决定,即使 `adopted` 为 null 也写。materials 据此公开本轮正向运行。
**消融、收尾与研究结束**(来源:任务书 17 第 2.2、2.3 节,方法.md 4.3 ⑬–⑱、4.4、第七部分):
- 采纳了而且被采纳改法有 2 个以上因子才走消融;否则 ⑬–⑰ 不写记录(从采纳决定和冻结协议算得出),直接到收尾。
- 选格:输入照 rules 的 `CellRuleInput` 拼,余额用 `runBalance` 从运行记录现算(选批同样用当时的余额),种子用 `decisionSeed` 版本 2(选批已用版本 1);规则取步骤清单里 `selectCells` 那一步的,调 `runCellRule`;写一条种类 `cells` 的决定。没选中的格不另写事件。
- 消融实现交了 `cannotRun`:`known.code` 传 null,这一格不核验、不运行、不扣次。实验员报了 `alsoOff` 时用 rules 的 `sharedSettings`:实际关掉的因子集合完全相同的格沿用第一格的结果,不重跑、不重复扣次。核验不通过退回原实验员重做,次数和正向同一个 `maxRepairs`;用完仍不通过用 `cellNotRunEvent` 写事件,结算记“证据不足”。
- 消融运行复用正向的同一个正式运行入口,用途 `ablation`、对象是格,一个接一个跑;恢复路径与正向相同,消融格的假设专用指标缺失一律只记缺失(方法.md 第五部分)。完整代码和基线的分数取本批已有结果,不重跑。
- 结算:选中的格全部有结果、“跑不起来”或“不跑”事件后,照 `SettleInput` 调 `settleAblation` 写结算记录,同一事务里用 `chooseBet` 写种类 `bet` 的决定。“消融中发现”在 `settleAblation` 的输出里,materials 的 `Board.baselineOf` 据此把那一格的代码当成下一轮的基线,flow 不另写采纳记录。
- 收尾阶段关闭之后,本轮选批选中的每个候选(跑过的、入选了没跑成的)在同一个事务里逐个写解封记录,取最后一版提案的封存;提前写会泄露(materials 把解封记录当作“已公开”)。
- 收尾做完后余额 ≥1 开下一轮;余额为 0 走到 `export` 停下,原因“导出还没写”。
- 检验时几份研究可以同时跑(任务书 17,用户 2026-10-04 同意),一份研究内的正式运行仍然一个接一个跑;同机并跑用每次运行的 CPU 时间与墙钟时间之比核对没有互相抢(任务书 16 的“启动区间互不重叠”要求只适用于那次检验)。
检验命令(`eval/`,真实运行,要 Docker;带 `*` 的会花模型或 Jev 的钱。输出都在仓库外 `/home/iomgaa/inforsi-eval/<日期-名字>/`,名字也当研究编号用,只能小写、不能重复): 检验命令(`eval/`,真实运行,要 Docker;带 `*` 的会花模型或 Jev 的钱。输出都在仓库外 `/home/iomgaa/inforsi-eval/<日期-名字>/`,名字也当研究编号用,只能小写、不能重复):
| 命令 | 用途 | | 命令 | 用途 |
@@ -695,3 +719,11 @@ Jev 是一个判别器,和程序检查地位相同,不单独成一种记录
总体程序验收入口的来源:任务书 16 第 3.1、3.3、五部分;检验缺陷修复 `de8e13b` 把逐份统计与三份总体验收分开,避免单份通过冒充总体通过。恢复证据同时读取 `container-events.jsonl` 和 `container-events-window.json`,核对杀前到结果落账的容器生命周期;仅凭恢复前快照不能证明恢复后没有重跑。 总体程序验收入口的来源:任务书 16 第 3.1、3.3、五部分;检验缺陷修复 `de8e13b` 把逐份统计与三份总体验收分开,避免单份通过冒充总体通过。恢复证据同时读取 `container-events.jsonl` 和 `container-events-window.json`,核对杀前到结果落账的容器生命周期;仅凭恢复前快照不能证明恢复后没有重跑。
三份研究须逐个启动,上一份结束并核查完再起下一份,同机不与别的研究并跑;进程起止见 `launches.jsonl`,机器观察见 `machine.jsonl`,杀进程前后见 `container-*.json`,扣次与后续结果见统计的 `kill`。快照只是观察证据,不声称追踪任意进程。结果放仓库外,不提交。独立审阅按候选分两步:先评实现忠实度,再给历史核验及其当时代码评误判和修复范围。路线分类、完整路线的实测减合并 q5、A–J 表由阅读后填写;复用 `eval/route/` 的导出、条目、思考、分位数核查及 Jev 四问,不另造问卷或判别器。参考项目五份账本用已有只读副本,保留无效数值和重复尝试,并注明参考提示词含题目做法。 三份研究须逐个启动,上一份结束并核查完再起下一份,同机不与别的研究并跑;进程起止见 `launches.jsonl`,机器观察见 `machine.jsonl`,杀进程前后见 `container-*.json`,扣次与后续结果见统计的 `kill`。快照只是观察证据,不声称追踪任意进程。结果放仓库外,不提交。独立审阅按候选分两步:先评实现忠实度,再给历史核验及其当时代码评误判和修复范围。路线分类、完整路线的实测减合并 q5、A–J 表由阅读后填写;复用 `eval/route/` 的导出、条目、思考、分位数核查及 Jev 四问,不另造问卷或判别器。参考项目五份账本用已有只读副本,保留无效数值和重复尝试,并注明参考提示词含题目做法。
任务书 17 新增检验命令(来源:任务书 17 第三、四部分;三份研究同时跑,不适用任务书 16 的“启动区间互不重叠”):
| 命令 | 用途 |
| --- | --- |
| `npm run eval:full:run -- <研究编号> <全新绝对输出目录> [--kill-after-first-ablation-start]` * | 配置照 `eval/round-zero/research.json` 只换编号;从头真实跑一份完整研究到余额用完、停在“导出还没写”;照任务书 16 惯例记 `launches.jsonl`、`machine.jsonl`、`timeline.jsonl`、`outcome.json`。带 kill 开关的,在第一个消融运行确认启动后、结果落账前杀控制进程,用恢复入口续跑到底,`kill-report.json` 写三条检查:同一容器接着等不重跑、只扣一次、结果照常写入且结算与后续走完 |
| `npm run eval:full:stats -- <全新绝对统计目录> <研究输出目录>...` | 每份研究出 stats.json/stats.txt:逐轮走向、程序账目十二项检查(阶段开关成对、扣次等于确认启动数、余额为 0、解释冻结早于首格启动、每轮最多一条结算、解封在收尾关闭之后且覆盖全部选中候选、跑不起来/不跑的格零扣次、第 2 轮起基线链、轻量检查计次、CPU/墙钟比等)、kill 三条检查;只算事实,不作质量判断 |
| `npm run eval:full:export -- <研究输出目录> <全新绝对审阅目录>` | 按轮导出提案、解释、选格决定、结算与押注、收尾(json+txt),每格一包(冻结协议、位置表、完整代码与格代码、diff、实现与核验往来及退回、调用材料),供全新上下文的子 Agent 评研究质量 |