CI / fmt (rustfmt --check) (push) Waiting to run
CI / clippy (ubuntu-latest) (push) Waiting to run
CI / clippy (windows-latest) (push) Waiting to run
CI / test (ubuntu-latest) (push) Waiting to run
CI / test (windows-latest) (push) Waiting to run
CI / build release (ubuntu-latest) (push) Waiting to run
CI / build release (windows-latest) (push) Waiting to run
CI / runtime smoke (ubuntu x64, xvfb) (push) Waiting to run
CI / runtime smoke (macos arm64, probe) (push) Skipped
CI / update-e2e (windows x64) (push) Waiting to run
GPU evidence / GPU 判据自测(不需 GPU;跳过 ≠ 已验证) (push) Waiting to run
GPU evidence / GPU 证据 — 探测可用产物与硬件适配器 (push) Waiting to run
Guards / core 零 UI 守门 (push) Waiting to run
Guards / presenter 零 UI 守门 (push) Waiting to run
Guards / design 零第三方依赖守门 (push) Waiting to run
Guards / unsafe 落点守门(集合必须恰好等于期望) (push) Waiting to run
Guards / 文件行数 ≤400 守门 (push) Waiting to run
Guards / 依赖许可与来源(cargo-deny) (push) Waiting to run
Release guard / 发布标记语义守门(push tag → 稳定版) (push) Waiting to run
Signing status(播报,不是门禁) / 判据自测(三行/退出码/变异重放/接线) (push) Waiting to run
Signing status(播报,不是门禁) / 签名就绪度(播报) (push) Waiting to run
Release / 选槽位(默认四个:Windows 两档 + Linux 两档) (push) Waiting to run
本批内容见 CHANGELOG.md 的 0.2.4 段。按 D41 用孤儿快照推 main,保留「公开史只有里程碑」的模型。
121 lines
5.2 KiB
JSON
121 lines
5.2 KiB
JSON
{
|
||
"note": "M249 check_gpu_shot.py --self-test 的向量。log = synth_log 的关键字覆盖(缺省键取函数默认值;null = 该行不出现;no_size_line = 只省掉 [shot] WxH 那一行;multiline_selected / empty_selected = `Selected: AdapterInfo {` 的字段换了形状;extra_shot_renderer = 再追加一行异种 renderer 的 [shot] 行);png = content/flat/truncated/null(null = 不写文件);mode = evidence/refuse;expect_fail = **期望的失败判据清单(逐条对,多一条少一条都算自测失败)**——判据被关掉或被别的东西掩盖,都在这里现形。PNG 由 check_screenshot.encode_png 现造,不进仓库。",
|
||
"size": [200, 120],
|
||
"cases": [
|
||
{
|
||
"label": "基线:wgpu + DiscreteGpu + 有内容 PNG",
|
||
"png": "content",
|
||
"expect_fail": []
|
||
},
|
||
{
|
||
"label": "基线:IntegratedGpu 也算硬件(与 probe.rs 同口径)",
|
||
"log": { "device_type": "IntegratedGpu" },
|
||
"png": "content",
|
||
"expect_fail": []
|
||
},
|
||
{
|
||
"label": "变异靶子:renderer=wgpu 但 Selected 是 Cpu(WARP)",
|
||
"log": { "device_type": "Cpu" },
|
||
"png": "content",
|
||
"expect_fail": ["Selected: AdapterInfo 的 device_type 不是 Cpu/Other"]
|
||
},
|
||
{
|
||
"label": "变异靶子:Selected 是 Other(Gl 兼容层)",
|
||
"log": { "device_type": "Other" },
|
||
"png": "content",
|
||
"expect_fail": ["Selected: AdapterInfo 的 device_type 不是 Cpu/Other"]
|
||
},
|
||
{
|
||
"label": "变异靶子:Selected 换成多行 Debug(字段不在 { 那一行)",
|
||
"log": { "multiline_selected": true },
|
||
"png": "content",
|
||
"expect_fail": ["Selected: AdapterInfo 的 device_type 不是 Cpu/Other"]
|
||
},
|
||
{
|
||
"label": "变异靶子:`Selected: AdapterInfo {` 空体(字段全丢)",
|
||
"log": { "device_type": null, "empty_selected": true },
|
||
"png": "content",
|
||
"expect_fail": ["Selected: AdapterInfo 的 device_type 不是 Cpu/Other"]
|
||
},
|
||
{
|
||
"label": "变异靶子:删掉 [shot] renderer 行(只剩 Selected + backend)",
|
||
"log": { "renderer": null },
|
||
"png": "content",
|
||
"expect_fail": ["截图行 renderer=wgpu"]
|
||
},
|
||
{
|
||
"label": "变异靶子:日志里混入第二种 renderer(CPU 那次 >> 拼进来)",
|
||
"log": { "extra_shot_renderer": "tiny-skia" },
|
||
"png": "content",
|
||
"expect_fail": ["截图行 renderer=wgpu"]
|
||
},
|
||
{
|
||
"label": "回归:CPU 档出的图(renderer=tiny-skia)",
|
||
"log": { "renderer": "tiny-skia", "device_type": null, "backend": "final=tiny-skia result=started" },
|
||
"png": "content",
|
||
"expect_fail": ["截图行 renderer=wgpu", "Selected: AdapterInfo 的 device_type 不是 Cpu/Other", "后端结论行 final=wgpu result=started"]
|
||
},
|
||
{
|
||
"label": "回归:没有 Selected 行(wgpu 没建成设备)",
|
||
"log": { "device_type": null },
|
||
"png": "content",
|
||
"expect_fail": ["Selected: AdapterInfo 的 device_type 不是 Cpu/Other"]
|
||
},
|
||
{
|
||
"label": "回归:后端结论行是失败",
|
||
"log": { "backend": "final=none result=failed via=refuse" },
|
||
"png": "content",
|
||
"expect_fail": ["后端结论行 final=wgpu result=started"]
|
||
},
|
||
{
|
||
"label": "回归:完全空白帧(全白 PNG)",
|
||
"png": "flat",
|
||
"expect_fail": ["PNG 不是空白帧"]
|
||
},
|
||
{
|
||
"label": "回归:PNG 尺寸与日志 [shot] 不符",
|
||
"png": "content",
|
||
"png_size": [640, 480],
|
||
"expect_fail": ["PNG 宽高 = 日志 [shot] 的宽高"]
|
||
},
|
||
{
|
||
"label": "回归:PNG 根本不存在",
|
||
"png": null,
|
||
"expect_fail": ["PNG 能解码且非空", "PNG 宽高 = 日志 [shot] 的宽高", "PNG 不是空白帧"]
|
||
},
|
||
{
|
||
"label": "回归:PNG 半截(签名对、字节不够)",
|
||
"png": "truncated",
|
||
"expect_fail": ["PNG 能解码且非空", "PNG 宽高 = 日志 [shot] 的宽高", "PNG 不是空白帧"]
|
||
},
|
||
{
|
||
"label": "负例基线:via=refuse + 无出图行 + 无 PNG",
|
||
"log": { "renderer": null, "device_type": null, "no_size_line": true, "backend": "final=none result=failed via=refuse" },
|
||
"png": null,
|
||
"mode": "refuse",
|
||
"expect_fail": []
|
||
},
|
||
{
|
||
"label": "负例回归:拒绝日志旁边却躺着一张 PNG",
|
||
"log": { "renderer": null, "device_type": null, "no_size_line": true, "backend": "final=none result=failed via=refuse" },
|
||
"png": "content",
|
||
"mode": "refuse",
|
||
"expect_fail": ["目标 PNG 不存在(拒绝出图就该一张都没有)"]
|
||
},
|
||
{
|
||
"label": "负例回归:CPU 档日志不是「拒绝」(via 缺)",
|
||
"log": { "renderer": "tiny-skia", "device_type": null, "backend": "final=tiny-skia result=started" },
|
||
"png": null,
|
||
"mode": "refuse",
|
||
"expect_fail": ["后端结论行 via=refuse", "没有出图行([shot] 尺寸 + renderer 都不该有)"]
|
||
},
|
||
{
|
||
"label": "负例回归:final=… via=refuse 却仍有出图行(自相矛盾)",
|
||
"log": { "backend": "final=none result=failed via=refuse" },
|
||
"png": "content",
|
||
"mode": "refuse",
|
||
"expect_fail": ["没有出图行([shot] 尺寸 + renderer 都不该有)", "目标 PNG 不存在(拒绝出图就该一张都没有)"]
|
||
}
|
||
]
|
||
}
|