スキル作成ガイド(Skill Authoring Guide / How-to)
このガイドは、River Review のスキル(skills/**/*.md)を追加・更新するときに、迷いを減らし、品質のブレを抑えるための「書き方」をまとめたものです。
目的(Goals)
- 1スキル = 1観点で、指摘の粒度と意図を揃える
- 誤検知(うるさいだけ)を減らし、レビューを読みやすくする
- 変更に強い(拡張しても運用が崩れない)スキルを書く
- 人間のレビューで「毎回言っていること」を自動化する
非目的(Non-goals)
- 好み・宗教論争(インデント、命名の流派など)をしない
- スキル本文で「実装方法」や「プロジェクト固有の事情」を断定しない
- “nit” を増やすためのスキルを作らない(重要度と効果が薄い指摘の濫発は避ける)
- 変更されていないコードへの網羅的な指摘をしない
スキルの構造
スキルは YAML frontmatter(メタデータ)と Markdown 本文(指示文)で構成します。
- メタデータ: ルーティング・検証・優先度のための情報
- 本文: レビュアー(LLM/ヒューリスティック)が従うチェック観点と書き方
メタデータの定義は schemas/skill.schema.json、一覧は pages/reference/metadata-fields.md を参照してください。
最小の frontmatter(必須):
id: 安定した識別子(移動・リネームしても不変)name: 人間向けの短い名前description: 何をチェックするか(1文)phase:upstream/midstream/downstreamapplyTo: 対象ファイルの glob
推奨テンプレ(最小)
新規作成時は skills/_template.md をベースにし、まずは次を揃えます。
applyToを絞る(いきなり**/*にしない)- “抑制条件” を書く(誤検知ガード)
- “扱わない領域” を書く(Non-goals)
- 指摘文は短くし、次の行動へつながるようにする
スキルの粒度(1テーマ/1観点)
スキルは「1テーマ/1観点」で分けるのが基本です。1つのスキルに異なる目的を詰め込まないことで、誤検知が減り、運用が安定します。
- 1スキル = 1種類のリスク(例: 入力検証の欠落、Accessible Name の欠落)
- フレームワーク固有の知識は1スキルに閉じる(汎用ルールと混ぜない)
- 例外や派生条件が多い場合は別スキルに分割する
Diff を主入力にする(Diff-first)
スキルは diff を主入力として、再現可能な指摘を行うレビュー単位です。
- 可能な限り「変更行」を優先して評価する
- 変更外に言及する場合は、Confidence を下げて断定を避ける
- 「プロジェクトの文脈がなければ判断できない設計批評」は避ける
推奨: Signals(適用判断材料)
signals は frontmatter のフィールドではありませんが、本文に「このスキルを適用する判断材料」を書くとブレが減ります。
- 例: 「例外を握りつぶす
catch(ログなし、再throwなし)が差分に含まれる場合は適用する」 - 例: 「認証情報らしき文字列(AKIA/ghp_/sk- など)が差分に含まれる場合は適用する」
Severity の基準(目安)
severity は「レビューを受けた人がどう扱うべきか」の目安です。
critical: セキュリティ事故やデータ破壊につながる、即対応が必要major: バグ・運用障害のリスクが高い、原則対応したいminor: 将来の保守性・読みやすさに効く、余力があれば直したいinfo: 判断材料の提示(“検討ポイント”)
補足:
- しばしば
blocker/warning/nitの3段階で語られるが、本リポジトリの enum はinfo/minor/major/criticalである。
Confidence(確信度)の表現(特に low の場合)
Confidence が low(推測が混じる)場合は、読み手に「断定ではない」ことが伝わる書き方にする。
must/should/definitelyなどの断定表現を避けるmay/might/considerなど “可能性/提案” を示す表現を使う- 事実(Evidence)と提案(推測)を分けて書く(例: “差分上は X が見える。Y の可能性があるため確認を検討する”)
Evidence(根拠)の必須要件
River Review のコメントは <file>:<line>: <message> 形式で投稿されます。最低限、以下を満たしてください。
- どこを見て言っているかが分かる(ファイルと行に紐づく)
- 推測を断定しない(不確実な場合は “可能性” として書く)
- 再現や確認の手がかりがある(何を確認すれば良いか)
- 日本語でコメントする(レビューコメントは日本語で返す)
出力フォーマット(必須)
スキルが返す message は長くできません。最低限、次の要素が読み取れるように書きます。
- Finding: 何が問題か(短く、断定しすぎない)
- Evidence: 根拠(どのファイル/行の、どの差分か)
- Impact: 放置した場合の影響(短く)
- Fix: 最小の修正案(次の一手)
補足:
- Evidence が書けない指摘は、原則として書かない。
- Confidence や Severity はスキーマフィールド(
confidence: high|medium|low,severity: critical|major|minor|info)として JSON 出力に含まれる。LLM に出力させる場合はConfidence:やSeverity:ラベルをメッセージ中に含めると自動的にパースされる。
推奨: 指摘文の型(短文版)
<message> は長くできないため、短くても読みやすい「型」を揃えます。
- Finding: 何が問題か(1文)
- Evidence: 根拠(ファイルと行、diff で見える事実)
- Impact: 何が困るか(短く)
- Fix: 最小の修正案(次の一手)
例:
src/foo.ts:42: 例外が握りつぶされる可能性。障害調査が困難。Fix: catch でログ+再throw(or 呼び出し元へ返す)
禁止事項(アンチパターン)
- 断定口調の決め打ち(「必ず〜」「〜に違いない」)
- 状況依存の押し付け(プロジェクトの前提が不明なのに “こうすべき” を断言)
- “nit” の濫発(意味の薄い指摘を大量に出す)
- 差分と無関係な一般論の連発
- 他スキルと役割が被る実装(重複が増えてノイズになる)
誤検知を減らすためのルール(Guards)
スキルは「抑制条件」を持つ必要があります。誤検知は “直す価値がある不具合” として扱います。
例:
- 既に入力検証が存在する場合は指摘しない
- context 付きログがある場合はログ改善を提案しない
PR 時の最小チェック
スキルを追加・更新したら、PR 本文に以下を残します。
npm run skills:validatenpm test- 可能なら “誤検知ガード/Non-goals” の確認観点(何を言わないか)
Fixtures と評価ワークフロー
各スキルには fixtures/(入力 diff サンプル)と golden/(期待出力)という兄弟ディレクトリを用意できます。これらは Minimum Acceptance Bar を客観的に検証するための評価セットです。
ディレクトリ構造
skills/<phase>/<skill-id>/
├── SKILL.md
├── fixtures/
│ ├── 01-true-positive-<説明>.md # 指摘すべきケース
│ └── 02-false-positive-<説明>.md # 指摘しないべきケース
├── golden/
│ ├── 01-true-positive-<説明>.md # 期待される出力
│ └── 02-false-positive-<説明>.md # 期待される出力(指摘なし)
└── eval/
└── promptfoo.yaml # promptfoo 設定(任意)
- ファイル名は
<数字プレフィックス>-<種別>-<説明>.mdの形式にします(例:01-true-positive-undocumented-dependency.md)。 fixtures/とgolden/のファイル名は完全一致させます(ペアで評価するため)。true-positiveケースでは、スキルが少なくとも1件の指摘を返すことを確認する。false-positiveケースでは、スキルが指摘を返さないこと(または無関係な指摘を返さないこと)を確認する。
評価の実行
npm run eval:fixtures
promptfoo を直接使う場合は npx promptfoo eval でも実行できます。eval の詳細なセットアップは pages/guides/repo-wide-review.md を参照してください。
なぜ fixtures が重要か
fixtures がないと、スキルが「本当に指摘すべき差分を検知できるか」「誤検知ガードが機能しているか」を人手でしか確認できません。Minimum Acceptance Bar(下記)の検証は fixtures があって初めて再現可能になります。
スキル追加・変更時のチェックリスト
- 指摘が 1 観点に絞られている
- Evidence(ファイル/行、diff の事実)が明確である
- 誤検知ガード(抑制条件)がある
- Non-goals(扱わないこと)が書かれている
-
fixtures/とgolden/に true-positive / false-positive ケースがある(Minimum Acceptance Bar の検証に必須)
Minimum Acceptance Bar(最低合格ライン)
A skill is considered “acceptable” when it meets the following minimum bar: (スキルが「合格」と見なされるのは、次の最低基準を満たしている場合です。)
- It produces at least one actionable finding when applicable (a concrete next step, not just a vague note).
- (該当する場合、少なくとも1つの具体的な次の一手につながる指摘があること。)
- It includes clear evidence that can be traced to the diff (file and line).
- (差分(ファイルと行)に追跡できる明確な根拠が含まれること。)
- It avoids noise (no “nit” spam) and stays focused on meaningful risks.
- (ノイズ(“nit”の濫発)を避け、意味のあるリスクに集中していること。)
良いスキルの目安
- 指摘が「当たる」確率が高い(誤検知が少ない)
- 修正案が具体的で、次の一手が明確である
- ノイズが少なく、1観点に集中している
より厳密な採用基準(優先順)は pages/guides/governance/skill-policy.md を参照してください。