今天刷 GitHub Trending,发现一个赛道在集体爆发:hallmark 单日涨了两千八,impeccable 涨了一千四,ai-design-skills 也涨了一千三。三个项目干的是同一件事——治"AI 生成的页面一眼假"这个病。 AI slop 大家都不陌生:紫色渐变、圆角卡片上面摞个小图标、每段标题顶上飘一行大写小字、通篇 Inter 字体。以前这事的解法全靠 prompt,在系统提示词里写一堆"不要用什么"。hallmark 就是这个路线的代表作,五十套主题加一堆设计戒律,让 Claude Code 照着办。
但 impeccable 吸引我的点不一样。它的 README 里有一句:62 条确定性检测规则,CLI 直接跑,无 LLM,无 API key。我当时的第一反应是不信——"页面像不像 AI 写的"这种审美判断,规则引擎怎么可能判得了?于是装了个最新的 4.8.0,本地跑了一遍。跑完发现这个工具比我想的有意思,它还顺带回答了一个更根本的问题:AI slop 到底是玄学,还是可以工程化的东西。
先看这 62 条规则都写了什么
impeccable 的用法是 npx impeccable detect,可以扫文件、目录或者 URL。先不扫页面,看它自带的规则目录:
npx impeccable detect --list-rules
62 条,分两个大类。slop 类专管"AI 味",quality 类管排版可读性。翻 slop 类的目录是种享受,每一条都精准到让人会心一笑:
side-tab — 卡片单侧一条粗色边。规则描述原话:这是"AI 生成 UI 最可识别的标志"。
icon-tile-stack — 圆角小方块图标叠在标题正上方。"每个生成器输出的都是这个形状"。
cream-palette — 奶油色、米色页面背景。"反射式伸手就来的'有品味'AI 底色"。
aphoristic-cadence — 文案里"X. No Y."这种对仗短句出现三次以上。"Not a feature. A platform."——对,连这句式本身都在检测范围里。
最有梗的是 em-dash-overuse。它管的是破折号使用密度:正文里 em-dash(—)达到 8 个以上、密度接近每 500 字符一个才触发。规则描述里专门写了:人类有正当理由用破折号,所以这条只对"饱和"报警。这分寸感拿捏得比很多真人审稿还细——顺便说,我现在写这篇文章都有点不敢用破折号了。
这些规则不是拍脑袋列的。impeccable 是从 Anthropic 官方 frontend-design 技能分叉出来的,README 里对病根的诊断很直接:所有模型都在同一批 SaaS 模板上训练,跳过设计约束,产出就会收敛到同一副面孔。Inter 字体、紫蓝渐变、卡片套卡片、彩底灰字、标题上面那个圆角图标块。这不是某家模型的毛病,是整个生成范式的毛病。
拿它扫了一遍,规矩是真的严
光看目录不行,得验证检测器真的能跑。我随手写了个十几行的 HTML,把规则目录里最典型的几个特征塞进去:卡片左边来一条紫色粗边加圆角、背景铺奶油色、标题用 Inter、再顶一行 "SUPERCHARGE YOUR WORKFLOW" 的大写小字。跑下来:
smoke.html
[side-tab] border-left: 4px + border-radius: 12px
[overused-font] Primary font: inter
[flat-type-hierarchy] Role sizes: body 16px, h1 16px, h2 16px (largest adjacent step 1.00:1)
[marketing-buzzword] 2 buzzword phrases: "SUPERCHARGE YOUR WORKFLOW ..."
4 anti-patterns found.
四条全中,秒级出结果,中间没有调过任何模型。有意思的是它也有没报的:我塞的径向渐变光晕它没吭声,翻了规则才明白,radial-halo 这条要求暗色背景加饱和色叠加才触发,我的写法不够格。它不是玄学匹配,每条规则背后是一个有精确触发条件的检测器,不够格就不报。
真正的重头戏在后面。我想到手边正好有现成的测试对象——同赛道爆火的 hallmark 仓库里,躺着它自家做的一整套设计样本。用 impeccable 扫同行的作业,想想就很有意思。
git clone --depth 1 https://github.com/Nutlope/hallmark.git
npx impeccable detect hallmark/skills/hallmark/scripts/fixtures/slopped.html
先扫坏样本。hallmark 的 fixtures 目录里有个 slopped.html,是它官方攒的"AI slop 集大成"页面,用来给自家检测做对照组的。impeccable 扫完:7 条反模式。渐变文字两条、紫色配色一条、Inter 字体一条、扁平层级一条、贴边内边距两条。两个项目素未谋面,对"什么是 AI 味"的判断几乎完全重合。这一轮说明,负面清单这个东西,行业里是真能达成共识的。 然后我扫了 hallmark 的官方优秀范例 exemplars 目录。按常理,人家精心打磨拿出来当门面的好页面,应该扫不出什么吧。
modern-minimal.html,7 条反模式。
我盯着输出看了半天。五条 cramped-padding(密集的账本式表格布局贴边,这条待会儿细说)、一条 Geist Mono 被判 overused-font、一条 cream-palette。 cream-palette 那条比较好玩:impeccable 把奶油色背景列为"AI 反射式的安全牌",而 hallmark 的官方范例恰恰就铺了这个底色。也就是说,A 项目的审美戒律,正好踩在 B 项目的招牌审美上。Geist Mono 同理,impeccable 把它列进"用滥字体"黑名单,hallmark 拿它当范本主字体。 把 exemplars 全扫完,四个官方好范例全中招,2 到 7 条不等。最后顺手扫了 hallmark 官网首页,20 条,其中 16 条是 cramped-padding。
这组数据比工具本身有意思
单看"谁误报了谁"容易变成工具互撕,我不想往那个方向写。但把数据摆在一起看,最先看到的是:坏页面这件事,行业里是真能达成共识的。slopped.html 那种集中了所有特征的页面,两个项目素未谋面,判断却几乎重合——渐变文字、紫色配色、Inter,谁看都摇头。负面清单之所以能工程化,是因为这些特征确实稳定地跟着生成行为出现,模型就是爱这么干,跨模型、跨项目都一样。
真正扎人的在好范例那一侧。四个官方门面页面全被扫出问题,而且报的全是审美判断最微妙的部分:奶油底算不算安全牌、Geist Mono 算不算用滥、表格密集布局算不算贴边。这些问题没有客观答案,取决于你想让页面传达什么——规则引擎给不了,大概也没人能给。impeccable 自己其实清楚这个边界,所以它做了分层:低对比度这类 WCAG 硬指标算实打实的失败,破折号密度、硬阴影这类有正当使用场景的进 advisory(咨询)区,单独列出、不计失败数、不拦 CI。
还有一层是机器判定和肉眼的口径差。官网那 20 条里 16 条是 cramped-padding,点开细看,报的全是图表区、数据行这种天然要贴边的密集元素。规则写的是"文字离容器边缘太近",但一个行情看板类页面,行与行之间本来就该紧凑。这是所有 linter 的老问题——ESLint 也会在你不想换行的地方逼你换行。好在它有 ignore 机制,--no-config 可以跳过项目配置,行内注释也能豁免单条规则。
不装进 AI 工具也能用的那半边
有一个容易搞混的点值得单独说。impeccable 其实是两个东西。一个装进 AI 编码工具里当 skill 用,README 主推的玩法是 npx impeccable install,然后在 Claude Code、Codex 这些工具里敲 /impeccable polish 之类的命令。我跑 install 的时候它让我从二十个 harness 里选,antigravity、claude、codex、replit、cursor、devin 一路排下来,这个列表本身就像是眼下 AI 编码工具生态的一张速写。
另一个身份就是 detect 这个独立 CLI,不依赖任何 harness,也不依赖模型。这才是我看重的那半边:直接挂进 CI 没问题,有检出时进程退出码是 2,--github 参数还能输出 GitHub Actions 的标注格式;扫的是确定性特征,今天扫和明天扫一个样,结果可复现。我是纯文件模式跑的,没装浏览器的机器也能用;URL 扫描才需要拉起 Chrome 做渲染后检测,那个模式能抓到 JS 报错、动画失败后内容卡在透明状态这类运行时问题——规则目录里连"滚动显现动画没跑成"都有专门条目,叫 failed-reveal signature。想用全功能得装个浏览器,我这台机器没有,如实交代。
写到这差不多可以收了。今天这个赛道三家同时爆发,说明"AI 代码的品味问题"已经从吐槽阶段进入工程化阶段。而 impeccable 这 62 条规则给我最大的启发不是工具多好用,是它把一条线画明白了:slop 的"不要什么"可以列成清单交给规则引擎,至于"要什么",到今天为止还是只有人自己能定。下次让 AI 生成页面,我大概会把 detect 挂进 CI 当最后一道闸。
本文由 AI图鉴自动抓取并翻译,版权归原作者所有;如需查看原文请点下方链接。