# 工作记录 只记当前状态。一个阶段完成后压缩成几行,细节看提交说明。 ## 当前目标 搭好项目框架:CLAUDE.md、方法、结构都定下来以后,按模块从参考项目搬代码。 ## 已完成 - CLAUDE.md:按官方写法写成(提交 3861fd8 及之后)。 - `docs/方法.md`:由参考项目的研究方案 v3、设计-15、设计-16 合成(f32c0bd)。之后按用户决定改过:消融只测信息价值选中的格(5e4f8c2);保障的定义借用"控制变量"和"重构"来说明(141494f)。 - `docs/结构.md`:13 个模块加 vocab、步骤清单、账本记录种类、可替换点、检查规则、粗估规模(6cf9f0c)。 - 任务书 01(工具链 + vocab):npm 包、TypeScript、`node --test`、dependency-cruiser 规则全写,临时违规实测 14 条都报错;vocab 1030 行,`npm run check` 通过,`npm test` 24 条通过。结构.md 第八部分补了 vocab 对外内容。 - 任务书 02(rules):src/rules 13 个文件、1761 行,`npm test` 192 条通过。预期值来源有三个:方法.md 的手算例;`tests/fixtures/rules/` 下不看实现写的 Python 脚本(重跑后 JSON 逐字节相同);参考项目 calc15、calc14b 里与现行方法一致的部分。审阅做了两轮,每轮都换一个全新上下文的子 Agent。结构.md 第八部分补了 rules 对外内容。 - 任务书 03(ledger):src/ledger 5 个文件、584 行,`npm test` 226 条通过(ledger 34 条)。一张只追加的表,两条禁改禁删触发器,8 处唯一约束(阶段开、阶段关、运行登记、确认启动或确认没启动、运行结果、模型调用开始、结束、消融结算),写入时只查四种拒收,提案的作者自评拆成封存另存。按第一版写过可见性和通用唯一键,按新版全部清掉了。全新上下文的审阅做了三轮。结构.md 第八部分补了 ledger 对外内容。 - 任务书 04(config):src/config 4 个文件、453 行,`npm test` 246 条通过(config 19 条)。流程用联合类型(完整流程 / 朴素循环),规则名取自 rules 登记表,config 改为依赖 rules。ledger 顺手两处:结算按轮次唯一、笔记去掉版本号,表结构版本号升到 2,全新上下文审阅一轮无问题。结构.md 第八部分补了 config 对外内容。 - 任务书 05(tasks 与 runner):src/runner 2 个文件、271 行,src/tasks 6 个文件、691 行,`npm test` 274 条通过(runner 12 条、tasks 16 条,真实 Docker,整套约 12 秒)。任务目录搬到 `tasks/circle_packing/`,新增 task.json;`VERDICTS` 删掉"判不了"。基线从头到尾判为算数,分数 0.9597642169962064,两次逐位相同。全新上下文审阅两轮:第一轮发现候选能伪造计量结果(把超时记成正常退出)、运行目录里旧 metrics.json 会被当成本次产物,都已修(计量 shell 以容器内 root 跑、命令用 setpriv 降权、结果用 docker cp 取;harness 开跑前删旧输出);第二轮只审这次修复,另采纳一条:容器加 no-new-privileges,禁止候选靠 setuid 程序重新拿到 root。结构.md 第八部分补了 runner、tasks。 - 任务书 06(workspace):src/workspace 2 个文件、205 行,`npm test` 284 条通过(workspace 10 条,真实 git)。版本号是目录树编号,存版本自己列文件加 hash-object,取出用 ls-tree 加 cat-file(实测 `git archive` 会按树里的 `.gitattributes` 丢文件、改换行符),git 子进程另关掉系统和用户的 attributes 文件(实测只关配置时 `~/.config/git/attributes` 仍会被读)。tasks 的 task.json 加必填的 `unversionedNames`,`protectedFiles` 删掉 solution.json。全新上下文审阅一轮:两处偏离都实测成立;采纳一条(写明空文件增删、只改可执行位没有块),其余不改。结构.md 第八部分补了 workspace。 - 任务书 07(agents):src/agents 4 个文件、681 行(预期按用户决定改为 600–700,超出部分是任务书第四部分要保留的三处提交处理、读代码分段和会话核对,没有新增专门路径),`npm test` 293 条通过(agents 9 条,其中 1 条经真实 Pi 会话连本机假模型服务)。package.json 固定 `@earendil-works/pi-coding-agent`、`pi-ai` 0.85.1 并加 overrides(同参考项目);新增 `npm run test:pi`(真实 glm-5.3,研究者先退回再收下、实验员写文件跑 shell 再交)。实测:glm-5.3 经 iomgaa 服务时,正文里没转义的半角双引号会在服务那一侧把参数截成合法但半截的 JSON,Pi 收到的原文本身合法,JSON 检查查不出(抓包确认);提交工具说明里加了一句"引号用「」",之后 12 份提交没再出现。结构.md 第七、八部分已更新。 - 任务书 08(jev):src/jev 3 个文件、515 行,九问的问法和阈值照参考项目,只改说法和字段名,阈值注明未在新材料上校准;判重一对一次请求、冻结条款三问各一次、代码改动一块一次(五问同材料);`npm run test:jev` 三处各问一次真实 Jev,九问都拿回 0 到 1 的概率和请求编号。vocab 加 `JevJudgment`。ledger 表结构版本升到 3:`callEnded` 四种结局对上 agents、墙钟时间用 `Measured`(中断恢复时补写出错、原因"进程中断"、时间测不到);退回和提交记录都带 `jev`(判断数组或 null)。config 加必填的 `models.jev`。`npm test` 316 条通过。账本改动全新上下文审阅两轮。 - 任务书 09(materials):src/materials 12 个文件、1831 行(预期 1200–1800;超出部分主要是用户决定 2 新加的 shapes.ts 116 行,复审判定没有专门路径增多),vocab 加 `Checklist`(1105 行,上限 1150)。19 份提示词以参考项目为底稿只做必要改动搬进 `prompts/`;TASK.md 补了 `unversionedNames` 不存进版本。`npm test` 356 条通过(materials 39 条)。全新上下文审阅三轮(可见性一轮、规模与正确性一轮、修复复审一轮),materials 内部没有发现泄露;要靠 flow 写入时机保证的几条记进"未完成"的"给 flow"。 ## 关键决定(用户原话见各提交说明) - 项目改名 InfoRSI。参考项目 RivalBits 只读。 - "点"改称"因子","保障"保留。 - 不设轮数上限,只限运行次数。 - 第一次预测放在挑刺之前、看原始提案;第二次预测在冻结之后、看冻结协议。 - 子 Agent 调研时不写 md 文件,结论直接回报。 - 提交的字段定义放 vocab,submissions 只判收不收;vocab 只放两个函数(规范序列化、哈希)。用户原话:"我都同意"。 - vocab 上限改为 1100 行(多出来的主要是发给模型的字段说明)。用户原话:"同意 A,vocab 上限改为 1100 行。结构.md 由监督者改,你不用动。" - 每份预测只对一个候选、每份挑刺只针对一个目标;入口、因子、实现条款的编号由程序按位置分配;实现提交不设代码字段(程序从工作目录冻结);运行结果用"没启动 / 正常退出 / 超时 / 被取消"一个字段表示启动与结束;四种 token 数都可记测不到。用户原话:"3、4、5、6:同意保留你的写法。方法.md 第五部分的表(入口编号、实现的代码字段)由监督者改。" - 账本改为一张只追加的表,全部记录都不能改(ca2cd52)。用户原话:"同意全部只追加"。 - 谁能看什么归 materials(按任务定材料,第一条消息和查询工具是同一份材料的两种给法),ledger 只存;只在"只能一次"处加唯一约束;Jev 不单独成记录,记在它判断的那件事里(0b0cbb0)。用户原话:"给到派的材料有哪些"和"一开始灌进去还是主动等派去查"是分开的事情;Jev"本质只是一种可以代替程序的判别器"。 - 有自己编号、按定义只发生一次的记录加唯一约束,重复就报错;记录之间的前后顺序检查一律不加,flow 调 ledger 是模块之间的调用,不算边界(493ea6d)。这是监督者提的处理,用户回复"同意";CLAUDE.md"罕见情况怎么办"第 2 条随之写明边界。 - 整个系统不设默认值:配置每个字段必填,函数参数不写默认值,可以没有的值写 null(CLAUDE.md"不设默认值")。用户原话:"全部都不要默认值更好,甚至整个系统都不要默认值,因为默认值可能会掩盖错误"。 - 对照组(步骤开关、朴素循环)先不做,完整流程跑稳之后再按当时的方法补(方法.md 第十一部分)。用户原话:"先不做对照组,按你说的改"。 - config 里的朴素循环和四个步骤开关保留,不删;解释的每格三个数仍是可选,关掉消融时不交。flow、materials 先只实现完整流程全开。用户原话:"config 删掉朴素循环和四个步骤开关暂时没必要,因为后面会用到的"。 - 计算时间不再是预算,只记录;预算只有运行次数(42347e4)。用户原话:"CPU 秒不当预算但是要记录"。 - rules 的约定(方法.md 没写死的地方):入池 P < 0.5 严格;采纳和消融中发现都要严格大于采纳线;成本用 max(0, ĝ₀);没测的格附"含它的最好组合"的净值;战绩在分数原值上判;编号一律按自然序比较。用户原话:"1–8 都同意"。消融成分权重跟随 λ、分歧量不掺开放预留,由用户改进方法.md(a050771)。 - 三个数改为严格递增,去掉尖峰(bfb96ba)。用户原话:"凡是为'三个数相等''宽度为 0''开放预留缩成一个点'写的专门处理,全部删掉"。 - 答案路径、保障动手次数只记读到的原始内容或读不到的原因;在不在位置表里,由以后拿得到位置表的模块现算,不存。用户原话:"按'能现算的不存',tasks 只记读到的原始内容……对表由以后有位置表的模块现算,把这条记进 WORK_LOG。" - tasks 与 runner(任务书 05):依赖跟着任务走,一份研究不能自己改依赖,镜像在研究开始时建一次、编号冻结进账本;runner、tasks 行数按结构.md 第七部分;两个模块合成一份任务书。用户原话:"都同意,写任务书 05 吧"。监督者另定并告知用户:凡是执行任务代码的事(正式运行、判分、轻量检查)都在任务镜像里跑;资源用量在容器里读,不建要 root 清理的 cgroup 分组;容器断网;同一份研究所有运行用同一个种子;不做"取消"函数;`VERDICTS` 删掉"判不了"。 - workspace(任务书 06)用 git:一份研究一个裸仓库,版本号是目录树编号;存版本时自己列文件、用 hash-object 存,不用 `git add`(实测 `.gitignore` 会让它悄悄漏存);git 子进程不读用户配置;实验员目录里除了 task.json 的"不存"清单都算候选,符号链接等特殊文件退回实验员;预期 200–300 行。先派全新上下文子 Agent 独立分析过。用户原话:"都同意,写任务书 06 吧"。 - 实验员会话里的 shell 命令不测 CPU,只记每次模型调用的墙钟时间;正式运行的资源用量照记。用户原话:"那要不就不测了?本来cpu就不重要,现在又可能测不准"。 - agents(任务书 07):只收拼好的提示词和第一条消息(读提示词归 materials),不碰账本;提交工具去掉 slot;保留参考项目两处有真实证据的提交特殊处理(非法 JSON 被截半、null 变 "null")和子会话加载核对;删 Jev 审命令、上下文估算、输出上限配置;预期 400–600 行。用户原话:"同意,写任务书 07 吧"。 - jev(任务书 08):方法里三处 Jev 判别共九问(判重 1、冻结条款 3、实现改动 5),比原方法多出的"条款太含糊""算指标方式与定义不符""比登记的停止条件更早结束"三问已补进方法.md;这次不校准:问法以参考项目为基础只改说法,阈值暂用参考项目的值并注明未校准;账本存下每次 Jev 判断(退回、收下、判重都存);Jev 模型名进 config;不做"永远判不同"的空实现。用户原话:"九个都问,并把多出的三个补进 docs/方法.md";后来改为不校准:"我们到时候应该是通过真实的运行收集一批真实的数据,然后由claude或者gpt亲自打标签作为集合……jev这次的验收应该也不以效果为主,因为还没有数据校准,prompt还是用原本的prompt作为基础就好"。 - materials 与 submissions 一起设计、分两份任务书(09 materials 先、10 submissions 后):materials 对每个任务产出"给模型看的材料 + 对号清单 + 能读的代码版本",整份存进"模型调用开始"记录,submissions 只拿清单对号;谁能看什么每种任务一个函数,不写通用判定;提示词以参考项目为底稿只做必要改动;materials 预期 1200–1800 行,submissions 500–800 行。用户原话:"我建议submissions和materials一起做你觉得可以吗?"、"可以"、"都同意"。 - 中断的模型调用,恢复时补写"出错、原因'进程中断'、墙钟时间测不到"(`callEnded` 的墙钟时间用 `Measured`)。用户原话:"墙钟时间改用 Measured,恢复时写出错加测不到(原因'进程中断')"。 - materials(任务书 09)开工前用户定的四件事(2026-10-03,用户选了推荐项):vocab 上限改 1150,只放对号清单 `Checklist`,任务材料其余类型放 materials;冻结协议、位置表、判重合并输出、决定种类和编号规则由 materials 定义并导出,flow 照着写,ledger 不改;实验员、核验员不给信念本,方法.md 4.3 ① 改为"研究者任务";合并而成的候选按原提案挑刺。 - 核验不通过、修复次数用完时:正向候选不跑(不扣次数,记事件写明原因);消融格和正向一样可以退回实验员重做,次数用同一个修复上限,用完仍不通过这一格不跑、不扣次数、记"证据不足"(方法.md 4.3 ⑨ ⑯、6.6)。用户原话:"同意"。 ## 未完成 - 任务书 09 核对后要改的 materials,并入任务书 10 先做(监督者核对 446e262 时发现,用户同意): 1. 挑刺的"现在交什么"落进了研究者的通用一句"调用一次交上就完成了",和任务说明"可以交一份或几份"相反;给挑刺单写一句。 2. 退回记录加"对象"字段(同提交记录的 target);materials 按阶段、作者、种类、对象找上一次的退回,删掉按 `callId` 前缀定位的写法和"同一任务不并行"的要求。 3. 核验材料里删掉 Jev 预扫的概率和阈值:方法里没有这一项,能到核验说明 Jev 已判过没问题,再给核验员看等于把 Jev 当提示用。 4. 信念本选批历史补"合法化扣掉的分"(方法.md 6.10 第 3 条)。 5. 删掉"答案出自被关掉的因子,它本该关着"那句:方法里没有,也没有真实证据。 6. 消融核验不通过可以重做(用户 2026-10-03 定):重发消融实现时材料里带核验意见;一格不跑而记"证据不足"时,信念本不能再去读它的运行(现在的写法假定证据不足的格一定有运行),rules 里 `insufficient` 的注释跟着改。 7. 顺手改三处旧说法:`tasks/circle_packing/TASK.md`"保障写'无'时写 {}";`src/vocab/submissions.ts` 开头注释的 q₁ ≤ q₅ ≤ q₉;读代码工具的 `offset` 参数(提示词里已删)。 - 信念本"按因子归并"(方法.md 6.10 第 1 条"出现在哪些候选里"):现在是每个候选的每个因子一行,用"(延续 X)"连起来,没合成一行。等真实运行后再看要不要合。 - jev 判重材料加上每个因子的"关键设定"(现在只有名称和做法,而问题写着"设定不同就不算同一个改法"),并入下一份任务书。用户原话:"我同意加上"。 - Jev 校准:新项目跑出真实研究后,从账本取真实的 Jev 判断和材料,由 Claude 或 GPT 打标签作为校准集和留出集,重新校准九问的问法和阈值。不用参考项目 8 个验收数据库(材料格式还会变)。 - `inbox/调研.md`:要迁进 `docs/调研/` 的调研结论。 - `docs/方法.md` 里还有 7 条标〔自定〕的规则,待用户过目。 - 留给 submissions 的跨字段规则(vocab 字段定义不管): 1. q1 < q5 < q9(严格递增,方法.md 第五部分,提交 bfb96ba):作者自评、两次预测、解释的每一格。 2. 因子数不超过上限,回应改过的因子清单同样适用。 3. 同一提案里两个因子不能延续同一个因子;延续的编号要在信念本里看得到。 4. 保障短名不能是 `main`,不能写成 `p<数字>`,同一清单里不重复。 5. 开着消融时每条解释必须交 `cells`,并恰好覆盖材料列出的格;关掉消融时不交。 6. 解释最多 M 条。 7. 志愿至少 min(N, 入口总数) 个、不重复、编号都在入口清单里。 8. 挑刺针对的因子编号在被挑提案的因子范围内。 9. 回应的逐条答复恰好覆盖针对本候选的全部挑刺;统一的 `sources` 恰好覆盖被合并的原提案。 10. `reused` 引用的指标存在且是假设专用指标;新登记的指标短名不重复。 11. 实现和修复:位置表覆盖每个因子和每条保障;代码位置起始行不大于结束行。 12. 核验:条款、因子、保障逐项全覆盖;没有归属的改动与材料列出的逐条对应。 13. 消融实现:写了 `cannotRun` 时 `alsoOff` 为空;`alsoOff` 不含本格要关的因子,且都在因子清单里。 14. 消融核验覆盖每个因子。 - 核验提交 `body` 的字段说明要补一句:同一行同时出现在因子和保障里时,在说明里写一句提醒(方法.md 4.3 ⑨)。写 submissions 时一并改。 - 给 flow:同一轮里选批和选格都用随机规则时,传不同的"版本"算种子,否则两次抽取用同一串随机数。 - 给 flow:确认启动前要先登记运行;模型调用要先开始再结束;阶段要先开再关;ledger 都不查。 - 给 flow:步骤清单没有单列"轮末动作"(解封作者自评、入选未跑的候选出池),flow 要做这些。 - 写 plugin 时实测:源码导入路径带 `.ts` 扩展名,Pi 加载插件能否接受。 - 给 submissions:研究者登记的假设专用指标编号不能和常规辅助指标重名(`metricDefinitions` 里的 7 个),否则候选自报的值会顶替宿主测的值(任务书 05 审阅意见)。 - 给 flow:容器名要在本机所有研究之间唯一(例如带研究编号);`docker run` 因重名失败时 runner 按"启动了"处理。日志目录每次运行一个新的。 - 给 flow:取出时目标目录必须是空的,workspace 不查。 - 给 flow(materials 审阅):冻结协议只在回应阶段关闭后写进账本,阶段内给 Jev 查的协议只放内存;解封只在本轮收尾阶段关闭后写;阶段关闭只在名单上的人交齐后写。materials 把这几条记录的出现当作"已公开",提前写会泄露(审阅者在临时账本里实测过)。 - 给 flow:没采纳时也写一条采纳决定(adopted 为 null),本轮正向运行靠它公开;修复任务要在核验阶段关闭后再发。 - 给以后换任务镜像:镜像里必须有 `setpriv`(runner 用它把命令降到当前用户);容器里不要用 `python -I`,它会忽略 `PYTHON_CPU_COUNT`。 ## 工作方式(用户 2026-10-01 定) 每个模块分三步: 1. 参考项目的会话(监督者)先把这个模块讲给用户:放哪些东西、对外提供哪些函数、预期多少行、参考项目里对应的代码哪些保留哪些删掉。用户和监督者一起确定。 2. 监督者把确定的内容写成一份任务书,放在 `任务书/` 下,一个模块一份。 3. 用户在 InfoRSI 目录里另开一个新的 Agent 执行任务书;监督者只监督、核对,不直接写代码。 这样做有两个目的:一是检验 CLAUDE.md 和 docs 里的规则对一个全新的 Agent 是否真的起作用;二是让监督者和执行者的思路保持独立,方便发现跑偏。 ## 下一步 任务书 10(submissions,`任务书/10-submissions.md`,开头先改 materials 的 7 处)已写好,等用户另开新 Agent 执行;完成后监督者核对,再做 flow。