導入

Fable(ClaudeCodeの最上位モデル)やAstra(Codexの最上位モデル)などAIエージェントの性能は日々進化していますが、それに比例するようにトークン消費量も増加しがちです。少し複雑な機能を1つ実装させただけで、気づけばサブスクリプションの利用上限に近づいていた、という経験をお持ちの方も多いのではないでしょうか。

AIが賢くなればなるほど、頼んでいないバリデーションや、聞いていない設定ファイル、過剰に汎用化されたクラス構造まで気を利かせて作ってしまう場面に心当たりがある方もいるはずです。これは開発体験としては便利な反面、コストと実行時間の両面で無視できないオーバーヘッドになります。

そんな中でAIコーディングにおける過剰な実装を抑えるOSSとして話題になったのがこの「Ponytail」です。今回は実際に簡易的な検証を行い、導入前後でどれだけ差が出るのかを検証してみました。

Ponytailの紹介

Ponytailは、Claude Code・Codex・GitHub Copilot CLIなど主要なAIコーディングエージェント向けに提供されているOSSのプラグイン/ルールセットです。

画像出典: DietrichGebert/ponytail(MIT License)
PonytailのReadmeに記載の謎のおじさん。存在感がありすぎて一度見ると忘れられない。そしてこの顔である

コンセプトは、AIエージェントの中に無口で最小限のコードしか書かない社歴の長いシニアエンジニアを飼う、というものです。コードを書く前に以下の7段階を必ず確認させ、より上位の選択肢で解決できないかを優先的に検討させる仕組みになっています。

  1. そもそも必要か(YAGNI)
  2. 既存コードベースに既にあるか
  3. 標準ライブラリでできるか
  4. プラットフォーム標準機能でできるか
  5. 既にインストール済みの依存関係でできるか
  6. 1行で済むか
  7. それでもダメなら必要最小限の実装

本記事執筆時点でGitHubスター数は14万を超えており、Claude Code・Codex・Gemini CLIなど20種類近いエージェントに対応、ライセンスはMITと、個人・商用問わず手軽に試しやすい構成になっています。ただし削ってはいけない部分も明記されており、トラストバウンダリの入力検証・データロス対策・セキュリティ・アクセシビリティは削減対象外とされています。この安全性は犠牲にしないという建てつけが実際に機能しているかどうかも、今回の検証で見たいポイントの一つでした。

比較してみた結果

結論から言うと、簡易な検証でも目に見えて効果はありました。

簡易的な2種類のツール(日数計算ツール・配色プレビューツール)を、Ponytail導入前後でそれぞれ新規作成し比較したところ、実装にかかった時間、生成されたコードの容量、消費したトークン数(コスト)のすべてで明確な削減が確認できました。それでいて、事前に定めた要件(仕様として明記した必須機能)は導入前後どちらも満たしており、機能面で見劣りすることはありませんでした。検証内容の詳細は以下で解説します。

実際の比較方法

比較の公平性を保つため、以下の方針で実施しました。

検証環境

Claude Code(VS Code拡張版)、モデルはOpus 5、Effortはhigh固定で統一しています。

実装するお題の選定基準

1つの指示文だけで最後まで実装が完結すること、過剰実装が起きやすいことという2つの条件を満たす、以下2つの簡易ツールを新規作成する形にしました。

  • 日数計算ツール: 開始日・終了日から日数を計算するだけの単一HTMLファイル
  • 配色プレビューツール: 背景色・文字色を選ぶとサンプル文章に反映される単一HTMLファイル

いずれも、日付選択にライブラリを使うかブラウザ標準の<input type="date">で済ませるか、配色ピッカーを自作するか<input type="color">で済ませるか、という判断が問われる題材として選定しました。これはPonytailのReadmeにタイムゾーンに関する実装をPonytailであれば余計な実装をせずに<input type="date">と実装すると明記されていたものです。

投入したプロンプト(全文)

Ponytailあり・なしで、以下の文面を一言一句変えずに投入しています。

日数計算ツール

以下の要件を満たす、日数計算ツールを新規に実装してください。
本メッセージ以外のやり取りは行わず、質問や確認を挟まずに最後まで実装を完了させてください。仕様に明記されていない点は、要件を満たす範囲であなたが妥当と判断する内容で実装してください。
本ツールは、HTMLファイルをブラウザで開くだけで動作する形にしてください。ローカルサーバーの起動やビルド手順が必要な状態にはしないでください。

