docs(tasks): accept timeline ce91a0d2 and three-column card a43a6db8; timeline fix brief (BUG-602/603)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
This commit is contained in:
Jesse_Chen
2026-09-09 05:23:06 +00:00
co-authored by Claude Fable 5.1
parent 724a1215fe
commit aa499da109
4 changed files with 83 additions and 2 deletions
+3 -2
View File
@@ -80,10 +80,11 @@
| `TASK-rectification-delivery-report-facts-20260908.md` | `PROGRESS-rectification-delivery-report-facts-20260908.md` | 交付轮验证报告写「宽度 29 分钟」「主限偏向 05:06 / 分盘大运偏向 04:59」「04:53 D10 升狮子座」,与卡片(04:51–04:53)矛盾:`skill_verification_report` 用引擎推断前的 width / dasha_agreement,分盘星座让模型自算 | 已验收通过(Skill 10.0.16 | `06e44104`BUG-593 |
| `TASK-rectification-new-minute-inherit-20260908.md` | `PROGRESS-rectification-new-minute-inherit-20260908.md` | 5 题答完范围 13 分钟,补迁居事件后回弹到 28 分钟:重算换入的新分钟在携带题的 supports/conflicts 里没名字,一律中性、零冲突存活(BUG-587 决策 2 定错,本单推翻:按分盘星座 / 连续分钟段推结论);batch 内重算不触发 BUG-588 范围句 | 已验收通过(真实环境范围不再回弹) | `be711043`BUG-594 |
| `TASK-rectification-delivery-ui-simplify-20260908.md` | `PROGRESS-rectification-delivery-ui-simplify-20260908.md` | 产品决定:时间卡按候选分钟逐行直接点选采用(删分歧两列 + 都不像/说不好/按这个范围用/再补一件经历)、删输入框上方「先这样」按钮、删采用后状态条、交付正文收成三句 + 八法报告折叠块(Skill 10.0.17)、交付轮两条助手消息守卫(investigating) | 已验收通过(逐行卡随后被三列方案取代) | `7e3b6cdc`BUG-595596Skill 10.0.17 |
| `TASK-rectification-candidate-compare-columns-20260908.md` | `PROGRESS-rectification-candidate-compare-columns-20260908.md` | 产品决定交付卡改一行三列:每列相对可能性、D9/D10/月宿性格处事、经历对照计数、往后 12 个月事件窗、「更像这个」即采用;引擎按候选分钟各算 ledger 与窗口;顺带 BUG-598 点选题成年下限在 inspect 回退路径缺失(需核对)、采集题「没有」按钮(产品可否决);Skill 10.0.18 | 验收 | `codex/rectification-candidate-compare-columns-20260908`BUG-597598 |
| `TASK-rectification-candidate-compare-columns-20260908.md` | `PROGRESS-rectification-candidate-compare-columns-20260908.md` | 产品决定交付卡改一行三列:每列相对可能性、D9/D10/月宿性格处事、经历对照计数、往后 12 个月事件窗、「更像这个」即采用;引擎按候选分钟各算 ledger 与窗口;顺带 BUG-598 点选题成年下限在 inspect 回退路径缺失(需核对)、采集题「没有」按钮(产品可否决);Skill 10.0.18 | 验收通过(「没有」按钮等产品答复) | `a43a6db8`BUG-597598Skill 10.0.18 |
| `TASK-api-not-configured-mislabel-20260904.md` | `PROGRESS-api-not-configured-mislabel-20260904.md` | 16 处路由把数据库瞬断(部署切换窗口)兜底翻译成 503「服务尚未配置」;改为仅配置错误用该文案,其余 `service_unavailable`,收敛为共享 helper | 已验收 | `5483649b`(BUG-542);2 条子进程测试留 CI Node 22 复核 |
| `TASK-rectification-ux-20260902.md` | `PROGRESS-rectification-ux-20260903.md` | 会话面空白假死与交互摩擦 | 已验收 | `d159f08e`(09-03 在新基线重做后合入,BUG-505509 |
| `TASK-rectification-timeline-20260909.md` | — | 常驻吸顶时间轴:轴锁**当前**搜索窗口并随放宽缩放、时段/分钟两套标记、候选点二元编码不分置信度(BUG-560 blocked)、无 hoverBUG-575)、只读不可采用。实现用第三个 grid 行而非 `position: sticky``useConversationScrollAnchor` 一行不改;条高固定是正确性要求;吸顶条只留区间与宽度两个元素 | 待领取 | — |
| `TASK-rectification-timeline-20260909.md` | — | 常驻吸顶时间轴:轴锁**当前**搜索窗口并随放宽缩放、时段/分钟两套标记、候选点二元编码不分置信度(BUG-560 blocked)、无 hoverBUG-575)、只读不可采用。实现用第三个 grid 行而非 `position: sticky``useConversationScrollAnchor` 一行不改;条高固定是正确性要求;吸顶条只留区间与宽度两个元素 | 已验收通过;宽度口径与空心点两处未通过→修复单 | `ce91a0d2` |
| `TASK-rectification-timeline-fix-20260909.md` | `PROGRESS-rectification-timeline-fix-20260909.md` | 时间轴修复单:宽度读数改含两端分钟数(与 BUG-593 报告/卡片一致);标记改读推断层候选全集,被淘汰分钟留在原地变空心(客户端投影只含 active,DESIGN §10 描述在真实数据下画不出) | 待执行 | `codex/rectification-timeline-fix-20260909`BUG-602603 |
### 聊天主链路与首页
@@ -60,3 +60,17 @@ cd frontend && ./node_modules/.bin/tsc --noEmit; npm run lint 2>&1 | tail -1
ls tests/rectification-*.test.ts tests/agent-voice-copy-contract.test.ts tests/skill-registry.test.ts | grep -v database | xargs npx tsx --test 2>&1 | grep -E "^# (tests|pass|fail)"
cd .. && .venv/bin/python -m pytest tests/test_rectification_v5_services.py -q
```
## 验收(Claude2026-09-09`origin/staging` @ `724a1215`;实现提交 `a43a6db8`
门禁同时间轴验收段(tsc 0 / lint 0 error / 前端 1331/0 / Python 全绿)。
| 项 | 结论 |
| --- | --- |
| 决策 1–3 三列卡 | 通过。「更像这个」走 accept,不预标排盘用,五段服务端算好 |
| 决策 4 引擎 by_time 字段 | 通过。`test_rectification_v5_services.py` 35 绿 |
| Skill 10.0.18 | 通过。快照字节一致 |
| BUG-598 成年下限 | 通过。inspect 回退路径接 birthDate;出生年核对结果见进度记录 |
| 「没有」按钮 | 未做,等产品答复(合理) |
结论:通过。真实环境三列卡观感待下次实测。
@@ -235,3 +235,26 @@ cd frontend && npm test 2>&1 | grep -E "^# (tests|pass|fail)"
- 本地提交,**推 staging 前先回报**,由 Claude 独立验收
- 推送用快进:`git push origin HEAD:staging`;推送后核对远端 SHA`AGENTS.md` §2.6
- 做不了的(无登录态、无 Chrome、无 Docker)如实写进 `BLOCKED.md``docs/testing/`**不得写成"通过"**
## 验收(Claude2026-09-09`origin/staging` @ `724a1215`staging 已部署同 SHA
| 门 | 结果 |
| --- | --- |
| tsc | 0 错 |
| lint | 0 error / 108 warning |
| 前端 rectification + consultation + session + voice + skill-registry(非 DB | 1331 / 0 |
| Python v5_services + event_probes + growth contract | 全绿 |
| `next build` / 首屏 gzip | 采信执行方:`/` StaticCSS gzip +0.95% |
| 项 | 结论 |
| --- | --- |
| 任务 0 数据源 | 通过。只读已在线字段,服务端零改动 |
| §4.1 grid 行、不改滚动跟随 | 通过。`use-conversation-scroll-anchor.ts` diff 为空 |
| §4.2 固定条高、骨架占位 | 通过。64 / 56px,`data-state="pending"` 等高 |
| §4.3 只有两个元素 | 通过。源码锁住不得出现的文案 |
| §4.4 二元编码、无 hover、transform-only | 通过。执行方为避开 width 过渡红线改用 transform,比原写法好 |
| 让步 1 时段阶段不画区块 | 接受 |
| **宽度读数** | **未通过**:按差值算(04:51–04:59 显示 8 分钟),与 BUG-593 定下的含两端口径(9 分钟)冲突。任务书示例本身就是差值口径,责任在任务书 |
| **空心点** | **未通过**:客户端候选投影只含 active 分钟(`inference-adapter.ts` L292),被排除的分钟到不了条上,DESIGN §10 的"留在原地变空心"在真实数据下画不出来;测试用的是合成输入 |
结论:整体通过,两处不一致写成 `TASK-rectification-timeline-fix-20260909.md`BUG-602/603)。真人走查清单未做,沿用执行方的 6 节清单。
@@ -0,0 +1,43 @@
# TASK · 生时校正时间轴修复单:宽度读数与卡片/报告口径不一致;被排除的分钟根本到不了客户端,"空心点"画不出来(2026-09-09
- 基线:`origin/staging` @ `724a1215`(时间轴 `ce91a0d2` 已合入并部署)
- 分支:`codex/rectification-timeline-fix-20260909`,基于 `origin/staging`
- 执行方:coding agent;验收:Claude
- 涉及文件:`frontend/src/lib/rectification-timeline-scale.ts``frontend/src/components/rectification-agentic-chat.tsx``timelineView``candidateTimes` 来源)、`frontend/src/lib/rectification-candidate-result.ts`(或直接读 `decisionReceipt.inference_state.candidates`)、`frontend/tests/rectification-timeline-20260909.test.ts``frontend/DESIGN.md` §10
- BUG 编号起点:**BUG-602**`docs/BUG_HISTORY.md` 当前最大 BUG-601
- 优先级:**P1**(两处都是"条上写的和别处不一样",用户会当成算错)
## 1. 事实
### 1.1 BUG-602:宽度按差值算,卡片与报告按含两端算
`timelineDurationLabel(bandEnd - bandStart)`04:5104:59 显示"8 分钟"05:0705:09 显示"2 分钟",整天窗口显示"23 小时 59 分"。而 BUG-593 已把交付报告与三列卡的宽度定为**含两端的分钟数**:04:5104:59 = 9 分钟、04:5104:53 = 3 分钟(`rectification-delivery-report-facts.test.ts`)。同一屏上条写 8、卡写 9。任务书 §4.3 的示例"05:0705:09 · 2 分钟"本身就是差值口径,执行方照抄了。
### 1.2 BUG-603:客户端候选列表只含 active 分钟,被排除的分钟不会变空心、而是消失
`inference-adapter.ts` L292 `candidates = active.flatMap(...)`:投影只保留 `status !== "eliminated"` 的候选;`rectification-agentic-chat.tsx``candidateResult.candidates.map(time)` 喂给时间轴,`buildRectificationTimeline` 再按"是否落在区间带内"判 in/out。结果:分钟阶段所有到达客户端的点都在带内、全是实心;答完一题被淘汰的分钟直接从条上消失。DESIGN.md §10 写的"被排除的点留在原地变空心、不消失——用户由此看见自己刚才那一答排掉了哪几分钟"在真实数据下不成立;测试里的 `["out","in","in","in","out"]` 是合成输入。另外 `credible_range` 是 active 候选的跨度,带内若有被淘汰分钟(可能出现)也会被按位置判成 in。
## 2. 决策记录
1. **宽度统一为含两端分钟数**`widthLabel = timelineDurationLabel(bandEnd - bandStart + 1)`;整天窗口显示"24 小时";单分钟显示"1 分钟"。DESIGN.md §10 示例改为"05:0705:09 · 3 分钟"。
2. **标记来源改为推断层候选全集**:客户端从 `decisionReceipt.inference_state.candidates`(有 `time``status`)取点;`state = status === "eliminated" ? "out" : "in"`,不再按位置判。没有 `inference_state` 时退回现有行为(引擎候选全部实心)。`RectificationCandidateResult` 加只读字段 `inferenceMarks: [{time, eliminated}]`,解析放在 `rectification-candidate-result.ts`,组件不碰 receipt。
3. 二元编码、只读、固定条高、grid 行、transform-only 全部不动;`use-conversation-scroll-anchor.ts` 仍一行不改。
## 3. 验收
- (a) 04:5104:59 → "9 分钟"05:0705:09 → "3 分钟"00:0023:59 整天 → "24 小时"`rectification-delivery-report-facts.test.ts` 的同一形状与条读数一致。
- (b) 推断层 9 个候选、7 个 eliminated、`credible_range` 04:5104:53 → 条上 9 个点,7 空心 2 实心;下一轮再淘汰 1 个 → 8 空心 1 实心,点的 key 不变(过渡不重建)。
- (c) 无 `inference_state`(时段阶段刚选定)→ 引擎候选全部实心,行为同今天。
- (d) 三栏:`widthLabel` 用例原值/新值/原因;合成 marks 用例改为按 status。
- (e) 记录:BUG-602(关联 BUG-593)、BUG-603(关联 BUG-560、DESIGN §10);`CHANGELOG.md``PROGRESS-…``docs/testing/rectification-timeline-20260909.md` §4 第一条改为"被排除的分钟变空心且不消失(数据来自推断层)"。
## 4. 开工前置命令
```bash
git fetch origin --prune
git worktree add -b codex/rectification-timeline-fix-20260909 .worktrees/rectification-timeline-fix-20260909 origin/staging
cd .worktrees/rectification-timeline-fix-20260909
ln -s /workspace/Jyotisha/frontend/node_modules frontend/node_modules
cd frontend && ./node_modules/.bin/tsc --noEmit; npm run lint 2>&1 | tail -1
npx tsx --test tests/rectification-timeline-20260909.test.ts tests/rectification-delivery-report-facts.test.ts 2>&1 | grep -E "^# (tests|pass|fail)"
```