Files
InfoRSI/任务书/08-jev.md
T

12 KiB
Raw Blame History

任务书 08:jev(Jev 判别)

写 jev 模块:问 Jev 的问法和阈值。这次不做校准:问法以参考项目的为基础,阈值暂用参考项目的值;等新项目跑出真实研究、收集到真实数据后再校准(见第三部分)。顺带改账本几处、config 一处。

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

用户原话:"九个都问,并把多出的三个补进 docs/方法.md"。

2026-10-03 改动:用户后来决定这次不校准:"我们到时候应该是通过真实的运行收集一批真实的数据,然后由claude或者gpt亲自打标签作为集合……jev这次的验收应该也不以效果为主,因为还没有数据校准,prompt还是用原本的prompt作为基础就好"。第三部分及相关各处已按此改写。如果你已经开始转换样本或写校准脚本,停下,把这部分删掉。

开工前先读

  • CLAUDE.md:全部,尤其是"罕见情况怎么办""不设默认值""错误怎么处理"(外部错误有限次重试)、"Pi 与三个角色"里 Jev 那一条。
  • docs/结构.md:
    • 第二部分 jev、submissions 两行;
    • 第三部分:账本记录第 3 种(退回带 Jev 的原始概率和结论)、第 8 种(判重合并的输入带 Jev 的原始概率),以及"Jev 不单独成记录"那一段;
    • 第八部分:vocab、ledger、config、workspace 几节。
  • docs/方法.md:4.3 ③(判重)、⑥(冻结条款检查)、⑨(实现改动检查)。
  • WORK_LOG.md。
  • 参考项目(只读,不要改):
    • /home/iomgaa/Projects/RivalBits/research-wiki/参考-Jev使用指南.md:先通读。问法怎么写、材料怎么给、抖动怎么测、阈值怎么定,都以它为准;
    • /home/iomgaa/Projects/RivalBits/src/judge/:jev.ts、judge.ts、questions.ts、calibration.ts、types.ts;
    • /home/iomgaa/Projects/RivalBits/src/tasks/audit.ts 的传输层:只看怎么发请求、怎么带密钥;
    • /home/iomgaa/Projects/RivalBits/tests/calibration/:README.md,以及 dedup/、feasibility/、prescan/ 三组的样本、记录和脚本。

一、问哪些问题

方法里一共三处、九个问题(docs/方法.md 4.3,监督者已按用户的决定补齐):

哪一处 问题(概率高 = 有问题,或"是同一个") 参考项目里的名字
③ 判重:两条提案 是不是同一个改法 same_change
⑥ 冻结条款 改动了评测 changes_measurement
自相矛盾 self_contradictory
写得太含糊,没法照着实现 too_vague
⑨ 实验员的一段代码改动 用了不固定种子的随机数 unseeded_randomness
协议没登记就读时钟 reads_clock
算登记指标的方式与定义不符 touches_measurement
比协议登记的停止条件更早结束 early_exit
测不到的量写成 0 zero_for_unmeasured

参考项目另有"指标换说法""指标规格具体性"两处,方法里没有,不搬。

二、问法和材料

  • 问题措辞、判"是"和判"否"的说明与示例句,以参考项目 questions.ts 为起点,改成新项目的说法:
    • "点"改成"因子";
    • 协议、提案的字段按 vocab 现在的字段定义;
    • 改动的形状按 workspace 的比较结果。
  • 材料由 jev 从带类型的输入拼出来。jev 的函数收的是:两条提案的因子清单;一份冻结协议的条款;一段代码改动加协议。不收拼好的 JSON。材料里放什么、字段叫什么,只在 jev 一处定(结构.md 第一部分第 7 问)。
  • 示例句只有填圆一套。参考项目"填圆、C1 两套示例句、按任务覆盖阈值"的机制不搬。以后加第二个任务时再说。
  • 代码改动按参考项目,一段改动(一个差异块)一次请求,五问在同一份材料里。差异块的正文从 workspace 的比较结果里取,怎么切由你定。
  • 冻结条款三问、判重一问各自怎么分请求,照参考项目的做法。
  • 问法只做必要的改动:说法、字段名对上新项目。不为"可能更好"改写措辞,因为现在没有数据能判断改得好不好。

