From daacaab9e9d9e76be715b39ea0f7a0e24493f31a Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Wed, 16 Sep 2026 16:39:18 +0000 Subject: [PATCH] =?UTF-8?q?docs(tasks):=20BUG-912=20=E5=AE=9A=E4=B8=BA=20B?= =?UTF-8?q?UG-375=20=E5=A4=8D=E5=8F=91=EF=BC=9AD9=20=E9=A3=8E=E6=A0=BC?= =?UTF-8?q?=E9=A2=98=E5=80=9F=20D24=20=E5=AF=B9=E7=85=A7=E6=8E=A2=E9=92=88?= =?UTF-8?q?=EF=BC=8C=E9=94=99=E5=88=86=20+=20=E6=97=A0=E5=8D=A1=EF=BC=88P0?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01JUei7K13cYxLHE3Axe4A45 --- docs/tasks/README.md | 2 +- ...K-rectification-dead-d9-choice-20260916.md | 45 ++++++++++++++----- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/docs/tasks/README.md b/docs/tasks/README.md index d3b08b2c..11de66b9 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -102,7 +102,7 @@ | `TASK-rectification-exhausted-gate-exit-20260910.md` | `PROGRESS-rectification-exhausted-gate-exit-20260910.md` | 五领域全拒答 + 三件带月经历:门槛句后无载体、客户端误报「没有拿到下一个问题」并循环「接着问」(BUG-646);第三件被留作 holdout 导致永远没有选择题(BUG-647)。含产品建议:一次性开放追问 + 终态标记 + 穷尽后释放 holdout | 已被取代(并入采集重设计单) | — | | `TASK-rectification-collection-redesign-20260910.md` | `PROGRESS-rectification-collection-redesign-20260910.md` | 产品口径:用户先说、系统从已说的事锚定追问、不得用生日推年份、不得说「领域」、永远交付结果。无固定题数:收集问题池按信息价值排序问到训练门开;选择题问到收敛门开或增益见底;门关不出结果只出精确缺口句并保持开放;≥4 件才留 holdout;撤回 BUG-642 年份线索、BUG-646 单终态与「暂定采用」;Skill 10.0.23(BUG-646~648) | 待验收 | `dd8f35f7` | | `TASK-rectification-year-focus-overlay-20260916.md` | `PROGRESS-rectification-year-focus-overlay-20260916.md` | 真机:定向健康题选 A 后打字给年月,助手追问「是你本人做的吗」,追问句下面挂着录入卡(`set-focus` 同号覆盖年月焦点题干、`event_date_entry` 仍在,BUG-908);事件入账后年月焦点没关(BUG-909,回放定 resolve 还是计划层);答短句撞「本轮达到步骤上限」(BUG-910,host 前置接无年月短句,先 investigating);persisted 问题块无 `--assistant-content-inset`(BUG-911)。**产品追加拍板:「哪一类事 + 发生年月」录入卡整个删掉,年月阶段直接打字(推翻 precision-gate 单 T3 与 SKILL.md:84)**。主体默认本人不追问,Skill 10.0.29 | 待验收 | `codex/rectification-year-focus-overlay-20260916` | -| `TASK-rectification-dead-d9-choice-20260916.md` | `PROGRESS-rectification-dead-d9-choice-20260916.md` | 真机(6aabbe38):删卡流程已通,但正文念出的 D9 判别题落库后 GET 投影为 null(`projectRectificationChoiceCard` 对 `distinguish_candidates` 只信重跑计划,不从落库副本投影,BUG-912);打字答「没有」后平局直接出交付卡待回放定性(BUG-913);`NAKSHATRA_TRAITS` 整对塞进一个 option,卡头把相反两极列成共同点(BUG-914)。**串行在 year-focus-overlay 验收之后** | 待领取 | — | +| `TASK-rectification-dead-d9-choice-20260916.md` | `PROGRESS-rectification-dead-d9-choice-20260916.md` | 真机(6aabbe38):删卡流程已通,但**P0** D9 感情题没有自己的探针,`stampChoiceSchemaWithProbe` 退到最高增益探针,盖上了 **D24 学业六星座对照探针**(BUG-375 (1) 复发):答「没有」按 D24 计分,04:48–04:59 收窄不可信;GET 投影又匹配不上 → 无卡(BUG-912);打字答「没有」后平局直接出交付卡待回放定性(BUG-913);`NAKSHATRA_TRAITS` 整对塞进一个 option,卡头把相反两极列成共同点(BUG-914)。**串行在 year-focus-overlay 验收之后** | 待领取 | — | ### 聊天主链路与首页 diff --git a/docs/tasks/TASK-rectification-dead-d9-choice-20260916.md b/docs/tasks/TASK-rectification-dead-d9-choice-20260916.md index 6d1b0471..ae305493 100644 --- a/docs/tasks/TASK-rectification-dead-d9-choice-20260916.md +++ b/docs/tasks/TASK-rectification-dead-d9-choice-20260916.md @@ -1,4 +1,4 @@ -# 任务书 · 感情判别题落了库却出不了卡、答完直接出交付卡、卡头把一对相反性格列成共同点(2026-09-16) +# 任务书 · 感情判别题被盖上学业分盘探针(错分 + 无卡,BUG-375 复发)、答完直接出交付卡、卡头把一对相反性格列成共同点(2026-09-16) ## 0. 基线 @@ -19,12 +19,26 @@ ## 2. 代码定位与根因 -### F1 判别题落库后 GET 投影不出卡(BUG-912) +### F1 感情判别题被盖上学业分盘的探针:答案计错分 + GET 出不了卡(BUG-912,**复发自 BUG-375 (1)**,P0) -- `frontend/src/lib/rectification-agentic/v9/method-followup.ts:3204-3350` `projectRectificationChoiceCard`:对 `distinguish_candidates` 焦点,卡片不是从落库的 schema 投影,而是**重跑 `buildMethodFollowupPlan`**,要求 `plan.next_followup` 有 `choice_frame` 且与焦点在 `intent` / `semantic_key` / `candidate_split_hash` / `question_id` 上一致(`:3316-3333`),任一不合即 `return null`。只有 `reverse_verify` / `out_of_sample_check`(`persistedVerifyCard`)和定向补事(`persistedTargetedCard`)走「从落库副本投影」。 -- 事发轮的顺序是 batch 写入健康事件 → 自动重算 → 模型 set-focus 落 D9 判别题。落库时计划给的是 D9 题;GET 时用重算后的账本再跑一遍计划,`d9.candidates_differ`、探针、`candidate_split_hash` 或阶段任一变化,D9 题就从 `next_followup` 掉队 → 卡为 null → 前端 `interviewChoiceCardUnavailable`(`rectification-surface-state.ts:384`,`kind=choice` 无卡)→ `deadChoice` → 「没有拿到下一个问题」。 -- 同族:BUG-578(比较失败被吞、过期快照)、BUG-582(无框区分题)、BUG-674(判别题落不了库却进正文)。本单是第四个入口:**落得了库、投影不出来**。 -- 执行方要用回放坐实是哪个条件返回 null(写进进度记录),但修法不依赖它。 +产品负责人补抓的快照(已脱敏): + +```json +"current_question": { + "question_id": "d9_relationship:relationship_style:score", + "probe_id": "contrast:varga.d24.白羊座|金牛座|双子座|巨蟹座|狮子座|处女座", + "prompt": "2020 年前后,你感情上有没有开始过一段认真的关系?", + "kind": "choice", "intent": "distinguish_candidates", "domain": "relationship" +}, +"choice_card": null, +"next_user_action": { "id": "ask_method_followup", "user_meaning": "关系盘仍会换升。按探针年份问感情这条线的前事…本题绑定 D9…" } +``` + +- 题是 D9 感情题,盖的探针却是 **D24(学业分盘)六星座对照探针**。链路:`method-followup.ts:2929-2945` 由 `varga_observation`(`d9.candidates_differ`)生成 D9 followup,**没有自己的 `semantic_key` / 探针**;`server-focus.ts:133-141` `expectedAnswerSchemaFor` 把它交给 `stampChoiceSchemaWithProbe`,`inference-adapter.ts:553` 在没有 preferred key 时退到 `selectHighestGainProbe(state.probes…)`——拿引擎里增益最高的任意探针盖上去,这次是 D24 对照探针。`:149` 又规定计分题没有探针就不落库,所以这道题**只能**借探针才存得下来。 +- BUG-375 (1) 原话:「`stampChoiceSchemaWithProbe` 用引擎最高增益探针盖 schema,把对比探针换成已答教育题」。当时修的是对比探针改用自己的 `semantic_key`,**没有堵住「无探针的分盘风格题借最高增益探针」这条**,本次是同一根因换了入口。 +- 后果一(计分错):用户打字答「没有」,`applyChoiceWithoutEvidence` 按 schema 上的探针计分,即按 **D24 六星座的 `expected_outcomes`** 更新后验;正文「已记录,范围收到 04:48–04:59」就是这次错分的产物。**该 Case 现在的区间与三列卡不可信**,任务书 §8 让产品知悉。 +- 后果二(无卡):GET `projectRectificationChoiceCard`(`method-followup.ts:3308-3333`)重跑计划得到的 D9 followup 仍无 `semantic_key`/`split_hash`,走到 `focus.questionId !== frame.question_id` 这一条(落库 id 带 `:score`,frame 的 id 由 `stableFollowupQuestionId` 生成)→ `null` → 前端 `deadChoice` →「没有拿到下一个问题」。执行方用回放确认是这一条还是 `mergeChoiceCard` 内部。 +- 同族:BUG-375(原发)、BUG-578、BUG-582、BUG-674。 ### F2 打字答「没有」直接出交付卡(BUG-913,先 `investigating`) @@ -43,7 +57,8 @@ ## 3. 决策记录 - 产品负责人 2026-09-16:正文里念出来的题必须有可点的卡;候选列与卡头的性格描述不得自相矛盾。 -- F1 修法定为「判别题以落库副本为准」:GET 投影 `distinguish_candidates` 焦点时,若 schema 带完整 A–D 副本与 `probe_id`,直接从副本投影(与 `persistedVerifyCard` 同形),计划重跑只用来判断**是否已过期**;过期则不是静默,而是把焦点标 `superseded` 并落下一问(有题)或转交付(无题)。不推翻 BUG-559 的 split-hash 过期判定,只改过期后的去向。 +- F1 修法定为两条:**风格题不得借别的分盘的探针**(宁可不落库也不错分);判别题以落库副本投影,过期不静默而是 `superseded` + 落下一问。不推翻 BUG-559 的 split-hash 过期判定,只改过期后的去向。 +- 事发 Case 的 04:48–04:59 收窄是错分产物;本单不做数据回滚(用户可用「更像这个」之外的路径继续补经历重算),但 CHANGELOG 要写明「2026-09-16 前分盘风格题答案可能计错分」。 - F2 结论由回放决定,不预设。 - 不改 Skill、不改出卡门槛、不动 BUG-751 的闸。 @@ -56,11 +71,16 @@ ## 5. 任务分解 -### T1 判别题从落库副本投影,过期不静默(BUG-912) +### T1 分盘风格题不得借探针;从落库副本投影(BUG-912) -- `projectRectificationChoiceCard`:在 `persistedTargetedCard` 之后加 `persistedDistinguishCard`:焦点 `intent=distinguish_candidates` 且 `parseAgentChoiceCopy(schema)` 非空且 `probe_id` 存在 → 直接投影,`question_id` 用焦点的。 -- 过期处理:计划重跑判定该焦点已过期(split-hash 不同或 `semantic_key` 不同)时,由**服务端**(GET 快照路径或下一轮开头)把焦点 `superseded`,并按 `persistNextInterviewIfIdle` 落下一问;不得留下 `kind=choice` 无卡的快照。 -- 验收:回放测试——落 D9 判别题焦点 → 改账本触发重算使计划不再给 D9 → GET 快照 `choice_card` 非空且 `question_id` 与 `current_question` 一致;或焦点变 `superseded` 且新 `current_question` 有卡。两条路径各一条测试。`rectification-surface-state.test.ts` 的 `interviewChoiceCardUnavailable` 断言不动。 +- **T1a 堵借探针**:`stampChoiceSchemaWithProbe` 在 `preferred` 无 `semantic_key` 时**不得**退到 `selectHighestGainProbe`;无探针即返回未盖戳 schema。`expectedAnswerSchemaFor:149` 的「计分题无探针则 null」保留,于是 D9/D10 风格题要么自带探针要么不落库(落不了库走 BUG-674 的 `persistExhaustionCollect`,不进正文)。 +- **T1b 给风格题自己的探针**:`varga_observation` / `precision_stage` 生成 `d9_relationship` / `d10_career` 等 `distinguish_candidates` followup 时,按 BUG-375 对比探针的做法建自己的探针:`semantic_key = :`,`supports/conflicts` 是**剩余候选分钟**按该分盘上升星座分组,`expected_outcomes` 与 `choice_frame` 的 A/B/C/D 一一对应;`candidate_split_hash` 按现有规则算。这样答案按 D9 计分,GET 投影也有 key 可匹配。 +- **T1c 从落库副本投影**:`projectRectificationChoiceCard` 在 `persistedTargetedCard` 后加 `persistedDistinguishCard`:焦点 `intent=distinguish_candidates`、`parseAgentChoiceCopy(schema)` 非空、`probe_id` 存在且该探针仍在当前 `inference_state`(未过期)→ 直接投影,`question_id` 用焦点的。过期(split-hash 不同)时由服务端把焦点 `superseded` 并按 `persistNextInterviewIfIdle` 落下一问,不得留下 `kind=choice` 无卡的快照。 +- 验收: + - 回放事发形状:D9 `candidates_differ`、inference_state 里只有 D24 对照探针 → 修前 schema `probe_id` 以 `contrast:varga.d24` 开头;修后 `probe_id`/`semantic_key` 为 D9 自有,`supports` 为候选分钟;答 B/「没有」后后验只按 D9 分组变化,D24 探针的 `answered_probes` 不含它。 + - GET 快照 `choice_card.question_id === current_question.question_id`,且 `interviewChoiceCardUnavailable` 为 false。 + - 过期路径:改账本重算使探针失效 → 焦点 `superseded` + 新 `current_question` 有卡。 + - BUG-375 的 `rectification-server-focus` / `rectification-choice-card` / `rectification-inference-machine` 原断言绿;BUG-375 条目补「2026-09-16 复发(BUG-912):无探针的分盘风格题借最高增益探针」。 ### T2 「没有」后直接出卡的回放定性(BUG-913) @@ -96,5 +116,6 @@ grep -o "BUG-[0-9]\+" ../docs/BUG_HISTORY.md | sort -t- -k2 -n | tail -1 ## 8. 环境缺口 -- 事发 Case 的完整快照 JSON(`current_question`、`choice_card`、`latest_result.decision_receipt.method_followup_plan`)产品负责人若能补抓,贴进进度记录可省掉 T1 回放的猜测;抓不到不阻塞。 +- 事发快照的 `current_question` / `choice_card` / `next_user_action` 已由产品负责人补抓并写进 §2 F1;`method_followup_plan` 不在公开快照里,不需要再抓。 +- **产品知悉**:该 Case 当前显示的 04:48–04:59 与三列卡建立在错分的答案上,不要采用;修复部署后补一件带年月的事触发重算,或新开 Case。 - 真机:正文里出现「有没有…」判别题时下面必有 A/B/C/D;交付卡每列性格只有一句、卡头共同点不自相矛盾。