两轮研究定论:候选并列靠调打分拉不开,唯一有效手段是用户再给带年月的经历。 但七条固定采集线问完后,卡上只说「能问的都问完了」(BUG-687 引入),用户读完 就走——而交付后 case 仍是 candidate_ready,补经历本来就会重算收窄。产品拍板: 交付卡照出,卡上换成不限领域的补充邀请并举七条线之外的例子;不采用「并列时 先不出卡」(接近 BUG-646 禁止的门关不出结果)。补完必须可见生效,有行为测试守。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0155nFCgCHtoA7jhSDGmZmMu
7.0 KiB
7.0 KiB
TASK · 并列时不说「问完了」,改成请用户补一件带年月的经历 — 2026-09-14
- 基线:
origin/staging@a643452b(代码最新963c147c,staging 已部署该 SHA)。 - 分支:
codex/rectification-open-collect-invite-20260914,worktree.worktrees/rectification-open-collect-invite-20260914。 - 关联:BUG-687(引入「能问的都问完了」这句收口文案)、BUG-646/651/653(门关不出结果是禁止的、必须有出口)、BUG-590、BUG-688。研究背景见
docs/research/rectification_minute_resolution_closure_2026_09_14.md。 - 串行:改
user-copy.ts、collection-question-pool.ts文案层与rectification-range-delivery.tsx卡片一处;与在途分支无重叠。
1. 问题
两轮离线研究(定论页见上)证明:候选并列靠调打分尺度拉不开,目前唯一被证明有效的信息源是用户再给一件带年月的经历。
但产品现在的表现正好相反:
- 定向补事只覆盖固定七条线(结婚 / 收入 / 搬家 / 家人 / 学业 / 健康 / 职业)。用户答「没有发生过」就关闭该线,七条关完后,
rangeNarrowHint(collection-question-pool.ts:845-849)输出 「能问的都问完了」(RECTIFICATION_USER_COPY.rangeDeliveryCollectClosed,user-copy.ts:152,BUG-687 引入)。 - 这句是终局口吻。用户读完就走了,而他其实完全可能有第八类经历——换专业、出国、打官司、创业、重病、亲人离世、搬迁工作城市……系统从来没请他说过。
- 真机实证:用户对结婚 / 收入 / 家人三条都答「没有 / 跳过」,只答了搬家,随即出卡 26% / 26% / 20%,然后被告知"问完了"。
能力其实已经在了:交付后 case 状态是 candidate_ready,属于 RESUMABLE_CASE_STATUSES(v9/case-status.ts:26),输入框不禁用;此时用户补一件带年月的经历会进账本、触发重算、候选重新打分、范围可以再收窄。缺的只是邀请与保证。
2. 决策记录
| 决策 | 内容 |
|---|---|
| D1 | 产品拍板(2026-09-14):并列且固定七条线问完时,交付卡照出,但卡上把「能问的都问完了」换成明确邀请。 文案要点:①说清这两分钟按现有信息分不开;②请用户再说一件记得年月的事,不限领域;③给几个七条线之外的例子(换专业、出国、打官司、创业、重病、亲人离世);④说明补完会接着算。措辞对照 frontend/docs/VOICE.md。 |
| D2 | 不采用"并列时先不出卡、再要一轮经历"(评估时的方案 B)。理由:接近 BUG-646 明令禁止的「门关不出结果」;用户真没有可说的时候会多一道无效问答,并可能退回开放式追问的死角。交付卡必须照出,用户随时可以停。 |
| D3 | 邀请不得退回列举已拒答的线(BUG-687 的修复保持有效)。邀请语是"不限领域 + 举例",不是把结婚 / 收入 / 家人再问一遍。 |
| D4 | 补完必须可见地生效。 用户在交付卡之后说出的带年月经历,必须进账本、重算、并在界面上有可见变化(范围卡更新,或给出新一轮题)。补了没反应属于缺陷——本单要有行为测试守住。 |
| D5 | 不改判据、不改打分、不放宽置信度或确认门控;不新增卡片组件;Skill 版本按是否改用户可见话术决定是否 bump(改了就 bump 并在 CHANGELOG.md 写明)。 |
3. 硬红线
tsc --noEmit0 错;npm run lint0 error;npm test失败数 = 基线 27 条;next build通过且/仍○ Static;首屏 gzip ±2%。- 新增断言必须是行为断言。
- 不得让邀请变成阻塞:交付卡、采用入口、"新建对话按此时间排盘"的出口都要照常可用。
- 不得把邀请写成承诺(「再说一件就能定到分钟」这类)。实话是"能不能再收窄取决于这件事落在哪段大运边界上"。
4. 任务分解
任务 1 · 文案(P0)
user-copy.ts:152的rangeDeliveryCollectClosed改成邀请语(按 D1 四要点);保留一个独立常量名以便测试与 VOICE 对照。collection-question-pool.ts:845-849两处返回点同步;现在还剩 X–Y 里 N 个候选。这半句保留。- 验收标准:行为单测——七条线全部 declined 时,
rangeNarrowHint的输出不含「问完了」类终局措辞,包含"不限领域"的邀请与至少两个七条线之外的例子;且不含结婚 / 收入 / 添丁等已拒答线的字样(BUG-687 回归)。
任务 2 · 交付卡把邀请放在看得见的位置(P0)
frontend/src/components/rectification-range-delivery.tsx:并列(前两名相对可能性差 ≤ 3 个百分点)且采集线已关闭时,邀请语要出现在卡片正文区,不能只躺在时间轴那行浅色小字里。- 不新增组件、不新增第二套卡片路径(§6 红线)。
- 同一提交更新
frontend/DESIGN.md的交付卡条目。 - 验收标准:行为单测/快照——该状态下卡片渲染包含邀请文本;非并列或采集线仍开放时不显示该邀请。
任务 3 · 补完必须生效(P0)
- 走查并用行为测试固定:交付卡之后用户输入一件带年月的经历 → 证据入账 → 重算 → 快照的
credible_range/ 候选分数有变化,或给出新一轮题。 - 验收标准:行为单测(可用既有 fakeAccounting 套路)——交付态 + 新增一件 confirmed dated evidence →
decideFromDossier的结果不再是同一份快照(snapshotCurrent === false或候选分数变化),且界面状态不停在delivered。
任务 4 · 记录
docs/BUG_HISTORY.md新增 BUG-689(resolved):现象写"七条线问完后只说『能问的都问完了』,用户不知道还能补经历,也不知道补了有用";防复发条写明:采集线关闭不等于校正结束;交付卡必须给出不限领域的补充邀请,且补充必须可见地生效。CHANGELOG.md一行;PROGRESS-rectification-open-collect-invite-20260914.md;docs/testing/清单:并列出卡后补一件带年月的经历 → 范围或排序应有可见变化。
5. 让步顺序
- 任务 1、任务 3 必做(文案 + 补完真的有用)。
- 任务 2 若卡片布局改动风险大,可先只改文案位置不改结构,写进进度记录。
6. 开工前置命令
git fetch origin --prune
git worktree add -b codex/rectification-open-collect-invite-20260914 \
.worktrees/rectification-open-collect-invite-20260914 origin/staging
cd .worktrees/rectification-open-collect-invite-20260914
ln -s /workspace/Jyotisha/.venv .venv
cd frontend && npm ci
开工前读:docs/research/rectification_minute_resolution_closure_2026_09_14.md(为什么"补经历"是唯一有效手段)、docs/BUG_HISTORY.md 的 BUG-687、646、651、653、688,以及 frontend/docs/VOICE.md。
7. BUG 编号起点
- 起点 BUG-689(当前最大号 688)。