三、这次不校准

参考项目的阈值是在参考项目的手写样本和材料格式上定的。用户决定不在手写样本上重新校准,等新项目跑出真实研究以后,用真实数据校准:收集真实的 Jev 判断和它判断的材料,由 Claude 或 GPT 打标签,作为校准集和留出集。参考项目的 8 个验收数据库不用,因为它们的材料格式以后还会变。

所以这次:

  • 九问的阈值暂用参考项目 JEV_THRESHOLDS 里的值。代码里阈值旁边写一句:这是参考项目在它自己的材料上校准的值,没有在新项目的材料上校准过,等真实数据。
  • 不搬参考项目的校准样本,不写校准脚本。以后有了真实数据,按数据的样子再写。
  • 每次 Jev 判断的原始概率都要存进账本:退回时存在退回记录里,收下时存在提交记录里(第五部分),判重存在决定记录里。以后校准要用的就是这些数据。
  • 验收看接线对不对,不看判得准不准:用假 Jev 测逻辑,再用真实 Jev 每一处各问一次,确认请求发得出去、回答读得回来(第七部分)。

密钥:Jev 的密钥是环境变量 TYPESAFE_API_KEY,值在 /home/iomgaa/Projects/RivalBits/.env。跑真实 Jev 时用 set -a && . /home/iomgaa/Projects/RivalBits/.env && set +a 加载,不要打印,不要复制进新项目。

四、对外提供什么

经 src/jev/index.ts 导出,函数名由你定:

  1. 判重:两条提案,交回一条判断。
  2. 查冻结条款:一份冻结协议,交回三问各自的判断,以及"有没有问题"。
  3. 查一段代码改动:一段改动加协议,交回五问各自的判断,以及"有没有问题"。

每条判断都包含:

  • 问题名;
  • 问题全文的哈希:措辞、示例、阈值一起算,改了措辞就能从记录里看出来;
  • 阈值、原始概率、结论;
  • Jev 返回的请求编号。

这个类型放进 vocab,名字你定:jev 交出它,ledger 的记录里存它,两个模块互不引用(见第五部分)。

  • Jev 用哪个模型:作为参数传入,来自 config(见第五部分)。
  • 调不通:网络断开、超时、服务返回错误,在发请求那一处有限次重试(CLAUDE.md"错误怎么处理");仍然失败就报错停下,不能把"没判"当成"没问题"。重试次数和间隔写在代码里,写明理由。
  • Jev 回的内容读不懂:比如没有概率、概率不在 0 到 1 之间,这是外部服务的返回,属于系统边界,报错停下,带上请求编号。
  • 几对提案判完以后怎么合成几组:纯计算,以后归 rules,这次不写。参考项目的 dedup.ts 不搬。

五、顺带改 ledger、vocab、config

ledger(表结构变了,SCHEMA_VERSION 加 1):

  1. "模型调用结束"(callEnded)加一个墙钟时间字段,单位秒。结构.md 第三部分第 10 种和任务书 07 都要求 flow 把墙钟时间写进去(WORK_LOG"未完成"里那一条)。
  2. callEnded 的结束方式对上 agents 的四种结局:交了、没交(带原因)、出错(带原因)、被停下。现在只有 completed / failed 两种。
  3. "退回"(rejection)加一个字段,存这次退回用到的 Jev 判断。程序检查退回的,写 null。结构.md 第三部分第 3 种要求"退回理由含 Jev 的原始概率和结论",现在退回记录只有一段文字。
  4. "提交"(submission)也加同样的字段,存收下这份提交时 Jev 的判断;没用到 Jev 的写 null。只存退回的、不存放行的,以后就查不出"放行的里有多少擦着阈值过",也没有校准数据。用户同意这次就加。

第 1 条的墙钟时间用 vocab 的"测到 / 测不到"(Measured):控制进程被杀后,恢复时给旧调用补"结束",时间量不到,写出错加测不到(原因"进程中断")。用户同意。