【要件】
・開始日と終了日をそれぞれ入力(選択)できること
・開始日と終了日から、その間の日数を計算して画面に表示すること
・終了日が開始日より前の場合は、日数を計算せず、その旨がわかるメッセージを表示すること
・開始日と終了日が同じ場合は、日数として0日相当が表示されること
・開始日・終了日のいずれかが未入力の場合は、日数の計算結果を表示しないこと
・入力欄の値を変更した際、ボタン操作なしで結果が自動的に更新されること
・前回入力した日付をページ再読み込み後も保持する必要はない
・レスポンシブ対応やデザインの作り込みは不要
・外部サーバーとの通信は不要(ブラウザ内で完結すること)

配色プレビューツール

以下の要件を満たす、配色プレビューツールを新規に実装してください。
本メッセージ以外のやり取りは行わず、質問や確認を挟まずに最後まで実装を完了させてください。仕様に明記されていない点は、要件を満たす範囲であなたが妥当と判断する内容で実装してください。
本ツールは、HTMLファイルをブラウザで開くだけで動作する形にしてください。ローカルサーバーの起動やビルド手順が必要な状態にはしないでください。

【要件】
・背景色と文字色をそれぞれ選択できること
・選択した背景色・文字色を使って、サンプルの文章がプレビュー表示されること
・色を選択した際、ボタン操作なしでプレビューが自動的に更新されること
・ページを開いた初期状態でも、あらかじめ何らかの背景色・文字色が設定されており、プレビューが表示された状態になっていること
・背景色と文字色が非常に近い色(視認しづらい組み合わせ)であっても、操作や表示が壊れないこと
・前回選択した色をページ再読み込み後も保持する必要はない
・レスポンシブ対応やデザインの作り込みは不要
・外部サーバーとの通信は不要(ブラウザ内で完結すること)

意図的に、実装手段(ライブラリを使うか標準タグで済ませるか)には一切触れていません。ここをAIの判断に委ねることが、今回の検証の肝になります。

要件の固定

あわせて、削ってはいけない要件をそれぞれ1つずつ仕込んでいます。

  • 日数計算ツール: 終了日が開始日より前の場合にエラーを出すこと
  • 配色プレビューツール: 背景色と文字色が非常に近い(視認しづらい)組み合わせでも、操作や表示が壊れないこと

コード量の計測方法

wc -lではなく、実際のファイル容量(バイト数)を以下のコマンドで計測しました。

ls -la (対象ディレクトリ)/index.html

トークン消費量の計測方法

トークン消費量は以下の手法で確認しました。

Claude Code(VS Code拡張版含む)は、対話ログをローカルにJSONL形式で書き出しています。まず、プロジェクトごとのログ格納フォルダを確認します。

ls -lt ~/.claude/projects/

作業ディレクトリのパスに対応したフォルダ名(パスの区切り文字がハイフンに置換された名前)が見つかるので、その中の.jsonlファイルを特定します。

ls -lt ~/.claude/projects/(対応するフォルダ名)/

このログをそのまま確認すると、同じメッセージのトークン情報が複数行にわたって重複記録されており、実際の消費量を水増しして集計してしまいます。そのため、メッセージID単位で重複を除去してから集計するPythonスクリプトを用意しました。

import json
import syspath = sys.argv[1]
seen_ids = set()
totals = {
"input_tokens": 0,
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 0,
"output_tokens": 0,
} with open(path) as f:
for line in f:
line = line.strip()
if not line:
continue
try:
data = json.loads(line)
except json.JSONDecodeError:
continue
msg = data.get("message")
if not msg:
continue
usage = msg.get("usage")
if not usage:
continue
msg_id = msg.get("id")
if not msg_id or msg_id in seen_ids:
continue
seen_ids.add(msg_id)
for key in totals:
totals[key] += usage.get(key, 0) or 0
print("重複除去後の内訳:")
for key, value in totals.items():
print(f" {key}: {value}")
print(f"合計トークン数: {sum(totals.values())}")

このスクリプトに対象のJSONLファイルのパスを渡すと、input_tokens(通常入力)、cache_creation_input_tokens(キャッシュ書込)、cache_read_input_tokens(キャッシュ読込)、output_tokens(出力)の4項目が個別に集計できます。

python3 count_tokens.py ~/.claude/projects/(対応するフォルダ名)/(ファイル名).jsonl

なお、/costというビルトインコマンドも存在しますが、Claude Max/Proのサブスクリプションユーザーは対象外とドキュメントに明記されているため、今回はこのログから確認する方式としています。

各条件は毎回まっさらな新規ディレクトリ・新規セッションで実施し、会話履歴の混入を防止しています。

試行回数

今回はn=1(各条件1回ずつ)での検証です。傾向を掴むための簡易検証であり、統計的な有意性を主張するものではない点はあらかじめお断りしておきます。

比較結果(詳細)

日数計算ツール

