docs(tasks): 修复单补 09-17 真机复现(死卡+占位矛盾 BUG-917、风格题计分口径决策);移动端时间轴读数任务书(BUG-918/919)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JUei7K13cYxLHE3Axe4A45
This commit is contained in:
Jesse_Chen
2026-09-17 00:03:54 +00:00
co-authored by Claude Fable 5.1
parent 548b032d08
commit c32f81e76d
3 changed files with 76 additions and 1 deletions
+2 -1
View File
@@ -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.23BUG-646648 | 待验收 | `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-908911Skill 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 前置挪到会话校验之后、登记 phaseBUG-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 | 待领取 | — |
### 聊天主链路与首页
@@ -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` 为 nullidle 已把焦点 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)。
@@ -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 宽下读数完整、浮层不遮选项,留真机清单。