凌晨一点多,我在 review 一个 PR 。
不是同事写的。是 AI 。
需求很简单:给一个数据查询加个缓存。 AI 交上来的东西——120 行的 CacheManager 类,带 LRU 变体、可配置淘汰策略、一个我永远不会调的 TTL 参数。
我盯着屏幕看了半分钟,删了 119 行,换成了 @lru_cache(maxsize=1000)。
一模一样的行为。 48 行代码消失。那 48 行里可能藏着的 bug ,也一起消失了。
这不是某个模型的问题。是所有 AI coding agent 的默认行为。
你问它一句,它交一套工程。你让它加个日期选择器,它装了个组件库。你让它写个删除确认弹窗,它给你 Portal + Overlay + Root + Trigger + Content 全家桶——对着一个浏览器自带 <dialog> 就能搞定的事情。
凭什么?
它不是在炫技,是被训练成这样的
训练数据里,"完整"比"够用"更被奖励。不管你实际需要多少, agent 的默认答案都是偏多的那一端——把你当成要交毕设的学生,写完还要改八百遍的那种。
于是你得到了一段安全的、防御性的、过度设计的代码。
安全是好事。但你付出的代价远不止多读几行代码:每一行多出来的代码,都是一行你需要维护、 review 、 debug 、在未来某个深夜被叫起来修的代码。
这有点像装修。装修队进来第一反应是敲墙、改水电、重新铺地——不管这房子原来能不能住人。 agent 的默认脑回路也是一样的:先写个类,再包一层抽象,顺便加个工厂模式。不管问题本身值不值得。
实际上很多问题的答案,标准库早就给你了。浏览器也早就给你了。语言内置的模块就在那放着,但 agent 默认跳过它。
之前在做网站的时候,明明有现成的图标组件库和品牌 Logo 库,结果有的 agent 借着自己有多模态能力,放着现成的库不调用,而是自己一个个去画 SVG 。代码行数多了,画出来的东西也不一定对。这种“看起来很累”的代码反而是 AI 的通病。
有个东西能治这个病
叫 ponytail 。一个开源的 agent 插件, 67.5k star , MIT 协议。 GitHub 上叫 DietrichGebert/ponytail 。
它的定位就一句话:让你的 AI agent 学会偷懒。
准确说,是学会那种干了十年、凌晨三点被 oncall 叫起来修过 bug 的老兵式的偷懒。不是让你少干活——是让你不干没必要干的活。
它给 agent 装了一套"七级懒人阶梯"。每次要写代码前, agent 必须从第一级往下爬,站住了就停下来:
<input type="date"> 不香吗?顺序是精髓。越靠上的选择,越便宜、越安全、越不用你维护。你没写的代码不会出 bug 。复用的代码已经在线上跑过。浏览器的原生控件不用你来修兼容性问题。
ponytail 不是让 agent "少写代码"。是让它先问一句"这代码该不该写"。
一个我一开始最担心的问题
懒成这样,它会不会顺手把输入校验、错误处理、无障碍访问也"优化"掉了?
不会。这是 ponytail 跟那些"少写点 token 吧"的 prompty prompt 最大的区别。
它的 README 里画了一条硬线:懒,不等于疏忽。 信任边界的输入验证、防数据丢失的错误处理、安全校验、无障碍访问——这些东西永远不在可砍列表上。一个对比实验里的数据很直白:裸写"YAGNI + 尽量一行代码"的 prompt ,安全性掉到了 95%。 ponytail 是 100%。
不是因为它更小心。是因为它的"懒"指向的是 gratuitous code——那些为了看起来像"工程"而加的代码。 120 行的 CacheManager 是 gratuitous 。一个 try/except 包住数据库写入,不是。
这个区别,比"多写少写"重要得多。
数字不说谎
ponytail 的团队在 12 个真实开发任务上跑了一组 benchmark——FastAPI + React 的仓库,用 Anthropic 的 Haiku 4.5 ,每个任务跑 4 遍取中位数:
最有意思的不是平均数,是省代码省最多的地方——恰恰是 agent 最容易过度设计的地方。日期选择器从 404 行砍到 23 行。颜色选择器从 287 行砍到 23 行。因为 ponytail 直接让 agent 用了浏览器的 <input type="color">,而不是装个组件。
对照组里还有个叫 caveman[1] 的工具,也是让 agent 更简洁。它省了 20% 代码——但 token 反而多花了 7%,时间多了 2%。只有 ponytail 在所有指标上都降了。
token 没省反涨,因为 agent 说的少了,但代码还是照着原样写。 ponytail 省的,是代码本身。
其实对于成本,我还真的不怎么在意。因为不能为了成本就降低代码的质量和安全性。但这个插件的确能做到减少代码上的过度设计,而又不影响安全性,让我十分意外。
怎么装、怎么用
适配了 16+ 个平台。 Claude Code 、 Codex 、 Cursor 、 Windsurf 、 Cline 、 Copilot CLI 、 Gemini CLI 、 Kiro 、 Zed 、 Aider 、 OpenCode 、 Pi 、 Devin 、 OpenClaw……基本你在用的它都有。
Claude Code 上两条命令搞定:
/pluginmarketplaceaddDietrichGebert/ponytail/plugininstallponytail@ponytailCodex 类似:codex plugin marketplace add DietrichGebert/ponytail。 Cursor 、 Windsurf 这类 instruction-only 的工具,把规则文件复制一份就行。
装完之后三种强度可选:
还有些内置命令实用到让人想哭:/ponytail-review 扫一眼当前 diff 里有没有过度设计、/ponytail-audit 审计整个仓库找冗余、/ponytail-debt 把那些你推迟的"以后再说"收成一笔账——免得以后变成再也不说。
说到底, ponytail 做的事不复杂。它把一个干了十年的工程师脑子里的那套判断——"这个不值当写"——塞进了 agent 的上下文窗口。不是让 AI 写更多,是让它少写、写对。
那 48 行你没写的 CacheManager ,不会在半年后某个凌晨把你叫起来。
就这样。我把 ponytail 装上了, full 模式。再看看它给我的下一个 PR 长什么样。
参考链接
[1] caveman: https://github.com/JuliusBrussee/caveman
夜雨聆风