From 77aa42623a4d783b6213c6321a792659dbad4561 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Tue, 15 Sep 2026 12:22:15 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B7=A8=E7=AB=AF:=20debt-visibility=20?= =?UTF-8?q?=E8=A1=A5=E7=99=BB=E8=AE=B0=EF=BC=88=E6=96=B0=E5=88=A4=E6=8D=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8D=E4=BC=9A=E8=87=AA=E5=8A=A8=E8=B7=91?= =?UTF-8?q?=E5=AE=88=E5=8D=AB=EF=BC=89+=20`blurStyleFor`=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=90=8E=E7=9A=84=E6=B3=A8=E9=87=8A=E7=9C=9F=E7=9B=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 一、`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` 没重构建,与本次改动无因果)。**我没有替他们改**。 --- client/electron/test/debt-visibility.test.mjs | 13 ++++- .../entry/src/main/ets/model/Appearance.ts | 50 ++++++------------- .../entry/src/main/ets/model/Wallpaper.ts | 23 +++++---- .../entry/src/main/ets/pages/MainPage.ets | 5 +- docs/DEBTS.json | 7 +++ 5 files changed, 48 insertions(+), 50 deletions(-) diff --git a/client/electron/test/debt-visibility.test.mjs b/client/electron/test/debt-visibility.test.mjs index 1e2dd23..005824b 100644 --- a/client/electron/test/debt-visibility.test.mjs +++ b/client/electron/test/debt-visibility.test.mjs @@ -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)); diff --git a/client/harmony/entry/src/main/ets/model/Appearance.ts b/client/harmony/entry/src/main/ets/model/Appearance.ts index ba09ca4..c06996a 100644 --- a/client/harmony/entry/src/main/ets/model/Appearance.ts +++ b/client/harmony/entry/src/main/ets/model/Appearance.ts @@ -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'; -} /** * 主题偏好 → 系统色彩模式。 diff --git a/client/harmony/entry/src/main/ets/model/Wallpaper.ts b/client/harmony/entry/src/main/ets/model/Wallpaper.ts index b5b9f4d..549e4e3 100644 --- a/client/harmony/entry/src/main/ets/model/Wallpaper.ts +++ b/client/harmony/entry/src/main/ets/model/Wallpaper.ts @@ -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)) { diff --git a/client/harmony/entry/src/main/ets/pages/MainPage.ets b/client/harmony/entry/src/main/ets/pages/MainPage.ets index 01e4606..acc13c2 100644 --- a/client/harmony/entry/src/main/ets/pages/MainPage.ets +++ b/client/harmony/entry/src/main/ets/pages/MainPage.ets @@ -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) // 压暗用**系统遮罩色** + 服务端给的浓度:换向(浅色洗白/深色压黑)由系统负责 diff --git a/docs/DEBTS.json b/docs/DEBTS.json index fb398fe..1abb074 100644 --- a/docs/DEBTS.json +++ b/docs/DEBTS.json @@ -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" } ] }