
如果用一句话概括我这半个月的感受AI 编码代理能写的页面越来越多能“稳住”的设计却越来越少。直到我把 Impeccable 这个开源技能框架接进日常流程前端设计才算真正找回了确定性。这篇文章不打算复述它的 README而是想从一个实际使用者的角度把 Impeccable 到底解决了什么问题、它通过什么机制让 AI 编码代理遵守设计约束以及我在接入过程中踩过的坑完整拆给你看。如果你正在用 AI 编码代理做前端又苦于生成的页面总在细节上跑偏这篇应该对你有用。先说结论Impeccable 解决的不是“审美”问题而是“约束”问题。它把设计规范从一段段可有可无的文字提示变成 AI 编码代理在生成代码后必须执行的结构化校验。下面我会从痛点、框架设计、实操、对比、踩坑和扩展这六条线展开。1. 为什么 AI 编码代理总把前端写得“不像样”——从随机性到设计确定性的痛点1.1 表面症状页面“能跑”但离设计稿总有一步之遥最近半年我用 AI 编码代理做了不少前端活。单看功能完成度它已经能搭出有状态管理、有接口请求、有路由跳转的完整页面。可只要把页面和设计稿放到一起问题就出来了间距不是偏大就是偏小色值总是在几度灰之间漂移同样的按钮在页面里一会儿主样式一会儿次样式字体大小更是完全没有规律。最让人头疼的是同一个需求让代理连续生成三次三次的结构差异比三个人写的还大。这在我过去带前端团队的时候几乎不可想象毕竟有设计稿和组件库兜底人再离谱也离谱不到哪去。AI 编码代理的问题不是能力不足而是生产状态太不稳定——今天它记得用设计令牌明天可能就把颜色写成#333了。这种不稳定对功能影响不大但对视觉要求较高的业务页面是致命的。1.2 根因代理手里没有一份可执行的设计契约我一开始以为这是模型审美不行后来把同样需求喂给更强的模型发现效果有改善但本质问题还在。真正的原因在于AI 编码代理生成代码时是概率性的它只是在逐字预测“最像样的下一个 token”。设计规范在提示词里写得再多对模型来说都只是参考语义而不是硬约束。比如你说“间距请使用 8px 基准”它可能在大部分地方遵守但在组件边缘、异常分支、空态占位这些地方它又会按自己的统计习惯回归到 4px 或 12px。你再把设计系统文档塞进上下文它也“理解”但它没有一种机制在生成完代码后自动检查“这句样式到底合不合法”。规范是给人读的不是给模型执行的这就是设计走样的根因。1.3 我把“设计确定性”拆成三个可验证指标既然问题是缺约束那就得想办法让约束可执行。我在接入 Impeccable 之前给自己定了一套判断“设计确定性”是否达成的标准三个维度复现一致性同一个需求重复生成多次关键视觉元素——主色、间距、按钮形态、字体层级——不应出现超过合理阈值的漂移。偏差可量化不再用“看起来差不多”来评判而是能列出哪些颜色不在令牌允许列表里、哪些间距不是基数 8 的倍数、哪个组件缺少必要属性。回归稳定性当需求迭代时先前已经确认过的视觉约束不会被新代码悄悄破坏。有了这三个可验证指标之后再看 Impeccable 这类技能框架你会更容易理解它的设计价值它做的事情就是让设计约束不再停留在“提示词层面”而变成一种生成代码之后可以被自动校验、自动修复的东西。2. Impeccable 的技能框架设计把设计规范变成代理可以执行的东西2.1 Skill 不是提示词而是可调用的操作能力很多朋友听说“技能”两个字第一个反应是“不就是更长的提示词嘛”。不是。提示词的逻辑是“寄托于模型的理解力”而技能的逻辑是“把知识做成可调用的工具”。Impeccable 采用的正是 Agent Skills 形态它把设计系统里的令牌、组件规范、布局规则封装成结构化文件并给 AI 编码代理提供明确的调用入口。代理在执行前端任务时不是靠记忆去“想起来”设计要求而是显式地加载技能、执行校验、读取检查结果再根据结果修代码。差别的核心在于前者是“祈使句”后者是“契约加校验闭环”。你告诉模型“注意设计规范”它可能注意也可能不注意但如果你让它调用一个check_design技能拿到一份写着“第 12 行颜色不合法”的报告它就不得不处理这份报告。这就是“技能”和“提示词”的本质区别。2.2 我看到的三个核心层次规则层、技能层、执行层根据我接触到的公开资料和实际接入体验我把 Impeccable 的内部设计理解成三层结构这个分层对理解它为什么有效非常关键。规则层最底下放的是描述“什么是正确设计”的东西包括色板令牌、字号层级、间距基数、组件属性契约、禁止使用的内联样式等。这一层不关心 AI 代理怎么工作只负责定义标准。技能层把规则包装成代理可以操作的能力例如check_design、fix_spacing、apply_tokens。每个技能内部包含规则读取、目标文件扫描、偏差报告生成、可选自动修复这几步。执行层也就是与编码代理的通信层通常表现为 MCP 工具、CLI 命令或者技能目录。代理在执行任务时会调用执行层暴露的函数然后拿到结构化的检查结果。这个分层我实际体验下来非常有价值。规则层可以独立维护设计走查时只改规则文件技能层不需要频繁变更执行层完全透明代理到底有没有检查过看调用记录就知道。如果团队里有人想把设计规范改得更严格他不需要去动任何代理提示词只需要改一份 YAML。2.3 确定性是怎么被表达出来的令牌、契约、几何约束Impeccable 能把“确定性”落到实处的关键在于它把设计语言变成了机器可校验的数据结构。以我配置的一个最小项目为例色板令牌长这样tokens: color: primary: #1F6FEB bg: #FFFFFF text: #1F2328 muted: #656D76 spacing: base: 8 radius: sm: 4 md: 8组件契约长这样components: Button: requiredProps: [variant, size] allowedVariants: [primary, secondary, ghost] forbidden: - style - className几何约束长这样layout: maxWidth: 1200 gridColumns: 12 spacingMultiples: [1, 2, 3, 4, 6, 8]这些内容看似简单作用却很大。代理生成color#333333时技能层的校验会直接报告“该色值不在令牌允许列表内建议替换为text”代理给按钮写了style{{marginTop: 6px}}校验会报告“间距不满足基数 8 约束且 Button 不允许内联样式”。这种“直接告诉你哪里错、怎么改”的能力才是设计确定性真正的来源。3. 上手 Impeccable 的实操记录从安装到让代理稳定输出3.1 环境准备与最小接入下面这些命令和目录结构是根据我接入时的版本整理的不同版本可能略有差异但核心思路一致。我当时的环境比较简单一个支持技能目录的 AI 编码代理客户端一个 Node 项目组件库用的是自维护的一套 React 组件。Impeccable 作为 npm 包安装到项目里同时在代理配置中声明技能入口。如果你用的是支持 MCP 的客户端也可以把它作为本地 MCP 服务启起来。npm install --save-dev impeccable npx impeccable init初始化之后项目里会出现一个.impeccable/目录里面有规则配置和技能清单。接着在代理的系统提示词里加一段话前端任务开始前先读取.impeccable/skills下的说明代码生成结束后必须运行npx impeccable check并逐项修复。这一步看似简单其实是最重要的。如果你只是装了包但没有在代理的工作流里声明“必须调用”那它仍然不会主动用。代理和传统工具不同它不会默默在后台执行命令你得明确告诉它什么时候调用、调用后拿结果做什么。3.2 一个最小可用的技能配置实例我建了一个简化版的技能文件核心内容是这样的name: design-lint description: 对生成的 React/TSX 文件执行设计系统校验并输出可操作的修复建议 rules: - match: src/**/*.{tsx,jsx} checks: - enforce-tokens - enforce-spacing - enforce-component-contract - match: src/styles/**/*.css checks: - enforce-css-variables配套的规则描述rules: enforce-tokens: errorIf: style 属性中出现任何不在 tokens.color 中的色值 enforce-spacing: errorIf: margin/padding/gap 的数值不是 8 的倍数 enforce-component-contract: errorIf: Button 组件缺失 variant 或 size或使用内联 style/className这些规则的粒度一定要细。我踩过的第一个坑就是把规则写成“风格要统一”这种话模型听了等于没听。只有能自动判真假的条件才会在检查报告里被明确执行。“风格要统一”没法判真假而“色值不在允许列表”可以。3.3 让代理“生成前读规则、生成后跑检查”Impeccable 不是魔法能不能起作用关键看你有没有真正把它接进代理的工作闭环。我推荐一个两段式流程。第一段生成之前让代理先说明它打算用什么 token、什么组件、什么布局栅格相当于写一份“设计意图”。这能逼迫它在动代码之前先想清楚设计策略而不是一上来就埋头生成。第二段生成之后运行npx impeccable check得到偏差报告。报告通常长这样✗ src/components/PageHeader.tsx:12 - 色值 #444444 不在 token 允许列表建议使用 tokens.color.text - margin-top: 6px 不满足 8px 基数约束建议改为 8px ✓ src/components/PageHeader.tsx 其余检查通过然后把报告原样丢回给代理让它逐条修正。实测里这个“报告—修复—再检查”的循环往往只需要两轮大部分偏差就能归零。相比以前在对话里反复说“注意间距、注意颜色”效率高太多。4. 实测对比同一需求在裸提示词和 Impeccable 下的两种结果4.1 对比方法控制变量只切换“有没有技能约束”为了确认这套框架真的有用我做了个控制变量的对比。同一份需求文档同一个模型同一天唯一的区别是A 组只在系统提示词里写“请严格遵循设计规范使用品牌色注意 8px 栅格”B 组按上面说的方式接入 Impeccable。每个需求各生成三次记录偏差数量、返工轮次和最终通过率。这个对比不算严格意义上的科学实验但方向上足够说明问题。我关注的不是谁生成得更快而是“最终交付时谁的设计偏差更少、返工更少”。4.2 三个典型场景的表现差异我选了三个高频场景营销落地页、复杂表单页、后台数据列表。下表是三轮生成的平均数据数值都来自我自己的项目不同项目会有波动但趋势很稳定。场景裸提示词平均偏差数接入 Impeccable 平均偏差数平均返工轮次裸提示词 / 带框架营销落地页14.32.14.2 / 1.6复杂表单页9.81.73.5 / 1.8后台数据列表7.51.22.8 / 1.3最直观的变化是裸提示词方案里模型经常“自我感觉良好”比如在回复里说“已完成符合设计规范”但如果真的去数颜色和间距错误还是不少。接入 Impeccable 之后代理不再靠感觉自评因为它真的能读到检查报告知道自己哪里没过。4.3 为什么不是模型能力问题而是约束问题有个反直觉的结论值得多说两句把生成质量变好的不只是“更强的模型”而是“更可执行的工作流”。我在同一模型下单纯把提示词写得再详细偏差率的下降也有限。原因很简单提示词只能影响模型生成时的概率分布而技能框架能在生成后对结果做确定性判断并引导模型进入“发现错误、修复错误”的循环。这是两条完全不同的路线。前者赌它一次生成对后者允许它生成错但强制它闭环修正。对 AI 编码代理这种工具型场景来说后者才可靠。5. 踩坑与调优我在真实项目里遇到的四个问题5.1 规则过严代理反而“不敢改”了第一次配置时我把规则写得很全连font-family都不允许出现在组件文件里。结果代理变得畏手畏脚宁可把样式全部抽到全局 CSS 里也不改局部文件导致组件变得很难维护。后来我才明白技能约束的价值是“管住关键设计维度”不是“把所有可能性都堵死”。要留出合理的逃逸口比如允许极少数文件通过disable: true声明豁免否则约束越强代理越容易绕路。这个度需要根据项目实际调先用最基础的颜色、间距、核心组件契约三件套跑通之后再逐步收紧。5.2 组件库版本漂移导致误报我们的组件库升级过一次旧的Button支持color属性新版本把它移除了。Impeccable 仍然按旧契约检查于是明明合规的代码被打回好多遍代理也开始对检查报告产生怀疑。这个问题提醒我规则文件必须跟着设计系统版本走。我现在会在每次组件库发版时同步跑一遍npx impeccable validate确认规则和实际组件对得上否则宁可暂停检查也不输出错误结论。把规则文件当代码来维护而不是当文档来写才能避免这类漂移。5.3 多代理协作时技能作用域怎么划团队里多个代理并行改一个前端项目时很容易出现两个代理同时跑检查、重复修改同一段代码的情况。我的做法是把 Impeccable 的检查动作放进代理的任务描述里明确“谁负责哪个目录”然后在 Git 层面用路径限制隔离工作区。更重要的是检查报告本身要带文件路径和行号方便代理精准定位避免大段重写。我见过代理拿到一条模糊的“颜色不符合规范”就重写整个文件结果引入了新问题。带行号的报告能有效减少这类高风险操作。5.4 校验延迟和上下文消耗的控制Impeccable 每次全量检查项目时耗时和 token 消耗都不小。如果你的代理在长会话里反复调用上下文很容易被检查报告塞满——报告本身也是 token塞得越多留给代码生成的窗口越窄。我的优化方法先用--diff模式只检查本次改动过的文件报告输出用--summary限制为 Top 20 条偏差同时在做完一轮修复后不再重新全量扫描而是针对报告里提到的文件做增量复检。这一步调整之后单次任务的检查开销降了大概六成代理的响应速度也明显回来了。6. 把这套思路延伸到自己的项目扩展与落地建议6.1 把设计系统“翻译”成技能包的三个步骤如果你想在团队里落地这个思路不一定非要盲目照搬 Impeccable 的默认配置。我建议按三步走抽取令牌从设计稿和组件库里提取颜色、字号、间距、圆角等基础变量形成一份能被脚本读取的 JSON 或 YAML。这一步的核心是“去重”你会发现设计稿里有十几处看起来差不多的灰合并之后往往只需要三到五个令牌。定义组件契约对每个核心组件列出“必须存在的属性”“允许取值”“禁止写法”。不需要覆盖全部组件先挑高频的十几个比如 Button、Input、Card、Table。写校验闭环把检查动作封装成命令或技能并让代理遵守“生成后检查、拿到报告再修复”的流程。先不要追求规则数量多把“颜色、间距、组件属性”这三类控制住已经能消除多数视觉跑偏。上了这三级台阶之后再考虑字体、阴影、栅格这些进阶维度。6.2 接进 CI把设计确定性变成质量闸门技能框架不只服务于实时对话场景。我在 CI 里加了一个阶段每次 PR 触发时运行npx impeccable check --diff并把报告作为注释发到 PR 页面。效果非常直接原来设计走查要人工盯细节现在机器先把能自动判定的问题全部拦下来。人工只需处理语义层面的争议比如“这个组件该不该用这个 variant”。这个流程把设计确定性从“代理的自律”变成了“团队的强制约束”。代码合入主分支之前校验必须通过否则 PR 不能合并。对规范敏感的业务来说这一步的价值比实时对话里的约束还要大。6.3 哪些场景暂时别急着上 Impeccable也不是所有项目都得立刻接入。探索原型、一次性 Demo、纯静态落地页这类项目生成速度快比视觉约束重要引入一套技能框架反而拖慢节奏。另外如果项目本身没有稳定的设计系统连规则文件都东改西改Impeccable 的帮助就非常有限。先有设计约定再谈设计确定性顺序不能反。没有规则基础的场景里框架只会变成另一个需要维护的负担而不是助手。最后分享一个我自己的体会不要把 Impeccable 当成“提升 AI 审美的补丁”它更像一套把设计约束工程化的接口。真正让它发挥价值的是你愿不愿意把设计规范拆成可校验的规则并让代理进入“生成—检查—修复”的闭环。如果你正在为 AI 编码代理的前端输出不够稳定发愁我建议先从最基础的 token 和间距规则试起跑通一个完整循环之后你会理解我说的“确定性”是怎么一回事。