# Ponytail:让 AI Agent 写出 1 行而不是 50 行的 skill
你知道那种程序员。长发马尾,椭圆眼镜,在公司的时间比版本控制系统还长。你给他看五十行代码,他看了看,什么都没说,用一行替换了全部。
Ponytail 把这个人塞进了你的 AI Agent 里。
这是一个开源 skill,8 天前发布,已经支持 10 种 Agent(Claude Code、Codex、Cursor、Pi、Windsurf、Copilot……)。核心只有 95 行 SKILL.md,但每次触发,它都会让 Agent 停在一个梯子上,逐级往下走,在第一个能站稳的台阶停下。
---
## 梯子:六步,但可能一步就够了
Ponytail 的整个方法论只有这六步:
```
1. 这东西真的需要存在吗? → 不需要就跳过(YAGNI)
2. 标准库是不是已经有了? → 用标准库
3. 原生平台功能能覆盖吗? → <input type="date"> 而不是一个组件库
4. 已经安装的依赖能解决吗? → 用已装的,永远不加新依赖给几行代码能搞定的事
5. 一行能搞定吗? → 一行
6. 实在不行:能跑的最少代码
```
**梯子是本能,不是研究项目。** 两步都成立?走更高那步,然后继续。第一个能用的懒方案就是对的。
---
## 五组对照:正常 Agent vs Ponytail
我把五个日常 coding 任务跑了一遍,左边是正常 Agent 会写的东西,右边是 Ponytail。
### 1. 日期选择器
```
正常: npm install flatpickr 30 行 React wrapper CSS import
Ponytail: <input type="date">
// ponytail: 浏览器自带
```
**1 个依赖 30 行 → 0 依赖 1 行。** 原生、无障碍、多语言、键盘导航、移动端适配——浏览器团队已经做完了。
### 2. 缓存系统
```
正常: 120 行 TTLCache 类,含线程安全、LRU 淘汰、统计端点
Ponytail: from functools import lru_cache
@lru_cache(maxsize=1000)
```
**120 行 → 2 行。** 最快的缓存是你根本不需要 debug 的那个。
### 3. 限流器
```
正常: 35 行滑动窗口 RateLimiter 类,deque threading.Lock
Ponytail: import threading
_sem = threading.Semaphore(10)
```
**35 行 → 6 行。** Semaphore 是操作系统级别的限流,已经比你写的好。
### 4. 防抖
```
正常: npm install lodash.debounce (600B) import wrap
Ponytail: function debounce(fn, ms) {
let t;
return (...a) => { clearTimeout(t); t = setTimeout(() => fn(...a), ms); };
}
```
**一个依赖 → 3 行。** 不需要 leading/trailing/maxWait 的时候,这段代码够用十年。
### 5. 倒计时组件
```
正常: React 组件,useEffect useState useRef cleanup 格式化逻辑
Ponytail: <input type="time">
// ponytail: 浏览器自带
```
**190 行 React → 1 行 HTML。** 除非你真的需要一个定制的倒计时 UI,否则 `input[type=time]` 就够了。
---
## 有数据吗?
有。作者跑了 5 个任务 × 3 个模型(Haiku、Sonnet、Opus)× 3 个配置(无 skill、Caveman、Ponytail)× 10 轮,取中位数。
**Ponytail v3 vs 无 skill 的基线:**
| 指标 | 基线 | Ponytail | 差别 |
|------|------|----------|------|
| 代码行数 | ~293 | ~47 | **-84%** |
| Token 用量 | 161,955 | 135,709 | **-16%** |
| 耗时 | 479s | 127s | **-73%** |
**Ponytail v3 vs Caveman(此前最极简的 skill):**
| 指标 | Caveman | Ponytail |
|------|---------|----------|
| 代码行数 | ~117 | ~47 (**2.5× 更少**) |
| Token 用量 | 138,410 | 135,709 (**-2%**) |
| 耗时 | 136s | 127s (**-7%**) |
对于基线会写出 190 行倒计时组件、耗时 208 秒的那种退化情况,两个 skill 都完全避免了——但 Ponytail 在代码最小化上把 Caveman 又拉出了一个量级。
---
## 不止是少写代码
Ponytail 的设计有几个被低估的决策:
### 1. "ponytail:" 注释——简化的意图显式化
每次 Ponytail 做简化,代码里会留一个 `ponytail:` 注释,说明选择了什么捷径、什么情况下需要升级。
```python
# ponytail: global lock, per-account locks if throughput matters
_lock = threading.Lock()
```
这让"简单"读起来像**有意为之**,而不是"Agent 偷懒了"。捷径有已知的天花板,注释里写了升级路径。后来需要升级的人不会骂你。
### 2. 三个强度等级
| 等级 | 行为 | 场景 |
|------|------|------|
| **lite** | 正常写,但在旁边写一行"更懒的做法是……" | 不确定想多懒 |
| **full** | 梯子强制执行,最短 diff,最短解释(默认) | 日常 coding |
| **ultra** | YAGNI 极端主义。先删再写。一行搞定,同时质疑需求的其余部分 | 被代码库气到 |
"加一个缓存"在三个等级下的反应:
- **lite**:帮你加了。顺便说一句 `
@lru_cache` 可以一行搞定。
- **full**:`
@lru_cache(maxsize=1000)`。跳过了自定义缓存类,lru_cache 不够用时再加。
- **ultra**:不加。直到 profiler 说需要。真需要时:`
@lru_cache`。手写 TTL 缓存类本质上是带命中率的 bug 农场。
### 3. 有边界:不该省的地方绝不省
Ponytail 明确列出了**永远不能简化**的东西:
- 信任边界的输入验证
- 防数据丢失的错误处理
- 安全措施
- 无障碍基础
- 用户明确要求的东西
非平凡逻辑(有分支、有循环、有解析器、有钱/安全路径)至少要留一个可运行的最小检查:一个 `assert` 自检或一个小 `test_*.py`,不要框架、不要夹具。但一行搞定的事不需要测试,YAGNI 对测试也适用。
### 4. ponytail-review:只找能删的东西
配套了另一个 skill:`/ponytail-review`。它不是做正常代码审查——**它只猎杀过度工程。** 每条发现只占一行:
```
L12-38: stdlib: 27-line validator class. "@" in email, 1 line.
L4: native: moment.js imported for one format call. Intl.DateTimeFormat, 0 deps.
L52-71: delete: retry wrapper around idempotent local call. Nothing replaces it.
```
结尾只汇报一个数字:`net: -N lines possible.`
如果没什么好删的,就说 `Lean already. Ship.` 然后闭嘴。
**这是 Ponytail 最锋利的洞察:好的 diff 是变短的 diff。**
---
## 为什么这件事很重要?
AI 编码 Agent 有一个天然的偏见:**它们喜欢写东西,不喜欢删东西。**
你让它"加一个日期选择器",它默认的思维路径是:装一个库、包一层组件、加样式、加 hook、加清理逻辑。因为它觉得"做完"意味着产出代码。它不会停下来问:"浏览器是不是已经自带了?"
Ponytail 把这个偏见翻转了。它让 Agent 在写任何代码之前,先爬一遍梯子——**在每一步停下来问"这真的需要存在吗"**。而这个翻转带来的收益是全方位的:
- **写得更少** → 代码更少,bug 更少
- **依赖更少** → 供应链攻击面更小
- **更接近原生** → 可访问性、本地化、性能天然更好
- **意图显式** → `ponytail:` 注释让简化成为存档的决策
- **升级路径清晰** → 每处简化都在注释里告诉了你怎么升级
**最好的代码,是那行你从未写过的代码。第二好的,是 Ponytail 替你删掉的那行。**
---
## 怎么装
```bash
# Claude Code
/plugin marketplace add DietrichGebert/ponytail
/plugin install ponytail@ponytail
# Pi agent harness
pi install git:
github.com/DietrichGebert/po…
# Codex
codex plugin marketplace add DietrichGebert/ponytail
# Cursor / Windsurf / Copilot / Kiro
# 复制对应的规则文件到项目或全局配置目录即可
```
11 天,1.2k stars,MIT 协议。
---
## 一句话
**Ponytail 解决的问题不是"代码太多",而是"Agent 默认想写太多"。** 它给了 Agent 一套本能:在碰键盘之前,先问六个问题。往往问到第二个就停了。
它让你想起公司里那个最老的程序员。他什么都不说。他写一行。它能跑。
#Ponytail #AI编码 #极简主义 #Agent #开源