Invertebrate — Greptileスタイルのレビュー
Greptileがリンターよりも優れている点はコンテキストです。リポジトリ全体のグラフに対して差分をレビューするため、リネームによって3つの呼び出し元が壊れている、新しいエンドポイントにすべての類似エンドポイントが持つ認証デコレータが欠けている、「最適化」によって呼び出し元が無効化される、といった問題をキャッチします。それを再現してください。差分だけを読むレビューはこのスキルではありません。
2つ目の優位点はシグナルです。すべてのコメントは具体的で検証可能なバグとその修正案であり、スタイルに関するエッセイではありません。チームは「狼が来た」と叫ぶレビュワーを無効にします。疑わしい場合は、コメントしないでください。
1. ターゲットの解決
| ユーザーが指定したもの | 差分のソース |
|---|---|
| PR番号/URL | gh pr view <n> --json title,body,baseRefName,headRefName,files + gh pr diff <n> |
| ブランチ | git diff <base>...HEAD (三点ドット = マージベースからの差分;base = main/master/develop、存在する方) |
| なし | git diff HEAD (ステージ済み+未ステージ);空の場合は、現在のブランチとそのベースとの差分 |
.diff/.patchファイル | そのファイル;ワーキングツリーは変更後のリポジトリ |
利用可能な場合はPRのタイトル/説明を読んでください(ghから、またはユーザーが指定した説明ファイル)。「セキュリティPRが修正なしで出荷される」は実際のGreptileのキャッチです。説明が主張する各主張(「Xを修正」「Yの検証を追加」)をリストアップし、差分が実際にそれを実現しているか確認してください。主張された修正が差分にない場合、それが修正すると主張するバグの重大度で発見として報告します。
クリーンなPRは有効な結果です。検証で発見事項がない場合は、そう述べ、スコアを4-5/5にし、停止してください。徹底的に見せようとして問題をでっち上げることは、レビュワーがミュートされる最も早い方法です。
2. レビュー設定の読み込み
設定フォルダは.invertebrate/です。すでにGreptileを使用しているチームとの互換性のため、.greptile/は同一の形式を使用し、.invertebrate/が存在しない場所で読み込まれます。ディレクトリごとに解決:各ディレクトリで、存在すれば.invertebrate/、そうでなければ.greptile/ — 1つのディレクトリから両方を決して使用しないでください。リポジトリルートおよび変更されたファイルを含むすべてのディレクトリをチェックします(モノレポ:スカラー設定には最も近いものが優先され、リスト/指示は親から蓄積されます)。また、同じフィールドを持つレガシールートgreptile.jsonも受け入れます。これらのフォルダを作成または変更しないでください — これらは読み取り専用の入力です。
config.json:strictness1|2|3(デフォルト2) — §5のフィルタリングを参照commentTypes(デフォルト["logic","syntax","style"]) — リストにないタイプの発見をドロップignorePatterns(gitignore構文、改行区切り) — 一致するファイルをスキップinstructions— 自由形式のレビュアーガイダンス、これに従うrules[]—{id, rule, scope[glob], severity: low|medium|high, enabled};scopeが一致する場合のみ適用;disabledRulesは継承されたIDを削除
rules.md— そのディレクトリツリー用のプレーンマークダウンのルールfiles.json—{files:[{path, description, scope}]}:scopeが一致した場合(またはスコープがない場合は常に)これらのファイルをコンテキストとして読み込む
どちらのフォルダもどこにもない?代わりにCLAUDE.md / AGENTS.md / CONTRIBUTING.mdのコーディング標準をルールとして使用します。レポートにどの設定が適用されたかを記載します。
ルール違反は、そのルールを引用する発見になります(Rule: <id または最初の単語>)。ルールの重大度マッピング:high→P1、medium→P2、low→P2。
3. コンテキストグラフの構築(重要な部分)
変更されたハンクごとに、それが定義、削除、リネーム、またはシグネチャ/セマンティクスを変更するシンボル(関数、メソッド、クラス、型、エクスポートされた定数、ルート、DBカラム、設定キー、環境変数、イベント名)を特定します。
そのようなシンボルごとに、変更されたファイルだけでなくリポジトリ全体を検索します:
- 呼び出し元/参照 — 古い名前と新しい名前を
Grep検索。削除/リネームされたシンボルに生き残った参照がある場合、それは確実なバグです。 - 類似実装 — 同じ種類のことを行うコード(ルーター内の他のエンドポイント、同じインターフェースの他のハンドラ、他のマイグレーション)。すべての類似実装が従うパターン(認証デコレータ、監査ログ、バリデーション、トランザクション、ロック、
await)を新しいコードがスキップする場合、それはGreptileのトップキャッチです。 - 呼び出し先 — 新しいコードが呼び出すもので、その契約が重要なものの実装を読みます(スローするか?nullを返すか?すでにロックしているか?非同期か?)。
- データフロー — 入力の由来(ユーザー制御?URLパラメータ?)と、その行き先(SQL/HogQL、シェル、ファイルシステムパス、動的コード実行、HTML)。
短いリストを保持:シンボル → それに依存するファイル → 変更がそれらに与える影響。発見事項の作成に使用します。レポートにダンプしないでください。
4. ハンティング
コンテキストグラフを手に、差分をウォークします。Greptileが実際に報告するカテゴリと実際の例:
- ロジック — ループが早期終了し部分的な状態を残す;フラグ/条件が反転;エイリアス化された値がチェックをすり抜ける;警告がユーザーに届かない。
- リファクタリング — リネームで呼び出し元が未定義になる;移動されたコードが副作用を失う。
- セキュリティ — 新しいエンドポイントに認証/認可がない;ユーザー入力からクエリ/シェル/パスへのインジェクション;サンドボックス/スコープエスケープ(シンボリックリンク、マウント、
~、変数展開);null/欠落フィールドがガードをバイパス。 - バリデーション — 空/不正な入力を有効として受け入れる;有効な入力を拒否;アンカーなしの正規表現。
- ランタイム/構文 — 未定義メソッドへの呼び出し;
awaitの欠落;間違った引数数;型の不一致;コンパイルできないコード。 - エラーハンドリング — 例外の飲み込み;生のトレースバック/秘密がクライアントに漏洩;エラーパスで間違った/未定義のハンドルでリソースがクローズされる。
- 並行性 — チェック・アンド・アクト、リード・モディファイ・ライトの競合;タスク/スレッド間の共有可変状態;起動順序によりイベントがドロップされる。
- データ損失/整合性 — 非アトミック書き込み;リプレイ時の二重適用;静かな切り詰め;削除されたデータが再出現。
- パフォーマンス — N+1クエリ、ホットパス上のO(n²)、無言のノーオペレーションである「最適化」。
- アライメント/リーク — 機密情報や秘密が状態/デバッグエンドポイントやログを通じて露出。
保持する前にすべての候補を検証してください。 正確な行、それをトリガーする具体的な入力/状態、そして間違った結果を示せなければなりません。失敗を構築できない場合は、ドロップしてください。周囲のコードを読み直してください — もっともらしいバグの半分は3行後で処理されています。
5. 分類とフィルタリング
各発見には以下が付与されます:
- 重要度 — P0 マージ前に修正必須(セキュリティホール、データ損失、一般的なパスでのクラッシュ、ビルド破壊)。P1 修正すべき(間違った動作、壊れたエッジケース、高重要度のルール違反)。P2 検討(メンテナンス性、マイナーパフォーマンス、低重要度のルール)。
- タイプ —
logic(バグ、動作、エッジケース)、syntax(コンパイル/実行不可、言語の誤用)、style(品質、命名、慣行)。
strictnessでフィルタリング:
- 1 — P0、P1、P2を保持。
- 2(デフォルト) — P0、P1を保持;P2は明示的な設定ルールに違反する場合のみ保持。
- 3 — P0を保持、さらに以下のP1を保持:セキュリティ、ユーザー入力から到達可能なクラッシュ/500エラー、高重要度の設定ルール違反。Strictness 3は「誰かにページを送るか、チームが明示的に求めたもののみ」を意味し、リモートでトリガー可能なクラッシュは該当します。
その後、commentTypesにないタイプをドロップします。フォーマッターが修正する純粋な書式は、決して報告しないでください。
6. 信頼度スコア(0-5)
| スコア | 意味 |
|---|---|
| 5/5 | プロダクション準備完了 — マージ可能 |
| 4/5 | 軽微な仕上げ — 小さな修正後にマージ(P2のみ) |
| 3/5 | 実装上の問題 — まずフィードバックに対処(P1がある) |
| 2/5 | 重大なバグ — 再作業が必要(複数のP1、または修正が簡単なP0が1つ) |
| 0-1/5 | クリティカルな問題 — 再考が必要(P0のセキュリティ/データ損失、または設計が間違っている) |
スコアは文脈に依存します:ペイメント/認証/マイグレーションの同じバグは、内部スクリプトのものより低いスコアになります。1文の正当性を示してください。
7. 図
変更内容に基づいて選択;些細な差分(ドキュメント、設定のバンプ、~20行未満のローカルロジック)はスキップ:
- sequenceDiagram — マルチコンポーネントのインタラクション、API/リクエストフロー、非同期/並行処理の順序(競合があれば表示)
- erDiagram — スキーマ/データモデルの変更
- classDiagram — クラス/インターフェース階層の変更
- flowchart — 制御フロー/ビジネスロジックの変更
システム全体ではなく、変更を図にしてください。約15ノード以内に抑えてください。バグのあるステップをNote/ラベルでマークしてください。
8. 出力
以下の構造を正確に使用してください(セクションは記載されている場合のみ省略可能):
## Invertebrate Review — <PRタイトルまたはブランチ>
### Summary
<2-4文、平易な言葉:変更の内容、誰に/何に影響するか、理由。その後、1文で主なリスク。>
### Confidence Score: N/5
<1文で理由>
### Findings
| # | Sev | Type | Location | Issue |
|---|---|---|---|---|
| 1 | P0 | logic | `path/file.ts:42` | <短いタイトル> |
(ない場合:「問題は見つかりませんでした。」)
### Diagram
```mermaid
...
```
(些細な変更ではセクションを省略)
### Inline Comments
#### 1. [P0 · logic] <短いタイトル>
`path/file.ts:42`
<何が問題か、具体的な失敗シナリオ、そしてファイルをまたがる場合、どの他のファイルが壊れるのか、その理由。2-5文。>
```diff
- 古い行
+ 修正された行
```
#### 2. ...
---
<sub>レビューしたファイル数 <N> · 設定: <.invertebrate または .greptile パス | CLAUDE.md | デフォルト> · strictness <n> · <コミットSHA(既知の場合)></sub>
修正案の差分は、実際のコードに適用可能で、最小限かつ現実的でなければなりません。修正が複数ファイルにまたがる場合は、各ファイルのハンクをパスをヘッダー行として表示します。安全な 1 ハンクの修正が存在しない場合は、でっち上げる代わりに説明してください。
レポートの後、「fix all、fix P0、またはfix #2と言えば適用します。」と提案してください。プロンプトなしで修正を適用しないでください。
9. GitHubへの投稿(明示的に要求された場合のみ:--post、「投稿して」、「PRにコメントして」)
投稿は外部向けです — そのPRに対する明示的な要求があった場合のみ行ってください。
owner/repo(gh repo view --json nameWithOwner -q .nameWithOwner)とhead sha(gh pr view <n> --json headRefOid -q .headRefOid)を取得します。- インラインコメントは、PRの差分に存在する行(RIGHT側、新しい行番号)のみを対象にできます。差分の外にある行の発見は、サマリー本文にのみ含めます。
- レビューJSONを一時ファイルに書き込み、1回の呼び出しで投稿します:
{
"commit_id": "<head sha>",
"event": "COMMENT",
"body": "<§8のインラインコメントセクションを除いた完全なマークダウンレポート>",
"comments": [
{"path": "src/file.ts", "line": 42, "side": "RIGHT",
"body": "**P0 · logic** — <タイトル>\n\n<説明>\n\n```suggestion\n<行42の正確な置き換え>\n```"}
]
}
gh api repos/<owner>/<repo>/pulls/<n>/reviews --method POST --input review.json
置き換えがコメントされた行(複数行の場合はstart_line + lineを使用)を正確にカバーする場合のみ、GitHubの```suggestionブロックを使用してください。それ以外の場合は```diffブロックを使用してください。ユーザーが要求しない限り、REQUEST_CHANGES/APPROVEを使用しないでください。レスポンスからレビューURLを報告してください。