0%
Skip to main content
Quay lại Blog

Ponytail — dạy agent viết ít code như senior “lười” (nhưng không cắt safety)

· One min read
Vu Nguyen
Java / Backend Engineer

Agent hay over-build: thêm dependency, wrapper, abstraction cho việc browser hoặc stdlib đã làm sẵn. Ponytail là skill/ruleset mã nguồn mở — “senior đuôi ngựa” — ép agent đi thang YAGNI trước khi gõ thêm dòng.

Vì sao tôi thêm Ponytail sau SpecKit và CodeGraph

Chuỗi trên blog này đã có hai mảnh:

  • SpecKit — biết cần làm gì trước khi code.
  • CodeGraph — biết code hiện tại nối với nhau ở đâu.

Còn một kiểu lỗi rất hay gặp khi agent đã “đúng chỗ”: viết quá nhiều. Date picker → cài flatpickr, bọc component, bàn timezone. Trong khi task chỉ cần <input type="date">.

Ponytail (Dietrich Gebert, MIT) không thay spec hay graph — nó chỉnh độ tối thiểu của giải pháp: lazy về số dòng, không lazy về đọc code hay guard an toàn.


Ponytail là gì?

Một ruleset + skills cho hàng chục host (Claude Code, Codex, Cursor, OpenCode, Gemini, …). Tagline trên repo: “Makes your AI agent think like the laziest senior dev in the room. The best code is the code you never wrote.”

Ý chính:

  1. Thang quyết định trước khi viết (YAGNI ladder).
  2. Đọc codebase trước — lazy về solution, không phải về understanding.
  3. Không cắt validation, error handling, security, accessibility.

Ví dụ “before / after” trên README: agent không skill có thể dựng cả stack cho date picker; với Ponytail → native input một dòng. Thêm ví dụ trong examples/.


Thang YAGNI (tóm tắt)

Agent dừng ở bậc đầu tiên đủ dùng:

ponytail-ladder.txt
1. Cần tồn tại không? → không: bỏ (YAGNI)
2. Codebase đã có? → tái sử dụng
3. Stdlib làm được? → dùng stdlib
4. Platform native? → dùng native
5. Dependency đã cài? → dùng dependency
6. Một dòng đủ? → một dòng
7. Chỉ khi đó: minimum viable

Đây là chỗ Ponytail khác prompt “viết one-liner” thuần: benchmark trên repo ghi “YAGNI + one-liners” có thể giảm LOC nhưng safety ~95%; Ponytail giữ 100% trên tier adversarial trong bài đo agentic của tác giả.


Số liệu (đọc cho đúng)

Ponytail công bố hai lớp đo:

LớpÝ nghĩa
Agentic (khuyến nghị tin)Claude Code headless sửa repo thật (FastAPI + React template), 12 task, so có/không skill
Single-shot (cũ)Một prompt, một completion — gap 80–94% LOC có thể bị “baseline hội thoại” làm phình

Trên bài agentic (Haiku 4.5, n=4, trung bình so baseline không skill):

MetricPonytail (ước lượng)
LOC~−54%
Tokens~−22%
Cost~−20%
Time~−27%
Safety100%

Cắt lớn nhất khi agent over-build (date picker, color picker); gần 0 khi code đã tối thiểu. Chi tiết: benchmarks/results trên repo.


Cài đặt: Claude Code & Cursor

Ponytail mạnh nhất trên host có plugin (hooks inject ruleset mỗi turn + subagent). Claude Code là đường cài chính thức trên README; Cursor dùng rules/AGENTS (instruction-only, không hooks).

Claude Code (plugin — khuyến nghị nếu bạn dùng Claude)

Cần Node trên PATH (hooks lifecycle nhỏ; Nix/nvm: đảm bảo shell non-interactive thấy node).

Gửi hai lệnh riêng trong Claude Code (terminal hoặc Desktop → tab Code):

claude-code-ponytail.sh
/plugin marketplace add DietrichGebert/ponytail
/plugin install ponytail@ponytail

Sau cài: ruleset always-on mỗi session; đổi mức với /ponytail lite, full, ultra, hoặc off. Mặc định thường là full — chỉnh qua PONYTAIL_DEFAULT_MODE hoặc ~/.config/ponytail/config.json.

Gỡ plugin: /plugin remove ponytail (xem uninstall nếu cần dọn state ngoài plugin).

Cursor (copy rules)

  1. Lấy file từ .cursor/rules/ trong repo Ponytail.
  2. Copy vào .cursor/rules/ của project (hoặc User Rules nếu bạn muốn global).
  3. Hoặc đồng bộ nội dung vào AGENTS.md ở root — Cursor và nhiều agent khác đọc file này.

Không có hooks Ponytail trên Cursor → không có chuyển mode /ponytail ultra tích hợp; ladder vẫn áp qua rules always-on.

Codex & IDE khác (tóm tắt)

  • Codex CLI / VS Code extension: codex plugin marketplace add DietrichGebert/ponytail rồi codex plugin add ponytail@ponytail; tin hooks trong /hooks.
  • Chỉ instruction: copy AGENTS.md hoặc file rules tương ứng (Windsurf, Cline, Copilot, …) — bảng portability trên repo.

Slash commands (Claude Code, Codex, OpenCode, …)

LệnhViệc làm
/ponytail [lite|full|ultra|off]Bật mức độ / tắt
/ponytail-reviewReview diff — gợi ý xóa over-engineering
/ponytail-auditAudit cả repo
/ponytail-debtGhi “shortcut” để trả sau
/ponytail-gainXem scoreboard benchmark

Trên Cursor, nhắc agent bằng prompt (“review diff theo ponytail ladder”) thay cho slash; trên Claude Code tôi hay dùng /ponytail-review sau implement.


Ba công cụ trong một workflow

spec-graph-ponytail.txt
SpecKit → WHAT / WHY (spec, plan, tasks)
CodeGraph → WHERE / HOW wired (call path, blast radius)
Ponytail → HOW LITTLE (ít dòng, ít dependency, vẫn an toàn)

Khi nào nhắc Ponytail (hoặc review):

  • Task UI nhỏ, agent đề xuất thư viện mới.
  • Refactor “cho đẹp” nhưng không đổi hành vi.
  • Sau implement — Claude Code: /ponytail-review; Cursor: prompt “áp ponytail ladder lên diff này”.

Khi không cần ép tối thiểu: thay đổi bắt buộc kiến trúc lớn, protocol phức tạp đã được spec chốt — đừng golf code lúc domain thật sự cần abstraction.


Caveman vs Ponytail

FAQ trên repo: caveman rút gọn lời nói của agent; ponytail rút gọn code build. Có thể dùng cả hai — không trùng vai.


Kết

Ponytail không phải “viết ít token cho vui”. Nó là discipline: giải pháp nhỏ nhất sau khi đã hiểu bài toán và codebase — phù hợp vibe coding có spec và (tuỳ repo) có graph.

Đọc thêm: Ponytail trên GitHub · ponytail.dev · CodeGraph trên blog · SpecKit + RabbitSVN