fix(更正): 我登记的"不存在映射表"是错的(blurStyleFor 一直在,缺的是调用点);豁免按文件+次数抓出来的
pi 2026-09-14 三条接续,其中 §3 那一条**抓出了我自己的一个错误结论**。 1. **§3 交叉提醒(豁免按"文件 + 次数")→ 直接翻出我漏掉的东西**: 把 `bgBlur` 的豁免改成计数后,逐处核对出现次数时发现 `model/Appearance.ts` 里 **有一个 `blurStyleFor(bgBlur)`** —— **px → 系统材质档的映射表早就在那儿** (文件注释还写着「判据可以直接跑它」),只是**没有任何调用点**。 而我先前把"鸿蒙没有消费点"登记成了"**不存在映射表 ⇒ 钉映射判据是假判据**", **那是错的**,并且已经写进了两处文档(CRITERIA.md §10、计划文档 §7.12)。 ⇒ 两处都**更正**了,并写明发现方式(计数机制把它翻出来的)。 正确的登记:**映射表存在且可判;缺的是调用点** —— 这两件事分开判。 2. **映射表按"它是行为"来钉**(新判据,26/26 绿):分档边界 0/8/20、 **单调性**(px 变大档次不许倒退)、**NaN 不许落到最厚那一档**(比较全 false 时掉到最后一档 是最坏方向)。`blurStyleFor` 是纯函数 ⇒ 与 Wallpaper 一样能直接用 node 跑,不需要设备。 3. **§1 痕迹的"输出那条腿"仍无人判 —— 我把它登记成欠账而不是假装钉了**: 页面层(`MainPage.ets`)有没有真的拿 `presetSubstitutedFrom` 打日志,现在**没有判据**。 我没有在本轮补上,原因是它要动 `.ets`(按环境约定,写 `.ets` 前要先按 ArkTS 纪律加载规范), 而 P6 第 1、2 步正好要动那个文件 —— 所以登记成 `docs/DEBTS.json` 的 `observability-output`(余额 1、到期前提写明"页面接上日志时同时补判据"), **不是"未完成"含糊过去**,而是"什么时候还"写清楚了。 4. **§2 §10 那格从"无人类批准"收口成"待批准"**:仍进余额 —— `unknown-preset-approval`, 到期前提是"有人追认或驳回『未知 id 显示 aurora 而不是空白』这个方向", 并写明**我作为实现者不能自己追认自己**。 5. 顺手把 pi 那条建议入册(`CRITERIA.md` §14):**登记/清册类判据的报错要同时写 "正确修法"与"最常见的错误修法"** —— 因为读到红的人第一反应通常是改那个数字。 余额现在一处可见:`RESULT phase=install static=5 debts=9(…) probe=ok`。
This commit is contained in:
@ -786,11 +786,17 @@ test('★ bgBlur 只写不读:消费侧出现次数必须为 0(要消费就
|
||||
* 不是消费 —— 判据要挡的是"有人拿这个值去决定画什么"。
|
||||
* 与 `server/internal/repo/mail_status_readers_test.go` 的豁免同一个形状。
|
||||
*/
|
||||
/*
|
||||
* 豁免必须**按文件 + 次数**(pi 2026-09-14 交叉提醒,与 migrate.go 那处同一条):
|
||||
* 只按文件放行 ⇒ "在已允许的文件里顺手再读一下 bgBlur 做别的事"会被静默吞掉
|
||||
* (例如有人在 DTO 文件里拿它算点别的)。次数写死在这里,多一次即红。
|
||||
*/
|
||||
const plumbing = new Map([
|
||||
['model/Appearance.ts', '域模型:clamp(0,40) 后存下 bgBlur(搬运)'],
|
||||
['common/AppearanceStore.ets', '状态同步:与快照互转(搬运)'],
|
||||
['api/AppearanceApi.ets:17', '线上 DTO 声明 bg_blur(传输格式,不是消费)']
|
||||
['model/Appearance.ts', { max: 11, why: '域模型:声明 + clamp + 合并 + 映射函数 blurStyleFor(px → 材质档,见下一条判据)—— 搬运与映射,都不是消费' }],
|
||||
['common/AppearanceStore.ets', { max: 4, why: '状态同步:与快照互转(搬运)' }],
|
||||
['api/AppearanceApi.ets', { max: 1, why: '线上 DTO 声明 bg_blur(传输格式,不是消费)' }]
|
||||
]);
|
||||
const plumbingSeen = new Map();
|
||||
|
||||
const consumers = [];
|
||||
for (const f of files) {
|
||||
@ -799,7 +805,14 @@ test('★ bgBlur 只写不读:消费侧出现次数必须为 0(要消费就
|
||||
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;
|
||||
const rule = plumbing.get(rel);
|
||||
if (rule) {
|
||||
const n = (plumbingSeen.get(rel) || 0) + 1;
|
||||
plumbingSeen.set(rel, n);
|
||||
if (n <= rule.max) return;
|
||||
consumers.push(`${where} **超出豁免上限**(${rel} 上限 ${rule.max} 处,理由:${rule.why})—— ${line.trim()}`);
|
||||
return;
|
||||
}
|
||||
consumers.push(`${where} ${line.trim()}`);
|
||||
});
|
||||
}
|
||||
@ -807,3 +820,38 @@ test('★ bgBlur 只写不读:消费侧出现次数必须为 0(要消费就
|
||||
`有人在消费 bgBlur 了 —— 停下:那时**必须**先补"px ↔ 材质档位"的映射判据` +
|
||||
`(CRITERIA.md §10 / 计划文档 §7.12),而不是把登记值从 0 改成 1:\n ${consumers.join('\n ')}`);
|
||||
});
|
||||
|
||||
/**
|
||||
* ★ `blurStyleFor`:**px → 系统材质档** 的映射是**行为**,不是注释(可以真跑)。
|
||||
*
|
||||
* 这条的来历值得记:我先前把"鸿蒙没有消费点"登记成"**不存在映射表 ⇒ 钉映射判据是假判据**",
|
||||
* 那个结论**是错的** —— 正是 pi 要求把豁免改成"文件 + 次数"之后,逐处核对出现次数
|
||||
* 才把 `model/Appearance.ts` 里的 `blurStyleFor` 翻出来:**映射表早就写了**
|
||||
* (文件里的注释还写着「判据可以直接跑它」),只是**没有任何调用点**。
|
||||
*
|
||||
* 所以正确的登记是:**映射表存在且可判(本判据);缺的是调用点**。
|
||||
* "有没有人用它"是另一件事,由上面那条消费侧计数判据管(登记值为 0)。
|
||||
*/
|
||||
test('★ blurStyleFor:分档边界、单调性、NaN 都是行为(0/8/20 是契约的一部分)', async () => {
|
||||
const { pathToFileURL } = await import('node:url');
|
||||
const A = await import(pathToFileURL(join(HARMONY_ETS, 'model', 'Appearance.ts')).href);
|
||||
assert.equal(typeof A.blurStyleFor, 'function', 'blurStyleFor 必须存在且可跑');
|
||||
|
||||
const cases = [[0, 'NONE'], [-5, 'NONE'], [1, 'COMPONENT_THIN'], [8, 'COMPONENT_THIN'],
|
||||
[9, 'COMPONENT_REGULAR'], [20, 'COMPONENT_REGULAR'], [21, 'COMPONENT_THICK'],
|
||||
[40, 'COMPONENT_THICK'], [999, 'COMPONENT_THICK']];
|
||||
for (const [px, want] of cases) {
|
||||
assert.equal(A.blurStyleFor(px), want, `bg_blur=${px} 应当映射到 ${want}`);
|
||||
}
|
||||
// 单调性:px 变大,档次不许倒退(分档写反是最容易犯的错)
|
||||
const order = ['NONE', 'COMPONENT_THIN', 'COMPONENT_REGULAR', 'COMPONENT_THICK'];
|
||||
let last = -1;
|
||||
for (let px = 0; px <= 40; px++) {
|
||||
const i = order.indexOf(A.blurStyleFor(px));
|
||||
assert.ok(i >= last, `bg_blur=${px} 的档次倒退了(${order[last]} → ${order[i]})`);
|
||||
last = i;
|
||||
}
|
||||
// NaN 不许落到最厚那一档:它只能来自坏数据,不该被解释成"最模糊"
|
||||
assert.notEqual(A.blurStyleFor(Number.NaN), 'COMPONENT_THICK',
|
||||
'NaN 不许落到最厚那一档(比较全 false 时掉到最后一档 —— 那是最坏的方向)');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user