diff --git a/docs/tasks/README.md b/docs/tasks/README.md index f764b04c..60abf15c 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -186,6 +186,8 @@ | `TASK-rectification-tiebreak-hold-exit-fix-20260914.md` | `PROGRESS-rectification-tiebreak-hold-exit-20260914.md` | **P0 回归修复单**:BUG-686 的风格题前置把耗尽与收口路径的交付也压住了,`npm test` 由 27 红涨到 33(6 条「该交付却不交付」)。后续 `6fd7925a` 只改断言把它们改绿:4 条文案放宽可接受,2 条实质弱化(「恰好一条交付闸」退化成短路、参考题确认语被算作出口载体)必须恢复;行为层根因未动。hold 要带出口、不得作用于 exhausted/closed-ceiling,最多 hold 一次(BUG-688)。尚未部署,未影响线上 | 待验收 | `codex/rectification-tiebreak-hold-exit-20260914` | +| `TASK-rectification-open-collect-invite-20260914.md` | `PROGRESS-rectification-open-collect-invite-20260914.md` | **P0**:固定七条采集线问完后只说「能问的都问完了」,用户不知道还能补经历、也不知道补了有用;而两轮研究证明补带年月经历是唯一有效手段。产品拍板:交付卡照出 + 卡上给不限领域的补充邀请(举七条线之外的例子),补完必须可见生效(BUG-689) | 待执行 | `codex/rectification-open-collect-invite-20260914` | + | `TASK-rectification-cluster-width-research-20260914.md` | `PROGRESS-rectification-cluster-width-research-20260914.md` | **研究单**:上一轮证明调权重改不动交付区间宽度——所有方案宽度中位数都等于整个搜索窗。先确认 sweep 的宽度口径是否含淘汰(M0),再画簇结构像(M1),最后量三个改法:放宽簇上限、按分差决定是否合并、交付区间改分位覆盖(M2)。真值覆盖率不得下降 | 待验收 | `codex/rectification-cluster-width-research-20260914` | | `TASK-rectification-minute-resolution-research-20260914.md` | `PROGRESS-rectification-minute-resolution-research-20260914.md` | **研究单**:候选分不开的根因是打分尺度——窗口内恒定项 11.5 分 vs 随分钟变化项 2.125 分(≈5:1)。先修封存基准(v3 每例仅 3 件事且被标 invalidated)出 v4,再离线量五个改法:分盘除数、去底座、**KP 宫头子主计分(产品 09-14 拍板,推翻 BUG-325 一条红线)**、年精度事件改边际似然、聚类签名层对齐。有收益才立实现单 | 待验收 | `codex/rectification-minute-resolution-research-20260914` | diff --git a/docs/tasks/TASK-rectification-open-collect-invite-20260914.md b/docs/tasks/TASK-rectification-open-collect-invite-20260914.md new file mode 100644 index 00000000..1fd881c3 --- /dev/null +++ b/docs/tasks/TASK-rectification-open-collect-invite-20260914.md @@ -0,0 +1,82 @@ +# 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. 硬红线 + +1. `tsc --noEmit` 0 错;`npm run lint` 0 error;`npm test` 失败数 = 基线 27 条;`next build` 通过且 `/` 仍 `○ Static`;首屏 gzip ±2%。 +2. 新增断言必须是行为断言。 +3. 不得让邀请变成阻塞:交付卡、采用入口、"新建对话按此时间排盘"的出口都要照常可用。 +4. 不得把邀请写成承诺(「再说一件就能定到分钟」这类)。实话是"能不能再收窄取决于这件事落在哪段大运边界上"。 + +## 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. 任务 1、任务 3 必做(文案 + 补完真的有用)。 +2. 任务 2 若卡片布局改动风险大,可先只改文案位置不改结构,写进进度记录。 + +## 6. 开工前置命令 + +```bash +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)。