feat(acceptance): 添加失败关闭的第三阶段验收运行器

This commit is contained in:
2026-09-09 08:53:53 +08:00
parent b0783c9356
commit 31ddb8d49c
8 changed files with 691 additions and 1 deletions
@@ -182,7 +182,7 @@ cargo test --manifest-path frontend/src-tauri/Cargo.toml --lib --locked
cargo clippy --manifest-path frontend/src-tauri/Cargo.toml --lib --locked -- -D warnings
```
以下验收runner和配置是**P0/R0待交付接口,现在不存在,不能报告已运行**:仓库根执行`python scripts/phase3-production-acceptance.py --suite <suite> --config <isolated-config> --report-dir <output>`suite取`sidecar/credentials/sandbox/extensions/sync-client/sync-service/e2e/all`,支持`--case <ID>`单例复跑。配置由环境模板产生,含临时数据根、服务URL、安装包路径、平台profile、seed及秘密的环境引用,不能含生产凭据。runner必须拒绝仓库个人Vault未标记隔离环境,缺依赖/安装包/权限时非零退出;必测项skip也非零,不能只打印成功。
验收入口已经建立:仓库根执行`python scripts/phase3-production-acceptance.py --suite <suite> --config <isolated-config> --report-dir <output>`suite取`sidecar/credentials/sandbox/extensions/sync-client/sync-service/e2e/all`,支持`--case <ID>`单例复跑。配置由[隔离模板](../../scripts/phase3-acceptance-config.example.json)产生,含临时数据根、服务URL、安装包路径、平台profile、seed及秘密的环境引用,不能含生产凭据。runner拒绝仓库个人Vault未标记隔离环境和非空报告目录;缺case driver、依赖/安装包/权限必测项skip均以非零退出,不能只打印成功。当前各验收 ID 的完整生产 driver 仍须逐项接入,未登记项明确报告 `NOT_IMPLEMENTED`,不因 runner 接口存在而视为已验收;使用和结果契约见[生产验收 Runner](../development/OpenNexus生产验收Runner.md)。
runner输出JUnit、逐ID JSON、耗时/峰值内存、进程树/拒绝访问计数、文件摘要与revision清单及脱敏日志。退出0仅表示该suite所有适用ID通过;`all`要求显式平台profile并检查缺失项。下表同一行内所有断言均必测,每类输入保留独立子用例;测试代码硬编码预期协议向量或独立oracle,不能用被测函数自证。P0需生成ID清单并校验报告完整性。
@@ -772,3 +772,12 @@ Core 的独立数据目录目前不等于已授权 Vault。Python 旧笔记写
- 实际 Python Core + Rust Host 集成覆盖创建、20 次相同重放、改变输入冲突、列表、跨 Vault 拒绝、CAS 更新、过期摘要拒绝、Agent 选择运行、删除及关闭前 journal 计数。实际 Uvicorn Sync + 两个 Rust Workspace 客户端对用户 Skill 进行了 60 轮同时修改,保留本地/采用远端/创建文本副本各 20 轮,并验证旧摘要拒绝、重复解决、两端收敛、重开稳定;第三个默认范围客户端可接收用户 Skill,同时仍排除未选择的人设与布局。
- 最终 desktop Rust 全目标 148 通过、12 ignoredlibrary 131、Host 10、其余集成 7),Clippy `--all-targets -D warnings` 通过,日志 `.build/user-skill-rust-full-final.log``.build/user-skill-clippy-current.log`。后端 908 项通过、1 项依赖弃用警告,日志 `.build/user-skill-python-full-current.log`。前端 103 个测试文件、536 项通过,类型检查和生产构建通过,日志 `.build/user-skill-frontend-full-final2.log``.build/user-skill-frontend-build-final2.log`
- 证据来自本机隔离服务和客户端进程,尚未替代两台独立硬件上的桌面 UI、跨发布版本或每个持久化边界强制终止验收。Provider 非秘密参数、安装清单、对话等规划内逻辑数据仍未适配;完整生产化目标保持未完成。
## 增量:生产验收 Runner 的失败闭合入口
- 新增规划约定的 `scripts/phase3-production-acceptance.py`,固定登记 sidecar/credentials/sandbox/extensions/sync-client/sync-service/e2e 七个 suite 和 30 个验收 ID,支持 `--case` 单例与机器可读清单。CI 的 backend job 会验证清单入口,新单元测试覆盖清单唯一性和 suite 归属。
- 配置必须显式确认隔离和破坏性测试,提供唯一 run、平台 profile、固定 seed 及绝对临时数据根;首次只接受空目录并写入绑定标记。runner 拒绝个人 Vault、仓库或 Git 路径、符号链接、非空未标记目录、明文秘密字段、带认证信息/query/fragment 的服务 URL,以及未显式声明的测试 HTTP。秘密只按环境变量名引用,缺值直接失败。
- 每个 case 只调用仓库固定登记的 driver,配置不能注入命令。driver 的 JSON 必须含独立断言、文件/revision 清单和该 ID 要求的指标;非零退出、超时、坏 schema、缺指标、缺安装产物/权限/秘密引用、必测 skip 或结果秘密命中均失败。输出含逐 ID JSON、JUnit、固定 ID 清单、脱敏限长日志、commit、锁文件/安装产物/config 摘要;已有非空报告目录不覆盖。
- 5 项 runner 测试通过,覆盖个人 Vault/明文秘密/非空目录拒绝,未登记 ID 生成 JUnit failure 且退出 1driver 缺断言/指标失败,以及测试秘密在日志中被替换。实际 CLI 清单检查通过;使用模板运行 A-01 得到预期 `NOT_IMPLEMENTED`、summary `NOT_PASSED` 和退出 1,证明缺实现不会误报成功。包含该测试的后端全套 913 项通过、1 项依赖弃用警告,日志 `.build/acceptance-runner-python.log`Python 编译与 Markdown 链接检查通过。
- 当前仅完成 P0 runner 与报告协议,30 项完整生产 driver 尚未登记;因此没有任何 A/B/C/D/S/E ID 因本增量变为通过。后续逐项接入时仍须满足规划表的全部断言、实机/生产依赖和量化指标,完整生产化目标保持未完成。
@@ -0,0 +1,27 @@
# OpenNexus 生产验收 Runner
`scripts/phase3-production-acceptance.py` 是第三阶段 A/B/C/D/S/E 验收 ID 的统一入口。它只把仓库登记的逐 ID driver 结果计为生产验收;普通单元测试、隔离冒烟和历史人工汇总不会自动换算成通过。
查看固定的 30 项清单:
```powershell
python scripts/phase3-production-acceptance.py --list-cases --json
```
复制 `scripts/phase3-acceptance-config.example.json` 到仓库外,设置唯一 `run_id` 和平台 profile。`data_root` 可直接使用绝对路径,也可像模板一样通过环境变量引用。第一次运行只接受不存在或空目录并写入与 `run_id` 绑定的隔离标记;后续只能由同一 run 复用。个人 Vault、仓库或 `.git` 的父目录/子目录、符号链接、含明文密码/令牌的配置均会被拒绝。HTTP 服务只允许在配置中明确标记为测试服务,URL 不得包含用户信息、query 或 fragment。
执行单例时应使用新的空报告目录:
```powershell
$env:OPENNEXUS_ACCEPTANCE_DATA_ROOT = 'D:\opennexus-acceptance\run-001'
python scripts/phase3-production-acceptance.py `
--suite sync-service --case S-04 `
--config D:\opennexus-acceptance\run-001.json `
--report-dir D:\opennexus-acceptance\reports\run-001-s04
```
每个 driver 由仓库内 `CASE_DRIVERS` 固定登记,接收 `--config``--output`,并通过环境获得 case ID、数据根和报告根。结果必须是 schema 1 JSON,包含匹配的 `case_id``PASSED/FAILED/SKIPPED/NOT_APPLICABLE` 状态、至少一项独立断言、该 ID 要求的非负整数指标,以及 `files``revisions` 清单。只有 driver 退出 0、结果为 `PASSED`、所有必填指标齐全且结果不含配置引用的秘密值时,该 ID 才通过。缺 driver、必测 skip、非零退出、超时、缺安装包/权限/秘密环境引用、坏 schema 或秘密命中都会让 suite 非零退出。
报告目录包含 `summary.json``case-manifest.json``junit.xml``cases/<ID>.json` 和脱敏的 `logs/<ID>.log`。摘要记录 commit、各锁文件 SHA-256、配置摘要与已提供安装产物摘要。日志将仓库、数据根、报告根、用户主目录和配置声明的秘密值替换为占位符,并限制为 10 MiB。报告目录必须为空,避免单例复跑覆盖原始证据。
当前 runner 与失败闭合行为已实现,各生产验收 ID 的完整 driver 尚未登记。因此现在运行任一 ID 会生成 `NOT_IMPLEMENTED` 证据并退出 1;这用于阻止误报,不是验收通过。