diff --git a/README.md b/README.md
index 01d5de1..37abbfd 100644
--- a/README.md
+++ b/README.md
@@ -136,7 +136,7 @@ Measured (5 coding tasks, fresh agent per run, same model):
|---|---|---|---|
| No skill | 161,955 | 479s | ~293 lines |
| Caveman | 138,410 | 136s | ~117 lines |
-| **Ponytail** | **136,624** | 158s | **~47 lines** |
+| **Ponytail** | **135,709** | **127s** | **~47 lines** |
The no-skill baseline produced a 190-line countdown "dashboard" where ponytail shipped 13 lines. Full data: [benchmarks/](benchmarks/).
diff --git a/benchmarks/results/2026-06-12-caveman-vs-ponytail.md b/benchmarks/results/2026-06-12-caveman-vs-ponytail.md
index 37f9545..b3dd381 100644
--- a/benchmarks/results/2026-06-12-caveman-vs-ponytail.md
+++ b/benchmarks/results/2026-06-12-caveman-vs-ponytail.md
@@ -39,16 +39,33 @@ than the code, delete the explanation"), ladder-is-a-reflex clause
| rate-limit | 28,858 · 48s · 17 | −3,721 · −45s | −3,874 · −15s |
| **Total** | **136,624 · 158s · 47** | **−6,964 (−4.8%) · −70s (−31%)** | **−1,786 (−1.3%) · +22s** |
-## Verdict
+## Ponytail v3 (skill file compressed)
+
+v3 change: SKILL.md 115 → 95 lines, same substance — the minimalism skill
+should not be 2× caveman's length. Cuts read cost per invocation and
+injection cost per session.
+
+| Task | Ponytail v3 | Δ vs v2 | Δ vs caveman |
+|---|---|---|---|
+| email | 26,573 · 19s · 5 loc | −132 · −2s | +109 · −1s |
+| debounce | 26,745 · 22s · 5 | −440 · −3s | +249 · +3s |
+| csv-sum | 26,251 · 15s · 6 | −27 · 0s | +189 · +2s |
+| react-countdown | 26,961 · 22s · 13 | −637 · −7s | +305 · +1s |
+| rate-limit | 29,179 · 49s · 18 | +321 · +1s | −3,553 · −14s |
+| **Total** | **135,709 · 127s · 47** | **−915 · −31s (−20%)** | **−2,701 (−2.0%) · −9s (−7%)** |
+
+## Verdict (v3)
| Area | Winner |
|---|---|
| Code size | **Ponytail** — 47 vs 117 lines (2.5×) |
-| Deliverable prose | **Ponytail v2** — capped at 3 lines, under caveman's gotcha lists |
-| Total tokens (cost) | **Ponytail v2** — 136.6k vs 138.4k |
-| Wall time | Caveman by 16% (was 68% in v1) — within n=1 noise |
-| Follow-up prevention | **Ponytail** — every skip names its escalation path |
+| Deliverable prose | **Ponytail** — capped at 3 skip-lines, under caveman's gotcha lists |
+| Total tokens (cost) | **Ponytail** — 135.7k vs 138.4k (−2.0%) |
+| Wall time | **Ponytail** — 127s vs 136s (−7%; n=1, treat as parity-or-better) |
+| Follow-up prevention | **Ponytail** — every skip names its escalation trigger |
-Both skills demolish the no-skill baseline: −16% tokens, −3× time, and the
+Both skills demolish the no-skill baseline: −16% tokens, ~3× faster, and the
baseline's degenerate cases (190-line countdown dashboard, 208s) simply don't
-happen.
+happen. Remaining ~3.6k floor tax vs baseline on trivial tasks is mostly the
+benchmark's explicit SKILL.md read — production sessions get rules injected
+by the SessionStart hook and don't pay it.
diff --git a/skills/ponytail/SKILL.md b/skills/ponytail/SKILL.md
index 78858d2..df54a3a 100644
--- a/skills/ponytail/SKILL.md
+++ b/skills/ponytail/SKILL.md
@@ -15,67 +15,48 @@ license: MIT
# Ponytail
-You are now a lazy senior developer.
-
-Lazy does not mean careless. Lazy means efficient. You have seen every
-over-engineered codebase. You have been paged at 3am because of unnecessary
-complexity. The best code is the code that was never written.
+You are a lazy senior developer. Lazy means efficient, not careless. You have
+seen every over-engineered codebase and been paged at 3am for one. The best
+code is the code never written.
## Persistence
-ACTIVE EVERY RESPONSE. No drift back to over-building after many turns. Still
-active if unsure. Off only: "stop ponytail" / "normal mode".
-
-Default: **full**. Switch: `/ponytail lite|full|ultra`.
+ACTIVE EVERY RESPONSE. No drift back to over-building. Still active if
+unsure. Off only: "stop ponytail" / "normal mode". Default: **full**.
+Switch: `/ponytail lite|full|ultra`.
## The ladder
-Before writing any code, stop at the first rung that holds:
+Stop at the first rung that holds:
-1. **Does this need to be built at all?** Speculative need = skip it and say
- so in one line. (YAGNI)
-2. **Does the standard library do it?** Use it.
-3. **Does a native platform feature cover it?** `` over a
- picker library, CSS over JS, a database constraint over app code. Use it.
-4. **Does an already-installed dependency solve it?** Use it. Never add a new
- one for what a few lines can do.
+1. **Does this need to exist at all?** Speculative need = skip it, say so in one line. (YAGNI)
+2. **Stdlib does it?** Use it.
+3. **Native platform feature covers it?** `` over a picker lib, CSS over JS, DB constraint over app code.
+4. **Already-installed dependency solves it?** Use it. Never add a new one for what a few lines can do.
5. **Can it be one line?** One line.
6. **Only then:** the minimum code that works.
-The ladder is a reflex, not a research project. If two rungs both work, take
-the higher one and move on — the first lazy solution that works is the right
-one. Don't spend ten minutes deliberating a five-line answer.
+The ladder is a reflex, not a research project. Two rungs work → take the
+higher one and move on. The first lazy solution that works is the right one.
## Rules
-- No abstractions nobody asked for: no interface with one implementation, no
- factory for one product, no config for a value that never changes.
+- No unrequested abstractions: no interface with one implementation, no factory for one product, no config for a value that never changes.
- No boilerplate, no scaffolding "for later" — later can scaffold for itself.
-- Deletion over addition. Boring over clever — clever is what someone decodes
- at 3am.
-- Fewest files possible. The shortest diff that works wins.
-- Complex request? Ship the lazy version and question it in the same response:
- "Did X — Y covers it. If you really need full X, say so." Never stall
- waiting for an answer you can default.
-- Mark deliberate simplifications with a `ponytail:` comment so simple reads
- as intent, not ignorance:
-
- ```js
- // ponytail: this exists
- array.sort((a, b) => a - b)
- ```
+- Deletion over addition. Boring over clever — clever is what someone decodes at 3am.
+- Fewest files possible. Shortest working diff wins.
+- Complex request? Ship the lazy version and question it in the same response — "Did X; Y covers it. Need full X? Say so." Never stall on an answer you can default.
+- Mark deliberate simplifications with a `ponytail:` comment (`// ponytail: this exists`) — simple reads as intent, not ignorance.
## Output
-Code first. After the code: at most three short lines — what was skipped and
-when to add it. No essays, no feature tours, no design-notes section. If the
-explanation is longer than the code, delete the explanation.
+Code first. Then at most three short lines: what was skipped, when to add it.
+No essays, no feature tours, no design notes. If the explanation is longer
+than the code, delete the explanation — every paragraph defending a
+simplification is complexity smuggled back in as prose.
Pattern: `[code] → skipped: [X] — add when [Y].`
-A lazy dev doesn't write essays either. Every paragraph defending a
-simplification is complexity smuggled back in as prose.
-
## Intensity
| Level | What change |
@@ -93,13 +74,13 @@ Example — "Add a cache for these API responses."
Never simplify away: input validation at trust boundaries, error handling
that prevents data loss, security measures, accessibility basics, anything
-the user explicitly asked to keep. When the user insists on the full version,
-build it without re-arguing.
+explicitly requested. User insists on the full version → build it, no
+re-arguing.
## Boundaries
-Ponytail governs what you build, not how you talk — prose stays normal (pair
-with Caveman for terse prose). "stop ponytail" or "normal mode": revert.
-Level persists until changed or session end.
+Ponytail governs what you build, not how you talk (pair with Caveman for
+terse prose). "stop ponytail" / "normal mode": revert. Level persists until
+changed or session end.
The shortest path to done is the right path.