Ponytail:让 AI 编码代理少写代码的规则
Ponytail 用一套决策阶梯约束 AI 编码代理:先复用现有能力,再用标准库和原生平台功能。项目基准显示,日期选择器从 404 行降至 23 行。
Ponytail 是什么
Ponytail 是一组规则,用于让 AI 编码代理编写更少的代码。该项目用一句话介绍自己:“让你的 AI 代理像团队中最懒的资深开发者一样思考。最好的代码,就是你从未编写的代码。”它采用 MIT 许可证。它本身没有运行时,也不会执行任何内容。它是一段写入代理指令的文本:对于支持加载 skill 的宿主,它被打包为 skill;对于不支持的宿主,则作为普通规则文件提供。
该代码仓库位于 DietrichGebert/ponytail。它创建于 12 June 2026,并在 1 August 2026 前获得了 90,000 个 star。截至 1 August 2026,最新的带标签版本是 v4.8.4,发布于 29 June 2026;仅 14 June 至 29 June 期间,releases 页面就列出了十个标签。项目更新速度如此之快,您阅读本文时它可能已经发生变化,因此在基于它构建任何内容之前,请固定一个标签版本。
工具之前的理念:在第一个适用的阶梯处停下
Ponytail 的核心是一套决策阶梯。代理在编写任何内容前先逐级检查,并在第一个适用的阶梯处停下。
- 这项功能是否确实需要存在?这就是 YAGNI(你不会需要它)。如果答案是否定的,就跳过它。
- 该功能是否已经存在于此代码库中?复用已有的辅助函数或模式。
- 标准库是否能完成这项工作?使用标准库。
- 原生平台功能是否能满足需求?使用原生平台功能。
- 已安装的依赖项是否能解决问题?使用它。
- 能否写成一行?就写成一行。
- 只有在这之后,才编写能正常工作的最少代码。
真正发挥作用的是这套顺序,而不是其中的某一级。代理收到编写日期选择器的要求后,就会编写日期选择器,因为它接到的任务就是这样。决策阶梯会让它先检查第 4 级,而第 4 级表明浏览器已经提供了 <input type="date">。项目自己的基准测试记录了这一情况:不使用这条规则时,日期选择器需要 404 行代码;使用这条规则后只需 23 行,因为代理选择了原生输入控件,而不是构建组件。颜色选择器也出于同样原因从 287 行减少到 23 行。第 2 级最容易静默失效,因为代理如果看不到已有的辅助函数,就会直接再写一个;可查询的代码库映射正是为了弥补这一缺口。
这里的“偷懒”并不意味着粗心,规则集也直接说明了这一点。“绝不在以下方面偷懒”列表包括:在做决定前理解问题、在信任边界验证输入、防止数据丢失的错误处理、安全性、可访问性,以及用户明确要求的任何内容。规则集还要求为每段非平凡逻辑编写一个小型可运行检查。这条规则减少的是重复发明,不是正确性。
仓库实际发布的内容
AGENTS.md,始终启用的规则集。整个理念都集中在这一个文件中,5 分钟即可读完。skills/ponytail/SKILL.md,技能定义文件,参数提示为lite、full或ultra。- 特定编辑器目录下的规则文件,例如
.cursor/rules/和.windsurf/rules/,供读取规则但不加载技能的主机使用。 hooks/、benchmarks/、examples/和scripts/。
强度参数会改变规则的约束力度。lite 会构建您要求的内容,并用一行说明一个更简化的选项。full 是默认设置,会强制执行这套递进规则。ultra 是 YAGNI 的极端设置:它偏向删除而不是添加,甚至会质疑需求本身。
支持技能的主机还会获得斜杠命令。/ponytail 设置级别,/ponytail-review 检查差异中是否存在过度设计,/ponytail-audit 检查整个仓库,/ponytail-debt 收集您推迟处理的快捷项,/ponytail-gain 输出基准评分表。仅读取规则文件的主机只能获得规则集,不能使用这些命令。
如果您希望在信任源代码前先阅读它,请克隆标签,而不是分支:
git clone --depth 1 --branch v4.8.4 https://github.com/DietrichGebert/ponytail.git对于 Claude Code,项目改为文档化插件安装方式;以下两行内容与 2026 年 8 月 1 日的文档一致:
/plugin marketplace add DietrichGebert/ponytail
/plugin install ponytail@ponytail插件路径跟随默认分支,而不是标签。因此,不同会话之间,引导代理的说明可能会在您未察觉的情况下发生变化。您需要用这种不确定性换取更新命令带来的便利。
为什么在 VPS 上使用“懒惰”的代理更省钱
代理编写的 diff 不会离开当前对话。下一轮中,模型会再次读取它,以及代理为生成该 diff 而打开的所有文件。因此,500 行的修改会增加会话后续每一轮的负担,而不只是生成它的那一轮。这就是为什么失控的重构会让代理随着会话继续而越来越慢、越来越不可靠:上下文窗口被代理自己的输出填满,留给实际代码的空间就会变小。管理编码代理的上下文窗口的核心就是控制这一点。
输入和输出都会计费,因此大小减半的 diff 会节省两次费用:写入时节省一次,之后每次重新读取时再节省一次。是否真的能节省账单,取决于您的付费方式,因为固定价格的 Pro 或 Max 订阅会承担额外 token,而按 token 计费的 API 会为每个 token 收费。如果您在自托管环境中关注账单,指令文件是一个无需额外成本即可调整的控制手段。控制 AI 代理的成本要从输出量开始,而编码代理如何消耗 token解释了为什么重新读取的成本比许多人预期的更高。
人工仍然需要阅读 diff。原本只需 20 行却改了 400 行,会消耗审阅者的注意力,而注意力通常是最先耗尽的资源。没有人能以审阅当天第一份 diff 时的认真程度,去审阅当天第四份冗长 diff。因此,过度实现浪费的不只是时间,还会悄悄降低用于发现错误的审阅质量。
在服务器上,风险更高,因为代理经常在无人监控的情况下运行。在 tmux 会话中或由定时器触发的代理,可能在您发现问题前,用数小时继续执行错误决策。这就是在 VPS 上运行编码代理的实际风险,也是进行循环工程的人如此重视固定指令、而不是单个提示的原因。常驻指令文件中的规则会应用到第 200 轮。您在聊天中输入的规则只会应用到第 3 轮。它还会应用到您在同一台主机上启动的第二个会话;第二个会话可以读取已提交的文件,却不会继承您在第一个会话中输入的内容,即使两个会话可以相互发送消息。
新增依赖是另一项隐性成本。第 5 条要求使用已安装的内容。代理自行添加的每个软件包,之后都需要您维护,并且最终会进入您从该仓库构建的每个容器镜像。
Ponytail 自身的基准测试数据说明了什么
该项目发布了两组结果,但两者相差很大。这些数据都由项目自行发布,并非独立测试结果。
The data behind this chart
[
{
"label": "Lines of code",
"single_shot_pct": 93,
"agentic_pct": 54
},
{
"label": "Cost per run",
"single_shot_pct": 63,
"agentic_pct": 20
},
{
"label": "Wall clock time",
"single_shot_pct": 74,
"agentic_pct": 27
}
]单次生成列来自基础模型对一小组提示词的回答。测试分别在有规则和无规则的情况下进行,并取 2026 年 6 月 13 日和 17 日多次运行的中位数。智能体列来自一次无界面的 Claude Code 会话。该会话编辑了 tiangolo 的 full-stack-fastapi-template,这是一个真实的 FastAPI 和 React 代码仓库;测试包含十二个功能任务,每个任务在 Haiku 4.5 上运行四次,并根据最终留下的 git diff 进行评分。
请看第二列。智能体测试结果的代码行数少 54%,成本低 20%,墙上时钟时间少 27%。在单次生成设置中,相同指标分别为 93% 和 74%。README 诚实地解释了原因:单次生成基线使用的是一个基础模型,它“会给出多个选项并附带说明”,这很容易被超越。与执行实际工作的真实智能体比较后,优势会缩小。不过,这个结果仍然真实有效,而这才是更有用的信息。
项目还提出了一个注意事项,而它决定了这项方法是否对你有帮助。在确实存在过度构建风险的地方,节省最明显;对于原本就很精简的代码,节省接近于零。在一个 Python 和 TypeScript 代码仓库中测试十二个任务,不能代表你的代码仓库。如果这个数字对你很重要,请使用自己的任务,在有规则和无规则的情况下分别运行比较,然后自行统计代码行数。
今天即可复制的模式,无需安装任何东西
这个阶梯本质上是文本,因此无需安装插件即可使用这一思路。将类似下面的代码块粘贴到代理已经读取的指令文件中,无论该文件是 AGENTS.md、CLAUDE.md,还是编辑器的规则文件。
## Before you write code
Climb this list in order. Stop at the first line that applies.
1. Does this need to exist? If not, say so and stop.
2. Does this repo already have it? Reuse the helper.
3. Does the standard library do it? Use it.
4. Does the platform do it natively? Use it.
5. Does an installed dependency do it? Use it.
6. Can it be one line? Write one line.
7. Otherwise write the minimum that works.
Never take the shortcut on: reading the code before changing it, validating
input that crosses a trust boundary, error handling that would otherwise lose
data, security, accessibility, or anything I asked for by name.
Do not add an abstraction I did not ask for. Do not add a dependency without
saying why in one line. Prefer deleting code to adding it.
Mark a deliberate simplification with a comment naming its ceiling and the
upgrade path.最后一条规则值得单独说明。Ponytail 的约定是添加带有工具名称标签的注释:
# ponytail: global lock, per-account locks if throughput matters这条注释只需两行,就能解决一个否则可能耗费一轮审查的问题。它告诉下一位读者,简单版本是经过选择的方案,并说明该方案在哪种条件下不再适用。如果没有这条注释,审查者无法区分经过考虑的简化方案和代理遗漏的内容,因此只能提出询问。
代码块的放置位置与内容同样重要。代理每次运行都会加载的文件会影响每次运行,包括您没有监看的运行。这正是 编写代理真正遵循的 AGENTS.md 所要讨论的问题,也说明为什么应将这一模式放入已提交的文件,而不是留在 shell 历史记录中。在 monorepo 中,应将其放入多个已提交的文件,因为 为每个软件包配置一个 AGENTS.md 可以让每个目录的规则保持简短,避免代理每次运行都读取整个目录树的约定。不过,放置位置并不能保证规则一定生效。在认定阶梯需要更强的措辞之前,最好先了解 代理为何会跳过已加载的规则。
规则不再适用的情况
这套阶梯针对的是已有代码库中的功能开发,因为在这种场景下,通常可以复用现有代码,而且复用通常也是正确的。它不太适合从零开始的项目,因为第 2 级没有可复用的内容,第 5 级也没有已安装的工具,所以代理每次都会直接落到第 7 级。真正需要抽象时,它同样不太适用。如果您即将添加同一段复制代码的第 4 个调用方,“最短差异”会让您再复制出第 5 份。
ultra级别会质疑您的需求。这正是该级别的作用;但如果您已经做出决定,只想完成工作,这也确实会增加成本。普通工作使用 full;如果您怀疑问题出在功能请求本身,再使用 ultra。
没有任何指令块可以避免您误解问题。规则集的第 1 项本身就是在决定之前理解代码,而这正是成本最高、也是文本无法替您完成的部分。在错误的函数中进行最小修改,仍然是错误的修复;而且现在这是一个容易获批的小型错误修复。
坦率地说,Ponytail 是一份编写得很仔细、分发得很好、并附带数字的提示词。它没有任何内容要求使用该插件。这个项目真正提供的是:有人正确编写了这份清单,在真实代码库中进行了测试,并将方法与结果一同发布。
FAQ
Ponytail 是否支持 Claude Code 之外的其他代理?
支持。它以 skill 形式提供给能够加载 skill 的宿主,README 中列出的宿主包括 Claude Code、Codex、OpenCode、Gemini 以及其他几个工具。Cursor、Windsurf、Cline 和 Copilot 等只能读取规则文件、但不会加载 skill 的编辑器,会从匹配的规则目录获取始终启用的规则集,但不会获得斜杠命令。两种方式使用的文本相同,真正的区别在于宿主是每轮都将这些文本保留在上下文中,还是仅在触发 skill 时加载。
惰性代理会跳过测试、验证或安全检查吗?
不会,规则集对此有明确说明。其“绝不偷懒”的列表包括信任边界处的输入验证、防止数据丢失的错误处理、安全性和可访问性;同时要求为每段非平凡逻辑提供一个可运行的小型检查。规则移除的是凭空增加的结构:没人要求的抽象,以及没人需要的依赖。如果安装后代理开始删除测试,原因是您自己的配置中存在优先级更高的其他指令。请读取代理最后加载的文件。
已发布的速度和成本数据可信吗?
这些数据是项目自行测量的结果,并且同时公布了测量方法,因此应按这个范围理解。单次执行数据是与一个仅回复选项和说明的裸模型进行比较,而 README 本身也指出这属于较弱的基线。代理执行数据来自一次无头 Claude Code 会话,使用一个 FastAPI 和 React 代码库,包含十二个工单,每种情况运行四次,使用 Haiku 4.5。这些数据对于该设置是可信的。但它们不能预测您的代码库,因为项目也说明,对于原本已经精简的代码,节省量会降至接近零。
要获得这些效果,是否必须安装某些东西?
不需要。这套规则本质上是文本。将等效内容粘贴到代理已经读取的指令文件中,即可获得大部分效果。插件提供维护后的措辞、强度级别、审查命令和更新路径。先复制规则块进行尝试,是第 1 级对“是否必须安装该工具”的回答。
如何防止无人值守的代理在夜间过度构建?
将规则放入始终启用的指令文件,而不是聊天消息中。这样规则会在长时间运行的第 200 轮继续生效,而不只是在第 3 轮生效。然后单独限制潜在影响:为代理提供一个可以任意修改的 checkout,不要使用唯一副本;同时要求在合并任何内容前进行人工 diff 审查。最小 diff 规则可以减少您需要阅读的内容。但它不会决定哪些内容最终进入代码库,也不应由它决定。