harness-evolve について
harness-evolveはmetaharness-darwin evolve CLIをrufloスキルとして利用し、制御された変更がハーネスの準備度スコアに与える影響を調べます。人が開始する実験と失敗診断に対応し、継続的な自律最適化には使いません。
主な機能
- 017種類のポリシー領域を変更
- 02各バリアントで変更は1領域のみ
- 03サンドボックス実行と進捗出力
- 04失敗したバリアントの診断
- 05実行前の確認
活用シーン
- 01目標未達の準備度スコアの原因調査
- 02新しい分野向けの初期設定の探索
- 03手動調整したハーネスと進化したベースラインの比較
MCP 対応
harness-mcp-scanやharness-threat-modelなどのMCPセキュリティ監査スキルと併用できます。入力には、提供するMCPエンドポイントの説明はありません。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ruvnet/ ruflo --skill harness-evolveインストール後、Claude Code で/harness-evolveを入力して読み込まれたか確認します。
詳細
上流の metaharness-darwin evolve CLI を Ruflo のスキルとして公開します。ADR-150 の読み取りレイヤー(score / genome / mcp-scan / threat-model / oia-audit)に対応する書き込みレイヤーです。読み取り準備スコアが横ばいで、基盤モデルを再トレーニングせずに、どのサーフェスの変更がスコアを動かすかを見つけたい場合に使用します。
使用する場合
harness-scoreの結果が目標を下回っており、どのポリシーサーフェスが原因かわからない場合。- 新しい業種向けのハーネスを用意する際、手作業で調整するのではなく、実証的に適切な初期設定を見つけたい場合。
- 手作業で調整したハーネスを進化させたベースラインと比較する場合(darwin のチャンピオンを比較対象として扱います)。
使用しない場合
- 継続的なバックグラウンド最適化には使用しないでください。Darwin Mode は人が開始します。自律的な自己変更ではなく、単発の探索のために CI に組み込んでください。
- CI で ruflo 自体に使用しないでください。ADR-153 §5 では ruflo の自動進化を明示的に拒否しています。CI ゲートで検証するのは収束ではなく、正常な縮退動作です。
アルゴリズム
- 引数を検証します(
--repoが存在すること、--generationsの上限が 50 以下、--childrenの上限が 20 以下、--concurrencyの上限が 8 以下であること、sandbox/selection/mutator に既知の値が指定されていること)。 --confirmがない場合:計画を出力して終了コード 0 で終了します(harness-mintの安全性に関する規約を踏襲し、上流のsafety.tsチェックに対する多層防御を行います)。--confirmがある場合:インストール済みの@metaharness/darwinからmetaharness-darwin evolve <repo> ...を実行します(_darwin.mjsで固定。条件を満たすインストール済みコピーがない場合に限り、~/.ruflo/darwin-cache-<pin>に一度だけインストールし、npx は決して使用しません)。共通の_darwin.mjs非同期ヘルパーを使用します。世代ごとの進捗は stderr に転送し、最終チャンピオンの JSON は stdout から取得します。generations × children × per-variantに基づいてタイムアウトを計算します(per-variant は実環境で約 60 秒、モック環境で約 2 秒です)。呼び出し元は--timeout-msで上書きできます。- 上流の終了コード 99 をそのまま尊重します。「safety-disqualified」として伝播し、別の値に置き換えないでください。これは意図的に組み込まれたトリップワイヤーです(あるバリアントが、シークレット/シェルコマンドの実行/ネットワーク/動的評価を対象とする
inspectVariantを発動しました)。ADR-153 §「Safety model」を参照してください。 --alert-on-no-improvementは任意です。チャンピオンが親と同等以下の場合、終了コード 1 で終了します。
7 つの変更サーフェス
| サーフェス | 担当する内容 |
|---|---|
planner | タスクの分解/ステップの順序 |
contextBuilder | プロンプトに渡す内容 |
reviewer | 自己批評/出力の検証 |
retryPolicy | 失敗時に再試行するタイミングと方法 |
toolPolicy | エージェントが使用できるツールと、その条件 |
memoryPolicy | 保存、想起、忘却する内容 |
scorePolicy | エージェントが自身の出力を評価する方法 |
1 つのバリアントにつき変更は 1 つです。複数サーフェスの変更は禁止されています(因果関係の特定を明確に保ちます)。
出力
レポートは <repo>/.metaharness/ に出力されます。
.metaharness/
archive.json # full lineage tree (sampling next gen draws from this)
lineage.json # parent→child edges only
variants/<id>/ # per-variant code (kept for audit)
runs/<id>/ # per-variant sandbox test output
reports/winner.json # final champion + score delta vs parent
スキルの stdout は JSON {success, data: {champion, plan, durationMs, improved}} です(--diagnose が指定された場合は data.diagnosis も含まれます。以下を参照してください)。
失敗診断(--diagnose)
GEPA の重要な仕組みは、実行トレースから自然言語で失敗を診断し、その結果を次の変異に反映することです。単なるスカラーの適応度ではありません。--diagnose はその機能の一部を追加します。進化処理の完了後、敗北した/失敗したバリアントのトランスクリプトを darwin の GEPA ライブラリの操作(analyzeTranscript と classifyFailure。scripts/_darwin.mjs の共有 importGepa リゾルバー経由)に渡し、出力される JSON に diagnosis セクションを追加します。
"diagnosis": {
"available": true,
"scope": "losing-variants",
"variants": [
{ "id": "g1_v0", "transcripts": 2,
"failureClasses": { "exploration-loop": 1, "edit-mechanics": 1 },
"dominantClass": "exploration-loop" }
],
"totals": { "exploration-loop": 1, "edit-mechanics": 1 }
}
上流の形式に関する注意点(@metaharness/[email protected] で検証済み):
metaharness-darwin evolve --jsonが出力するのは TEXT 形式のリーダーボードです。標準出力には JSON もトランスクリプトも含まれません。バリアントごとの実行記録は<repo>/.metaharness/runs/<id>.jsonにあります。- これらの実行記録にはサンドボックスの実行トレース(
{taskId, exitCode, stdout, stderr})が含まれますが、GEPA 形式のトランスクリプト({actionRaw, obs})ではありません。そのため、診断では実行記録に GEPA 形式のトランスクリプトが埋め込まれている場合(エージェントのサンドボックス/将来の上流実装)はそれを使用し、なければチャンピオンのトランスクリプトにフォールバックします。それ以外の場合は、diagnosis: {available: false, reason, traceSummary}を出力します。traceSummaryはバリアントごとの機械的な集計値(タスク数/失敗数/タイムアウト数/ブロックされたアクション数)です。 --diagnoseによって実行が失敗することはありません。内部エラーが発生した場合は、{available: false, reason: "diagnosis-failed: ..."}にフォールバックします。
終了コード
| コード | 意味 |
|---|---|
| 0 | 進化処理が正常に完了した場合、またはドライラン、あるいは縮退動作(Darwin 不在) |
| 1 | --alert-on-no-improvement が指定され、チャンピオンが親を上回らなかった場合 |
| 2 | 設定エラー、または進化処理のインフラストラクチャ障害 |
| 99 | 上流の「safety-disqualified」(再マッピングせず、そのまま伝播) |
グレースフルデグラデーション(ADR-150 の制約 3 + ADR-153)
@metaharness/darwin がインストールされていない場合、スクリプトは
{degraded: true, reason: 'metaharness-darwin-not-available', hint: ...}
を出力し、終了コード 0 で終了します。ruflo は引き続き機能します。CI の
no-metaharness-smoke.yml 形式のジョブで、この経路を検証します。