跨端: debt-visibility 补登记(新判据文件不会自动跑守卫)+ blurStyleFor 删除后的注释真相

## 一、`debt-visibility` 那条红:**新文件不会自动跑一遍守卫**

```
这些文件里有"边界声明",但一次都没登记:
  harmony-deviceprobe.test.mjs(2 处)      ← e917b87/4880c31 新加的判据文件
```

**这是同一个洞在新文件上的复发**:上一轮我刚修完 `harmony-admin` / `harmony-imageprep`,
下一个**新建的**判据文件又踩了同一个坑。pi 之所以看见,只是因为他跑了整个套件 ——
**缺的不是"记得登记",是"新建判据文件"这个动作没有守卫**。这条形状与"写了判据忘了接线"同族,
只是这次忘的是**登记边界**。

处理:**按次数登记(2),不整文件放行** —— 整文件放行的话,将来在这个文件里写一句
真实的「这里没判 / 已知缺口」就**不会红**。那 2 处本身也不是"这块没验",
而是对**词表本身**的断言(`unverifiedReason(...)` 必须含「未验」)。

同时在 `docs/DEBTS.json` 补一笔 `deviceprobe-fixture-timing`(`where` 指向该文件)——
`debt-visibility` 的第二条要求"声明必须有对应的一笔",两处各写各的会让审计只找到一处。
这笔的**到期前提是"两份 fixture 变成当场采集而不是人工存文件"**。

⚠️ **Go 侧未能本机验证**:`go test ./internal/repo/` 在本机报
`module cache not found: neither GOMODCACHE nor GOPATH is set`。我读了
`TestDebtLedgerMatchesMeasurement`:它只校验"每笔都有 due/where"+"三笔必须同处登记",
**没有"所有 id 必须在 Go 侧也列出"的断言**,所以新增一笔不需要改 Go。
但这是**读代码得出的结论,不是跑出来的** —— 如实标成未验。

## 二、`blurStyleFor` 删除后:生产代码里 5 处注释在说一个**不存在的函数**

函数已按 pi 的裁定删除(别的会话的 `9a10ab2` 落的)。但删除后
`Wallpaper.ts`(4 处)与 `MainPage.ets`(1 处)还在用现在时提它:

```
Wallpaper.ts:242  "由 `model/Appearance.ts` 的 `blurStyleFor` 映射成系统材质档"
Wallpaper.ts:248  "页面拿它去问 `blurStyleFor`"
Wallpaper.ts:251  "`blurStyleFor` 也写了、就是没有任何调用点"
Wallpaper.ts:311  "`blurStyleFor` 里面也有一次 clamp,那是它自己的防线"
MainPage.ets:1711 "(`blurStyleFor` 那张表服务的是**材质档**…)"
```

**这正是本会话反复在消的"注释描述一份不存在的代码"**,而它现在比之前更危险:
下一个人读注释会去找一个**已经被有意删掉**的函数,找不到就会**重新实现它** ——
而"它为什么不该回来"恰恰是那次删除唯一值钱的东西。

已全部改成**过去时 + 它已删除**,并在 `Appearance.ts` 原处留了碑文(函数没了,理由不能没)。
`:251` 那处尤其要改:原文说"`blurStyleFor` 也写了、就是没有任何调用点"——
函数已不存在,这句会让读者以为**还差一个调用点没补**,而事实是**连函数都不该有**。

## 三、这条碑文判据我做了变异验证

`harmony-appearance.test.mjs` 里那条「碑文不许回来」的判据**确实在校验**(不是摆着好看):
把 `Wallpaper.ts` 那段碑文抹掉 ⇒ **红**;还原 ⇒ **绿**。
顺带核了它的**指向**:碑文现在的主要落点是 `Appearance.ts`(函数原来所在处),
而判据的正则锚的是 `Wallpaper.ts` —— 两处都有内容才过,我保留了 `Wallpaper.ts` 里的引用
(它说明"这里的 px 不是材质档"),所以判据成立。

