Skip to content

[AI-robust] CI guard:i18n 缺键 + undefined CSS token 检测(referenced-but-undefined 盲区) #38

Description

@ghbvf

intended priority/p2 · pkg/tooling(仓库缺 priority/_ 与 pkg/_ label,见前端 label taxonomy 分歧)

背景:两个同类盲区

gocell-web 有一类 referenced-but-undefined 符号 缺陷,能穿透 typecheck / vitest / build / lint 全部关卡,只有人工 review 能抓:

  1. 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)。
  2. undefined CSS token:var(--foo) 引用 tokens.css 不存在的变量,静默渲染空值(无颜色/无字号),同样穿透所有关卡。
    • 已有 ADR/memory 记录为候选规则。

两者是同一治理模式:单源真值(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 名)。

验收

  • CI 在植入一个假缺键 / 假 undefined-token 时变红
  • CI 在当前 develop 上绿(0 既有违规,或先清理既有)
  • 反向自检测试随检测器提交,合规代码 0 命中
  • 误报率 > 5% 时提供豁免机制(ai-robust.md review checklist #5)

参考

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestfrontend前端 gocell-web

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions