83 KiB
2026-09-19 WebKit固定三组对照(本地根因诊断)
原30项探针测试与补充7项环境测试覆盖同一未改代码,独立复核通过,现有观测补丁可按既有授权先本地提交。真实native诊断仍FAIL,绝不把观测修正当成浏览器修复。
静态发现:headless走WPE;MiniBrowser包装器使用自己的lib/sys/lib,原包131个相对符号链接在物理复制后变成独立文件,含libWPEBackend-fdo.so与.so.1别名。这里只是可验证线索,不能宣称已确认动态加载冲突;另一线索是绝对缓存路径长短。Playwright公开BrowserServer.process()可监听stderr/exit,无需DEBUG/协议payload或改业务源码。
固定A/B/C,均新独占副本,不从旧缓存执行:A长缓存路径、全物化;B短缓存路径、全物化;C与B等长路径、只在本轮副本内恢复原bundle相对链接。三份展开后的字节/模式清单完全相同;C每条链接须与旧物理文件摘要相同且解析在本轮缓存内。禁止外部链接、硬链接和跨样本共享inode;源和旧证据前后不变。运行时HOME/TMP/XDG均短独占,namespace拓扑相同,保持Chromium存活时观测WebKit。因环境条件与旧门禁仍不同,只报告当前对照结论,不能倒推历史根因唯一性。
每组一次,外层每组180秒沿用当前诊断预算;不得改引擎参数/禁用sandbox/重试到绿。分类记录WebKit实际stderr的白名单关键词与父进程退出事件(含观测是否在cleanup前);原始stderr不落盘。仅增加ignored诊断封装器,已审probe/helper/测试不变。新实验独立marker登记A/B/C最多三次,旧一次marker不删除或复用。失败若正常清理仍可继续计划内下一对照;完整性/隔离/清理无法确认则停止剩余组。
2026-09-19 定向执行临时路径增量
原私有TMPDIR放在长证据目录下,IPC用例missing路径拒绝失败。改用/tmp下mkdtemp生成的短独占目录(0700),与共享/tmp内容隔离;先验证包括最长missing/supervisor.sock后缀的字节长度小于100。测试源码、断言、5秒IPC预算、零重试不变。诊断wrapper亦使用短TMPDIR,避免把同一执行条件缺陷带入下一组;其余HOME/XDG、缓存副本、拓扑、180秒外层终止预算和清理合同不变,披露这个环境差异。
原wrapper与输入清单保存;新wrapper复用原BASE/原一次性marker,只消费新冻结输入。单文件定向补验与原通过探针文件按输入分列,可支持继续独立空白页诊断,不宣称两文件同次全绿,更不代表完整门禁通过。
2026-09-19 native探针观测修复(现有范围内)
已证实:WebKit异常使engines数组赋值整体丢失,native-trace仅覆盖Chromium;尚未证实:物理副本或系统依赖是根因。旧缓存131个WebKit内部链接被物化是待验线索,不作为修复依据。
- 原生引擎生命周期把launch纳入try,按launch/namespace/connect/context/trace/page/online/cleanup登记失败;错误只输出受控类别、标准系统码/信号/退出码,不输出message/stack/URL/路径。清理继续执行,首因与追加清理错误分别保留。
- Chromium与WebKit结果逐项保留;正常路径维持Chromium存活期间观测WebKit的原顺序。Chromium自身失败也保留两引擎诊断。原native-trace仍属Chromium,WebKit使用独立trace。引擎任何失败或收尾环境重验失败均保持整体false/exit1,现有回执校验不放宽。
- 主会话仅做语法/差异检查;Claude运行探针与环境校验两份Node测试、治理检查和新独占缓存的单次空白页诊断。不起DB、应用、业务用例或完整门禁,不伪造managed receipt。诊断采用原封闭veth拓扑,缓存用失败轮副本再复制、逐份摘要/模式和非共享inode核对,源前后不变。另设独占HOME/XDG/TMPDIR以隔离用户配置,明确登记为对旧门禁的环境差异;一次通过不能证明缓存或HOME是历史根因。
- 通过定向测试及独立复核后再决定提交和完整候选时机;当前不能称根因已解决,旧失败及例外不改写。
2026-09-19 F1诊断处置及最终冻结
未改执行输入的单文件52项一次通过;独立复核承认三次R1校验不在该测试执行范围内。保留原失败与根因未知,不做推测性修复/预算扩容,不合并分阶段重验。定向证据足以支持本地提交,不能替代完整候选验收。
按已批准顺序:本次本地提交封存15路径及验收记录;最终clean SHA仅运行一次既有verify-candidate,沿现有受管环境/原浏览器版本/并发/预算/零重试/33页7组/分层覆盖,不另造验收流程。使用新独占证据目录和已有浏览器缓存的物理副本,无下载、无历史覆盖;运行期间仅写ignored证据。失败即保留并回报,不自动重试。具体SHA/命令与环境边界在提交后的ignored交接中固定,不再改本提交的受管文件。推送/部署未授权。
2026-09-19 F1超时最小诊断(沿用已批准定向验证范围)
静态提取与摘要已排除“三次R1 require启动开销进入生命周期用例”的假设:测试只执行REMOTE片段,三个校验都在片段外,片段及测试夹具未变。不改变生产校验、测试预算、并发、重试或断言,不凭一次耗时比较修改产品。
Claude仅运行未改的deployment-db-lifecycle.test.js完整52项一次;ignored封装器核执行输入前后SHA、记录真实exit/UTC/耗时、每秒采样本地load/CPU与内存压力/cgroup计数。采样只描述当次环境,不追认前次因果。成功也保留原exit1并交主会话判断;失败停报,不循环重跑。此前125/另外46项/独立代码结论沿原输入保留,本轮不重跑。该诊断属于既有失败验证,不改变验收范围;真实部署/推送仍未授权。
R1 接入方案(2026-09-19,已批准本地实施)
当前事实与授权
最新:用户已明确回复“是”,批准本节本地实施及新版执行顺序;以下规划时点描述保留追溯。测试交Claude,推送与部署未授权。
基线为本地分支codex/20260919-reviewed-candidate的1f8d5b65,前两笔本地提交已完成。用户同意推进R1方案;本轮仅源码只读分析和任务合同更新,没有执行测试、真实发布入口、生产访问或提交。本地接入/启用已获用户具体方案批准(实现结果与验收状态见implement顶部),生产部署仍独立授权。
旧r6全绿属于旧输入,budget-full-r1中止FAIL/130;当前候选不能借它们取得资格。本节建议将“本地接入拒绝未验候选”与“真正对外发布”分开:本地补丁与定向验证先完成,最终clean SHA只跑一次完整门禁,合格后才可在另获部署授权时使用真实入口。该顺序取代旧设计中容易导致先全量、再改入口、又全量的执行歧义,不降低完整通过前不得发布的要求。
最小修改范围与行为
| 文件 | 接入位置与行为 |
|---|---|
| scripts/qa/release-gate-result.mjs | 复用verifyReleaseEvidence/readBundle/facts等,增加供入口使用的导出断言及require CLI;重算资格,失败非零,不信任回执中的PASS或调用者布尔值。明确校验期望发布commit。 |
| scripts/qa/run-release-gate.sh | verify-candidate维持无部署;ci-release/all复用同一验证路径或消费显式指定有效回执,再走production-identity-bootstrap;deploy只消费回执,不隐式跑全量。保留all额外smoke-local,安排在唯一verify-candidate之前;不将它冒充必需阶段,也不重复static/full-local。 |
| deploy/trialrun/production-identity-bootstrap.mjs | 正常发布在读取SSH配置/探测真实目标前要求回执;保留身份发现、origin核验和数据库身份。进入deploy-existing前再核对。identity-only/preflight-only明确只读分支不产生发布资格。 |
| deploy/trialrun/deploy-existing.sh | 正常发布在远端聚合体检前要求回执;保留来源/身份/迁移/回滚窗口preflight,并在调用deploy.sh前用实际source_commit再校验。只读preflight仍能单独运行且必须退出。 |
| deploy/trialrun/deploy.sh | 参数合法性检查后、来源fetch或环境读取前验证;取得SOURCE_COMMIT后绑定同一SHA,并在第一条远端写入mkdir之前再次重验。保留git archive不可变同步、existing/initialize边界、数据库生命周期和部署健康检查。 |
策略摘要显式纳入新增消费入口;全仓源码快照、工具链/CI并发、证据文件摘要、分层清单、清理完成与clean判据全部保留。无schema/业务/迁移/账号/编号/差旅状态变更。仅这5个执行文件及直接配套测试、已有部署规约/任务记录;若暴露新的业务风险另列。
回执输入与无重复执行合同
- 拟用RELEASE_GATE_RECEIPT_DIR传递显式回执目录,仅允许工作树artifacts/release-gate下的受限真实目录;沿用反路径逃逸/符号链接/证据SHA检查。RELEASE_GATE_ARTIFACT_DIR继续只表示生成新回执的位置,两者职责不混用。
- 共享断言重算完整release-predeploy资格,并把当前HEAD、回执commit及实际SOURCE_COMMIT绑定;缺失、失效、dirty、工具/策略变化或不完整均拒绝。不得产生GATE_PASSED、SKIP_RELEASE_GATE等信任开关,不自动选择“最新”或历史通过回执。
- verify-candidate仅验证。ci-release/all是显式完整发布命令:有显式回执则重验复用;无回执才调用verify-candidate一次。bootstrap/deploy-existing/deploy.sh及deploy模式无回执立即拒绝并提示先验证,不自动启动耗时全量;这替代旧§2“高层缺回执自动验证”的默认行为。
- 下层重复的是廉价回执校验,不是测试执行。verify-candidate绝不回调部署,生产引导器绝不回调ci-release/all;成功路径部署链只调用一次。
- 对PRODUCTION_IDENTITY_ONLY/PRODUCTION_READ_ONLY_PREFLIGHT严格校验0/1。只读入口不要求发布回执,但任何只读标记都不能继续进入写入;ci-release/all/deploy拒绝以只读标记伪装发布成功。原纯只读脚本不变,本轮也不实际执行它们。
- 阻断时只输出稳定原因与下一步,不回显环境/SSH配置/原始payload。回执不是部署授权,也不是不可伪造签名;源码有写权限的操作者不在防伪承诺内。
Claude负责的限定验证(获批实施后)
主会话实现后交Claude执行测试与只读review;现在不运行。本轮新增/扩充现有release-gate-result.test.mjs、release-gate-shell.test.mjs,必要的跨入口执行测试放release-gate-enforcement.test.mjs及私有fixture;复用已有部署生命周期/来源测试,不新增生产测试开关。
- 表驱动覆盖6种入口:ci-release、all、deploy、bootstrap、deploy-existing、deploy.sh。缺/旧/错profile/伪PASS/dirty/不完整回执时,正常发布不得读取真实配置或触发远端命令;写动作计数必须0。
- 合成有效回执只允许原生产链一次;核static/full-local至多一次、显式回执复用不再跑static/full-local(all仍保留额外smoke-local)、无递归;仅捕获fake命令,不真实发布。
- 上层已过、下层调用前改HEAD/index/受控文件或篡改证据时仍拒绝;实际归档SOURCE_COMMIT与受验SHA不同必须拒绝。
- 独立只读分支可完成fake只读检查但写动作0;各种内部/skip/只读标记不能变成写入豁免。来源、迁移、init/server/worker隔离与120秒健康检查合同保留。
- 对真实入口/判定源码作隔离副本变异:去掉上层前置、下层重验或放宽commit/clean判定时,对应负例必须失败;不只grep字符串。所有SSH/Docker/rsync/git-fetch、SSH配置和真实env读取必须受测试替身封闭,禁止真实外联/配置读取,临时文件仅清理本轮owner。
定向命令(实际补丁落地后Claude执行,数量按实际记录,不提前写通过):
node --test scripts/qa/tests/release-gate-result.test.mjs scripts/qa/tests/release-gate-shell.test.mjs scripts/qa/tests/release-gate-enforcement.test.mjs
npm test --prefix server -- tests/unit/scripts/deployment-db-lifecycle.test.js tests/unit/scripts/deployment-safety-contract.test.js tests/unit/scripts/check-source-provenance.test.js
仅因修改相关文件才纳入对应测试,不跑浏览器/PG/业务全量。规划时新enforcement测试尚不存在;现已落地,命令待Claude执行,不能当作已通过。若验证需要超出这里的范围,先报告缺口;不恢复冻结差旅、不修无关旧警告。
提交、完整验收与回退
- 本地补丁获批→主会话实施→Claude定向测试及只读复核→主会话按批准范围提交最终输入;不先跑完整再改产品/QA代码。
- 最终候选冻结后,完整门禁交Claude一次执行;期间不改受管代码、测试、任务或规约,只写ignored证据。失败保留并按具体缺陷处理,不盲目重跑。
- 完整通过后仍须另获推送/部署授权;首次部署独立执行/回执比对及同候选12项公网义务保留,不能把NOT_RUN_LOCAL或本地PASS当成公网通过。生产编号与银行接受性另列。
- 若R1补丁有误,停止发布并保留失败,修复或按授权回退本补丁;不增加disable开关,不借回退无门禁发布。没有数据库/真实配置变更,无须数据恢复;既有线上版本不受本地规划/修复影响。
2026-09-19 r5-fixed-r1登录复用边界
四完整文件31项30通过/1失败,采购整链、R75及视觉25项全部通过;付款在经理复核登录后按已有redirect参数返回付款页,而共享login仍应验portal。最小修正仅允许显式reuseLoginPage且当前为无search/hash的规范/login时省略goto;带redirect的登录页必须走原goto('/login')清除返回目标。保留真实表单和portal/profile断言、全部付款下游及300秒;不修改认证产品或接受任意登录落点。原失败保留,类型检查后相同四完整文件复验,再从static完整候选。
2026-09-19 G20 r5三项续修(原预算/并发/断言)
g20-full-r5历时5916.547秒;static/后端4428+1原条件跳过/8组启用服务回归均通过。浏览器372=367通过、采购保存失败1、视觉admin与付款链超时2、视觉手机后继未执行2,零重试。环境/source/repository/owner清理PASS。R75整文件与新旧BX/PB消费者通过,不据局部绿关闭N5/G20。
- 采购PATCH保存P2028归09-18-local-concurrency-product-fixes P10,锁/校验/写入审计/5000ms不变,只移出非判定用途的响应关系读取。
- 视觉admin14/15完成,最后audit页耗尽180秒;管理员页累计导航56.768s、到达20.062s、quiet12.177s、截图95.145s、metrics2.838s(含超时附近结束的阶段日志,不当作独占CPU计量)。保留7组、33页、每组180秒、全部PNG/原断言/原workers/零重试;visibleRouteLink用Playwright同语义:visible+first一次查询;目标文档HTTP读取和已确定的真实链接点击并行并全部await;准确URL仍先验,之后独立到达断言Promise.allSettled并按原顺序抛首个失败,确保原5条正反例不弱化。不跳过字体/动画,不降画质,不用DOM伪导航。
- 付款链在299556ms才到执行:已完成提交、双审批、组批、独立复核、回单人工核验。原300秒保持;保留所有角色转换的真实表单登录/登出和全部业务断言,只消除财务审批结束后立即以同一财务身份登出再登录。共享login默认行为不改,允许本helper显式复用登出后已到达的/login页,仍逐项填表、提交、验证portal和身份入口。审批进度及最终只读DOM检查可并行全部await;3种审计只读查询并行仍逐项校验原字段。保留财务原地进度不reload、不得制单人复核/无回单执行、付款/核销/AP/归档与ERP拒绝全部断言。
先专用类型/原18条视觉守卫与原四完整文件procurement-flow、project-wide-visual、R75、payment-flow同配置定向,再冻结完整输入从static新候选。当前只是最小续修设计,未改预算、分母分类或验收范围,属于已批准在用修复/重复前置优化;不需要再次确认同一授权。
浏览器保护例外:旧GStreamer自动生成registry字节变化,旧baseline保留且不得改写为PASS;改写文件已复制留证,其余旧12137文件/HEAD/index不变。后续运行用本轮物理独占浏览器副本(非硬链接),不安装/下载。原字节恢复仅在找到校验匹配源时执行,不能猜造恢复。
2026-09-18 真实会话前置与冻结入口修正
直连正例必须等待目标路径和真实页面标题,排除错误页/登录后才导航下一文档。仅not.toHaveURL(/403/)会在认证bootstrap之前通过,并可能中断refresh;本轮观测旧有REFRESH_REUSE_DETECTED,补就绪后未再出现且付款整链通过。差旅沿已批准冻结合同改验拒绝,不能放行产品来满足原假阳性测试。
全页面视觉只审页面矩阵,匿名/login继续UI观测;已有createAuthenticatedBrowserStorageState走正式服务端登录,为每个独立角色+视口单独建立真实session,状态仅在内存传递给该context。目标页仍需浏览器真实bootstrap及全部原到达/HTTP/权限/视觉检查,不在两个context复制同一refresh凭证,不伪造令牌、mock认证、删页面或增预算。这样减少矩阵外重复portal登录装载,非修改认证行为。
2026-09-18 浏览器四未过最小修正
编号本地服务验收完成后回本task承接浏览器。DG7宽度矩阵是同一角色、同一不变合成数据的视口验收,复用一次登录但每个宽度仍从首页执行全部断言和截图;不同角色不共享。R3相同角色的拒绝、允许及退役404可在该角色独立context内顺序验证,保持五角色和所有路径,减少重复登录。目标文档HTTP探测需Accept: text/html,与浏览器文档请求一致;不能删除探测或放宽404。付款链只记录受控code/status及合成审计事件种类以确定AUTH_004原因,token、cookie、原始payload不进入输出;无证据不修改认证产品或补自动重登。
G20 生命周期测试启动开销修正(2026-09-18)
原36命令完整链交错对照:默认Node为2.295–2.520秒,single-threaded为2.998–3.572秒,trace完全相同;其他启动参数同样无收益,均不采用。每次冷启动约63ms,重复启动是已测量开销,但不声称完整运行的宿主调度波动已消失。
最小改为每例一个仅本地Unix socket假命令服务,运行在现有Vitest进程;轻量Python标准库shim传递原argv/按需stdin/退出码,复用原CJS解析器、Compose依赖分析和命令语义。临时目录及socket独占,无TCP监听,private PATH/白名单与未知命令97保留。timeout记录后由shim直接exec原GNU timeout,hung inspect等待随socket断开取消;不得在服务端阻塞后续deadline。每例结束先关闭服务和连接,再删除自己的临时目录。生产部署源码、测试workers/预算/重试和全部断言不变。原完整链、独立四类源码变异、真实deadline、unknown command与部署安全回归必须全过,再验一次完整门禁。
G20 WebKit 原生在线环境修正(2026-09-18)
实测官方 WebKit 26.0 在原无默认路由命名空间中 navigator.onLine=false;setOffline(false)也不改变原生值。只含本轮同命名空间veth对的 default dev qaonline scope link 则原生true,主动setOffline(true)后false。此为Linux WebKit网络发现差异,不修改navigator、不改业务离线保护,不增加公网/生产连接。
最小环境实现:仍只允许lo/qaonline/qapeer;新增恰好一条无gateway/via/multipath的链路默认路由,仅指向本轮qaonline。加强核验veth类型、两个ifindex独立且link或link_index互为对端且无跨namespace对端,拒绝其他接口/外部网关/IPv6默认路由。唯一链路两端都在独占namespace,无法通向宿主或公网。原“禁止全部默认路由”实现细节替换为“只允许已证明封闭内部对端的链路默认路由”;隔离边界和无外联要求保持。
原生空白页探针同时检查Chromium/WebKit及浏览器进程namespace;任一离线在昂贵业务验收前失败。增加拓扑反例与独占namespace合成不可达地址检查;不连接真实公网。原生在线证据和测试context中的主动离线仿真分别记录。旧结果绑定旧策略,不改写。
G20 共享回执最小落地设计(本地机制,2026-09-18)
复用原 stage_static / stage_full_local,新增 run-release-gate.sh verify-candidate 无部署分支,现有 ci-release/all/deploy/生产 bootstrap 不接新强制消费(R1启用另批)。共享模块 release-gate-result.mjs 负责当前源码/策略/工具链、独占记录、阶段开始结束与失败、结果引用及重新推导资格;run-release-gate.sh 的两阶段仍是唯一执行定义。
- 运行目录必须为空且在 artifacts/release-gate 内,先持久 INCOMPLETE;stage记录固定 static/full-local 顺序、开始/结束/退出;full-local内部固定inputs/database/prisma/server-unit/typecheck/client-build/server-start/accounts/workflow-actions/server-regressions/browser-server/browser阶段通过同一记录器写 full-local-stages.json。失败退出/中断保留未完成,不将结束收集错误转为通过。
- sourceSnapshot 复用全仓已跟踪/index及产品/测试/规约摘要,补完整未跟踪输入与QA/部署/包锁/config工具链策略摘要;阶段前后、最终验证当前快照一致。dirty允许本地诊断结果,但deploymentEligible=false。来源不接受只比commit而忽略dirty内容。
- 成功判定依赖真实 static/full-local阶段结束及原退出,full-local环境result(mode full-local、当前policy、原生/guest namespace事实、cleanups、sourceBeforeAfter),G19完整发现重算与全部本地逐项执行、预先witness/acceptance归属。复用G19验证,不从候选回执自报expected。原live/frozen12+2按G19处理,公网仍NOT_RUN_LOCAL/交付INCOMPLETE。
- 记录只保留相对路径、hash、工具版本、筛选参数与逐项安全身份/状态;不复制业务原文或敏感env。读取仅本轮已验证独占文件;symlink/越界/截断/旧schema拒绝,引用绑定实际摘要。报告仍不是防伪签名,首次部署须独立重跑。
- 离线verify以同候选clean状态及完整阶段/环境/覆盖重新推导发布前资格;普通dirty本地运行的验证可证明localChecksPassed,但以PARTIAL/非零结束且不发布。不创建绕过开关,不改local-candidate的严格判定。INCOMPLETE/FAIL/PARTIAL/PASS明确区分。
- project-wide既有两个skip开关前置验证精确值、非空reason/operator/approvalRef;获批诊断记PARTIAL/退出2/未跑阶段,普通verify-candidate拒绝。批准引用结构不替代真实授权。只在fake工具验证project-wide,不运行其live readiness。
- 验证:缺/旧/错profile、阶段缺失/跳过/错误顺序、工具/输入变化、dirty、missing/unknown/duplicate/retry/xfail、原生/guest/清理漂移、伪通过均拒绝;源码变异移除验证/放宽阶段或skip必须使反例变红。执行既有部署生命周期/安全回归,真实部署命令计数0。
本地完整运行不据已有定向结果拼接;若为记录器引入源码变化,最终完整验证必须绑定最终代码。WebKit v2105是当前Debian11可用的官方冻结运行时,只证明该版本,不能宣称最新版Safari/真机企微兼容。
G18 验证后归属
票据URL修复及当前OCR/R108/33路由矩阵已验;PWA原生控制器生命周期和采购最小写事务详见09-18-local-concurrency-product-fixes的PRD/design。原四文件并发4/4、完整认证/OCR18/18通过,不能推成旧full-r2全绿。12 live/2 frozen分层已批准并按G19实现;WebKit、R1、独立与真实业务/发布保持原边界。证据只归相应输入,诊断预载与无预载验证分列。
当前受管合成 runner 为既有底层回归设置 TRAVEL_SYNC_ENABLED=true;因此 G19 不把“所有入站同步关闭”冒称本地实测冻结。新增整例验证现行员工/财务权限拒绝及付款 blocker,不改变该合成配置。关闭开关的 409 属既有路由单测合同,与实际环境分列。
G19 实现细节
保留 6 个旧 spec 原字节,新增 travel-freeze-protection.spec.ts 两项。受控 JSON 清单按 file/id/title/project/repeat 标识 14 个保留旧身份,并核源码 SHA;新同文件用例没有登记即失败。其他发现默认为本地必须执行。完整发现的文件集合仍来自源码扫描,执行集合从核验结果导出精确文件正则,不使用调用者 grep/清单;当前例外文件中不能混入本地用例而被整文件漏掉。普通 runner 执行后检查每项结果,失败退出同时保留结果。定向模式保持无资格。
本地覆盖计划记录 sourceSnapshot 的 commit/digest 与合同摘要;结束核输入不变。公网回执验证以原始 Playwright 逐项结果和 live profile/同候选绑定为条件,预先不得标 PASS;验收工具无外联能力,不接入部署入口。这里只解决分层覆盖,R1 的完整阶段、环境、干净候选与发布入口强制消费仍单列。
2026-09-18 G19 分层验收(用户已明确批准,实施中)
用户批准:12 条公网用例作为同一候选发布后必跑项;2 条冻结差旅保留原源码与历史结果,改验冻结保护。本地通过不代表公网/完整交付通过,不授权部署、恢复差旅或真实操作。此增量替代 R2 的“排除集合为空”,不重写旧 full-r2 失败。
- G19a:全体非 manual 用例继续真实发现,固定 12 live+2 frozen 的用例身份、原因、责任角色、必跑入口和原源码摘要;未指派实际负责人明确待定。
- G19b:由完整发现与受控合同生成本地执行文件集合,登记用例级覆盖;拒绝遗漏、身份漂移、未知/重复、跳过、重试与 expected-failure。禁止调用者筛选普通本地集合。
- G19c:新增两条冻结保护整例,验证现行合成角色入口/正式 API 拒绝、共享付款差旅 blocker 与入站导入权限拒绝;不改权限,不执行旧差旅链。
- G19d:公网义务在本地保持 NOT_RUN_LOCAL,绑定候选提交与源码摘要;公网用例结果只能由同候选、live profile、完整逐项通过报告兑现。验收回执不自授部署或发布资格。
- G19e:增加漏例/新增未知归属/漂移/伪通过/候选不匹配/真实 runner 选择等反例,运行本地冻结保护,更新 spec/协调 task 与新候选;独立仍 PENDING。
WebKit 下载问题仍待答复,完整普通门禁未通过;R1 机制后续与真实强制消费启用分开,不启用发布入口。所有旧差异、失败材料与冻结包保持。
G18 OCR 实测暴露的最小产品修复(2026-09-18)
g18-corrected-visual-r1:R108 整例通过(8 个移动观测、无发现),OCR 缺字段识别及横幅已通过,但人工修正按钮在180秒内反复被卸载;执行记录有56次 DOM detached,终态回到列表。源码两组 effect 分别 local state→URL、URL→local state,并同时依赖双方;上传选中票据时会交叉回写。此为在用票据详情状态同步缺陷,不是缺权限或OCR规则错误。
在已批准 G18 现行修正流程验收内,最小修复只涉及 InvoicePoolPage:从 URL 读取 detailInvoiceId,所有选择/返回动作只更新 URL 且保留其他查询参数,删除双向 effect 与重复返回写入。保留 replace 导航语义、全部查询/编辑/权限合同,不调整OCR、状态机或产品视觉。原 E2E 红例保留,修后必须不刷新/force-click 完成缺字段拒绝→补齐可用,增加URL选中与返回列表再进入验证;运行前端typecheck/build及受影响浏览器检查。相同模式只定位记录,不顺手改其他页面。
视觉首轮目标到达还需纠正:portal使用既有portal-work-summary锚点,动态报销使用各自workspace;其余已知页面标题不降级。4xx错误页模拟响应显式UTF-8,确保反例精确击中原到达断言;增加同源API403/404观测为失败发现,避免仅页头可见冒充有效页面。
G18 最小落地合同(2026-09-18)
沿 implement 顶部 G18a–e 执行。OCR 能力必须由启动同一服务的 runner 派生并用行为验证,外部标志不得伪造;R108 使用在用报销审批,初始化失败不转 skip;视觉矩阵明确列出真实系统路由,检查授权角色与目标到达,错误页不算页面覆盖。保留原并发、预算、零重试和完整发现。只更新测试/QA/现有矩阵,不修改业务权限或视觉样式;可靠性先取得可归属观测再修复。外部与独立复核边界不变。
G17 落地与 G18 后续边界(2026-09-18 最新入口)
G16 前置已实施并执行普通完整门禁;下方“以上未执行”属于当时计划。本轮 G17 按 implement 完成当前测试合同修复和限定实测:合同列表链接反例、当前删除/明确关联、mock API/SW 边界、通知非差旅夹具、采购保存/预检/提交、管理范围查询、重复付款整例归并。原 full-r2 失败和后续定向成功分别绑定来源;普通全量资格未取得。
主会话反例不是独立审阅。PWA/资产/采购/视觉定向通过不能证明完整并发失败的唯一根因;原事务、审计、预算、并发和重试合同保持。项目视觉矩阵中的 /system/* 当前为字面地址,报告只支持实际 20 路由项;进一步展开/授权到达检查归 G18,不能拿该结果宣称全部系统页覆盖。完整发现的 wrapper 末尾临时 SHA 采集失败按告警原样保留,枚举及覆盖校验有效,但不是完整门禁回执。
G18 的 OCR 能力绑定、R108 当前移动夹具/输出隔离、矩阵真路由与角色到达,以及并发时序诊断先以最小合同细化;不恢复冻结业务或制定新产品视觉方案。WebKit 下载申请仍待答复,原“不联网安装”边界继续;12 live、冻结差旅、R1 启用和所有外部事实/操作分别处理。精确退出条件及六组余项见 implement 顶部。
G16 后续完整门禁准备(2026-09-18 已批准执行,进度见 implement)
在本轮定向结果冻结后,先补WebKit运行环境;将已验证的单所有者合成改密前置接入普通full-local须保持其fail-fast、全部非manual发现、零重试、PWA输入和完整回执,不把retained-local改名作为完整门禁。四条当前排除观测须逐项登记旧流程退役或冻结处置及替代合同;冻结差旅不能当废弃代码擅删。原服务端场景8与经理缺口先查现行合同和可达性再确定最小修复,不默认放宽组织或审批规则。原AC7补同合成状态的管理身份正向对照与独立反例完整门禁。以上未执行,不据定向通过启用R1或取得发布资格。
G16 首次完整运行在旧直接付款成功预期处失败。最小补充为共享受管的 retained-server-local 固定套件选择、普通回归前 guest probe、forbid-only,以及直接付款按实际 batch-required 合同验拒绝与零写入;完整资格不接受该定向结果。具体失败和分支边界见 implement 顶部。
独立审阅与外部事实按本轮independent-and-external-readiness.json办理:当前QA和上批产品分别审阅;指定真实批次身份/企微结果仅在另批生产只读范围核;真实银行接受性另验;K1只有非秘密角色/渠道陈述时记REPORTED,K2须新的源/制品/字段/资源/注入清理绑定与独立批准。旧恢复不再运行。
real-cases-r6 两条付款主链与进度3/3通过,角色入口矩阵1失败:当前前后端hasFinanceRole均保留admin兼容入口。最后只将admin的AP/付款入口改为可见,补正式API批次复核403(显式经理/负责人角色守卫),继续保留admin非业务审批人和管理聚合审计入口验收。非本轮新权限决定。
G13 第五轮与最终验收补件(2026-09-18)
real-cases-r5 为1通过/4失败,手机交互整例通过。财务审批实际同页已显示“通过”,测试误定位申请详情标识;应定位reimbursement-approval-processing-progress并检查completed/处理人/通过/无处理中。管理员审计入口位于管理聚合页;管理员正向入口与经理/财务负向权限必须分别检查。旧“非审批环节”视觉标签已无,改验正式workflow恰有2步与3个独立付款阶段,不删业务区分。
共享付款流程对照原例补回付款后字段只读、回单不可上传/作废、可下载、正式paid状态和付款/上传审计元数据。两条主链受共享辅助文件影响均需重验。r4在浏览器前为纠正文案主动中止:内层dropdb因代理退出失败,外层owner核验后容器/临时目录均移除,环境按INVALID/中断保留,无业务结果。
G13 第三轮实测纠正(2026-09-18)
real-cases-r3 完整13条为8通过/5失败,零重试/跳过,环境清理和输入完整性PASS;PWA真实A/B同profile升级已通过。继续只补5个实际失败及共享辅助流程触达项。
正式小额报销由approval_rules的manager→finance动态投影,不采用seed日志中的通用workflow_definition一步CEO链。测试读取真实task/步骤ID,经理和财务依次UI审批,并检查财务通过后的同页进度,不改产品或seed。以下较早“一步审批”描述是已纠正的测试假设。
经理只有组织只读管理项,无主数据/银行账户;财务有组织、主数据、银行账户。两者管理写权限拒绝保留。手机发票添加成功后页面保留成功消息,须点“返回报销单”;不要求自动关闭。预览使用有效合成PDF,验证UI签名请求、弹窗和正式签名文件200/inline/PDF/原字节一致;headless原生PDF渲染不据about:blank判断通过或失败,也不宣称已验原生阅读器。
G13 第二轮停点与定向补验(2026-09-18)
real-cases-r2 被信号中断,未生成完整 Playwright JSON;环境清理和源码/仓库完整性 PASS,不从过程日志补造用例 PASS。下一轮仍覆盖其全部 13 条选择,不把日志中的局部通过抵扣完整结果。
- PC/手机 OCR 完成后仅默认勾选,测试必须选择唯一既有合成明细,再明确点击添加;继续检查票据关联和明细数量,不能为旧“自动添加”标题恢复旧产品行为。
- 管理聚合入口按当前子权限展示;经理/财务验证组织、主数据等只读入口,并验证账号、审批规则、流程定义、审计不可见,保留后端拒绝检查。
- 项目 Portal 使用应用 Asia/Shanghai 日历日;合成跟进日期对齐该口径,增加正式保存请求和首页汇总检查,不删除跟进卡验收。
- 手机请假使用现行完整企微说明,继续断言日常 OA 表单不存在。
两条保留报销付款主链路复用同一测试辅助流程,集中维护现行详情、一步审批和回单核销;各自保留原测试身份,主链路额外验证票据预览。合成企业/员工银行信息由正式API写入当前独占库,固定公开虚构账号,仅限受管loopback;不得读取真实资料。回单使用有效合成PDF及正式人工更正→独立复核,不注入paid状态、不关闭核验。
G13/G15 首轮真实认证重验后的测试对齐方案
在 real-cases-r1 完成并核 sourceSnapshot 之前不修改输入。仅改已证实漂移的在用测试/共享页面对象,不改产品、种子审批定义或权限。
- 公告:h1+exact 避免与真实创建的公告标题歧义;保持创建、团队状态和角色首页断言。
- 权限直连:退役 ERP 前端应显示404,后端各角色均404,不能继续验证ERP管理成功;经理付款读取/复核入口按当前权限保留,AP列表/台账/导出拒绝仍检查。移动审批退回按钮按当前标识断言无权角色不可见。
- 报销页面对象:使用当前独占详情workspace、明细/票据证据与操作面板,不恢复旧overview/summary组件。上传后验证明确票据ID出现在证据区及关联明细;草稿明细由测试显式填写,不能依赖已替代的空单自动建明细。
- 主链路:沿合成seed现有总经理一步审批、财务制单、非制单人独立复核、回单验证与核销;不更改seed为旧经理/财务链。保留发票预览、关联、付款状态、回单/付款审计、AP与票据归档,移除ERP成功分支与ERP开关。
- 其余首轮失败按实际停点区分定位漂移、无效历史合同、环境不足和产品问题;没有证据不提前改预期。原58身份和失败事实不可回写;当前替代验收逐条记录,不能以删断言/skip减少分母。
只重跑受影响失败用例和必要依赖;已经通过且输入未变的结果复用。WebKit缺失仍单列未验证;普通full-local、R1与独立review不据此关闭。
PWA首轮停在serviceWorker.ready:进一步核实际构建常量,若受管NODE_ENV=test让Vite输出DEV=true,则仅在构建子进程固定production,并保留应用服务test模式。必须以双构建真实SW升级重新验证,不注入手动注册或放宽超时。
部署门禁完整性设计草案
G12执行细化:一次性合成账号与限定受管重验
复用full-local-environment的namespace、无外部路由、独占PG及owner清理,给run-web-gates.sh增加明确的retained-local诊断模式。必须显式提供本地spec清单;报告标注focused、normalReleaseEligible=false,不改变普通full-local的无筛选分母。限定模式不读取共享真实环境配置、不联网安装,不运行旧恢复。
本轮空库seed为8个现有合成角色注入运行内随机初始密码,仍must_change_password=true;由单一预置进程通过正式登录→验证改密要求→change-password→旧密码拒绝→新密码登录完成初始化。新密码沿当前用例已有公开合成fixture值,必须不同于本轮初始值;不是把已修改账号回改种子初始密码,也不通过SQL清标记。运行后销毁独占库,不把会话凭据写入证据。所有业务测试启动前初始化一次,不在并发login helper里写密码。
首次浏览器登录/改密页面另用合成用例验证;管理入口/业务前置差异逐项登记。页面mock与真实认证分开出具回执,历史观测身份映射保持。两个旧截图输出改为运行独占目录,旧冻结截图不动。
2026-09-17 历史观测到当前合同的分类方法
下一批环境前置与验收方案
58条分类后,本轮重验15条原观测;4条旧日常OA请假/冻结差旅不修,39条保留项尚未整例重验。39条按依赖排程:25登录前置、10页面/fixture、1合同详情只读、1已修AP整例、1WebKit报销离线、1PWA升级。是观测处置数,不是独立缺陷或开发工作量。
- 登录合成生命周期:先核受管一次性DB的seed→首次登录→强制改密→再登录合同,保留must_change_password=true与生产禁止seed的守卫。设计运行独占的已改密合成账号集,集中向测试提供凭据;不得并发套件修改同一账号、回改初始密码、直接SQL清除改密标记或给业务测试注入生产会话。只在零外联、独占合成DB/服务来源核验通过后运行,失败时保留/change-password或/login的原因,不放宽/portal断言掩盖前置。
- 页面/fixture:当前待重验观测为6、14–16、22–24、38–39、51。先核witness合同与当前页面层级、付款默认视图、审批详情动作和固定安全提示;混合旧视觉样本不得恢复待精简模块或旧布局。每个保留业务断言先对应现合同,再用合成输入恢复;截图必须另根,不覆盖旧归档。涉及新视觉判断时遵照现行设计技能边界,不擅自改产品样式。
- 合同只读阶段B:在保留当前权限前提下从列表进入详情,继续证明新增/编辑/续约/归档不可用,并以隔离反例证明断言能发现泄露;不因旧“更多”定位移除后两项断言。原主合同阶段B完整反例门禁仍未完成。
- AP整例:已有09-07发布与路由/导出73项证据仅支持特定修复。登录前置就绪后原权限直连整例重验,经理仅付款复核职责仍拒绝AP全量读取,不把200作为新预期。
- WebKit与PWA:本地Chromium可用、WebKit执行文件缺失;不联网安装或用Chromium模拟通过代替WebKit结果。PWA保留真实生产构建与旧新版本/同profile/SW升级验收,当前只读静态mock服务器明确block SW,不能用其PASS抵扣PWA。先补环境合同,独立记录升级与清理结果。
本节为已批准后续工作的细化计划,尚未实施上述账号生命周期/未运行项;R1、完整发布资格和独立结论不随本地子集通过解禁。真实环境/凭据、生产/ARM、恢复、提交部署及借款保持原边界。
只读接回主checkout的managed-diagnostic-20260907-04/results/browser-failure-inventory.json及同次本地合成Playwright报告,核54失败/4超时、58条身份与原SHA。仅输出相对源码位置、失败层次、当前合同依据、在用性、最小下一步;不复制原始DOM/payload或完整机器路径,不读生产日志。逐例检查当前源码,前置失败不能证明后续业务断言有错;源码已有修复不能把旧结果直接改PASS。
R12当前断言要求未知VALID_001回显原message,与09-05安全错误合同冲突。保留共享resolver与禁止普通页面直接拼内部码/原异常的检查,将该例改为未知原因的固定安全兜底、合法requestId、已注册导入原因提示及未知原因不回显。无新增UI或权限行为;直接运行Playwright中的纯源码/函数用例,不启动浏览器、服务或DB。先保留当前失败,再验修后结果,输出目录独立、retries=0,不覆盖旧报告。
其他分组须先落实施边界,不能因有旧测试就恢复企微主办/待精简的OA业务,不能为变绿删掉权限或付款断言;涉及真实DB流程或环境前提的项先区分必要环境与业务证据,R1和公网发布资格保持未完成。
11. 归档截图保护与全仓回执增量(已批准)
- 先以独立副本和 SHA 保全四张本次运行截图,再仅恢复这四个 worktree 文件;保留全部 14 个已跟踪历史证据及其原登记摘要,不改 index。
- 两个 spec 只变更 fs 导入及截图目录定义。QA_VISUAL_OUTPUT_DIR 是输出根;使用 spec 前缀和 mkdtemp 创建独立目录,未传变量时也只写新的 ignored output 子目录。受管发现/浏览器命令传本轮报告内 visual 根,不依赖外层调用者自觉,不改业务断言/认证。
- sourceSnapshot 保留限定目录 digest,另记录 repository 的完整 porcelain-v1-z、人类可读 status、全仓 tracked 文件内容/类型/模式(symlink 不跟随)、完整 stage entries/flags 及 indexDigest。删除、内容变化、同为 dirty=true 时的二次改写和 index-only 变化均可见。忽略运行产物不是为已跟踪 output 路径豁免。
- sourceUnchanged 与 repositoryUnchanged、cleanAtStart/cleanAtEnd 分列;诊断前后及失败收尾均采样。环境有效与候选被改写不混淆;普通模式遇候选改写非零,诊断固定 PARTIAL/2。尚未启用的 R1 以后必须消费干净状态,不能用 unchanged 代替 clean。
- 治理校验显式登记归档 evidence.md 的截图表/根目录/14 条预期数量;解析表格并验证普通文件及摘要,表格丢失、缺行、重复、缺文件、路径逃逸、symlink 或摘要变化均 error。恢复演练文档记录的是历史私有候选值,不具备仓库路径到摘要的可复核表;本轮不取私有数据、不冒充 17 项全验。
- 针对性测试覆盖路径默认/覆盖/重复加载隔离,已跟踪 PNG 改写、既有 dirty 再改、index-only 变化,以及证据篡改/缺失/表格缩水。只运行这些验证和 typecheck/治理,不重跑 67 分钟诊断。
最新授权(2026-09-07):用户批准 §10 实施及一次诊断,bootstrapObservation 改为外部黑盒观测(表单可见、零 refresh、独立原生在线采样),不修改 AuthContext、不安装 spec route mock。旧 207 清单的决策资格撤销,原件保留;环境失败不能按业务断言失败继续。R1、阶段 B、31+2 迁移不自动启动。
1. 复用范围与状态含义
本文入口强制消费为获批生效后的目标,不是当前已启用事实。阶段 0 先运行原始 full-local 摸清红项;结果交用户决定强制点生效时机。机制交付、R1 启用、冻结候选重新生成回执、首次真实部署是不同步骤;后三者不属于本 task 自动完成动作。启用须全套验证已绿且明确获批,不设计可日常置位的 disable/skip 总开关。具体切换补丁边界在基线审阅后确定,当前不修改任何真实入口。
复用 run-release-gate.sh 中已经存在的 static → full-local → deploy 顺序,不照抄成另一套规则。把发布前两阶段整理为同一条可单独调用、绝不部署的验证路径,供 ci-release 与真实 bootstrap 路径共用。
| 入口/profile | 证明范围 | 可直接作为普通发布资格 |
|---|---|---|
| release-predeploy | 原 ci-release static + full-local 均真实完成,且受管结果完整、来源一致 | 是,仅发布前资格,不代表已部署 |
| local-candidate full | 保留完整基础层、witness/acceptance 判定及 LOCAL_CANDIDATE_PASS | 否,不能冒充 release-predeploy |
| local-candidate focused | 保留 FOCUSED_BROWSER_PASS,不含 full 基础层 | 否 |
| local-candidate list | 仅枚举 LIST_ONLY | 否 |
| 直接 Playwright 的筛选执行 | 仅所选用例的诊断结果 | 否 |
| project-wide 获批跳过 | 明确 PARTIAL、未覆盖阶段与批准引用 | 否 |
当前 full-local 的 Playwright 会发现配置下的全部非 manual 测试;同一次报告可供受管集合验证使用,避免重复执行完整浏览器。不能把对子集的验证称为 run-local-candidate full 已执行,也不能只抽取通过的结果后忽略全套的失败退出码。
2. 入口收敛,避免递归
拟新增 run-release-gate.sh verify-candidate 作为验证专用模式,内部复用原 stage_static / stage_full_local;此名称是新子命令,不是新门禁实现。
ci-release / all
-> 同一发布前验证阶段
-> 获得并校验 release-predeploy 回执
-> 既有 production-identity-bootstrap
-> deploy-existing -> deploy.sh
production-identity-bootstrap / deploy-existing 直接调用
-> 无回执时只调用 verify-candidate,不反调 ci-release
-> 同一回执验证
-> 保留既有身份、来源、迁移、回滚窗口及部署前后置检查
-> deploy.sh
run-release-gate deploy / 底层 deploy.sh 直接调用
-> 必须消费同一验证器确认的回执
-> 无效则在发布写入前拒绝,不以内部调用标记免检
- ci-release/all 的发布分支使用保留生产前置的入口,不回退成绕过 deploy-existing 的裸部署;直接底层调用至少不能绕过新增的候选验证。
- 高层成功验证后传递的是回执引用,不是
GATE_PASSED=1等可直接置位的信任标记。下层仍验证来源、profile、覆盖、结果和适用输入,不重复跑整套测试。 PRODUCTION_READ_ONLY_PREFLIGHT=1仍只做原有只读检查并明确退出,不生成 release-predeploy 回执,也不赋予后续写入资格;不能被当作“跳过测试但继续发布”。- 普通发布指向 existing 部署;initialize 的独立批准和数据模式约束保持。即使直接调用底层初始化路径,也不能通过缺少回执逃掉候选检查。本 task 不运行 initialize。
- 门禁不合格时允许必要的只读诊断,但远端 rsync、build/up、init/migrate/seed 等写动作必须为 0。既有
--no-deps、健康等待及禁止自愈不变。
3. 最小共享回执模块
拟增加一个共享候选回执模块及其单测,供发布 runner、local-candidate runner 和底层发布入口使用;不增加数据库表、密钥、外部服务或第三套执行器。
| 字段组 | 内容与约束 |
|---|---|
| 身份 | schemaVersion、runId、profile、候选完整 commit/tree、工作树前后状态 |
| 校验输入 | 门禁策略、manifest、Playwright 配置、相关锁文件摘要和实际 Node/Playwright 版本;绑定当前候选重新核验 |
| 时间 | startedAt、finishedAt 与各阶段实际观测时间;未结束必须是 INCOMPLETE,不能补造成功时间 |
| 选择 | 实际命令类别及安全参数:模式、grep、grep-invert、project、shard、only/手工模式、retries 等;不保存含凭据的原始命令行 |
| 清单 | expectedSpecs/observedSpecs,以及带项目身份的 expectedTestIds/observedTestIds;仓库相对路径规范化、去重并拒绝越界来源 |
| 结果 | 每阶段退出码、每用例预期/实际状态及 attempts;成功、失败、skip、错误和缺失分别表示,不仅保存汇总数 |
| 例外 | 受影响阶段、非空理由、操作人别名、明确批准引用、真实可知的批准时间与观测时间;未知批准时间留空,不用当前时间补造 |
| 资格 | PASS/FAIL/PARTIAL/LIST_ONLY/INCOMPLETE、deploymentEligible 与稳定拒绝原因;必须由验证器重新推导,不能直接信任布尔字段 |
清单采集遵循以下顺序:
- 冻结候选来源与所用工具链;开发脏树允许产出诊断记录,但 deploymentEligible 永远为 false。
- 在同一候选、同一配置与规范执行参数下枚举预期清单;枚举不是行为通过。标准发布无 grep/shard/only 等缩减范围,禁止 focused-only 声明。
- 实际执行 static/full-local;接收真实 Playwright 结构化结果,记录实际 spec 与用例,并检查报告完整性、全套命令退出码和 runner 错误。
- 受管 witness 与 acceptance 必须完整发现、实际执行并通过;集合必须从当前候选定义生成,不从待验证回执自报的 expected 字段取信任根。同一 spec 中遗漏合同用例也必须被拦。
- 继续复用既有 witness 的来源绑定、重复/未知标签等判定。full-local 全套报告不能只剩绿色子集;全套命令失败仍失败。受管子集零 failed/skipped,其他测试的状态仍完整记录,不通过删结果让报告变绿。
- 标准发布明确禁用重试至绿,使用零重试和 forbid-only;required 测试不能靠 expected-failure 获得通过资格。历史诊断若有多次 attempts,如实保留,不能改写为一次成功。
- 结束后和写入前重新验证 commit/tree、干净工作树与校验输入;不匹配、缺少结束标志或回执损坏均拒绝。
local-candidate 原验证器对其选定集合的严格行为保持;共享解析或复用辅助函数不能把它改为接受失败/跳过。本轮不削减 acceptanceSpecs、不删除旧门禁,只恢复错误用例和增补证明链。
4. 持久化和故障处理
- 每次运行有独立目录,先写 INCOMPLETE,再原子完成脱敏汇总;成功与失败都留存,写回执失败本身不具备发布资格。
- 持久汇总放既有 ignored artifacts 体系;它是本地运行证明,不提交到产品版本。发布日志记录 runId、候选短 SHA、profile、结果及相对证据引用。
- cleanup 可以回收本次独占服务和临时文件,但不能删掉唯一结果。SIGINT/阶段错误/进程被强制终止时,有效结果只能是失败或缺失/未结束,不会被默认补成 PASS。
- 多次执行、失败后再跑和其他 profile 的记录各自保留,不覆盖、拼接或给旧结果重新命名。相同候选的有效回执可由同一发布链引用,不以时间戳或“上次绿”替代内容匹配。
- 不记录完整本地路径、生产连接、原始业务响应或敏感环境;测试结果中的路径归一化,用例标识不嵌入真实人员/合同内容。
- 这是防止意外复用、范围误读和无记录绕行的本地审计合同,不是防伪完整性保证。执行端本身有写文件能力,一份内部自洽的手写回执仍可能通过;独立推导集合及重验来源不能消除这一威胁。本轮不引入签名服务或秘密,也不把可审计说成不可绕过。
- 保存足够的候选、工具链、环境前提、完整命令及逐项集合,使第三方可重跑复现。首次真实部署前由用户或独立方重跑并与回执逐项比对;原主会话的重复自检不抵扣。重跑差异如实阻断,不拼接两个报告成为 PASS。
5. project-wide skip 的拟定边界
仅处理现有两个开关,不顺带审计和重写所有业务 flag:
- PROJECT_WIDE_SKIP_BUSINESS_FLOW
- PROJECT_WIDE_SKIP_VISUAL
开关值须精确合法;缺理由、受影响阶段或批准引用时,在跳过任何阶段前失败。获批诊断必须落地包含上述信息的 PARTIAL 回执,列出未运行 spec/阶段,并以非零结束,不经过原来的完整 PASS 输出。
普通发布 profile 不接受这两个开关或诊断回执;也不新增一个更高层的万能 skip。批准引用的结构验证只证明记录齐全,不能自动证明用户真的授权;执行端仍须引用真实批准,不补造批准时间。该边界已获用户批准,阶段 0 不实施代码。
6. 合同用例恢复
- 原用例继续留在 payment-reviewer-permissions.spec.ts,维持 manifest 归属;不改名移动来绕开失败记录。
- 扩充本地合成 API fixture 到当前详情 DTO,按实际“查看详情”导航,证明目标详情和生效状态加载后再断言不可新增/编辑/续约/归档。
- 管理权限对照使用同一合成生效合同,证明相应动作确实存在,不用终止或归档状态天然隐藏动作来伪造只读权限通过;只在合成测试中操作。
- 若当前页面真实暴露不应有的动作,保留原始失败、报告最小影响范围并停止该修复分支,等待权限范围批准;不顺带改权限、不降断言、不重试至绿。等待期间 R1 强制点保持未获启用授权,机制 diff 仍可独立评审;完整候选资格不成立,不自动授权发布。获批修复后须重跑全套验证,不能用定向绿清掉启用前提。恢复该 UI 回归不等于生产真实身份权限验收。
7. 兼容性、回滚与成本
- 直接 deploy、底层脚本和无记录 skip 将新增失败情形,这是本任务预期的兼容性收紧。提供明确错误、验证专用入口和缺失证据说明,而不是自动放宽。
- 保留 existing 数据生命周期及全套生产前后置合同;首次真实使用新工具仍需单独批准和人工观察,不自动发版验证。
- 其他全套测试失败会真正阻断发布。本轮不得缩减范围以便发布,也不能把修改后的机制先绕过一次再称已上线。
- 回滚应用版本不等于回滚部署工具。没有新的明确批准,不使用旧裸部署命令、删除回执验证或调低判定自救。
- 本轮不优化完整测试耗时;优先复用原 ci-release 阶段与一次 full-local 结构化报告。今后若要合并其他门禁或减少覆盖,必须另证等价并审批,不能在这次顺便做。
8. 阶段 0 补充方案:PWA 输入归属(已批准,验证见 implement)
8.1 已批准采用 (a),full-local 负责准备输入
- 选择 (a),不选“排除后由另一个入口兜底”。当前需要先让完整分母可测,不宜同时引入排除清单、第二执行义务及多份报告合并;这些额外关系会再制造本任务正在消除的漏跑风险。
- 复用现有 run-pwa-cross-version-upgrade.sh 的 A/B 构建逻辑,提取一个小型共享准备/清理 helper;专用 runner 与 full-local 都使用它,不复制两套构建规则,也不把专用 runner 的一张 PASS 冒充 full-local 已执行该用例。
- 使用本次源码生成两份临时生产构建与不同的 12 位合成构建标记,四项 PWA_BUILD_* 输入只在本次测试进程中传递;它们是测试版本标签,不是候选提交身份。真实候选 SHA 另行记录,不能混淆。
- 两份 outDir 与 client/dist 分离;不搬用历史产物,不用假路径、同一构建冒充 A/B,不写共享 env、用户 shell 配置或生产配置。已有专用入口继续可用,PWA spec 顶层缺输入仍明确失败,不改成 skip 或静默 fallback。
- 在 full-local 的发现阶段之前准备输入;先完整 --list 留下当前候选的发现集合,再沿用原服务端/前端/真实 DB 回归及全套浏览器执行顺序。列出集合只证明分母可枚举,绝不等于这些用例已经执行。
- 全套仍无 spec/grep/shard 筛选,不改 playwright.config 的忽略集合、不改 route-manifest 的 witness/acceptance 归属。传入 PWA 输入后,同一套全量执行结果必须实际包含 PWA 用例,不能将它拆出去然后漏算。
8.2 覆盖归属与运行代价
- 按当前候选的 testDir/testMatch 和 manual 目录边界独立推导所有非 manual spec;选择 (a) 时它们全部归 full-local,本轮排除集合为空。不能用当前 route-manifest 作为完整套件的全集,也不照搬 local-candidate 的文件名含 live 过滤来缩减 full-local。
- 对照全量发现结果核对文件归属,再保存用例集合;PWA 是“full-local 内需要额外输入”的成员,不是例外。未来要拆出其他专用 spec,必须先明确登记原因、必跑入口、责任归属及如何兑现结果,不能默默过滤。
- 用户已修正并批准:保留默认文件间并发,不加全局 --workers=1。PWA spec 内部已声明 serial,并使用独占随机 loopback 端口和本测试的 BrowserContext;构建只读,无证据要求与其他文件互斥,当前不新增 project。若实测出现隔离问题,先报告证据,不自行全局串行。
- --retries=0 作为 R2 独立要求显式传给发现/执行,覆盖 CI 默认一次重试,不随 PWA 方案改变而删除。成本为额外两次 Vite 生产构建,浏览器及服务端默认并发不变;不承诺固定增量分钟数。
- 输入准备失败或收集失败立即非零,保存具体错误、阶段和未运行范围;清理仅处理本轮自有构建/服务/数据库,不删除唯一结果。后续业务阶段若再 fail-fast,仍如实记录未到达浏览器,不能宣称完整红项已齐。
8.3 拟验证的最小行为
- 共享 helper 的隔离命令捕获:A/B 各构建一次、输入不同、输出目录独立、任一构建失败即非零、四项输入仅传给测试进程、清理不碰其他目录。fake 工具只放测试临时目录,不写共享 PATH。
- 全量发现必须包含 PWA,且与当前非 manual 文件归属相符;遗漏输入、误把 PWA 排除、只保留 manifest 子集都不能得到“分母完整”。不能只 grep 命令中出现 --list 或 PWA_BUILD_* 就认为已验证输入与归属。
- 原 PWA spec 内容与断言不变;A/B 不收敛或其他浏览器失败只留原始结果,不 reload、不清缓存、不重试至绿、不修 PWA 产品代码。
- 结构化输出区分发现集合与实际执行、failed/skipped/not-run,绑定当前源码及真实参数;这只是阶段 0 诊断资产,不提前实现或启用 R1 发布准入。
8.4 负金额原断言冲突与分层纠正依据
只读源码与现有规约确认:
- reimbursements.js:3931 起先检查每条明细;任何 amount <= 0 立即返回 400 VALID_001,details.items=positive_amount_required,并附受影响明细 ID。
- 通过以上检查后才到 :4021 的明细求和和 :4026 的总额非负守卫。对同一组稳定、有限、全为正的明细,不可能求出负总额。
- reimbursement-invoice-ocr.md:936 明确规定上述明细诊断;reimbursements.expense-standards.test.js:325 已有非正明细前置守卫单测,fixture 是零金额。上轮 1680 单测通过不能因此冒称“真实 DB 负金额总额守卫已经覆盖”。
- 原 regression-workflow-actions.sh:999 强制断言 details.total_amount=negative_not_allowed。仅改成负明细会在更早处被合法拒绝,不能同时保持该原诊断断言为绿;这不是产品漏拦,也不应为了测试绕过正明细检查、引入竞态或伪造聚合结果来冒充真实 DB 覆盖。
因此上一轮“改明细、不改断言”要求不能在这条稳定真实 DB 路径上同时满足,当时保留了原失败并报告。用户现已批准分层纠正:真实 DB 场景正式改名为 items_positive_amount_required,构造负明细并核验入库值/合计,仍要求 HTTP 400、VALID_001、无 workflow instance,精确诊断为现有规约规定的 items=positive_amount_required,并核对目标明细 ID;不是把 400 改为 200,也不是删诊断或放宽为任意 400。
总额函数沿用既有 __testables 入口直接单测,不修改函数逻辑、不伪造数据库聚合。负数和非有限值的两个拒绝分支由直接单测证明;在当前稳定正明细提交链上,负总额拒绝分支不可达,不再挂成待补同一路径 E2E。函数本身仍被正常调用,不能把“拒绝分支不可达”误写成整个函数没有执行。负金额场景之外复用表头 setter 的其他场景不顺手修改;后续新红项照原范围留痕。
8.5 审定与实施边界
用户已审定 PWA (a) 及修正、金额分层方案,当前执行范围不再重复索取批准。三项前置处理的目的只是让分母可测,不是全套变绿。合同用例、其他新红项、任何产品/权限修复、阶段 A 和 R1 强制点仍不在本轮动手范围,提交/push/部署也未获授权。
2026-09-06 最新批准覆盖本节此前待审状态:PWA 按 (a) 实施、零重试独立于 PWA、禁止默认全局串行;负金额不沿用旧场景名改诊断,而是改名为 items_positive_amount_required 的真实 DB 黑盒场景,验证负明细、精确诊断与 itemIds、无 workflow。另通过已有 __testables 导出原 ensureNonNegativeAmount,直接单测负数/非有限值/有效值,不改函数逻辑或提交路径。规约记录稳定正明细提交路径使总额负数分支不可达,纵深防御由函数单测证明,不长期挂成同一路径的欠验收项。其他新红项仍只留痕。
9. full-local 诊断分支增量设计(方向采纳,实施待审)
目标是让相互独立的测试阶段不因先前断言失败而全部失去执行机会,不是替换普通发布门禁,也不承诺一次获得每个有内部依赖的子用例结果。复用当前 run-web-gates.sh 的输入、集合、构建及本地环境 helper;拟新增显式模式 full-local-diagnostic,不复制第三套发布执行链。
9.1 两种入口的不可混淆合同
- full-local 保持原 fail-fast:任一阶段失败即非零,后续不运行。本轮不把普通入口自动切到诊断、不改部署调用链、不启用 R1。
- full-local-diagnostic 只用于获批本地合成环境;记录理由、操作者别名和明确批准引用,缺项拒绝,不自动补造。即使所有已执行测试为绿,聚合状态也固定 PARTIAL、退出 2,不生成发布 PASS 或发布回执。输入/运行错误及中断同样非零,保留具体阶段状态。
- 诊断报告类型、执行模式及实际命令与正式验收不同;未来候选验证器必须按真实 profile/阶段结果拒收诊断,不信任可置位的 qualified/GATE_PASSED 等布尔字段。R1 未实现前不宣称现有发布入口已经具备这项验证能力。
- 继续固定零重试、保留并发、不增加排除,不使用 grep/spec/shard 子集或 test.fail/only。完整发现继续先行;65/275 是当前快照,不硬编码成以后候选的预期集合。
9.2 继续的是测试阶段,不是失败的前置条件
- 服务端单测、类型检查、独立真实 DB 回归套件的断言失败可记 FAIL 后继续尝试其他具备前置条件的阶段。逐阶段记录命令、起止、耗时、退出码、结果及失败/未覆盖范围。
- PWA 输入、集合发现、数据库创建/迁移、必要构建、服务启动/readiness、隔离确认属于依赖前提;失败则只阻断其依赖分支并标 NOT_RUN/BLOCKED 及原因。不能在没有可用构建或数据库时盲跑并把环境错误计作产品失败。
- 各写库套件之间及浏览器前建立新的本轮独占临时库与服务,重用同一候选的构建与种子过程,不修改种子。不能仅凭失败套件的 cleanup exit 0 就认定数据已恢复;原库和新库都登记所有权、生命周期及清理结果,禁止接入生产或清理非本轮资源。
- 阶段命令在独立严格 shell 进程中执行,由外层捕获退出码,不全局 set +e、不把 shell 函数放入条件上下文导致内部 errexit 失效、不用 || true 吞掉失败。
- server regression-all 保持原内部 fail-fast,不传 --json-report:首次诊断证实该选项会在失败后复用同库继续,不满足本节的隔离硬约束。后续内层套件如实 NOT_RUN,只有外层独立新库分支继续;保留日志中的启用/跳过事实,不能因名称含 all 就声称全部模块运行。它内部再次包含 workflow-actions,重复执行须单独列为阶段来源,不冒充两个不同红项。首轮原始聚合回执保留,资产/IM 后续失败附同库污染风险,不倒写净库结论。
- 不改 workflow-actions 内部状态相关的 23 组来强行继续。第 8 组仍失败时,该套件第 9–23 组仍 NOT_RUN;诊断模式使后续独立套件和浏览器可以运行,不使所有服务端分母自动完整。Playwright serial 失败连带未执行的用例亦保留框架原始状态及依赖原因。
9.3 证据、成本与最小验收
- 诊断浏览器阶段显式 --trace=on,不能继承与 retries=0 组合后永不产物的 on-first-retry。共享浏览器 helper 只转发内部调用参数,普通 full-local 不新增 trace/worker/筛选参数;本次不改 client/playwright.config.ts。用真实命令捕获验证该参数到达 Playwright,删掉诊断调用处参数的隔离源码变异必须被捕获。trace 只留在本轮本地证据目录,不自动公开或提交。
- 保留候选 SHA、dirty/tree/diff 与包含新增文件的运行前后摘要、工具配置、完整发现、实际用例结果、阶段与清理状态。未到达浏览器或报告中断时,缺失用例保持未运行/未知,不能计为通过;本地诊断文件不提供防伪或签名保证。
- 用命令捕获 fixture 分别证明:普通模式失败后没有后续阶段调用;诊断模式遇测试失败仍到达具备前提的浏览器阶段;准备或清理失败不会假绿;独占库隔离;全部命令返回 0 时聚合仍 PARTIAL/2;缺批准记录拒绝;集合、并发及零重试不退化。移除真实的模式/退出保护须让相应反例变红。
- 实施获批后只运行一次隔离诊断,不修新红项、不重试至绿;交执行失败、未覆盖、环境阻断三类清单及逐阶段耗时,不能承诺必然取得全部子用例结果。
- R1 启用需要另外一轮普通 full-local 全绿的完整总耗时与逐阶段耗时;诊断增加隔离重建且容忍阶段间继续,其耗时不能冒充普通发布绿路径成本。红项清空、全绿实测与启用批准仍各自留痕。
本节拟改动仅为 run-web-gates.sh、必要的共享阶段/结果 helper、对应 QA 测试和现有部署规约;不改审批解析、规则/种子、场景 8/9、合同/R102/PWA 产品或用例断言、发布入口。方向采纳不替代本增量设计审阅,其他阶段 A 内容仍未开工。
2026-09-06 后续授权覆盖本节待审状态:用户已明确批准 §9,允许只实施诊断子项并立即进行首次诊断,不等待场景 8。阶段内部继续边界、独占新库、PARTIAL/2 和非发布资格均不变;其他阶段 A 和 R1 仍未获启用授权。经理解析只读盘点可作为既有盘点延伸,不能据“没有经理”直接推断实际选中规则必含经理节点或合法兜底一定不可用。
10. 环境启动合同(R2/R6,2026-09-07 已批准实施及一次诊断)
10.1 Scope / Trigger
环境是完整候选验收的组成部分,与来源和覆盖同级,不能交给仓库外包装临时决定。本节纳入 full-local 普通与诊断浏览器链的受管环境创建、测量、失败处理和回执消费;不开展 31 文件认证迁移、不修合同或其他业务红项、不启用 R1、不授权生产或全套重跑。
旧包装有本地留痕,具体见 diagnostic-run-20260906-01/run-isolated.sh:43 和 online-20260907-01 的对照证据;缺口是它没有作为受管环境合同被共同审查。207 撤销的是结果清单的决策资格,不是删除原件或宣称 207 条全部同根因。新清单及正常绿路径耗时仍未知。
10.2 Signatures / 受管入口与字段
- 由 run-web-gates.sh 的公共入口调用受管环境 helper,普通与 full-local-diagnostic 共用;子阶段只能在该 runner 建立并核验的上下文内工作。无临时 artifacts 执行依赖,无调用者可置位的 ENVIRONMENT_PASSED=1 放行合同。
- 首版建议明确限定现有本地 Linux 通道的 isolated-online-v1:runner 创建独占网络命名空间及内部 up 链路,服务/浏览器同处核验过的环境,无外连默认路由;本地独占库、socket、PWA 服务的归属及清理由 runner 管理。平台/能力不支持就报告 ENVIRONMENT_INVALID,不自动降级到宿主或开放外网。其他平台 profile 要另审,不能靠空字段冒充兼容。
- 回执增加 environment.schemaVersion、profile、policyDigest、runnerDigest、probeDigest、platform、namespace、nativeOnlineProbe、bootstrapObservation、status、cleanupStatus;摘要绑定当前候选及包含新增文件的策略输入,不由回执自报 expected 字段定义合格环境。
- namespace 至少记录 inheritedRunner、ownedChild、browser 所处 namespace 的脱敏指纹及来源、runnerCreated、browserMatchesOwnedChild、topologyPolicyMatched。Linux 进程本来就处于某个网络 namespace;不得用单个“是否 namespace=true”混淆继承环境与本轮创建的隔离。
- bootstrapObservation 明确 scope=environment-probe、observationPoint=guest-entry-black-box、freshContext、initialSessionHint、loginFormVisible、refreshRequestCount、listenerBeforeNavigation、nativeOnlineSamples、窗口及 observed/unknown 状态。它是当前候选登录页的实际黑盒行为,不宣称读取 AuthContext 分支瞬间 online,也不代表全部业务用例。
10.3 Contracts / 执行与观测
- 入口冻结候选及环境策略,记录继承环境,然后由 runner 创建受管子环境。先验证 namespace 关系、内部链路/无外连路由及空白页原生 online=true;失败立即退出,不进行昂贵业务验收。不得改写 navigator.onLine 或把浏览器强制在线的配置当成内核环境事实。
- 复用既有构建和独占库准备,在同一受管环境启动真实候选服务。运行一次专门环境探针,只打开登录页,不登录、不提交业务、不读真实数据;必须取得第 3 条黑盒事实及独立原生在线采样,再启动业务 spec 集合。不声称取得 AuthContext 分支瞬间的内部值。此探针独立登记为必需环境阶段,不混入原业务用例数或假称完整覆盖。
- 不改 AuthContext。用全新 context(无 cookie/localStorage)及 serviceWorkers=block,导航前安装请求监听,直接访问真实候选 /login,不安装 mockSyntheticApis 或任何 route mock。必须表单可见且整个观察窗口内 refresh 请求数为 0;401/失败/重试请求也计数。独立读取原生 online,记录采样点,不冒充 bootstrap 当时的内部值。表单可见但发生 refresh 的反例必须被拒绝。
- bootstrap 探针和浏览器进程 namespace 事实两者都要核对;不能仅信回执某个布尔值。运行期间及结束时重新核验 runner 所拥有的 namespace/拓扑关系;关系变化、观测缺失、权限不足一律 unknown/invalid,不当作“无隔离”或 PASS。 父 runner 的 namespace 由父进程通过本轮独占 Unix socket 即时采样返回,响应绑定本轮 ID、PID 与当前策略;不是旧文件自报值。子 user namespace 无权跨层 readlink 父 namespace 时,不放宽为成功:改为由具有权限的被观测父进程直接测量,IPC 不可达或事实不符仍拒绝。子进程自身及浏览器 namespace 仍直接读取,祖先关系仍独立核对。
- 无法从进程自身可靠证明全部祖先包装都不存在。本合同保证的是 runner 重建并实测了获准的内部环境,不是“证明没有人从外层调用 unshare”。不同机器 namespace 指纹可不同;复现比较受管 profile、策略和关系事实,而不是硬比 inode 字面值。
- 一旦全局前提不合格,立即停止后续分支。普通 full-local 返回非零 ENVIRONMENT_INVALID;诊断内部记录环境失败并结束为 PARTIAL/2,不像业务断言红项那样继续展开浏览器。此前完成的原始阶段保留,但整轮不得给完整候选背书;未运行项如实 NOT_RUN,不制造几十个 skipped/failed 结果。
- 环境在线只约束全局启动及受管拓扑;mobile-approvals-offline、r89、r108 等在独立 context 内主动 setOffline 的行为合法保留。不得增加全程“所有 context 必须在线”的断言,更不能禁止/跳过离线场景。全局 kernel 环境不因某一个 context 的离线仿真而被判坏。
- 环境事实与候选、策略、实际集合一起由 R2 验证器消费;R1 强制消费启用时一并成为必需项,普通发布不设环境豁免。在 R1 仍未启用期间,诊断自身仍须执行环境前置,否则无法产出新清单。
- 回执不是防伪证明,外层有文件写权限的执行者仍可伪造。第三方按当前候选和受管命令独立重跑;原始/派生记录和脚本摘要并存,保留原失败,不能用新成功覆盖旧错误环境运行。
10.4 Validation / Error Matrix
| 输入或异常 | 必需结果 |
|---|---|
| namespace 创建失败、权限/工具缺失、原生 online=false | 环境失败;后续业务浏览器启动数为 0,无降级或豁免 |
| 空白页在线,但实际候选 bootstrap 缺失/false | 停止业务集合;观测缺失与离线分别标码,不假填 true |
| 调用者只置 ONLINE=1 / ENVIRONMENT_PASSED=1 | 不改变测量或验证结果,不能获得资格 |
| 回执缺环境、unknown、策略摘要过期、browser 不在 runner 拥有的 namespace | 非零拒绝;资格消费阶段的远端发布写动作数为 0 |
| 候选/探针/拓扑规则在运行后改变 | 旧回执不能给新候选背书 |
| 一个 context 离线,其他新 context 在线 | 合法场景,不污染全局环境结果、不跳过离线用例 |
| 环境有效,但合同仍卡“更多” | 真实业务用例红项保留,不能因环境已修就判整套通过 |
| 诊断所有已运行测试绿 | 仍 PARTIAL/2;诊断耗时不充当普通 full-local 全绿耗时 |
10.5 Good / Base / Bad
- Good:受管入口在继承的 loopback-only 条件内重建并核验 isolated-online-v1,真实候选 bootstrap 在线,原 spec 不改,回执记录当前环境策略与观测作用域。
- Base:环境有意保持无公网,但原生浏览器在线;业务使用本地服务,显式 context 离线由各自场景负责。在线标记不授予 live/公网访问权。
- Bad:在 artifacts 包一层 unshare,运行后才解释 207 个超时;或强改 navigator 为 true、把 document-start 写成 bootstrap、把 namespace unknown 写成未隔离,再用 exit 0 当完整验收。
10.6 Tests Required / 范围与实施顺序
- 拟涉及受管面:run-web-gates.sh、full-local-diagnostic.mjs、full-local-diagnostic-stage.sh;新增 scripts/qa 中的环境创建/探针/回执辅助模块及对应 tests;R2 共享回执模块在其实现时消费同一合同,不复制策略。独立探针不通过重写 31 个 spec 的 import 实现。
- 产品源码写入面为零,业务 spec 写入面为零。新增受管环境与黑盒探针及测试;不使用修改源码后的实验副本作为候选。具体文件清单按 implement.md 冻结,新增产品语义或业务测试迁移需另批。
- 先用 fake 工具/命令捕获验证:先创建及探针后业务调用、失败启动数 0、无 fallback、PARTIAL/2、环境回执拒绝矩阵、按归属清理。变异删除在线/归属/消费任一保护必须使对应回归失败。
- 在获准本地通道运行独立原生探针和无 mock 候选黑盒探针;保留原断言,不重试至绿。不修改产品、online 值或认证控制流;显式 context 离线与全局拓扑分离。此前 context 隔离实验只作其已观测范围的证据。
- 环境实现独立复核通过后,按明确运行授权仅重跑一次完整诊断,绑定最终交审源码,不修清单中新红项;服务端场景 8 后续 NOT_RUN 的边界仍存在,不能声称一次诊断必定覆盖服务端全部分母。阶段 B 随后只处理原合同详情及续约/归档验收,产品权限缺口仍停下报告。
- 最新用户明确批准本节实施和落地后一次完整诊断;主会话针对性验证不冒充独立复核,交审中须单列待独立复核状态。R1 仍等新的真实清单、普通 full-local 全绿实测耗时及单独批准。
10.7 Wrong / Correct
Wrong:caller 声明 online=true → 未核验的包装启动浏览器 → 无 bootstrap 证据也汇总 207 为待修清单。
Correct:当前候选策略定义环境 → 受管 runner 创建并实测 → 真实 bootstrap 在线才启动业务集合 → 环境、覆盖与来源由验证器共同判定 → 错误环境回执留存但撤销决策资格。
迁移状态谓词修复增量
按 implement.md 的追加阶段,用 status_matches 集中四处状态判断;grep 直接读取 here-string,不使用 printf 生产者或提前退出模式。退出 0/1 分别代表匹配/不匹配,其余退出码立即停止。保留日志、SQL 查询、候选 allowlist、迁移和回滚判定顺序。
回归直接提取现有源码状态解析与未知迁移拒绝分支;注入真实观察到的 producer=141,并恢复旧谓词做负向变异。长输出与四处 matcher 工具错误单列;原多子进程远端 fixture 使用有界 15 秒测试预算,非生产超时修改。产品差异单独保存在 preflight-fix 工作树;与 seed 的组合验证只用一次性本地测试副本,不能称为已集成或新发布候选。
2026-09-18 G20 第四轮终态与续修
g20-full-r4 FAIL,5768.636秒;static239.024秒PASS,内部11阶段PASS;后端4367通过/1原条件跳过,8组启用服务回归通过/7组原关闭不计通过;浏览器351项=342通过/5失败/3超时/1串行后继未执行,零重试。环境、source/repository未变和owner清理PASS。资产及账号创建两处P2028由09-18-local-concurrency-product-fixes接最小修复;当前不是全量通过。
QA续修保持原分母、预算、并发和断言:DG7确认停在登录输入框,改为自动等待既定账号入口;R92导航后回登录,user-onboarding提交改密后失去会话,核路由mock与SW/refresh会话边界;PA6确认第7次角色登录耗尽180秒,同角色PC/移动复用一次独立会话,保留全部角色/入口/管理菜单/API403;全页面180秒只到9/33页,利用真实应用导航减少重复装载,保留25PC+8移动/14系统页、目标文档HTTP、实际URL/标题及全部视觉/错误断言。报销付款整链300秒超时但无精确动作栈,先增加安全阶段诊断和查实际停点,不先猜产品根因或放宽预算。R75后继跳过随原整文件重验,不能当通过。
顺序:产品边界红/绿与相关回归→各在用QA夹具/冗余前置修复→原完整文件定向验证→冻结输入、从static开始新完整候选。定向通过不拼接旧完整结果,主会话检查不抵扣独立PENDING。原失败、322项旧差异及29目录9762旧文件保护不变。
2026-09-18 两项阻塞接续:阶段诊断
诊断原33路由180秒用例已走完PC,进入移动报销列表时耗尽预算;阶段合计导航34.355秒、到达29.535秒、安静窗口26.177秒、固定额外等待8.327秒、截图45.074秒。原expect.poll默认间隔使已满足500ms安静窗口的普通页约858—894ms后才继续,其后还固定再等300ms。最小QA调整:安静条件仍是全部本次HTTP请求settled且连续500ms,poll间隔改50/100ms精确采样;删除该条件之后重复的300ms固定等待,截图仍用原Playwright字体/布局就绪与完整截图,不改动画、画面、HTTP/权限/视觉断言或33页/180秒/并发。保留阶段日志检查实际耗时,正式运行无诊断预载。该优化本身不宣称全部负载都能在预算内完成。
用户同意按报销提交→全页面→新完整验收推进。本轮在原全页面auditPage增加安全阶段耗时:导航(含目标文档)、到达、请求安静窗口、原等待、截图、DOM指标,另在navigateForAudit细分链接查找/管理页转场/文档请求/点击。仅记录已脱敏路由、阶段和耗时,不改变任何页面、断言、预算或并发。与P9的原R75整文件在同一受管合成环境诊断一次;产品源码保持原输入。诊断预载仅归本轮ignored artifacts,独占owner/namespace/无外联核验后才启用,之后正式验证不带预载。
已批准:全页面巡检按角色与终端分组(2026-09-18 实施)
p9-fixed-r3的三个完整文件11项10通过/1视觉超时,607.746秒;环境/输入/owner清理PASS、零重试、服务端1347响应/0未处理异常。R75四项和付款主链281.132秒均通过;视觉180秒仅完成15页,其导航38.002秒、到达34.353秒、安静窗口16.069秒、截图45.634秒。前轮较少并行工作下走完PC进入移动仍超时,说明已移除的重复等待不足以解决这个把33页面串在单一用例中的累计预算问题;不能把它归为某个产品链接错误。
建议将现有矩阵按既有角色与终端拆为7组(PC匿名/员工/财务/经理/管理员,移动员工/经理),每组仍180秒及原expect预算/零重试,浏览器配置workers不变。共用本文件的合成动态路由准备并单列耗时;每组独立真实会话、不共享refresh令牌,保持原逐页HTTP/准确到达/无403或404/请求安静500ms/截图/DOM视觉与文案检查。没有删页面、降低图像质量、禁用动画或修改产品样式。
全套报告必须校验计划25PC+8移动与实际33条唯一路由/终端/角色完全对应,重复、缺失、未到达、失败或跳过任一组都不能放行;保留现有5条到达正反例。普通门禁重新发现这组用例身份,仍将所有分组作为同一固定候选、同一完整运行的必跑项,不合并历史定向结果。另加本地覆盖漏项/重复/失败反例,防止拆组后局部绿。
用户已明确批准本节分层预算:全部33页按7组、每组180秒,同一完整运行全部必过。该批准覆盖旧累计180秒约束,不改变其他测试预算、workers、零重试或页面断言。
实现约束:7个原生测试放在同一serial组,仅本文件保持原逐页顺序,不改变全局并发;beforeAll一次准备动态路由并独立记录耗时。每组页数分别1/7/1/1/15/7/1,启动时对照矩阵校验;每页完成截图与全部DOM检查后才登记完成。afterEach记录真实测试终态,afterAll校验计划/完成精确集合及全部组passed;失败的后继组保留pending,不由后续到达反例写回PASS。新增纯覆盖正反例随原5条到达测试一起运行。整体门禁重新发现真实身份/分母,不合并历史轮次。