跨端: feat(预设): 静默兜底留一条可观测痕迹;"只写不读"在鸿蒙侧也补上判据(照 LEGACY_BACKUP_KEY 照搬);§10 出处落地
pi 2026-09-14 的三小条。 1. **§3 静默兜底要留可观测痕迹**:`normalizePreset` 把认不出的 id 换成 aurora 这件事, 原先在真实环境里**不留任何痕迹** —— §10 的登记只防"被误报成 bug",防不住 "没人知道它正在发生"。现在 `BackgroundPlan.presetSubstitutedFrom` 带出**原来那个 id** (换过非空、没换过空串),页面据此打一行日志 ⇒ 后果从"可能发生"变成"**可数**"。 **痕迹记在返回值里而不是在这一层直接打日志**,理由写进代码:这一层是**纯逻辑** (无 `@ohos` 依赖 ⇒ 判据能用 node strip-types 直接跑它);为打一行日志引入 `@ohos.hilog`, 等于把"能真跑的行为判据"换成"只能读源码的形态判据"——不划算的交易。 **判据两条方向都钉**:替换必须留痕(且带出原 id);**没替换时必须为空** (痕迹退化成噪声就等于没有)。变异与正反例都在(5 条全绿)。 2. **§2 §10 的"谁批准"落成出处**:那一格原写"产品决定" —— 按 pi 的话这是**事后追认**。 现在写的是 **「无人类批准:这是实现时的默认行为(随 `model/Wallpaper.ts` 引入, `git log --diff-filter=A` 可查出处,2e42aac),本行是补登记」**,并把**意图**与**批准**分开写 (不拿意图冒充批准)。另两行也补了出处(`Appearance.ts:39,52,88,104,133` / `AppearanceStore.ets:142-195` / `backgroundStore.ts:200`)。 3. **§1 "可扫的字段清册"不必先造 —— 同形状已有一边是判据**:他说得对。 WebUI 的 `LEGACY_BACKUP_KEY` 早就钉着"只写不读",鸿蒙的 `bgBlur` 只有文档 ⇒ 差的是**同一个形状只有一边有判据**。已照搬:`harmony-appearance.test.mjs` 新增 **"消费侧出现次数必须为 0"**;豁免**按文件登记 + 写理由**(域模型 / 状态同步 / 线上 DTO 三处是搬运与传输,不是消费)——与 `mail_status_readers_test.go` 的豁免同一形状, 登记表本身就是清册,不必另造一张。 变异验证:让 MainPage 读一次 `bgBlur` → 判据红,红的信息写着"**停下:那时必须先补 px ↔ 材质档位的映射判据**,而不是把登记值从 0 改成 1"。 SUITE 计数同步:harmony-presets 4→5、harmony-appearance 24→25。
This commit is contained in:
@ -755,3 +755,55 @@ test('★ 遮盖色方向:`mask_*` 两套主题下都是**深色**(模态遮
|
||||
assert.match(settings, /Theme\.overlay/, '自绘弹层的遮罩仍然用 mask(那里的语义是压暗背后)');
|
||||
assert.ok(!/wallpaperScrim/.test(settings), '弹层不该用壁纸遮盖色(两个语义别混)');
|
||||
});
|
||||
|
||||
/**
|
||||
* ★ `bgBlur` 是"只写不读"的字段:**消费侧出现次数必须为 0**(pi 2026-09-14 指出同一形状只有一边有判据)。
|
||||
*
|
||||
* WebUI 的 `LEGACY_BACKUP_KEY` 早就钉着"只写不读,否则它会变成新的继承源";
|
||||
* 而鸿蒙侧 `bgBlur`(`Appearance.ts` clamp 存入、`AppearanceStore` 同步)**只有文档**。
|
||||
* 同一个形状只有一边有判据 ⇒ 这一边补上,不必等一张新的字段清册:
|
||||
* **登记表本身就是清册**(与 `server/internal/repo/mail_status_readers_test.go` 的
|
||||
* "文件 + 出现次数"同一个模板,只是这里的登记值是 0)。
|
||||
*
|
||||
* 消费侧一旦出现(有人按 px 选档位/设模糊半径)本条就红 —— 那是**必须停下来**的时刻:
|
||||
* 那时要补的是"px ↔ 材质档位"的**映射判据**(见 CRITERIA.md §10 与计划文档 §7.12),
|
||||
* 而不是把次数从 0 改成 1 了事。
|
||||
*/
|
||||
test('★ bgBlur 只写不读:消费侧出现次数必须为 0(要消费就得先补映射判据)', () => {
|
||||
const files = [];
|
||||
const walk = dir => {
|
||||
for (const e of readdirSync(dir, { withFileTypes: true })) {
|
||||
const p = join(dir, e.name);
|
||||
if (e.isDirectory()) { walk(p); continue; }
|
||||
if (!/\.(ets|ts)$/.test(e.name)) continue;
|
||||
files.push(p);
|
||||
}
|
||||
};
|
||||
walk(HARMONY_ETS);
|
||||
|
||||
/*
|
||||
* 豁免**按文件登记 + 写理由**(不是"凡是这几个目录都放行"):这三处是**搬运/传输**,
|
||||
* 不是消费 —— 判据要挡的是"有人拿这个值去决定画什么"。
|
||||
* 与 `server/internal/repo/mail_status_readers_test.go` 的豁免同一个形状。
|
||||
*/
|
||||
const plumbing = new Map([
|
||||
['model/Appearance.ts', '域模型:clamp(0,40) 后存下 bgBlur(搬运)'],
|
||||
['common/AppearanceStore.ets', '状态同步:与快照互转(搬运)'],
|
||||
['api/AppearanceApi.ets:17', '线上 DTO 声明 bg_blur(传输格式,不是消费)']
|
||||
]);
|
||||
|
||||
const consumers = [];
|
||||
for (const f of files) {
|
||||
const src = prose(f);
|
||||
const rel = f.slice(HARMONY_ETS.length + 1);
|
||||
src.split('\n').forEach((line, i) => {
|
||||
if (!/\bbgBlur\b|\bbg_blur\b/.test(line)) return;
|
||||
const where = rel + ':' + (i + 1);
|
||||
if (plumbing.has(rel) || plumbing.has(where)) return;
|
||||
consumers.push(`${where} ${line.trim()}`);
|
||||
});
|
||||
}
|
||||
assert.deepEqual(consumers, [],
|
||||
`有人在消费 bgBlur 了 —— 停下:那时**必须**先补"px ↔ 材质档位"的映射判据` +
|
||||
`(CRITERIA.md §10 / 计划文档 §7.12),而不是把登记值从 0 改成 1:\n ${consumers.join('\n ')}`);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user