fix(sessions): title rectification chats with the result time
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
# PROGRESS 校正会话标题改为结果时间(2026-09-25)
|
||||
|
||||
- 任务书:`docs/tasks/TASK-rectification-session-title-result-20260922.md`
|
||||
- 分支:`codex/rectification-session-title-result-20260922`
|
||||
- 基线:`514951d7`(开工时 `origin/staging`)
|
||||
- 状态:实现完成,待验收。未 push。
|
||||
|
||||
## 做了什么
|
||||
|
||||
- 新增 `frontend/supabase/migrations/20260925010000_rectification_session_title_result.sql`。没有抄到 `frontend/db/migrations`(校正迁移只在 supabase,runner 会扫该目录)。
|
||||
- 标题算式只在 `public.rectification_session_title(time, time, jsonb)`。已确认优先于已采用;范围原样拼接,中间是 U+2013 EN DASH;否则 `生时校正`。`to_char(..., 'HH24:MI')`。`immutable` / `parallel safe` / `search_path = ''`,不读表。
|
||||
- 自动派生判据只在 `public.rectification_session_title_is_automatic(text)`。触发器与回填都调它。
|
||||
- 触发器 `agentic_rectification_cases_title_from_result`,函数 `public.sync_rectification_session_title_from_case()`。只挂 `accepted_time`、`confirmed_time`、`candidate_range`。不写 `updated_at`。没有改 `touch_chat_session_from_rectification_case`。
|
||||
- 回填 update 用同一对函数。测试从迁移文件的标记之间切出该语句执行,没有手抄。
|
||||
- `resolveSessionTitle` 对校正入口和校正交接问句返回 `生时校正`。`datedSessionTitle` 只剩今日节奏调用者,注释写明。
|
||||
- `DATED_ENTRY_TITLE` 扩到三种自动派生形态,并认得今日节奏的日期形态。连字符范围不是自动派生。
|
||||
- 删了 `frontend/src/lib/rectification-session-title-repair.ts` 和 `frontend/tests/rectification-session-title-repair.test.ts`。它们只服务已被本单取代的「按创建日把标题改回日期」助手,生产代码没有引用。历史脚本 `frontend/scripts/repair-rectification-session-titles.mjs` 仍被 `rectification-session-title-repair-migration.test.ts` 用来锁 `20260916020000` 的逐字合同,`--apply` 本来就会报错,没有改成新口径,也没有改历史迁移。脚本头注明不得执行 `TITLE_APPLY_SQL`。
|
||||
- open 路径一个字没动(D4 / BUG-699)。
|
||||
|
||||
## 断言三栏
|
||||
|
||||
| 原值 | 新值 | 原因 |
|
||||
| --- | --- | --- |
|
||||
| `resolveSessionTitle` 校正入口 `生时校正 · 8月22日` | `生时校正` | BUG-1001:新建不带日期,结果由触发器写;今日节奏仍是 `今日节奏 · 8月22日` |
|
||||
| `session-list-filter` 夹具标题 `生时校正 · 9月14日` | `生时校正 · 05:07` | 例子改成结果时间。该断言只锁是否入列,不锁标题格式 |
|
||||
| `shouldGenerateSessionTitle("生时校正", consultation)` 为 true(经 generic 前缀,未单测) | false | `DATED_ENTRY_TITLE` 现在认得裸「生时校正」和结果时间,模型不得覆盖自动标题。校正会话仍恒 false |
|
||||
|
||||
删掉的旧修补测试(任务书允许,T5 已取代):`dated titles use the product calendar, not UTC`、`repair rewrites a wall-clock today stamp back to created_at's local date`、`repair leaves matching dates and user-renamed titles alone`、`missing created_at falls back to a dateless title instead of guessing`。
|
||||
|
||||
## T4 故意改红
|
||||
|
||||
把迁移里 `rectification_session_title_is_automatic` 正则的范围间隔号 U+2013 改成连字符 `-`(一个字符)。`rectification-session-title-parity.test.ts` 转红(`not ok`,正则不再含 EN DASH)。已撤回,复跑 `ok`。未提交该改动。
|
||||
|
||||
## 验证
|
||||
|
||||
| 项 | 结果 |
|
||||
| --- | --- |
|
||||
| `npx tsc --noEmit` | 0 错 |
|
||||
| `npm run lint` | 0 error,121 warning。本单改动的文件没有新增 warning。121 是当前树上的既有数,超过任务书 119 的上限,按「不修无关 warning」没有动 |
|
||||
| 定向:`agent-reply`、`session-title-agent`、`rectification-session-title-parity`、`rectification-session-title-repair-migration`、`session-list-filter` | 23/23 通过 |
|
||||
| `database-rectification-session-title-result.test.ts` | 真实 Postgres 1/1 通过(约 30s)。四分支、`provolatile=i`、采用/收窄不改 `updated_at`、手改名不覆盖、touch 与标题触发器互不干扰、回填 5 行、重跑 0 行、六行 `updated_at`/`pinned`/`messages` 不变。套在 `npm run test:db` 里仍是 `ok 41` |
|
||||
| `npm run test:db` | 跑完,exit 1。48 条里 13 过、35 红。红的是既有 Windows 缺口:双目录扫描 `duplicate migration filename: 20260814025000_personal_report_document_v2.sql`,以及 backup 测试的 WSL `execvpe(/bin/bash)`。不是本单 SQL。地址池没有耗尽 |
|
||||
| 全量 `npm test` | 未跑。这台 Windows 有已知 Docker/EPERM 基线失败,定向已绿 |
|
||||
| `npm run build` | 失败。Turbopack 报 worktree `node_modules` junction 指向文件系统根之外。`npx next build --webpack` 编译成功(69s),收集页面时在 `/api/daily-starlanguage` 与 `/api/rectification/agent` 因 Skill symlink EPERM 中断,没有打出路由表。`/` 是否仍 Static、首屏 gzip 本机测不到。这是既有 Windows 缺口,不是本单源码错误 |
|
||||
| Python `tests/test_daily_and_rectification_entrypoints.py` | 未跑。`G:\Ferti\Jyotisha\.venv\Scripts\python.exe` 不存在,没有装依赖。开工已看过该文件,只断言裸字符串「生时校正」,新格式仍满足 |
|
||||
|
||||
Windows 上 `frontend/db/migrations` 里 4 个 Git symlink 被检出成相对路径文本,标准双目录扫描报 `duplicate migration filename: 20260814025000_personal_report_document_v2.sql`。定向数据库测试先走标准 runner;只有撞上这个既有错误时,才把真正的 SQL 逐字节抄到临时目录(跳过占位文本,重复真文件必须一致),再用 `MIGRATIONS_DIRECTORY` 跑同一个 `scripts/db-migrate.mjs`。Linux 门禁 symlink 不是普通文件,第一条路径就会成功。没有改 runner。
|
||||
|
||||
## 未改 / 未验证
|
||||
|
||||
- 没有 push,没有改 workflow,没有动 `page.tsx`、咨询 status 路由、SVG height。
|
||||
- open 之后客户端仍会 `persistSession` 写本地 minted 标题「生时校正」。任务书要求 open 路径不动。插入触发器先写成范围标题,这次 PATCH 可能把它写回「生时校正」,直到下一次 `accepted_time` / `confirmed_time` / `candidate_range` 变化再由触发器写回。刷新后的列表读的是库里的标题;已加载列表再打开时,本地标题与库一致,不会改回去。
|
||||
- 连字符范围 `生时校正 · 05:00-05:15`:SQL 不覆盖。`isAutoDerivedSessionTitle` 仍可能为 true,因为 `isGenericSessionTitle` 的「生时校正」前缀比本单三种形态更宽。对断表没有把这一条算进「必须相同」的那一组。`DATED_ENTRY_TITLE` 不认连字符。
|
||||
- 首屏 gzip 基线未测到。`npm run build` 在 junction 上 Turbopack panic;`next build --webpack` 编译过了,但页面收集被 Skill symlink EPERM 打断,没有路由表,不能宣称 `/` 仍是 Static。
|
||||
- 浏览器走查未做。
|
||||
@@ -33,7 +33,7 @@
|
||||
|
||||
| 任务书 | 进度 | 主题 | 状态 | 落点 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| `TASK-rectification-session-title-result-20260922.md` | — | **校正会话标题改写结果(BUG-1001)**:BUG-988 把副标题改成最后活动时间后,标题里的日期成了重复;而 BUG-929 删掉 `uniquifySessionTitle` 之后,`resolveSessionTitle` 对校正入口只返回 `生时校正 · M月D日`,**同一天多条标题完全相同**(真机截图:9/17 三条同名、9/16 两条同名、9/14 一天 5 条);旧标题的钟点后缀是创建时间、副标题是最后活动时间,同一行两个对不上的时间。**产品 09-22 拍板**:D1 标题改为承载结果——有 `accepted_time`/`confirmed_time` 写 `生时校正 · HH:MM`,否则写 `candidate_range` 的 `生时校正 · HH:MM–HH:MM`(推翻 BUG-929 的日期口径,但「不得再加墙钟去重后缀」保留);D2 存量批量重算(推翻 BUG-929「旧标题不批量改」,先例 `20260916020000_rectification_session_title_repair.sql`);D3 今日节奏保留日期(我判定的例外);D4 只在结果变化时改 title,`open` 路径不动(对 BUG-699 边界的有限扩展)。**红线**:任何写标题的路径都不得 bump `updated_at`(否则 13 条历史会话集体跳顶、毁掉 BUG-988);标题算式必须只有一处实现(一个 SQL 函数,触发器与回填共用)——BUG-987/992 都栽在「两层规则各写一份」。T4 跨层对断不得让步。已 grep 出真正受影响的只有 7 个文件,Python 侧只查裸字符串、无需改。BUG 段 1001 起 | 待领取 | — |
|
||||
| `TASK-rectification-session-title-result-20260922.md` | `PROGRESS-rectification-session-title-result-20260922.md` | **校正会话标题改写结果(BUG-1001)**:BUG-988 把副标题改成最后活动时间后,标题里的日期成了重复;而 BUG-929 删掉 `uniquifySessionTitle` 之后,`resolveSessionTitle` 对校正入口只返回 `生时校正 · M月D日`,**同一天多条标题完全相同**(真机截图:9/17 三条同名、9/16 两条同名、9/14 一天 5 条);旧标题的钟点后缀是创建时间、副标题是最后活动时间,同一行两个对不上的时间。**产品 09-22 拍板**:D1 标题改为承载结果——有 `accepted_time`/`confirmed_time` 写 `生时校正 · HH:MM`,否则写 `candidate_range` 的 `生时校正 · HH:MM–HH:MM`(推翻 BUG-929 的日期口径,但「不得再加墙钟去重后缀」保留);D2 存量批量重算(推翻 BUG-929「旧标题不批量改」,先例 `20260916020000_rectification_session_title_repair.sql`);D3 今日节奏保留日期(我判定的例外);D4 只在结果变化时改 title,`open` 路径不动(对 BUG-699 边界的有限扩展)。**红线**:任何写标题的路径都不得 bump `updated_at`(否则 13 条历史会话集体跳顶、毁掉 BUG-988);标题算式必须只有一处实现(一个 SQL 函数,触发器与回填共用)——BUG-987/992 都栽在「两层规则各写一份」。T4 跨层对断不得让步。已 grep 出真正受影响的只有 7 个文件,Python 侧只查裸字符串、无需改。BUG 段 1001 起 | 待验收 | `codex/rectification-session-title-result-20260922` |
|
||||
| `TASK-rectification-convergence-20260830.md` | `PROGRESS-rectification-convergence-20260830.md` | 收敛重构 v2 | 已验收 | `3a4396a4`、`86ba17ee` |
|
||||
| `TASK-rectification-decision-authority-20260831.md` | `PROGRESS-rectification-decision-authority-20260831.md` | 决策权威归一与停止语义 | 已合入 | `9f011194` |
|
||||
| `TASK-rectification-billing-20260831.md` | — | run_failed 与开场问题槽为空 | 已合入 | `47b4b06b` |
|
||||
|
||||
Reference in New Issue
Block a user