6.3 KiB
执行与验收 · 侧栏导航注册循环(2026-09-19)
授权、基线与范围
- 产品明确授权修复并 push staging,实施计划已批准;主代理负责诊断/验收/交付,子代理实施限定源码与测试。
- 基线
origin/staging = 507ef959f519218d190574fa588fc7b92c60229b;独立工作树.worktrees/sidebar-navigation-loop-20260919,分支codex/sidebar-navigation-loop-20260919。同 SHA 的 detached 基线工作树用于测试和构建比较,不改主检出、不 stash。 - 开工核对 Bug 最大号 970,本轮暂用 BUG-971,提交前再次检查编号冲突。
- 只拆分会话数据与侧栏注册订阅;保持单侧栏、单列表数据源、最新操作回调、卸载注销、inert 和客户端导航。无样式/文案、数据库、依赖、workflow、DNS、main 改动。不扩修 BUG-967 的 health 时序问题。
事故实证与根因
产品确认测试站三个入口刷新后仍不切页;看到的 /api/ephemeris 是 AppSidebar 的 pointerenter/pointerdown 数据预取,不代表导航成功。匿名三个页面和 RSC 均 200;线上 d6fc4fb8 与本轮基线的关键导航源码相同。
Home -> useSessionList -> useSessionManagement(新 visibleSessions/回调) -> useHomeShellRegistration effect -> setRegistration -> 同一 context 通知 Home 形成反馈。真实 React 最小运行原版 122 render / 118 注册 / 2 个 maximum-depth 告警(保护阈值主动终止);只稳定回调无效,数组与回调稳定对照 3/1/0。另在第 3 render 发 startTransition,循环直到第 301 render 主动停止才允许目标 commit;普通优先级与稳定数组对照均可正常提交。Next Link 实际通过 startTransition 导航。
这是新的共享外壳运行时缺陷,关联 BUG-927,不把本轮刷新无效强归为旧 BUG-965/967。旧 provider 测试只有源码正则,未执行 effects。
实施进度
- 隔离基线与实施工作树、复用现有依赖(junction,不安装或升级)。
- 注册订阅读写隔离与外壳消费调整(3 个源码文件,Home 状态与原注册 effect 未改)。
- 真实 React 生命周期/transition 回归及反向验证。
- 独立审查及可运行验收、完整测试/构建基线比较;Static/gzip/真人浏览器仍为明确缺口。
- 本地提交修复
2c92f6100eb982756424e6f48a38680032917c23;文档换行修正2178135021756d20c323f8c45d63f07fdc768e1e(保留历史,追加提交)。 - 推送阻塞已解除: 首次 push 认证失败;用户要求再次尝试后,同一命令成功,远端完整 SHA 核对为
7e0037177d3babc9f8bb20b840dda8a060e37ace,包含本轮全部修复。未改认证配置或借用凭据,首次失败原因未确定。 - 部署及登录态验收:成功推送后 health 仍为
d6fc4fb8,Actions 匿名查询仍 401,尚未确认门禁/部署完成。 - 失败后只读核对:远端仍
a2bcdee006397e2417f2e42d30ca030dd41ec480,测试站 health 仍d6fc4fb8b3838702c62f9d2a181609ffb3df2985,不含本轮修复。需用户恢复本人 Gitea 写入认证后再推送;未读取或借用其他凭据。
独立审查确认 data value 不依赖 registration、registrar 保持稳定、shell 单独读取、children 原样透传;账户/session 真正变动仍能通知 Home 并发布最新闭包。新 host helper 只运行 React reconciler/effect,不模拟点击、几何或浏览器可访问性。可见分页 observer、SidebarTrigger 操作与完整 Next 浏览器仍列真人缺口,没有声称全覆盖。
验证记录
| 项目 | 基线 | 修复后 | 结论 |
|---|---|---|---|
| 全量前端测试 | 3481 tests / 3403 pass / 78 fail | 3486 tests / 3408 pass / 78 fail | 新增 5 个通过;78 个失败测试名/次数完全一致,非全绿 |
| TypeScript | webpack 类型检查完成 | 独立 tsc --noEmit --incremental false 0 错 |
通过 |
| 完整 lint | 未重跑(未触碰原 warnings) | 0 error / 120 warnings,exit 0 | 零 error 通过,未顺手修 warning |
| 生产构建 / 首页 Static / 首屏 gzip | 编译/类型完成,collect page data: Skill symlink EPERM | 同阶段同根因 EPERM(含共同 /api/birth-time-guide) | 构建失败;Static/gzip 未验收 |
| 生命周期反向 | 新 4 条在旧源码 3 fail / 1 pass(50 render 保护) | 4/4 pass | 证明能抓回归 |
| 主会话独立五文件定向 | 原四文件 60/60 | 65/65,fail 0 | 通过 |
| staging 交付 / 部署 | 远端 a2bcdee0;线上 d6fc4fb8 |
重试 push 成功,远端核对 7e003717;线上仍 d6fc4fb8 |
代码已推送;部署未确认 |
- 全量逐项证据:78 项失败对照。全量与构建使用同一 node_modules、相同命令;不读取用户凭据,不改生产源码绕过 Windows 权限。
- 定向:
tsx --test tests/session-list-lifecycle.test.tsx tests/session-list-provider.test.ts tests/secondary-page-entry.test.ts tests/sidebar-contract.test.ts tests/account-dialog-inert-20260918.test.ts。 - 构建:
npm run build -- --webpack。Next 16.3.1 编译与类型通过不等于构建通过。 - 推送前 fetch 得到
a2bcdee006397e2417f2e42d30ca030dd41ec480,相对初始基线仅 2 个文档提交、2 处文档文件变化,Bug 最大号仍 970;整合后代码测试基线不变。 - Gitea Actions runs 匿名只读 API 返回 401;未借用/搜寻其他账号凭据,门禁详情查询为环境缺口。
既有断言改动
| 原值 | 新值 | 原因 |
|---|---|---|
| 既有断言全部保留 | 不修改任何旧断言;追加 1 条结构合同和 4 条生命周期测试 | 锁定订阅边界并执行真实 effect/transition,测试总数 +5;没有弱化或减少覆盖 |
环境边界
- 不使用真实用户 Cookie/凭据,不接管故障标签页;登录态完整 Next 点击验收待
docs/testing/sidebar-navigation-loop-20260919.md。 - Windows 基线与修复树均复用相同 node_modules;为避免 Turbopack 外部 junction 限制,用相同
npm run build -- --webpack对照,具体结果如实记录。 - 本会话此前
pre_work_check.py远端 verified,但两条碎片扫描断言失败(镜像路径字面量与候选/残留统计边界),不属于本轮前端修复,不改断言掩盖失败。 - Skill 版本不变。