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
- 复发自:无
- 修复版本:待发布
@@ -1,46 +1,41 @@
# PROGRESS · 打开历史校正不再改名(BUG-6992026-09-15
# PROGRESS · 校正会话列表身份(BUG-699 / 704 / 7052026-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` 继承
任务 12、4BUG-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`
任务 5BUG-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 执行后回填。
任务 6BUG-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-700703,星历页占了 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 / 7092026-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-702704。七政单已占 700703,星历占 707。落地号 **706 / 708 / 709**
+3 -3
View File
@@ -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 不一致,9011023 是混合态(BUG-696);报告域 720/760/860 三个断点互不对齐,761–860 目录已塌、正文还是桌面(BUG-697)。含断点白名单契约测试。**串行在 chat-reading-load 之后** | 已验收 | `6c748d86`BUG-695697 |
| `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.0Apache-2.0)归档 + API 镜像 Node runtime + 七政适配器(计都派别与宿度坐标系参数化、boundary 按实测重写)+ 三个只读端点 `/api/qizheng`、`/api/western`、`/api/ephemeris_events`。实证三条:四柱时柱按 UTC 算(BUG-700,本轮不修不调用)、`ketuMode` 写死未暴露(BUG-701)、boundary 把空神煞与未闭合庙旺说成已生成(BUG-702)。BUG 段 700703 | 已推 `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 段 704706 | 待验收 | `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 落地占用了 704706 / 708709 | 待验收 | `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 段 707709 | 待验收 | `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+ | 待领取 | — |
@@ -1,6 +1,6 @@
# 真机 / 浏览器清单 · 打开历史校正不得改名(2026-09-15)
代码级合同在 `frontend/tests/session-open-preserves-identity.test.ts`。下面必须用已登录的 staging 看。截图不要带真实姓名、出生资料或会话正文。
代码级合同在 `frontend/tests/session-open-preserves-identity.test.ts``session-lookup-unlisted.test.ts`。下面必须用已登录的 staging 看。截图不要带真实姓名、出生资料或会话正文。
地址:`https://staging.jyotisha.chat`
@@ -29,6 +29,21 @@
2. 点首页校正卡。
3. **看:** 标题和位置都不变,与 A 相同。
## D. 校正答题推进排序(BUG-704)
1. 打开一条不在「今天」最上面的历史校正。
2. 答一道题或点一个选项。
3. **看:** 它出现在「今天」最上面。
4. 再打开同一条但不答题。**看:** 位置不再因为打开而变。
## E. 不在首页的 `?c=`BUG-705
1. 找一条排在第 40 条之后、或因很久没动而不在当前列表里的会话。
2.`/?c=<它的 id>` 直接打开。
3. **看:** 能进入这条对话,地址栏 `?c=` 还在,没有「该对话不存在或已被删除」。
4. 侧栏里这条是当前项(高亮)。
5. 用一个确认不存在的 UUID 打开。**看:** 这时才出现「该对话不存在或已被删除」,`?c=` 被清掉。
## 结论
> 待填。测完写日期 + 设备 + 浏览器 + 逐条正常/有问题。
@@ -0,0 +1,35 @@
# 真机 / 浏览器清单 · 范围卡上没有参考题入口(2026-09-15)
代码级合同在 `frontend/tests/rectification-tiebreak-card-loss-20260915.test.ts`。下面必须用已登录的 staging 走完一次校正到范围卡。截图不要带真实姓名、出生资料或会话正文。
地址:`https://staging.jyotisha.chat`
## A. 出卡前先问参考题
1. 新开一条生时校正,把带年月的经历问到范围卡即将出现。
2. **看:** 若风格参考题可用,卡出来之前会先出现最多两道带 A/B/C/D 的选择题(相处方式 / 做事风格)。
3. **看:** 这些题不是一行裸题。建不出选项时这道题根本不出现,而不是退化成打字题。
## B. 范围卡上没有第二条路
1. 走到范围卡。
2. **看:** 卡上没有「再答两道参考题」或任何同类按钮。
3. **看:** 三列「相对可能性 %」还在。「更像这个」还在。
## C. 旁白没有内部计分词
1. 读范围卡上面那句交付旁白。
2. **看:** 没有「相对支持度」「概率」「置信度」。
3. **看:** 若说分盘题不再问,卡上确实也没有再问的按钮。
## D. 有活题时卡还在
若测试环境仍能构造「范围卡已在 + 一条未答题」:
1. **看:** 范围卡没有消失。
2. **看:** 「更像这个」点不了,并写「先答完上面这道,再选时间」。
3. 答完或跳过该题后,采用按钮恢复。
## 结论
> 待填。测完写日期 + 设备 + 浏览器 + 逐条正常/有问题。