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>
21 KiB
三份修复单整合与独立验收 · 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。
开工预检
主会话已在独立基线运行:
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 ownerdelete_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,快照 SHA256d9cd1f8631c67b5f5679ebf85db7914d11b534de144c610e7b2f06183c125337。不替代最终标准 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 补记)
- 独立 Linux / Node 22 开工全量原始日志与失败清单保留;最终版本同环境全量执行,逐项核对失败标识与原因,新增失败 0,测试总数不下降。
- 真实 PostgreSQL 执行
npm run test:db,覆盖本人历史null/self与他人隔离、迁移纠偏及并发人数限制;不得以 mock 替代。 - P0 报告 worker 成功路径测试验证实际 engine 入参属于目标人物;人物删除走失败退点,不回落本人。
- tsc 无错误,lint 0 error;完整 next build 的
/保持 Static,首屏 gzip 与同环境基线相比 ±2%。 - Python 定向与 quick 真跑,未通过与环境缺口逐条列出;不改引擎口径与主服务增长合同。
- 旧断言三栏覆盖本轮所有修改,并补齐人物档案前轮遗漏;fixture 来自真实引擎。
- 对照三份任务书逐项独立复核。无受控登录态的浏览器验收保留为环境缺口并给出 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,SHA256438181e66b2368a6eefef2f47b7eb827ca5fe440b2e11c8d57d18d0b65077471。保留 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.ts39行、people-pagination-lifecycle.test.tsx35行。仅将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保持原状态。