1. 从"impeccable"说起:一个前端设计质量守门员的诞生
第一次看到"impeccable"这个词,是在一个前端团队的内部工具列表里。当时我以为是某个代码格式化工具的别名,点进去才发现,这是一个专门给 AI coding agents 做前端设计质量校验的 CLI 工具,同时配套了一个浏览器扩展。它的定位很明确:当 AI 帮你写完一段前端代码之后,谁来保证这段代码渲染出来的界面是"无懈可击"的?
这个问题在 2024 年下半年开始变得特别尖锐。codex cli、claude code、cursor 这类 AI coding agents 已经能独立完成相当复杂的前端页面生成,但生成质量和设计质量之间有一道巨大的鸿沟。代码能跑,不代表界面能看。间距不一致、颜色对比度不达标、响应式断点错乱、可访问性标签缺失——这些问题 AI 自己不会主动检查,人眼又容易漏掉。impeccable 就是在这个缝隙里长出来的工具。
它解决的核心问题可以拆成三层:第一层是静态代码层面的设计规范校验,比如 Tailwind 类名是否冲突、CSS 变量是否被正确引用;第二层是运行时渲染层面的视觉校验,通过浏览器扩展抓取真实 DOM 和计算样式,检查间距、对齐、对比度;第三层是AI agent 工作流集成,让 codex cli、zcode cli 这类工具在生成代码后自动调用 impeccable 做一轮质检,把问题反馈回 agent 让它自己修。
适合读这篇的人有三类:一是正在用 AI coding agents 做前端开发、但被生成质量困扰的工程师;二是想给自己的 CLI 工具链加一道设计质检关卡的技术负责人;三是对 browser extension 和 CLI 协同工作模式感兴趣的工具开发者。不管你用的是 codex cli 还是 trae cli,只要你的工作流里有"AI 生成前端代码"这个环节,impeccable 的思路都值得参考。
我花了大概两周时间把 impeccable 的 CLI 和浏览器扩展都跑通,并接进了自己的 codex cli 工作流。下面把整个设计思路、核心实现、实操步骤和踩过的坑完整拆一遍。
2. 整体设计思路:为什么是"CLI + 浏览器扩展"双形态
2.1 纯 CLI 方案的死穴在哪里
最开始我想的是,能不能只用一个 CLI 工具搞定所有检查?毕竟 codex cli、gitlab cli 这些工具已经证明了命令行形态的威力。但实际做下来发现,纯 CLI 做前端设计校验有一个绕不过去的死穴:它看不到真实渲染结果。
你可以用静态分析解析 JSX 或 Vue 模板,提取出 className、style 属性,然后跟一套设计 token 做比对。但问题是,现代前端框架的样式来源太分散了——Tailwind 的原子类、CSS-in-JS 的动态样式、组件库的默认样式、浏览器默认样式,这四层叠加之后,最终渲染出来的效果跟静态代码里看到的完全不是一回事。举个最简单的例子,一个margin-top: 16px的元素,如果它的父容器有display: flex加上gap: 8px,实际视觉间距就是 24px,静态分析根本算不出来。
更麻烦的是响应式。一个组件在 375px 宽度下可能完美,到 768px 就崩了。纯 CLI 没有视口概念,没法模拟不同断点下的渲染结果。我试过用 jsdom 做服务端渲染再测量,但 jsdom 的布局引擎是残缺的,getBoundingClientRect返回的全是 0,根本没法用。
所以结论很明确:设计质量校验必须建立在真实浏览器渲染之上。这就是浏览器扩展存在的理由。
2.2 浏览器扩展负责"看",CLI 负责"判"和"改"
impeccable 的双形态分工是这样的:
- 浏览器扩展:注入到页面里,抓取真实 DOM 树、计算样式(
getComputedStyle)、元素几何信息(getBoundingClientRect)、可访问性树(Accessibility Tree)。它不做判断,只负责采集原始数据,通过本地 WebSocket 或 HTTP 把数据吐给 CLI。 - CLI:接收扩展传来的渲染数据,加载项目里的设计规范配置(design tokens、间距系统、颜色系统、断点定义),跑一套规则引擎,输出问题列表。同时 CLI 还负责跟 AI coding agents 集成,把问题以 agent 能理解的格式反馈回去。
这个分工的好处是:扩展端保持轻量,不需要内置任何业务规则,换项目只需要换 CLI 的配置文件;CLI 端可以复用现有的 lint 生态,规则用插件形式组织,团队可以自己写规则。
提示:扩展和 CLI 之间的通信建议走本地回环地址的 WebSocket,端口固定但可配置。不要用 postMessage 跨窗口通信,因为扩展的 content script 和页面脚本处于隔离环境,调试起来非常痛苦。
2.3 为什么不做成纯浏览器扩展
有人会问,既然渲染数据都在浏览器里,为什么不干脆把规则引擎也塞进扩展,做成一个纯扩展工具?我一开始也这么想过,但很快否掉了,原因有三个。
第一,规则配置需要读项目文件。设计 token 通常存在tailwind.config.js、tokens.json或者 CSS 变量文件里,浏览器扩展没有文件系统访问权限,读不到这些配置。你可能会说可以用扩展的 storage,但那意味着每次改配置都要手动同步一遍,工程上不可接受。
第二,AI agent 集成需要进程间通信。codex cli、zcode cli 这些工具跑在终端里,浏览器扩展没法直接跟它们对话。必须有一个 CLI 进程作为中间人,才能把校验结果喂回给 agent。
第三,CI 环境需要无头运行。团队协作场景下,设计校验要能进 CI 流水线。CI 里没有浏览器扩展,但可以有 headless Chrome 加 CLI。所以 CLI 是必须存在的形态,扩展只是它的一个数据采集前端。
2.4 与 AI coding agents 的集成点设计
impeccable 最有价值的部分,是它跟 AI coding agents 的集成方式。这里我参考了 codex cli 的/compact、/model、/resume这套命令体系的设计哲学:agent 需要的是结构化的、可操作的反馈,而不是一堆报错。
具体来说,impeccable 输出给 agent 的问题报告包含四个字段:
| 字段 | 说明 | 示例 |
|---|---|---|
| selector | 问题元素的选择器路径 | main > section.hero > button.cta |
| rule | 触发的规则 ID | spacing/consistent-scale |
| actual | 实际测量值 | margin-top: 13px |
| expected | 期望值 | margin-top: 16px (scale-4) |
agent 拿到这个结构后,能直接定位到代码里对应的元素,把13px改成16px。如果只给一句"间距不一致",agent 就得自己去猜哪里不一致、该改成多少,效率差很多。
这套反馈格式我是从 codex cli 的 remotion 集成案例里学来的——那个案例里 agent 生成动画代码后,会拿到一份带具体帧数和属性值的反馈,然后自己修正。设计校验也是同样的逻辑。
3. 核心细节解析:规则引擎与数据采集的关键实现
3.1 设计 token 的加载与归一化
规则引擎的第一件事是把项目里的设计规范读进来,归一化成统一的内部表示。这一步看起来简单,实际坑很多,因为不同项目的 token 来源五花八门。
我处理过的来源包括:Tailwind 配置里的theme.spacing、theme.colors;独立的design-tokens.json(W3C Design Tokens 格式);CSS 自定义属性(--space-4: 16px);甚至还有 Figma 导出的 token 文件。impeccable 的做法是写一组 loader,每种来源对应一个 loader,统一输出成这样的结构:
{ spacing: { '0': 0, '1': 4, '2': 8, '3': 12, '4': 16, '6': 24, '8': 32 }, colors: { primary: '#3b82f6', danger: '#ef4444', ... }, radii: { sm: 4, md: 8, lg: 16 }, breakpoints: { sm: 640, md: 768, lg: 1024, xl: 1280 } }归一化的关键是单位统一。Tailwind 的 spacing 是数字(代表 0.25rem 的倍数),CSS 变量可能是16px也可能是1rem,Figma 导出可能是16(无单位)。我统一转成 px 数值,rem 按 16px 基准换算。这个基准值要可配置,因为有些项目把根字号设成了 14px 或 10px。
注意:换算基准一定要跟项目实际的
html { font-size }一致。我踩过一次坑,项目根字号是 10px(为了方便计算),但 impeccable 默认按 16px 换算,导致所有 rem 值都算错了 60%,报了一堆假问题。
3.2 间距一致性规则的实现逻辑
间距一致性是前端设计里最容易出问题、也最值得自动化的部分。人眼对 4px 和 8px 的差异不敏感,但对"这个卡片内边距是 13px 那个是 16px"这种不一致极其敏感。AI 生成代码时特别容易犯这个错,因为它不知道你的间距系统是 4 的倍数。
impeccable 的间距规则实现分三步:
第一步,从渲染数据里提取所有元素的margin、padding、gap计算值。注意要取getComputedStyle的结果,而不是样式表里的声明值,因为后者可能被覆盖。
第二步,把每个值跟 spacing scale 做匹配。匹配逻辑不是精确相等,而是允许一个容差(默认 1px),因为浏览器子像素渲染会产生15.99px这种值。匹配到 scale 里的值就通过,匹配不到就标记为"off-scale"。
第三步,做上下文一致性检查。这是精髓所在:同一层级的兄弟元素,如果它们的间距值不一致,即使每个值都在 scale 上,也要报警。比如一个列表里,第一项的margin-bottom是 16px,第二项是 24px,虽然两个值都合法,但视觉上就是乱的。
// 上下文一致性检查的简化逻辑 function checkSiblingConsistency(elements) { const groups = groupByParent(elements); for (const [parent, children] of groups) { const margins = children.map(c => c.computedStyle.marginBottom); const unique = [...new Set(margins)]; if (unique.length > 1) { report({ rule: 'spacing/sibling-consistency', selector: parent, actual: unique, expected: '所有兄弟元素间距一致' }); } } }3.3 颜色对比度的计算与阈值
可访问性里的颜色对比度是硬指标,WCAG 规定正文文本对比度至少 4.5:1,大号文本至少 3:1。这个计算有标准公式,但实现时要注意几个细节。
对比度公式是(L1 + 0.05) / (L2 + 0.05),其中 L 是相对亮度。相对亮度的计算需要先把 sRGB 值做伽马校正:
function relativeLuminance(r, g, b) { const [rs, gs, bs] = [r, g, b].map(c => { c = c / 255; return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4); }); return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs; }坑在于背景色的确定。一个文本元素的背景可能是透明的,实际背景来自祖先元素。你需要向上遍历 DOM 树,找到第一个非透明背景色。如果一路到根都是透明,就用白色(或配置的默认背景)。更复杂的情况是背景是渐变或图片,这时候对比度计算就没意义了,impeccable 会跳过并给出提示。
还有一个容易忽略的点:文本大小影响阈值。WCAG 定义的大号文本是 18pt(24px)以上,或者 14pt(18.66px)以上且加粗。所以规则引擎要先读font-size和font-weight,再决定用 4.5 还是 3.0 的阈值。
3.4 响应式断点校验的实现
响应式校验是浏览器扩展价值最大的地方。CLI 单独做不到,因为它没法改变视口宽度重新渲染。
impeccable 扩展的做法是:在页面里创建一个隐藏的 iframe,把当前页面 URL 加载进去,然后通过 CDP(Chrome DevTools Protocol)或者扩展的chrome.debuggerAPI 修改 iframe 的视口尺寸,逐个断点采集渲染数据。每个断点采集完,跑一遍溢出检测和布局错乱检测。
溢出检测的逻辑是:遍历所有元素,检查scrollWidth > clientWidth或scrollHeight > clientHeight。如果溢出且overflow不是hidden或scroll,就报"内容溢出"。这个规则能抓到大量 AI 生成的响应式 bug,因为 AI 经常忘记给长文本加truncate或break-words。
function detectOverflow(root) { const issues = []; const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT); let node; while (node = walker.nextNode()) { const style = getComputedStyle(node); if (style.overflow === 'visible') { if (node.scrollWidth > node.clientWidth + 1) { issues.push({ selector: pathOf(node), axis: 'horizontal' }); } if (node.scrollHeight > node.clientHeight + 1) { issues.push({ selector: pathOf(node), axis: 'vertical' }); } } } return issues; }提示:溢出检测的容差设 1px 而不是 0,因为子像素渲染经常产生 0.5px 级别的误差,容差太小会报大量假阳性。
3.5 与 codex cli 工作流的对接方式
把 impeccable 接进 codex cli 的工作流,是整个方案里最提效的一环。我的做法是写一个 shell 包装脚本,让 codex cli 在完成代码生成后自动触发校验。
codex cli 本身支持在任务完成后执行自定义命令(类似 git hook 的思路)。我在项目根目录放了一个.impeccable/hook.sh:
#!/bin/bash # 在 codex cli 生成代码后触发 impeccable check --format=agent --output=.impeccable/last-report.json if [ $? -ne 0 ]; then echo "设计校验未通过,报告已生成,请根据报告修正" cat .impeccable/last-report.json fi然后 codex cli 会读到这份报告,在下一轮对话里自动修正。实测下来,一轮修正能解决 70% 左右的问题,两轮能到 90%。剩下的 10% 通常是需要人工判断的设计决策,比如"这个间距到底该用 16 还是 24",agent 没法替你决定。
这里有个技巧:报告里除了actual和expected,最好再加一个suggestion字段,给出具体的修改建议(比如"把mt-[13px]改成mt-4")。agent 拿到带建议的报告,修正准确率明显更高。
4. 实操过程:从零跑通 impeccable 的完整步骤
4.1 环境准备与 CLI 安装
先说环境要求。impeccable CLI 是 Node.js 写的,需要 Node 18 以上。浏览器扩展目前只支持 Chromium 内核(Chrome、Edge、Brave),Firefox 版本还在开发中。
安装 CLI 有两种方式,全局装或者项目内装。我推荐项目内装,因为不同项目的规则配置可能不一样,全局装容易串。
# 项目内安装 npm install -D impeccable-cli # 或者用 pnpm pnpm add -D impeccable-cli # 验证安装 npx impeccable --version装完之后初始化配置:
npx impeccable init这个命令会在项目根目录生成.impeccable/目录,里面包含config.json(主配置)、rules/(自定义规则目录)、tokens.json(设计 token,如果没检测到现有 token 文件的话)。
config.json的默认内容长这样:
{ "tokens": { "source": "auto", "rootFontSize": 16 }, "rules": { "spacing/consistent-scale": "error", "spacing/sibling-consistency": "warn", "color/contrast": "error", "responsive/overflow": "error", "a11y/label-required": "error" }, "ignore": ["node_modules/**", "dist/**"], "breakpoints": [375, 768, 1024, 1440] }tokens.source设成auto时,CLI 会自动探测项目里的 token 来源。探测顺序是:tailwind.config.*→tokens.json→src/styles/variables.css。如果都找不到,就用一套内置的默认 token(基于 4px 基准的间距系统)。
4.2 浏览器扩展的加载与配对
扩展的安装走开发者模式加载。从 impeccable 的 release 页面下载extension.zip,解压到一个固定目录,然后在 Chrome 的chrome://extensions里打开开发者模式,点"加载已解压的扩展程序",选中解压目录。
加载成功后,扩展图标会出现在工具栏。点开图标,会看到一个配对界面,显示一个六位数的配对码。回到终端,运行:
npx impeccable pairCLI 会提示你输入配对码。输入后,CLI 和扩展就通过本地 WebSocket 建立了连接。这个配对只需要做一次,配对信息存在扩展的 storage 和 CLI 的本地配置里。
注意:配对码有时效性,默认 5 分钟过期。如果超时了,重新点扩展图标生成新的配对码即可。我踩过一次坑,配对码过期了但 CLI 没提示,一直卡在"等待连接",后来看日志才发现是过期了。
配对成功后,在浏览器里打开你要校验的页面(本地开发服务器或者线上页面都行),点扩展图标,选"开始采集"。扩展会注入采集脚本,把渲染数据通过 WebSocket 发给 CLI。CLI 收到数据后跑规则引擎,结果直接打印在终端。
4.3 设计 token 的配置与校准
token 配置是决定校验准确率的关键。如果你的项目用 Tailwind,CLI 会自动读tailwind.config.js的theme字段。但有几个地方需要手动校准。
第一是间距基准。Tailwind 默认的 spacing scale 是0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24...,对应0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96px。如果你的项目自定义了 scale,要确保 CLI 读到的跟实际一致。可以在config.json里显式覆盖:
{ "tokens": { "spacing": { "0": 0, "1": 4, "2": 8, "3": 12, "4": 16, "5": 20, "6": 24, "8": 32, "10": 40, "12": 48 } } }第二是颜色系统。如果你的项目用了 CSS 变量做主题色,CLI 读不到变量的实际值(因为变量在运行时才解析)。解决办法是在tokens.json里手动列出颜色值,或者让扩展在采集时把getComputedStyle解析后的颜色值一起传回来。impeccable 默认走后者,所以颜色对比度检查是准的。
第三是断点定义。config.json里的breakpoints数组要跟项目实际的媒体查询断点一致。Tailwind 默认是640, 768, 1024, 1280, 1536,但很多项目会自定义。断点配错了,响应式校验就白做了。
4.4 跑一次完整校验并解读报告
配置好之后,跑一次完整校验:
npx impeccable check --url=http://localhost:3000 --breakpoints=all--url指定要校验的页面,--breakpoints=all表示跑所有配置的断点。CLI 会依次在每个断点下采集数据、跑规则,最后输出一份汇总报告。
报告默认是表格格式,长这样:
┌─────────────────────────────────────┬──────────┬──────────────┬──────────────┐ │ Selector │ Rule │ Actual │ Expected │ ├─────────────────────────────────────┼──────────┼──────────────┼──────────────┤ │ main > .hero > button.cta │ spacing │ 13px │ 16px │ │ main > .features > .card:nth(2) │ spacing │ 24px │ 16px │ │ footer > .links > a │ contrast │ 3.2:1 │ 4.5:1 │ │ header > nav │ overflow │ 溢出 12px │ 无溢出 │ └─────────────────────────────────────┴──────────┴──────────────┴──────────────┘解读报告时要注意优先级。error级别的问题必须修,warn级别的看情况。我一般先修对比度和溢出,这两个是硬伤;间距问题批量修,因为往往是一个模式重复出现。
报告还支持--format=json输出,方便接进 CI 或者喂给 agent。JSON 格式就是前面说的四字段结构,agent 友好。
4.5 接入 CI 流水线
CI 里跑 impeccable 需要 headless 模式。CLI 内置了 Puppeteer,可以自己启动 headless Chrome 采集数据,不依赖浏览器扩展。
npx impeccable check --headless --url=http://localhost:3000 --fail-on=error--fail-on=error表示有 error 级别问题时退出码非零,CI 就会失败。如果只想警告不阻断,用--fail-on=none。
CI 配置示例(GitHub Actions):
- name: Design Quality Check run: | npm run build npm run start & npx wait-on http://localhost:3000 npx impeccable check --headless --url=http://localhost:3000 --fail-on=error提示:headless 模式下响应式校验会慢一些,因为每个断点都要重新加载页面。如果页面加载慢,可以加
--timeout=60000延长超时。我遇到过页面有大量图片导致采集超时的情况,后来把图片懒加载打开就好了。
5. 常见问题与排查技巧实录
5.1 扩展连不上 CLI 的排查顺序
这是最高频的问题。排查按这个顺序走:
- 检查 CLI 是否在运行。
impeccable pair或impeccable check命令必须处于运行状态,扩展才能连上。很多人以为配对一次就永久有效,其实每次校验都需要 CLI 进程活着。 - 检查端口占用。默认端口是 3717,如果被占用,CLI 会启动失败。用
lsof -i :3717查一下,或者改配置换端口。 - 检查扩展权限。扩展需要
activeTab、scripting、storage三个权限。如果手动改过 manifest,可能权限丢了。 - 检查页面是否在允许列表。扩展默认只对
localhost和配置的域名生效,线上页面需要在扩展设置里手动加白名单。
5.2 假阳性问题的过滤策略
规则引擎跑久了,一定会遇到假阳性。比如某个元素的间距是 13px,但它其实是第三方组件库的默认样式,你改不了。这种问题报出来只会干扰视线。
impeccable 提供了三种过滤机制:
- ignore 配置:在
config.json的ignore数组里加选择器模式,比如".third-party-widget *"。 - 行内注释:在代码里加
/* impeccable-disable-next-line */,类似 ESLint 的 disable 注释。 - 规则级豁免:某些规则对某些文件不适用,可以在
rules配置里按 glob 模式豁免。
我一般优先用行内注释,因为它的作用范围最精确,不会误伤。ignore 配置容易写得太宽,把真问题也过滤掉了。
5.3 响应式校验的性能优化
响应式校验是性能大户,因为每个断点都要重新渲染。一个 5 个断点的页面,采集时间可能是单断点的 5 倍。优化手段有几个:
| 优化手段 | 效果 | 代价 |
|---|---|---|
| 只跑关键断点 | 减少 50% 时间 | 可能漏掉中间断点的问题 |
| 复用页面实例 | 减少 30% 时间 | 需要处理状态残留 |
| 并行采集 | 减少 60% 时间 | 内存占用翻倍 |
| 增量校验 | 减少 80% 时间 | 需要缓存机制 |
我一般用"只跑关键断点 + 增量校验"的组合。关键断点选 375、768、1440 三个,覆盖移动、平板、桌面。增量校验是只对改动的文件对应的组件做校验,需要 CLI 支持文件监听。
5.4 与 AI agent 协作时的反馈循环控制
把 impeccable 接进 codex cli 工作流后,最大的风险是无限循环。agent 改了一版,校验还是不过,再改,还不过,来回烧 token。
控制循环的手段是设最大轮次。我在 hook 脚本里加了计数器:
COUNT_FILE=.impeccable/.fix-count COUNT=$(cat $COUNT_FILE 2>/dev/null || echo 0) if [ $COUNT -ge 3 ]; then echo "已达最大修正轮次,请人工介入" exit 1 fi echo $((COUNT + 1)) > $COUNT_FILE三轮还修不好的问题,基本是 agent 理解不了的,继续循环也是浪费。这时候把报告打出来人工看,往往一眼就能发现是配置问题还是真问题。
5.5 常见问题速查表
| 现象 | 可能原因 | 解决方向 |
|---|---|---|
| 扩展图标灰色不可点 | 页面未加载完或权限不足 | 刷新页面,检查扩展权限 |
| 校验结果为空 | 采集脚本未注入 | 检查页面 CSP 是否阻止了脚本注入 |
| 间距全部报错 | token 基准配错 | 核对 rootFontSize 和 spacing scale |
| 对比度误报 | 背景是渐变或图片 | 在 ignore 里排除该选择器 |
| 响应式只跑了一个断点 | breakpoints 配置未生效 | 检查 config.json 路径是否正确 |
| agent 不修正问题 | 报告格式 agent 读不懂 | 改用--format=agent输出 |
| CI 里超时 | 页面加载慢 | 加--timeout,优化页面加载 |
6. 我踩过的坑和几条实操心得
第一个坑是token 探测的优先级。impeccable 默认先读 Tailwind 配置,但如果项目同时有 Tailwind 和 CSS 变量,且两者不一致,就会以 Tailwind 为准。我有个项目 Tailwind 配置是旧的,CSS 变量才是实际生效的,结果校验全错。后来在config.json里显式指定tokens.source: "css-variables"才解决。所以如果你的项目有多套 token 来源,一定要显式指定用哪套。
第二个坑是动态样式的采集时机。有些页面在加载后会有动画或延迟渲染,如果采集太早,拿到的是初始状态。impeccable 默认在load事件后 500ms 采集,但有些页面需要更久。可以在配置里加waitFor选项,指定一个选择器,等这个选择器出现后再采集。
第三个心得是规则要渐进式启用。一开始别把所有规则都设成 error,先设成 warn 跑一段时间,看看哪些规则在你的项目里误报率高。误报率高的规则要么调参数,要么关掉。我一开始把间距规则设成 error,结果因为项目历史遗留问题,一次报了 200 多个,根本没法修。后来改成 warn,分批修,两周才清干净。
第四个心得是报告要归档。每次校验的报告存一份到.impeccable/reports/目录,按时间戳命名。这样能看到问题数量的趋势,也能对比某次改动前后的差异。我用这个办法发现过一个规律:每次大版本迭代后,间距问题会集中爆发,因为新页面多,AI 生成的代码多。有了这个数据,就能针对性地在迭代期加强校验。
最后说一个我觉得最有价值的用法:把 impeccable 的报告当作 AI agent 的"设计记忆"。codex cli 这类工具在长对话里会丢失上下文,但如果你把历史报告存下来,在每次新任务开始时喂给它,它就能知道这个项目之前犯过哪些设计错误,生成代码时会主动规避。我实测下来,喂了历史报告之后,同类问题的复发率降了大概一半。这个思路其实可以推广到任何 AI coding agent 的工作流里——给 agent 一份"项目特有的错误清单",比给它一堆通用规范有用得多。