docs(tasks): 感情判别题落库无卡 + 平局直接出卡 + 卡头相反两极任务书(BUG-912~914)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JUei7K13cYxLHE3Axe4A45
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
6aabbe386f
commit
2837cd3034
@@ -102,6 +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 验收之后** | 待领取 | — |
|
||||
|
||||
### 聊天主链路与首页
|
||||
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
# 任务书 · 感情判别题落了库却出不了卡、答完直接出交付卡、卡头把一对相反性格列成共同点(2026-09-16)
|
||||
|
||||
## 0. 基线
|
||||
|
||||
- 基线 commit:`6aabbe38`(`origin/staging` head,staging 已部署同一 SHA;它是 `TASK-rectification-year-focus-overlay-20260916.md` 的实现,**尚未验收**)。
|
||||
- 分支:`codex/rectification-dead-d9-choice-20260916`,基于 `origin/staging`。
|
||||
- 串行:在 year-focus-overlay 验收之后;若验收出修复单,本单排在修复单之后。与 `TASK-console-noise-20260916.md` 无交集。
|
||||
- BUG 段:**BUG-912 起**(基线最大 BUG-911,开工时再核)。
|
||||
- 范围:TS 计划层 / 投影层 + Python `refinement_packet.py` 一处;不动 Skill。
|
||||
|
||||
## 1. 事故实证(产品负责人 2026-09-16 staging 真机,模型 deepseek-v4-flash)
|
||||
|
||||
删卡后的流程本身已通:健康题选 A →「大概哪年几月?」→ 打字给年月 →「记下了:YYYY-MM 做过手术。」没有追问主体。接下来出的问题在这里:
|
||||
|
||||
1. 同一条助手消息正文接着写了判别题:「2020 年前后,你感情上有没有开始过一段认真的关系?」——**正文里有题,下面没有 A/B/C/D**。消息之后是只读范围行「目前范围 04:48–05:07,再说一件带年月的事就能继续」,再往下是「没有拿到下一个问题。」和「接着问」按钮。
|
||||
2. 当时快照(用户从接口抓的):`interview.session_outcome=collect_evidence`、`precision_stage=collect_events`、`stop_reason=null`、`precision_gate_met=false`、`collection_progress={scoreable:5,minimum:3,missing:0}`、`current_question.question_id="d9_relationship:relationship_style:score"`。即:**焦点落库了**,前端拿不到卡。
|
||||
3. 用户在输入框打字答「没有」。助手:「已记录,范围收到 04:48–04:59。……现在还剩 04:48–04:59 里 3 个候选。这几个候选按现有信息分不开。」随后直接出三列交付卡(04:59 44% / 04:53 35% / 04:51 21%,均「6 件经历里 6 件对得上」)。
|
||||
4. 交付卡头部三行「共同点」:「三个时间的事业盘都在巨蟹座:做事以照顾人为主,在意团队里的感受」「希望两边都能说得过去」「必要时会直接选边」——后两行是**同一对相反描述的两极**,被当成三个候选共有的性格写在一起。
|
||||
|
||||
## 2. 代码定位与根因
|
||||
|
||||
### F1 判别题落库后 GET 投影不出卡(BUG-912)
|
||||
|
||||
- `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(写进进度记录),但修法不依赖它。
|
||||
|
||||
### F2 打字答「没有」直接出交付卡(BUG-913,先 `investigating`)
|
||||
|
||||
- 「没有」被当作 D9 判别题的否定答案入账(正文「已记录,范围收到 04:48–04:59」),范围收窄、3 候选平局 → `tied_first` → 交付卡。平局出卡本身是 BUG-689 的设计出口。要核的是两件事:
|
||||
- BUG-751「线没问完不出卡」:此时是否还有未问的线(引导窗口题、跳过线重问、未覆盖领域)。快照 `missing:0`,但 `precision_gate_met=false`。
|
||||
- BUG-685~688「平局先问参考题再出卡」:三候选 D9 两蝎一秤、D10 同巨蟹,风格题是否可渲染;若可渲染而没问,是 hold 逻辑没触发。
|
||||
- 用回放定性:设计如此就写成 `investigating → closed_by_design` 并在进度记录说明;是缺陷就修。
|
||||
|
||||
### F3 交付卡把一对相反描述都列成共同点(BUG-914)
|
||||
|
||||
- `scripts/rectification/refinement_packet.py:26-55` `NAKSHATRA_TRAITS` 每行是一对**相反**的日常描述(如「希望两边都能说得过去」/「必要时会直接选边」);`:534-548` 把 `NAKSHATRA_TRAITS[earlier_index]` **整对**塞进 `options[0].traits`,`[later_index]` 整对塞进 `options[1].traits`。于是一个候选列的性格行里同时出现一对矛盾句。
|
||||
- `frontend/src/lib/rectification-agentic/v9/divergence-panel.ts:231-237` `nakshatraTraitsForTime`:代表时间与早于代表的候选拿 `earlier` 那对,晚于代表的拿 `later`。事发卡代表分钟是排第一的 04:59,三列都 ≤ 代表 → 三列同一对 → `splitSharedTraits` 把两极都判成「共同点」抬到卡头。
|
||||
- 同一张表还被 `inference-adapter.ts:134-182` 用来出风格参考题的 A/B 选项标签(`optionLabel("A", optionA.traits)`),A 选项标签也是「两极合一」。
|
||||
- 修法(产品口径:一列只写一句、不得自相矛盾):`refinement_packet.py` 每个 option 只取该 nakshatra 的**第一极**作 `traits`(`[earlier[0]]` / `[later[0]]`),`user_meaning` 同步改;前端不改结构。golden 若含 `traits` 两句需按 BUG-733 口径只追加/替换这一处并贴 diff。
|
||||
|
||||
## 3. 决策记录
|
||||
|
||||
- 产品负责人 2026-09-16:正文里念出来的题必须有可点的卡;候选列与卡头的性格描述不得自相矛盾。
|
||||
- F1 修法定为「判别题以落库副本为准」:GET 投影 `distinguish_candidates` 焦点时,若 schema 带完整 A–D 副本与 `probe_id`,直接从副本投影(与 `persistedVerifyCard` 同形),计划重跑只用来判断**是否已过期**;过期则不是静默,而是把焦点标 `superseded` 并落下一问(有题)或转交付(无题)。不推翻 BUG-559 的 split-hash 过期判定,只改过期后的去向。
|
||||
- F2 结论由回放决定,不预设。
|
||||
- 不改 Skill、不改出卡门槛、不动 BUG-751 的闸。
|
||||
|
||||
## 4. 硬红线
|
||||
|
||||
1. BUG-674「判别题落不了库不得写进正文」、BUG-582「无框区分题不得退化成采集句」、BUG-559/578 的过期判定原样保留。
|
||||
2. 前端 `persisted_question` 块不得为绕过投影而自己拼卡(BUG-673 防复发)。
|
||||
3. `page.tsx` 不增长;Python 改动跑 `tests/test_rectification_*.py` 全量与快速门。
|
||||
4. 既有断言只因形状变化更新,写「原值 / 新值 / 原因」。
|
||||
|
||||
## 5. 任务分解
|
||||
|
||||
### 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` 断言不动。
|
||||
|
||||
### T2 「没有」后直接出卡的回放定性(BUG-913)
|
||||
|
||||
- 用事发快照形状(5 可评分事件、3 候选、D9 两蝎一秤、D10 同巨蟹、`precision_gate_met=false`)回放:答 D9 否定后 `decideFromDossier` 的 `nextAction` / `stopReason`;列出此时 `buildMethodFollowupPlan` 是否还有未问的线;`shouldHoldForTieBreak` 是否为真及为何没 hold。
|
||||
- 结论三选一写进 BUG-913:设计如此(关闭)/ BUG-751 复发(修)/ BUG-688 复发(修)。复发则关联原号。
|
||||
|
||||
### T3 性格描述一列一句(BUG-914)
|
||||
|
||||
- `refinement_packet.py` 每个 option 只取第一极;`user_meaning` 改为「A:{earlier[0]}。B:{later[0]}。」;`tests/test_rectification_refinement*.py` 补断言:`options[*].traits` 长度为 1 且两 option 不同句。
|
||||
- 前端 `splitSharedTraits` 不改;补一条断言:同一对里的两极不得同时出现在 `shared_traits`。
|
||||
- 验收:Python 定向 + 快速门;前端相关测试绿。
|
||||
|
||||
### T4 记录
|
||||
|
||||
- BUG-912~914;CHANGELOG(正文念出的题必有卡;性格描述不再自相矛盾);`PROGRESS-rectification-dead-d9-choice-20260916.md`;真机清单 `docs/testing/rectification-dead-d9-choice-20260916.md`。
|
||||
|
||||
## 6. 让步顺序
|
||||
|
||||
1. T1 的「过期即 superseded + 落下一问」若与 `persistNextInterviewIfIdle` 的幂等早退打架,先只做「从副本投影」,过期仍显示旧卡但可答(答案按当前账本计分),进度记录写明。
|
||||
2. T3 若 golden 牵连过多,先只改 `user_meaning` 与前端去重,Python `traits` 拆分作第二提交。
|
||||
3. T2、T4 不可让步。
|
||||
|
||||
## 7. 开工前置命令
|
||||
|
||||
```bash
|
||||
git fetch origin --prune
|
||||
git worktree add -b codex/rectification-dead-d9-choice-20260916 .worktrees/rectification-dead-d9-choice-20260916 origin/staging
|
||||
cd .worktrees/rectification-dead-d9-choice-20260916
|
||||
.venv/bin/python -m pytest tests/test_rectification_refinement_packet.py -q 2>&1 | tail -3 # 若文件名不同用 ls tests | grep refinement
|
||||
cd frontend && ./node_modules/.bin/tsc --noEmit && npm run lint && npm test 2>&1 | tail -20
|
||||
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 回放的猜测;抓不到不阻塞。
|
||||
- 真机:正文里出现「有没有…」判别题时下面必有 A/B/C/D;交付卡每列性格只有一句、卡头共同点不自相矛盾。
|
||||
Reference in New Issue
Block a user