merge origin/staging into report chart render branch
Independent Staging Quality Gate / validate (push) Has been cancelled
Independent Staging Quality Gate / publish (push) Has been cancelled

Keep BUG-607 after 602–606 and retain both 09-09 changelog entries.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-09 15:13:37 +08:00
co-authored by Cursor
67 changed files with 1826 additions and 172 deletions
+80
View File
@@ -9334,6 +9334,86 @@
- 复发自:无
- 修复版本:待发布
## BUG-602 | 时间轴宽度按差值算,卡片与报告按含两端算
- 状态:resolved
- 首次发现:2026-09-09
- 最近更新:2026-09-09
- 影响面:`rectification-timeline-scale.ts` 区间读数 `widthLabel``frontend/DESIGN.md` §10
- 用户现象:同一屏上时间轴写的宽度比三列卡和验证报告少 1 分钟。例如区间 04:51–04:59 条上写「8 分钟」、卡上写「9 分钟」;05:07–05:09 条上写「2 分钟」;整天窗口写「23 小时 59 分」。
- 触发条件:分钟阶段已有 `credible_range`,或时段阶段轴铺满整天窗口。必现。
- 根因:`widthLabel``timelineDurationLabel(bandEnd - bandStart)`,少算两端都计入的那一分钟。BUG-593 已把交付报告与三列卡定为含两端分钟数;任务书示例「05:07–05:09 · 2 分钟」是差值口径,首版时间轴照抄了。
- 修复:改为 `timelineDurationLabel(bandEnd - bandStart + 1)`。整天 00:00–23:59 显示「24 小时」,单分钟显示「1 分钟」。DESIGN.md §10 示例改为「05:0705:09 · 3 分钟」。
- 验证:`frontend/tests/rectification-timeline-20260909.test.ts`(含两端宽度表:04:5104:59 → 9 分钟、05:0705:09 → 3 分钟、04:5104:53 → 3 分钟、单分钟 → 1 分钟、整天 → 24 小时);与 `frontend/tests/rectification-delivery-report-facts.test.ts``width_minutes === 3` 同一形状。
- 防复发:时间轴读数必须与报告/卡片同一套含两端分钟数;禁止再把 `bandEnd - bandStart` 当宽度。
- 相关记录:BUG-593
- 复发自:无
- 修复版本:`92e3d5e7`
## BUG-603 | 被排除的分钟到不了客户端,时间轴空心点画不出来
- 状态:resolved
- 首次发现:2026-09-09
- 最近更新:2026-09-09
- 影响面:`rectification-candidate-result.ts``rectification-timeline-scale.ts``rectification-agentic-chat.tsx``timelineView` 候选来源
- 用户现象:DESIGN.md §10 写「被排除的点留在原地变空心、不消失」;真实会话里答完一题后那些分钟从条上消失,剩下的全是实心。看不到刚才那一答排掉了哪几分钟。
- 触发条件:分钟阶段已有推断层、至少淘汰过一个候选。必现。
- 根因:`inference-adapter.ts` 投影只保留 `status !== "eliminated"` 的候选;时间轴把 `candidateResult.candidates.map(time)` 当点,再按是否落在区间带内判 in/out。到达客户端的点都在带内,全是实心;被淘汰的分钟根本不在列表里。测试里的 `["out","in","in","in","out"]` 是合成输入,不是这条数据路径。
- 修复:`RectificationCandidateResult` 增加只读 `inferenceMarks: [{time, eliminated}]`,从 `decisionReceipt.inference_state.candidates``time` / `status` 解析(组件不读原始 receipt)。`state = status === "eliminated" ? "out" : "in"`,不再按点是否落在带内判断。没有 `inference_state` 时退回引擎候选全部实心。
- 验证:`frontend/tests/rectification-timeline-20260909.test.ts`:推断层 9 个候选、7 个 eliminated、可信区间 04:5104:53 → 9 个点、7 空心 2 实心;再淘汰 1 个 → 8 空心 1 实心,key 不变。`frontend/tests/rectification-candidate-result.test.ts`:有 `inference_state` 时解析出全集,无则 `[]`。聊天源码合同:`timelineView``inferenceMarks`,不读 `decisionReceipt`
- 防复发:时间轴标记必须来自推断层候选全集;禁止再用引擎 active 投影或带内位置当 in/out。空心/实心只看 `status === "eliminated"`
- 相关记录:BUG-560、DESIGN.md §10
- 复发自:无
- 修复版本:`92e3d5e7`
## BUG-604 | 开场不讲做法、一次只收一件,同一批经历被拆成多轮计费
- 状态:resolved
- 首次发现:2026-09-09
- 最近更新:2026-09-09
- 影响面:`buildOpeningBrief``GENERIC_COLLECT_QUESTION``jyotish-birth-time-rectification@10.0.19` OpeningPolicy、口述开场正文
- 用户现象:开场不说当前窗口和最后会给什么,也不点出可以讲哪些方面;题干只请人说一件,一条消息里的多件经历被拆成多轮,每轮都要重算。
- 触发条件:新建生时校正、进入开场采集。
- 根因:opening brief 和 Skill OpeningPolicy 禁止领域清单、禁止一次说完;题干带年份例子。产品决定推翻该口径:列领域不列年份,一条消息可以报多件。
- 修复:brief 写入当前搜索窗口与 intake 来源、做法三句要点、六类领域。开场正文不合格时服务端换成模板。首题仍是 `collect:other:*`,题干改为「先说你最容易想起的一两件,年月大概就行」。批量写入路径仍是 `rectification-record-evidence-batch`。Skill 10.0.19。只报一件走既有逐领域采集,不插入「还有吗」追问轮。
- 验证:`frontend/tests/rectification-v9-agent.test.ts`opening brief、落库正文替换)、`frontend/tests/agent-voice-copy-contract.test.ts`(开场模板与六类)、`frontend/tests/rectification-spoken-collect.test.ts`(三件已确认领域不再被逐个追问;单事件开场下一问为逐领域采集且正文不含「还有吗 / 别的吗」)、`frontend/tests/rectification-server-focus.test.ts`GENERIC 题干)。
- 防复发:开场落库正文必须 ≤4 句、至少五类领域、不含四位年份。不得要求先准备材料。不得把具体年份写进开场。不得因只报一件就插入追问轮或重复开场邀请。
- 相关记录:BUG-488、BUG-558
- 复发自:无
- 修复版本:`aa7ccb30``1453fb16`
## BUG-605 | 口述采集只能打字「没有」,没有「记不清」,也不知道可以跳过
- 状态:resolved
- 首次发现:2026-09-09
- 最近更新:2026-09-09
- 影响面:`rectification-agentic-chat.tsx` composer-wrap、`applyCollectFocusDenial``isCollectSkipUtterance`、采集回执文案
- 用户现象:采集题只有输入框。想说这方面没有或这题记不清时,不知道可以跳过;打字「没有」才能走拒答。
- 触发条件:`collect_spoken` 焦点激活且未 busy。
- 根因:BUG-595 删掉输入框上方「先这样」后没有替代采集快捷回答。产品不要示例骨架条,只要「没有 / 记不清」。
- 修复:composer-wrap 内两个 44px 次要按钮,类名 `rectification-collect-reply`,不复用 `rectification-step-state`。「没有」与打字「没有」同一 POST,走 declined,回执「记下了,这方面先跳过。」「记不清」走 skipped,回执「记下了,这题先放着。」精确这两句不调模型。skipped 领域本会话不再采集;采用后核对仍可碰到 skipped,不碰 declined。
- 验证:`frontend/tests/rectification-spoken-collect.test.ts`(按钮只在 collect_spoken、精确「没有 / 记不清」短路分类器、skipped 不再采集、reverse-verify 仍可碰)。
- 防复发:采集快捷回答不得画成「先这样」,不得用 `rectification-step-state`。不得在回答条预填年份。
- 相关记录:BUG-546
- 复发自:无
- 修复版本:`aa7ccb30`
## BUG-606 | 每轮气泡太长:方法句、领先落后、价值评价叠在正文里
- 状态:resolved
- 首次发现:2026-09-09
- 最近更新:2026-09-09
- 影响面:`chat-message-content.tsx``consultation-run-timeline.tsx``composeChoiceNarration``trimEvidenceTurnBody``agent-run` 开场/证据守卫
- 用户现象:助手气泡里除了记下经历,还写「本轮对照了…」、点选后「这段领先那段落后」,以及「对校正特别有用」之类评价。
- 触发条件:证据轮或点选题答完后看助手正文。
- 根因:方法句渲在气泡;旁白拼接 `explainScoreMovement`;证据轮只靠提示词,模型仍写三句加评价。
- 修复:气泡不再渲染 `vargaSentence`,展开的活动时间线保留。点选旁白只有「已记录,范围没变。」或「已记录,范围收到 / 变为 A–B。」证据轮超过两句只留首句,并去掉「很有帮助 / 很有价值 / 很有分量 / 特别有用」。
- 验证:`frontend/tests/rectification-varga-style-copy.test.ts``frontend/tests/rectification-answer-choice.test.ts``frontend/tests/rectification-v9-agent.test.ts``frontend/tests/rectification-collect-prompt.test.ts``frontend/tests/agent-voice-copy-contract.test.ts`(机器词表含「领先」「落后」)。
- 防复发:用户可见旁白不得出现「领先」「落后」。证据轮落库不得含价值评价四词。方法句不得回到气泡正文。
- 相关记录:BUG-545、BUG-585
- 复发自:无
- 修复版本:`aa7ccb30`
## BUG-607 | 长报告页分盘标题下没有图
- 状态:resolved