JianFeeeee
3123d83979
判据: 把「面当字」的防线从死名单改成判矛盾(三次迭代都记下来了)
上一版加的静态防线只 grep `fontColor(Theme.surface)` —— **一个名字**。
那是死名单:以后加了新令牌它不会跟上(本仓已记录过多次这类错法)。
改成从源码推:
**条件 A**:值是 `Resource` 且指向 `sys.color.*` ⇒ **跟随系统主题翻转**
**条件 B**:既当 `backgroundColor` 又当 `fontColor/iconColor` ⇒ **被当成「面」也被当成「字」**
判决 = **A ∩ B**,不需要维护任何名单。
## 三次迭代(每次错得很典型,所以都写进注释了)
- **① 死名单**(只盯 `surface`):新增令牌不会跟上。
- **② 只要 A**("是翻转的 Resource 就不许当前景色"):**太宽** —— 实测立刻
报出 20+ 处"违规",全是 `textMuted` / `textSubtle` / `textPrimary`。
那些**本来就该**当前景色(语义就是文字色,跟随主题翻转是对的)⇒ 假红一片。
- **④ 只要 B**("矛盾就报"):**也宽** —— `accent` / `danger` / `approve` / `warnFg`
两边都用是正常设计(蓝底白字主按钮 + 白底蓝字返回箭头)。
和 `surface` 的**关键区别**:那些是**饱和的字符串常量**(不翻转、语义是"色"),
而 `surface` 是**中性面 + 跟随主题翻转**(当字色 = 把底板当墨水,深色下必然看不见)。
- **最终 = A ∩ B**:恰好命中 `surface` 这一类,且**不随新增令牌失效**。
允许清单现在是**空表**(修完 `surface` 后没有例外),
并写明「已审过、不需要进这张表的」那几个令牌与理由。
## 变异验证(两个都做了,第二个是关键)
1. 把一处 `.accentFg` 改回 `.surface` ⇒ **判红**;还原 ⇒ 绿。
2. **造一个判据从没见过的新令牌**(`surfaceAlt`,同样 `Resource` + `sys.color.*`),
让它同时当背景与前景 ⇒ **判红**(报文里点名 `Theme.surfaceAlt`);还原 ⇒ 绿。
—— 这条比 ① 重要:它证明判据**不是靠记住 `surface` 这个名字**在工作。
## 顺带确认
`pageBg` / `surfaceMuted` / `wallpaperScrim` / `border` / `overlay` 这五个
同类"会翻转的面"**一处都没被当字色用过** —— 这一类现在全清了。
`run-all.mjs` → `checks=513 pass=513 fail=0 skip=0 red=0 broken=0 unreported=0`。
2026-09-19 19:39:02 +08:00
..
2026-09-19 19:39:02 +08:00
2026-09-19 19:29:49 +08:00