面向游戏研发流水线的证据驱动发布门禁与质量治理平台。Phoenix 将 JUnit、SARIF、 行覆盖率、性能基线、测试历史和代码变更统一成一个可解释的 PASS/BLOCK 结论,并为 每条规则保留 actual / threshold / message 轨迹。发布结论绑定全部输入哈希,可追加到 SHA-256 链式审计账本。
- 多源证据摄取:JUnit XML 精确到 testcase,SARIF 2.1.0 按 rule + fingerprint 去重并排除 accepted suppression;覆盖率复核百分比与行数,性能比较要求 current / baseline 指标集、单位和方向一致。
- 变更风险评分:按路径映射组件,用 diff churn、组件权重和 criticality 输出 0–100 分及逐文件解释;高风险变更可强制质量负责人审批。
- 风险选测:必跑用例 + 加权 set-cover,在覆盖所有受影响组件的约束下优先选择 高收益短用例,并估算相对全量回归节省时间;门禁反查 JUnit,确保“已选择”真的执行。
- flaky detection:结合失败率平衡度、相邻运行状态翻转率、最小样本数和 Wilson 95% 区间,区分稳定失败与非确定性失败。
- 可审计决策:证据文件与 policy 全量 SHA-256,并在解析前后复核;相同输入产生 相同 decision ID;JSONL hash chain 对缺失/空/畸形账本失败关闭,拒绝续写已损坏链。
纯 Python 标准库实现,无运行时第三方依赖;需要 Python 3.11+。
仓库自带一套可通过的 RC 证据:
python -m phoenix_guard demo --output-dir build
python -m phoenix_guard verify-ledger build/audit.jsonl对自己的流水线运行:
python -m phoenix_guard evaluate \
--manifest path/to/release.json \
--policy path/to/policy.json \
--output build/decision.json \
--ledger build/audit.jsonl其他独立能力:
python -m phoenix_guard select-tests \
--manifest examples/release.json --policy examples/policy.json
python -m phoenix_guard flaky --history examples/fixtures/history.json
python -m phoenix_guard benchmark --iterations 1000Windows PowerShell 可将续行命令写成单行。也可执行 python -m pip install -e .
安装 phoenix-guard 命令。
examples/release.json 声明 release、changed files、审批与六类证据路径;相对路径以
manifest 所在目录为基准。examples/policy.json 声明质量阈值、组件 glob、权重、
required tests 与测试目录。示例本身既是可执行 demo,也是格式契约。
发布门禁当前覆盖:
- JUnit 失败/错误数;
- SARIF error 与 warning 数;
- 行覆盖率;
- 最坏方向修正后的性能回退;
- 风险选测是否完整执行;
- 当前失败是否命中 flaky 分类;
- 高风险变更是否具备指定审批。
CLI 对 BLOCK 返回退出码 2,便于直接接入 CI。
python -m unittest discover -s tests -v测试覆盖多格式解析、覆盖率计数一致性、性能指标缺失/方向、风险评分、加权选测、
flaky 分类、严格策略阻断、decision ID 确定性及账本篡改检测。完整设计与信任边界见
docs/architecture.md。
环境:Python 3.12.3,Intel Core i7-4600U。
| 验证项 | 实际结果 |
|---|---|
unittest |
18/18 passed,0.404 s |
| demo 证据门禁 | 8/8 gates PASS,risk 53.10 |
| 风险选测 | 2/6 tests,覆盖 2/2 changed components |
| 预计回归耗时 | 9,680 ms → 1,200 ms,节省 87.60% |
| flaky 分析 | 3 tests / 8 runs,识别 1 个 flaky(score 0.7875) |
| 性能基线 | 最坏回退 5.36%,低于 8% policy |
| 审计账本 | 1 record,hash chain 验证通过 |
benchmark --iterations 1000 |
8.183 s,122.21 evaluations/s |
选测节省率来自示例 catalog 的声明时长;基准用于本地 policy-engine 回归,不代表包含 外部 CI 下载与执行测试的端到端耗时。
phoenix_guard/
ingest.py JUnit / SARIF / coverage / performance 解析
risk.py 变更风险与测试选择
flaky.py 历史稳定性统计
policy.py 证据编排、规则与决定指纹
ledger.py append-only SHA-256 hash chain
cli.py evaluate / select-tests / flaky / audit / demo / benchmark
examples/ 完整 RC manifest、policy 与证据 fixtures
tests/ 标准库 unittest
docs/ 架构、算法与信任边界
- JSONL 链用于发现误改、断链和中间记录篡改;没有外部可信 head 时,无法单独证明尾部 未被截断,也不能阻止拥有写权限的人重算整条链。生产环境应把 head 锚定到远端存储或 签名服务,并采用单写者。
- 示例中的
approvals是 manifest 声明,不是认证签名。接入真实流水线时应由 CI 身份 或审批系统生成,不能接受提交者任意填写。 - 风险选测的耗时节省来自 catalog 估算;门禁只验证选中测试出现在 JUnit 中,不代表 已测量真实墙钟时间。
MIT