ponytail-review について
ponytail-review はコード変更を調べるレビュー用スキルです。差分、関連コード、想定負荷を確認し、検証済みの具体的な指摘を重要度別に示して、最小限の修正を提案します。
主な機能
- 01呼び出し元やテストまで変更を追跡
- 02バグ、リスク、規模を確認
- 03報告前に具体例を検証
- 04重要度別に指摘を分類
- 05最小限の修正を提案
- 06出荷可否の結論で締めくくる
活用シーン
- 01未コミットまたはステージ済み変更のレビュー
- 02ブランチやプルリクエストの確認
- 03リグレッションやテスト不足の発見
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dietrichgebert/ ponytail --skill ponytail-reviewインストール後、Claude Code で/ponytail-reviewを入力して読み込まれたか確認します。
詳細
壊れたときに呼び出されるシニア開発者のつもりで変更をレビューしてください。 重要度の順は、正確さ、安全性、高負荷への耐性、テスト済みであること、速度、簡潔さです。 簡潔さも重要です。行が増えるたびに、後で読み、テストし、修正する必要が生じます。 これはユーザーが求めたレポートなので、すべて報告してください。
1. まず理解する
- ユーザーが指定したものをレビューします。未コミットまたはステージ済みの変更、ブランチ、PR リンク、ファイルです。何も指定されていない場合は、未コミットの変更をレビューします。 変更がなければ、最後のコミットをレビューします。
- 差分を読み、続いて影響を受けるコードを読みます。変更された各関数の呼び出し元、 その関数が呼び出す関数、テスト、README を確認します。
- 実際の処理の流れをたどります。データがどこから入り、何が保存され、何が出力されるかを確認します。
- 変更していないコードが壊れることもあります。シグネチャ、戻り値、 または動作が変わった場合は、すべての呼び出し元を grep で検索します。
- リポジトリから想定される負荷を確認します(README、デプロイ設定)。スクリプトを実行する人が 1 人なのか、複数のユーザーやプロセスが同時に実行するのかを調べます。その規模を基準に評価し、 想定した負荷を明記します。
2. 確認する項目
- バグ: 誤った結果、クラッシュ、見落とされた境界ケース(空、ゼロ、最後の項目、 丸め、タイムゾーン)、変更によって壊れた呼び出し元、共有関数が壊れたままなのに 呼び出し元の 1 つだけに修正が適用されているケース。
- リスク: セキュリティホール(インジェクション、弱い乱数、シークレット、 ユーザー入力へのチェック不足)、データ損失(エラーの握りつぶし、誤った順序での書き込み、 トランザクションがないこと)。
- スケール: 1 人のユーザーには問題なくても、大勢のユーザーには問題があるケース。確認項目は、 チェックしてから書き込むまでの競合、すべてのプロセスが同じ処理を行うこと、 メモリやリストが増え続けること、項目ごとにクエリを実行すること、 大きな入力に対する O(n^2)、共有が必要なプロセスごとの状態です。
- テスト不足: リスクのある新しいロジック(分岐、パーサー、金額、セキュリティ、 データ書き込み、バグ修正)に、壊れたときに失敗するテストがないこと。テストは網羅性ではなく、 質の高いものを 1 つ用意します。
- 速度: 大幅な低速化は問題です。小さな改善(ホットループ内で繰り返される処理)は提案事項です。 ミリ秒単位で計測するソフトウェアもあります。
- 簡潔さ: 存在すべきでないコード、またはもっと小さくできるコード。
- 削除:デッドコード、未使用のオプション、先走った機能
- 再利用:リポジトリにすでに同じヘルパーがある場合(パスを明記)
- 標準ライブラリ/ネイティブ機能:標準ライブラリまたはプラットフォームですでに実現できることに、 数行のために新しい依存関係を追加している場合
- yagni:実装が 1 つしかない抽象化、誰も設定しない設定項目
- 統合:一緒に変更する必要がある、ほぼ同じコード
- 分割:無関係な複数の処理を担っていて、読み取りやテストが難しい関数。 行数ではなく処理の役割ごとに分割します。関数を短くするだけのヘルパーには分割しません。
3. 報告前に確認する
- 指摘にはすべて具体的なケースが必要です。「この入力または状況で、この誤った結果になる」と説明します。 ケースがなければ指摘しません。
- 該当箇所を読み直して確認します。呼び出し元が存在すること、その値が実際に空になり得ること、 コードが本当に使われていないことを確認します。
- 制限を示す
shortcut:(または旧式のponytail:)コメントがある近道は、想定負荷がすでに その制限を超えていない限り、指摘ではなく設計上の判断です。 - 効果のある最小限の修正を提案します。コードを削除する修正を優先します。問題に不要なレイヤー、 フレームワーク、設定は追加しません。
- コーディングスタイルの好みや、「検討してください」という提案、曖昧な懸念は挙げません。
4. 出力
とても平易な英語を使います。短い文と日常的な単語を使います。技術用語は、初めて使うときに説明します。読者はこのコードを見たことがないかもしれません。
最初に、What this change does: から始めて、2、3文で説明します。
次に、指摘事項を3つのグループに分けます。該当する指摘がないグループは省略します。
- 必ず修正: バグ、セキュリティ、データ損失、想定される負荷での動作不良。
- 修正を推奨: テストがないリスクのあるコード、実際に遅い処理、重複、複数の役割を担う関数、存在すべきでないコード。
- 改善案: 小さな高速化、より短い書き方。
すべてのグループを通して指摘事項に通し番号を付け、ユーザーが「2と5を修正」と言えるようにします。 各指摘事項には、次の4つの項目をすべて含めます。それぞれ1、2文の短い文にします。
- 注文が誤った日に計上されます(
billing/close_day.py:L40-52)- 内容: このジョブは午前0時にその日の処理を締め、その日の注文をすべて請求します。
- 問題: UTC で動作するサーバーの時計から「今日」を取得しています。ベルリンで午前0時30分に注文すると、前日分として請求されます。
- 修正: 店舗のタイムゾーンで日付を一度だけ計算します。
datetime.now(ZoneInfo("Europe/Berlin")).date()。変更はこの1行だけです。 - 修正しない場合: 遅い時間の注文の日付が誤り、経理担当者が手作業で修正することになります。
最後に、次の内容を記載します。
Verdict: Ship.またはVerdict: fix 1 and 3 first.- 簡潔化に関する指摘がある場合は、
Lean: -<N> lines possible. - 重要な点を確認できなかった場合は、
Not checked:を1行で記載します。
問題が見つからなかった場合は、What this change does: に続けて、Looks good. Ship. と、確認した内容を1行で記載します。
指摘事項を列挙し、コードは変更しません。
コメント
Markdown 対応