Validate on Linux Node 22 and PostgreSQL 17: 3894 frontend tests and 64 database tests pass, with no removed test names or new failures. Preserve static Home, bounded gzip, assertion-change records and manual acceptance gaps. Co-Authored-By: Claude Code <noreply@anthropic.com>
164 lines
21 KiB
Markdown
164 lines
21 KiB
Markdown
# 三份修复单整合与独立验收 · 2026-09-25
|
||
|
||
## 授权与基线
|
||
|
||
- 产品要求同步代码并执行人物档案、报告读者版、西洋盘三份修复单;人物档案最优先,另两单在不交叉代码文件的前提下并行。
|
||
- 产品追加硬门槛:**必须用 Node 22 跑全量测试,并和开工时的基线逐条对比,新增失败为 0 才能推;修改任何既有测试断言均记录「原值 / 新值 / 原因」三栏。** 三份任务书进一步要求 Linux 环境。
|
||
- 已成功 fetch;本轮固定开工基线为 `48fe4daf519dab2a5c6bf4b01dd513067de1647b`(`origin/staging`)。任务书引用的旧版本为 `fabe0114`,验证代理核对二者仅 5 份文档差异,产品代码一致。2026-09-25 03:33 UTC 公共 staging health 只读核对 HTTP 200,web/api SHA 均为 `fabe0114dd324cf56e4690d1be7c16d42916af07`;这是开工部署基线,不是本轮修复部署证据。
|
||
- 主检出有既存未跟踪文件,本轮不切分支、不覆盖、不顺带提交。三个执行树、一个基线树与一个整合树均独立创建。
|
||
- 不提升 main、不改 workflow、不动 DNS、不进行生产发布;执行代理不自行提交或推送。
|
||
|
||
## 执行与整合顺序
|
||
|
||
| 顺序 | 执行工作树 | 范围 | 状态 |
|
||
| --- | --- | --- | --- |
|
||
| 1 | `.worktrees/people-archive-p1-fix-20260925` | TASK-people-archive-p1-fix-20260925 全部 T1–T7 | 执行中 |
|
||
| 2,可并行 | `.worktrees/report-reader-main-fix-20260925` | TASK-report-reader-main-fix-20260925 | 本地实现、独立定向验收完成,白名单已整合 |
|
||
| 3,可并行 | `.worktrees/chart-western-fix-20260925` | TASK-chart-western-fix-20260925 | 字符误点/宫号修正后独立复验通过,白名单已整合 |
|
||
| 基线 | `.worktrees/three-fixes-baseline-20260925` | Linux / Node 22 全量、DB、构建基线 | 已完成,零失败 |
|
||
| 最终整合 | `.worktrees/three-fixes-integration-20260925` | 顺序合入三单,独立审查和全量复验 | 报告与西洋已合入;人物修复审查发现及中间全量失败中 |
|
||
|
||
产品代码按各任务书边界隔离。BUG_HISTORY、CHANGELOG、DESIGN、任务索引等共用文档在整合树串行处理,不覆盖其它轮次记录。新 Bug 号人物档案使用 BUG-1031 / BUG-1032,西洋盘如需新记录使用 BUG-1033;报告沿用 BUG-1026 / BUG-1028。
|
||
|
||
## 开工预检
|
||
|
||
主会话已在独立基线运行:
|
||
|
||
```text
|
||
python scripts/pre_work_check.py --remote-timeout 8 --command-timeout 45
|
||
```
|
||
|
||
| 项目 | 实测结果 |
|
||
| --- | --- |
|
||
| Windows Node | 22.23.2 |
|
||
| Windows Python | 3.11.7 |
|
||
| Docker 引擎 | Linux,可访问;不得借用其它会话资源 |
|
||
| 远端可见性 | verified |
|
||
| 适配器、碎片扫描步骤 | 成功;不代表三引擎数值交叉验收 |
|
||
| focused tests | 23 通过、1 失败,预检整体 fail |
|
||
|
||
失败为 `tests/test_preflight_fragment_scan.py::test_preflight_fragment_scan_reports_authority_layers_and_risk_buckets`,断言要求机器存在历史 `.workbuddy/skills/jyotish-vedic-astrology` 镜像路径。与错误台账已有环境问题同类;不伪造镜像目录、不改断言消红。这不是本轮业务修复通过的证据。
|
||
|
||
## 已完成的开工测试基线
|
||
|
||
验证代理独立 Linux / Node 22.23.2 环境实跑(Docker 29.8.1、Compose 5.5.1、Postgres 17),原始证据位于主仓忽略目录 `artifacts/three-fixes-baseline-20260925-u2mvj0n4/linux-logs/`(不是提交内容);主会话已读取对应 README 核验环境与口径。
|
||
|
||
| 检查 | 基线结果 |
|
||
| --- | --- |
|
||
| npm test | 3863 通过 / 0 失败 / 0 跳过;顶层 TAP 名称多重集合 3833(另有嵌套用例) |
|
||
| npm run test:db | 61 通过 / 0 失败 / 0 跳过 |
|
||
| tsc --noEmit | exit 0 |
|
||
| lint | exit 0,0 error / 127 既有 warning |
|
||
| build | exit 0,首页 `○ Static` |
|
||
| 首页专属 JS gzip(level 9) | 4 块,130258 B;最终必须单独比较,避免共享资源分母掩盖增长 |
|
||
| 首页相对父 layout 增量 JS gzip | 8 块,229275 B(其中 4 块 99017 B 同时被其它页面共享) |
|
||
| 首页完整直链 JS/CSS gzip(level 9) | 32 份资源,合计 682982 B(JS 641409 B / CSS 41573 B);其余父 layout/runtime/CSS 共 24 资源 453707 B。三种分组均保留逐资源 SHA256 与清单,最终同口径比较;不同于旧任务书 130933 B 口径,不混比 |
|
||
| Windows Python quick 首轮 | 28 失败 / 920 通过 / 1 跳过,subprocess 默认 GBK 解码 UTF-8 报错;原日志保留 |
|
||
| Windows Python quick UTF-8 复跑 | `PYTHONUTF8=1 PYTHONIOENCODING=utf-8 python scripts/run_quality_gate.py --profile quick --skip-frontend-runtime`,948 通过 / 1 跳过,exit 0;前端由独立 Linux 全量验证,不冒称此命令包含前端 |
|
||
|
||
Python 基线日志在整合树 `artifacts/three-fixes-verification/python-quick-baseline.log` 与 `python-quick-baseline-utf8.log`。没有修改产品代码来解决编码问题。
|
||
|
||
**本轮 Linux 前端/DB 基线为零失败,最终版本必须零失败;不得引用前轮 Node 20 的 56/61 项失败作为豁免。**
|
||
|
||
## 分单独立审查与早期反馈
|
||
|
||
- 报告:独立只读 Windows Node 22.23.2 五文件 51/51,Python 年度两文件 21/21;D1–D5 已测范围无确认新增产品缺陷,5 处既有断言三栏齐全,22 SVG/泄漏零命中未弱化。白名单已合入整合树,5 个 oracle 纯换行副作用排除。真实引擎跨次 Shadbala 0.01 漂移限制见分单 PROGRESS,不宣称全报告确定性。
|
||
- 西洋:首轮独立 Chrome 扫描发现 64 真实盘中 5 个可见字符中心会命中另一行星;仅圆心点击为零错误不足以验收。另有 2/64 盘出现宫号间重叠,不接受排除宫号后称全部标签达标。修正绘制层与宫号径向位置后,独立原脚本 v2 复验 64 真实盘 / 2368 标签(含宫号)碰撞 0、2865 字符误点 0、704 圆心误点 0,原 5 例全部恢复;最小字号 12.5327px、命中直径 44.8538px。键盘处理器 Enter/Space 22 次正确、Escape 11 次忽略,样例相位选择前后均 2,骨架 text/button/aspect 均 0。主会话已读原始 JSON;产品/测试/raw fixture 白名单已整合。上述是组件/处理器验证,不冒称登录整页、真实 Tab 或读屏验收。
|
||
- 人物:本地定向 70/70 为执行方证据。独立后端六文件 39/39,但实际投影重现本人 `rectification_case_id` 遗漏导致旧候选范围丢失;实际 strict schema 重现有效 `subjectId` 别名残留导致 400,均退回执行方修。独立前端真实 bootstrap 注入重现旧 `?new=1` 入口仍硬编码本人;暖星历缓存账号边界仍在核查。标准用例通过不等于这些遗漏不存在。
|
||
- 人物早期 Linux 固定快照 `people-db-r1` 标准真实 DB 63/63、fail0/skip0(基线61);纠偏/并发及 GET self 路径已实跑。该中间快照全量 3868 项 / 3833 通过 / 35 失败,tsc 有 1 处测试 mock 返回类型错误,lint 0 error。主会话已提取 35 个失败名;包括旧生命周期 harness 未 bind、退役入口源码合同、Home 聚合 surface 扩大等,执行方须逐项修正并记三栏,不归为环境豁免。当前不得推送。
|
||
- **独立真实 DB 已确认删除人物退款遗漏(P0)**:fixture 余额 10,经 `authorize_usage(report.full,2)` 后 8,report generating/job queued;实际 authenticated owner `delete_chart_subject` 成功后 subject/report/job 均删除,余额仍 8、reservation 仍 reserved、refund 交易 0。worker 已无 job 可处理,不能用模拟 loadSubjectBirth=null 的测试证明此路径已修。日志主仓 `artifacts/three-fixes-baseline-20260925-u2mvj0n4/people-db-r1-refund-probe.log` 已由主会话读取,退回执行方补兼容新迁移与真实回归;阻止最终交付。
|
||
- 前端额外真实 React hook 探针确认旧人物 A 分页请求晚到会覆盖 B 的 nextCursor,导致 B 后续历史无法加载;真实 Provider + bootstrap 探针还重现切人 reload 期间复用已完成 ready、以及 account200/catalog503 被当作 account:null,两种情况均误跳登录。执行方修复中,原探针复验前不标通过。上述中间快照不是最终组合,业务修正及测试 harness 补齐后仍须完整复跑。
|
||
- 退款独立复验:r2 的删除 trigger 已能退款,r3 为修锁序误引用不存在 `j.report_id`,真实 DB 当场拦截,失败原日志保留;改用实际 `(user_id, request_id)` 后 r4 六场景全过:queued/running 删除 8→10 且只退一次、already released 幂等、completed 不退、ready 未完成计费窗口保留收费且后续 complete_usage 成功、两连接 worker 锁 job→delete 等待→complete_job 提交→删除无死锁。主会话已读 `people-refund-r4-matrix.log`;日志内标签误沿用 r3,实际 cwd/归档为 r4,快照 SHA256 `d9cd1f8631c67b5f5679ebf85db7914d11b534de144c610e7b2f06183c125337`。不替代最终标准 DB 全套。
|
||
- 人物第二轮独立探针:本人 caseId 的真实列投影、两种有效别名 strict schema 均已转绿;前端保留原失败脚本,另建 recheck,确认 `?new=1` 正确人物、旧分页不覆盖 B 游标、账户+self缓存隔离、provider reload 等待后正常启动、catalog503可恢复而非登出。Windows 六文件 39 项中 38 通过、1 处旧源码合同仍要求旧 ready API,已交执行方迁移并记三栏;不据此提前声明全量绿。
|
||
- 主会话在报告/西洋整合树额外运行两个报告 Python 文件,21 项全部通过、exit 0,日志 `artifacts/three-fixes-verification/report-integrated-python-targeted.log`;三份隐私扫描测试 70 项通过、exit 0,日志 `report-western-privacy-targeted.log`。仍不替代最终 Linux quick,后续人物与文档整合后需再核验。
|
||
- Linux Python 3.13 CI-style quick 首轮缺 Node 导致 1 失败;补齐独立容器 Node 22 环境后 948 passed / 1 skipped、exit 0。首轮日志保留,未改业务或断言。最终整合仍同环境重跑。
|
||
|
||
## 整合冻结进展与权限边界
|
||
|
||
- 人物生产源码及两份 SQL 已冻结,21 份修改源码和 5 份新增源码/迁移已按非删除白名单合入;逐文件 LF 规范化哈希一致,清单 `artifacts/three-fixes-verification/people-product-integration-whitelist.json`。人物永久测试最后补齐真实 provider→bootstrap 串联与独立 ephemeris 暖缓存跨账户场景,测试冻结后再整合运行完整门禁。
|
||
- 后端独立审查收束:限定范围无尚未修复的确认缺陷。040000 迁移 SHA256 `f783bacf370826d0d0bf35e68b6515edb081057a8fcb1d981fd3d1080218e67b` 与 r4 实测一致。删除 RPC 是 SECURITY DEFINER,以显式 auth.uid/owner/role 校验及 owner 过滤保障权限,不应表述为依赖调用者 RLS;受限退款触发器不开放通用退款权限。两连接结果只证明已测试调度,不声称穷尽并发。
|
||
- **权限阻塞:** 整合工具明确拒绝删除既存 `frontend/src/components/chart-library-panel.tsx`。未通过其它工具/代理绕过,整合树保留该旧文件;执行树已做的删除不等于整合交付已删除。其余非删除修复继续整合。若要清除此死文件,需用户明确许可;未经许可不以打包排除等方式变相删除。
|
||
|
||
## 最终交付门槛(历史清单;最新结果见 final-r4b 补记)
|
||
|
||
1. 独立 Linux / Node 22 开工全量原始日志与失败清单保留;最终版本同环境全量执行,逐项核对失败标识与原因,新增失败 0,测试总数不下降。
|
||
2. 真实 PostgreSQL 执行 `npm run test:db`,覆盖本人历史 `null/self` 与他人隔离、迁移纠偏及并发人数限制;不得以 mock 替代。
|
||
3. P0 报告 worker 成功路径测试验证实际 engine 入参属于目标人物;人物删除走失败退点,不回落本人。
|
||
4. tsc 无错误,lint 0 error;完整 next build 的 `/` 保持 Static,首屏 gzip 与同环境基线相比 ±2%。
|
||
5. Python 定向与 quick 真跑,未通过与环境缺口逐条列出;不改引擎口径与主服务增长合同。
|
||
6. 旧断言三栏覆盖本轮所有修改,并补齐人物档案前轮遗漏;fixture 来自真实引擎。
|
||
7. 对照三份任务书逐项独立复核。无受控登录态的浏览器验收保留为环境缺口并给出 testing 清单,不冒充通过。
|
||
|
||
## 测试断言变更
|
||
|
||
各单变更三栏分别归入各自 PROGRESS,整合阶段另做最终 diff 对账。
|
||
|
||
- 报告:5 处既有断言变更已由独立审查逐项核对,泄漏、安全、22 SVG 等无关约束没有弱化。
|
||
- 西洋:原 24 项名称保留,新增 4 项;raw fixture 与更保守字框语义变化有三栏,新扫描曾排除宫号的草稿已纠正,保留失败探索记录。主会话独立真实引擎重算 65 份 raw 响应,JSON 全等,未覆盖 fixture;证据 `artifacts/three-fixes-verification/western-raw-independent-replay.json`。
|
||
- 人物前轮补账:独立 `git show fabe0114` 对账确认 11 个测试文件 / 12 个位置完整覆盖(9 处 assert 预期、1 处 guards 取样源、1 处 DB fixture、1 处 fetch mock),无遗漏;两条新增保护断言也归入相关行。已将“本轮 bind 后捕获”的描述与前轮历史区分,未倒写历史。
|
||
- 人物本轮最终测试快照:20 个既有前端/ Python 合同文件修改、2 个新增永久行为测试已合入;补齐 ephemeris A/self→B/self 暖缓存隔离,以及真实 Provider generation reload→Home bootstrap 串联(含 `?new=1` 当前人物断言)。测试文件与人物源码均已 `diff --check`,白名单 `people-tests-integration-whitelist.json`。尚未跑整合 Linux 门禁。
|
||
- 人物文档已按段合入:BUG-1030 保持 investigating 并补齐 ready/scope 证据边界;新增 BUG-1031(worker错人/self metadata/删除预留退款)与 BUG-1032(OR is复发BUG-990);最终组合仍未提交、推送或部署。
|
||
|
||
## final-r4b:最终 Linux 前端、数据库与构建复验
|
||
|
||
本节取代上文中间快照的“最终待验”状态,但不解除受控登录、部署或删除权限缺口。开工基线 SHA 不变;2026-09-25 交付前再次 fetch,远端 staging 仍为 `48fe4daf519dab2a5c6bf4b01dd513067de1647b`。
|
||
|
||
- 验证环境:Linux、Node v22.23.2、专属 DinD 的真实 PostgreSQL 17;使用原 lockfile `npm ci`,不升级依赖。
|
||
- 快照:`final-integration-r4-clean.tar`,SHA256 `438181e66b2368a6eefef2f47b7eb827ca5fe440b2e11c8d57d18d0b65077471`。保留 Git symlink / mode、旧 `chart-library-panel.tsx`;不包含本轮过程 artifacts、node_modules、.next 或未授权副作用文件。
|
||
- 原始日志在授权隔离容器 `/work/logs/final-r4b-{test,db,tsc,lint,build}.{log,exit}`;摘要 `final-r4b-summary.json`,逐项对账 `final-r4b-versus-baseline.json`,资产分组由 `analyze-home-assets.py` 生成。旧 `final`(r2)及 `final-r4` 失败日志原样保留,不覆盖。
|
||
- wrapper exit 不代表全部通过;已逐一读取五个 `.exit` 并核对 summary / comparison。
|
||
|
||
| 检查 | 开工基线 | final-r4b | 结论 |
|
||
| --- | ---: | ---: | --- |
|
||
| npm test | 3863/3863 | 3894/3894 | exit 0,失败/skip/cancel/todo 均 0 |
|
||
| 前端顶层名称多重集合 | 3833 | 3864 | 无删除,新增 31 |
|
||
| 前端含嵌套名称多重集合 | 3863 | 3894 | 无删除,新增 31 |
|
||
| test:db | 61/61 | 64/64 | exit 0,失败/skip/cancel/todo 均 0 |
|
||
| DB 顶层/含嵌套名称 | 49/61 | 52/64 | 无删除,新增 3 |
|
||
| 新增失败/诊断变化 | 0 | 0 | 两套比较均为空 |
|
||
| tsc / lint / build | 0/0/0 | 0/0/0 | 全部 exit 0 |
|
||
| lint error / warning | 0/127 | 0/127 | 无新增,不顺修 warning |
|
||
| 首页 `/` | Static | Static | build 明确 `○ /` |
|
||
| 完整首屏 JS+CSS gzip | 682982 B | 684083 B | +0.1612% |
|
||
| 首页相对父 layout 增量 JS | 229275 B | 228235 B | −0.4536% |
|
||
| 首页专属 JS gzip | 130258 B | 129218 B | −0.7984% |
|
||
|
||
补充分组:JS 641409→642510 B(+0.1717%);CSS 41573 B 不变;增量共享 JS 99017 B 不变;父 layout/runtime/CSS 453707→455848 B(+0.4719%)。全部口径在 ±2% 内,不用总资源分母掩盖首页专属增长。
|
||
|
||
### r2 四个新增失败的修复与断言台账
|
||
|
||
| 范围 | 原值 | 新值 | 原因 |
|
||
| --- | --- | --- | --- |
|
||
| chat-session-url / static Home 源码锚点 | `await deps.sessionListReady;` | `await (deps.waitForSessionList?.() ?? deps.sessionListReady);` | 等待当前 Provider generation;仍检查预览不写 URL、首页不 fetchSessions、客户端读 query,不放宽 Static 合同 |
|
||
| report-row-delete / 挂载 fixture | 没有显式 account scope | 绑定明确虚构账户与空人物目录 | 真实目录 ready 闸门要求;tombstone、旧 GET 不复活、旧 finally 不清新 flight 断言不变 |
|
||
| session-list-lifecycle / Storage fixture | Node 无 localStorage | 隔离 Map-backed Storage,关闭及异常路径恢复原 descriptor | 浏览器依赖只补测试环境;StrictMode/current-ready/无误跳登录断言不变 |
|
||
| secondary-page-data / invalidate 行为 | epoch 改变一律抛 scope_changed | scope 改变才拒绝;同 scope invalidate 允许旧调用返回但禁止写缓存 | epoch 与身份不同义;生产实现修复,不改既有竞态断言来消红 |
|
||
|
||
四个原失败名已在 final-r4b 全量中通过:`home stays a client-read query on a static route`、`report cache invalidation rejects stale GET writes and stale finally keeps newer flight`、`mounted report center removes deleted row and an older GET cannot resurrect it`、`Home connects to the real provider current generation during person-switch reload`。
|
||
|
||
### 验证环境失败与处理
|
||
|
||
- Windows materialized symlink 导致 migration duplicate、Linux 污染 mode 导致 Skill hash mismatch,不修改迁移扫描器或 registry hash;保真 archive 内 symlink 正确,包 hash 为原登记值 `750a0d58c6731c0dbdeb5c785cea1bf8a3f73aaf94a560a86397805b7037724c`。
|
||
- 首次 `final-r4` 的 test / DB 各 exit 1,唯一失败名 `staging database environment file is ignored`:archive 无 `.git`,`git check-ignore` 返回 128。仅在隔离验证目录建立临时 Git/index 后用新标签 final-r4b 重跑;源 worktree 未提交,测试未改。
|
||
- Python 补验首次误在 Node 镜像调用 Python3.13 venv,解释器目标不存在,exit127;测试未开始,不记为业务失败或通过。需在匹配 Python 镜像并带 Node22 的环境另跑。
|
||
|
||
### final-r4b Python、隐私与交付边界复核
|
||
|
||
在匹配Python3.13 Bookworm镜像复用本轮验证卷、venv及Node22工具,逐一读取以下log/exit(均在`/work/logs/final-r4b-*`):
|
||
|
||
| 项目 | 结果 | exit |
|
||
| --- | --- | ---: |
|
||
| Python六文件定向(年度、读者版、API增长、人物/会话合同) | 49 passed | 0 |
|
||
| CI-style quick:`--profile quick --skip-yoga-logic --skip-frontend-runtime` | 948 passed / 1 skipped,与同参数基线一致 | 0 |
|
||
| 三份隐私测试 | 70 passed | 0 |
|
||
| public privacy scan | 3311文件,0 finding,pass | 0 |
|
||
| commercial privacy scan | 3311文件,0 finding,pass | 0 |
|
||
|
||
quick明确使用与Linux基线相同的CI参数;不声称运行Yoga逻辑全套或在此命令重复运行前端。前端由本节独立Node22全量覆盖。首次exit127及旧快照证据保留,不混用。
|
||
|
||
只读独立审计确认:78个候选文件(65 tracked修改+13新增),无依赖/锁文件/workflow变更,旧迁移未改,仅两份指定新迁移;`chart-library-panel.tsx`与HEAD相同。Home useState 33→33、useRef 37→37,文件1347→1349行;API主文件原样(215方法/10931行),无新增伪造点。既有断言三栏无剩余确认遗漏;report-polling原台账误述已按实际两处分支scope守卫更正。64个非文档候选文件与已测archive双侧LF规范化后全部一致,测试/生产源码没有在验收后再改。
|
||
|
||
交付前预检再次运行:远端verified,但focused仍失败。除历史镜像路径断言外,碎片计数断言为`4 >= 0 + 45`不成立(当前工作区残留增加,台账已有同类);不制造镜像、不清理其它工作区、不改断言,预检整体不写通过。日志`artifacts/three-fixes-validation-r4/delivery-pre-work-check.log`。这不改变Linux产品全量新增失败0的实测,也不是领域/oracle全绿声明。
|
||
|
||
最终暂存边界复核发现两个新测试文件含CRLF(此前未跟踪,普通diff --check未覆盖):`people-archive-regressions.test.ts`39行、`people-pagination-lifecycle.test.tsx`35行。仅将CRLF规范化为LF,逐行文本/断言完全不变;Linux Node22重跑两文件10/10、fail/skip/cancel/todo0、exit0,证据`/work/logs/delivery-lf-targeted.{log,exit}`。未修改生产代码,不改测试预期。最终暂存集的public/commercial隐私扫描均3357文件、0finding、exit0(与Linux快照扫描范围不同,分别记数);日志在`artifacts/three-fixes-validation-r4/delivery-*-privacy.json`。提交/推送状态以实际命令和远端SHA核对为准。无受控账号的整页移动端、真实Tab/读屏与staging health不据此声称通过;BUG-1030/1031/1032/1033保持原状态。
|