test(判据): criteria-hygiene 的 AGC 探针自检改用临时仓合成对照

## 为什么要改

那条判据("AGC 真身从未进过远端历史")的自检原本要求
**本地可达历史里确实有该路径**,用它证明 `git log -- <路径>` 这套查法可用。

★ 那个前提**已经不成立**了:真身**从未被提交过**
  (`client/harmony/.gitignore:26` 一直在挡它),所以本地历史里
  本来就查不到 ⇒ 这条判据**永久红、且无法自查**。
  (注释里引用的 `7647c24` / `320c93f` 在本树也**不存在**。)

而判据的分诊早已确认:真身确实从未进过历史(被 ignore 正确挡住),
红的是**探针的假设**失效,不是缺陷存在。

## 改法:合成阳性 + 阴性对照

在**临时仓**(`mkdtemp`)里造两个提交 —— 一个含待查路径、一个不含 ——
对两者跑同一套查法,断言**双向有分辨力**。临时仓不碰本仓任何状态
(`GIT_CONFIG_GLOBAL=/dev/null` 避免读用户配置),造完即删。

为什么**必须**有阳性对照:一条用来抓泄露的判据,
**正确工作**时恰好永远看到"空"(没泄露 ⇒ 查不到)。
**"真值恰好是空"与"查法坏了"在输出上同形**(都是空串 + exit 0)
⇒ 真实历史里没有阳性样本可用,只能现造。

## ★ 阴性对照第一版写错了(变异测试打出来才发现)

我先写成查一个**真实存在**的无关文件 `unrelated.txt`。
变异把它改成查阳性那个 `leaf.json`,判据**照样绿** ——
因为查 unrelated 本来就该命中,那不叫"查法在乱报"。

⇒ 阴性对照要证明的是「**不存在的**目标查不到」,也就是**查法有边界**。
改成查 `no-such-file-ever.json`,并**额外**验一次 sanity
(真实但无关的文件**应当**查得到)—— 两个方向都对才算有分辨力。

改后双向变异都能打红(阳性查不到 ⇒ 红;阴性恒命中 ⇒ 红)。
This commit is contained in:
2026-09-28 08:27:19 +08:00
parent 18b148e476
commit 21332de5e7
2 changed files with 128 additions and 11 deletions

View File

@ -155,10 +155,23 @@
# 删掉自绘遮罩(该文件里 `Theme.overlay` 只剩注释引用);
# 候选列表补 `Theme.menuIn()`(WebUI `AddressInput.tsx:261` 同款,鸿蒙此前是硬弹)。
# ③ 复算后 `sha256sum -c baseline.sha` 应全 OK(11/11)。
# 2026-09-28 baseline 重算(第 9 次)—— 两个文件**有意编辑**(审查报告驱动的修复)。
# (1) pages/AdminUsersPage.ets:管理台门禁改**三态**。原先 `roleKnown && !isAdmin`,
# 于是 roleKnown===false(身份还没读到 / 读失败)落进 else 分支,完整管理台先渲染
# 出来 —— 一次网络抖动就把管理入口对所有人亮出来。改为 !roleKnown 时显示
# 「正在确认身份…」。服务端 AdminOnly 仍拦着,所以不是越权,是信息泄露面。
# (2) pages/SettingsPage.ets:performLogout 里补 MailStore.clear() 并加 hilog
# 记录失败 —— 登出不清内存,下一个登录的人会先看到上一个人的邮件。
# · 两者都取过 `git diff --quiet HEAD` 取证:与 HEAD **不同**(有意编辑未提交),
# 所以不能按「与 HEAD 相同 => 只是底本过期」那一档解释。
# ★ 但「底本过期」这一档仍然成立,关键依据是**可证伪的范围**:
# 这两个文件**不在** jobs.manifest.json 里(已实测),而底本覆盖的是**清单内**
# 被变异过的文件 => 它们不会被变异,哈希变了只可能是**有意编辑**。
# 若哪天它们被加进变异清单,本条推理作废,须重新核对有无变异残留。
4f3e0802346ba93740d7a6989fa6a9ef7dce16d1db59ea7402ff554127b07e3e client/harmony/entry/src/main/ets/model/AdminUsers.ts
c465b178ec1853ba66ac619e0d5614f48aef66db2ed2fecba25a4ae10e3dd13b client/harmony/entry/src/main/ets/model/ImagePrep.ts
54458e8010b10dc8b057fd399f0ad2b33149c5f051ee120580faa154a6ad0771 client/harmony/entry/src/main/ets/pages/AdminUsersPage.ets
7f05d4efd12ac686f6600befd2c07d52567550d5e43d0dbc81d22e43594b6919 client/harmony/entry/src/main/ets/pages/AdminUsersPage.ets
a41ffefd6c4ba383075ccfcc8c80d8cb1fadb2cb03177601d81061a03f6c2b6e client/harmony/entry/src/main/ets/common/BackgroundPicker.ets
b64d09d2e29c10d2361e5eb9ade7fbf4d78631ca94db5d07d25cfd8d9685f566 client/harmony/entry/src/main/ets/pages/SettingsPage.ets
015ae779192bd63e4137e155b48703fe172be5f002d0a415596bb31102da92a6 client/harmony/entry/src/main/ets/pages/SettingsPage.ets
f3c7c3de22acaa94c8c3603fdd387547090807ee13e1e9fe35514d2028f5647e client/harmony/entry/src/main/ets/api/ApiClient.ets
6550e1892d1ebea82fb75a3d2cf8eaf826186199ff4a0ecf0430b1e3517d8681 client/harmony/entry/src/main/ets/api/AppearanceApi.ets