He says nothing. He deletes the three files you didn't need. It still works.
A fork of DietrichGebert/ponytail. Dietrich built the lazy senior dev — the concept, the ladder, the icon, the benchmarks. This fork sands down the parts the Reddit thread kept catching on: it makes the goal readability and scope control, not line count. See What this fork changes.
You know him. Long ponytail. Oval glasses. Has been at the company longer than the version control. You show him fifty lines; he looks at them, says nothing, and replaces them with the five that were doing the work.
Ponytail puts him inside your AI agent.
You ask for a date picker. Your agent installs flatpickr, writes a wrapper component, adds a stylesheet, and starts a discussion about timezones.
With ponytail:
<!-- ponytail: browser has one -->
<input type="date">More survivors in examples/.
The original's pitch — and its most-quoted example — leaned hard on fewer lines. The thread's best feedback was that line count is the wrong target: the real wins are scope and readability. This fork rewrites the rules to say so, and fixes the example everyone roasted.
- Readability is the constraint, not line count. The ladder no longer ends at "make it one line"; it ends at "collapse it, as far as it still reads at a glance." Terse is not the same as clever — a clear ten lines beats a cryptic one.
- Scope control is a first-class rule. Do what was asked and stop. No drive-by refactors, renames, or reformatting of files you weren't sent to. Spot something else worth fixing? Name it in one line and leave it. (New worked example: examples/scope-control.md.)
- Duplication earns one abstraction. Skipping abstraction is lazy until the same line is pasted into ten call sites — that's ten edits later, not less code. DRY when the repetition is real, never on spec.
- The email example actually validates nothing — and says so.
examples/email-validation.md now leads with
the round-trip confirmation (the only real test), demotes the one-liner that
waves through
xx!rr@tt55**@pp@.., and adds the trust boundary the original skipped: an address like"victim@x.com\nBcc: attacker@evil.com"is a header-injection, so strip newlines before it goes near a mail header.
Everything else — the character, the ladder, the intensity levels, the multi-agent support, the benchmarks — is Dietrich's. Credit where it's due.
Five everyday tasks (email validator, debounce, CSV sum, countdown timer, rate limiter), three models, three arms: no skill, the caveman skill, and ponytail. Ten runs per cell, median reported. (Benchmarks are inherited from upstream.)
Less code, less cost, and faster than a no-skill agent, on every model — but
the line count is a symptom, not the goal. The point is fewer moving parts:
less surface for bugs to hide in, less for the next reader to hold in their
head. Every shortcut ponytail takes is marked in the code with a ponytail:
comment naming its upgrade path. Reproduce it yourself: npx promptfoo eval -c benchmarks/promptfooconfig.yaml. Method and raw numbers: benchmarks/. Production-grade tasks, where an unconstrained agent bloats far more, are written up in benchmarks/results/.
Before writing code, the agent stops at the first rung that holds:
1. Does this need to exist? → no: skip it (YAGNI)
2. Stdlib does it? → use it
3. Native platform feature? → use it
4. Installed dependency? → use it
5. Collapse to less? → as far as it still reads at a glance
6. Only then: the minimum that works
Lazy, not negligent: trust-boundary validation, data-loss handling, security, and accessibility are never on the chopping block. And lazy is about scope, not speed-typing — it does the thing you asked for and doesn't go on a side quest through the rest of your repo.
The most effort ponytail will ever ask of you:
/plugin marketplace add swicken/ponytail
/plugin install ponytail@ponytail
codex plugin marketplace add swicken/ponytail
codexOpen /plugins, select the Ponytail marketplace, and install Ponytail. Then
open /hooks, review and trust its two lifecycle hooks, and start a new thread.
pi install git:github.com/swicken/ponytail
Run OpenCode from a checkout of this repo (the plugin reuses its hooks/ and skills/), and add to opencode.json:
{ "plugin": ["./.opencode/plugins/ponytail.mjs"] }Injects the ruleset every turn at the active level; adds /ponytail, /ponytail-review, and /ponytail-audit. OpenCode also auto-loads this repo's AGENTS.md, so the rules hold even without the plugin. The plugin adds the lite/full/ultra/off levels.
gemini extensions install https://github.com/swicken/ponytailLoads the ruleset as always-on context every session and registers /ponytail and /ponytail-review; the skills/ ship too, activated when a task needs them.
That was it. He'd be proud. He won't say it.
Active every session. /ponytail-review reviews your diff or a GitHub PR the way a senior who's been paged at 3am would — what kills prod first (security, data-loss, real duplication, footguns), then what to delete; /ponytail-audit hunts over-engineering across the whole repo. /ponytail ultra exists for when the codebase has wronged you personally. /ponytail-help explains the rest.
In Codex, invoke the skills as @ponytail, @ponytail-review,
@ponytail-audit, and @ponytail-help. Startup and mode-change text shows the
current mode.
Cursor, Windsurf, Cline, Copilot, Aider, Kiro: copy the matching rules file from this repo (.cursor/rules/, .windsurf/rules/, .clinerules/, .github/copilot-instructions.md, AGENTS.md, .kiro/steering/).
Kiro: copy .kiro/steering/ponytail.md to ~/.kiro/steering/ (global) or .kiro/steering/ in your project.
GitHub Copilot CLI: it already reads AGENTS.md and .github/copilot-instructions.md in a project, or copy the rules into ~/.copilot/copilot-instructions.md to run ponytail in every project.
Which files map to which agent: Agent portability.
AGENTS.md is the single source for the compact rule copies. After editing it,
regenerate the per-agent copies (Cursor, Windsurf, Cline, Copilot, Kiro):
node scripts/sync-rule-copies.js # regenerate the copies
node scripts/sync-rule-copies.js --check # verify they're in sync (CI)Original by Dietrich Gebert — the concept, the ladder, the icon, the benchmarks, the charm. This fork by Scott Wicken, applying feedback from the r/ClaudeAI discussion.
Does it need a config file? No.
What if I really need the 120-line cache class? You don't. Insist anyway and he'll build it. Slowly. Correctly. While looking at you.
Does it scale? The code you never wrote scales infinitely. Zero bugs, zero CVEs, 100% uptime since forever.
Why "ponytail"? You know exactly why.
MIT. The shortest license that works.
