docs: BUG-965 触发条件确认(跨部署标签页),产品选定方案一
产品复现:刷新后恢复正常。BUG-965 根因定为标签页跨过 17:12 部署后 客户端导航拉不到已被替换的构建产物。修复方向进 BUG-967:用编译期 NEXT_PUBLIC_GIT_COMMIT 与 /api/health 比对,旧版本在下次导航整页重载。 次级页抖动按方案一做(统一外壳 + 缓存 + 预取),不加 spinner。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0193vBv6w5MV2cifdTUu9H5P
This commit is contained in:
co-authored by
Claude Opus 5
parent
bfd6184e71
commit
1061514fc0
+4
-3
@@ -12533,12 +12533,12 @@
|
||||
|
||||
## BUG-965 | 侧栏「星盘 / 星历 / 我的报告」点了不跳转,账户入口也没反应
|
||||
|
||||
- 状态:investigating
|
||||
- 状态:investigating(触发条件已由产品复现确认,修复未做)
|
||||
- 首次发现:2026-09-18
|
||||
- 最近更新:2026-09-18
|
||||
- 影响面:`AppSidebar` 的 `NAV_PAGES` 链接与页脚账户入口;staging `877128ce`
|
||||
- 用户现象:产品负责人在 staging 的对话页点侧栏「星盘」「星历」「我的报告」没有任何跳转,点「个人资料」也没反应。对话本身可用(同一时段成功发出并收到了申报时段回答)。
|
||||
- 触发条件:待确认(是否同一标签页跨过 2026-09-18 17:12 的部署、在哪个页面点击、控制台有无报错,均待取证)。
|
||||
- 触发条件:**标签页跨过部署**。产品确认:刷新之后一切正常,刷新前点什么都没反应。该标签页在 2026-09-18 17:12 的 staging 部署(`9cdcf96b` → `877128ce`,容器重建)之前就已打开。
|
||||
- 已排除(本轮静态核对):
|
||||
1. 路由存在:`/chart`、`/ephemeris`、`/reports` 在 staging 均返回 200(未登录也返回 200,说明是客户端门禁而非路由缺失)。
|
||||
2. 当前构建自洽:`/chart` 首屏引用的 `/_next/static/**` 资源抽查全部 200。
|
||||
@@ -12546,7 +12546,8 @@
|
||||
4. 没有覆盖桌面侧栏的 `pointer-events: none` 或 `inert`:`inert` 只出现在移动端抽屉、时间轴折叠体、`SidebarInset`(`insetInert = modalOpen`,只盖正文区不盖侧栏)。
|
||||
5. 次级页页脚是 `Link href="/"`(账户菜单只在 `/`),因此「在次级页点头像」应当跳回首页而不是没反应。
|
||||
- 待取证据:控制台报错原文与 Network 面板是否有 404 的 `/_next/static/**`;点击时所在页面的 URL;该标签页是否在 17:12 部署之前就已打开;硬刷新(Cmd+Shift+R)后是否恢复。
|
||||
- 当前假设(未证实,不得写进修复):标签页跨过部署后,客户端导航要拉的构建产物已被新镜像替换,路由切换静默失败,而已经加载好的对话页照常工作。硬刷新可恢复即支持该假设。
|
||||
- 根因(按复现结论):标签页跨过部署后,客户端导航要拉的构建产物已被新镜像替换(构建 id 变了,旧 chunk / RSC 负载不再存在),路由切换静默失败;已经加载好的对话页因为代码都在内存里,照常工作。Next 16 自带的构建不匹配回退在这次没有把用户带到整页重载,具体是被哪一层吞掉(404 形状、Caddy、还是 RSC 负载不匹配的判定)需要在修复单里查证。
|
||||
- 修复方向:见 `docs/tasks/TASK-secondary-page-entry-20260918.md` BUG-967——客户端用编译期注入的 `NEXT_PUBLIC_GIT_COMMIT` 与 `/api/health` 的 `deployment.gitCommit` 比对,发现自己是旧版本就在下一次导航时整页重载,而不是静默失败。
|
||||
- 关联记录:BUG-744~746(侧栏统一为 `Link` 跳转)、BUG-926~929(会话列表单一数据源与外壳搬家)、BUG-936(首屏 bundle 未执行)
|
||||
- 复发自:待确认
|
||||
- 修复版本:待发布
|
||||
|
||||
@@ -141,7 +141,7 @@
|
||||
| `TASK-window-consult-contract-20260918.md` | `PROGRESS-window-consult-contract-20260918.md` | **P0 线上**:申报时段模式**自 2026-08-21 起每轮秒败**(69ms、0 token、模型从未被调用)。服务端日志实证根因:窗口 Agent attach 了 `jyotishSkillBinding()`,但 `windowJyotishInstructions` 从来不含方法块 marker,输入处理器直接 abort(BUG-954)。abort 与「模型没调工具」同码,是它藏四周的原因(955);另含合同未绿不得丢正文(956)、计算不该由模型触发(957,须等 954 上线后另轮)、窗口指令应期冲突(958)。基线 `9cdcf96b` | 已验收通过(Claude:tsc 0 / lint 0 error / npm test 3501 条 31 红同基线 / `/` Static / gzip 无变化;实跑确认窗口 Agent 指令已含 marker);review 另出 BUG-959~961 见下一行 | `5b6abc23` |
|
||||
| `TASK-contract-degraded-pass4-20260918.md` | — | 验收 review:BUG-956 新增的降级交付路径绕过 Pass 4,保证句原样送达(BUG-959);`uncontractedText` 跨 attempt 不清零,同一轮正文说两遍(960);降级后还空跑一轮 compose(961)。基线 `877128ce` | 待领取 | — |
|
||||
| `TASK-chat-markdown-list-20260918.md` | — | 真机排版反馈:聊天正文列表**没有项目符号**(Tailwind v4 preflight 清了 `list-style`,`.markdown-list` 没恢复,BUG-962);`promoteDefinitionLists` 把四标题口语体的散文误判成并列项,三段正文被改写成列表(BUG-963,判据太松,收紧而非删除——BUG-356 的场景要留);思考条与正文之间实测 56px=报告 grid gap 24 + 首标题 margin-top 32,后者是被特指度压掉的「首元素清零」规则(BUG-964)。基线 `ea0280c1` | 待领取 | — |
|
||||
| `TASK-secondary-page-entry-20260918.md` | — | 真机反馈:星盘 / 星历 / 报告进入时抖一下——三页都是「矮的等待文案块 → 高的正文块」一次推挤,且 `use-chart-page` 无缓存所以每次进入都抖(BUG-966)。默认方案是统一外壳 + 缓存 + 预取把中间态消灭,**不加 spinner**(撞 §6 红线,要加需产品授权并改红线)。基线 `41902067` | 待领取 | — |
|
||||
| `TASK-secondary-page-entry-20260918.md` | — | 真机反馈:星盘 / 星历 / 报告进入时抖一下——三页都是「矮的等待文案块 → 高的正文块」一次推挤,且 `use-chart-page` 无缓存所以每次进入都抖(BUG-966)。产品已拍板方案一:统一外壳 + 缓存 + 预取消灭中间态,**不加 spinner**,红线不动。另含 BUG-967:标签页跨过部署后客户端导航静默失效(BUG-965 已复现确认,刷新即恢复),要按 `NEXT_PUBLIC_GIT_COMMIT` 与 `/api/health` 比对自愈。基线 `41902067` | 待领取 | — |
|
||||
| `TASK-first-paint-dead-screen-fallback-20260917.md` | — | 真机:首页永远停在「正在载入账户」,兜底全在没跑起来的 bundle 里(BUG-936 investigating)。根 layout 加与 bundle 无关的内联兜底 + 去掉本仓正则后行断言 | 待领取 | — |
|
||||
| `TASK-consultation-answer-start-anchor-20260917.md` | `PROGRESS-consultation-answer-start-anchor-20260917.md` | 主会话回答落在结尾:`useConversationScrollAnchor` 是贴底跟随,流式期间视口钉在最后一个字,回答开头滚出视口;改为发送后问题钉顶、回答向下长、长出视口显示「跳到最新」、末尾动态留白;产品追加拍板:校正面同一语义(推翻 BUG-041/048 贴底),本轮开头 = 用户行或新助手行。BUG 段 930 起 | 已验收(经修复单) | `worktree/green-harbor-5be3` |
|
||||
| `TASK-consultation-answer-start-anchor-fix-20260917.md` | `PROGRESS-consultation-answer-start-anchor-fix-20260917.md` | 验收修复单:F1 头就是留白行时留白按整视口算(BUG-931);F2 留白只在钉住期间存在(BUG-932);前置:先修 e4e73f56 的两处 TS 错否则门禁不过 | 已验收 | `cc1a8980`(Claude 验收:tsc 0 / lint 0 error / npm test 3457 条 39 红与 11c0028d 逐条一致、新增 2 条绿 / `next build --webpack` 通过、`/` Static、首屏 gzip 591,242(较 09-16 基线 582,800 +1.45%,含会话列表单)/ Chrome 真实布局 S1–S6 全部通过,S6 新助手行距顶 16px 且增高不动,S5 不再写留白);真机六条欠 |
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
> 基线:`origin/staging` @ `41902067`(代码部分 = 已部署的 `877128ce`)。
|
||||
> 触发:产品真机反馈「星盘 / 星历 / 我的报告进去时需要一个统一的加载动画,现在进去的时候有一瞬间抖动」。
|
||||
> BUG 编号起点:当前最大号 **BUG-965**(investigating),本单占 **BUG-966**。
|
||||
> BUG 编号起点:当前最大号 **BUG-965**(investigating),本单占 **BUG-966 ~ BUG-967**。
|
||||
|
||||
## 0. 抖动是怎么来的(已定位)
|
||||
|
||||
@@ -19,7 +19,9 @@
|
||||
|
||||
## 1. 与既有红线的冲突(必须先由产品裁决)
|
||||
|
||||
产品要的是「统一的加载动画」。但 `AGENTS.md §6` 与 `frontend/DESIGN.md` 的现行红线是:
|
||||
**决策记录(产品负责人 2026-09-18 授权):选 §2 的方案一——把中间态消灭掉,不加 spinner,现行红线不动。** §3 的方案 B 不做。
|
||||
|
||||
产品最初要的是「统一的加载动画」。`AGENTS.md §6` 与 `frontend/DESIGN.md` 的现行红线是:
|
||||
|
||||
> 揭幕后不得出现 spinner / 骨架 / 「正在加载」(流式生成中除外);一次等待一次揭幕。
|
||||
|
||||
@@ -35,19 +37,30 @@
|
||||
- 同一会话内第二次进入三页,不得再出现等待文案;
|
||||
- `next build` 后 `/` 仍 `○ Static`,首屏 gzip ±2%。
|
||||
|
||||
## 3. 方案 B(仅在产品明确授权后做):延迟揭幕
|
||||
## 3. BUG-967(P1)标签页跨过部署后,客户端导航静默失效
|
||||
|
||||
产品复现确认(BUG-965):2026-09-18 17:12 的部署之前打开的标签页,点侧栏「星盘 / 星历 / 我的报告」与账户入口**全部没反应**;**刷新后恢复正常**。已经加载好的对话页照常可用,因为它的代码都在内存里。
|
||||
|
||||
**要求**:
|
||||
|
||||
1. 查证 Next 16.3.1 自带的「构建不匹配就整页导航」回退这次为什么没生效(404 形状?Caddy?RSC 负载判定?)。结论写进进度记录,不得跳过这一步直接加补丁。
|
||||
2. 加自愈:客户端拿编译期注入的 `NEXT_PUBLIC_GIT_COMMIT`(`src/app/api/health/route.ts:140` 已在用同一个值)与 `/api/health` 的 `deployment.gitCommit` 比对——发现自己是旧版本,就在**下一次导航时整页重载**,而不是静默失败。比对频率取"页面重新可见时 + 导航前",不要做轮询。
|
||||
3. 不得用「定时强制刷新」或「每次导航都整页重载」来糊过去:那会把正常情况下的客户端导航也一起废掉。
|
||||
4. 验收标准:合同测试——版本不一致时导航走 `window.location.assign`,一致时走客户端路由;真机验收清单写进 `docs/testing/`(需要一次真实部署才能复现,属环境依赖项)。
|
||||
|
||||
## 4. 方案 B(本轮不做,仅存档):延迟揭幕
|
||||
|
||||
不显示半成品:点击后**留在当前页**,数据到位再一次性切换到次级页(等待期间只有侧栏入口的按下态)。这与首页「一次等待一次揭幕」同构,不引入 spinner。实现上是把首屏数据取到路由切换之前(预取 + `useTransition`,或把首屏数据改成服务端取、用 Suspense 让路由切换等数据)。
|
||||
代价:慢网络下点击后有一段"没反应",需要按下态兜住。
|
||||
|
||||
## 4. 硬红线
|
||||
## 5. 硬红线
|
||||
|
||||
1. 不得在揭幕后引入 spinner / 骨架 / 「正在加载」文案——除非 §1 里有产品授权,且同一提交更新 `AGENTS.md §6` 与 `frontend/DESIGN.md` 的对应条款。
|
||||
1. 不得在揭幕后引入 spinner / 骨架 / 「正在加载」文案。产品 2026-09-18 已选定方案一,红线不动。
|
||||
2. 三页必须共用同一个外壳与同一套等待口径,不得各写各的(这次抖动就是三页各写各的结果)。
|
||||
3. `tsc --noEmit` 0 错、`npm run lint` 0 error、`npm test` 失败数不超过基线 31 条且清单一致;测试总数不低于 3501。
|
||||
4. 改 UI 的同一提交更新 `frontend/DESIGN.md`;新文案对照 `frontend/docs/VOICE.md`。
|
||||
|
||||
## 5. 开工前置
|
||||
## 6. 开工前置
|
||||
|
||||
```bash
|
||||
git fetch origin --prune
|
||||
@@ -57,4 +70,4 @@ cd .worktrees/secondary-page-entry-20260918/frontend
|
||||
npm test 2>&1 | grep -E "^# (tests|pass|fail)" # 开工基线:tests 3501 / pass 3455 / fail 31
|
||||
```
|
||||
|
||||
收工:`docs/tasks/PROGRESS-secondary-page-entry-20260918.md`(附进入三页的改前改后录屏或逐帧截图)+ `docs/BUG_HISTORY.md`(BUG-966)+ `frontend/DESIGN.md`,与代码同一批推 `staging`。
|
||||
收工:`docs/tasks/PROGRESS-secondary-page-entry-20260918.md`(附进入三页的改前改后录屏或逐帧截图)+ `docs/BUG_HISTORY.md`(BUG-965 转 resolved、BUG-966/967 新增)+ `frontend/DESIGN.md`,与代码同一批推 `staging`。
|
||||
|
||||
Reference in New Issue
Block a user