Files
MailUI4Agents/client/electron/test/mutants/baseline.sha
JianFeeeee 1da4e15a7b 跨端: 补齐「我的」页深色可读性(4 页 219 段全 ≥3:1)+ 判据自己漏报的那一类
上一条把通信/日历/联系扫干净了,但**「我的」页没扫到**
(扫描脚本按文案点不到它 —— 那是侧栏**底部的头像按钮**,不是导航项)。
补上后立刻又抓出问题,并把判据自身的**漏报形状**一并修了。

## 一、「我的」页两处真 bug

1. **主题分段按钮 `SettingsPage.ets:834`**:
   `.fontColor(... ? Theme.surface : Theme.textPrimary)` —— `surface` 是
   **会翻转的面色**,压在 `Theme.accent` 蓝底上,深色下变成近黑。
   设备读数:`深色 2.93:1  ink rgb(32,34,36) bg rgb(34,96,228)`。
2. **权限档徽标 `MailDetailPage.ets:391`**:同一个错法(第 13 处)。
3. **账号名 `SettingsPage.ets:1179`**:三元里的裸 `Theme.accent`
   压在 `accentSoftFor()` 底上 ⇒ `jianf 2.83:1`。
   `AdminUsersPage.ets:386` 同形状(角色徽标)。

## 二、判据自己的漏报形状(比 bug 本身更值得记)

静态防线(`C|会翻转的 Resource 不得当前景色`)**在 bug 存在时是绿的**。
原因是它的提取正则:

    /\.fontColor\(Theme\.([A-Za-z0-9_]+)\)/      ← 要求令牌是**唯一实参**

于是**三元里的令牌全被漏掉**:

    .fontColor(this.appearanceTheme === t ? Theme.surface : Theme.textPrimary)

改成"在 `fontColor(` 之后的整段实参里找所有 `Theme.X`"之后,
它**立刻报出上面第 1、2 两处**(此前一直绿)。

★ **判据漏报的常见形状是它自己的正则太窄,而不是被测代码太隐蔽。**
  这条写成注释留在判据里了。

## 三、我自己犯的批量替换错误(已加判据钉住)

把裸 `Theme.accent` 换成 `accentFor()` 时,**误把 6 处 `backgroundColor` 也换了**。
`accentFor()` 深色给浅蓝 `#80AFF9`,而搭档前景是白色 `accentFg`
⇒ 白字压浅蓝 ≈ **1.4:1**,主按钮文字会彻底看不见。

- 6 处已逐处还原(复核:`grep -c "backgroundColor(Theme.accentFor())"` = 0)。
- 新增判据 **`C2`**:`accentFor / dangerFor / approveFor / warnFgFor / textSubtleFor`
  **只能用于前景**,`backgroundColor(Theme.XFor(...))` 直接判红。
  (`accentSoftFor` 是例外 —— 它本来就是"面"。)
  ★ 修法不是"下次小心点":批量替换一定会再犯,**一行判据把它变成不可能**。

## 四、设备复扫(修后)

```
[通信]      扫 42 段,低对比 0
[日历]      扫 85 段,低对比 0
[联系人]    扫 51 段,低对比 0
[我的]      扫 41 段,低对比 0      ← 新增
```
**219 段文字全部 ≥3:1**(本轮全部针对深色)。

## 五、底本

`baseline.sha` 第 5 次重算。重算前**专门复核**了"那 6 处误改有没有残留"
(不只看 `git diff` 非空就放行):`backgroundColor(accentFor)` 计数为 0、
`git diff HEAD~1` 里 backgroundColor 只有 calendar 那一处(有意改动)。

`run-all.mjs` → `checks=515 pass=515 fail=0 skip=0 red=0 broken=0 unreported=0`。

**未验**:浅色主题下的对比度没扫(本轮全部针对深色)。
2026-09-19 20:43:59 +08:00

