fix(chat): keep rectification sessions findable and keep the delivery card
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:
@@ -1,46 +1,41 @@
|
||||
# PROGRESS · 打开历史校正不再改名(BUG-699,2026-09-15)
|
||||
# PROGRESS · 校正会话列表身份(BUG-699 / 704 / 705,2026-09-15)
|
||||
|
||||
- 执行分支:`codex/rectification-open-retitles-session-20260915`
|
||||
- 工作树:`.worktrees/rectification-open-retitles-session-20260915`
|
||||
- 基线:`origin/staging` @ `224244c0`(任务书写 `ff5023a2`;其后一笔是本任务书)
|
||||
- 执行分支:`codex/rectification-p0-20260915`(与交付卡单同一分支,两单文件几乎不重叠,一次推 staging)
|
||||
- 工作树:`.worktrees/rectification-p0-20260915`
|
||||
- 基线:rebase 后 `origin/staging` @ `d3a2c48b`
|
||||
|
||||
## 做了什么
|
||||
|
||||
任务 1:`openRectificationCase` 用 `rectificationOpenIdentity(existing, minted)`。已有会话的 `title` / `updatedAt` 全等于 `existing`;新建才 `resolveSessionTitle` + `timestamp()`。`pinned` / `archivedAt` 仍从 `existing` 继承。
|
||||
任务 1–2、4(BUG-699)此前已由 `2d7698ea` 合入 staging。本轮补任务 5 / 6 与任务 3 的 `updated_at` 回填。
|
||||
|
||||
任务 1.3 `messages: []`:**无害,保持原样。** `persistSession` 的 update 分支不写 `messages`,服务端对话不受影响。校正面从 turns 渲染。
|
||||
任务 1.3 `messages: []`:**无害,保持原样。** `persistSession` 的 update 不写 `messages`,也不写 `updated_at`。
|
||||
|
||||
任务 2.1:`session-open-preserves-identity.test.ts` 断言 existing 命中时 identity 全等、未命中才用 minted,并锁 hook 里 `merged` 只用 `openIdentity`。
|
||||
任务 5(BUG-704):新增迁移 `20260915010000_rectification_touch_chat_session.sql`。`agentic_rectification_cases.last_activity_at` 推进时,触发器把对应 `chat_sessions.updated_at` 推到同一时刻,且不得回拨。打开 / GET / 元数据 PATCH 不碰 `last_activity_at`,因此不 bump。`persistSession` 仍不写 `updated_at`。
|
||||
|
||||
任务 2.2:同一文件扫 `frontend/src/hooks/` 与 `frontend/src/lib/` 里带 `id` + `sessionType`/`messages` 的对象字面量,禁止无条件 `updatedAt: timestamp()`(`randomUUID` 新建除外)。把 1.1 改回 `updatedAt: timestamp()` 后这两条变红,已改回,未提交破坏。
|
||||
任务 5.3 / 任务 3:运维脚本 `frontend/scripts/repair-rectification-session-titles.mjs` 同时统计并(`--apply`)修:
|
||||
|
||||
任务 2.3:`SessionTitleOptions.at` 与 `resolveSessionTitle` 默认 `new Date()` 处加了注释:只能用于新建。
|
||||
1. 日期标题与 `created_at` 的 Asia/Shanghai 月日不一致的校正会话(原任务 3)。
|
||||
2. `updated_at` 早于最后一条 turn / `last_activity_at` 的校正会话。
|
||||
|
||||
任务 3:修回逻辑在 `rectification-session-title-repair.ts`,运维脚本 `frontend/scripts/repair-rectification-session-titles.mjs`(默认只读 `--check`,`--apply` 才写)。幂等,只动匹配正则且月日与 `created_at` 的 Asia/Shanghai 不一致的行。本机没有 `SCHEMA_DATABASE_URL`,**staging 未跑**,损坏面数字待产品在 staging 执行后回填。
|
||||
默认只读。本机没有 `SCHEMA_DATABASE_URL`,**staging 未跑**,损坏面数字待产品在 staging 执行后回填。
|
||||
|
||||
任务 6(BUG-705):`resolveBootstrapSessionSelection` 对未出现在已加载页的合法 UUID 返回 `lookup`,不再直接 `missing`。`resolveLookupBootstrap` 调 `GET /api/sessions/{id}`:200 并进列表并选中;404 才 `SESSION_MISSING_NOTICE` 并清 `?c=`;5xx 保留 URL,提示「这条对话暂时读不到,请稍后重试。」popstate 走同一条 lookup。非法 `?c=` 仍立即 missing。
|
||||
|
||||
任务 6.3 侧栏高亮:lookup 命中后 `mergeHydratedSession` 把该会话并进本地列表,`visibleSessions` 再 `sortSessions`,当前项可以高亮。不依赖无限滚动把它翻出来。无限滚动本身未改。
|
||||
|
||||
## 测试数字
|
||||
|
||||
| | `test(` 声明(`git grep -E '^test\(' -- frontend/tests`) |
|
||||
| --- | ---: |
|
||||
| 基线 `224244c0` | 3213 |
|
||||
| 改后 | 3221(+4 identity,+4 title-repair) |
|
||||
|
||||
定向:`session-open-preserves-identity` 4 pass;`rectification-session-title-repair` 4 pass。破坏性复核:把 `merged.updatedAt` 改回 `timestamp()` 后 identity 源码合同与跨文件时钟合同变红。
|
||||
|
||||
`tsc --noEmit` 0 错。`npm run lint` **0 error** / 120 warning(既有,未动)。
|
||||
|
||||
本机 Windows 全量 TAP 仍受 CRLF / Skill 软链 / Docker 影响,不能当作 Linux 27 的证据。
|
||||
|
||||
## 任务 1.3
|
||||
|
||||
`persistSession` update 字段是 title / theme / model_id / chart_profile_*,不含 messages,也不含 `updated_at`。结论:清空本地 `messages` 再 hydrate turns 对服务端无害,不改。
|
||||
定向见本提交的前端测试。全量 `npm test` 数字写在同分支的交付卡 PROGRESS。
|
||||
|
||||
## 生产 `7b620c7a`
|
||||
|
||||
该 SHA 没有 `use-rectification-surface.ts`。当时 `page.tsx` 的 `merged` 用固定标题「生时校正」,**没有**墙钟日期,也**没有** `persistSession(merged)`。生产不受「标题写成今天并写库」影响。`updatedAt: timestamp()` 当时只动客户端,刷新可恢复。任务 3 **不必在生产跑**。
|
||||
该 SHA 没有 `use-rectification-surface.ts`。当时 `page.tsx` 的 `merged` 用固定标题「生时校正」,没有墙钟日期,也没有 `persistSession(merged)`。生产不受「标题写成今天并写库」影响。任务 3 **不必在生产跑**。BUG-704 / 705 的代码路径当时也不同;生产是否要跑 `updated_at` 回填由产品定,默认不必。
|
||||
|
||||
## 编号冲突
|
||||
|
||||
任务书预占 BUG-700 / 701。七政单随后写入了 BUG-700~703,星历页占了 BUG-707。本轮落地号:**BUG-704**(校正 `updated_at`)、**BUG-705**(`?c=` lookup)。交付卡单用 706 / 708 / 709。
|
||||
|
||||
## 偏离
|
||||
|
||||
- 任务 3 staging 核对 / 修补因本机没有库连接而未跑。脚本已落地。产品在 staging 跑:`node frontend/scripts/repair-rectification-session-titles.mjs` 看行数,确认后加 `--apply`。
|
||||
- CHANGELOG 写的是修回规则已交付;实际写库要等 staging 脚本跑完。
|
||||
- 任务 3 / 5.3 staging 核对因本机没有库连接而未跑。产品在 staging 跑:`node frontend/scripts/repair-rectification-session-titles.mjs` 看行数,确认后加 `--apply`。
|
||||
- 浏览器项见 `docs/testing/rectification-open-identity-20260915.md`,不得写成通过。
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
# PROGRESS · 交付卡参考题入口(BUG-706 / 708 / 709,2026-09-15)
|
||||
|
||||
- 执行分支:`codex/rectification-p0-20260915`(与会话列表单同一分支)
|
||||
- 工作树:`.worktrees/rectification-p0-20260915`
|
||||
- 基线:rebase 后 `origin/staging` @ `d3a2c48b`
|
||||
|
||||
## 做了什么
|
||||
|
||||
任务 1:删除交付卡上的「再答两道参考题」按钮、`onTieBreak` prop、`.rectification-range-delivery__tie-break` CSS,以及聊天组件里的客户端 `requestTieBreak`。
|
||||
|
||||
`POST /api/rectification/cases/[caseId]/tie-break` 与 `requestTieBreakPersonality` **保留**。前置收集走 `persistNextInterviewIfIdle` / `persistNextInterviewAfterChoice` 的 `heldForTieBreak` → `tieBreakPersonalityFollowup`,不经过客户端按钮。`rangeDeliveryTieBreakEntry` 仍用作该 RPC 写入 turn 的 userMessage,所以文案保留。`tie_break_available` 字段保留,不再驱动按钮。
|
||||
|
||||
任务 2(选 2.1):`applyLiveCandidateOffer` 不再因为有未答题就剥掉 `candidateOffer`。`showSelectionCards` 也不再因此藏卡。有活题时「更像这个」置灰,并写「先答完上面这道,再选时间」。理由:用户已经走到交付,范围和三列必须仍可见;置灰采用比整卡消失有出口。
|
||||
|
||||
任务 3:`tieBreakPersonalityFollowup` 在 followup 的 `style_options` 非空时过 `vargaStyleFollowupRenderable`(`completeStyleOptions` + `canRenderYearlessChoice`,与 `buildChoiceCard` 同一套)。`persistFocusAfterChoice` 对不可渲染的 `varga_style` 直接 skipped。前端 `interviewChoiceCardUnavailable` 把没有卡的 `varga.*` 题号也当成死题,走既有 repair-exit,不画裸题。
|
||||
|
||||
任务 4:`MACHINE_VOICE_LEXICON` 与 `validateAdoptNarration` 都拦「相对支持度」。采用旁白指令改为「这两个时间按现有信息分不开」,不再授权念内部计分。yearless stop fact 改为「没有年份的分盘题按现有信息分不开」。卡上「相对可能性 %」未动。
|
||||
|
||||
## 测试数字
|
||||
|
||||
基线 `origin/staging` @ `d3a2c48b`:`test(` 3247。改后 3255(+3 lookup,+4 交付卡,+1 迁移合同)。本机 Windows 全量 TAP 仍受 CRLF / Skill 软链 / Docker 影响,不能当作 Linux 27 的证据。
|
||||
|
||||
改既有断言三栏:
|
||||
|
||||
| 文件 | 原值 | 新值 | 原因 |
|
||||
| --- | --- | --- | --- |
|
||||
| `rectification-candidate-offer-anchor.test.ts` | 未答题时剥掉 offer | 交付消息上的 offer 留下 | BUG-706 |
|
||||
| `rectification-range-delivery-20260907.test.ts` | 按钮在 available 时出现 | 卡上永远没有该按钮 | BUG-706 |
|
||||
| `agent-voice-copy-contract.test.ts` | 卡源码引用 `rangeDeliveryTieBreakEntry` | 卡不再引用 | BUG-706 |
|
||||
| `chat-session-url.test.ts` | 未列出的 UUID 直接 missing | `lookup` | BUG-705 |
|
||||
|
||||
## 偏离
|
||||
|
||||
- 任务 3.2 服务端写焦点前的同门已做(`persistFocusAfterChoice` + followup 可渲染性)。
|
||||
- 浏览器项见 `docs/testing/rectification-tiebreak-card-loss-20260915.md`,不得写成通过。
|
||||
- 任务书预占 BUG-702~704。七政单已占 700~703,星历占 707。落地号 **706 / 708 / 709**。
|
||||
@@ -120,8 +120,8 @@
|
||||
| `TASK-chat-reading-load-20260915.md` | `PROGRESS-chat-reading-load-20260915.md` | 首页主题卡下线 + 回答两层可见性 + 折叠层宽表可横滑 + 输入框 16px。内容一字不删。⚠️ BUG-630 走查路径失效 | 已验收(2 条契约测试未通过,见修复单) | `8144fca2` |
|
||||
| `TASK-mobile-touch-and-breakpoints-20260915.md` | `PROGRESS-mobile-touch-and-breakpoints-20260915.md` | 消息操作按钮触屏命中区 27×34、相邻仅隔 1px(BUG-695);CSS 平板上限 900px 与 `sidebarViewportForWidth` 的 1024 不一致,901–1023 是混合态(BUG-696);报告域 720/760/860 三个断点互不对齐,761–860 目录已塌、正文还是桌面(BUG-697)。含断点白名单契约测试。**串行在 chat-reading-load 之后** | 已验收 | `6c748d86`(BUG-695~697) |
|
||||
| `TASK-chat-reading-load-fix-20260915.md` | `PROGRESS-chat-reading-load-fix-20260915.md` | **验收修复单**:`chat-bundle-splitting-contract`(`message-markdown` 包裹数 1→2、`plainParagraphs(spoken)` 字面量已不存在)与 `chat-navigation-a11y-contract`(`window.location.assign("/login")` 4→3,建议问题入口删除带走一处)两条既有断言被本轮打红且未更新;Linux 全量 27→29。只改测试不改产品代码 | 待验收 | `codex/chat-reading-load-fix-20260915` |
|
||||
| `TASK-rectification-open-retitles-session-20260915.md` | `PROGRESS-rectification-open-retitles-session-20260915.md` | **P0 复发单**:点侧栏历史校正会话,`openRectificationCase` 无条件用墙钟重算 `title` 并把 `updatedAt` 盖成此刻(同一处 `pinned`/`archivedAt` 却从 `existing` 继承了),`persistSession` 把改名写回服务端 → 12 号的会话被改成「9月15日 · 生时校正」并顶到列表最前。标题**永久损坏**、排序刷新可恢复。复发自 BUG-553(其防复发只是一句话,无测试执行,且没覆盖校正 open 路径)。含历史标题按 `created_at` 修回(BUG-699);另两条:校正答题从不推进 `chat_sessions.updated_at`,会话边用边下沉、名字是今天而位置是旧日期(BUG-700);`?c=` 只比对已加载那一页,翻不到就报「该对话不存在或已被删除」并清掉 URL(BUG-701) | 待验收 | `codex/rectification-open-retitles-session-20260915` |
|
||||
| `TASK-rectification-tiebreak-card-loss-20260915.md` | — | **P0**:点交付卡上「再答两道参考题」,新写的未答题让 `applyLiveCandidateOffer` 把 `candidateOffer` 从每条消息剥掉 → 卡整条消失(BUG-702);按钮可用判据(`tieBreakPersonalityAvailable`)与题目可渲染判据(`buildChoiceCard` 的 `styleOptions.ok`)不一致 → 题目渲染成没有选项的裸题,两条路都断(BUG-703);交付旁白写「相对支持度都是 16」违反 VOICE 禁用词,且自称不再问分盘题却同时提供分盘题入口(BUG-704)。产品重申:**卡上不要这个按钮,出卡前收集、以卡结算** | 待领取 | `codex/rectification-tiebreak-card-loss-20260915` |
|
||||
| `TASK-rectification-open-retitles-session-20260915.md` | `PROGRESS-rectification-open-retitles-session-20260915.md` | **P0**:打开历史校正改名(BUG-699,`2d7698ea` 已合入)+ 校正答题不 bump `updated_at`(BUG-704)+ `?c=` 不在当前页就报已删除(BUG-705)+ 标题/`updated_at` 回填脚本 | 待验收 | `codex/rectification-p0-20260915` |
|
||||
| `TASK-rectification-tiebreak-card-loss-20260915.md` | `PROGRESS-rectification-tiebreak-card-loss-20260915.md` | **P0**:点卡上「再答两道参考题」交付卡消失(BUG-706);按钮亮但选项建不出变成裸题(BUG-708);旁白写「相对支持度」并与卡上入口打架(BUG-709)。卡上入口删除,出卡前收集,有活题时卡留下、采用置灰 | 待验收 | `codex/rectification-p0-20260915` |
|
||||
| `TASK-settings-dialog-size-and-nav-20260915.md` | — | **复发单**:设置弹窗四个分区尺寸仍随内容跳变(BUG-698,复发自 BUG-554——旧防复发只查「有没有写 height」,查不到「写了没生效」);首要嫌疑是 `.settings-modal` 的 `dvh` 没有 `vh` 回退,不支持时整条 `height` 作废退化成内容高度,需先复现确认。另按产品要求去掉分区菜单左侧强调条,并拆开与悬停共用的选中态 | 待领取 | `codex/settings-dialog-size-and-nav-20260915` |
|
||||
|
||||
### 个人报告
|
||||
@@ -223,7 +223,7 @@
|
||||
| `TASK-rectification-house-lord-gochara-research-20260913.md` | `PROGRESS-rectification-house-lord-gochara-research-20260913.md` | 研究单:宫主触发与木星/土星过运(合冲本命宫主、罗睺紧密合、年精度、用于 block 选上升)四种放宽,20 例公开 AA 离线量 block 层与 minute 层两组指标;引擎里已有宫主/功能吉凶/受控过运,只量缺的四条 | 待验收(无收益,关闭;不立实现单) | `codex/rectification-house-lord-gochara-research-20260913` |
|
||||
|
||||
| `TASK-qizheng-native-chart-20260915.md` | `PROGRESS-qizheng-native-chart-20260915.md` | **后端单(独占 `scripts/jyotish_api_server.py`)**:vendored `stem-branch` 0.8.0(Apache-2.0)归档 + API 镜像 Node runtime + 七政适配器(计都派别与宿度坐标系参数化、boundary 按实测重写)+ 三个只读端点 `/api/qizheng`、`/api/western`、`/api/ephemeris_events`。实证三条:四柱时柱按 UTC 算(BUG-700,本轮不修不调用)、`ketuMode` 写死未暴露(BUG-701)、boundary 把空神煞与未闭合庙旺说成已生成(BUG-702)。BUG 段 700–703 | 已推 `origin/staging` `e776cf9d` | `codex/qizheng-native-chart-20260915` |
|
||||
| `TASK-chart-page-20260915.md` | `PROGRESS-chart-page-20260915.md` | **前端单(独占 `app-sidebar.tsx`,同时加星盘与星历两个入口)**:P0 只读星盘页,五个 Tab(星盘 / 基础信息 / 大运 / 西洋盘 / 七政四余),中宫排盘参数卡,三套坐标系各自标注且禁止互相换算。不扣点不调模型不出 spinner;不碰 `page.tsx`(1951/2000);**不搬 `vedic-chart-svg.tsx`**(rectification-board 也在用)。BUG 段 704–706 | 待验收 | `codex/chart-page-20260915` |
|
||||
| `TASK-chart-page-20260915.md` | `PROGRESS-chart-page-20260915.md` | **前端单(独占 `app-sidebar.tsx`,同时加星盘与星历两个入口)**:P0 只读星盘页,五个 Tab(星盘 / 基础信息 / 大运 / 西洋盘 / 七政四余),中宫排盘参数卡,三套坐标系各自标注且禁止互相换算。不扣点不调模型不出 spinner;不碰 `page.tsx`(1951/2000);**不搬 `vedic-chart-svg.tsx`**(rectification-board 也在用)。任务书预占 704–706,Bug 历史未写入;校正 P0 落地占用了 704–706 / 708–709 | 待验收 | `codex/chart-page-20260915` |
|
||||
| `TASK-ephemeris-page-20260915.md` | `PROGRESS-ephemeris-page-20260915.md` | **前端单**:P1 星历页,今日五要素 + 当日行运(相对本命宫位)+ 未来九十天换座与停滞,底部「带这天去提问」出口。页面不得出现任何运势判断。含实证缺陷:panchanga 写死 Lahiri 与账户 Raman 分裂(关联 BUG-703;本单标注为 BUG-707)。侧边栏入口由 chart-page 单交付。BUG 段 707–709 | 待验收 | `codex/ephemeris-page-20260915` |
|
||||
| `TASK-api-server-decomposition-20260916.md` | `PROGRESS-api-server-decomposition-20260916.md` | **重构单(串行在 qizheng 单之后)**:把业务逻辑搬出 `JyotishAPIHandler`。核心不是行数,是全仓 3 处靠 `JyotishAPIHandler.__new__` 伪造空壳 handler 借方法(`consultation_workflow_service` ×2、`capture_report_blocked_repairs_golden`、`local_accuracy_report`,MCP 也走这条),依赖方向反了、handler 没有 `headers`/`wfile` 随时可炸。四阶段:拆 `__new__` 后门 → 抽 ≥150 行业务方法 → `do_POST`/`do_GET` 改路由表 → 重新冻结行数 baseline(余量 300→50)。纯搬运不改行为,`test_api_server_security.py` 3841 行断言一条不许改。预计 11,314 → 约 9,230 行。BUG 段 710+ | 待领取 | — |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user