intended priority/p2 · pkg/tooling(仓库缺 priority/_ 与 pkg/_ label,见前端 label taxonomy 分歧)
背景:两个同类盲区
gocell-web 有一类 referenced-but-undefined 符号 缺陷,能穿透 typecheck / vitest / build / lint 全部关卡,只有人工 review 能抓:
- i18n 缺键:
t('a.b.c') 引用了 message tree 里不存在的 key。vue-i18n(legacy:false)不对 key 做类型校验;组件 spec 用 identity t mock;en-US satisfies MessageSchema 只保证 zh/en 互相对齐,不保证组件引用的 key 存在。运行时静默渲染原始 key 字符串(坏文案 / 坏 aria-label 被读屏念出原始 key)。
- undefined CSS token:
var(--foo) 引用 tokens.css 不存在的变量,静默渲染空值(无颜色/无字号),同样穿透所有关卡。
两者是同一治理模式:单源真值(message tree / tokens.css)→ 消费点引用 → 引用未解析时无任何机制报错。
提议:Medium 档 AI-robust enforcement(CI assertion)
按 .claude/rules/gocellweb/ai-robust.md 载体决策原则 #4/#5,新增 CI step(构建期断言,Medium):
A. i18n 缺键检测
B. undefined CSS token 检测
- 扫
.vue/.scss 提取 var(--xxx)。
- 与
tokens.css :root 实际定义的变量集合比对(含 [data-theme=dark])。
- 非 token 的局部
--var(组件内自定义)走 allowlist 或按作用域排除。
- 断言 0 个引用 token 不存在。
盲区自检(Hard/Medium 前置举证,ai-robust.md §盲区自检)
- 两个检测器都要配反向自检测试:在当前合规代码上断言 0 命中(0 误报)。
- 文件顶部注释列出不覆盖的形态(如:动态拼接 key
t(\a.${x}`)、v-t指令、SCSS@each` 生成的 token 名)。
验收
参考
背景:两个同类盲区
gocell-web 有一类 referenced-but-undefined 符号 缺陷,能穿透
typecheck/vitest/build/lint全部关卡,只有人工 review 能抓:t('a.b.c')引用了 message tree 里不存在的 key。vue-i18n(legacy:false)不对 key 做类型校验;组件 spec 用 identitytmock;en-US satisfies MessageSchema只保证 zh/en 互相对齐,不保证组件引用的 key 存在。运行时静默渲染原始 key 字符串(坏文案 / 坏 aria-label 被读屏念出原始 key)。var(--foo)引用tokens.css不存在的变量,静默渲染空值(无颜色/无字号),同样穿透所有关卡。两者是同一治理模式:单源真值(message tree / tokens.css)→ 消费点引用 → 引用未解析时无任何机制报错。
提议:Medium 档 AI-robust enforcement(CI assertion)
按
.claude/rules/gocellweb/ai-robust.md载体决策原则 #4/#5,新增 CI step(构建期断言,Medium):A. i18n 缺键检测
t('<key>')/$t('...')引用。zh-CN.ts按缩进栈解析成完整点分 leaf 路径(注意:leaf 名碰撞如kind/label会让朴素 grep 误判,必须按嵌套层级解析)。B. undefined CSS token 检测
.vue/.scss提取var(--xxx)。tokens.css:root实际定义的变量集合比对(含[data-theme=dark])。--var(组件内自定义)走 allowlist 或按作用域排除。盲区自检(Hard/Medium 前置举证,ai-robust.md §盲区自检)
t(\a.${x}`)、v-t指令、SCSS@each` 生成的 token 名)。验收
develop上绿(0 既有违规,或先清理既有)参考
.claude/rules/gocellweb/ai-robust.md(三档分级 + 载体决策 + 盲区自检)