From c32f81e76d0ab89f28694b53c57e394ad3aaa449 Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Thu, 17 Sep 2026 00:03:54 +0000 Subject: [PATCH] =?UTF-8?q?docs(tasks):=20=E4=BF=AE=E5=A4=8D=E5=8D=95?= =?UTF-8?q?=E8=A1=A5=2009-17=20=E7=9C=9F=E6=9C=BA=E5=A4=8D=E7=8E=B0?= =?UTF-8?q?=EF=BC=88=E6=AD=BB=E5=8D=A1+=E5=8D=A0=E4=BD=8D=E7=9F=9B?= =?UTF-8?q?=E7=9B=BE=20BUG-917=E3=80=81=E9=A3=8E=E6=A0=BC=E9=A2=98?= =?UTF-8?q?=E8=AE=A1=E5=88=86=E5=8F=A3=E5=BE=84=E5=86=B3=E7=AD=96=EF=BC=89?= =?UTF-8?q?=EF=BC=9B=E7=A7=BB=E5=8A=A8=E7=AB=AF=E6=97=B6=E9=97=B4=E8=BD=B4?= =?UTF-8?q?=E8=AF=BB=E6=95=B0=E4=BB=BB=E5=8A=A1=E4=B9=A6=EF=BC=88BUG-918/9?= =?UTF-8?q?19=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 | 3 +- ...ctification-dead-d9-choice-fix-20260916.md | 14 +++++ ...cation-mobile-timeline-readout-20260917.md | 60 +++++++++++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 docs/tasks/TASK-rectification-mobile-timeline-readout-20260917.md diff --git a/docs/tasks/README.md b/docs/tasks/README.md index 934bd6a1..2b249eae 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -103,7 +103,8 @@ | `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 | 已验收 | `6aabbe38`(BUG-908~911,Skill 10.0.29):tsc 0 / lint 0 error / npm test 3414 条 31 红与基线 05cf20fb 逐条相同 / `/` Static / 首屏 gzip 620,502→620,107(−0.06%)/ 快速门 Python 段 798 绿。两条小项(host 前置排在会话校验之前、`answer.host_year_entry` 未登记)并入 dead-d9 修复单 T2 | | `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 验收之后** | **验收未通过(P0)** | `227a7571`+`8d7dfbf0`:不借探针、一列一句、BUG-913 定性均过;但自建探针只在盖戳时注入内存 state,生产答题路径读持久化 state → `stale_probe` 报错、GET 无卡、idle 立刻 superseded(生产路径回放实证)。修复单见下一行 | -| `TASK-rectification-dead-d9-choice-fix-20260916.md` | `PROGRESS-rectification-dead-d9-choice-fix-20260916.md` | **验收修复单**:自建分盘探针照 `withNakshatraBoundaryProbe` 模式在每个读 state 的地方(盖戳 / 答题 / `previousInferenceFromReceipt` / GET 投影 / idle 过期判定 / 计划承接)从 receipt 确定性重建(BUG-915);测试改走生产路径、删手工塞探针的 fixture;顺带 host 前置挪到会话校验之后、登记 phase(BUG-916)。**staging 现状:风格题答不了,先跳过** | 待领取 | — | +| `TASK-rectification-dead-d9-choice-fix-20260916.md` | `PROGRESS-rectification-dead-d9-choice-fix-20260916.md` | **验收修复单**:自建分盘探针照 `withNakshatraBoundaryProbe` 模式在每个读 state 的地方(盖戳 / 答题 / `previousInferenceFromReceipt` / GET 投影 / idle 过期判定 / 计划承接)从 receipt 确定性重建(BUG-915);测试改走生产路径、删手工塞探针的 fixture;顺带 host 前置挪到会话校验之后、登记 phase(BUG-916);死卡不得配 `collect_waiting` 占位(BUG-917);**产品决策 1c**:风格题默认不作全额计分(沿用 09-09 ±1 拍板),无事件探针就走下一条线。**staging 现状:风格题答不了,先跳过** | 待领取 | — | +| `TASK-rectification-mobile-timeline-readout-20260917.md` | `PROGRESS-rectification-mobile-timeline-readout-20260917.md` | 手机截图:时间轴读数第四项被裁成「已…」(nowrap + inset 内边距,BUG-918);「跳到最新」浮层压住选项 C(BUG-919)。灰卡与「再说一件」矛盾归修复单 BUG-915/917 | 待领取 | — | ### 聊天主链路与首页 diff --git a/docs/tasks/TASK-rectification-dead-d9-choice-fix-20260916.md b/docs/tasks/TASK-rectification-dead-d9-choice-fix-20260916.md index d26580ef..9d70ef1d 100644 --- a/docs/tasks/TASK-rectification-dead-d9-choice-fix-20260916.md +++ b/docs/tasks/TASK-rectification-dead-d9-choice-fix-20260916.md @@ -21,6 +21,19 @@ **总结论:未通过。** 根因是一个:自建探针没有像月宿边界探针那样在**每个读 state 的地方**重建。 +## 1b. 2026-09-17 07:58 真机复现(产品负责人手机截图) + +- 定向健康题答「2024 年 8 月」入账后,正文出「亲密关系里,你更接近哪一种相处方式?」A/B/C/D。**四个选项灰显(`opacity .48`,`fieldset:disabled`)、点不了**——消息内的卡是 `embeddedCard` 且 `disabled={!liveQuestion}`(`rectification-message-entry.tsx:169-180`),GET 没有 `choice_card`(§1 T1c)就是死卡。这正是 §1 预测的现象,不是新缺陷。 +- 同屏矛盾:只读范围行写「再说一件带年月的事就能继续」,输入框占位也是「再说一件带年月的事」。原因:`currentQuestion` 为 null(idle 已把焦点 superseded,§1 T1c 反向误伤)→ `interviewCollectWaiting` 为真 → `collect_waiting`;而最后一条消息上还挂着未答的死卡。`rectificationQuestionGapState` 只看 `currentQuestion`,看不到消息级的 `unansweredDeadChoice`。 +- **补进 T1 验收(BUG-917)**:最后一条助手消息带未答的点选题而 GET 无卡时,缺口态不得是 `collect_waiting`;要么是修好后的活卡,要么走 `unavailable` 修复出口(「没有拿到下一个问题」+ 接着问),占位与范围行同步。把 `unansweredDeadChoice`(或等价的「最新消息未答点选」)作为 `rectificationQuestionGapState` 的输入,加断言。 + +## 1c. 产品决策待确认:D9/D10「你更像哪种」题的计分口径 + +- 实现把 D9/D10 判别题做成 `choice_kind=varga_style`:选项是「尽量避免冲突…」「投入很深…」这类分盘上升类型描述,答案按 `expected_outcomes` 全额更新后验、淘汰候选。 +- 与既有口径冲突:`SKILL.md:84`「不要问两套盘哪个更像」;产品 2026-09-09 拍板「性格题降级为平局裁决(±1、不淘汰、报告参考)」;hint 原文是「按探针年份问感情这条线的**前事是否发生**」。 +- **本单默认按既有口径执行(b)**:分盘风格题不得作为 `distinguish_candidates` 全额计分。D9/D10 判别题只在引擎给出该领域带年份事件探针(`discriminating_event_probes` / `prospective_probes`)时以「某年前后有没有…」出题并计分;没有事件探针时不出风格题,直接走下一条线(引导窗口 / 跳过线重问 / 未覆盖领域 / 交付)。风格描述只留在既有的平局参考题(±1)与交付卡列。产品若改口为 (a)「允许风格题全额计分」,在本单决策记录追加一行即可,执行方不得自行选边。 +- 这条不改变 T1 的重建要求:事件探针来自引擎 state,本就在持久化里;自建探针的重建逻辑仍要做,供 (a) 与将来使用,但默认路径不再产生风格计分题。 + ## 2. 修法(照 `withNakshatraBoundaryProbe` 的既有模式) 月宿边界探针也不在引擎 state 里,它的做法是三处都从 receipt 重建:`server-focus.ts:124`(盖戳)、`answer-choice.ts:591`(答题)、`inference-adapter.ts:235`(`previousInferenceFromReceipt` 之后)。自建分盘探针照抄: @@ -65,3 +78,4 @@ grep -o "BUG-[0-9]\+" ../docs/BUG_HISTORY.md | sort -t- -k2 -n | tail -1 - **staging 当前状态**:D9/D10 风格题不再错分,但**答不了**(点选会报错)。在修复单过门前,遇到风格题请先跳过(D)或补一件带年月的事。 - 事发 Case 的 04:48–04:59 仍不可采用(建立在错分上)。 +- 09-17 手机上那张灰卡就是本单 P0;1c 的计分口径请产品确认或默认 (b)。 diff --git a/docs/tasks/TASK-rectification-mobile-timeline-readout-20260917.md b/docs/tasks/TASK-rectification-mobile-timeline-readout-20260917.md new file mode 100644 index 00000000..368c13d8 --- /dev/null +++ b/docs/tasks/TASK-rectification-mobile-timeline-readout-20260917.md @@ -0,0 +1,60 @@ +# 任务书 · 校正页移动端:时间轴读数被裁、「跳到最新」压住选项(2026-09-17) + +## 0. 基线 + +- 基线 commit:`8d7dfbf0`(staging 已部署)。分支:`codex/rectification-mobile-timeline-readout-20260917`。 +- 串行:与 `TASK-rectification-dead-d9-choice-fix-20260916.md` 无文件交集(本单只动 `globals.css` 时间轴段与 `rectification-timeline.tsx`),可并行;若同时改 `rectification-agentic-chat.tsx`,本单在后。 +- BUG 段:**BUG-918 起**(915~917 归修复单)。纯前端样式,不跑 Python 预检。 + +## 1. 事故实证(产品负责人 2026-09-17 07:58 iPhone 截图,staging) + +| # | 现象 | 位置 | +| --- | --- | --- | +| A | 时间轴读数一行「04:48–05:07 20 分钟 代表分钟 04:53 已…」,第四项被裁成「已…」 | `globals.css:2543-2576`:`.rectification-timeline__readout` `white-space: nowrap; flex-wrap: nowrap`,注释写「Four short items clear 375px with room to spare」,实测 iPhone 宽度下第四项 `__answered`(`rectification-timeline.tsx:47`)放不下,被 `text-overflow: ellipsis` 裁掉;第五项 `__dated` 更看不到 | +| B | 「跳到最新」浮层压在选项 C 上,选项被遮一半 | `globals.css:1592-1598` `position:absolute; bottom:100%` 挂在输入框上方,与滚动内容重叠;点选卡末项恰在其后 | +| C | 卡片选项灰显点不了;范围行与输入框占位说「再说一件带年月的事」 | **不是本单**:这是修复单 BUG-915/917 的 P0 表现 | + +## 2. 根因 + +- A:读数按「四项短文本」设计,实际 `代表分钟 04:53` + `已答 N 题` 两项在 13px 下已超出 375px 可用宽度(内容区还扣掉左侧 `--assistant-content-inset` 44px 与两侧 `--space-8`)。时间轴高度固定是正确性要求(注释说明,不能换行),所以只能减内容或减内边距。 +- B:浮层锚在 composer 顶上而列表底部 padding 不够,最后一条内容顶到了浮层下面。 + +## 3. 决策记录 + +- 产品 2026-09-17:移动端看着不舒服,读数不得被裁;范围与代表分钟必须一直可见(D10 原则不变)。 +- 不改时间轴固定高度,不改滚动锚定逻辑(`use-conversation-scroll-anchor`)。 + +## 4. 任务分解 + +### T1 读数在 375px 内完整可见(BUG-918) + +- `.is-compact` 下:读数左内边距不再加 `--assistant-content-inset`(时间轴不在消息列里,对齐头像列在手机上没有意义),改为与页面边距同源的 `--space-4`;`已答 N 题` 与 `已记 N 件` 两项在 compact 下合并成一项「N 题 · N 件」或只保留一项,具体以 `frontend/docs/VOICE.md` 口径定;字号保持 13px。 +- 验收:CSS 声明断言(compact 下 `.rectification-timeline` padding 不含 inset);组件测试在 compact 视口宽 375 下渲染,五项文本都在 DOM 且 readout `scrollWidth <= clientWidth`(jsdom 量不出就改为字符数上限断言,写明);`DESIGN.md` 时间轴段更新。 + +### T2 「跳到最新」不遮最后一条可点内容(BUG-919) + +- 列表底部 `padding-bottom` 至少等于浮层高度 + `--space-3`,或浮层出现时给 `.conversation` 加同高的 `scroll-padding-bottom`;浮层可见条件不变。 +- 验收:CSS 断言;真机清单一条。 + +### T3 记录 + +- BUG-918/919、CHANGELOG、`DESIGN.md`、`PROGRESS-rectification-mobile-timeline-readout-20260917.md`、`docs/testing/rectification-mobile-timeline-readout-20260917.md`。 + +## 5. 让步顺序 + +1. T1 若合并两项撞 VOICE 口径,先只做去 inset + 缩 gap,进度记录写明剩余裁切宽度。 +2. T2 不可让步。 + +## 6. 开工前置命令 + +```bash +git fetch origin --prune +git worktree add -b codex/rectification-mobile-timeline-readout-20260917 .worktrees/rectification-mobile-timeline-readout-20260917 origin/staging +cd .worktrees/rectification-mobile-timeline-readout-20260917/frontend && ./node_modules/.bin/tsc --noEmit && npm run lint && npm test 2>&1 | tail -20 +``` + +验收口径:tsc 0 错、lint 0 error、npm test 失败清单与基线一致、`/` Static、gzip ±2%。 + +## 7. 环境缺口 + +- 无 Chrome / 真机:375 与 390 宽下读数完整、浮层不遮选项,留真机清单。