Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dffe9eb822 | ||
|
|
cf9cbd531e | ||
|
|
10a375b836 | ||
|
|
f316f14d96 | ||
|
|
48cdf05a25 | ||
|
|
a4e5e479d6 |
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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 },
|
|
||||||
];
|
|
||||||
|
|||||||
@@ -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.
|
|
||||||
@@ -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",
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user