67 KiB
执行计划与阶段 0 基线记录
2026-09-08 独立复核与提交授权
- 用户已独立复核通过归档恢复、输出隔离、全仓回执与摘要校验的 33 文件包;本轮只补记复核结论,不更改获批实现。
- 用户本轮授权将门禁包与 AP 修复分别提交,并连同已有两个 Trellis 提交一起推送。此授权不包含部署、归档、R1 启用、合同阶段 B 或继续修复 58 条失败。
- 门禁任务只收口已完成子项,完整入口收敛与 R1 等未完成要求保持挂起;提交不表示整个 task 已完成。
- 两个其他未跟踪 task(业务观察准备、认证前置)不纳入本次提交;不把业务消息或交接记为完成。
本轮后续增量:归档截图与全仓状态
- 已保全新截图到 managed-diagnostic-20260907-04/preserved-tracked-screenshots,并仅恢复四张历史截图,登记摘要 14/14 匹配;未改 index。
- 两个 spec 的截图输出独立隔离,受管入口传入本轮目录,认证/断言不变。
- 全仓状态/已跟踪内容/index 快照及独立比较;所有退出路径保留后快照。
- 治理校验 14 张可定位归档证据及反例测试,恢复演练历史私有候选不冒充可本地验证。
- 针对性验证、全仓差异交审;独立复核待用户。不重跑全套、不推进 B/场景 8/经理缺口/R1,不提交/push/部署。
本轮写入范围:两个 spec 的输出声明;run-web-gates.sh、full-local-diagnostic.mjs、full-local-environment.mjs、check-trellis-governance.mjs;对应 QA 测试及当前 task/既有 spec。旧“27 文件”仅是上一轮计划内交付范围,不是全仓状态;新增污染四张 PNG 已单列保全与恢复证据,旧运行 sourceUnchanged 不再被解释为全仓未变。
本轮结果与回执
- 新截图保全:
artifacts/qa-flow/release-gate-integrity/managed-diagnostic-20260907-04/preserved-tracked-screenshots/,包含四张新 PNG、原/HEAD 摘要及恢复核验。先复制并逐字节摘要核对,再执行仅 worktree 的四路径恢复;未移除 index 条目。最后治理校验仍为 14/14,Git 中 output 的改动为 0。 - 增量验证/交审:
artifacts/qa-flow/release-gate-integrity/archive-output-protection-20260907-01/。两个 spec 除 fs 导入和输出目录声明外,认证/业务断言正文与 HEAD 逐字节一致,见spec-body-boundary.json;默认和显式输出根均经真实目录创建 fixture 核验,重复加载/spec 之间不共用输出目录。 - 新回执保留完整 Git 状态和 2906 个 tracked 文件的摘要、类型、模式,以及 index stage entries/flags。验证前后 sourceUnchanged=true、repositoryComparable=true、repositoryUnchanged=true,cleanAtStart=false / cleanAtEnd=false:只说明本轮测试未再污染已记录状态,不宣称当前树干净。未跟踪文件的状态保留,限定源码之外的未跟踪内容不冒充全量字节冻结。
- 故障回归证明:tracked output 即使命中 ignore 仍被检测;dirty→dirty 同路径二次覆盖可见;index-only/assume-unchanged flags 可见;删除、symlink 及缺少快照不会假 PASS。诊断遇模拟 tracked PNG 覆盖时同时保留 environmentQualified=true 与 candidateIntegrityStatus=CHANGED,固定 PARTIAL/2,不将环境和工作树混为一谈。
- 最终 QA:下列 node:test 命令 64/64 PASS,0 failed/skipped;另
cd client && npm run typecheckPASS,cd server && npm test -- tests/unit/scripts/check-trellis-governance.test.js为 3/3 PASS。语法、git diff --check、治理门禁通过,证据校验 14/14。docs registry 仍为 0 errors / 1 warning(既有 22 个未注册 docs),未扩大修复。
node --test scripts/qa/tests/{browser-environment-probe,full-local-environment,pwa-full-local-inputs,full-local-diagnostic-results,verify-full-local-discovery,registered-evidence,visual-output-isolation}.test.mjs
- 治理覆盖不是“17 条全部验证”:只对归档截图表中 14 个明确仓库文件做机械摘要核对。恢复演练文档的历史私有候选 SHA 缺少可公开定位的仓库文件映射,本轮未取私有参数/产物、未连接生产,不把历史摘要文字计作本地 PASS。
- 未重跑完整诊断或两个业务 spec;新路径与回执字段由针对性测试/typecheck验证。旧 58 条环境有效观测保留其原候选/原始回执,不回填新版全仓字段、不从 58 扣数;合同续约/归档仍未执行。后续仍按只读归因→阶段 B 原范围推进,R1/场景 8/经理缺口不变。整体 task 未完成,当前增量待独立复核。
1. 授权与独立范围
2026-09-07 最新授权覆盖此前“仅规划”状态:§10 实施及一次完整诊断获批;黑盒探针必须无 route mock、零 refresh、表单可见、原生在线独立采样。产品/业务 spec 不写,R1、阶段 B、31+2 不启动。
本轮冻结写入面:run-web-gates.sh、full-local-diagnostic.mjs;新增 full-local-environment.mjs、full-local-environment-inner.sh、local-postgres-proxy.py、browser-environment-probe.mjs;对应两个新增 QA 测试及 pwa-full-local-inputs.test.mjs 夹具接线;当前任务文档及现有部署/前端验收规约。不得扩到应用源码、业务 spec、发布入口或数据库业务规则。
- 实施受管环境创建/归属/前置与后置校验,内部 PostgreSQL/socket/代理生命周期归 runner。
- 实施无 mock 黑盒探针及环境回执消费,拒绝伪标记、缺项、环境漂移和表单可见但 refresh 已发生。
- 针对性单测、命令捕获及源码变异通过;原集合/并发/零重试/诊断 PARTIAL 语义不变。
- 最终来源冻结后,完成一次获批完整诊断;此前三次环境前置拒绝单列,新红项只记不修,清理按归属核验。
- 更新事实与回执并交审;独立复核仍待用户,不以主会话自检抵扣。不提交、push、归档、部署或启用 R1。
§10 本轮实施实测流水(已取得环境有效的新观测,待独立复核)
- 受管实现和验证证据:
artifacts/qa-flow/release-gate-integrity/environment-implementation-20260907-01/。最终对交审版本完整运行下列命令:51/51 passed、0 failed/skipped,见final-targeted-51.tap。此前 48 项、13 项 IPC 等过程回执各自保留,不累加成新的用例总数。语法检查、git diff --check、Trellis governance 通过;docs registry 为 0 errors / 1 warning(既有 22 个未注册 docs),未顺手修复。
node --test scripts/qa/tests/{browser-environment-probe,full-local-environment,pwa-full-local-inputs,full-local-diagnostic-results,verify-full-local-discovery}.test.mjs
- 交审包
review-files.json/full-review.diff共 27 文件(原获准 21 文件中 9 份发生增量变化,另加 6 个 QA 环境/测试文件)。来源层面与实际诊断冻结稿一致;仅任务文档在运行结束后补入结果,不把独立复核状态写成已通过。 - 三次环境前置尝试(managed-diagnostic-20260907-01/02/03)均在 initialize 停止,原生/browser/业务阶段均未启动,固定非零;独占容器 owner 匹配、已删除,scratch 已删除。原件保留,不冒充三次完整诊断,也不计业务失败。
- 实测错误为子 user namespace 读取父 namespace 的
EACCES。修复不是忽略权限:由父 runner 经本轮独占 Unix socket 即时直接采样自己的 namespace,子进程核对本轮 ID/PID/当前策略、真实祖先关系及自身/浏览器 namespace;IPC 缺失/错轮/错 PID/错策略拒绝。新增 IPC 反例通过,fake Docker 命令捕获证明 namespace 失败无降级,owner 不符不删除容器。 - 第四次启动已完成完整诊断:
artifacts/qa-flow/release-gate-integrity/managed-diagnostic-20260907-04/。来源冻结于source-before-diagnostic-04.json,1058 来源文件;诊断及外层环境回执均确认前后 commit/digest 未变。与在线实验的来源比对,646 份应用源码/业务 spec 文件均未变化;新增源只在 QA 环境合同范围。 - 外层环境 PASS,诊断 environmentQualified=true,整个诊断仍固定 PARTIAL / exit 2 / 无发布资格。原生空白页 online=true;候选探针 freshContext=true、initialSessionHint=false、导航前监听、无 route mock、表单可见、refresh=0、login=0,beforeNavigation/documentStart/afterForm 三个独立原生样本均 true。没有产品内部 bootstrap 观测字段或 AuthContext 改动。
§10 新诊断清单与证据边界
| 阶段 | 实际结果 | 阶段耗时 |
|---|---|---|
| PWA A/B 与完整发现 | PASS,65 文件 / 275 用例 | 99.742 秒 |
| Prisma 工具链 | PASS | 16.880 秒 |
| 服务端单测 | PASS,193 文件 / 1692 项 | 370.733 秒 |
| 前端 typecheck | PASS | 60.971 秒 |
| 候选构建 | PASS | 103.444 秒 |
| workflow-actions | FAIL,场景 8 | 73.540 秒 |
| server-regressions | FAIL,内部 workflow-actions 同一场景 8 | 113.271 秒 |
| 浏览器 | 199 passed / 54 failed / 4 timedOut / 18 skipped | 3179.951 秒 |
-
浏览器 275 条均有实际结果,NOT_RUN=0;集合对拍 issues=[],执行全局错误数 0,4 workers、retries=0、flaky=0。58 条失败/超时来自 36 个文件,是本次环境有效的失败观测,不是 58 个独立产品缺陷。旧 207 不恢复决策资格,也不能用 207−58 声称修复了某个确定数量。
-
18 skipped 保留原字段,其中 expectedStatus/reportedStatus 为 skipped/skipped 的 14 条、passed/skipped 的 4 条。没有开启 live/公网补覆盖,没有把跳过计作通过,也不把这 4 条未归类跳过全部预判成同一原因。
-
关键样本:payment-reviewer-permissions 为 16 passed / 1 timedOut;唯一超时回到 :397 的旧“更多”点击,:399/:400 的续约/归档仍未执行。R102 为 6/6 passed;contract-detail-workspace 为 3/3 passed;login-portal-ux 为 16/16 passed。这些通过不证明全部条件性风险候选已完成迁移评估。
-
PWA 已越过旧 build 校验和 /portal URL,实际在 :519 等待
navigator.serviceWorker.ready超时;新 build 升级意图尚未被完整验证。本轮只记录,不修、不推断其根因。该失败有 error-context,但未附带 trace;虽然全套命令显式 trace=on,仍不能宣称每个自建 context 都有 trace。58 条失败中 57 条有可读 trace 附件,PWA 是唯一例外;全体实际结果中有 258 条带 trace,探针 trace 另列,不混入用例数。 -
两个服务端失败来源均停在 8/23(409 / no_manager_found),不得计成两个独立缺陷;各自 9–23 组仍 NOT_RUN,regression-all 中未到达的后续套件也不补造结果。场景 8 保持未修改。
-
聚合诊断耗时 4023.446 秒(67 分 03 秒);浏览器阶段含独占库/服务准备与清理为 3179.951 秒,Playwright 原生计时为 3129.611 秒。三者分开记录,均不是普通 full-local 全绿耗时,不用于 R1 成本判定。
-
原始 Playwright JSON/HTML、截图、视频、trace 保留在
results/full-local-report/。派生results/browser-cases.json保留全部 275 条,results/browser-failure-inventory.json提供 58 条逐项失败与 65 文件分组、源码/策略摘要及原件哈希,results/browser-artifact-coverage.json单列 trace 和错误行号;派生件没有覆盖原件。 -
environment/result.json与cleanup-verification.json确认四次启动的独占容器均按 owner 核对后删除、scratch 均删除;完整诊断各阶段 cleanupExit=0。源码前后不变,末尾环境复验通过。没有提交、push、归档、部署、生产配置或数据操作。 -
本次交付只完成 §10 增量及获批新诊断;独立复核待用户。31+2 阶段 1 仍暂缓,合同阶段 B 仍保留原范围但未执行,经理缺口/场景 8/R1 继续挂起。R1 仍需清单清空、普通全绿实测和单独授权。
-
2026-09-07 最新处置:207 清单撤销真实浏览器红项/工作量/R1 决策资格,原件保留。以下历史运行数字仍是历史观测,不能继续作为当前待修清单。§10 已批准实施与一次诊断,替代此前仅规划状态。
-
顺序:环境合同审定 → 获批后实施及针对性反例验证 → 独立复核后按明确运行授权重跑一次诊断 → 按真实清单处理;阶段 B 仅恢复原合同详情及续约/归档范围,不扩成 31 文件迁移。场景 8、经理缺口、R1 保持挂起。
-
外层包装在本地 artifacts 有脚本、摘要和运行记录,问题是未进入受管执行合同,不是完全没有留痕。撤销旧清单资格不删除这些调查证据,也不宣称全部失败同根因或已修复。
-
用户已批准方案和两个边界,附先摸清 full-local 红项的前置条件。已 task start;初始阶段 0 及补充准备已完成,当前只交付另获批准的阶段 A §9 诊断子项,R1、其他阶段 A 与真实发布未开始。
-
HEAD=66f25b1、本地 origin/main=492920c;原
.trellis/tasks/09-06-payment-observation-readonly-preparation/全量保留,本轮不修改或归档其文件。 -
当前 inline,implement/check manifest 保持合法空文件;实施由主会话直接完成,不派 implement/check sub-agent。
-
不调查更多历史候选;已经独立复核的只读追溯是输入,不重新把“未找到回执”升级为“从未执行”。
2. 影响范围与复用入口
| 责任 | 拟涉及文件 | 约束 |
|---|---|---|
| 验证阶段与 skip | scripts/qa/run-release-gate.sh | 复用原 static/full-local,不复制第三套执行器 |
| 全套结果采集 | scripts/qa/run-web-gates.sh | 保留本地隔离 DB、服务端全量回归及 E2E,不误接生产环境 |
| 候选结果与持久化 | scripts/qa/run-local-candidate.sh、verify-local-candidate-results.mjs、一个共享回执模块 | full/focused/list 原有含义不变;不缩减 manifest |
| 写入前准入 | deploy/trialrun/production-identity-bootstrap.mjs、deploy-existing.sh、deploy.sh | 同一验证器、无循环、无纯布尔放行;生产前后置合同不退化 |
| 原用例恢复 | client/tests/e2e/payment-reviewer-permissions.spec.ts | 只改合成 fixture 和当前详情验收,不扩大到权限产品代码 |
| 回归 | scripts/qa/tests/ 与 server/tests/unit/scripts/ 相关用例 | 按真实调用事件及集合判定;旧 fixture 只能补真实依赖,不能加 bypass |
| 稳定合同 | 现有 deployment-trialrun、frontend-react-vite-design spec 及必要的现有操作手册 | 独立复核规则新增与兼容性收紧,不顺带改 Trellis workflow/hooks |
最终文件清单随已批准方案内的最小实现核对;若需改变业务权限、状态机、schema、migration、seed、flag、通知 routing 或真实数据,停止并另行请求批准。
3. 实施顺序
阶段 0:原样基线,完成后停下交审
- 读取现有 runner、环境、Prisma/seed、外联及清理路径,确认 full-local 会写本地合成测试数据,不能冒称 SQL 层只读。
- 使用独占 network=none 临时 PostgreSQL、无外网网络命名空间和仅 loopback 的本地服务;清空继承环境,仅保留明确测试参数。既有生产/业务容器不操作,数据库不借用共享业务库。
- 原样执行 bash scripts/qa/run-web-gates.sh full-local 一次;Playwright 配置零重试,无 grep/shard/only 参数,额外 reporter 仅采集结果,不替换 runner 或改变选择。结果 exit 1,见第 7 节。
- 保存发现错误、实际执行及未运行阶段、退出码、原始日志和脱敏红项清单;未形成完整浏览器集合,分母仍未知,不绕过前置冒充 full-local。
- 清理本次独占资源,确认已跟踪源码和旧业务包不变;本轮交用户审阅,等待新增阻塞处理范围及 R1 启用时机决策,不自动进入阶段 A。
阶段 A:先建立入口与回执故障检测
- 前置更新:用户已批准阶段 0 补充三项范围,但 PWA 选择及负金额诊断冲突仍按第 8 节交审,尚未进入阶段 A。
- 审阅批准后加载 trellis-before-dev;核对当前源文件仍与规划事实一致,冻结模式/覆盖/跳过合同。
- 先写纯验证器和隔离命令捕获反例;证明现有无回执部署与仅计数记录不能满足新合同,不先修合同用例掩盖缺口。
- 实现共享回执采集/验证与原子持久化,绑定真实候选、预期/实际 spec 和用例、筛选条件及逐项结果。
- 复用既有 ci-release 发布前阶段为无部署副作用的 verify-candidate 路径;保持真实发布身份/迁移链,无重复构建/部署或调用循环。
- 为所有普通写入入口建立同一验证器的集成与远端写动作零计数测试;真实强制点的接入/启用交付边界在阶段 0 审阅后单独批准,不能用本 task 完成自动开启,也不引入永久 bypass。纯只读 preflight 保持独立。
- 收紧两个 project-wide skip,缺记录拒绝,有明确批准引用也只得 PARTIAL/非零;不得生成发布资格。
- 保留 local-candidate full/focused/list 判定并持久化各自回执;不以一张定向回执替另一 profile。
阶段 B:再恢复合同只读详情用例
- 用当前详情入口和完整合成 fixture 替换旧菜单操作;先断言详情与生效状态加载。
- 真正执行新增/编辑/续约/归档负向断言,并以同一业务状态下的管理身份作对照。
- 在隔离副本中分别暴露续约和归档动作,证明对应断言非零失败;还原后回归通过。不得把试探改动留在工作区。
- 若发现真实产品权限缺口,停止该分支、保留失败并请求额外范围批准;R1 不启用、普通发布资格不成立,不放宽测试或权限。机制交付评审与新权限修复决定分开。
阶段 C:整体验证、只读复核与交付
- 核对原部署安全、来源和 49 项 db 生命周期测试仍有效;变更 fixture 不减覆盖、不削弱 fake 工具目录与身份约束。
- 运行全部回执/入口/skip 变异;移除真实源码中的一处保护必须使相应反例变红,不以 grep 某段源码存在性验收。
- 在本地隔离前提具备时执行完整非部署验证,核对真实结构化回执;任何其它失败继续阻断,逐项报告,不修未获批的旁支。
- 更新相关现有 spec/docs;涉及治理/发布控制的变化交只读独立 review,reviewer 不改代码。不得用本轮主会话自检冒充独立复核,不派 implement/check 代理。
- 运行 task validate、治理、敏感扫描、git diff --check;提交当前 task 的完整 diff 给用户审阅,不自动 commit/push/部署/归档。
4. 必需反例矩阵
| 类别 | 注入/输入 | 预期 |
|---|---|---|
| 入口绕行 | ci-release/all/deploy、bootstrap、deploy-existing、底层 deploy 直接运行,无有效回执 | 发布写动作 0;不依赖调用者名称相信“已检查” |
| 正常链 | 同一冻结候选的完整有效回执 | 原验收/部署顺序正确;发布只触发一次;已有生产前后置仍被调用 |
| 模式冒充 | focused/list/直接 grep/project-wide 回执改名,或置 GATE_PASSED=1 | 拒绝发布 |
| 来源漂移 | 换 commit、dirty tracked/untracked、策略/config/依赖输入变化 | 拒绝旧回执 |
| 范围漂移 | 缺一个 spec、同 spec 少合同用例、错源/重复/未知用例、shard/grep/only | 拒绝;计数相同也不能通过 |
| 结果漂移 | exit=0 但受管用例 failed/skipped/timedOut/interrupted、重试绿或 expected-failure | 拒绝 |
| 留痕失败 | 回执缺失、截断、写入失败、没有结束标记、运行中断后残留 | INCOMPLETE/FAIL,不能发布;不删除唯一证据 |
| skip 纪律 | 两个开关分别与组合,缺理由/批准引用/阶段范围 | 非零,禁止无记录跳过 |
| 获批诊断 | 真实引用的局部诊断,记录齐全 | PARTIAL/非零、明确未覆盖,不给普通发布资格 |
| 只读前置 | PRODUCTION_READ_ONLY_PREFLIGHT=1 | 仍只读退出,无发布回执、无后续写动作 |
| 合同边界 | 生效详情加载,reader 与 manager 对照;分别暴露续约/归档 | reader 反例红;正常 fixture 绿,断言确实到达 |
| 部署数据安全 | 原 existing/initialize、健康漂移和无 --no-deps 等反例 | 原有隔离门禁仍红;本轮不实际 initialize |
变异覆盖入口、profile、来源、集合、skip 五类保护;每类验证真实执行行为,而不是确认脚本出现某个字符串。测试只修改隔离副本或受控 fixture,清理自身临时进程,不读/改真实 Docker、SSH 或生产环境。
5. 拟执行验证命令与条件
以下命令用于实施阶段,本轮没有执行;新测试文件名以批准后新增的实际资产为准。
node --test scripts/qa/tests/verify-local-candidate-results.test.mjs
node --test scripts/qa/tests/check-flow-coverage.test.mjs scripts/qa/tests/check-minimal-profile.test.mjs
cd server && npm test -- tests/unit/scripts/deployment-db-lifecycle.test.js tests/unit/scripts/deployment-safety-contract.test.js tests/unit/scripts/check-source-provenance.test.js
新增回执/入口单测按仓库现有 Node test 方式运行;触及 Shell/Node 文件各做 bash -n/node --check。合同精确 Playwright 用例使用本地 Vite、合成 API mock、--retries=0,不读取生产合同。
完整验证只调用新验证专用模式,不能为了测试门禁执行带真实 deploy 阶段的 ci-release/all/deploy。发布入口集成与变异一律使用隔离命令捕获 fixture。真实 full-local 涉及本地数据库准备/回归,必须先满足原隔离目标与无外联要求,不能向生产 env 借配置。
开发中 dirty tree 的测试可作为诊断,不作为后续提交的发布凭证。只有另获提交授权并冻结干净候选后,才生成该 SHA 的可发布回执;如果当时仍有其它全量失败,保持阻塞,不能先部署再补证明。
6. 规划验收与当前状态
- 用户批准立项;创建独立 planning task,未启动实施、未更改原业务包。
- 按已有调用链与用户确认事实收敛 PRD;不重复历史取证。
- 复杂任务配齐 PRD/design/implement;默认 inline,不伪造未来 sub-agent 上下文。
- 用户审阅通过普通发布无豁免、skip 获批诊断及回执集合合同;附阶段 A 开工前先提交 full-local 红项清单的条件。
- 阶段 0 完整运行结果及未覆盖边界交审;R1 强制点生效与首次部署独立重跑要求见 PRD 后续授权关口,不计入 task 完成标准。
- 产品实现、独立复核、提交和真实部署:均未开始。
7. 阶段 0 原始 full-local 基线(2026-09-06)
7.1 运行事实与来源
- 实际命令:
bash scripts/qa/run-web-gates.sh full-local,原始入口完整运行一次,没有编辑 runner、测试或产品源码。 - 时间:2026-09-06 17:06:55–17:16:53,Asia/Shanghai;耗时 598 秒,full-local 与隔离包装器均 exit 1。
- 候选完整 SHA:66f25b1fa81d4acd27929c2900d8d5b531277268;本地 origin/main=492920c。两个未跟踪 task 目录仍在,因此这是 dirty 本地诊断,绝非该 SHA 的可发布回执。
- 持久证据:
artifacts/qa-flow/release-gate-integrity/baseline-20260906-02/下的 baseline-summary.json、full-local.log、discovery.json、discovery.log、起止/退出标记、源码摘要和清理复核。baseline-summary.json 是本轮诊断汇总,不是阶段 A 的回执模块实现。 - 前一次准备记录单独留在 baseline-20260906-01:预枚举因 PWA 构建输入缺失退出,没有进入 full-local。第二次包装器保留同样的预枚举错误后继续原始 full-local;所以是两次只枚举、一次完整入口运行,不是失败后重试至绿。没有覆盖第一份失败记录。
7.2 隔离与输出边界
- PostgreSQL 使用本轮独占的 postgres:15-alpine 容器,network=none、临时 PGDATA,不借用已有业务库或操作其容器。应用、Prisma、回归及枚举运行于独立网络命名空间,仅 loopback,无外网路由;TCP 代理只连接本轮 PostgreSQL Unix socket。
- 清空继承环境,仅传入必要工具路径和明确本地测试配置;真实服务凭据不透传。存储指向本轮临时目录;复用已有隔离 Python 的 xlwt/xlrd 依赖,未安装或修改依赖。
- 原始 full-local 包含建库、迁移、seed 和业务写回归,因此本轮“只读”指产品与生产不改,并非测试数据库只读。所有业务请求只进入本地合成库。
- 额外 PW_TEST_REPORTER 使用已安装 Playwright 的 JSON reporter,只增加结果输出。E2E_MODE=local、CI 未设置、retries=0、workers=4,manual 目录仍按原配置排除;未加 spec、grep、shard 筛选,未使用两个 project-wide skip。
- 原有 client/test-results 与 client/playwright-report 先保全,结束后已恢复;本轮报告单独保存。临时数据库剩余计数=0;自建容器、代理、服务、网络命名空间与临时存储均已清理。
- 所有已跟踪文件前后 SHA-256 校验通过;原业务准备包全部文件摘要未变。工作区仍只有原先两个未跟踪 task 目录;未提交、push、归档、部署或碰生产。
7.3 实际结果和未覆盖
| 阶段 | 本轮结果 | 范围限制 |
|---|---|---|
| Prisma generate/check-generated、临时建库/migrate/seed、Prisma validate | PASS | 只证明本地准备完成 |
| server npm test | 192 文件 / 1680 tests PASS | 不替代后续真实 DB 回归与浏览器 |
| client typecheck 与 build | PASS | 不替代页面验收 |
| 本地 server readiness | PASS | 不是生产 /ready |
| regression-workflow-actions | 第 6/23 场景组 FAIL;预期 HTTP 400,实际 200 | 1–5 组完成;6 组未完成;7–23 组未运行,场景组不冒称单条用例 |
| server regression-all | NOT_RUN | 原入口 fail-fast,未到达 |
| E2E 后台 job 模式切换及 Playwright full | NOT_RUN | 实际浏览器用例执行 0;总用例分母未知 |
| 独立 Playwright --list 预枚举 | exit 1:PWA_BUILD_A_DIR_missing | 发现流程未完成,报告 suites=0 不代表仓库没有测试 |
结论:取得了原始入口的失败基线,尚未取得“整套当前红几项”的完整分母。 一个 full-local 实际停止点和一个独立发现阻塞,不能相加写成“全套只红两项”,更不能以 1680 项单元测试绿声称候选合格。
7.4 新增阻塞及源码解释
- workflow-actions 的负金额夹具与提交重算不一致。
server/scripts/regression-workflow-actions.sh:991的 negative_not_allowed 场景绑定合成发票后,仅通过:266的 setter 把报销表头 total_amount 改成负数;:997要求提交返回 400,本轮实际 200,因此 error code/detail 与无 workflow instance 的后续断言均未到达。当前server/src/routes/reimbursements.js:4021在提交时先按明细重算,再:4026调用负金额校验;:1299的重算会覆盖表头。源码支持“表头注入被重算覆盖”的夹具漂移解释,不能据此说真实负金额被批准或付款。本轮不改夹具、不放宽断言、不绕过重算;新的有效负金额测试及应覆盖哪个入口仍待最小修复范围批准。 - 无参数 Playwright 全套连发现阶段都缺 PWA 双构建前提。
client/tests/e2e/pwa-cross-version-upgrade.spec.ts:40在模块加载时就要求 PWA_BUILD_A_DIR,随后还要求 B 目录和两份 SHA;缺失会在:66抛错。现有scripts/qa/run-pwa-cross-version-upgrade.sh:51/:52先准备两份构建,并在:56起传给该专用测试;当前 full-local 不准备或传递这些输入。本轮两次 --list 均独立复现首个缺失错误。这不是合同用例超时,也不能通过排除 PWA、填假路径或声称只需修合同来消掉;本轮未修。
以上只补当前源码解释,不追查这些阻塞持续了多久,也不调查更多历史候选。
7.5 保持未知的两项与下一步
- 合同只读用例:旧入口漂移已有上轮独立复现,但本轮 Playwright 没运行,不能记成“本轮又失败 1 项”;续约/归档边界仍未获得本轮验证。
- R102 主链路:本轮未运行,历史“编辑”按钮问题在当前候选是否仍存在仍未知,不靠源码猜测或单元测试绿抵扣。
- 不进入阶段 A,不修产品、不调整权限、不排除红项,不启用 R1。先请用户审阅新增两个阻塞,明确最小测试前提/夹具修复与补测范围;完整浏览器分母补足前,不建议决定 R1 随本 task 强制生效。
- 普通发布无豁免、获批 skip 仅 PARTIAL/非零、R1 独立启用、首次真实部署独立重跑的批准边界不变。本轮只有主会话自检,没有冒充独立复核;业务包仍可独立交付,未代发真实消息。
8. 阶段 0 补充范围与决策待审(2026-09-06)
最新批准:PWA (a) 已通过,保留文件间并发,--retries=0 属于 R2;负金额按用户指定的“场景改名归位 + 原函数直接单测 + 不可达性规约”三件事实施,不沿用本节旧的待审替代方案。执行顺序:PWA helper/归属回归 → 金额分层测试 → full-local。阶段 A、合同用例、其他新红项、R1 启用及提交/push/部署仍未授权。
- 用户批准 PWA 输入归属决策及实现、负金额夹具恢复意图、重跑 full-local 三项前置范围;明确 PWA 方案先审。不修合同或其他清单红项,不放宽断言、不缩集合、不进入 A、不启用 R1。
- 只读核对 PWA 专用供给方、顶层输入读取、Playwright 全量/候选子集区别和现有单 worker 规约;建议 (a),具体拆分与成本见 design.md 第 8 节。
- 将“每个非 manual spec 都须有覆盖归属”的要求补进 R2;(a) 的排除集合为空,不为 PWA 创建豁免。
- 只读发现负金额的前置正明细守卫,现有 spec 与单测均支持。指出“负明细 + 原 total_amount 诊断断言不变”的冲突,不自行将更早的正确拒绝定性成产品缺陷。
- 用户审定 PWA (a),只增加双构建;明确拒绝默认全局单 worker,保留文件间并发,固定零重试属于 R2。
- 用户批准金额分层:黑盒场景改名归位、精确明细诊断与 itemIds/无 workflow;原总额函数直接单测及不可达性规约。
- 实施共享 helper/两个入口/源码归属验证,17 项 Node fixture 回归通过;PWA spec、route-manifest 和 Playwright 全局配置未动。
- 金额代码及针对性验证:原函数仅新增既有 __testables 导出,12 条直接单测通过;连同前置明细/提交副作用测试共 43 条通过。随后 full-local 第 6/23 组真实 DB 黑盒验证通过,进入第 7/23 和第 8/23 组;不是以单测抵扣黑盒。
- 独立本地环境 full-local 补跑一次,保存发现/执行/未运行结果:第 8/23 组新增失败后按原 fail-fast 退出,未修该项或跳过前置。275 条浏览器用例仅枚举、执行为 0,完整红项执行分布未取得。
本节最初提案预计涉及两个 runner、共享 PWA fixture helper、相关 QA 测试和负金额回归场景;当时只更新 task 规划,未改已跟踪文件或跑业务测试。后续获批范围补入总额原函数单测及规约;实际实施、验证与未覆盖边界以第 9 节为准。
证据口径补充:默认 full-local 缺 PWA 输入时确实无法收集,但不据此推断过去每个浏览器用例都未通过其他入口执行;不继续逐次查历史。1680 单测 PASS 保留既有隔离 BIFF8 Python 的环境前提,不声明任意全新环境都已自动具备依赖,也不抵扣真实 DB 或浏览器覆盖。
9. 本轮实施验证记录
- 证据目录:artifacts/qa-flow/release-gate-integrity/full-local-after-input-fixes-20260906-01/;独占本地 PostgreSQL、无外网命名空间、合成账号与数据,隔离前提沿用第 7 节。代码为 dirty 候选,保存 HEAD、diff、包含新增代码的逐文件摘要,不具备发布资格。
node --test scripts/qa/tests/verify-full-local-discovery.test.mjs scripts/qa/tests/pwa-full-local-inputs.test.mjs:17/17 PASS,含真实入口调用捕获、CI/本地零重试与并发边界、双构建/输入/收集失败和省略 PWA 的隔离源码变异。cd server && npm test -- tests/unit/routes/reimbursements.amount-guard.test.js tests/unit/routes/reimbursements.expense-standards.test.js tests/unit/routes/reimbursement.submit-side-effects.test.js:3 文件 / 43 tests PASS,其中原总额函数直接单测 12 项。- Shell/Node 相关语法检查 PASS。未修改合同用例、PWA spec、Playwright 全局配置、route-manifest 或任何部署入口。
- full-local 双构建 PASS,完整发现及源码归属校验 PASS:65 文件 / 275 条用例;实际配置 workers=4、retries=0、收集 errors=0。发现清单不是执行通过回执。
- 本轮主会话自检,独立复核待用户进行;不派 implement/check 代理、不提交/push/归档/部署,不修执行中新冒出的红项。
9.1 补跑结果与新增红项
实际命令仍为 bash scripts/qa/run-web-gates.sh full-local,2026-09-06 19:26:33–19:38:24(Asia/Shanghai),711 秒,exit 1。本轮没有重试该入口;原始第 7 节的失败基线也未覆盖。
| 阶段 | 实际结果 | 解释 |
|---|---|---|
| PWA A/B 构建、非 manual 发现与归属 | PASS,65 文件 / 275 用例 | PWA 纳入同一集合,没有排除 |
| Prisma/本地库迁移种子 | PASS | 仅本轮独占合成库 |
| 服务端单测 | 193 文件 / 1692 tests PASS | 比首次基线多 12 条原总额函数单测 |
| 前端 typecheck/build、本地 readiness | PASS | 不代表公网或浏览器业务通过 |
| workflow-actions 第 1–7 场景组 | 完成 | 第 6 组负明细实写、合计核验、精确 400/VALID_001、reasonCode、itemIds 与无 workflow 断言均通过;第 7 组是后续场景准备 |
| workflow-actions 第 8 组 manager skip | FAIL:预期提交 200,实际 409 | VALID_001;workflow=no_actionable_approver;reason=no_manager_found;stepId=approval_1_manager |
| workflow-actions 第 9–23 组 | NOT_RUN | 原 fail-fast 未到达 |
| server regression-all、E2E 模式切换 | NOT_RUN | 未绕过前置失败继续冒充 full-local |
| Playwright full E2E | 0 executed / 275 discovered | 所有用例标 NOT_RUN,不是 skipped/pass;合同、R102、PWA 升级行为本轮均未实际重验 |
新增红项定位:server/scripts/regression-workflow-actions.sh:1052 的 manager skip 场景设置经理缺失后,期望自动跳过经理并产生财务任务;在 :1055 的提交动作就收到上述 409,财务任务/跳过历史等后续断言未到达。只记录实际响应和原期望,不在本 task 修测试、改审批规则,亦不先定性为产品缺陷。 原总额 setter 在其他场景的使用未顺手变更。
精确区分:分母现在可枚举为 275,但浏览器实际失败清单还没有形成。不能写成“只红经理缺失这一项”,也不能把合同或 R102 的历史失败计入本次执行数。R1 生效继续挂起,整个门禁完整性 task 未完成。
9.2 留痕、资源与边界
- full-local-result.json 汇总真实阶段与 275 条逐用例 NOT_RUN 状态;它标明 FULL_LOCAL_DIAGNOSTIC_NOT_RELEASE_RECEIPT。原始 full-local.log、发现 JSON、source ownership、构建日志与起止/退出标记均保留。
- amount-guard-mutations.json 记录仅在内存中编译的两类反例:移除负数拒绝或非有限值拒绝都会被对应断言发现。没有写回源码、没有数据库操作,不冒充真实 DB 回归或独立复核。
- 自有临时库剩余计数=0;容器、服务与代理均已停止,PWA 构建目录与本轮临时存储已移除。报告目录保留,原有 Playwright 目录不被 full-local 删除或覆盖。
- 运行前后候选代码(包括新增文件)SHA-256 校验一致;原业务准备包摘要未变。HEAD=66f25b1,本地 origin/main=492920c;只有本任务实现、规约和 task 文件的工作区改动,未提交、push、归档、部署或触碰生产。
- task validate、Trellis 治理(0 errors / 0 warnings)、敏感扫描(0 findings)、错误原因码 strict 与差异空白检查通过。运行代码除 QA/回归工具外,应用侧仅增加已有 __testables 中的函数导出,金额函数和业务守卫逻辑未改。
10. 用户复核通过及第 8 组只读归因(2026-09-06)
- 用户独立复核并批准上轮 18 文件 diff;本轮只读核对前逐文件对照 review-files.json,18/18 摘要一致。原 review.diff/review-files.json 保留不覆盖,业务包未动。
- 从既有 full-local.log 的第 857 行只提取错误码和指定 details 字段:VALID_001,workflow=no_actionable_approver,reason=no_manager_found,stepId=approval_1_manager。details 键集合仅有 workflow/reason/stepId,响应不存在 skipped 数组;不能将“没有字段”当作空数组或仅有 manager 的数组。
- reimbursements.js:4192 显式传 blockOnUnresolvedAssignee: true;utils/workflow.js:5 把 no_manager_found 列入阻断原因,:512 的严格分支先抛 409,:525 的 skipped.push 尚未执行。故本次并非 manager 已跳过、finance 无法接续,而是提交被经理解析失败直接阻断,finance 未到达。
- reimbursements.js:4256 的 step_id/reason/depth_checked 是成功创建 workflow instance 后写入 workflowHistory 的 payload,不是 409 响应。无 actionable 的路由分支 :4196 仅返回 workflow 字段;本次带 reason/stepId 的错误来自 resolver 内部严格分支。
- 用 node stdin 调用当前导出的原 resolveActionableStep,合成 owner 无经理、steps 明确包含 manager + finance;tx 仅为内存只读 fake,finance 的 assignee_rule getter 记录访问次数。严格参数 true:抛出与日志相同的 409/details,finance 访问 0 次;仅对照参数 false:finance 访问 1 次并成为 actionable,skipped 为 manager/no_manager_found/depth 1。两个断言组 PASS;未改函数、未连数据库,false 只用于内存对照,不改真实提交开关。
- 既有 workflow.test.js:226、:355、:382 已分别规定无兜底时缺经理阻断、strict-submit 阻断和非 strict 兼容跳过。源码追溯显示严格分支及提交调用参数来自 8da16f5(2026-05-10),不是本轮引入;此处未重新跑整套单测,也不将阅读旧单测冒充本轮执行。
- 已可确认场景 8 的“严格提交缺经理仍应 200”预期与当前严格提交合同冲突;没有依据归成 finance 节点缺失、finance 身份失败或续接回归。未恢复已清理临时库的完整规则快照,不声称生产配置或财务身份已验证。场景 9 的造数意图不能推翻实际 strict 分支;任何场景改名/断言或规则变更仍另待范围批准。
11. 诊断模式决策与下一步
采纳用户提出的阶段级诊断方向,不另建 task;设计第 9 节是增量交审稿,当前未改 runner 或启动阶段 A 实现。它将失败套件与后续浏览器解耦,但不承诺穿透每个套件内部的 fail-fast。R1 除红项清单外,新增普通 full-local 完整绿路径实测耗时作为启用决策输入,不计入本 task 完成标准。
- 提取既有 409 的指定字段并核对严格分支,不造 skipped 响应、不读生产。
- 原函数双节点内存对照,明确 finance 未访问及非 strict 对照结果。
- 更新 PRD/设计/当前记录,保存原获批 diff;只采纳诊断方向,不倒写实现授权。
- 用户审阅并批准 §9:继续边界、隔离方式及 PARTIAL/2 合同;只启动此诊断子项,不等待或修复场景 8。
- 获批后仅实现该子项与命令捕获/模式反例回归;普通 gate fail-fast 不变。
- 一次隔离诊断,交真实失败、未覆盖、环境阻断及耗时;不修新红项,不启用 R1。原始结果与执行器收尾定向验证分开,见 §12.3–12.4;独立复核仍待用户完成。
12. §9 获批实施(2026-09-06)
- 当前执行顺序:复用 runner helpers 实现诊断阶段与持久结果 → 命令捕获/模式变异 → 一次隔离诊断。其间只读核对经理解析盘点的既有通道,不修改生产组织数据、账号或审批配置。
- 场景 8 保持原失败;经理数据没有答案前不改,盘点本身也不自动批准测试或产品修复。场景 8 后续若另获批准修复,再单独补一次诊断,不能把首次结果冒充 9–23 组已覆盖。
- 本轮明确授权引用:用户本轮“§9 诊断设计:批准”;不替代 R1、其他阶段 A、提交/push/部署的批准。
12.1 实施与首次诊断过程留痕(已结束)
以下保留运行中的发现和当时的收尾计划;最终结果见 §12.3,修正验证见 §12.4,不将后来定向通过倒写为首次整套通过。
- 复用普通 full-local 的输入准备与浏览器命令,新诊断协调器只捕获独立严格 shell 阶段;普通 fail-fast 入口未放宽。32 项 QA 验证通过,含全绿也 PARTIAL/2、缺批准记录拒绝、原普通失败短路、独立新库、准备失败依赖阻断、清理失败、浏览器结果及非零保护源码变异。
- 首次诊断证据:artifacts/qa-flow/release-gate-integrity/diagnostic-run-20260906-01/。候选代码冻结后只改 task 文档或忽略证据,不修改运行代码;诊断已实际越过 workflow-actions 失败并进入浏览器,尚未完成时不预报通过数。
- 发现本轮执行器自身的环境冲突:传给子进程的 TMPDIR 含
hyb-full-local-diagnostic-,导致 deployment-safety-contract.test.js 的合成 remoteDir 含禁止的 local token。服务端 6 项由此在实际 SSH fixture 前被 REMOTE_DIR_NON_PRODUCTION_IDENTITY 拒绝,原始结果为 1686 passed / 6 failed,不将它们归成业务回归。当前候选冻结收集完毕后只调整执行器临时根命名,定向重跑原部署身份测试;不放宽生产身份守卫或测试断言,不覆盖首次失败回执。 - 原 validateExactProductionIdentity 的纯内存路径对照已确认:旧前缀拒绝,中性 hyb-qa-inventory 前缀通过;无网络或数据操作。报告在 diagnostic-implementation-20260906-01/temp-path-guard-probe.json。
- 进一步自检发现隔离边界:首次版本仅在外层 workflow-actions、regression-all、browser 之间换库,regression-all 的 --json-report 会在内部共享库上越过 workflow-actions 失败。后面的资产状态和 IM secretConfigured 断言虽实际失败,但不作为净库独立产品结论。收集结束后移除该聚合器的继续参数,保留其原内部 fail-fast;外层诊断仍继续到新库浏览器,不绕过失败后的数据前置、不扩写新的子套件执行框架。原聚合输出及潜在污染边界保留,不倒写成从未执行;新版内层首个失败后的其他子套件如实 NOT_RUN。
12.2 经理只读盘点
- 正式快照:2026-09-06 20:49:02(Asia/Shanghai)。通过唯一非 root 数字 UID 归属身份,核对冻结 systemd 合同、env/runtime origin、运行中 server/db、应用数据库 DNS 指向与查询库名摘要一致后,只读执行计数。生产 build 仍为 f223bfb72fb2。
- 连接 default_transaction_read_only=on;事务 REPEATABLE READ READ ONLY,实际 read_only=on,statement timeout 10 秒、lock timeout 1 秒,最后 ROLLBACK。仅输出计数和角色布尔分组,不读人员姓名/编号、卡号、合同或业务正文,不登录或修改生产业务账号。
- 范围为未归档、登录 status=active 且 employment_status 为 probation/active/offboarding 的记录:7 条中 4 条 direct_manager_id 为空,0 自环;另外 3 条返回经理 ID,所引用经理不存在/停用/归档/inactive 的计数均为 0。
- 无经理的 4 条中,3 条不含 CEO 角色(其中 1 条含 manager 角色),1 条含 CEO 角色。没有拆 smoke 与真人,也未读取/匹配六条路径的实际规则快照,不能说成“4 位真人六路全部锁死”。buildApprovalWorkflowSnapshot 对配置了 owner_self_fallback_role 的 CEO 可能作显式兜底;manager 缺失是已证实的组织缺口,实际路径影响仍需核对适用规则与身份。
- 该业务风险单独优先交负责人,不因此改经理关系、规则或场景 8;场景 8 继续保留失败。身份与事务证据、SQL、可复验只读探针位于 artifacts/qa-flow/release-gate-integrity/manager-readonly-20260906-01/。
- 前两次探针未形成可信计数结论,保留 attempt-1/2;第二次明确定位到本地按行解析多行 JSON 汇总失败。修正的是本地 JSON 流解析,不改变 SQL 范围或只读保护;第三次完整解析结果单独留痕,不补造前两次通过。
12.3 首次完整诊断结果
- 时间:2026-09-06 20:41:03–23:58:26(Asia/Shanghai),11843.619 秒,约 197 分 24 秒。浏览器框架自身 10827.400 秒,外层 browser 阶段含独占建库/服务/清理为 10873.879 秒;两种计时口径分列。这是包含失败等待的 PARTIAL 诊断成本,不是普通门禁全绿耗时。
- 完整发现及结果对齐 65 文件 / 275 用例,4 workers、0 重试、0 flaky、0 缺失结果、0 未知/重复用例;结果为 50 passed、76 failed、131 timedOut、18 skipped。共 257 条非 skipped 结果;“275 条都有结果”不等于全部实际执行。54 文件含失败,6 文件全通过,另 5 文件全部 skipped。
- 207 条失败仅是框架结果数,不是独立产品缺陷数。原始错误粗分有 128 条 locator.fill 等待、69 条 expect、10 条其他错误;这只是错误操作分组,不是根因判定。完整逐文件及逐用例清单均留在证据目录,不在 task 中复制原始 payload。
- 合同/付款权限文件 17 条均 timedOut;合同只读场景本轮先停在 login-identifier 的登录 helper(:343),没有重新执行到旧“更多”及续约/归档断言。R102 6 条均 timedOut,报销日期场景本轮先停在登录 beforeEach/helper(:355/:348),不能据此确认或否定原按钮名漂移。PWA 1 条 timedOut,停在旧 build 首次页面 URL 断言(:519),尚未完成 A→B 升级链;输入与发现 PASS 不抵扣行为验收。
- 18 个 skipped 中 14 个 expectedStatus=skipped,4 个 expectedStatus=passed。保留原 expectedStatus、reportedStatus、annotation 类型及逐次结果;不把全部跳过归成 serial,也不把条件跳过计为通过。即使清完失败,14 个当前条件跳过仍需独立确定如何满足原完整集合合同,不能静默排除、更不能未经授权开启 live/公网测试来凑绿。
| 阶段 | 首轮结果 | 秒(四舍五入) | 解释与未覆盖 |
|---|---|---|---|
| inputs | PASS | 99 | 临时 PWA 双构建与独立文件枚举;不等于行为通过 |
| tools | PASS | 17 | Prisma generate/check-generated/validate |
| server-unit | FAIL | 376 | 193 文件,1686 passed / 6 failed;6 条 TMPDIR 污染见 §12.4 |
| typecheck | PASS | 61 | 未改前端源码 |
| client-build | PASS | 103 | 与 PWA 临时 A/B 构建分开 |
| workflow-actions | FAIL | 77 | 第 8/23 组 200→409;9–23 组 NOT_RUN |
| server-regressions | FAIL | 236 | 原聚合回执 5 passed / 3 failed / 7 skipped;workflow 重复来源,资产/IM 附同库继续污染风险 |
| browser | FAIL | 10874 | 原始 50 通过 / 207 失败 / 18 跳过 |
- 诊断与外层 harness 均 exit 2,状态始终 PARTIAL。所有阶段 cleanupExit=0;库剩余计数 0、独占容器/临时根/PWA scratch 已消失,前后源码摘要一致,旧业务包逐文件 SHA 校验不变。没有重试本轮浏览器、没有在运行中改候选、没有生产写入。
- 原始证据:artifacts/qa-flow/release-gate-integrity/diagnostic-run-20260906-01/ 下的 diagnostic-report/diagnostic-results.json、full-local-report 中的发现与 Playwright JSON;派生 inventory-summary.md/json、browser-cases.json、browser-failures.json、browser-not-executed.json 及 inventory-sha256.json。原始文件保留,不用派生清单覆盖它们。
12.4 运行结束后的两项执行器修正与验证
- 中性 scratch:createDiagnosticScratch 使用 hyb-qa-inventory 前缀,避免 TMPDIR 把 local token 带进原部署身份测试的合成 remoteDir。新增测试直接调用实际创建函数和原 validateExactProductionIdentity,同时保留旧前缀被拒的对照;生产身份规则与既有测试断言均未改。
- 内层 fail-fast:移除诊断 server-regressions 对原聚合器的 --json-report 参数。新增回归运行原聚合器和合成子套件,证明普通调用在 workflow 失败后不执行后续套件,而恢复继续参数会跑到后续写库步骤;不是仅搜索 flag 字符串。外层独立新库浏览器仍可继续。
- QA:node --test scripts/qa/tests/full-local-diagnostic-results.test.mjs scripts/qa/tests/pwa-full-local-inputs.test.mjs scripts/qa/tests/verify-full-local-discovery.test.mjs → 34/34 PASS(51.727 秒)。保留首次冻结版 32/32 回执,不覆盖为 34。
- 原身份/金额定向:在无外网命名空间、中性 TMPDIR 执行 cd server && npm test -- tests/unit/scripts/deployment-safety-contract.test.js tests/unit/routes/reimbursements.amount-guard.test.js → 2 文件 / 36 PASS,其中身份 24、金额 12,5.27 秒。它证明六条执行器假红的定向修正,不冒充首轮服务端 1692 全绿。
- 真实净库 helper 定向:独占 network=none PostgreSQL、原迁移/种子/服务、新库执行私有 server-regressions 阶段;Smoke、Dedup 通过,workflow-actions 第 8 组仍返回 409/no_manager_found/approval_1_manager,阶段 exit 1。聚合器只到 3/15,4–15 没有执行;cleanupExit=0、库剩余 0,测试 harness exit 0 表示预期失败与清理检查成立,不是聚合器 PASS。没有第二次运行全套浏览器。
- 收尾相对首次冻结源码只变 5 文件:两个诊断执行文件、两份 QA 测试及 deployment-trialrun 规约。运行原始结果绑定旧摘要,交审代码绑定收尾后摘要;金额、PWA helper、合同/R102/场景 8 及业务逻辑未再改。
- 定向证据:artifacts/qa-flow/release-gate-integrity/diagnostic-implementation-20260906-01/qa-tests-postrun.log 及 postrun/。只由主会话验证,用户独立复核尚未发生。
12.5 当前交付边界
- 本轮整体候选 21 文件(前轮 18 文件 + 3 个诊断文件),不含旧业务准备包或忽略 artifacts。交审 diff 与文件摘要单独生成,不覆盖之前已审快照。
- 最终本地核验:Shell/Node 语法、task validate(inline 两份清单各 0 entries)、Trellis governance(0 errors / 0 warnings,1276 文件)、敏感扫描(0 findings)及 tracked/untracked whitespace 检查通过。回执在 diagnostic-implementation-20260906-01;完整交审包在 artifacts/qa-flow/release-gate-integrity/diagnostic-review-20260906-01/review.diff 与 review-files.json,检查不冒充用户独立复核。
- 经理缺口先交负责人核对真实身份与适用规则;场景 8 不因本次盘点自动获得修改授权。业务风险、过时用例、浏览器失败三条事实分开,不预设因果。
- R1 继续等待红项及未覆盖清单处置、普通 full-local 全绿及实测总/分阶段耗时、单独启用批准。其他阶段 A、合同阶段 B、本 task 整体 AC 均未完成;没有 commit、push、归档、部署或任何生产数据/配置/账号写入。
13. 获批带 trace 对照实验与诊断补强(2026-09-07)
- 用户已独立复核通过 §12 的 21 文件。随后只读核对:当前三张 rejected 的 CEO owner 有 finance 显式兜底;通过集中至少五条确实执行浏览器登录;代表性合同失败截图已显示工作台而非登录页。上述事实不等于提交全链成功,也不能把 207 个原始失败归为同一个根因。只读证据仍保留在 readonly-followup-01 及两份 rejected-owner 查询目录。
- 本轮新增授权仅为两次本地合成浏览器实验(单条 1 worker / 全套 4 workers,均零重试且 trace=on),然后为 §9 诊断入口强制 trace。普通门禁的零重试和 worker 配置不变;普通模式 trace 策略本轮仅评估、不顺手修改;不修浏览器用例、场景 8、产品或数据。
- 对照使用获准收尾后的运行代码与相同本轮构建;按现有诊断 helper 的本地数据库、种子、应用环境和服务清理方式分别新建隔离库/存储。实验 wrapper 只在忽略证据目录提取现有 runner 定义、调整导入根路径及浏览器选择/trace 参数,不修改候选脚本;记录转换与实际命令,不冒称普通 full-local 完整验收。
- 单条先完成并清理,再启动全套,避免两实验并发改变负载。两轮均保留原超时、不重试、不改断言;全套仍含全部非 manual 用例和 PWA 输入,不缩集合或开启 live。原 197 分钟不用于绿路径成本估算。
- 合同旧“更多”断言是已知红点,因此比较登录前置的导航、认证请求、填写状态及真正失败位置,不能要求单条整个用例必须绿才证明它完成了登录;单次不同结果只说明条件相关,不能凭一对实验断言已证明稳定性或排除了所有竞态。
- 冻结候选与工具/构建条件,执行单条实验并读取 trace。
- 同候选启动全套 4 workers;目标用例失败并落盘完整 trace,完成针对该用例的比较。全套在后续 263 条结果行处以 143 中断,不能将此勾解释为整套完成。
- 全套完整终态:本次未取得,保留中断证据,不重试至绿,也不伪造 Playwright JSON。
- 实验停止且孤立资源清理后,只补诊断 trace 参数、命令捕获回归和规约;35 项针对性验证通过,零重试、默认并发、PARTIAL/2 和普通门禁行为不变。
- 交代表性实验结论、中断边界和增量 diff;去重归因清单仍待证据,R1/提交/push/部署保持未授权。用户独立复核待进行。
13.1 对照现场与结论
证据根:artifacts/qa-flow/release-gate-integrity/trace-comparison-20260907-01/。source-before.json 绑定获准收尾后的候选、完整源文件集合/摘要及 wrapper 转换;运行前后源码一致,没有在实验中修改测试或应用。inputs/tools/client-build 均完成且 cleanupExit=0,两实验共用该次构建,各自新建数据库与服务。浏览器执行前准备未重跑服务端单测或 workflow-actions,不冒充完整诊断流水线。
| 对照 | 实际选择与条件 | 代表性合同用例结果 |
|---|---|---|
| single | 单文件精确 grep 合同只读标题,1 worker,trace=on,retries=0 | timedOut;215143ms;停在 :343 的 login-identifier.fill,未到旧“更多” |
| full | 发现 65 文件 / 275 用例,无 spec/grep/shard 筛选,4 workers,trace=on,retries=0 | 同一用例在 :343 失败,完整 trace.zip 包含 180000ms 超时事件;该结果先于整套后续中断落盘 |
- 两份当前 trace 中都没有 POST /api/auth/login。single 在 goto 起点后约 1129ms 发出 refresh,约 1221ms 开始 fill;full 对应约 2180ms 和 2295ms。refresh 均在没有 has_session 请求标记的情况下得到 200 和非空令牌,随后 /api/me 得到 200 和身份。两次最终截图均为已渲染工作台。时间是 trace 起点偏移,响应耗时另列,不把请求起始时间冒充响应完成时刻。
- 结论仅为:本用例的登录前置失配在单 worker 也可复现,不支持“只有全套并发才失败”的分支;不是隔离绿、满载红。单次配对不能证明绝对确定性、排除所有竞态或保证门禁可复现,也不能把 207 个原始失败合并为一个已确认根因。
- 已保存旧 trace 的实际时间为 2026-09-06 12:33:18(Asia/Shanghai),不是用户提及的 09-04 留痕,不能混记。旧 trace 先完成标识/密码填写和提交,进入合同页,才等待“更多”;当时登录前没有 refresh,请求 refresh 发生在登录后。
- 旧 trace 实际请求 /@vite/client、/@react-refresh、/src/main.tsx;当前两次实际请求 /assets/ 构建产物。旧与当前 trace 内嵌的本用例源码均与冻结文件逐字节一致。这证明运行条件不止并发有差异,不证明“开发/构建模式”已经被单变量实验确认为根因。其余网络/会话初始化条件尚未逐项隔离,未修任何下游红项。
- 两份当前 trace 的资产请求集合一致;其中可从 archive 取到响应体的两个资源 SHA-256 一致。不将两个可核对响应体冒称所有 bundle 内容都在 trace 内逐字节核验。其余同次构建依据是 wrapper 只构建一次以及候选冻结,证据口径分列。
13.2 全套中断与清理
- 单条完整报告存在;全套目标用例完整 trace 存在且可读。然而整套在已输出 263 条结果后工具会话返回 143,没有 full/exit、full/outcome.json 或全套 Playwright JSON。终止信号来源未确认;不是已知断言正常收尾,也不能编造剩余 12 条的状态或整套失败/通过统计。
- 终止后核对本轮进程已不存在,独占容器和一个本轮数据库仍在。依据冻结容器 ID、owner label、network=none 与 socket 挂载归属,只清理本轮孤立库/容器/临时根;库剩余由 1 降为 0,容器与临时根均消失。interruption-observation.json 与 interruption-cleanup.json 留痕;自动 cleanup 标为未完成,人工补清理不倒写自动通过。
- 本轮结果类型为 CONTROLLED_TRACE_COMPARISON_NOT_RELEASE_RECEIPT / PARTIAL_INTERRUPTED。代表性比较可用,全套终态未取得,没有第二次全套重跑;未运行 finalize.mjs 的完整成功归集分支。results.json、receipts-sha256.json、single/trace-summary.json、full/trace-summary.json、full/representative-status.json 为独立派生索引,原始 trace 与日志均保留。
13.3 trace 策略增量
- 运行时代码只改两处:qa_run_full_browser 转发其内部调用参数;诊断 stage 调用时明确传 --trace=on。普通 full-local 调用不带额外参数,client/playwright.config.ts 未改;固定零重试、默认 worker、完整集合、PARTIAL/2 和无发布资格保持不变。
- QA 命令:node --test scripts/qa/tests/full-local-diagnostic-results.test.mjs scripts/qa/tests/pwa-full-local-inputs.test.mjs scripts/qa/tests/verify-full-local-discovery.test.mjs → 35/35 PASS,51.429 秒。断言检查实际捕获命令:诊断恰有 --trace=on,普通模式不被顺带改;移除诊断 stage 参数的源码变异可被捕获。原 34 项回执未覆盖。
- 实验实际 argv 已显式带 trace,并成功产生真实目标 trace;实验后正式诊断入口的参数传递由上述捕获回归验证。没有声称正式诊断新源码完成过额外整套运行。新策略与实验冻结源码的两处差异单列,后续运行必须重新绑定届时获准候选。
- 普通门禁 retain-on-failure 值得独立审阅,但用户本轮只明确要求诊断 trace;不将“考虑”扩成修改普通门禁策略的授权。任何真实发布或 trace 对外分享仍各自授权。
- 本轮交审包:artifacts/qa-flow/release-gate-integrity/trace-policy-review-20260907-01/。review.diff 为当前完整 21 文件;incremental.diff 相对获准 diagnostic-review-20260906-01 冻结快照仅变 8 文件,13 文件未变,无增减文件。旧快照在独立临时目录由 HEAD 与旧 diff 重建并逐项核对旧 SHA-256,不向真实工作树应用补丁。review-files.json 保存当前摘要、范围及两份 diff 摘要;未跟踪文件另做 whitespace 核对。实验原始摘要及中断回执不覆盖;快速 task/governance/sensitive/syntax/whitespace 复验放在新交审目录,35 项测试沿用未再改动源码对应的原日志。本轮只有主会话验证,不冒充独立复核。
追加阶段:迁移状态误判修复(归属确认,尚未实施)
用户同意将较小修复归入已有合适 task,不为本 finding 新建任务。此阶段承接 seed 分离回归发现的预检问题,原冻结交审包、33 文件门禁诊断包及历史验收保持原状;不将新增阶段倒填为旧包已通过。
事实证据入口:09-09-existing-deploy-seed-separation/implement.md 的继续核查记录。原 printf | grep -q 管道在 pipefail 下实际出现 producer=141/consumer=0;合成分支复现未知迁移被 ACCEPTED,直接输入候选正确拒绝。2000 次候选匹配无误判仅为本地实验,不表示生产修复。
最小拟修范围:production-preflight-remote.sh 状态解析区四处谓词、原部署安全回归和部署规约。消除提前退出消费者的生产者管道;匹配工具非 0/1 错误失败关闭。验证合法/未知待执行迁移、无待执行、失败状态、长输出和工具错误;保持候选与已应用集合核对及 allowlist,不全库改 grep、不扩成完整门禁重建。
- 复用本 task 承接,关联已复现证据,撤回必须新建 task 的建议。
- 在本 task 收敛并审阅具体修复增量;新增风险/范围按实际授权确认,不为相同已批准动作反复索权。
- 与 seed 产品差异物理隔离,实施最小修复并做确定性回归。
- 记录最新候选/回归结果与独立复核缺口,不继承旧冻结回执。
本轮仅更新归属与方案记录,未修改该预检脚本或测试;未新建 task、未提交/推送/部署。seed 的发布前置仍未解除。
后续实施授权与最小方案
用户在确认归入本 task 后要求“继续推进主要工作”,本次按上述已明确的小范围方案继续本地修复,不再新建 task 或重复索取相同范围授权。执行副本为 artifacts/isolated-worktrees/20260909-preflight-fix,detached b918530;原 seed 产品工作树不改,主工作树只同步任务状态。提交/推送/部署仍未授权。
实现同一 status_matches 谓词:grep 直接读取 here-string,取消 printf 生产者管道;0 为匹配、1 为不匹配、其他码立即 PROD_MIGRATION_STATUS_UNREADABLE。四处谓词共用,候选迁移集合及 DB 对照不变。定向测试提取实际状态解析与未知迁移拒绝分支,注入已观测的 producer=141;恢复旧写法的源码变异必须失去拒绝能力。另验长输出、合法 pending、unsafe 和工具错误,最后跑原完整部署安全回归与 seed 组合验证。独立 reviewer 受 inline 限制时明确留待交审。
当前结果:迁移状态修复本地闭合
- 实际预检改动仅四处谓词及共享 status_matches:直接输入、完整读取,0/1/其他码分别匹配/不匹配/停止;保留 SQL、候选 allowlist 和应用发布顺序。旧谓词变异在 producer=141 注入下仍会误放行,新逻辑明确拒绝,未删改原未知迁移断言。
- 最新预检测试 39 项通过,包括四处匹配器错误、96 KiB 输出和源码变异。首次单独运行的旧多子进程 fixture 超过默认 5 秒;仅将该用例预算设为有界 15 秒,未改变生产超时或任何断言。随后完整场景通过,不用重试屏蔽失败。
- 从
b918530创建一次性验证副本,只覆盖 seed 的 9 个代码/测试文件及本修复 2 个文件,共 11 个;联合执行 deploy-init、deployment-db-lifecycle、deployment-safety-contract 三文件,109/109 PASS,81.10 秒。覆盖集合未缩减,没有 skip 或重试。覆盖输入 SHA-256:087d5004337ba631d152bd099c6f19bfad34f16cd00de29fc00e14e891b8dfac。 - 该临时组合仅用于测试,未合入主工作树或任一原执行副本,结束后精确删除验证 worktree。第一次准备因整包补丁参数过长停止于测试前,改为逐文件 apply_patch;第一次与最终临时副本均已清理,不把准备失败计为测试结果。
- 沿用 seed 已完成的真实合成 PG 数据库测试(该运行时代码未改);本轮不再次操作数据库或 ARM。组合测试不等于镜像构建、完整候选门禁或真人业务验收。
- Bash syntax、环境契约、task validate、Trellis governance、process contract、git diff --check 通过;docs registry errors=0、warnings=1,22 个未注册文档未扩范围处理。
- 主会话完成只读差异复核;inline 下未派 reviewer,独立复核待交审。未提交、未推送、未部署。产品增量位于 artifacts/isolated-worktrees/20260909-preflight-fix;seed 产品增量保留在原独立副本。主工作树只同步本 task 状态和证据。
本追加修复阶段本地验收通过;原门禁 task 整体、旧冻结包及完整候选发布资格不因此完成或改变。上一阶段 seed 的那一次 93/94 失败保留,当前由确定性复现、根因修复和同基线组合回归闭合。
分包交审(2026-09-09)
seed 交审前补正 Compose init 参数数组并新增执行测试后,再次临时组合验证:deploy-init、deployment-db-lifecycle、deployment-safety-contract 三文件 110/110 通过(22 + 49 + 39)。共同基线 b918530,11 个输入文件摘要 a3f91e3d1fcdbc522347725659e3b8b5a0438df62a7eea52b03f05fb3ba6d70a;临时 worktree 已删除。本预检运行时没有追加变化,旧 109/109 证据只对应旧组合。
交审包:artifacts/qa-flow/20260909-seed-preflight-review-v1/preflight/。只冻结本追加阶段的六文件增量,不覆盖原 33 文件证据包。与 seed 包共享部署 spec 文件,后续集成须合并各自段落,不可互相覆盖。
当前追加阶段:本地实施、主会话复核和回归完成,待独立复核与提交授权;未提交、推送、部署。原门禁任务整体仍未完成,不因此取得完整候选发布资格。
2026-09-09 独立复核接受与集成准备
用户回传独立审查:seed 通过(3 条非阻断备注),preflight 通过(无 finding)。审查者核验冻结 diff 并阅读合同与代码,另做本地 bash SIGPIPE 合成复现;未重跑项目测试、未审完整历史叙述、未构建镜像或访问生产/ARM,未验证后续集成。不得把该结论扩大为独立执行了 110 项测试或批准部署。
集成副本:artifacts/isolated-worktrees/20260909-seed-preflight-integration,基线 b918530,归当前门禁 task 协调整合;两个原 task 归属不变。按共同祖先合并部署 spec,零冲突,不用整文件覆盖。原两份冻结包和执行副本保留未改,主工作树不混入产品实现。
备注处理:
- F1:集成副本的既有运维手册明确补充,有意停用全部费用类型、审批规则或报销流程也会挡住下次发布;不得自动补齐或改用 initialize 绕过。
- F2:保留并强化“迁移先执行,配置检查失败时迁移可能已经落库”,不简化成零写入。
- F3:deploy.sh 的 sh -lc 与 Compose 的 sh -c 环境加载不同,记录为待环境验收关注项;本轮不改 shell 行为。
- Compose folded scalar 是基线已有问题,本 task 因承诺两入口真实到达而一并修复,不是本次引入。
- 预检缺陷定性是“该拦时可能拦不住”,未证明生产曾误放行。独立审查在其环境较大输出触发 141,但约 64KB 不是通用安全阈值;此前已有短输出捕获 producer=141/consumer=0 的记录,调度和管道实现都会影响触发,不采纳“日常绝不会触发”的推断。
两笔提交准备顺序:先 preflight(门禁 task 三文档、预检脚本、测试及 spec 对应增量),再 seed(原 17 文件范围,包含 F1/F2 手册补充和 seed task 最新状态;spec 只取 seed 增量)。共享 spec 第二笔以第一笔结果为基线。提交、推送、完整候选门禁与部署均未因此授权;当前只做隔离集成和定向验证。