判重合并是"决定"记录,它的输入本来就是 JSON,不用改。

这四处属于账本,写完派一个全新上下文的子 Agent 审阅(见第七部分)。

config:

  • 加"Jev 用哪个模型",属于用户配置,必填。配置对话以后照字段说明问。参考项目默认是 jev-latest,新项目不设默认值。
  • 密钥不进配置,照参考项目从环境变量读。

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

处理 内容
借鉴,只改说法和字段名 questions.ts 里判重、可行性、预扫三处的问法和示例句;JEV_THRESHOLDS 里这九问的阈值,暂用、注明未在新材料上校准
借鉴 jev.ts 读回答的做法;audit.ts 的发请求、带密钥
不搬 calibration.ts 和 tests/calibration/ 下全部样本:以后用真实数据校准时再写
删除 指标换说法、指标规格具体性两处的问法
删除 C1_JEV_EXAMPLES、thresholdOverrides、UNCALIBRATED_JEV_SITES:只有一个任务;未校准的说明写在阈值旁边
删除 dedup.ts:合成几组归 rules,以后再写
删除 httpAuditTransport 里 endpoint ?? AUDIT_ENDPOINT、fetchImpl ?? fetch 这类可选参数:不设默认值,也不为测试给产品代码加参数
删除 发请求前检查"正文里有没有密钥":密钥只从环境变量读进请求头,材料由 jev 自己从带类型的输入拼,没有路径会把它带进正文
不搬 结构.md 原来写的"永远判不同的空实现":对照组已推迟,测试要用假 Jev 时在测试里自己写(结构.md 第五部分已删掉这句)

七、测试与审阅

  • npm test,不花钱:

    • 用假 Jev 测:概率超过阈值判"是",不超过判"否";回答读不懂时报错;调不通时重试到上限再报错;
    • 问题哈希:改一个字,哈希就变;
    • 材料:给定带类型的输入,拼出的材料和预期一致;
    • ledger 的四处改动各有测试:墙钟时间测到、测不到都存得进、读得出;四种结束方式;退回和提交记录带 Jev 判断或 null;
    • config 少了 Jev 模型时报错。
  • 真实 Jev 接线测试:另起一个命令,例如 npm run test:jev,不放进 npm test。三处各问一次真实 Jev,用你随手写的简单材料:确认请求发得出去、九问都拿回 0 到 1 之间的概率、请求编号读得到。不判断概率对不对。

  • 审阅:ledger 的四处改动属于账本,写完派一个全新上下文的子 Agent 审阅一轮。告诉审阅者:

    • 每条意见先回答"不写会怎样";
    • 只防三类:没人操作也会发生的、模型正常工作时就会做的、出错后发现不了的;
    • 模块之间传错参数、有人用 shell 故意破坏,只列出不改。

    jev 本身按原型标准,不另审。

八、规模与文档

  • jev 预期 400–600 行。问题措辞和示例句会占一半左右。超过 600 行就停下来检查。
  • 完成后更新:
    • docs/结构.md 第八部分:补 jev 对外的函数和类型;ledger、vocab、config 几节按第五部分改;
    • WORK_LOG.md:在"已完成"补一条;删掉"未完成"里 callEnded 那一条。
  • 不新建 md 文件。

九、验收与报告

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

  1. 提交号,新增和修改的文件列表,每个文件的行数,jev 的总行数。
  2. npm run check、npm test 的完整输出。
  3. 九问的阈值和问法相对参考项目改了哪些字(逐问列出),以及 npm run test:jev 的实际输出:每问的概率和请求编号。
  4. 审阅意见逐条:内容、采纳或不采纳、理由。
  5. 你和这份任务书、结构.md、方法.md 不一致的地方,以及为什么。
  6. 规则不清楚的地方:读 CLAUDE.md、结构.md、方法.md、Jev 使用指南时,哪里让你犹豫、哪里两份文件说法不一致、哪里你是靠猜的。没有就写"没有"。没有真实证据的可能情况,在这里提一句就够,不写进 WORK_LOG。