跳到主要内容

你的设计系统曾是文档,现在它需要成为一个编译器

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的设计系统在过去十年中得以幸存,是因为人类吸收它的速度很慢。新入职的工程师通过 Figma 文件、PR 里的细节纠错,以及那个总能揪出错误灰色阴影的设计师来学习组件变体。这种吸收流水线的吞吐量大约是每位工程师每周几个组件——速度慢到足以让设计团队手动把控边缘情况。

编程智能体刚刚打破了这条流水线。一个智能体集群可以在午饭前生成 50 个稍有偏差的按钮:每一个看起来都挺合理,但每一个使用的十六进制值可能差了两个色阶,内边距可能是 14px 而非你规范中的 16px 阶梯,圆角则是随手捏造的。没有哪个设计师能跟上这种评审速度。而你首先想到的指令——在系统提示词中加入“遵循样式指南”——会像所有其他软性指令一样逐渐失效:随着上下文窗口被填满,它的统计权重会下降,模型会退回到它从数百万个其他代码库中学到的通用 CSS 模式。

解决方案不是写更好的提示词。而是一次类别转变:你的设计系统必须停止作为供人类解读的“文档”,转而成为由机器执行的“契约”。文档只是请求,而编译器则是拒绝。

为什么“遵循样式指南”会输给你的代码库

这种失效模式值得精确理解,因为它预示了哪些修复手段有效。

智能体对“示例”的权重高于“指令”。当智能体编写新组件时,它会搜索工作区寻找类似的代码并模仿它。如果你的规则文件说“始终使用语义化 Token”,但最近的三个文件都硬编码了十六进制值,那么十六进制值会胜出——生产代码被视为权威标准,而你的规则被视为愿景。在一个拥有两次未完成迁移且旧组件库仍可导入的旧代码库(brownfield repo)中,智能体看到的不是一个设计系统。它看到了三个,并从所有系统中进行采样。

这就是为什么提示词层面的约束会以一种近乎针对个人的方式失效。在新会话中生成的第一代代码遵循规则。二十次工具调用之后,由于上下文窗口充满了文件内容和终端输出,规则在统计博弈中败下阵来。一位从业者的总结非常到位:设计系统是确定性的,LLM 是概率性的,这种不匹配必须在某个地方得到解决。如果你在提示词中解决它,你得到的是近似值。如果你在工具链中解决它,你得到的是精确值。

还有一种二阶效应让情况变得比普通的样式偏离更糟糕。智能体交付的每一个稍有错误的按钮,都会成为下一个智能体的示例。偏离是会累加的:代码库即提示词,你正在一次又一次的合并中污染它。

品牌偏离是前端的模式偏离

数据工程师已经给这种失效形式起好了名字:模式偏离(Schema drift)。一个团队重命名了一列,另一个团队的流水线默默地读取了过时的语义,没有任何东西发生剧烈崩溃——只是一个季度后仪表盘悄悄变错了。模式偏离在单次变更中是不可见的,但在总体上是显而易见的。

品牌偏离的原理完全相同。没有一个智能体生成的 diff 看起来是错的。评审员扫一眼 color: #3B82F6,并不知道你的 Token 系统将 brand-primary 解析为 #2563EB;截图里的蓝色看起来没问题。14px 的内边距通过了评审,因为没人能背下所有的间距规范。每个 diff 都是一个舍入误差。直到有人把六个月的截图并排放在一起,产品看起来就像是由六家不同的公司构建的一样——因为事实上确实如此:它们是跨越六个不同上下文窗口的六次采样运行结果。

数据领域对模式偏离的回答不是“写更好的模式文档”,而是“契约”:在违反时会导致构建失败的机器校验协议。前端也需要同样的转变,而且原材料已经存在——你只需要停止将它们仅仅视为参考资料。

Token 是唯一的入口,而非推荐的路径

执行栈有三个层级,按绕过的难易程度排序。这三层的共同模式是:将每个约定转化为在构建时会产生剧烈失败的东西,因为智能体对剧烈失败有反应——编译错误会反馈到智能体的循环中并迫使其立即修正,而违反样式指南的行为则会在三周后出现在设计师的待办事项中。

让 Token 成为设计值的唯一导入来源。 不仅仅是文档化的来源,而是唯一的来源。原始的颜色和间距值不应该在应用代码中表达。具体做法:通过 lint 规则禁用十六进制字面量和任意像素值(stylelint-declaration-strict-value 禁止 CSS 中的原始颜色;ESLint 规则在 JS/TS 样式对象中标记它们),并限制导入,使旧组件库变成编译错误而非弃用选项。带有指向推荐路径消息的 no-restricted-imports 在这里起到了双重作用——错误消息本身就是在智能体最需要的那一刻注入的提示词,这值得仔细编写:“不要从 legacy/ui 导入。请使用 @acme/design-system”。这比规则文件中的任何段落都能更好地引导,因为它出现的时机完美,且没有竞争上下文。

