diff --git a/docs/tasks/README.md b/docs/tasks/README.md index 6d8b8cba..3231e576 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -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-595~596,Skill 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-597~598) | +| `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-597~598,Skill 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-505~509) | -| `TASK-rectification-timeline-20260909.md` | — | 常驻吸顶时间轴:轴锁**当前**搜索窗口并随放宽缩放、时段/分钟两套标记、候选点二元编码不分置信度(BUG-560 blocked)、无 hover(BUG-575)、只读不可采用。实现用第三个 grid 行而非 `position: sticky`,`useConversationScrollAnchor` 一行不改;条高固定是正确性要求;吸顶条只留区间与宽度两个元素 | 待领取 | — | +| `TASK-rectification-timeline-20260909.md` | — | 常驻吸顶时间轴:轴锁**当前**搜索窗口并随放宽缩放、时段/分钟两套标记、候选点二元编码不分置信度(BUG-560 blocked)、无 hover(BUG-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-602~603) | ### 聊天主链路与首页 diff --git a/docs/tasks/TASK-rectification-candidate-compare-columns-20260908.md b/docs/tasks/TASK-rectification-candidate-compare-columns-20260908.md index acd75abe..661854bd 100644 --- a/docs/tasks/TASK-rectification-candidate-compare-columns-20260908.md +++ b/docs/tasks/TASK-rectification-candidate-compare-columns-20260908.md @@ -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 ``` + +## 验收(Claude,2026-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;出生年核对结果见进度记录 | +| 「没有」按钮 | 未做,等产品答复(合理) | + +结论:通过。真实环境三列卡观感待下次实测。 diff --git a/docs/tasks/TASK-rectification-timeline-20260909.md b/docs/tasks/TASK-rectification-timeline-20260909.md index 460714b0..02ba9234 100644 --- a/docs/tasks/TASK-rectification-timeline-20260909.md +++ b/docs/tasks/TASK-rectification-timeline-20260909.md @@ -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/`,**不得写成"通过"** + +## 验收(Claude,2026-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 | 采信执行方:`/` Static,CSS 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 节清单。 diff --git a/docs/tasks/TASK-rectification-timeline-fix-20260909.md b/docs/tasks/TASK-rectification-timeline-fix-20260909.md new file mode 100644 index 00000000..28ced20b --- /dev/null +++ b/docs/tasks/TASK-rectification-timeline-fix-20260909.md @@ -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:51–04:59 显示"8 分钟",05:07–05:09 显示"2 分钟",整天窗口显示"23 小时 59 分"。而 BUG-593 已把交付报告与三列卡的宽度定为**含两端的分钟数**:04:51–04:59 = 9 分钟、04:51–04:53 = 3 分钟(`rectification-delivery-report-facts.test.ts`)。同一屏上条写 8、卡写 9。任务书 §4.3 的示例"05:07–05: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:07–05: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:51–04:59 → "9 分钟";05:07–05:09 → "3 分钟";00:00–23:59 整天 → "24 小时";`rectification-delivery-report-facts.test.ts` 的同一形状与条读数一致。 +- (b) 推断层 9 个候选、7 个 eliminated、`credible_range` 04:51–04: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)" +```