fix(chat): keep rectification sessions findable and keep the delivery card
Independent Staging Quality Gate / validate (push) Failing after 6m45s
Independent Staging Quality Gate / publish (push) Skipped

Rectification answers now advance chat_sessions.updated_at (BUG-704).
A ?c= id missing from the loaded page is fetched before anyone may call
it deleted (BUG-705). The range card no longer has a post-card tie-break
button; live questions leave the card visible with adopt locked
(BUG-706/708). Spoken copy bans 相对支持度 (BUG-709).

Task docs assigned 700-704; qizheng already took 700-703.
This commit is contained in:
jesse-ux
2026-09-15 17:10:53 +08:00
parent d3a2c48ba5
commit f51e494c5a
37 changed files with 799 additions and 177 deletions
+85 -5
View File
@@ -8560,8 +8560,8 @@
- 根因:`visibleSessions` 只按 `pinned` 排,开着页面时 `updatedAt` 变化不改位置。元数据 PATCH 和服务端 `metadataUpdateValues` 一律写 `updated_at = now()`,非对话操作也会把会话顶到列表头。真正该 bump 的是发问 / 回答落库。
- 修复:`sortSessions` 置顶优先、组内 `updatedAt` 倒序且稳定。元数据 PATCH 不再写 `updated_at`;客户端改名 / 收藏 / 归档 / 换模型 / 换资料不再 `timestamp()`。列表改为游标分页,历史按本地日期分组,侧栏标题去掉资料名前缀。
- 验证:`frontend/tests/session-groups.test.ts``session-cursor.test.ts``chat-session-write.test.ts``metadataUpdateValues` 不含 `updated_at`)、`sidebar-state.test.ts`(改名不 bump `updatedAt`)、`sidebar-contract.test.ts``chart-library-session.test.ts`
- 防复发:元数据 PATCH 不得写 `updated_at``updatedAt` 只由对话活动推进。侧栏历史排序必须置顶 + `updatedAt` 倒序,不得只按置顶。打开已有会话不得改 `title` / `updatedAt`,由 BUG-699 与 `frontend/tests/session-open-preserves-identity.test.ts` 执行。
- 相关记录:BUG-024、BUG-699
- 防复发:元数据 PATCH 不得写 `updated_at``updatedAt` 只由对话活动推进,校正答题也算(BUG-704。侧栏历史排序必须置顶 + `updatedAt` 倒序,不得只按置顶。打开已有会话不得改 `title` / `updatedAt`,由 BUG-699 与 `frontend/tests/session-open-preserves-identity.test.ts` 执行。`?c=` 不在已加载页时先问服务端(BUG-705)。
- 相关记录:BUG-024、BUG-699、BUG-704、BUG-705
- 复发自:无
- 修复版本:`a1956deb`
@@ -10689,8 +10689,8 @@
- 根因:性格题被设计成出卡后的可选入口。另:`varga_style` 被错误要求该领域账本有带年月事件作锚,答「没有」会连带关掉风格题。
- 修复:产品拍板放宽版 A(2026-09-14)。出卡前只要参考题可用且没用过就先连问最多两道 `varga_style`(不看分差;仍只 ±1、不淘汰)。删除风格题的事件锚点丢弃;分盘上升星座少于两种时该题仍不出现。仍平时卡上写「这两分钟按现有信息分不开,参考题已经用过。」用过之后不再显示入口按钮。
- 验证:`frontend/tests/rectification-tiebreak-before-card-20260914.test.ts`16/16 与 lead=2 都先问参考题;无事件锚点时风格题仍出现;两道用完才交付。
- 防复发:不得把性格题改成淘汰候选。不得为凑满两道而放宽「该分盘至少两种上升星座」。自动进入参考题时不得再写第二条交付消息。
- 相关记录:BUG-663、BUG-667、BUG-629、BUG-597
- 防复发:不得把性格题改成淘汰候选。不得为凑满两道而放宽「该分盘至少两种上升星座」。自动进入参考题时不得再写第二条交付消息。卡上入口已于 BUG-706 删除,前置收集是唯一路径。
- 相关记录:BUG-663、BUG-667、BUG-629、BUG-597、BUG-706、BUG-708
- 复发自:BUG-663(入口做成出卡后可选)
- 修复版本:待发布
@@ -10866,7 +10866,7 @@
- 修复:已有会话的 `title` / `updatedAt` 继承 `existing`,只有新建才 `resolveSessionTitle` + `timestamp()`。错日期标题按 `created_at` 的 Asia/Shanghai 月日修回;对不上正则的手改标题不动。
- 验证:`frontend/tests/session-open-preserves-identity.test.ts``rectification-session-title-repair.test.ts`。浏览器级验收见 `docs/testing/rectification-open-identity-20260915.md`。staging 标题修回行数见本单 PROGRESS。
- 防复发:构造可能作用于已有会话的 `ChatSession` 时,不得无条件写 `updatedAt: timestamp()``resolveSessionTitle``at` 默认墙钟,只能用于新建。
- 相关记录:BUG-553
- 相关记录:BUG-553、BUG-704、BUG-705
- 复发自:BUG-553
- 修复版本:待发布
@@ -10934,6 +10934,54 @@
- 复发自:无
- 修复版本:未修(investigating
## BUG-704 | 校正答题不推进 chat_sessions.updated_at,会话边用边下沉
- 状态:resolved
- 首次发现:2026-09-15
- 最近更新:2026-09-15
- 影响面:`agentic_rectification_cases.last_activity_at``chat_sessions.updated_at`、侧栏历史排序
- 用户现象:一条校正连着答几小时,侧栏位置仍停在创建那天。叠加上被改成今天的标题后,列表变成「名字是今天、排序是旧日期」。
- 触发条件:在生时校正里写 turn、点选、采用或停止。打开、刷新、改名、收藏不触发。
- 根因:复发自 BUG-553 的另一半。全仓只有咨询 RPC `append_consultation_question``chat_sessions.updated_at`。校正 turn 走 `append_agentic_rectification_turn` 等,只推 `agentic_rectification_cases.last_activity_at`,不碰会话表。`persistSession` 的 update 按 BUG-553 故意不写 `updated_at`
- 修复:`last_activity_at` 推进时触发器同步把对应校正会话的 `updated_at` 推到同一时刻,且不得回拨。历史冻结行按最后一条 turn / `last_activity_at` 回填。客户端 `persistSession` 仍不写 `updated_at`
- 验证:`frontend/tests/rectification-v9-migration.test.ts` 的 touch-session 迁移合同。浏览器级见 `docs/testing/rectification-open-identity-20260915.md`。staging 回填行数见本单 PROGRESS。
- 防复发:校正对话活动必须推进 `chat_sessions.updated_at`。元数据 PATCH、打开、刷新不得推进。不得为了修这个让 `persistSession` 重新写 `updated_at`
- 相关记录:BUG-553、BUG-699、BUG-705
- 复发自:BUG-553
- 修复版本:待发布
## BUG-705 | `?c=` 不在已加载页就被当成已删除
- 状态:resolved
- 首次发现:2026-09-15
- 最近更新:2026-09-15
- 影响面:`resolveBootstrapSessionSelection``GET /api/sessions/{id}`、首页 bootstrap、popstate
- 用户现象:刷新或从链接进入一条校正,提示「该对话不存在或已被删除」,地址栏 `?c=` 被清掉,侧栏也看不见。没有删除动作发生。
- 触发条件:目标会话不在当前已加载的 40 条里(常见于 BUG-704 把它压到旧日期),URL 仍带着它的 id。
- 根因:`listedIds` 只覆盖当前页。未命中就 `missing: true``replace-clear`。服务端单条 GET 存在却从未被问。
- 修复:合法 UUID 未在已加载页时改为 `lookup``GET /api/sessions/{id}` 200 则并进列表并选中;404 才宣告删除并清 URL;5xx / 网络失败保留 `?c=`,提示「这条对话暂时读不到,请稍后重试。」
- 验证:`frontend/tests/session-lookup-unlisted.test.ts``chat-session-url.test.ts`
- 防复发:不在已加载页不得等于已删除。`SESSION_MISSING_NOTICE` 只允许在服务端 404 之后出现。
- 相关记录:BUG-553、BUG-699、BUG-704
- 复发自:无
- 修复版本:待发布
## BUG-706 | 点卡上「再答两道参考题」后交付卡整张消失
- 状态:resolved
- 首次发现:2026-09-15
- 最近更新:2026-09-15
- 影响面:`applyLiveCandidateOffer``showSelectionCards`、区间交付卡
- 用户现象:范围卡在场时点「再答两道参考题微调排序」,卡消失,只剩一句确认语和一道没有选项的题,上一轮「范围在上面」也对不上了。
- 触发条件:交付卡上的参考题按钮;`requestTieBreak` 写入一道未答 `choice` / `collect_spoken`
- 根因:`applyLiveCandidateOffer``showSelectionCards` 只要有未答题就把每一条 `candidateOffer` 剥掉 / 整卡不画。守卫本意是有活题时不要同时诱导采用,但按钮就长在卡上,点一下必然丢卡。产品原意(BUG-686)是出卡前收集参考题,卡上这条路不该存在。
- 修复:删除卡上入口。有活题时卡留下,「更像这个」置灰并写「先答完上面这道,再选时间」。前置收集仍走 `requestTieBreakPersonality`
- 验证:`frontend/tests/rectification-tiebreak-card-loss-20260915.test.ts``rectification-candidate-offer-anchor.test.ts``rectification-range-delivery-20260907.test.ts`
- 防复发:任何抑制交付卡的守卫都必须有出口。不得再在交付卡上放参考题按钮。新写 turn 仍须并进对话区(BUG-685)。
- 相关记录:BUG-685、BUG-686、BUG-688
- 复发自:BUG-686(卡上保留了第二条路)
- 修复版本:待发布
## BUG-707 | 星历页五要素按 Lahiri,星盘页按账户岁差(默认 Raman)
- 状态:investigating
@@ -10949,3 +10997,35 @@
- 相关记录:BUG-703
- 复发自:无
- 修复版本:未修
## BUG-708 | 参考题按钮能亮,点开却是没有选项的裸题
- 状态:resolved
- 首次发现:2026-09-15
- 最近更新:2026-09-15
- 影响面:`tieBreakPersonalityAvailable``buildChoiceCard` / `canRenderYearlessChoice``interviewChoiceCardUnavailable`
- 用户现象:点参考题后出现「亲密关系里,你更接近哪一种相处方式?」,没有 A/B/C/D。交付卡已被 BUG-706 抹掉,两条路都断。
- 触发条件:`tieBreakPersonalityFollowup` 拿得到 followup,但 `styleOptions` 建不出或分盘上升星座少于两种。
- 根因:复发自 BUG-686。按钮只看 followup 非空;卡片渲染另走 `completeStyleOptions` + `canRenderYearlessChoice`。两个判据不一致。也落在 BUG-674 / BUG-675 的裸题家族上。
- 修复:followup 存在且同一套可渲染性判断通过,才算 available,才允许 persist。焦点已落库但没有 `choice_card` 时走既有 repair-exit,不画裸题。
- 验证:`frontend/tests/rectification-tiebreak-card-loss-20260915.test.ts``rectification-tiebreak-before-card-20260914.test.ts` 既有断言未减弱。
- 防复发:`tieBreakPersonalityAvailable` 必须复用 `vargaStyleFollowupRenderable`,不得再复制第三套条件。建不出选项的题不得提出,也不得渲染成裸题。
- 相关记录:BUG-686、BUG-674、BUG-675、BUG-706
- 复发自:BUG-686
- 修复版本:待发布
## BUG-709 | 交付旁白写「相对支持度」,并与卡上入口自相矛盾
- 状态:resolved
- 首次发现:2026-09-15
- 最近更新:2026-09-15
- 影响面:采用/交付旁白、`MACHINE_VOICE_LEXICON``validateAdoptNarration``VOICE.md`
- 用户现象:旁白写「没有年份的分盘题也不再问」「相对支持度都是 16」,同一屏卡上却摆着「再答两道参考题」。
- 触发条件:走到区间交付;Agent 旁白引用了内部计分词。
- 根因:采用旁白指令允许使用「相对支持度数字」。校验只拦未知数字,不拦禁用词。卡上仍保留参考题按钮,与「不再问」打脸。
- 修复:禁用词表与校验都拦「相对支持度」。指令改为「这两个时间按现有信息分不开」。卡上入口删除后,「不再问」与控件不再打架。卡上「相对可能性 %」保持不变。
- 验证:`frontend/tests/agent-voice-copy-contract.test.ts``rectification-tiebreak-card-loss-20260915.test.ts`
- 防复发:用户可见文案不得出现「相对支持度」。`MACHINE_VOICE_LEXICON``validateAdoptNarration` 双拦。
- 相关记录:BUG-706、BUG-686
- 复发自:无
- 修复版本:待发布