From 6dc6510c1b789399f9bc6c94b999b63d4e8bb381 Mon Sep 17 00:00:00 2001 From: Jesse_Chen Date: Thu, 24 Sep 2026 21:01:06 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20acceptance=20of=200e4dd0f4..f125fae0=20?= =?UTF-8?q?=E2=80=94=20gate=20red=20on=205=20contract=20tests,=20fix=20bri?= =?UTF-8?q?ef?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8 --- docs/BUG_HISTORY.md | 6 +- docs/tasks/README.md | 7 ++- docs/tasks/TASK-staging-gate-fix-20260924.md | 65 ++++++++++++++++++++ 3 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 docs/tasks/TASK-staging-gate-fix-20260924.md diff --git a/docs/BUG_HISTORY.md b/docs/BUG_HISTORY.md index 873830ea..67caf4cd 100644 --- a/docs/BUG_HISTORY.md +++ b/docs/BUG_HISTORY.md @@ -13564,7 +13564,7 @@ ## BUG-1021 | 慢网首页半揭幕,模型与账户状态脱节 -- 状态:resolved(本地 Windows/Node 20 定向合同与 TypeScript 验证通过;浏览器 Slow 3G、staging health 与部署证据待产品/协调方完成) +- 状态:investigating(Claude 2026-09-24 验收 `f125fae0`:实现逻辑符合任务书,但引入 5 条源码合同测试失败致门禁红、未部署,另 page.tsx +9 行违反增长红线;修复单 `TASK-staging-gate-fix-20260924.md`。执行方先前写的 resolved 撤回:未与基线逐条比对、无部署证据) - 首次发现 / 最近更新:2026-09-24。 - 影响面:首页账户、会话、模型目录、咨询状态 bootstrap 与重试。 - 现象 / 触发:Slow 3G 强刷首页,原 8 秒串行预算先显示云端超时;SessionListProvider 后到仍写账户/会话,页面可能揭幕为模型不可用、发送禁用并重新询问称呼的半成品。 @@ -13578,7 +13578,7 @@ ## BUG-1022 | 账户与点数首次打开慢且离线预取会误触发刷新 -- 状态:resolved(本地 Node 20 定向合同通过;浏览器与 staging 验收待完成) +- 状态:investigating(同 BUG-1021 修复单;另支付成功后订阅订单不刷新余额 P2) - 首次发现 / 最近更新:2026-09-24。 - 影响面:账户菜单、BillingPanel 动态分包、套餐接口与支付/兑换余额同步。 - 现象 / 触发:首次打开账户与点数需等待懒加载 chunk 和套餐请求;面板挂载还会重复请求完整 `/api/account`;指针悬停离线时动态 import reject 可能被全局 stale-client recovery 当作 ChunkLoadError 并整页刷新。 @@ -13592,7 +13592,7 @@ ## BUG-1020 | CRLF 普通报告下载保留图盘 JSON 围栏 -- 状态:blocked(本地修复已完成,staging 写入认证失败,待 staging 门禁与部署 health 复核) +- 状态:investigating(Claude 2026-09-24 验收:CRLF 正则与 LF 冻结锁、CRLF 仅差围栏的测试均通过,代码合格;因同批 `0e4dd0f4` 门禁红尚未部署,部署 health 核对后改 resolved) - 首次发现 / 最近更新:2026-09-24。 - 影响面:旧普通Markdown下载与新分块导出的正文组。 - 现象 / 触发:真实引擎虚构golden仅将LF换成CRLF,正文下载残留22段图盘JSON;新分盘组仍可提取22盘。 diff --git a/docs/tasks/README.md b/docs/tasks/README.md index a7ca9646..7d3e8d49 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -117,8 +117,9 @@ | 任务书 | 进度 | 主题 | 状态 | 落点 | | --- | --- | --- | --- | --- | +| `TASK-staging-gate-fix-20260924.md` | — | **修复单(阻塞 staging 部署)**:慢网首页 `0e4dd0f4` 起 5 条源码合同测试未跟上(硬跳转计数、重试 reload 正则、两处按已删语句切片)→ 门禁红,`0e4dd0f4..f125fae0` 全部未部署;另 page.tsx +9 行、订阅支付不刷新余额、原始附录三文件残留。只修测试与收尾,不改已验收行为;失败名单须与 `edc9c22c` 逐条一致 | 待领取(**最优先**) | — | | `TASK-people-archive-p1-20260924.md` | — | **星盘档案(多人物)P1**:每个档案 = 一个人(含本人),最多 5 人、无关系字段;标题旁人名 = 全局切换器(对话 / 星盘 / 星历 / 报告 / 档案页同一组件),星盘、星历、报告、今日星语、新建对话都跟当前人物走(推翻 BUG-1000 新对话固定本人);历史只显示当前人物;档案管理改侧栏 `/people` 页、设置删星盘资料;删人连带删对话与报告;取消「设为默认」/`activeChartId`(BUG-1030 错人)。他人资料改类型化列 + 与户主同级守卫,统一 `resolveSubjectBirth`;户主暂留 `profiles`。生时校正跟人与任意两人合盘留 P2。**同日四单全部合入后开工**,需 Docker 跑 test:db | 待领取 | — | -| `TASK-home-slow-network-20260924.md` | — | **慢网首页半揭幕 + 账户与点数打开慢(BUG-1021/1022)**:8 秒硬超时包住多跳串行请求、超时不补拉,独立的会话列表 provider 晚到 → 正常首页+报错条、模型「暂不可用」、新建对话灰、重问称呼。产品 09-24 拍板:推翻 8 秒硬超时,等齐再揭幕,20 秒才出错误屏且重试为局部重请求(不整页刷新);账单面板删无用 `/api/account`、预取 chunk、套餐缓存。先于 chart-ephemeris T3 合入 | 待领取 | — | +| `TASK-home-slow-network-20260924.md` | — | **慢网首页半揭幕 + 账户与点数打开慢(BUG-1021/1022)**:8 秒硬超时包住多跳串行请求、超时不补拉,独立的会话列表 provider 晚到 → 正常首页+报错条、模型「暂不可用」、新建对话灰、重问称呼。产品 09-24 拍板:推翻 8 秒硬超时,等齐再揭幕,20 秒才出错误屏且重试为局部重请求(不整页刷新);账单面板删无用 `/api/account`、预取 chunk、套餐缓存。先于 chart-ephemeris T3 合入 | 验收未通过(Claude 09-24:逻辑符合,但 5 条合同测试红致门禁红未部署 + page.tsx +9;修复单 staging-gate-fix) | `0e4dd0f4`/`2f53fa01`/`25e32fe6`(未部署) | | `TASK-secondary-new-chat-intent-20260923.md` | `PROGRESS-secondary-new-chat-intent-20260923.md` | **次级页「新建对话」落到最近一次对话**:`/chart` `/ephemeris` `/reports` 的侧栏没有 `controls`,「新建对话」只是 `href="/"` 的回首页链接;首页无参启动的落点是 `nextSessions[0]`(最近更新那条),只有最近一条是校正会话才改落空咨询。BUG-745 修过同一入口的「慢」,没修「回到哪」。产品 09-23 拍板:链接改 `/?new=1`,首页看到 `new` 就本地建空咨询并 `replaceState` 抹掉参数;`new` 胜过 `c` 与登录返回存根;沿用 BUG-989 不落库不写 `?c=`;页脚与品牌行的 `/` 不改;刷新无参 `/` 仍落最近对话属既有设计。红线:`/` 保持 Static、不得用 `useSearchParams`;解析与生成只在 `chat-session-url.ts` 一处。BUG-1015;执行中追加 D7:保留旧任务恢复但不抢新建落点。 | 已验收(Claude 09-24:tsc/lint/95 定向/全量失败名单同基线/Static/gzip 同基线;BUG-1015 resolved) | `8902e484`,含于已部署 `1420471a`;真机清单欠 | | `TASK-chat-message-authority-20260901.md` | — | 消息服务端权威化 | 已验收 | `b6989c3e`(BUG-464) | | `TASK-session-url-20260901.md` | — | 会话 URL 化 | 已验收 | `924f4202` | @@ -173,8 +174,8 @@ | 任务书 | 进度 | 主题 | 状态 | 落点 | | --- | --- | --- | --- | --- | | `TASK-report-reader-main-20260924.md` | — | **报告正文换上游读者版 reader_main + KP / Muntha 计算缺陷 + 投影截断(BUG-1026/1027/1028)**:正文一直是上游审计版(读者版 09-09 才出、从未同步),本仓又自加「结论等级规则」/英文段/异常原文;投影黑名单不认 PL9 词汇且截断半句、删表留说明;KP args `vars()` 拷贝为空恒失败;Muntha 漏合 `birth_asc_sign_idx` → Year Lord 恒火星。产品拍板接入读者版、旧报告不回填。引擎类需 pre_work_check;排在 BUG-1020 fix 之后 | 待领取 | — | -| `TASK-report-reader-actions-20260924.md` | — | **报告操作收敛**:列表只留「查看报告」;阅读页删「下载原始附录」「打印」,导出改图标按钮;导出对话框 ≥860 居中、窄屏仍贴底(修订 chapter-export D9/D10)。产品变更,不开 BUG 号 | 待领取 | — | -| `TASK-report-chapter-export-fix-20260924.md` | `PROGRESS-report-chapter-export-20260924.md` | **CRLF图盘JSON残留(BUG-1020)**:旧剥离器只匹配LF;建议D5对错误围栏残留作有限例外,D13不构成该授权。 | 待领取(产品 09-24 批准 D5 有限例外 D14) | — | +| `TASK-report-reader-actions-20260924.md` | — | **报告操作收敛**:列表只留「查看报告」;阅读页删「下载原始附录」「打印」,导出改图标按钮;导出对话框 ≥860 居中、窄屏仍贴底(修订 chapter-export D9/D10)。产品变更,不开 BUG 号 | 基本通过(Claude 09-24:入口收敛、图标、≥860 居中均符合;原始附录三文件因执行方权限未删、PROGRESS/清单未写 → 并入修复单) | `f125fae0`(未部署) | +| `TASK-report-chapter-export-fix-20260924.md` | `PROGRESS-report-chapter-export-20260924.md` | **CRLF图盘JSON残留(BUG-1020)**:旧剥离器只匹配LF;建议D5对错误围栏残留作有限例外,D13不构成该授权。 | 代码已验收(Claude 09-24),待部署(被同批门禁红阻塞) | `fa8fef55`/`133aca49`(未部署) | | `TASK-report-chapter-export-20260924.md` | `PROGRESS-report-chapter-export-20260924.md` | **我的报告:分块导出 + 中文元信息 / 状态色 / 行内确认删除(BUG-1018/1019)**。旧整篇按钮由抽屉取代;常用 / 全部正文保持 D5 逐字节,所有组全选另附盘和核对表。后续产品裁决 D13:分盘必须带安全 SVG,有限替代原无 SVG 约束;JSON 围栏及内部字段仍禁。原生底部 dialog、760px、70%、860 两列、零额外请求、保留打印 / 原始附录。 | 已验收(Claude 09-24:同上;D13 SVG 与列表页删导出按钮均按产品口径;BUG-1018/1019 resolved;CRLF 见 fix 单) | `1420471a`(staging 已部署);真机清单欠 | | `TASK-report-density-20260922.md` | `PROGRESS-report-density-20260922.md` | **报告信息密度与原始附录(BUG-1003~1007)**:与源头仓 PL9 全量报告同资料实测:对照 847,632 字符 / 8,044 表格行,我方 309,357 / 1,478。缺口不在引擎——20 张分盘全表、KP 四表、Ashtakavarga 四类、Shadbala 六分量、Avastha、Sahams、年度都已算得出,但 `personal-report-contract.ts` 的 `REPORT_SECTION_KINDS` **没有表格类型**、`CHART_IDS` 只有 9 种,这些表在产品页报告里没有落脚字段。另测出对外原始附录泄漏 925 种 / 3,797 处工程标识符(`parameter_sensitive` 697、`cmd_full_reading` 68、`PyJHora`/`JHora` 35、`PL9` 页码 59),对照物同项为 0。**产品 2026-09-22 三点拍板**:层 1 按 8 组表 + 分盘扩到 16 张;层 2 原始附录直接给 C 端且先全显示;B 类大运族要显示。**决策记录已写明推翻 BUG-999 的两条红线**(专业参考不得作普通下载 fallback;`parameter_sensitive`/「参数敏感」命中整行剔除)——**仅限附录通道**,普通正文投影不动。硬红线:表格层服务端装配、writer 不得写表;对照物的替代大运族日期与 Shadbala 分量在源头仍未闭环(506 行 date mismatch、`production_tuning_allowed=false`),不得照搬升级。让步顺序与串行依赖(任务 3 → 任务 4 同改契约)见任务书 | **验收未通过**(2026-09-23):任务 1/2/4/5 通过;任务 3 事实表在普通报告里显示 447 个引擎键路径(P1);隐私门新增失败(任务书自身写入真实出生资料 BUG-1008 已清 HEAD,fixture 数值碰撞待登记);当时 BUG-1003~1007、PROGRESS、testing 清单缺失;F3 现已补前两项,testing 新建受工具边界阻塞仍缺。Node 22 前端 0 新增失败、`/` Static、gzip +0.007% | 实现 `bbd96d3b`(原 `f968cb21`,09-23 为清除 BUG-1008 重写历史;已在 staging,未部署);修复单 `TASK-report-density-fix-20260923.md` | | `TASK-report-density-fix-20260923.md` | `PROGRESS-report-density-20260922.md` | **报告密度验收修复单(BUG-1009/1010 + 补写 1003~1007)**:F1 事实表改成真正的表(逐组规定列,普通报告可见格 0 个引擎键 / 0 个下标 / 最多 2 位小数,`sourcePath` 保留供回查;主运年数不得填出生剩余年数);F2 按既有机制登记 fixture 的数值碰撞(已独立重跑确认是虚构输入);F3 补 Bug 历史 / PROGRESS / 真人清单并更正「未提交推送」;F4 两份清洗规则只留一份(Python 版漏第三方页码);F5 writer 写表拦截补测试与提示;F6 事实表可打印。硬红线:不得弱化隐私扫描、不得强推或重写 staging(历史清除由产品负责人决定);Sade Sati 三轮日期是原任务书错误、不在本单 | **已验收,F1–F6 全部通过**(2026-09-23,`a12f2c0d`):事实表 130 行 / 600 格 0 引擎键 0 下标、主运年数 18、隐私门转绿、两份规则逐字节一致、写表拦截变异测试红→绿;Node 22 前端 3,748 / 26(名单与基线一致)、Python 948/0。剩数据库测试 E2BIG 另开 fix2(BUG-1011) | `a12f2c0d`(门禁 run 6294 红,未部署);真人清单 `docs/testing/report-density-20260922.md` | diff --git a/docs/tasks/TASK-staging-gate-fix-20260924.md b/docs/tasks/TASK-staging-gate-fix-20260924.md new file mode 100644 index 00000000..71b4bb99 --- /dev/null +++ b/docs/tasks/TASK-staging-gate-fix-20260924.md @@ -0,0 +1,65 @@ +# TASK · 修复单:慢网首页 5 条测试未跟上致门禁红 + page.tsx 增长 + 原始附录残留(2026-09-24) + +## 基线与现状 + +- `origin/staging = f125fae0`。staging 线上仍是 `1420471a`:`0e4dd0f4`(慢网首页)之后的**所有代码提交都没部署**,包括 BUG-1020(`fa8fef55`/`133aca49`)与报告操作收敛(`f125fae0`)。 +- Claude 09-24 在 Linux / Node 20 独立验收(基线 `edc9c22c` vs `f125fae0`):tsc 0;lint 0 error(warning 119 → 121);`next build` 四路由标记与 gzip 130,932 B 与基线一致;**全量 3807 → 3809 条,失败 56 → 61,新增 5 条红**(下表),其余失败名单与基线逐条相同。门禁会跑同一套前端测试,因此判断门禁红、未发布镜像(Gitea API 匿名 401,run 号请产品在 Gitea 核对)。 +- 执行方 PROGRESS 记录了 `npm test` 89 条失败,但**没有与基线逐条比对**,新增的 5 条混在 Windows 环境失败里没被发现;BUG-1021/1022 被提前写成 resolved。 +- 分支 `codex/staging-gate-fix-20260924`。 + +## 新增 5 条失败(全部是源码合同断言没跟上实现,不是行为回归) + +| 测试 | 文件 | 原因 | +| --- | --- | --- | +| auth redirects stay hard document loads so stale session state cannot survive | `tests/chat-navigation-a11y-contract.test.ts` | 断言 `page.tsx` 中 `window.location` 硬跳转共 4 处,实现把「重试」从 `location.reload()` 改成局部重试(任务书 D2),现为 3 处 | +| bootstrap failure retries with a hard reload because refresh cannot rerun client bootstrap | 同上 | 正则 `onClick={() => window.location.reload()}>重试`;任务书 D2 **有意推翻**了该断言的前提(局部重试已能重跑 bootstrap) | +| new chat keeps its local landing while a reserved older consultation recovers | `tests/new-chat-recovery.test.ts` | 按字符串切 `page.tsx` 源码,结束边界 `if (modelCatalogResult.unavailable)` 已被删除 → `missing source boundary`(我在 BUG-1015 验收时标注过的 P2 脆弱点,这次触发) | +| ordinary home landing still activates and announces the reserved consultation | 同上 | 同上 | +| tab-local pending ids drive strict bootstrap recovery before the global fallback | `tests/consultation-recovery.test.ts` | 切片起点 `let reservedConsultation: ConsultationStatus | null = null` 已改为 `= await activeStatusPromise` → 切出空串;另断言 `storedPending` 分支先于 `fetchActiveConsultationStatus`,实现改为并行预取 | + +同类问题第五次(BUG-933/934/939/992 同型):执行方只跑定向测试,没跑全量并与基线逐条比对。 + +## 其它验收问题 + +1. **P2 红线违反**:`page.tsx` 1849 → 1858 行(+9),任务书红线 4「`page.tsx` 不得净增行」。主要来自「重试」内联的 5 行状态重置。 +2. **P2 行为**:`use-billing-panel.ts` 支付轮询成功后改为 `if (typeof payload.credits === "number") notifyBalanceChanged(payload.credits)`;`/api/payment/epay/status` 的 `credits` 是订单点数,**订阅类订单可能为空** → 不发余额事件 → 首页账户不刷新。`page.tsx` 的 `BALANCE_CHANGED_EVENT` 监听只调 `refreshAccount()`、不读传入值,所以应**无条件**通知。 +3. **报告操作收敛残留**(`f125fae0` 执行方删除权限被拒):`raw-appendix-download.tsx`、`app/api/reports/[reportId]/raw-appendix/route.ts`、`lib/personal-report-raw-appendix.ts` 已无入口但仍在;执行方也没能写 PROGRESS 与真机清单(工具拒绝写入)。 +4. 代码本身(慢网并行、20 秒错误屏、局部重试、不再半揭幕、账单预取与缓存、CRLF 正则)我逐行核对**符合任务书**,不需要改逻辑。 + +## 决策记录 + +- 本单只修测试与收尾,**不改任务书已批准的行为**(D2 局部重试、并行预取、20 秒阈值)。 +- 5 条断言按新行为改写,**不得删除测试**;`new-chat-recovery` 与 `consultation-recovery` 的源码切片改为**不依赖会被删改的具体语句**作边界:优先把被测逻辑抽到 `frontend/src/lib/` 纯函数直接调用;做不到时用稳定的注释锚点(如 `// bootstrap:recovery-begin` / `// bootstrap:recovery-end`)并在两处测试共用。 +- `chat-navigation-a11y-contract`:硬跳转计数改为 3,并**新增**断言「重试」调用 `reloadSessionList` 且不含 `location.reload`(行为锁,不是弱化)。 +- 原始附录三件套连同只测它们的测试一并删除(任务书 D2 已授权);`personal-report-raw-appendix.test.ts` 中仍有价值的投影断言若依赖 `cleanReaderAppendixMarkdown`,保留该 helper 所在模块,只删路由 / 组件 / release 函数。 + +## 硬红线 + +1. 失败清单必须与基线 `edc9c22c` **逐条一致**(56 条),新增 0;进度记录附对比命令与结果。 +2. 每条改动的断言写「原值 / 新值 / 原因」三栏;测试总数不低于 3809 − 被删文件的测试数,并列出删了哪些。 +3. `page.tsx` 行数 ≤ 1849(`edc9c22c` 基线);`Home()` 不新增 hook。 +4. 不改首页 / 账单 / 报告的已验收行为;不改数据库、workflow。 + +## 任务分解 + +- T1 修 5 条断言(抽纯函数或注释锚点)。验收:5 条转绿,`grep -n "modelCatalogResult.unavailable" frontend/tests` = 0。 +- T2 `page.tsx` 回到 ≤ 1849 行:重试处理抽到 `frontend/src/lib/` 或现有 hook。 +- T3 支付成功无条件 `notifyBalanceChanged`。验收:`billing-panel.test.ts` 新增订阅订单(`credits` 缺失)也触发余额事件。 +- T4 删除原始附录三件套与相关测试。验收:`git grep -n "raw-appendix\|RawAppendixDownload\|releaseRawReportAppendix" frontend/src` = 0。 +- T5 记录:`BUG_HISTORY` 中 BUG-1021/1022 状态保持 investigating 直到部署 health 核对;补 `docs/tasks/PROGRESS-report-reader-actions-20260924.md` 与 `docs/testing/report-reader-actions-20260924.md`(上一执行方未能写入);本单 PROGRESS。推 staging 后核对门禁绿与 `/api/health` 的 `gitCommit`。 + +## 开工前置命令 + +```bash +git fetch origin --prune +git worktree add -b codex/staging-gate-fix-20260924 .worktrees/staging-gate-fix-20260924 origin/staging +git worktree add --detach .worktrees/gate-baseline-20260924 edc9c22c # 基线 +cd .worktrees/gate-baseline-20260924/frontend && npm test > /tmp/base.log 2>&1 +cd ../../staging-gate-fix-20260924/frontend && npm test > /tmp/head.log 2>&1 +diff <(grep '^not ok' /tmp/base.log | sed 's/^not ok [0-9]* - //;s/ # .*//' | sort) \ + <(grep '^not ok' /tmp/head.log | sed 's/^not ok [0-9]* - //;s/ # .*//' | sort) +``` + +## BUG 编号 + +不新开号;沿用 BUG-1021 / 1022(首页 / 账单)与报告操作收敛的产品变更记录。