mirror of DietrichGebert/ponytail - AI agent laziness thinking
Go to file
DietrichGebert f3da910b4f
feat: refine ruleset from a full-project field review (#39)
* feat: refine ruleset from a full-project field review

A reviewer ran ponytail across a 9-phase rewrite (protocol, PC app, simulator,
RPi daemon, ESP32 firmware) and flagged three gaps. All three land in SKILL.md
and propagate to AGENTS.md + the rule copies:

- Promote the one-runnable-check rule to a headline ("Lazy code without its
  check is unfinished"), enforced as a check-rule-copies invariant.
- Hardware carve-out in "When NOT to be lazy": a real device is never the spec
  ideal (clock drift, sensor offset), leave the calibration knob.
- Clarify the Output rule: explanation the user explicitly asked for is not
  debt, only unrequested prose is.

Fallback instructions kept in sync. Rule-copy check + tests green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* test: add a behavior gate proving the refinements actually fire

The refinements were verified as injected text, but injected != behavioral.
This adds a behavior eval that probes each refined rule on a task that should
trigger it:

- hardware    -> does the output leave a calibration knob?
- explanation -> when a write-up is explicitly requested, is it given in full?
- onecheck    -> is a runnable check left behind?

benchmarks/behavior.yaml runs the probes (baseline vs ponytail arm); the
grader benchmarks/behavior.js is proven by tests/behavior.test.js (8 cases,
RED/GREEN, no API key, runs in CI). Live-confirmed: the model under the
current ruleset passes all three gates, graded by the same grader.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 02:02:50 +02:00
.agents/plugins feat: codex support 2026-06-12 08:49:33 -04:00
.claude-plugin chore: bump version to 4.3.0 (#38) 2026-06-15 00:01:51 +02:00
.clinerules feat: refine ruleset from a full-project field review (#39) 2026-06-15 02:02:50 +02:00
.codex-plugin chore: bump version to 4.3.0 (#38) 2026-06-15 00:01:51 +02:00
.cursor/rules feat: refine ruleset from a full-project field review (#39) 2026-06-15 02:02:50 +02:00
.github feat: refine ruleset from a full-project field review (#39) 2026-06-15 02:02:50 +02:00
.kiro/steering feat: refine ruleset from a full-project field review (#39) 2026-06-15 02:02:50 +02:00
.opencode feat: add ponytail-audit skill (#20) 2026-06-14 17:35:45 +02:00
.windsurf/rules feat: refine ruleset from a full-project field review (#39) 2026-06-15 02:02:50 +02:00
assets feat: reproducible promptfoo benchmark + 3-model results 2026-06-13 05:08:55 +02:00
benchmarks feat: refine ruleset from a full-project field review (#39) 2026-06-15 02:02:50 +02:00
commands feat: add ponytail-audit skill (#20) 2026-06-14 17:35:45 +02:00
docs docs: document Antigravity and VS Code Codex extension support (#36) 2026-06-14 23:40:53 +02:00
examples docs: replace em dashes with plain punctuation across prose 2026-06-13 06:06:03 +02:00
hooks feat: refine ruleset from a full-project field review (#39) 2026-06-15 02:02:50 +02:00
pi-extension feat: add ponytail-audit skill (#20) 2026-06-14 17:35:45 +02:00
scripts feat: refine ruleset from a full-project field review (#39) 2026-06-15 02:02:50 +02:00
skills feat: refine ruleset from a full-project field review (#39) 2026-06-15 02:02:50 +02:00
tests feat: refine ruleset from a full-project field review (#39) 2026-06-15 02:02:50 +02:00
.env.example feat: reproducible promptfoo benchmark + 3-model results 2026-06-13 05:08:55 +02:00
.gitignore docs: replace em dashes with plain punctuation across prose 2026-06-13 06:06:03 +02:00
AGENTS.md feat: refine ruleset from a full-project field review (#39) 2026-06-15 02:02:50 +02:00
LICENSE Initial commit 2026-06-12 02:52:37 +02:00
README.md docs: document Antigravity and VS Code Codex extension support (#36) 2026-06-14 23:40:53 +02:00
gemini-extension.json chore: bump version to 4.3.0 (#38) 2026-06-15 00:01:51 +02:00
opencode.json feat: add OpenCode adapter 2026-06-13 03:20:44 +02:00
package.json feat: add pi extension (#1) 2026-06-12 17:55:24 +02:00

README.md

Ponytail, the lazy senior dev

Ponytail

He says nothing. He writes one line. It works.

Stars Release Works with 11 agents MIT license

80-94% less code · 3-6× faster · 47-77% cheaper
Median of 10 runs across Haiku, Sonnet, and Opus. Reproduce it yourself.


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 one.

Ponytail puts him inside your AI agent.

Before / after

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/.

Numbers

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.

Median lines of code per arm across Haiku, Sonnet and Opus; ponytail writes 80-94% less code than the no-skill baseline

80-94% less code, 47-77% less cost, and 3-6× faster than a no-skill agent, on every model. 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/.

How it works

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. One line?                  → one line
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.

Install

The most effort ponytail will ever ask of you:

Claude Code

/plugin marketplace add DietrichGebert/ponytail
/plugin install ponytail@ponytail

Codex

codex plugin marketplace add DietrichGebert/ponytail
codex

Open /plugins, select the Ponytail marketplace, and install Ponytail. Then open /hooks, review and trust its two lifecycle hooks, and start a new thread.

Pi agent harness

pi install git:github.com/DietrichGebert/ponytail

OpenCode

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 CLI

gemini extensions install https://github.com/DietrichGebert/ponytail

Loads 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 finds what to delete in your diff, /ponytail-audit does the same for 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.

Antigravity and VS Code with the Codex extension: both read AGENTS.md, which this repo ships, so it works from the repo root with no setup (~/.codex/AGENTS.md makes Codex global, .agents/rules/ makes it an always-on rule in Antigravity).

Which files map to which agent: Agent portability.

Development

When changing the compact rule text, keep the agent copies aligned:

node scripts/check-rule-copies.js

FAQ

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.

License

MIT. The shortest license that works.