使非系统内的 UI 在类型系统中无法表达。 宽松的属性接口(prop interfaces)是产生幻觉的温床:如果 Button 接受任意的 color 字符串,智能体就会传入任意的颜色字符串。使用枚举了合法变体的辨识联合(Discriminated unions),可以将“凭空捏造第四种按钮样式”从一条评审意见转变为一个类型错误。这是最深的一层,因为它不检查输出——它缩小了可表达程序的空间,使无效的程序根本无法存在。

标准化 Token 格式本身。 设计 Token 社区小组(Design Tokens Community Group)在历经近十年的草案后,发布了第一个稳定规范 (2025.10) —— 这是一个供应商中立的格式,包含主题、别名和现代色彩空间,已得到 Figma、Tokens Studio、Style Dictionary 和许多其他工具的支持。这对智能体来说比对人类更重要。人类可以肉眼观察自定义的 Token 文件;但在跨越 Figma 到代码流水线的智能体,受益于在设计工具、Token 转换器和代码库之间无损循环的 Token。标准格式也让像 Figma 的 MCP 服务器这样的工具能为智能体提供实时设计上下文——从文件中提取真实的 Token 名称和真实的组件映射,而不是让模型去猜测你可能给主色起了什么名字。

来自做得好的团队的一个架构细节:将原始 Token(底层的 #1E3A8A 值)完全排除在智能体可触达的词汇表之外。智能体应该只看到语义化 Token——color-background-button-primaryspacing-card-inset。如果一个原始值是可导入的,它最终就会被导入。你的设计团队已经构建的三层体系(原始值 → 语义化 → 组件 Token)证明了它不仅是一个组织上的讲究,更是一个访问控制边界。

难以硬性化的部分——以及如何防止它们腐烂

并非所有内容都能编译。组合规则(例如“不要在卡片中嵌套卡片”)、空状态的语气、何时使用弹窗(modal)还是抽屉(drawer)——这些都取决于判断,而目前它们存在于文本描述中:规则文件、黄金示例、评审记录。

有两件事可以防止这个“软性层”腐烂。第一,让示例可执行。一个包含生产级、可编译组件的 design-system/examples/ 目录,胜过任何文字描述,因为智能体(agent)模仿代码的忠实度远高于遵循指令的程度——而且当 API 发生变化时,示例会显性地报错,而文本描述则会在无声无息中过时。同样的原则也体现在每一份严肃的智能体编码指南中:具体的正误对比示例比抽象规则更有效,而一个黄金标准的参考文件就像是一场端到端测试,验证你的指南是否真的能被解析。

第二,将每一个进入评审阶段的违规行为,都视为强制执行层(enforcement layer)的 bug,而不只是代码差异中的错误。智能体写了一个原始的十六进制数值并合并了?有趣的问题不在于“是哪个智能体写的”,而在于“为什么 linter 没有捕获到它”。每一次漏网都是一个信号,提示你应该强化哪条规则。随着时间的推移,软性层应该不断缩小,因为其中最常被违反的规则会晋升为 lint 规则和类型。这种晋升路径就是维护模型:设计系统之所以能保持活力,不是因为有人更新了 Wiki,而是因为强制执行面像测试套件一样不断累积。

注意这对设计评审本身意味着什么。当机械层实现自动化——token 强制执行、变体(variants)类型检查、导入受限——人工评审就不再是“寻找十六进制代码”,而是回归到它原本应有的样子:这个页面逻辑通顺吗?流程连贯吗?这个组件用得对吗?带有严格护栏的智能体并不会削弱设计判断力;相反,它们最终为设计判断腾出了空间。

结论

一个扎心的事实是:如果你的设计系统不能让构建失败,那么你拥有的不是设计系统,而是一个带有治理委员会的情绪板(mood board)。当唯一的 UI 生产者是参加过你入职培训的人类时,这尚且可以维持。但当组织中 UI 代码的中坚生产者是一个从未见过你的 Figma 文件、并且在统计学上倾向于训练数据中占主导地位的 Tailwind 默认值的模型时,这就难以为继了。

工作是具体且大多乏味的,但这正是好消息。找出出现偏差频率最高的因素——通常是颜色——并在本个 sprint 中将原生数值(raw values)标记为 lint 错误。限制旧版导入,并提供包含替代方案名称的错误提示,因为那个提示词是你所能写出的时机最恰当的 prompt。收紧你那五个生成频率最高的组件的 prop 类型。建立一个黄金示例目录,并将你的智能体配置指向它。在下次调整 token 流水线时采用 DTCG 格式,这样设计工具到代码的链路就可以闭合,而无需人工转录数值。

这些都不是新机制——linter、类型和 token 已经存在多年。新的是经济逻辑。强制执行曾经需要与开发者的好感度竞争;严格对于你信任的人来说是一种摩擦。智能体反转了这一点:它们不反感护栏,反而是在护栏之内茁壮成长,并且会悄无声息地破坏任何非强制性的约定。能在智能体时代生存下来的设计系统,将是那些不再奢求被遵循,而是开始拒绝被违反的系统。

References:Let's stay in touch and Follow me for more thoughts and updates