概要
create-prove は aeon の公式 catalog に入っている skill です。aeon は GitHub Actions 上で動く自律 agent で、中身は Claude Code が動かしています。skill はそれぞれ 1 つの markdown ファイルで、スケジュールまたは dispatch で実行されます。この skill が upstream に入ったのは 2026-09-18 です。
やることは狭く絞られています。実行可能な skill を 1 つだけ変更し、特定の commit SHA に固定された pull request を渡すと、その skill をリポジトリ自身の aeon.yml ワークフロー経由で実際に実行します。そして、その証拠を機械可読なレシート(receipt)として PR にコメントで返します。
レビューは実行ではない
レビューで分かるのは「コードがちゃんと読める」ことまでです。「コードが実際に動いた」ことは分かりません。
一般的な PR のワークフローは、いちばん大事な問いを捨ててしまっています。レビュアーが diff を読み、CI が lint と型チェックを通し、全員がうなずいてマージ。変更された skill が実際に動くところを、誰も見ていません。skill そのものが自然言語の指示である agent にとって、この穴は非常に大きいものです。markdown は美しく書けていても、挙動は壊れているかもしれません。
create-prove は、skill 自身の指示文にそのまま書かれている一つの対比の上に作られています。diff レビューが緑でも証明ではない。相関の取れた Actions の実行が成功して、はじめて証明になる。 skill のそれ以外の部分は、すべてこの「後者」を安く、改ざんしにくくするためにあります。
仕組み
対象は構造的に不変です。 入力は owner/repo#pr@40文字のSHA という形式に完全一致しなければならず、それ以外は PROVE_INVALID_TARGET で終了します。dispatch の前に、skill は次の点を確認します。
PR が open であること
PR の現在の head SHA が期待値と一致すること
head ブランチが同じリポジトリ内にあること(fork のブランチは対象外)
diff が変更しているのが skills//SKILL.md ちょうど 1 つであること
どれか 1 つでも合わなければ PROVE_UNSUPPORTED または PROVE_STALE で終了し、レシートは投稿しません。
実行は本物で、シミュレーションではありません。 変更された skill の frontmatter を読み、変更された挙動を通る、最小かつ実在する非破壊的な変数を選んで実行します。ダミーの認証情報も dry-run モードも使いません。安全に実行できる方法がなければ、証拠をでっち上げる代わりに PROVE_UNSAFE で終了します。
相関は厳密です。 dispatch には一意な ID を付け、その ID は必ずリテラルの接頭辞 prove- で始まります。ワークフロー側のコミットスキップのガードがこの接頭辞を認識するので、証明のための実行が、証明対象のブランチにコミットを書き戻すことはありません。その後 skill は、相関の取れた実行タイトルの完全一致でだけ実行を探し、「その skill の最新の実行」を拾うことは決してしません。最大 30 分待ち、status=completed かつ conclusion=success を要求します。キャプチャされた出力が空の実行は PROVE_MISSING_EVIDENCE として却下します。
すべてのゲートを通過し、さらに head SHA が動いていないことを再確認してはじめて、PR に 1 件だけコメントを投稿します。内容は次のとおりです。
どの実行パスを通したかの説明
実行の URL
出力の抜粋
その SHA に紐づいた 1 行の JSON レシート("verdict":"proven" を含む)
PR をマージ・承認・変更することは一切ありません。加えて、ハードルールが 1 つあります。自分自身を証明することは拒否し、再帰する代わりに PROVE_UNSUPPORTED で終了します。
どう動くか
以下のシナリオは仮想のものです。原文の時点で、この instance には create-prove のローカル実行履歴がまだありません。ここに書くのは、実際のログではなく skill ファイルに書かれた手順に沿った流れです。
digest 系 skill が出力フォーマットを変える
ある PR が skills/daily-digest/SKILL.md を編集し、出力の構成を変えたとします。create-prove は owner/repo#42@ を受け取り、ゲートを確認し、小さな実在の変数を選んで、PR の head ブランチ上で aeon.yml を prove-42-... という dispatch ID で起動します。20 分後、相関の取れた実行が出力をキャプチャした状態で成功し、head SHA も一致したままなので、PR にはその実行を直接指すレシートのコメントが付きます。
パターン:レビュアーの「これは動きます」という主張が、マージされる commit に固定された、実際に動いた実行へのリンクに変わります。
証明の途中で作者が push する
前提は同じですが、証明の実行中に作者が修正を force-push します。create-prove が投稿前に PR を読み直すと、head SHA はもう期待値と一致しません。PROVE_STALE で終了し、何も投稿しません。証拠は、もう head に存在しない commit のものだからです。
パターン:黙って古くなることのない証明は、毎回届く証明よりも価値があります。
証明は意見ではなく成果物
考え方の転換は小さく、しかし一度切り替えると戻れません。「検証済み」を、レビュアーの頭の中で到達する状態として扱うのをやめて、オブジェクトとして扱います。実行 ID、URL、出力の抜粋、SHA を、機械可読な 1 行に溶接したものです。
証明が成果物になると、「証明がないこと」も見えるようになります。レシートのない PR は、単にまだ証明されていないということです。そして skill の fail closed な終了コードが、レシートがない理由を一つ残らず明示してくれます。
使ってみる
create-prove は aeon の公式 catalog(www.aeon.fun)に入っており、github.com/aeonfun/aeon のリポジトリに同梱されています。ほかにどんな skill があるかは skill 一覧 で見られます。skill を入れて、skill 1 つに対する PR を開けば、「proven」という言葉を agent に実際に勝ち取らせることができます。
シリーズ記事(原文・英語)
compute-resell: free compute sold at the clearing price — 余った compute を、板の表示上の最安値ではなく本当の清算価格で転売する skill
Ten Skills That Keep an Unsupervised AI Agent Honest — 無人で動く agent を誠実に保つ 10 個の skill のツアー
訳者から
コードを読みたい人には、skills/create-prove/ ディレクトリから入るのがおすすめです。SKILL.md の Steps のうち、ステップ 2(dispatch 前のゲート一覧)とステップ 4(dispatch_id がなぜ prove- で始まらなければならないか)を読むと、本記事の話がそのまま仕様として書かれているのが分かります。この接頭辞を間違えると「head は不変」という保証が黙って崩れる、という注意書きは、相関 ID を使うあらゆる CI 設計に通じる話です。
upstream に入ったときの PR は aeonfun/aeon#1075 です。
リポジトリ:github.com/aeonfun/aeon(MIT License) 原文:Create Prove: a green diff is not a proof
訳語の選択(レシート、相関、fail closed あたりの訳し方)について、より適切な言い方があればコメントで指摘してください。直します。技術的な誤訳についても同様です。
「レビューしました、問題ありません」をやめる — PR に実行の証拠を貼る AI Agent の skill
0
Posted at
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme