test(预设): 补行为判据 —— "清单里有、渲染器没有"必须红(值判据只挡住一半)

pi 2026-09-14 指出:我那条"两端预设清单 id/顺序逐项相等"只挡得住**一半** ——
它挡"清单漏一档",挡不住"清单有、渲染器没有"(第 7 档两边都加、忘了给
`layersFor` 加分支 ⇒ 值判据全绿,用户看到的却是 aurora)。症状与"信息对等缺口"
一模一样,只是路径换了。核对:他说得对,`layersFor` 的兜底就是 `aurora`,
所以丢分支是**静默**的。

新增 `test/harmony-presets.test.mjs`(4 条,`--experimental-strip-types` 直接执行
纯逻辑 `model/Wallpaper.ts` —— 与 `harmony-logic` 同一先例,**能真跑**):

1. 六档 × 两主题:不抛异常、非空、每层 kind/色标/网格字段有效;
2. ★ **清单里有、渲染器没有 → 红**:手法是拿一个不存在的 id 调一次当作"兜底长相",
   任何一档丢了分支就会与兜底逐字节相同 ⇒ 红。**并写明已知边界**:`aurora` 自己
   就是兜底档,它"丢分支"在行为上不可观测(由值判据 + 第 3 条兜住);
3. 六档两两不同(复制分支没改参数 → 红);
4. 深色档必须与浅色档不同("深色没换色" → 红)。

**不需要设备 ⇒ 按 pi 的提醒不登记进 `static` 欠账**(那会虚增余额)。
两条变异都验过:删 `mesh` 分支 → 行为判据报"画出来的和兜底档一模一样";
清单加第 7 档不加分支 → **值判据与行为判据同时红**(两条一起才闭合)。
安装相位 14/14 绿。

另按 pi 要求处理两处登记:
· §7.12 那行"px ↔ 档位"改成**核实后的真相**:`bg_blur` 在鸿蒙侧只有搬运没有消费
  (`Appearance.ts` clamp 存下、`AppearanceStore` 同步,**没有任何页面读它**),
  所以不存在映射表可钉 —— 钉一张不存在的表是假判据;并写明"若将来开始消费它,
  那时必须补映射判据",作为"人工约定、当前无判据"的登记处。
· 预设 id/顺序那条**标清钉的是产品要求**(顺序=用户看到的选项次序),理由写进判据注释。
This commit is contained in:
2026-09-14 17:05:15 +08:00
parent 863b583838
commit 5e74e0312e
3 changed files with 125 additions and 1 deletions

View File

@ -101,6 +101,20 @@ WebUI 侧踩过这个坑,见 `gateway/handler/permission.go` 的 Note 传递
| 第 2 步 | **圆角 + 能裁剪 + 给对边** | ✅ **可验收,且不需要设备** —— 只读 `.ets` 的层结构。**不许登记成 `static` 欠账**(那会虚增余额,而它本来就能判) |
| 第 3 步 | 交互:点某天/翻页/滑动阈值/ics | ⚠️ **必然进 `static` 欠账**(要设备:能装、能点)。到期前提见套件的探针表 |
**预设清单那条判据钉的是"集合"还是"产品要求"(pi §2 要求标清)**:
钉的是**产品要求** —— WebUI 的 `PRESETS` 顺序就是预设选择器里用户看到的顺序(`backgroundStore.ts`
用它渲染列表),鸿蒙若顺序不同,用户在两端看到的选项次序不一致、会以为"选错了"。
所以"逐项一致(含顺序)"要**保留**,理由写在判据注释里;将来无害重排也必须**两边同时改**
(两边都改时判据仍绿 —— 它比的是两份清单,不是某一份的历史)。
**行为判据(pi 2026-09-14 指出"清单相等只挡住一半")**:清单相等是"能画出来"的**必要**条件,
挡不住"**清单里有、渲染器没有**"(第 7 档两边都加、忘了给 `layersFor` 加分支 ⇒ 值判据全绿,
用户看到的却是 aurora)。已补可跑的行为判据 `client/electron/test/harmony-presets.test.mjs`
(4 条,`--experimental-strip-types` 直接执行纯逻辑 `model/Wallpaper.ts`,**不需要设备 ⇒ 不进欠账**):
每档两主题都非空且字段有效 / **每一档必须与"兜底档"不同**(丢分支 ⇒ 红)/ 六档两两不同 / 深色档必须与浅色档不同。
两条变异都验过:删 `mesh` 分支 → 行为判据命中"清单里有、渲染器没有";清单加第 7 档不加分支 →
**值判据与行为判据同时红**(这就是"两条一起才闭合")。
**手势阈值(pi §2:先证明那个值在 WebUI 侧被钉着,否则"一致"只是当下的巧合)**:
核实结果 —— **WebUI 侧没有被钉**:`client/electron/src/components/CalendarView.tsx:204`
是裸字面量 `Math.abs(dx) < 40 || Math.abs(dx) < Math.abs(dy) * 1.5 || !fast`(`fast` = `<600ms`),
@ -537,7 +551,7 @@ deb 也不必从 targets 里摘。已写进 `client/electron/BUILD.md`(含排
|---|---|---|---|
| 圆角 | 自声明 `--radius-card: 0.875rem` | 系统 `sys.float.ohos_id_corner_radius_card/button` | 系统圆角会随设备/主题/无障碍设置变;跟着系统才是"系统方案" |
| 材质(玻璃) | 自声明 `--nav-bg: 255 255 255 / 0.72` + `backdrop-filter` | 系统 `backgroundBlurStyle(BlurStyle.COMPONENT_THICK)` | 系统材质自带深浅两套颜色与模糊半径,手写 alpha 跟不了深色 |
| **壁纸模糊度** | 用户的 `bg_blur`(**像素半径**,初值 4px)作用在壁纸图层上 | **没有对应物**:栏上的系统**材质档位**(`BlurStyle.*`)是唯一一次模糊,壁纸层不糊 | **不是同一个物理量**:`bg_blur=8px` 与"材质档位"对不上**不是 bug**,是映射 —— 不写清就会有人当 bug 报(pi 2026-09-14 指出) |
| **壁纸模糊度** | 用户的 `bg_blur`(**像素半径**,初值 4px)作用在壁纸图层上 | **没有被消费**:栏上的系统**材质档位**(`BlurStyle.COMPONENT_THICK`)是唯一一次模糊,壁纸层不糊 | **不是同一个物理量,而且这边根本没有映射表**。2026-09-14 核实:`bg_blur` 在鸿蒙侧只有"搬运"没有"消费" —— `Appearance.ts` 把它 clamp 到 0~40 存进 `bgBlur`、`AppearanceStore` 同步它,但**没有任何页面/组件读它**(材质档位是固定枚举)。所以不存在"px ↔ 档位"的值映射可钉,也就**没有可判的性质**(pi 问的"映射表有没有判据":没有,且当前不该有 —— 钉一张不存在的表是假判据)。**改一端的含义**:改 WebUI 的 `bg_blur` 语义**不影响鸿蒙**;若将来鸿蒙开始消费它(例如按 px 选不同 `BlurStyle`),**那时**必须补一条映射判据,并更新本行 —— 这是"人工约定、当前无判据"的登记处(CRITERIA.md §12 的同一族)。 |
| 动效 | 自定义 transition/时长 | `animateTo` + 系统 `curves` | 动效曲线应跟随系统设置(含"减弱动效") |
| 遮罩 | 自声明 `--bg-scrim` + `--bg-dim` 两段式 | 系统 `sys.color.ohos_id_color_mask_regular` | 遮罩要随主题换向(浅色洗白/深色压黑),这件事系统已经做了 |
| **品牌色** | `--c-blue-600: 37 99 235` | `Theme.accent = '#2563EB'` | **不允许差异** —— 两个客户端是同一个产品 |