Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LutgzyJqNhPpZy1nFsJtN3
15 KiB
进度:组件库与启程事后修复(2026-10-26)
分支 codex/ui-kit-onboarding-fix-20261026。只推这个分支。验收通过前不合进测试环境。承载 issue #111。BUG 从 1444 起。
U1 · 桌面加载不再把整页卸掉再挂上(BUG-1448)
侧栏和主区始终在各自的容器里。拖宽用侧栏里的把手,宽 200–360,默认 288,拖到比 200 更窄收成 64。本命盘加在对话列旁边,不把对话列挪进后到达的分栏里。
| 检查 | 命令 | 结果 |
|---|---|---|
| 挂载与相关合同 | node node_modules/tsx/dist/cli.mjs --test tests/shell-frame-stable-mount.test.tsx tests/sidebar-contract.test.ts tests/chat-chart-panel-state.test.ts tests/class-name-definition-contract.test.ts |
52 通过,0 失败,退出码 0 |
断言三栏(sidebar-contract.test.ts「selects desktop and tablet shell widths」):原值是网格列分出 288 / 240 / 64,并检查 minSize={SIDEBAR_WIDTH_MIN}。新值检查横向 flex、shell-sidebar-slot / shell-main-slot,以及宽度上下限常量。原因是可拖面板不再包住整页,页面在分栏到达或跨断点时不再卸载。
全量 npm test、npm run build、npm run test:db、Python 快速门留到本单全部改完再跑。
U2 · 中英切换能看出选中(BUG-1449)
报告语言、导出语言、合盘语言,以及导出的「整篇 / 自选」,选中项改认页签自己的标记。边框和文字用主题色,背景保持中性。
| 检查 | 命令 | 结果 |
|---|---|---|
| 选中态 | node node_modules/tsx/dist/cli.mjs --test tests/language-switch-selected.test.tsx;同一命令再跑 tests/report-buttons-scope-20260928.test.ts tests/class-name-definition-contract.test.ts |
1 通过;随后 9 通过。两轮都是 0 失败,退出码 0 |
断言三栏(report-buttons-scope-20260928.test.ts):原值选中规则只认 aria-checked="true"。新值认 data-active 或 aria-selected="true"。原因是页签不设 aria-checked,旧规则对不上。
U3 · 没有待出提示时不再扫整页(BUG-1450)
提示都看过、清单已关、或当前没有能出的提示时,不挂监听。回答正在生成时不扫描。需要时只盯锚点旁边的容器。
| 检查 | 命令 | 结果 |
|---|---|---|
| 提示监听 | node node_modules/tsx/dist/cli.mjs --test tests/onboarding-hint-observer.test.tsx tests/onboarding-checklist-20261022.test.ts |
14 通过,0 失败,退出码 0 |
U4 · 启程动效只在启程里播(BUG-1451)
清单已关不播。还在启程里才播。动画代码没到手或超过 300 毫秒,内容保持可见。
| 检查 | 命令 | 结果 |
|---|---|---|
| 动效范围 | node node_modules/tsx/dist/cli.mjs --test tests/onboarding-motion-gate.test.tsx tests/onboarding-motion-20261022.test.ts tests/onboarding-hint-observer.test.tsx |
10 通过,0 失败,退出码 0 |
U5 · 清单关掉不翻报告,完成后会打勾(BUG-1452)
清单已关时只读「是否关掉」。还开着时,报告和合盘改成一次「有没有」。加人、合盘存上或报告完成后,这三项再读一次,不用整页刷新。进站时已经做完、但没有关掉的账户,仍会发这一次「有没有」,因为关闭时间这时不写;不再按人和页翻。
| 检查 | 命令 | 结果 |
|---|---|---|
| 拉取与打勾 | node node_modules/tsx/dist/cli.mjs --test tests/onboarding-facts-refresh.test.tsx |
4 通过,0 失败,退出码 0 |
U6 / U7 · 拖动排序一次写完,新对话仍在上面(BUG-1453)
会话和档案的排序各改成一个请求。数据库在一次事务里写完整组,任何一行不属于当前用户就整组不动。没拖过的对话按最近活跃排在上面,拖过的排在下面。
| 检查 | 命令 | 结果 |
|---|---|---|
| 一次请求与新对话位置 | node node_modules/tsx/dist/cli.mjs --test tests/order-batch.test.ts;同命令再跑 tests/session-groups.test.ts tests/people-archive-order.test.ts |
order-batch 5 通过,0 失败,退出码 0。排序与档案 16 项通过,0 失败 |
| 真库写入后重读 | node node_modules/tsx/dist/cli.mjs --test tests/database-order-batch.test.ts |
1 通过,0 失败,退出码 0 |
断言三栏(database-local-business.test.ts 排序段):原值只核对两列存在,以及 authenticated 能更新 archive_order。新值多核对整组顺序的迁移已应用、不在 frontend/db/migrations,以及两个函数只给 authenticated 执行。原因是 U6 要一次事务写完整组,列的语义不改。
U9 · 类名只用一份,验证码输入钉住版本(BUG-1454)
组件改回原来的类名函数。验证码输入钉在 1.5.0。锁文件里 150 个包的地址改回官方源。命令行工具自带的旧类名包还在,页面不引用。
| 检查 | 命令 | 结果 |
|---|---|---|
| 依赖卫生 | node node_modules/tsx/dist/cli.mjs --test tests/dependency-hygiene-20261026.test.ts |
1 通过,0 失败,退出码 0 |
U10 · 被放宽的点按检查改回来
没有新的产品故障,所以没有新的 BUG 编号。页面上多出来的只有两处为了让测试能点到真组件:登录图标在测试运行器里也能画出来;登录请求改为每次发送时再使用当前的网络函数,正式页面仍走原来的登录。
| 检查 | 原来 | 现在 |
|---|---|---|
| 星盘类型 | 只核对源码里有抽屉 | 点 D60 关闭,再打开后按 Esc 关闭,只选中这一次 |
| 导出抽屉 | 关闭和宽度断言被拿掉 | Esc 关一次,点遮罩再关一次,右侧最宽 520px,底部 85dvh |
| 登录 | 没有输入邮箱、发码、输码的测试 | 填邮箱、勾选同意、发码、六格填入验证码、验证后进入首页 |
| 大运折叠 | 打开标记用「不少于」 | 每一条当前大运的标题和内容各一个打开标记,数量正好是条数的两倍 |
| 外观 | 到共享菜单文件里找勾 | 菜单自己画出三选一,只有「跟随系统」带勾 |
| 账户设置 | 用源码正则核对栏目 | 打开后看见三个栏目,账单可以是当前页,表单宽度类名仍在 |
断言三栏(大运打开次数):原值 open.length >= currentCount。新值 open.length === currentCount * 2。原因是每一条当前大运的折叠根和内容面板各写一次打开标记,数量可以数清。
| 检查 | 命令 | 结果 |
|---|---|---|
| 这六处加上登录动作 | node node_modules/tsx/dist/cli.mjs --test 盘型、导出、星盘页、账户、外观、登录、登录动作 |
62 通过,0 失败,0 取消,退出码 0 |
U11 · 人物目录没到时不当成没建完档
没有新的产品故障,所以没有新的 BUG 编号。这三处里,目录这一处已经按「未知」处理。月亮星座和天空副句的星座,首页手里没有现成资料,不能新发请求,也不能编一个星座。
人物目录还没回来时,不再把它当成「没有别人」。只有名字、盘在别人名下的账户,不会在揭幕后闪出「看谁的盘」,热启动也不会因此改走冷路径。目录确实是空的,仍然算没建完档。揭幕会等到目录回来再显示,所以不会先闪一屏再改口。
起步第一问的「只有月亮」那一档,句子本来就会写。星座目前只从今日星语记住。没有出生分钟时,今日星语不请求。账户、档案、本命盘缓存里都没有月亮星座。星盘页那份结果要有分钟才会有,而且上升和月亮一起都有,对不上「只有月亮」。按任务书不能为了这一问再发请求,也不能临时编一个星座。所以这一档在第一次进首页、又没有分钟时,仍然走不到。有分钟时,今日星语回来后,上升和月亮两档照旧会写上。
帮别人看的天空副句,句子是「那一刻,{名字}的上升在{星座}」。名字在,上升星座不在,这一行就不显示,原来的天空句子照常播。上升同样只在已有的星座记录里,没有就空着。没有为了这一行再排一次盘。
| 检查 | 命令 | 结果 |
|---|---|---|
| 目录未知、已知空列表、副句,以及被改到的首页合同 | 在 frontend 下 node node_modules/tsx/dist/cli.mjs --test:home-warm-snapshot、onboarding-intake-20261022、home-first-load-20260930、home-bootstrap-run、composer-isolation-contract、chat-composer-queue、birth-time-consultation-consent、home-shell-growth-contract |
75 通过,0 失败,0 取消,退出码 0 |
断言三栏(引导页是否预载):原值是目录还没到也按空列表预载。新值是已知空列表才预载,未知不预载、步骤停在称呼。原因是未知不能当成没建完档。
断言三栏(输入框标签和禁用):原值认 onboardingStep。新值认 shownOnboardingStep,并在目录未到时不收起输入框。原因同上。称呼和发送的两句文案没改。
顺手项
没有新的产品故障,所以没有新的 BUG 编号。
- 测试用的文档只在需要文档的测试里安装。做服务端渲染的七个测试文件不再因为导入测试工具就装上文档。
- 外观菜单里已经没人用的
.theme-menu-check删了。选中勾仍由菜单自己画出来。 - 校正里选了「这题跳过」时,停止按钮呈选中。
- 六个没有入口的旧校正组件删了:引导轮、旧选项题、候选结果、证据草稿、旧校正页、更早的旧校正页。首页不再预热其中那一页。
- 提示和星盘圆点按每一项分开,不再共用同一个键。
- 清单「去做」在版本一致时走页面内跳转。版本对不上时仍整页打开。
- 点第三问把输入框点亮后,离开页面会把计时器清掉。
| 检查 | 命令 | 结果 |
|---|---|---|
| 上面这几处,加上首页行数和外观菜单 | 在 frontend 下 node node_modules/tsx/dist/cli.mjs --test 跑清单、校正表面、清单刷新、首屏揭幕、滚动、输入法、字数、旧引导、起步问、首页行数、外观、首屏屏、起步页、提示监听、分栏挂载 |
85 通过,0 失败,0 取消,退出码 0 |
类型检查和 lint
没有新的产品故障,所以没有新的 BUG 编号。报告列表换人时不在渲染里改引用,和 BUG-620 是同一条规矩。
- 四处测试只有类型不过:语言切换的循环变量、登录邮箱赋值、清单刷新的路由桩缺
bfcacheId、动效测试读透明。断言没改。动效仍是「失败或太慢时不能藏起来」。 - 侧栏拖宽把手改成组件库按钮。样子仍是 6px 透明细条。
- 报告列表记住「这份名单属于谁」。换人之后,上一位还在写的报告不会被当成这一位刚写完。
- 删掉已经没人用的类名
birth-time-evidence-receipt。原值在白名单里。新值删掉。原因是旧校正组件删了,这个类名没人用了。
| 检查 | 命令 | 结果 |
|---|---|---|
| 类型检查 | 在 frontend 下 node_modules\.bin\tsc.cmd --noEmit |
退出码 0 |
| lint | 在 frontend 下 npm run lint |
退出码 0,0 error,122 条原有 warning |
| 类型那四个文件 | node node_modules/tsx/dist/cli.mjs --test 语言切换、登录、清单刷新、动效 |
8 通过,0 失败,0 取消,退出码 0 |
| 把手、导出、报告列表、按钮样式、白名单规则 | 同上,六个文件 | 31 通过,0 失败,0 取消,退出码 0 |
| 类名白名单 | 同上,class-name-definition-contract.test.ts |
3 通过,0 失败,0 取消,退出码 0 |
全量 npm test 这次是在改文件的同时跑的,不能当作交回数字。5208 项,通过 5176,失败 32,取消 0,退出码 1。32 条里,13 条是 Windows 已知的数据库名单。birth-time-evidence-receipt 是上面已修的那条。启程阶段那条「300 毫秒内出现第一行」在全量里没赶上,单独重跑通过。其余是 Windows 上旧的双盘符路径、Skill 符号链接、部署脚本和临时目录被占。交回前会再跑一遍干净的全量。
真机步骤写进 docs/testing/ui-kit-migration-20261023.md 和 docs/testing/onboarding-journey-20261022.md 的「事后修复(2026-10-27)」。桌面加载不闪、中英能看出选中、老用户没有启程动画,这三项还没有登录态浏览器记录。
干净全量是在 7f6b7b575 上跑的。npm test:5208 项,通过 5175,失败 33,取消 0,退出码 1。
| 失败 | 条数 | 怎么看 |
|---|---|---|
tools/agent-loop/windows-known-failures.txt 里的 13 条 |
13 | Windows 上本来就过不了的库和备份检查 |
双盘符 G:\G:\、Skill 路径反斜杠、工作流 YAML 退出码 9009、部署脚本、临时目录被占 |
16 | 以前的进度里就有的 Windows 环境缺口。相关文件这张单没改 |
| 注销和校正标题两条真库 | 2 | 临时目录的库槽被占(EPERM)。不是这张单的断言 |
| 第一行进度要在 300 毫秒内、查找不重置回答时钟 | 2 | 全量里机器忙时没赶上。这两个文件单独重跑,17 通过,0 失败,退出码 0 |
birth-time-evidence-receipt 已不在失败名单里。全量里「本机 PostgreSQL 应用已审业务表并完成登录后的业务调用」通过。任务书要求的 npm run test:db 还要单独跑。
首屏体积(U8)
口径:npm run build 之后,.next/server/app/index.html 引用的 /_next/static/*.js 和 *.css,去重后每个用 gzip -9,字节相加。基线是 0f66d92d4,在另一棵工作树里用当时的锁文件 npm ci 再构建。两次构建的 / 都是 ○ Static。skill-package-registry.ts 的 5 条追踪警告两边都有,这次没改那份文件,也没改 next 配置。
| 版本 | 文件 | gzip-9 | js | css | 相对基线 |
|---|---|---|---|---|---|
基线 0f66d92d4 |
36,缺失 0 | 646201 | 575350 | 70851 | — |
| 延后加载之前 | 39,缺失 0 | 717631 | 636112 | 81519 | +71430,+11.05% |
| 延后加载之后 | 38,缺失 0 | 694941 | 613422 | 81519 | +48740,+7.54% |
延后加载之前那次构建在 521e902f3。超过 2% 之后,启程清单、一次性提示和启程动效宿主改成页面出来后再载入,不占位、不转圈。这一步少了 22690 字节。相对基线仍是 +7.54%,还在 2% 外面。多出来的是组件库外壳和整站样式,不是这三块还留在首屏里。
数据库和 Python 快速门
npm run test:db:93 项,通过 80,失败 13,取消 0,退出码 1。13 条失败和 tools/agent-loop/windows-known-failures.txt 逐条同名,没有多出来的。「本机 PostgreSQL 应用已审业务表并完成登录后的业务调用」通过。「order batch rereads the caller's rows and leaves the group unchanged when one id is foreign」通过。
Python 快速门 run_quality_gate.py --profile quick:pytest 通过,用了 1350.7 秒。接着它又跑了一次 npm test,退出码 1,所以整道门退出码 1。这次是 5208 项,通过 5178,失败 30,取消 0。
| 失败 | 条数 | 怎么看 |
|---|---|---|
| 上面那份 Windows 已知名单 | 13 | 逐条同名 |
| 双盘符、Skill 反斜杠、工作流 YAML 退出码 9009、部署脚本、临时目录被占 | 16 | 和干净全量里那 16 条同名。相关文件这张单没改 |
| 查找不重置回答时钟 | 1 | 全量里机器忙时没赶上。这个文件相对 staging 没改。上次单独重跑已通过 |
上次干净全量里另外 3 条(注销库槽被占、校正标题库槽被占、第一行要在 300 毫秒内)这次通过了。没有新的产品故障。