Compare commits

..
Author SHA1 Message Date
EmerikoandClaude Opus 4.8 dffe9eb822 fix: drop em dashes from ponytail-audit/review scope wording (#163)
#163 clarified the audit/review Boundaries scope but reintroduced em dashes,
which this repo deliberately purged (commit 88431de "replace em dashes with
plain punctuation across prose"). Keeps the clearer wording, swaps the em dash
for a period. .openclaw mirrors regenerated; suite green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 02:20:49 +02:00
DietrichGebertandClaude Opus 4.8 cf9cbd531e Revert #82 (Modern Web Guidance rung-3) and re-sync mirrors (#178)
#82 added a "Web tasks: rung 3 lookup" section to the always-on ponytail
SKILL.md, about an external `modern-web` CLI most users won't have installed.
It's optional bloat in the always-on ruleset, and it broke CI by leaving the
.openclaw mirror stale.

Reverts the section from skills/ponytail/SKILL.md, the README callout, and
examples/web-platform-lookup.md, then regenerates the .openclaw mirror and
removes the Spanish callout that #174 had mirrored. Suite green (56/56).

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 02:09:30 +02:00
DietrichGebertandClaude Opus 4.8 10a375b836 fix: regenerate .openclaw ponytail skill mirror (fixes red CI) (#177)
#82 added the "Web tasks: rung 3 lookup" section to skills/ponytail/SKILL.md
but did not run scripts/build-openclaw-skills.js, so the committed
.openclaw/skills/ponytail/SKILL.md mirror drifted from its source. The two
generator-sync tests in tests/openclaw-skills.test.js have failed on main
since that merge. Regenerated the mirror; suite is green again.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 02:01:16 +02:00
DietrichGebertandClaude Opus 4.8 f316f14d96 chore(ponytail-mcp): mark private, drop dead bin (#176)
ponytail-mcp reuses the repo's hooks/ via createRequire("../hooks/..."), which
reaches outside the package dir, so it can only run from a checkout (as its
README says), never as a published npm package — a publish tarball wouldn't
include ../hooks/ and would crash. The `bin` field and missing `private` made
it look publishable. Mark it private so an accidental `npm publish` can't ship
a broken package, and drop the dead bin (you point the host at ponytail-mcp/index.js).

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 01:57:02 +02:00
DietrichGebert 48cdf05a25 Revert "benchmarks: add system prompt to baseline arm so it doesn't ramble (closes #126) (#128)" (#175)
This reverts commit 37f46b8f02.
2026-06-19 01:44:13 +02:00
DietrichGebertandClaude Opus 4.8 a4e5e479d6 docs: re-sync README.es.md to current English (agentic numbers, CodeWhale) (#174)
The Spanish README merged (#110) carrying stale content: the old flat
"80-94% menos código" single-shot headline (the exact claim #126 corrected),
no CodeWhale section, badge stuck at 13 agents, and missing the Modern Web
Guidance callout (#82) and the Claude Code desktop-install paragraph.

Re-translates the hero + Números section to the corrected agentic numbers
(~54%, up to 94%, 100% safe) with the old figures demoted to the same
<details> block English uses, adds CodeWhale, fixes the badge, and adds a
"community translation, English is the reference" note. Also adds a minimal
Español discoverability link to the English README so readers can find it.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 00:44:08 +02:00
10 changed files with 7 additions and 89 deletions
+1 -1
View File
@@ -32,6 +32,6 @@ End with `net: -<N> lines, -<M> deps possible.` Nothing to cut: `Lean already. S
## Boundaries ## Boundaries
Scope: over-engineering and complexity only. Correctness bugs, security holes, Scope: over-engineering and complexity only. Correctness bugs, security holes,
and performance are explicitly out of scope — route them to a normal review and performance are explicitly out of scope. Route them to a normal review
pass. Lists findings, applies nothing. One-shot. pass. Lists findings, applies nothing. One-shot.
"stop ponytail-audit" or "normal mode" to revert. "stop ponytail-audit" or "normal mode" to revert.
+1 -1
View File
@@ -45,7 +45,7 @@ If there is nothing to cut, say `Lean already. Ship.` and stop.
## Boundaries ## Boundaries
Scope: over-engineering and complexity only. Correctness bugs, security holes, Scope: over-engineering and complexity only. Correctness bugs, security holes,
and performance are explicitly out of scope — route them to a normal review and performance are explicitly out of scope. Route them to a normal review
pass, not this one. A single smoke test or `assert`-based pass, not this one. A single smoke test or `assert`-based
self-check is the ponytail minimum, not bloat, never flag it for deletion. self-check is the ponytail minimum, not bloat, never flag it for deletion.
Does not apply the fixes, only lists them. Does not apply the fixes, only lists them.
-2
View File
@@ -46,8 +46,6 @@ Con ponytail:
Más sobrevivientes en [examples/](examples/). Más sobrevivientes en [examples/](examples/).
> **Combina bien con** [Modern Web Guidance](https://github.com/GoogleChrome/modern-web-guidance) para trabajo web: ponytail decide *si* apoyarse en la plataforma, MWG es cómo el agente busca *qué* feature nativa hace el trabajo. Ver [examples/web-platform-lookup.md](examples/web-platform-lookup.md).
## Números ## Números
La medición honesta es un agente real haciendo trabajo real: una sesión headless de Claude Code editando [el template full-stack-fastapi de tiangolo](https://github.com/fastapi/full-stack-fastapi-template) (un repo real de FastAPI + React), evaluada sobre el `git diff` que deja. Doce tickets de feature, el mismo agente con y sin el skill, n=4, Haiku 4.5. La medición honesta es un agente real haciendo trabajo real: una sesión headless de Claude Code editando [el template full-stack-fastapi de tiangolo](https://github.com/fastapi/full-stack-fastapi-template) (un repo real de FastAPI + React), evaluada sobre el `git diff` que deja. Doce tickets de feature, el mismo agente con y sin el skill, n=4, Haiku 4.5.
-2
View File
@@ -46,8 +46,6 @@ With ponytail:
More survivors in [examples/](examples/). More survivors in [examples/](examples/).
> **Pairs well with** [Modern Web Guidance](https://github.com/GoogleChrome/modern-web-guidance) for web work: ponytail decides *whether* to lean on the platform, MWG is how the agent looks up *which* native feature does the job. See [examples/web-platform-lookup.md](examples/web-platform-lookup.md).
## Numbers ## Numbers
The honest measurement is a real agent doing real work: a headless Claude Code session editing [tiangolo's full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template) (a real FastAPI + React repo), scored on the `git diff` it leaves behind. Twelve feature tickets, the same agent with and without the skill, n=4, Haiku 4.5. The honest measurement is a real agent doing real work: a headless Claude Code session editing [tiangolo's full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template) (a real FastAPI + React repo), scored on the `git diff` it leaves behind. Twelve feature tickets, the same agent with and without the skill, n=4, Haiku 4.5.
+2 -6
View File
@@ -1,6 +1,2 @@
// Baseline arm: no skill, with a one-line system prompt so the model doesn't ramble. // Baseline arm: no skill, just the task.
const system = 'Provide just one example for any given task, and no commentary or usage examples.'; module.exports = ({ vars }) => [{ role: 'user', content: vars.task }];
module.exports = ({ vars }) => [
{ role: 'system', content: system },
{ role: 'user', content: vars.task },
];
-64
View File
@@ -1,64 +0,0 @@
# Web Platform Lookup
**Task:** "Add a modal dialog that closes when you click the backdrop."
Rung 3 of the ladder is "native platform feature covers it?" On web work the
trap is that the agent forgets what the platform already does and reaches for a
library. When ponytail has [Modern Web Guidance](https://github.com/GoogleChrome/modern-web-guidance)
on hand, rung 3 gets a lookup: `modern-web search "modal dialog light dismiss"`.
## Without Ponytail
```bash
npm install @radix-ui/react-dialog
```
```jsx
import * as Dialog from "@radix-ui/react-dialog";
export default function Modal({ open, onOpenChange, children }) {
return (
<Dialog.Root open={open} onOpenChange={onOpenChange}>
<Dialog.Portal>
<Dialog.Overlay className="overlay" />
<Dialog.Content className="content">
{children}
<Dialog.Close className="close">×</Dialog.Close>
</Dialog.Content>
</Dialog.Portal>
</Dialog.Root>
);
}
```
A dependency, a portal, an overlay node, and controlled open state, to put a
box on top with a backdrop.
## With Ponytail
`modern-web search "modal dialog light dismiss"`
`modern-web retrieve light-dismiss-a-dialog`. The platform has it:
```html
<!-- ponytail: <dialog> + closedby, browser does the backdrop, focus trap, and Esc -->
<dialog closedby="any">
<p>...</p>
</dialog>
```
```js
document.querySelector("dialog").showModal();
```
**1 dependency + portal/overlay machinery → 0 dependencies + a `<dialog>`.**
The `::backdrop` is free, focus is trapped and restored for you, `Esc` closes
it, and `closedby="any"` adds click-outside dismissal. The browser team did the
work.
## The point
MWG suggests the cutting edge, ponytail keeps only the rung that holds. The
lookup found `light-dismiss-a-dialog`; the ladder took it because it deletes a
dependency. The same search would have offered scroll-driven animations and
view transitions for other tasks, and the ladder would have skipped them when
the task didn't need them. Lookup, not license.
+1 -1
View File
@@ -2,9 +2,9 @@
"name": "ponytail-mcp", "name": "ponytail-mcp",
"version": "0.1.0", "version": "0.1.0",
"description": "MCP server that serves Ponytail's lazy-senior-dev instructions as a prompt and a tool.", "description": "MCP server that serves Ponytail's lazy-senior-dev instructions as a prompt and a tool.",
"private": true,
"type": "module", "type": "module",
"license": "MIT", "license": "MIT",
"bin": { "ponytail-mcp": "./index.js" },
"scripts": { "test": "node --test ./test/*.test.js" }, "scripts": { "test": "node --test ./test/*.test.js" },
"dependencies": { "dependencies": {
"@modelcontextprotocol/sdk": "^1.19.0", "@modelcontextprotocol/sdk": "^1.19.0",
+1 -1
View File
@@ -36,6 +36,6 @@ End with `net: -<N> lines, -<M> deps possible.` Nothing to cut: `Lean already. S
## Boundaries ## Boundaries
Scope: over-engineering and complexity only. Correctness bugs, security holes, Scope: over-engineering and complexity only. Correctness bugs, security holes,
and performance are explicitly out of scope — route them to a normal review and performance are explicitly out of scope. Route them to a normal review
pass. Lists findings, applies nothing. One-shot. pass. Lists findings, applies nothing. One-shot.
"stop ponytail-audit" or "normal mode" to revert. "stop ponytail-audit" or "normal mode" to revert.
+1 -1
View File
@@ -50,7 +50,7 @@ If there is nothing to cut, say `Lean already. Ship.` and stop.
## Boundaries ## Boundaries
Scope: over-engineering and complexity only. Correctness bugs, security holes, Scope: over-engineering and complexity only. Correctness bugs, security holes,
and performance are explicitly out of scope — route them to a normal review and performance are explicitly out of scope. Route them to a normal review
pass, not this one. A single smoke test or `assert`-based pass, not this one. A single smoke test or `assert`-based
self-check is the ponytail minimum, not bloat, never flag it for deletion. self-check is the ponytail minimum, not bloat, never flag it for deletion.
Does not apply the fixes, only lists them. Does not apply the fixes, only lists them.
-10
View File
@@ -40,16 +40,6 @@ Stop at the first rung that holds:
The ladder is a reflex, not a research project. Two rungs work → take the 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. higher one and move on. The first lazy solution that works is the right one.
## Web tasks: rung 3 lookup
On web work, rung 3 is where the laziest win hides: a native element or CSS
behavior the agent forgot exists. If a web task turns on whether the platform
covers it (a date input, dialog, popover, view transition, container query),
and the `modern-web` CLI is available, look it up: `modern-web search "<task>"`,
then `modern-web retrieve <id>`. It is a lookup, not a license, the answer
still goes through the ladder. MWG suggests the cutting edge; you keep only the
rung that holds. Not installed? Skip it, the ladder runs fine without it.
## Rules ## Rules
- No unrequested abstractions: 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.