fix(判据): 两条反向断言"标签比断言宽"——缩回真实范围并记下三条逃逸路(各注变异确认);overlay 运行期边界进余额

pi 2026-09-14:变异证明的是"我注入的那两条会被抓",不是"回滚会被抓" —— 对。

1. **标签缩回断言的真实范围**(选 pi 的 (a)):两条判据原先叫"导航不得变暗 / 不得自叠模糊",
   实际各只扫了一条路。按 pi 预测的三条逃逸路各注一次变异,**三条全部逃掉**(导航变黑/变模糊,
   判据照样全绿):`.dark .nav-rail{background-color}`(选择器作用域)、组件 `dark:bg-slate-900`
   (Tailwind 产的不是 `.dark{--nav-}`)、组件 `backdrop-blur-lg`(不在那条选择器下)。
   现在名字就是它们真正断言的东西,**未覆盖的路逐条写在注释里**(含变异表),
   并写明要堵时按文件窄豁免写、别一刀切。
   理由:**标签比断言宽的判据,会在它没测的那条路上被回滚时给绿,而人信的是标签。**

2. **overlay 的运行期边界进余额**(`overlay-follows-app-theme`):机制依据(`applyTheme →
   setColorMode`、资源按应用配置解析)我认,但它是**运行期**性质、注释里的"未验"没人判 ——
   按我自己刚立的纪律:只活在注释里的边界 = 没人判的边界。到期前提写死:上设备后翻转
   colorMode,断言遮罩跟着「应用」主题变;证伪则改为从应用主题派生,**不是**回双常量。
This commit is contained in:
2026-09-14 17:35:53 +08:00
parent 9af4fde706
commit 1fcb754b61
2 changed files with 30 additions and 4 deletions

View File

@ -340,18 +340,38 @@ check('新组件未使用未映射色族', unmapped.length === 0, unmapped.join(
* 整体的模糊是由壁纸那一层模糊确定的」)。导航浮在壁纸上,背后是**已经模糊过**
* 的壁纸,再 backdrop-filter 一次只会更脏更掉帧。所以断言是反向的:壁纸层有模糊,
* 而壁纸模式下的 .nav-rail 没有。
*
* ★★ 2026-09-14 **标签缩回断言的真实范围**(pi 指出,我逐条变异确认)★★
*
* 我原先把这两条的名字写成了"导航**不得**变暗 / 不得自叠模糊",但它们各自只扫了
* **一条路**。我用 pi 预测的三条逃逸路各注了一次变异,**三条全部逃掉**(导航变黑/变模糊,
* 而两条判据照样全绿):
*
* | 逃逸路 | 变异注入 | 结果 |
* | --- | --- | --- |
* | A 选择器作用域 | `.dark .nav-rail { background-color: #0f172a }` | **绿**(`/\.dark\s*\{/` 匹配不到它) |
* | B 组件的 dark: 变体 | `className="nav-item dark:bg-slate-900 …"` | **绿**(Tailwind 产的也不是 `.dark{--nav-}`) |
* | C 组件的工具类模糊 | `className="nav-item backdrop-blur-lg …"` | **绿**(不在那条选择器下) |
*
* ⇒ 选择 (a) **把标签缩回它真正断言的东西**,并把它没守的路写在名字里之外的地方(本注释):
* **标签比断言宽的判据,会在它没测的那条路上被回滚时给绿,而人信的是标签。**
* (为什么不选 (b)「扩到扫全部 JSX 类名 + CSS 选择器」:成本高,且极易变成一刀切误红 ——
* `bg-chrome-600` plain 档徽标就是先例。)
*
* **未覆盖的路(各自另立判据时才补,不是"已经安全")**:A/B 两条深色来源、
* C 这条模糊来源。真要堵时按文件窄豁免写,别写成"导航目录不许出现 dark:"。
*/
const darkBodies = [...css.matchAll(/\.dark\s*\{([^}]*)\}/g)].map(m => m[1]);
check(
'没有深色主题之前,.dark 不单独给导航换色',
'导航深色来源之一已堵:.dark 令牌块里不许出现 --nav-*(另两条路见上方注释,未覆盖)',
darkBodies.length >= 1 && darkBodies.every(b => !/--nav-/.test(b)),
'.dark 里出现了 --nav-* 令牌 —— 要让导航变暗,必须同时给组件补 dark: 变体'
'.dark 令牌块里出现了 --nav-* —— 这条只堵这一条路(`.dark .nav-rail{}` 作用域与组件 dark: 变体都没堵,见上方注释)'
);
check(
'模糊只由壁纸层负责(壁纸模式下的导航不再自叠一层)',
'导航自叠模糊之一已堵:壁纸模式下 .nav-rail 规则里不许写 backdrop-filter(元素级工具类那条路未覆盖)',
/\.app-backdrop \{[\s\S]*?filter: blur\(/.test(css) &&
!/html\[data-bg='on'\] \.nav-rail[^{]*\{[^}]*backdrop-filter/.test(css),
'导航自己 backdrop-filter 会把已经模糊过的壁纸再糊一次'
'壁纸模式下 .nav-rail 自己 backdrop-filter 会把已经模糊过的壁纸再糊一次(元素级 backdrop-blur-* 工具类不在本判据范围内)'
);
check('内层面板自带圆角(不靠裁剪,否则与滚动冲突)',
/\.comm-pane > \*:not\(\[data-testid='comm-tabs'\]\) \{[\s\S]{0,80}border-radius: var\(--radius-card\)/.test(css));