項目PonytailなしPonytailあり差分
実装時間約65秒約20秒-69%
ファイル容量2,880 bytes881 bytes-69%
output_tokens3,591949-74%
概算コスト約$0.26約$0.15-45%

配色プレビューツール

項目PonytailなしPonytailあり差分
ファイル容量3,793 bytes1,044 bytes-72%
output_tokens2,5891,220-53%
概算コスト約$0.20約$0.16-21%

※配色プレビューツールはPonytailなしの場合の実装時の時間を測り忘れました。申し訳ないです。Ponytailありの時は20秒程度だったのでこちらも短縮されていると思っています。

概算コストは、Anthropic公式のAPI料金(Opus 5: 入力$5、出力$25、キャッシュ読込$0.50、キャッシュ書込$6.25、いずれも100万トークンあたり)を基準に試算した参考値です。今回の検証自体はClaude Proプランの定額枠内で実施しており、実際に別途課金が発生したわけではありません。

実装における差異

選定基準で触れた通り、今回のお題は日付選択や配色選択にライブラリを持ち出すか、ブラウザ標準タグで済ませるかという判断をPonytailの有用性を測る指標の一つとして考えていました。実際に生成されたコードを確認したところ、Ponytailの有無にかかわらず、日数計算ツール・配色プレビューツールのいずれも外部ライブラリを導入することなく、<input type="date"><input type="color">というブラウザ標準タグでの実装に統一されていました。つまり今回のお題においては、Ponytailを使わなくても過剰な実装は起きておらず、この観点でのPonytail導入の効果を直接見ることはできませんでした。これはOpus 5がこの程度のシンプルな要求に対して、素の状態でも既に標準タグを選ぶ判断力を持っていたためと考えられます。

差が出たのはタグの選定ではなく、その周辺に何を足すかという部分でした。次項で詳しく触れます。

動作確認の結果

コードレビューだけでなく、実際にブラウザで動かして境界値を確認しました。

  • 逆順日付(終了日が開始日より前)、同日指定、未入力パターン: どちらの条件でも正しくハンドリングされていた
  • 背景色・文字色を同一色/近似色に設定: どちらの条件でも表示が壊れることはなかった(クラッシュ・空白化なし)

必須要件、および削ってはいけない要件については、Ponytailの有無にかかわらずどちらも満たしていました。

一方で、明確な違いもありました。Ponytailなしの実装は、要件に明記していない付加機能を独自判断で追加していました。

  • 日数計算ツール: 開始日と終了日の両方を含めた日数を参考情報として併記
  • 配色プレビューツール: WCAGコントラスト比を計算し、視認性が低い場合に警告メッセージを表示

これらは要件を超えたおまけの実装であり、聞いていない機能とも言えますし、気の利いた提案とも言えます。Ponytail側はこうした要件外の実装を一貫して行わず、指定された仕様の範囲だけに絞り込んでいました。

ここから見えてくるのは、Ponytailの向き・不向きです。

  • 要件が既にしっかり固まっている場面では、余計な付加機能を作らせず指示通りに最小実装させたいので、Ponytailは有効に機能しそうです
  • 逆に、要件がまだふわっとしている探索的な段階では、あえてPonytailを使わずに、AIが提案してくる付加機能を叩き台にして要件そのものをブラッシュアップしていく、という使い方も選択肢になりそうです

まとめ

今回、簡易的な2つのお題、n=1という限定的な条件ではありますが、Ponytailを導入することで実装時間・コード容量・トークン消費量のいずれも明確に削減され、かつ必須要件・安全性に関わる要件はどちらの条件でも満たされていることが確認できました。

特筆すべきは、Ponytailが削っていたのは要件に書かれていない付加機能に限られていた点です。これは裏を返せば、指示の出し方や要件の詰め方次第で効果の出方が変わるツールだということでもあります。

  • 仕様がFIXしている実装作業では、Ponytailを使って余計な実装を増やさずに最短距離で仕上げる
  • 仕様を固めている最中の探索的な実装では、あえてPonytailを使わずにAIの提案を要件定義のブラッシュアップの材料にする

というように、フェーズに応じて使い分けるのが実践的な運用になりそうです。今回はあくまで簡易な検証でしたが、日々のコーディング作業でトークン消費量やコストが気になっている方は、一度試してみる価値のあるツールだと感じました。

ここまで読んでいただき、ありがとうございます。もしこの記事の技術や考え方に少しでも興味を持っていただけたら、ネクストのエンジニアと気軽に話してみませんか。

  • 選考ではありません
  • 履歴書不要
  • 技術の話が中心
  • 所要時間30分程度
  • オンラインOK

エンジニアと話してみる

関連リンク

AI・クラウド・データ分析のご相談はネクスト株式会社までお問い合わせください。