Skip to content

Commit e010757

Browse files
feat(skills): add /ponytail-gain measured-impact scoreboard (DietrichGebert#108)
A one-shot scoreboard showing ponytail's measured benchmark impact (less code, less cost, more speed) as plain ASCII bars, then points to /ponytail-debt and /ponytail-audit for this repo's real numbers. Complements the existing skills rather than duplicating them: debt harvests the ponytail: ledger, audit finds what's cuttable, gain shows the measured why-it-matters. No per-repo savings number is ever printed -- the unbuilt version was never written, so there is no real baseline to subtract from in a live repo. The bars carry the published benchmark medians (5 tasks, 3 models); per-repo figures come from debt's count. Ships every adapter the other commands ship: Claude commands/*.toml, OpenCode .opencode/command/*.md, OpenClaw skill (generated), Pi command registration. Help card, command enumeration, portability table, and README updated in the same change.
1 parent ef0a375 commit e010757

12 files changed

Lines changed: 119 additions & 3 deletions

File tree

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
---
2+
name: ponytail-gain
3+
description: "Show ponytail measured impact as a scoreboard: less code, less cost, more speed, from the benchmark medians. One-shot display."
4+
homepage: https://github.com/DietrichGebert/ponytail
5+
license: MIT
6+
---
7+
8+
# Ponytail Gain
9+
10+
Display this scoreboard when invoked. One-shot: do NOT change mode, write flag
11+
files, or persist anything.
12+
13+
The figures are the published benchmark medians (5 everyday tasks: email
14+
validator, debounce, CSV sum, countdown timer, rate limiter; three models:
15+
Haiku, Sonnet, Opus). They are measured, not computed from the current repo.
16+
Source: `benchmarks/` and the README.
17+
18+
## Scoreboard
19+
20+
Render plain ASCII bars. The bar length shows the measured range; the label
21+
carries the exact figure:
22+
23+
```
24+
ponytail gain benchmark median · 5 tasks · 3 models
25+
26+
Lines of code no-skill ████████████████████ 100%
27+
ponytail ██▌················· 6–20% ▼ 80–94%
28+
Cost no-skill ████████████████████ 100%
29+
ponytail █████▌·············· 23–53% ▼ 47–77%
30+
Speed ponytail ▸ 3–6× faster
31+
32+
This repo: /ponytail-debt (shortcuts you deferred)
33+
/ponytail-audit (what's still cuttable)
34+
```
35+
36+
## Honesty boundary
37+
38+
These are benchmark medians, not this repo. NEVER print a per-repo savings
39+
number ("you saved X lines/tokens here"): the unbuilt version was never
40+
written, so there is no real baseline to subtract from in a live repo. The
41+
only real per-repo figures come from `/ponytail-debt` (a counted ledger), and
42+
this card points there instead of inventing one.
43+
44+
## Boundaries
45+
46+
One-shot display. Edits nothing, changes no mode.
47+
"stop ponytail" or "normal mode": revert.

‎.openclaw/skills/ponytail-help/SKILL.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ Level sticks until changed or session end.
2626
|-------|---------|--------------|
2727
| **ponytail** | `/ponytail` | Lazy mode itself. Simplest solution that works. |
2828
| **ponytail-review** | `/ponytail-review` | Over-engineering review: `L42: yagni: factory, one product. Inline.` |
29+
| **ponytail-gain** | `/ponytail-gain` | Measured-impact scoreboard: less code, less cost, more speed. |
2930
| **ponytail-help** | `/ponytail-help` | This card. |
3031

3132
Codex uses `@ponytail`, `@ponytail-review`, and `@ponytail-help`; Claude Code

‎.opencode/command/ponytail-gain.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
description: Show ponytail's measured impact scoreboard (less code, cost, time)
3+
---
4+
5+
Show the ponytail gain scoreboard. One shot, change nothing: do not switch mode, write flag files, or persist anything. Render the published benchmark medians (5 everyday tasks; models Haiku, Sonnet, Opus; source benchmarks/ and the README) as plain ASCII bars: Lines of code, no-skill 100% vs ponytail 6-20% (down 80-94%); Cost, no-skill 100% vs ponytail 23-53% (down 47-77%); Speed, ponytail 3-6x faster. The bar length shows the measured range, the label carries the exact figure. These are benchmark medians, not this repo. NEVER print a per-repo savings number: the unbuilt version was never written, so there is no real baseline to subtract from in a live repo. For real per-repo figures, point to /ponytail-debt (the counted shortcut ledger) and /ponytail-audit (what is still cuttable). Report only.

‎README.md‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ Reads `AGENTS.md` from the project root — zero setup. Copy [`AGENTS.md`](AGENT
184184
clawhub install ponytail
185185
```
186186

187-
Installs ponytail as an OpenClaw skill from ClawHub; the review, audit, debt, and help skills install the same way (`clawhub install ponytail-review`, and so on). OpenClaw applies it on coding tasks and also exposes it as a `/ponytail` command. Without ClawHub, copy [`.openclaw/skills/ponytail`](.openclaw/skills/) into `~/.openclaw/skills/`.
187+
Installs ponytail as an OpenClaw skill from ClawHub; the review, audit, debt, gain, and help skills install the same way (`clawhub install ponytail-review`, and so on). OpenClaw applies it on coding tasks and also exposes it as a `/ponytail` command. Without ClawHub, copy [`.openclaw/skills/ponytail`](.openclaw/skills/) into `~/.openclaw/skills/`.
188188

189189
That was it. He'd be proud. He won't say it.
190190

@@ -210,6 +210,7 @@ Which files map to which agent: [Agent portability](docs/agent-portability.md).
210210
| `/ponytail-review` | Review the current diff for over-engineering, hands back a delete-list. |
211211
| `/ponytail-audit` | Audit the whole repo for over-engineering, not just the diff. |
212212
| `/ponytail-debt` | Harvest the `ponytail:` shortcuts you've deferred into a ledger, so "later" doesn't become "never". |
213+
| `/ponytail-gain` | Show the measured impact scoreboard (less code, less cost, more speed) from the benchmark. |
213214
| `/ponytail-help` | Quick reference for the commands above. |
214215

215216
Commands need a skill-capable host (Claude Code, Codex, OpenCode, Gemini, pi). In Codex they're skills, invoke with `@` (`@ponytail-review`). The instruction-only adapters (Cursor, Windsurf, Cline, Copilot, Kiro, Antigravity) load the always-on ruleset without the commands.

‎commands/ponytail-gain.toml‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
description = "Show ponytail's measured impact scoreboard (less code, cost, time)"
2+
prompt = "Show the ponytail gain scoreboard. One shot, change nothing: do not switch mode, write flag files, or persist anything. Render the published benchmark medians (5 everyday tasks; models Haiku, Sonnet, Opus; source benchmarks/ and the README) as plain ASCII bars: Lines of code, no-skill 100% vs ponytail 6-20% (down 80-94%); Cost, no-skill 100% vs ponytail 23-53% (down 47-77%); Speed, ponytail 3-6x faster. The bar length shows the measured range, the label carries the exact figure. These are benchmark medians, not this repo. NEVER print a per-repo savings number: the unbuilt version was never written, so there is no real baseline to subtract from in a live repo. For real per-repo figures, point to /ponytail-debt (the counted shortcut ledger) and /ponytail-audit (what is still cuttable). Report only."

‎commands/ponytail-help.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
description = "Quick reference for ponytail levels, skills, and commands"
2-
prompt = "Show the ponytail quick reference. One shot, change nothing: do not switch mode, write flag files, or persist anything. Levels: /ponytail lite (build what's asked, name the lazier alternative in one line), /ponytail (full, the default ladder: YAGNI then stdlib then native then one line then minimum), /ponytail ultra (deletion before addition, challenges the requirement before building). Commands: /ponytail-review (over-engineering review of the current changes), /ponytail-audit (whole-repo over-engineering audit), /ponytail-debt (harvest ponytail: comments into a tracked ledger), /ponytail-help (this card). Deactivate with 'stop ponytail', 'normal mode', or /ponytail off; resume anytime with /ponytail. Default mode is full; change it with the PONYTAIL_DEFAULT_MODE environment variable (off|lite|full|ultra) or a config file at ~/.config/ponytail/config.json (Windows: %APPDATA%\\ponytail\\config.json) with {\"defaultMode\": \"lite\"}. Resolution order: env var, then config file, then full."
2+
prompt = "Show the ponytail quick reference. One shot, change nothing: do not switch mode, write flag files, or persist anything. Levels: /ponytail lite (build what's asked, name the lazier alternative in one line), /ponytail (full, the default ladder: YAGNI then stdlib then native then one line then minimum), /ponytail ultra (deletion before addition, challenges the requirement before building). Commands: /ponytail-review (over-engineering review of the current changes), /ponytail-audit (whole-repo over-engineering audit), /ponytail-debt (harvest ponytail: comments into a tracked ledger), /ponytail-gain (measured-impact scoreboard from the benchmark), /ponytail-help (this card). Deactivate with 'stop ponytail', 'normal mode', or /ponytail off; resume anytime with /ponytail. Default mode is full; change it with the PONYTAIL_DEFAULT_MODE environment variable (off|lite|full|ultra) or a config file at ~/.config/ponytail/config.json (Windows: %APPDATA%\\ponytail\\config.json) with {\"defaultMode\": \"lite\"}. Resolution order: env var, then config file, then full."

‎docs/agent-portability.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,6 @@ instructions, keep its copied rule text aligned with `AGENTS.md`.
3636
- `skills/ponytail-review/SKILL.md`: over-engineering review
3737
- `skills/ponytail-audit/SKILL.md`: whole-repo over-engineering audit
3838
- `skills/ponytail-debt/SKILL.md`: harvest `ponytail:` shortcuts into a tracked ledger
39+
- `skills/ponytail-gain/SKILL.md`: measured-impact scoreboard from the benchmark
3940
- `skills/ponytail-help/SKILL.md`: quick reference
4041
- `AGENTS.md`: compact always-on instruction set for agents without skill support

‎pi-extension/index.js‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,11 @@ export default function ponytailExtension(pi) {
120120
handler: (_args, ctx) => sendAlias("/skill:ponytail-audit", "", ctx),
121121
});
122122

123+
pi.registerCommand("ponytail-gain", {
124+
description: "Run /skill:ponytail-gain",
125+
handler: (_args, ctx) => sendAlias("/skill:ponytail-gain", "", ctx),
126+
});
127+
123128
pi.registerCommand("ponytail-debt", {
124129
description: "Run /skill:ponytail-debt",
125130
handler: (_args, ctx) => sendAlias("/skill:ponytail-debt", "", ctx),

‎pi-extension/test/extension.test.js‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ function withTempConfig(fn) {
5757
test("extension registers Ponytail commands", () => {
5858
const { commands } = createPiHarness();
5959

60-
assert.deepEqual([...commands.keys()].sort(), ["ponytail", "ponytail-audit", "ponytail-debt", "ponytail-help", "ponytail-review"]);
60+
assert.deepEqual([...commands.keys()].sort(), ["ponytail", "ponytail-audit", "ponytail-debt", "ponytail-gain", "ponytail-help", "ponytail-review"]);
6161
});
6262

6363
test("/ponytail updates session mode and injects instructions", async () => withTempConfig(async () => {
@@ -100,12 +100,14 @@ test("skill alias commands delegate to Pi skill commands", async () => {
100100
await commands.get("ponytail-review").handler("", ctx);
101101
await commands.get("ponytail-audit").handler("", ctx);
102102
await commands.get("ponytail-debt").handler("", ctx);
103+
await commands.get("ponytail-gain").handler("", ctx);
103104
await commands.get("ponytail-help").handler("", ctx);
104105

105106
assert.deepEqual(sentUserMessages.map((entry) => entry.text), [
106107
"/skill:ponytail-review",
107108
"/skill:ponytail-audit",
108109
"/skill:ponytail-debt",
110+
"/skill:ponytail-gain",
109111
"/skill:ponytail-help",
110112
]);
111113
});

‎scripts/build-openclaw-skills.js‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ const DESCRIPTIONS = {
2121
'ponytail-review': 'Review a diff for over-engineering. Finds what to delete: reinvented stdlib, needless deps, speculative abstractions. One line per finding.',
2222
'ponytail-audit': 'Audit the whole repo for over-engineering. A ranked list of what to delete, simplify, or replace with stdlib or native features.',
2323
'ponytail-debt': 'Harvest every ponytail: shortcut comment into one debt ledger, so deferrals get tracked instead of forgotten. One-shot report.',
24+
'ponytail-gain': 'Show ponytail measured impact as a scoreboard: less code, less cost, more speed, from the benchmark medians. One-shot display.',
2425
'ponytail-help': "Quick reference for ponytail's modes, skills, and commands. One-shot display.",
2526
};
2627

0 commit comments

Comments
 (0)