docs(report): 新增 PROJECT_REPORT.md 与 CI/CD 流水线记录

PROJECT_REPORT.md:论文式项目报告(摘要 / 目录 / 7 章 / 参考文献 / 致谢 / 附录 A),
4 张 Mermaid 图同样经真实浏览器渲染验证。所有数字都与证据文件逐个核对过。

.scratch/ci-cd/:本次流水线的全部证据与可重跑脚本
  * 阶段报告:依赖安全扫描 / 许可证合规 / 阶段 0 静态分析 / 阶段 3 测试与性能
  * 证据:分析器原始输出(修复前 84 条、修复后 80 条)、Pester 详细输出、
    性能基线 JSON、黑盒用例结果(阶段 1 的 11 例与阶段 2 回归的 12 例)
  * 可重跑:blackbox-tests.ps1 / blackbox-regression.ps1 / perf-baseline.ps1

两条边界必须写在明处,不能含糊:

  * **VM 内验证只取到修复前的快照**(Pester 183 项全绿)。随后会话审批策略改为 never,
    gsudo 提权被自动拒绝(退出码 999),而 Hyper-V 与 PowerShell Direct 都需要管理员,
    于是修复后的三套件在 VM 内**没有跑成**。报告里明确标注了范围,没有把"宿主跑绿了"
    说成"VM 也跑绿了"。
  * **性能基线是首次建立**,无历史可比,故无退化可判;指标只在同机同宿主下对比,
    跨机比数字没有意义。

另外记一笔:静态分析的口径是"仓库自己的门禁"。剩余 80 条全是风格类(0 Error),且逐条
有依据 —— 行长 160 是配置里写明的有意偏离,PSPlaceCloseBrace 等集中在测试夹具字符串内
(改了会改变断言语义)。严格模式的"零容忍"在这里与仓库自身约定相抵,选择尊重仓库约定
并在报告里登记,而不是制造一个横跨 12 个文件的纯排版大 diff。
This commit is contained in:
Shuery committed 2026-10-02 01:17:40 +08:00
1 parent f4729baca7
commit 45bbd66815
18 files changed
+2974

No files matched your search

+104
View File
@@ -0,0 +1,104 @@
{
"testedAt": "2026-09-28T12:43:39",
"total": 12,
"passed": 12,
"failed": 0,
"cases": [
{
"Id": "BB-01",
"Title": "真实备份:退出码 0 + 产出归档 + manifest",
"Expected": "退出码 0;≥1 个 .7z;manifest.json 存在",
"Actual": "退出码=0;归档=1",
"Status": "PASS",
"Note": ""
},
{
"Id": "BB-02",
"Title": "排除模式真的把内容挡在归档之外",
"Expected": "归档内无 skipme.log,有 a.txt/b.txt",
"Actual": "skipme=False;keep=True",
"Status": "PASS",
"Note": ""
},
{
"Id": "BB-03",
"Title": "-DryRun 一个字节都不写",
"Expected": "退出码 0;manifest SHA256 前后一致",
"Actual": "退出码=0;哈希一致=True",
"Status": "PASS",
"Note": ""
},
{
"Id": "BB-04",
"Title": "源不存在记 missing-source,不算失败",
"Expected": "含 missing-source;退出码 0",
"Actual": "actions=backed-up,missing-source;退出码=0",
"Status": "PASS",
"Note": ""
},
{
"Id": "BB-05",
"Title": "-Only 只处理匹配的条目",
"Expected": "退出码 0;输出不提未选中的 nonexistent",
"Actual": "退出码=0;提到 nonexistent=False",
"Status": "PASS",
"Note": ""
},
{
"Id": "BB-06",
"Title": "★显式指定的清单不存在 -> 必须报失败(本次修复点)",
"Expected": "退出码 ≠ 0;不创建模板;输出含\"指定的清单不存在\"",
"Actual": "退出码=1;误建模板=False;提示=True",
"Status": "PASS",
"Note": "阶段 1 原为 FAIL(退出码 0 且建了模板),本次修复后应转为 PASS"
},
{
"Id": "BB-06b",
"Title": "对照:未显式指定时首次运行仍建模板并退出 0",
"Expected": "退出码 0;模板被创建;随后仓库原文件已还原",
"Actual": "退出码=0;模板创建=True;仓库还原=True",
"Status": "PASS",
"Note": ""
},
{
"Id": "BB-07",
"Title": "旧名字垫片转发且退出码原样传递",
"Expected": "退出码 0;有改名提示",
"Actual": "退出码=0;提示=True",
"Status": "PASS",
"Note": ""
},
{
"Id": "BB-08",
"Title": "5.1 与 7.x 行为一致",
"Expected": "两个宿主退出码都是 0",
"Actual": "7=0;5.1=0",
"Status": "PASS",
"Note": ""
},
{
"Id": "BB-09",
"Title": "含 & 与 # 的路径(整行引号)",
"Expected": "退出码 0 且产出归档",
"Actual": "退出码=0;归档=1",
"Status": "PASS",
"Note": ""
},
{
"Id": "BB-10",
"Title": "无控制台且无 -InputScript 时报错退出,绝不挂起",
"Expected": "60 秒内退出且退出码 2",
"Actual": "已退出=True;退出码=2",
"Status": "PASS",
"Note": ""
},
{
"Id": "BB-11",
"Title": "★孤儿归档审计(改用真实运行)",
"Expected": "输出点名 GhostSoftware.7z",
"Actual": "退出码=0;点名=True",
"Status": "PASS",
"Note": "阶段 1 的 FAIL 系夹具错误:孤儿审计只在真实运行里报告,干跑不报"
}
]
}