When NOT to use
- Restructuring existing code without behavior change — use
refactor.
- Root-cause debugging with evidence gathering — use
systematic-debugging (ponytail fixes at shared function after cause is known).
Ponytail
Governance
Default: full. Switch: /ponytail lite|full|ultra. Off: "stop ponytail". Resets at session end.
Level persists until changed or session end. Ponytail governs what you build, not how you talk.
The ladder
Stop at the first rung that holds:
- Does this need to exist at all? Speculative need = skip it, say so in one line. (YAGNI)
- Already in this codebase? A helper, util, type, or pattern that already lives here → reuse it. Look before you write; re-implementing what's a few files over is the most common slop.
- Stdlib does it? Use it.
- Native platform feature covers it?
<input type="date"> over a picker lib, CSS over JS, DB constraint over app code.
- Already-installed dependency solves it? Use it. Never add a new one for what a few lines can do.
- Can it be one line? One line.
- Only then: the minimum code that works.
The ladder is a reflex, not a research project — but it runs after you
understand the problem, not instead of it. Read the task and the code it
touches first, trace the real flow end to end, then climb. Two rungs work →
take the higher one and move on. The first lazy solution that works is the
right one — once you actually know what the change has to touch.
Bug fix = root cause, not symptom. A report names a symptom; before you edit, grep every caller of the function you're about to touch. The lazy fix IS the root-cause fix: one guard in the shared function is a smaller diff than a guard in every caller, and patching only the path the ticket names leaves every sibling caller still broken. Fix it once, where all callers route through.
Rules
- 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. Shortest working diff wins — but only once you understand the problem. The smallest change in the wrong place isn't lazy, it's a second bug.
- 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.
- Two stdlib options, same size? Take the one that's correct on edge cases. Lazy means writing less code, not picking the flimsier algorithm.
- Mark deliberate simplifications with a
ponytail: comment (// ponytail: this exists), simple reads as intent, not ignorance. Shortcut with a known ceiling (global lock, O(n²) scan, naive heuristic)? The comment names the ceiling and the upgrade path: # ponytail: global lock, per-account locks if throughput matters.
Output
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. Explanation the user
explicitly asked for (a report, a walkthrough, per-phase notes) is not debt,
give it in full, the rule is only against unrequested prose.
Pattern: [code] → skipped: [X], add when [Y].
Completion criteria
References
- Intensity worked example:
references/intensity.md
- Prototype mode (logic/state):
references/prototype-logic.md
- Prototype mode (UI):
references/prototype-ui.md
Related skills
refactor — restructuring existing code (ponytail is for new code).
writing-plans — scope discipline per plan; ponytail governs minimal slice per task.
systematic-debugging — root cause before lazy fix.
1---2name: ponytail3description: Use when about to add new code, structure, an abstraction, or a plan task and a minimal YAGNI solution would do — before building, not for restructuring existing code.4license: MIT5---67## When NOT to use89- Restructuring existing code without behavior change — use `refactor`.10- Root-cause debugging with evidence gathering — use `systematic-debugging` (ponytail fixes at shared function after cause is known).1112# Ponytail1314## Governance1516Default: full. Switch: `/ponytail lite|full|ultra`. Off: "stop ponytail". Resets at session end.1718Level persists until changed or session end. Ponytail governs what you build, not how you talk.1920## The ladder2122Stop at the first rung that holds:23241. **Does this need to exist at all?** Speculative need = skip it, say so in one line. (YAGNI)252. **Already in this codebase?** A helper, util, type, or pattern that already lives here → reuse it. Look before you write; re-implementing what's a few files over is the most common slop.263. **Stdlib does it?** Use it.274. **Native platform feature covers it?** `<input type="date">` over a picker lib, CSS over JS, DB constraint over app code.285. **Already-installed dependency solves it?** Use it. Never add a new one for what a few lines can do.296. **Can it be one line?** One line.307. **Only then:** the minimum code that works.3132The ladder is a reflex, not a research project — but it runs *after* you33understand the problem, not instead of it. Read the task and the code it34touches first, trace the real flow end to end, then climb. Two rungs work →35take the higher one and move on. The first lazy solution that works is the36right one — once you actually know what the change has to touch.3738**Bug fix = root cause, not symptom.** A report names a symptom; before you edit, grep every caller of the function you're about to touch. The lazy fix IS the root-cause fix: one guard in the shared function is a smaller diff than a guard in every caller, and patching only the path the ticket names leaves every sibling caller still broken. Fix it once, where all callers route through.3940## Rules4142- No unrequested abstractions: no interface with one implementation, no factory for one product, no config for a value that never changes.43- No boilerplate, no scaffolding "for later", later can scaffold for itself.44- Deletion over addition. Boring over clever, clever is what someone decodes at 3am.45- Fewest files possible. Shortest working diff wins — but only once you understand the problem. The smallest change in the wrong place isn't lazy, it's a second bug.46- 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.47- Two stdlib options, same size? Take the one that's correct on edge cases. Lazy means writing less code, not picking the flimsier algorithm.48- Mark deliberate simplifications with a `ponytail:` comment (`// ponytail: this exists`), simple reads as intent, not ignorance. Shortcut with a known ceiling (global lock, O(n²) scan, naive heuristic)? The comment names the ceiling and the upgrade path: `# ponytail: global lock, per-account locks if throughput matters`.4950## Output5152Code first. Then at most three short lines: what was skipped, when to add it.53No essays, no feature tours, no design notes. If the explanation is longer54than the code, delete the explanation, every paragraph defending a55simplification is complexity smuggled back in as prose. Explanation the user56explicitly asked for (a report, a walkthrough, per-phase notes) is not debt,57give it in full, the rule is only against unrequested prose.5859Pattern: `[code] → skipped: [X], add when [Y].`6061## Completion criteria6263- [ ] Ladder climbed after reading affected code; higher rung taken among ties64- [ ] No speculative abstraction/config/factory added; reused existing codebase code where found65- [ ] Deliberate simplification marked with `ponytail:` comment including ceiling/upgrade path66- [ ] Output is code first + ≤3 lines "skipped / add when" (unless user asked for prose)6768## References6970- Intensity worked example: `references/intensity.md`71- Prototype mode (logic/state): `references/prototype-logic.md`72- Prototype mode (UI): `references/prototype-ui.md`7374## Related skills7576- `refactor` — restructuring existing code (ponytail is for new code).77- `writing-plans` — scope discipline per plan; ponytail governs minimal slice per task.78- `systematic-debugging` — root cause before lazy fix.