surrogate-verifier について
スキル定義、タスクのプロンプト、出力をもとに、構造化されたアサーションと失敗診断を生成する検証スキルです。生成側の推論を隔離して検証バイアスを抑えますが、アサーション自体は実行しません。
主な機能
- 01タスクごとに5~10件のアサーションを生成
- 02完全性・形式・事実上のシグナルを確認
- 03失敗を根本原因別に分類
- 04実行可能な修正案を提示
- 05テストを実行せずテキストを検証
活用シーン
- 01スキルパッケージの評価用アサーションを生成
- 02失敗したアサーションから定義やワークフローの問題を特定
- 03隔離されたコンテキストで Agent の出力を検証
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mathews-tom/ armory --skill surrogate-verifierインストール後、Claude Code で/surrogate-verifierを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/cases.yamlreferences/assertion-patterns.mddiagnostic-templates.md詳細
Surrogate Verifier
情報を隔離した検証を通じて、スキルパッケージ向けの構造化されたテストアサーションと失敗診断を生成します。検証器はスキル生成器の推論にアクセスせずに動作します。スキル定義、タスクプロンプト、出力成果物のみを参照します。この隔離により確証バイアスを防ぎ、共進化型生成におけるスキル品質の向上(EvoSkills によると +30pp)に最も大きく貢献します。
参照ファイル
| ファイル | 内容 | 読み込むタイミング |
|---|---|---|
references/assertion-patterns.md | スキルカテゴリ別のアサーションカタログと重み付けの指針 | 常に |
references/diagnostic-templates.md | 根本原因カテゴリ別の失敗診断テンプレート | 失敗レポートを作成するとき |
情報隔離プロトコル
これは最も重要な制約です。隔離に違反すると、検証品質が低下します。
検証器は以下にアクセスしてはなりません:
- 生成器の会話履歴や推論チェーン
- 以前の進化イテレーションや改善のコンテキスト
- 生成器の内部メモや判断理由
- 以下に明示されているもの以外のコンテキスト
検証器が受け取るのは以下のみです:
- スキルの
SKILL.mdの内容(定義ファイル) - 想定される用途を表す1つ以上のタスクプロンプト
- スキルの出力(失敗診断時)
scripts/eval_assertions.pyによるアサーション結果(失敗診断時)
実装: test-engineerエージェントによって呼び出される場合、このスキルはisolation: "worktree"を使用して別個の Agent spawnに読み込む必要があります。最低限、共有コンテキストのない新しいセッションを使用してください。呼び出し元エージェントは、会話中の参照ではなく、成果物を明示的なテキストとして渡します。
ワークフロー
モード 1:アサーション生成
スキルの定義とタスクプロンプトを基に、そのスキルのアサーションを生成します。
フェーズ 1:スキル分析
SKILL.mdの定義を読み、以下を抽出します。
- 明示された機能 — スキルが何を行うと謳っているか(説明とワークフローのセクションから)
- 出力形式 — スキルの出力に期待される構造(Markdown、JSON、表など)
- エラー処理 — 文書化された失敗モードと復旧手順
- 前提条件 — 必要なツール、依存関係、またはコンテキスト
- トリガーの境界 — スキルが対応しない内容(対象範囲外)
フェーズ 2:アサーション設計
各タスクプロンプトについて、次の観点を網羅する5〜10個のアサーションを生成します。
| 観点 | 使用するアサーションの種類 | 目的 |
|---|---|---|
| 出力の完全性 | contains、matches_regex | 謳われたすべてのセクションや構成要素が存在する |
| 形式への準拠 | output_format、contains | 出力が宣言された構造と一致する |
| 事実に関するシグナル | contains、not_contains | 重要な分野用語が含まれ、特徴的な兆候がない |
| ツールの使用 | calls_tool | 想定されたツールが呼び出された |
| 否定的制約 | not_contains | 禁止されたパターンが存在しない |
重み付け:
- 出力の完全性に関するアサーション:重み 1.0(必須)
- 形式への準拠に関するアサーション:重み 0.8(構造上の正しさ)
- 事実に関するシグナルのアサーション:重み 0.6(内容の品質)
- ツールの使用に関するアサーション:重み 0.5(手法の検証)
- 否定的制約に関するアサーション:重み 0.3(不在チェックはシグナルとして弱い)
カテゴリ別のアサーションカタログについては、references/assertion-patterns.mdを参照してください。
フェーズ 3:出力
evals/cases.yaml のスキーマ形式でアサーションを生成します。
assertions:
- type: contains
target: "## Scalability"
weight: 1.0
- type: output_format
target: markdown_table
weight: 0.8
- type: not_contains
target: "TODO"
weight: 0.3
- type: calls_tool
target: Read
weight: 0.5
コンテキスト上限: 使用可能なコンテキストウィンドウの 70% を超えて消費しないでください。 スキルの定義が非常に長い場合は、ワークフローの各フェーズと出力形式のセクションを中心にアサーションを生成します。逐語的な引用ではなく、要約してください。
モード 2:失敗診断
オラクルが fail を返した場合、失敗の理由を説明する構造化診断を生成します。
入力
- スキルの
SKILL.md(モード 1 と同じ) - 実行されたタスクプロンプト
- 失敗した出力
- アサーションの結果:合格したもの、失敗したもの、および詳細
フェーズ 1:失敗の分類
失敗した各アサーションを根本原因のカテゴリに分類します。
| カテゴリ | シグナル | 重大度 |
|---|---|---|
| 能力の欠落 | 機能を約束している contains アサーションが失敗 | HIGH |
| 形式の不一致 | output_format アサーションが失敗 | HIGH |
| 出力の不足 | 同じセクションで複数の contains アサーションが失敗 | MEDIUM |
| 内容の捏造 | 禁止パターンが存在するため not_contains アサーションが失敗 | HIGH |
| ツールの誤使用 | calls_tool アサーションが失敗 | MEDIUM |
| 部分的な成功 | グループ内の一部のアサーションは合格し、ほかは失敗 | LOW |
フェーズ 2:根本原因の分析
失敗した各アサーションについて:
- 欠落した機能を約束している
SKILL.mdの該当セクションを特定します - スキルの定義が指示している内容と、実際の出力に含まれている内容を比較します
- その差が生じた原因を推測します(ワークフローのステップ不足、指示の曖昧さ、誤ったツールの選択)
フェーズ 3:修正案
各根本原因について、具体的で実行可能な修正を提示します。
- 能力の欠落: 「フェーズ 2 とフェーズ 3 の間に、[X] を明示的に生成するワークフローのステップを追加する」
- 形式の不一致: 「出力形式の指示を『要約を作成する』から『列 [A、B、C] の Markdown テーブルを作成する』に変更する」
- 内容の捏造: 「ワークフローに否定的な制約を追加する:『[条件] を満たさない限り、[X] を含めない』」
- ツールの誤使用: 「『ファイルの読み取りに Bash を使う』を『ファイルの内容には Read ツールを使う』に置き換える」
フェーズ 4:診断の出力
構造化された診断文字列を生成します。
DIAGNOSTIC: [skill-name] failed on [task-prompt-summary]
FAILED ASSERTIONS (N/M):
1. [SEVERITY] type=contains target="..." — Missing capability: [explanation]
2. [SEVERITY] type=output_format target="..." — Format mismatch: [explanation]
ROOT CAUSES:
- [category]: [specific explanation with SKILL.md section reference]
REMEDIATION:
1. [Concrete change to SKILL.md with exact section and wording]
2. [Concrete change to workflow with step numbers]
根本原因のカテゴリごとの作成例については、references/diagnostic-templates.md を参照してください。
予算パラメーター
EvoSkills Algorithm 1 に従います。
- コンテキスト上限: 0.7(使用可能なコンテキストウィンドウの 70%)
- サロゲートの最大再試行回数: オラクルの各ラウンドにつき 15 回
- オラクルの最大ラウンド数: 5 回(検証器ではなく、オーケストレーションを行うエージェントが適用します)
検証器は自身の予算を追跡しません。反復回数の上限は test-engineer エージェントが管理します。
制限事項
- 実行機能なし: 検証器はアサーションを生成しますが、実行はしません。実行はオラクルである
scripts/run_evals.pyが行います。 - テキストのみの検証: 視覚的な出力、対話的な動作、副作用は検証できません。アサーションはテキスト出力のみを対象とします。
- 単一ターンの範囲: 各検証は独立しています。検証器は前のラウンドを記憶しません(必要に応じて、オーケストレーションを行うエージェントがコンテキストを渡します)。
- アサーションの粒度: 5 種類のアサーションは一般的なパターンをカバーしますが、考えられるすべての検証ニーズには対応していません。カスタムのアサーション型を使用するには、
scripts/eval_assertions.pyを拡張する必要があります。
エラー処理
| エラー | 解決策 |
|---|---|
| スキル定義が大きすぎます | ワークフローのフェーズと出力形式のセクションのみに要約します |
| 生成可能なアサーションがありません | 警告を付けて空のアサーションリストを返します。スキルが曖昧すぎる可能性があります |
| 出力形式が曖昧です | contains アサーションをデフォルトとし、output_format のチェックは避けます |
| コンテキストの上限を超えました | 診断の詳細を短縮し、失敗したアサーションのリストは保持します |