Ponytailとは?AIエージェントの最小実装ルール
PonytailはAIコーディングエージェントに最小限の変更を選ばせるルールセットです。日付ピッカーを404行から23行にした例、ベンチマーク、導入方法を紹介します。
Ponytailとは
Ponytailは、AIコーディングエージェントが書くコードを減らすルールセットです。このプロジェクトは、「部屋で最も怠惰なシニア開発者のようにAIエージェントに考えさせる。最良のコードは、書かなかったコードである」と1行で説明しています。MITライセンスです。独自のランタイムはなく、内部で実行されるものもありません。エージェントの指示に組み込むテキストであり、skillを読み込むホスト向けにはskillとして、読み込まないホスト向けには通常のルールファイルとしてパッケージ化されています。
リポジトリはDietrichGebert/ponytailです。2026年6月12日に作成され、2026年8月1日までに90,000スターを獲得しました。2026年8月1日時点の最新のタグ付きリリースはv4.8.4です。2026年6月29日に公開され、リリースページには6月14日から29日までの間だけで10個のタグが掲載されています。このペースで進むプロジェクトは、この記事を読む時点で変更されている可能性があります。そのため、このプロジェクトを基盤に何かを構築する前に、タグを固定してください。
ツールの前に考えること: 最初に成立する段で止める
Ponytailの中心にあるのは、判断の段階です。エージェントは何かを書く前にこの段階を順に確認し、最初に成立する段で止まります。
- そもそも存在する必要がありますか。これはYAGNI(必要になるまで作らない)です。答えが「いいえ」なら、実装しません。
- このコードベースにすでに存在しますか。既存のヘルパーまたはパターンを再利用します。
- 標準ライブラリで対応できますか。標準ライブラリを使用します。
- ネイティブのプラットフォーム機能で対応できますか。ネイティブ機能を使用します。
- すでにインストールされている依存関係で解決できますか。その依存関係を使用します。
- 1行にできますか。1行にします。
- それでも必要な場合に限り、動作する最小限のコードを書きます。
重要なのは、個々の段ではなく、この順序です。日付ピッカーを求められたエージェントは、日付ピッカーを実装します。実装するよう指示されたためです。この段階的な判断により、最初に4段目を確認します。4段目では、ブラウザーにすでに<input type="date">があることが分かります。プロジェクト独自のベンチマークにも、まさにこの例が記録されています。このルールがない場合に404行になった日付ピッカーが、ルールを適用すると23行になりました。エージェントがコンポーネントを構築せず、ネイティブの入力機能を使用したためです。カラー ピッカーも同じ理由で287行から23行になりました。
ここでいう怠慢は、不注意を意味しません。ルールセットにも明記されています。「決して怠らないこと」の一覧には、判断する前に問題を理解すること、信頼境界での入力検証、データ損失を防ぐエラー処理、セキュリティ、アクセシビリティ、名前を指定して依頼された内容が含まれています。また、複雑なロジックの各部分について、小さく実行可能な確認を1つ用意することも求めています。このルールは不要な発明を減らします。正確性を損なうものではありません。
リポジトリが実際に提供するもの
AGENTS.md。常時適用されるルールセットで、5分で読める1つのファイルに全体の考え方をまとめています。skills/ponytail/SKILL.md。引数のヒントとしてlite、full、ultraを指定できます。.cursor/rules/や.windsurf/rules/など、エディター固有のディレクトリにあるルールファイル。ルールは読み込むものの、スキルは読み込まないホスト用です。hooks/、benchmarks/、examples/、scripts/。
強度の引数によって、ルールの適用の厳しさが変わります。lite は要求されたものを構築し、より緩い選択肢を1行で示します。full がデフォルトで、段階的な基準を適用します。ultra はYAGNIを極端に適用する設定です。追加より削除を優先し、要件そのものにも異議を唱えます。
スキルに対応するホストでは、スラッシュコマンドも使用できます。/ponytail はレベルを設定し、/ponytail-review は過剰設計がないか差分を確認し、/ponytail-audit はリポジトリ全体を確認し、/ponytail-debt は先送りしたショートカットを収集し、/ponytail-gain はベンチマークの評価表を出力します。ルールファイルだけを読み込むホストでは、コマンドなしでルールセットが適用されます。
信頼する前にソースを読むには、ブランチではなくタグをcloneします。
git clone --depth 1 --branch v4.8.4 https://github.com/DietrichGebert/ponytail.gitClaude Codeでは、代わりにプラグインのインストール方法が案内されています。次の2行は、2026年8月1日時点のドキュメントに記載されている内容です。
/plugin marketplace add DietrichGebert/ponytail
/plugin install ponytail@ponytailプラグインのパスはタグではなくデフォルトブランチを参照します。そのため、エージェントへの指示がセッション間で変更される可能性があります。これは、更新コマンドを利用できる便利さのために受け入れるトレードオフです。
VPSでは怠けるエージェントのほうが安価な理由
エージェントが作成した差分は、会話から消えません。次のターンでは、エージェントが差分の作成時に開いたすべてのファイルとともに、モデルが再び読み込むコンテキストになります。そのため、500行の変更は、それを作成したターンだけでなく、セッション内の後続のすべてのターンに負担をかけます。これが、無制限に進むリファクタリングによって、セッションが進むほどエージェントの動作が遅くなり、判断力が低下したように感じられる理由です。コンテキストウィンドウがエージェント自身の出力で埋まり、実際のコードに使える余地が減るためです。これを制御することが、コーディングエージェントのコンテキストウィンドウを管理する方法の中心課題です。
トークンは入力時と出力時の両方で課金されます。そのため、差分のサイズが半分なら、作成時と、その後の各ターンで再読み込みされるときの2回、コストが下がります。セルフホスト環境の料金を確認している場合、指示ファイルは無料で調整できる手段です。AIエージェントのコストを制御する方法は出力量から始まり、コーディングエージェントがトークンを消費する仕組みでは、再読み込みが予想以上に重要になる理由を説明しています。
人間は依然として差分を読みます。本来20行で済む400行の変更は、レビュー担当者の注意力を消費します。注意力は、最初に尽きるリソースです。誰も、その日の4つ目の長い差分を、最初の差分と同じ注意深さでレビューしません。そのため、過剰な実装は時間を無駄にするだけではありません。ミスを見つけるはずのレビュー品質を、気付かないうちに低下させます。
サーバーでは状況が変わります。エージェントの実行中に誰も監視していないことが多いためです。tmuxセッション内やタイマーで動作するエージェントは、問題のある判断を積み重ねながら、あなたが確認するまで何時間も動作できます。これがVPSでコーディングエージェントを実行する方法における実際のリスクです。そのため、ループエンジニアリングを行う人は、個々のプロンプトよりも常設の指示に多くの注意を払います。常時使用するファイルのルールはターン200にも適用されます。チャットで入力したルールはターン3に適用されます。
新しい依存関係も、見落としやすいコストです。Rung 5では、インストール済みのものを使うよう指示しています。エージェントが独自の判断で追加する各パッケージは、後でパッチを適用する対象になります。また、そのリポジトリから作成するすべてのコンテナイメージに含まれることになります。
Ponytail 自身のベンチマーク結果が示すこと
このプロジェクトは2組の結果を公開していますが、両者には大きな差があります。どちらもプロジェクト自身が公開した数値です。独立したテストではありません。
The data behind this chart
[
{
"label": "Lines of code",
"single_shot_pct": 93,
"agentic_pct": 54
},
{
"label": "Cost per run",
"single_shot_pct": 63,
"agentic_pct": 20
},
{
"label": "Wall clock time",
"single_shot_pct": 74,
"agentic_pct": 27
}
]single shot 列は、ルールありとルールなしで、小規模なプロンプトに bare model が回答した結果です。2026年6月13日と17日の日付で、複数回実行した結果の中央値を示しています。agentic 列は、headless Claude Code セッションが、実際の FastAPI および React リポジトリである tiangolo の full-stack-fastapi-template を編集した結果です。Haiku 4.5 で12件の機能チケットを各4回実行し、残された git diff に基づいて評価しています。
2列目を確認してください。agentic の結果では、コード行数が 54 パーセント、コストが 20 パーセント、経過時間が 27 パーセント減少しています。single shot の設定で同じ指標を測定した場合は、それぞれ 93 パーセントと 74 パーセントです。README では、その理由を明確に説明しています。single shot のベースラインは、bare model が「複数の選択肢と解説を付けて回答する」ものです。これは改善しやすい条件です。実際の作業を行う agent と比較すると、改善幅は小さくなります。ただし、効果自体は残ります。こちらのほうが有用な事実です。
注意点が1つあります。これはプロジェクト自身も示している点で、この仕組みが役立つかどうかを左右します。削減効果が最大になるのは、実際に過剰実装が発生しやすい状況です。すでに最小限のコードには、ほとんど効果がありません。1つの Python および TypeScript リポジトリでの12件のチケットから、あなたのリポジトリの結果を予測することはできません。数値が重要なら、自分のチケットを使い、ルールありとなしで比較を実行して、行数を自分で数えてください。
今日からインストールなしでコピーして使えるパターン
この手順はテキストなので、この考え方を使うためにプラグインをインストールする必要はありません。エージェントがすでに読み込んでいる指示ファイルに、次のようなブロックを貼り付けます。対象は AGENTS.md、CLAUDE.md、またはエディターのルールファイルです。
## Before you write code
Climb this list in order. Stop at the first line that applies.
1. Does this need to exist? If not, say so and stop.
2. Does this repo already have it? Reuse the helper.
3. Does the standard library do it? Use it.
4. Does the platform do it natively? Use it.
5. Does an installed dependency do it? Use it.
6. Can it be one line? Write one line.
7. Otherwise write the minimum that works.
Never take the shortcut on: reading the code before changing it, validating
input that crosses a trust boundary, error handling that would otherwise lose
data, security, accessibility, or anything I asked for by name.
Do not add an abstraction I did not ask for. Do not add a dependency without
saying why in one line. Prefer deleting code to adding it.
Mark a deliberate simplification with a comment naming its ceiling and the
upgrade path.最後のルールは、それだけ取り上げる価値があります。Ponytail では、ツール名を付けたコメントを使うのが慣例です。
# ponytail: global lock, per-account locks if throughput mattersこのコメントには2行分の作業が含まれており、そうでなければレビューのサイクルが必要になる問題を解決します。単純な方法を選んだのは意図的な判断であり、その判断が成立しなくなる条件も示します。これがないと、レビュー担当者は、検討したうえでの簡略化なのか、エージェントが忘れたものなのかを判断できません。そのため、確認が必要になります。
このブロックを置く場所は、書かれている内容と同じくらい重要です。エージェントが実行のたびに読み込むファイルは、監視していない実行も含め、すべての実行に影響します。この違いについては、エージェントが実際に従う AGENTS.md の書き方で説明します。そのため、このパターンは shell の履歴ではなく、コミットするファイルに記述します。
ルールが適用できなくなる場合
この段階表は、既存のコードベースで機能を実装する作業向けに調整されています。通常は再利用でき、再利用するのが適切なものがある状況を前提としています。新規プロジェクトには適していません。rung 2 には再利用するものがなく、rung 5 にはインストール済みのものがないため、エージェントは毎回 rung 7 まで進むからです。同じ抽象化を本当に導入したい場合にも適していません。同じコピー済みブロックを4番目の呼び出し元に追加しようとしているなら、「最短の差分」に従うと5つ目のコピーが作られます。
ultra のレベルでは、要件に疑問を投げかけます。それがこのレベルの目的です。すでに方針を決めていて、実装を完了させたい場合には、実際のコストになります。通常の作業には full を使用し、機能要求そのものに問題があると考えられる場合は ultra を使用します。
どのような指示ブロックでも、問題を誤って理解することは防げません。ルールセットの最初の項目自体が、判断する前にコードを理解することを求めています。これはコストが高く、本文では代わりに実行できない部分です。誤った関数に対する最小限の差分は、依然として誤った修正です。しかも、承認しやすい小さな誤修正になっています。
正直にまとめると、Ponytail は慎重に作成され、適切に配布され、数値を付けたプロンプトです。これを使用するために plugin は必要ありません。このプロジェクトが提供するのは、誰かがリストを適切に作成し、実際のリポジトリで検証し、その方法を結果とともに公開したという点です。
FAQ
PonytailはClaude Code以外のエージェントでも動作しますか?
はい。Ponytailは、スキルを読み込むホスト向けのスキルとして提供されています。対応するホストにはClaude Code、Codex、OpenCode、Geminiなど、READMEに記載された複数の製品があります。Cursor、Windsurf、Cline、Copilotなど、ルールファイルは読み込むもののスキルを読み込まないエディターは、対応するrulesディレクトリから常時適用のルールセットを使用し、スラッシュコマンドは取得しません。どちらの場合もテキストは同じです。実際の違いは、ホストがそのテキストを毎回のターンでコンテキストに保持するか、スキルが呼び出された場合だけ保持するかです。
遅延型のエージェントはテスト、検証、セキュリティを省略しますか?
いいえ。ルールセットにはこの点が明記されています。「決して手を抜かない」項目には、信頼境界での入力検証、データ損失を防ぐエラー処理、セキュリティ、アクセシビリティが含まれています。また、重要なロジックごとに、小さく実行可能なチェックを1つ用意するよう求めています。このルールが排除するのは、要求されていない抽象化や、必要のない依存関係といった、作り上げられた構造です。インストール後にエージェントがテストを省略し始めた場合は、独自の設定にある別の指示がこのルールより優先されていることが原因です。そのため、エージェントが最後に読み込むファイルを確認してください。
公開されている速度とコストの数値は信頼できますか?
これらはプロジェクト独自の測定結果であり、測定方法とともに公開されています。その前提で読む必要があります。単発実行の数値は、選択肢と説明を返すだけの素のモデルとの比較です。README自身も、これは弱いベースラインだと記載しています。エージェント実行の数値は、1つのFastAPIおよびReactリポジトリで、Haiku 4.5を使用したヘッドレスClaude Codeセッションから取得されています。チケットは12件で、各4回実行しています。これらは、その構成における正確な数値です。ただし、あなたのコードベースに対する予測ではありません。プロジェクト自身も、すでに最小限に構成されたコードでは削減効果がほぼゼロになると説明しています。
効果を得るために何かをインストールする必要がありますか?
いいえ。この仕組みはテキストで構成されています。エージェントがすでに読み込んでいる指示ファイルに同等のブロックを貼り付ければ、効果の大部分を得られます。プラグインでは、保守された文面、強度レベル、レビューコマンド、更新手段が提供されます。まずコピーしたブロックを試すことが、インストール自体が必要かどうかを確認するrung 1の答えです。
無人のエージェントが夜間に過剰な実装を行うのを止めるにはどうすればよいですか?
ルールをチャットメッセージではなく、常時適用の指示ファイルに記載してください。これにより、turn 3だけでなく、長時間の実行におけるturn 200にも適用されます。次に、被害を別途制限します。唯一のコピーではなく、壊してもよいcheckoutをエージェントに渡してください。また、何かをmergeする前に人間がdiffをレビューするよう要求してください。最小diffのルールにより、読む必要のある量を減らせます。ただし、最終的に取り込む内容を決めるものではなく、決めるべきでもありません。