スキル評価パイプライン は何をしますか?
Claude Codeスキルに対して、トリガー、正確性、品質をマルチエージェントパイプラインで検証する構造化評価を実行します。
プロセス
ステップ1: 評価セットの定義
以下のソースから評価定義を受け付けます:
- 評価セットJSONへのパス:
evals/evals.jsonまたはユーザー指定のファイル - インラインプロンプト: ユーザーが評価クエリを直接提供
- 自動生成: スキルの説明から生成 (ステップ1b参照)
評価セットJSONスキーマ:
{
"skill_name": "my-skill",
"skill_path": "./my-skill",
"evals": [
{
"eval_id": 0,
"eval_name": "descriptive-name",
"prompt": "The user's task prompt",
"input_files": [],
"assertions": [
{
"name": "output-has-score",
"check": "Output contains a numeric score between 0-100",
"weight": 1.0
}
],
"should_trigger": true
}
]
}
ステップ1b: 評価セットの自動生成
評価セットが存在しない場合は、自動生成します:
- スキルのSKILL.mdの説明と指示を読み取る
python scripts/generate_eval_set.py <skill-path>を実行してスターターセットを生成- 生成されたセットをユーザーに提示し、レビューと編集を促す
- ユーザーが承認または修正してから先に進む
ステップ2: ワークスペースのセットアップ
評価アーティファクトとスキルファイルを混同しないよう、評価ワークスペースをスキルディレクトリ外に作成します。兄弟ディレクトリまたは専用の場所を使用します:
eval-workspace/
iteration-1/
eval-0/
eval_metadata.json # この評価のアサーションと設定
with_skill/
outputs/ # スキル実行出力
timing.json # トークン数 + 実行時間
grading.json # アサーション結果 + 証拠
baseline/
outputs/
timing.json
grading.json
eval-1/
eval_metadata.json
with_skill/
outputs/
timing.json
grading.json
baseline/
outputs/
timing.json
grading.json
benchmark.json # 集計メトリクス
benchmark.md # 人間が読めるレポート
各評価ディレクトリに対して、評価セットエントリから eval_metadata.json を作成します:
{
"eval_id": 0,
"eval_name": "descriptive-name",
"prompt": "The user's task prompt",
"assertions": [...],
"should_trigger": true
}
ステップ3: 評価の実行
セット内の各評価について、2つの並列実行を開始します:
スキルあり実行 (agents/skill-forge-executor.md に委譲):
Execute this task:
- Skill path: <path-to-skill>
- Task: <eval prompt>
- Input files: <eval files if any, or "none">
- Save outputs to: <workspace>/iteration-<N>/eval-<ID>/with_skill/outputs/
- Outputs to save: <what the assertions check>
ベースライン実行 (agents/skill-forge-executor.md に委譲):
- 新しいスキルの場合: スキルをロードせずに実行
- 改善されたスキルの場合: 以前のバージョンで実行(最初にスナップショット)
各実行ディレクトリにタイミングデータを timing.json に保存:
{
"total_tokens": 84852,
"duration_ms": 23332,
"total_duration_seconds": 23.3
}
ステップ4: 結果の採点
完了した各実行について agents/skill-forge-grader.md に委譲:
- eval_metadata.jsonで定義されたアサーションに対して採点
- 各実行の
grading.jsonに結果を保存:
{
"eval_id": 0,
"run_type": "with_skill",
"assertions": [
{
"name": "output-has-score",
"passed": true,
"evidence": "Found score: 87/100 on line 14"
}
],
"pass_rate": 1.0
}
ステップ5: 集計と分析
-
python scripts/aggregate_benchmark.py <workspace>/iteration-<N> --skill-name <name>を実行 -
これにより
benchmark.jsonとbenchmark.mdが生成され、以下が含まれます:- 評価ごとの合格率 (スキルあり vs ベースライン)
- 平均時間とトークン使用量
- 改善率 (スキルあり / ベースライン)
-
agents/skill-forge-analyzer.mdに委譲して:- 集計統計では隠れがちなパターンを表面化
- 一貫して失敗するアサーションタイプを特定
- 以前のイテレーションからの回帰をフラグ付け
ステップ6: 結果の提示
サマリーレポートを生成:
# 評価レポート: [skill-name] — イテレーション [N]
## 全体
| メトリクス | スキルあり | ベースライン | 差分 |
|--------|-----------|----------|-------|
| 合格率 | X% | Y% | +Z% |
| 平均時間 | Xs | Ys | -Zs |
| 平均トークン数 | X | Y | -Z |
## 評価ごとの結果
| 評価 | スキルあり | ベースライン | ステータス |
|------|-----------|----------|--------|
| eval-0 | PASS | FAIL | 改善 |
| eval-1 | PASS | PASS | 維持 |
## パターンと洞察
[分析エージェントから]
## 推奨事項
[失敗に基づく具体的な改善提案]
ステップ7: フィードバックの収集
ユーザーフィードバックを feedback.json に保存:
{
"reviews": [
{
"run_id": "eval-0-with_skill",
"feedback": "the chart is missing axis labels",
"timestamp": "2026-03-06T12:00:00Z"
}
],
"status": "complete"
}
フィードバックを /skill-forge evolve に渡し、次のイテレーションに活用します。
高度: ブラインド比較
スキルバージョン間の厳密なA/Bテスト向け:
agents/skill-forge-comparator.mdに委譲- 2つのディレクトリを渡す:
eval-<ID>/with_skill/outputs/とeval-<ID>/baseline/outputs/ - 比較器はランダムなラベル(バージョンA / バージョンB)を割り当て、どちらが新しいかを認識できないようにする
- eval_metadata.jsonのアサーション基準に基づいて各出力を評価
- どちらが「新しい」か「古い」かを知らずに嗜好スコアを返す
エラーハンドリング
- 実行タイムアウト: 実行が5分を超えた場合、終了して
timing.jsonで"timed_out": trueとマークする - 実行失敗: 実行がクラッシュした場合、エラーを実行ディレクトリの
error.txtに保存し、残りの評価を継続する - 採点失敗: 採点が合格/不合格を判断できない場合、アサーションを
"passed": nullとマークし、その理由を証拠として添付する - ファイル欠落: 実行後に
timing.jsonまたはgrading.jsonが見つからない場合、レポートでその評価を不完全としてフラグ付けする - 部分完了: 常に利用可能な結果を集計して報告する — 1つの評価の失敗で全体をブロックしない
品質ゲート
評価実行を完了とマークする前に:
- すべての評価が実行された(スキルあり + ベースライン)
- すべての実行でタイミングデータが取得された
- すべてのアサーションが証拠付きで採点された
- ベンチマークが合格率、時間、トークンで集計された
- 分析パターンが文書化された
- 結果がユーザーに提示された