83 lines
7.3 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 变异体基线的**自证底本**:每个被变异过的文件在此记下"未变异"时的 sha256。
# 跑完变异后 `sha256sum -c baseline.sha` 必须全 OK(summary.py 把结果打进 RESULT 行)。
#
# 取基线是**有意的动作**,不是随手重算 —— 重算会把"某次变异没还原"永久掩盖掉。
# 每次重算都要在此记一行"为什么":
# 2026-09-15 11:22 dsh:`AdminUsersPage.ets` 的哈希变了,**不是变异残留**。
# 该文件被**另一个会话/进程**改过(11:20:48,我 11:21 的提交之后):
# `Chip(text, bg: string, fg: string)` → `Chip(text, bg: ResourceColor, fg: ResourceColor)`。
# 核实过是**正确的 ArkTS 修法**(`Theme.surfaceMuted`/`textSubtle` 是 `Resource`,
# `Theme.chipNeutralBg` 是 `string` ⇒ 旧签名编译不过)。我没有提交也没有回退它。
#
# 2026-09-15 11:50 dsh:三个文件漂移,全部核实为**有意改动、不是变异残留**:
# · `model/Appearance.ts` + `pages/MainPage.ets`:**我自己**按 pi 的裁定把方案 (b) 落地成 (a)
# (删 `navMaterialFor` 与 `NAV_MATERIAL_OF`、导航条改回 `Theme.navMaterial`、
# 重写那段"注释说 (a)、代码是 (b)"的自相矛盾注释)。
# · `api/ApiClient.ets`:**别的会话**的提交 `69c2059`(JianFeeeee,11:43:22,
# 推送客户端契约层)动过它;当前内容与 HEAD 逐字节相同(`git diff HEAD` 空)。
# 复核"是不是变异残留"的方法:`git diff HEAD -- <文件>` + 上面这些记录。
#
# 2026-09-18 dsh:三个文件漂移,**已逐个核实是提交态、不是变异残留**(重算前的前提):
# · `AdminUsersPage.ets`、`SettingsPage.ets`:提交 `1be8318`(09-17 21:15,
# "底栏黑带 / 联系人点不开"那批)改过;`git diff --quiet HEAD` 为空 ⇒ 与 HEAD 逐字节相同。
# · `ApiClient.ets`:提交 `fce5b91`(09-15 15:15,"鸿蒙客户端连不上服务器")改过;同上。
# ★ 为什么必须先证这一步:底本**过期**与**变异残留**在 `sha256sum -c` 眼里一模一样,
# 而重算会把真正的残留**永久掩盖** —— 所以"重算"必须是一次**有记录**的动作。
# ★ 顺带修了播报:原来一律打"有文件没还原"(指向最危险的结论),
# 而真因只是底本没跟上提交 ⇒ 现在两种分开报,并各自给出判别方法。
#
# 2026-09-19 13:0x dsh:四个文件漂移,**已逐个核实是提交态、不是变异残留**(重算前的前提):
# · `pages/AdminUsersPage.ets`:提交 `6693e96`(09-18 11:47,"登录页那个 emoji 是 Unicode…")
# · `common/BackgroundPicker.ets`、`pages/SettingsPage.ets`:提交 `7e1120a`
# (09-19 12:30,"顶栏不再自己铺白条 + 日历改左右两栏…")
# · `api/ApiClient.ets`:提交 `7e10bfa`(09-18 12:55,"鸿蒙日历补 .ics 导入导出")
# 四个都 `git diff --quiet HEAD -- <f>` ⇒ **与 HEAD 逐字节相同** ⇒ 底本过期,不是残留。
# ★ 为什么必须逐个证这一步:底本**过期**与**变异残留**在 `sha256sum -c` 眼里一模一样,
# 而重算会把真正的残留**永久掩盖** —— 所以"重算"必须是一次**有记录**的动作。
# ⚠️ 这次漂移正是 `baseline-stale`(rc=0、只提示)那一档的又一次实例:
# 它**不假红**(正常提交不会天天红),但也**不会被自动发现** ——
# 我是靠"核每个文件的登记/实际读数"这条主动核查撞上的,不是它自己报的。
#
# 2026-09-19 18:2x baseline 重算(**先核过不是残留,才重算的**):
# ① `pages/AdminUsersPage.ets`、`pages/SettingsPage.ets` —— 我本次的**有意编辑**:
# 给所有"压在彩色底上的字/图标"换前景色(`Theme.surface` → `Theme.accentFg`),
# 并把品牌蓝前景接入 `Theme.accentFor()`(深色下提亮到 WebUI 的 `--c-blue-600`)。
# ② `api/AppearanceApi.ets` —— **与 HEAD 逐字节相同**(`git diff --quiet HEAD` 为空),
# 但底本哈希对不上 ⇒ 说明它在底本取完之后被**合法改过**(提交 `3b5cc63`,
# 09-19 那次"外观保存 400"的修:`payloadFromLocal` 改用 `AppearancePayload`)。
# ⇒ 这是 `stale`(底本过期),不是 `residue`(变异残留)。
# ★ 三个都逐个跑过 `git diff --quiet HEAD -- <f>` 取证,没有一个是"改动忘了还原"。
# ★ 这正是这份文件里那条纪律的第 3 次执行:"重算必须是一次有记录的动作"。
#
# 2026-09-19 20:2x baseline 重算(第 4 次,**仍先核过不是残留**):
# ① `pages/AdminUsersPage.ets` / `pages/SettingsPage.ets` / `common/BackgroundPicker.ets`
# —— 本次的**有意编辑**:语义色前景接入 `dangerFor()/approveFor()/warnFgFor()`
# (深色下红/绿/琥珀要提亮,对齐 WebUI `.dark --c-red/green/amber-700`),
# 以及三级文字接入 `textSubtleFor()`(深色下换二级,见 Theme.ets 里那段理由)。
# ② 三个都逐个跑过 `git diff --quiet HEAD -- <f>` ⇒ 全部**非空**(工作树有改动)
# ⇒ 是"我改的",不是"变异忘了还原"。
# ★ 取证命令留在这里,下次照着做:
# git diff --quiet HEAD -- <file> && echo STALE || echo INTENTIONAL
#
# 2026-09-19 20:4x baseline 重算(第 5 次):
# ① AdminUsersPage.ets / SettingsPage.ets -- 有意编辑:修三元里的裸 Theme.accent
# (前景位置漏改的那 2 处)+ 那一批 textSubtleFor()。
# ② 本次格外重要的一步:我批量替换 Theme.accent -> accentFor() 时,
# 误把 6 处 backgroundColor 也换了(accentFor() 深色给浅蓝 #80AFF9,
# 白字压上去约 1.4:1,主按钮文字会看不见)。发现后已逐处还原。
# 重算前专门复核过三件事(不能只看 git diff 非空就放行):
# - grep -c "backgroundColor(Theme.accentFor())" 得到 0
# - 三个涉及文件里都无 accentFor 背景
# - git diff HEAD~1 里 backgroundColor 只有 calendar 那一处
# (原本是 accentSoftFor,属本次有意改动)
# => 确认无「改错了没还原」的残留在。
# ③ 新增判据 C2(*For() 入口只能用于前景、不得当背景)把这整类钉住,
# 下次再手滑批量替换会直接判红,不必再靠事后复核。
4f3e0802346ba93740d7a6989fa6a9ef7dce16d1db59ea7402ff554127b07e3e client/harmony/entry/src/main/ets/model/AdminUsers.ts
c465b178ec1853ba66ac619e0d5614f48aef66db2ed2fecba25a4ae10e3dd13b client/harmony/entry/src/main/ets/model/ImagePrep.ts
7cdaa94bb0b4473aea652d50e5fe1b7b43c60b00076d0d3ac2cc49a3226f0aa5 client/harmony/entry/src/main/ets/pages/AdminUsersPage.ets
73c66c7045f579c3eb8b8e0aa07803e7c9363b7ae8375972b251633d3ce969be client/harmony/entry/src/main/ets/common/BackgroundPicker.ets
b53872c62acdeb88803df79d48ee94cca0810715b26e6cbb336e526c00b528b8 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