Files

155 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 任务书 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。