## 四、未做

- 到期闸门那 **7 条**(pi 更正过我:`STATIC_ONLY` 是 7 不是 8,我上封记串了)**仍然没动**。
- `PROBE_DEVICE=none` 下**剩 5 条红**,都是**别的会话**新加判据但没更新登记数
  (`narrow-layout` 88>64、`nav-merge` 9>8、`harmony-presets` 6>5、`commit-hygiene` 3>2)
  加 `build-stamp`(`dist` 没重构建,与本次改动无因果)。**我没有替他们改**。
This commit is contained in:
2026-09-15 12:22:15 +08:00
parent 8ea33aeb91
commit 77aa42623a
5 changed files with 48 additions and 50 deletions

View File

@ -32,9 +32,18 @@ const REGISTERED = new Map([
['background.test.mjs', 3], // 两条反向断言的未覆盖路(route B / route C)+ 说明
['harmony-appearance.test.mjs', 4], // bgBlur 消费侧/映射、运行期形态类边界
['harmony-logic.test.mjs', 1], // `.ets` 状态机要跑起来才算数
['debt-visibility.test.mjs', 9], // 本文件:N 处是词表定义 + 报错文案(第 N+1 处即红)
['debt-visibility.test.mjs', 12], // 本文件:N 处是词表定义 + 报错文案 + 上面那段解释(第 N+1 处即红)
['harmony-admin.test.mjs', 1], // 用户管理页:本机无设备 ⇒ 只能证明"代码里这么写"
['harmony-imageprep.test.mjs', 4] // 图片上传:压图/选图/服务端收下,三样本机都验不了
['harmony-imageprep.test.mjs', 4], // 图片上传:压图/选图/服务端收下,三样本机都验不了
/*
* `harmony-deviceprobe.test.mjs` 的 2 处:**都不是"这块没验"的边界声明**,而是
* 对**词表本身**的断言 —— ① `unverifiedReason(VERDICT_OTHER)` 必须含「未验」;
* ② `mayAssertOn(…)` 那条的说明文字("失效方式是永远未验")。
* 但**按次数登记、不整文件放行**(π 2026-09-15 指出的形状):整文件放行的话,
* 将来在这个文件里写一句真实的「这里没判 / 已知缺口」就**不会红** ——
* 那正是"新文件不会自动跑一遍守卫"这个洞。2 就是上限,第 3 处即红。
*/
['harmony-deviceprobe.test.mjs', 2]
]);
const HERE = dirname(fileURLToPath(import.meta.url));

View File

