Report 0b68fa97 recomputes, but its verdict rests on 133 rows where
both Jev and Flash contradict gold=unclear. Product reviews those rows
plus 20 controls; recompute offline. Context variants gave no gain.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0199rbQDTsUbCVw84wc8BTFe
92 lines
7.9 KiB
Markdown
92 lines
7.9 KiB
Markdown
# TASK · Jev 意图 v2 修复单:gold 争议复核(2026-09-27)
|
||
|
||
- 类型:研究单修复(离线;**不需要再调任何模型 API**,全部从已提交 JSON 重算)
|
||
- 基线:`origin/codex/jev-intent-v2-20260927` @ `0b68fa97`(其上游 `origin/staging` @ `fdb7087b`)
|
||
- 执行分支:继续在 `codex/jev-intent-v2-20260927` 上提交;**验收前不推 staging**
|
||
- 原单:`TASK-rectification-jev-intent-classifier-research-v2-20260927.md`;报告 `docs/research/jev_intent_2026_09_27.md`
|
||
|
||
## 1. 验收结论(对照原单逐条)
|
||
|
||
| 项 | 结论 | 证据 |
|
||
| --- | --- | --- |
|
||
| T1 重抽来源 B(带上一轮) | **通过** | 715 条 / 有上一轮 634;`git ls-tree` 无原文;JSON `rows` 无任何用户文本字段 |
|
||
| T2 三变体 + 测试 | **通过** | `python3 -m unittest tests.test_jev_intent_research` 16 passed(staging 基线 15,任务书起点 11);V0 state 未动 |
|
||
| T3 跑数、`--from-report` 可重算 | **通过** | 本机 `--from-report` 重算 verdict=缺数据、intent 79.44%、n=715,与报告一致;md 无 diff |
|
||
| T3 结论归因 | **未通过** | 报告把「缺数据」归因于 B/C 同层差 > 10pp、把「过不了门」归因于 Jev 置信度——两者都建立在一批有争议的 gold 上,见 §2 |
|
||
| 红线 4(不得模型代标 gold) | **存疑** | `executor_read` 565 条由 coding agent 阅读写入;09-19 同样做法,但这次与两个独立模型的分歧达 133 条,不能再当人工真值用 |
|
||
| 交付纪律 | **提醒** | 首轮 `e3bd3930` 把 `scripts/**`、`tests/**` 直接推上 staging(触发门禁并部署,staging 现跑 `e3bd3930`,其后两笔纯文档)。原单写的是执行分支实现、验收后再进 staging。本修复单**验收前不推 staging** |
|
||
|
||
## 2. 事故实证(全部可由 `docs/research/jev_intent_2026_09_27.json` 的 `rows` 重算)
|
||
|
||
1. **gold=unclear 占比反常**:点选层 269 条里 gold=unclear **104 条(39%)**;采集层 336 里 52;无焦点 110 里 46。真人对着四个选项答题、四成「语义不清」,不合常理。
|
||
2. **两个独立模型一致反对 gold**:Jev V0 判错 147 条,其中 **135 条 Flash(线上生产提示)与 Jev 判成同一个标签**,且 133 条都是 `gold=unclear → 两模型=answer_current_focus`(点选 67 / 无焦点 40 / 采集 26)。
|
||
3. **门槛数完全由这批争议行决定**:Jev V0 高置信错误 86 条,**86/86** 是 `gold=unclear→answer` 且 Flash 同判;V2 链式 41 条里 40 条同模式。
|
||
4. **敏感性(把 133 条争议行按两模型一致标签计)**:
|
||
|
||
| 变体 | 报告 intent | 敏感性 intent | 报告高置信错误 | 敏感性高置信错误 |
|
||
| --- | ---: | ---: | ---: | ---: |
|
||
| Jev V0 | 79.4% | **98.0%** | 12.9% | **0.0%** |
|
||
| Jev V2 链式 | 75.9% | 93.1% | 8.0% | 0.1% |
|
||
| Flash V0 | 75.7% | 94.3% | — | — |
|
||
|
||
两种读法下结论相反:按执行方 gold,Jev 过不了门;按两模型一致标签,Jev V0 三项门槛全过。**没有人看过原文之前,两边都不能写。**
|
||
5. **与 gold 无关、可先落的发现**:无论哪种读法,V1/V2 都比 V0 差(无焦点层 gold=provide_new_evidence 被改判 answer 13–15 条;承接分中位 0.16、最大 0.86、≥0.9 为 0,沿用规则一次未触发)。Magpie 的喂法在我们的数据上没有收益——用户几乎不发「继续」这类纯承接句。
|
||
6. 延迟:Jev 中位 1178 ms vs Flash 705 ms,比 09-19 更慢。
|
||
|
||
## 3. 根因
|
||
|
||
标注者(coding agent)对「unclear」的口径与生产提示不一致:生产提示里「没有 / 记不清 / 用带年月的经历直接答」都是 `answer_current_focus`,只有「既没否定、也没说记不清、也没给带年月经历」才是 `unclear`。133 条争议行中两个模型都给出了合法 answer_class 且高置信,更像是标注把「答得短 / 答得偏」写成了 unclear。B/C 同层差 23.7 pp、38.8 pp 是同一根因的另一面:来源 C 的 gold 经过独立复核,来源 B 没有。
|
||
|
||
## 4. 决策记录
|
||
|
||
1. **gold 复核由产品本人做**(2026-09-27 产品拍板前先按此写;产品若改派,改这一行)。原因:执行方是模型,红线 4 下它的标注不能自证;09-19 的 157 条也是同一做法,只是当时没有第二个模型来暴露分歧。
|
||
2. 复核**只看争议行 + 对照行**,不重标全量:争议行 133(选择规则 `gold.intent=unclear ∧ jev_v0_1.intent=answer_current_focus ∧ flash_v0.intent=answer_current_focus`)全部,另从「三方一致」行分层随机抽 20 条做对照,防止复核者只顺着模型改。
|
||
3. 复核后**不再调 API**:所有变体原始输出已在 `rows`,改 gold 后 `--from-report` 重算即可,费用 0。
|
||
4. 门槛、变体、模型版本一律不变。
|
||
5. 原单「不接管、不影子双跑」维持;即使复核后 V0 过门,是否接入另开产品决策。
|
||
|
||
## 5. 硬红线
|
||
|
||
1. 复核表只落本机 `.cache/jev_intent/`(gitignore),**不进仓库**;报告只提交计数与两种读法的对照表。
|
||
2. 改 gold 只允许改被复核过的行;每行记 `gold_source = product_review`,原 `executor_read` 标签保留在 `gold_prev` 字段供审计。
|
||
3. 不得用规则、关键词、模型输出批量改 gold;「敏感性」那一列只能叫敏感性,不得写成结果。
|
||
4. 不改 `frontend/src/**`;不推 staging;不升 SDK。
|
||
5. `scripts/research/jev_intent_cache.py` 里的 `G:\Ferti\...` 硬路径改为只认 `JEV_INTENT_CACHE` 环境变量与仓库 `.cache/`(P3,顺手做,不单独立单)。
|
||
|
||
## 6. 任务分解
|
||
|
||
### F0 · 出复核表(执行方,本机)
|
||
|
||
- 新脚本或 `jev_intent_source_b_v2.py` 子命令:从本机 `source_b_v2.jsonl` + 报告 JSON 选出 133 争议行 + 20 对照行,写本机 markdown:`序号 | 层 | 当前题(含选项)| 上一轮助手句 | 用户这句 | 执行方 gold | Jev V0 | Flash V0 | 产品判定(留空)`。
|
||
- **验收**:表在 `.cache/jev_intent/review_2026_09_27.md`;`git status` 干净;行数 153;对照行随机种子写进 PROGRESS。
|
||
|
||
### F1 · 产品复核(产品本人)
|
||
|
||
- 只按生产提示口径填「产品判定」列:`answer_current_focus`(含 no / unsure / yes / weak_yes)、`provide_new_evidence`、`ask_about_result`、`stop_rectification`、`unclear`。
|
||
- **验收**:153 行全部有判定;对照 20 行里产品与执行方 gold 一致数写进报告(一致 < 16 则说明标注口径整体漂移,触发让步 1)。
|
||
|
||
### F2 · 回写与重算(执行方)
|
||
|
||
- 按 F1 改 gold(`gold_source=product_review`、保留 `gold_prev`),`--from-report` 重算全部表;报告新增「gold 复核」一节:争议行数、产品改判数(按层 × 原标签 × 新标签计数)、对照行一致率。
|
||
- 结论重写为三选一(过门 / 未过门 / 缺数据),并加一句「V1/V2 相对 V0 无收益,承接规则未触发」作为与 gold 无关的独立发现。
|
||
- **验收**:`--from-report` 输出与 md 一致;`unittest` ≥16;README 状态板与 PROGRESS 同步;BLOCKED.md 若无新阻塞不动。
|
||
|
||
## 7. 让步顺序
|
||
|
||
1. 对照 20 行产品与执行方一致 < 16 → 全量 715 条标注口径不可信,结论写 `blocked: 需重标全量`,不得用 133 行的复核结果外推。
|
||
2. 产品没时间复核 133 行 → 先复核点选层 67 行(争议最集中、最易判);报告只对点选层下结论,其余层写 `blocked`。
|
||
3. F0 脚本出不来 → 产品直接读 `source_b_v2.jsonl`,执行方把 133 行的 `turn_id` 列表写到本机文件(**不进仓库**)。
|
||
|
||
## 8. 开工前置命令
|
||
|
||
```bash
|
||
git fetch origin --prune
|
||
cd .worktrees/jev-intent-v2-20260927 && git checkout codex/jev-intent-v2-20260927 && git pull --ff-only
|
||
PYTHONPATH=. python3 -m unittest tests.test_jev_intent_research # 16 passed
|
||
python3 scripts/research/jev_intent_probe_v2.py --from-report # verdict=缺数据, intent 0.7944, n=715
|
||
```
|
||
|
||
## 9. BUG 编号起点
|
||
|
||
`docs/BUG_HISTORY.md` 最大号 **BUG-1059**,本单起 **BUG-1060**(只在研究脚本自身缺陷时使用)。
|