Files
Jyotisha/docs/tasks/TASK-rectification-jev-intent-classifier-research-v2-fix-20260927.md
T
Jesse_ChenandClaude Fable 5.1 f364afab32 docs(tasks): Jev intent v2 acceptance — gold dispute fix brief
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
2026-09-27 13:17:19 +08:00

7.9 KiB
Raw Blame History

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. 开工前置命令

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(只在研究脚本自身缺陷时使用)。