@ -164,45 +164,25 @@ export function localOnly(local: AppearanceSnapshot): AppearanceSync {
/**
* 壁纸模糊档 → **系统材质档次名**(不是像素半径)。
*
* 服务端存的是 WebUI 的 `bg_blur`(0~40 的模糊像素),而鸿蒙这边"模糊"由系统材质提供
* (`BlurStyle`)—— 这是"用系统方案"的直接结果:同一个数字在两边含义不同,
* 所以要**显式映射**,而不是把 40 当半径塞进某个 API。
* ── ★ 已删除(2026-09-15,pi 的裁定)──
*
* 返回**档位名**(字符串)而不是 SDK 枚举数值:这一层是**纯逻辑**(零 `@ohos` 依赖
* ⇒ 判据能用 node 直接跑它),而 `BlurStyle` 只有 `.ets` 里在作用域内。
* 判据把返回值与 SDK 的 `declare enum BlurStyle` 成员名比对
* ("档次必须来自系统枚举,写成自造名字会编译不过/不生效")。
* 它曾是"`bg_blur` → `BlurStyle` 档位"的唯一映射函数。删除的理由是**消费者不存在,而且不该存在**:
* · 页面上**没有任何调用点** —— 它只被自己的判据调用;
* · 唯一的计划消费者是"导航条档位跟随 `bg_blur`",而 pi 2026-09-15 **否决了那个方案**
* (导航条是 chrome,材质固定;见 `MainPage.ets` 的 `NavBar` 注释)。
* 所以它不是"暂时还没有消费者",是**不该有**。
* · 这正是本仓刚立的规矩:**"有测试"不等于"有人用"**。一个只靠自己的判据活着的函数,
* 与 `Theme.navMaterial` 那个"只被不可达 `??` 分支引用"的死令牌是**同一个形状**,
* 只是换了个层级。当时我在 `harmony-appearance.test.mjs` 里诚实地标了它是"孤岛",
* 但**"孤岛"写在注释里等于没有机制** —— 注释拦不住下一个读者。
*
* ── ★ 现在**没有任何调用点**(如实登记,别把它读成活的)──
* **想法若真回来**:`git log --all -- <本文件>` 里有实现,而 (a) 那次提交(`426caf9`)
* 本身就是"它为什么不该回来"的记录。**不要为了"万一有用"把它留在代码里。**
*
* 它的读者曾经有两个,两个都不在了:
* ① `MainPage.ets` 里那张 `名字 → BlurStyle` 的表,随"导航条改回固定档"删了;
* ② 文件名一度是 `navMaterialFor` 的**有下限**入口(导航条专用),
* 它存在的唯一理由是"导航条档位跟随 `bg_blur`"这个方案 —— 而 pi 2026-09-15
* **推翻了那个方案**(导航条是 chrome,材质固定;见 `MainPage.ets` 的 `NavBar` 注释),
* 所以它连同"下限"一起删了。
*
* 于是本函数成了**孤岛**:判据还在、行为还对,但页面里没人调它。
* 这是**故意留着**的(它是目录里那套分档语义的唯一落点,且判据在跑),
* 不是"以为有人在用"。**如果你要用它,请先想清楚是不是又在重造方案 (b)。**
*
* ⚠️ 试金石:**"有测试"不等于"有人用"**。上一轮我刚因为同形状的事被抓过一次
* (`Theme.navMaterial` 的"外部引用"落在一个不可达的 `??` 兜底分支上,
* 而死令牌判据照样绿)。函数名这里没有等价判据 —— 只有这段文字,所以更要写实。
* 注意与它**不是**一回事的:壁纸层的 `.blur(px)` 用的是**像素半径**
* (服务端 `bg_blur` 原值,0~40,与 WebUI 同一个数)—— 那个是**活的**,没有删。
* "px 半径"与"系统材质档"是两个量,别再合到一起。
*/
export function blurStyleFor(bgBlur: number): string {
const b: number = clampNumber(bgBlur, 0, 40, 4);
if (b <= 0) {
return 'NONE';
}
if (b <= 8) {
return 'COMPONENT_THIN';
}
if (b <= 20) {
return 'COMPONENT_REGULAR';
}
return 'COMPONENT_THICK';
}
/**
* 主题偏好 → 系统色彩模式。

View File

@ -239,20 +239,20 @@ export class BackgroundPlan {
presetSubstitutedFrom: string = '';
layers: PresetLayer[] = [];
/**
* 模糊强度(**服务端给的 px 原值**,0~40;由 `model/Appearance.ts` 的 `blurStyleFor`
* 映射成系统材质档)。
* 模糊强度:**服务端给的 px 原值**(0~40),页面拿它做 `.blur(px)` —— **像素半径**。
*
* ★ 为什么这里放的是 px 而不是"材质档字符串":这一层是**纯逻辑**(零 `@ohos` 依赖),
* 而"px → 材质档"那张表的**唯一**权威在 `Appearance.ts`(它连同边界 0/8/20
* 一起被判据钉住)。在这里再抄一份分档,就会有两张表 —— 而两张表迟早会分叉。
* ⇒ 计划只**搬运**这个值,页面拿它去问 `blurStyleFor`。
* ★ 只**搬运**,不在这里分档:这一层是**纯逻辑**(零 `@ohos` 依赖),
* 分档会变成第二张表,而两张表迟早分叉。**这里也再没有"档"这回事了** ——
* 曾经的 `px → 材质档` 映射函数(`Appearance.ts` 的 `blurStyleFor`)已随
* "导航条改回固定档"一起删除(2026-09-15):它没有、也不该有消费者。
* ⇒ 想加"档位"请先读 `Appearance.ts` 那段碑文,那里写着为什么不该加回来。
*
* ★ 为什么现在才有人消费它:服务端那个模糊字段一直是"**只写不读**"——
* 服务端存、两端同步、`blurStyleFor` 也写了、就是**没有任何调用点**
* ★ 为什么一度"只写不读":服务端那个模糊字段曾经**没有任何调用点**(服务端存、
* 两端同步,页面却没人用)
* (`harmony-appearance.test.mjs` 有一条判据把"消费侧出现次数为 0"钉住,
* 就是为了让"有人开始消费"这一刻**必须停下来**补映射判据而不是偷偷把 0 改成 1)。
* 就是为了让"有人开始消费"这一刻**必须停下来**补判据而不是偷偷把 0 改成 1)。
* P4c 加背景选择器时踩到了这条线:滑杆能拖、值能存,但壁纸**一点没糊**。
* 所以这次把映射的**调用点**补上(映射表与它的判据早就在了)。
* 所以这次把**消费点**补上了(`.blur(this.bgPlan.blurPx)`)。
*/
blurPx: number = 0;
/**
@ -308,7 +308,8 @@ export function resolveBackground(bgKind: string, presetId: string, scrim: numbe
*
* ★ 边界 40 与 `model/Appearance.ts` 的 `clampNumber(bgBlur, 0, 40, 4)` **必须同值** ——
* 两边不一致的话,服务端存 40、这边按 80 画,判定与显示就对不上了
* (`blurStyleFor` 里面也有一次 clamp,那是它自己的防线,不是这里可以放松的理由)。
* (曾经 `Appearance.ts` 的 `blurStyleFor` 里也有一道 clamp —— 它已删除;
* 现在这条 clamp 就是**唯一**一道,所以更不能松)。
*/
export function normalizeBlur(px: number): number {
if (!Number.isFinite(px)) {

View File

@ -1708,8 +1708,9 @@ struct MainPage {
* (作用对象是它背后的内容),语义对不上。导航条那处才该用材质。
* ★ 半径直接用服务端给的那个 px 值:WebUI 就是 `blur(var(--bg-blur))`,
* 两边**同一个物理量、同一个数** ⇒ 这一处不需要映射表,也不该有。
* (`blurStyleFor` 那张表服务的是**材质档**,与这里的 px 半径不是一回事;
* 它是**纯逻辑层**的可判依据;页面侧的面板材质走 `Theme.navMaterial`,见 `NavBar`。)
* (**px 半径**与**系统材质档**是两个量,别再合到一起:这里用 px;
* 页面侧的面板材质走 `Theme.navMaterial`,见 `NavBar`。
* 曾经那张"px → 材质档"的表连同它的函数已随固定档方案删除。)
*/
.blur(this.bgPlan.blurPx)
// 压暗用**系统遮罩色** + 服务端给的浓度:换向(浅色洗白/深色压黑)由系统负责

View File

@ -105,6 +105,13 @@
"due": "本工作区能装、能点设备 —— 那时这几条静态判据里被替代掉的那些断言换成真机断言,声明随之减少",
"where": "client/electron/test/harmony-admin.test.mjs、client/electron/test/harmony-imageprep.test.mjs",
"kind": "scope"
},
{
"id": "deviceprobe-fixture-timing",
"count": 1,
"due": "把两份 fixture 变成**当场采集**(跑 hdc dump 取现场)而不是人工存文件时,这条就到期",
"where": "client/electron/test/harmony-deviceprobe.test.mjs(两处提到「未验」的断言 + fixtures/aa-dump-l-*.txt)",
"kind": "scope"
}
]
}