Communityライティング&編集github.com

merttcetn/pev-loop

証拠ベースのPlanner-Executor-Verifierループにより、長期実行Codex目標をフレッシュなロールコンテキストとOS一時ディレクトリのみの実行状態で管理します。

pev-loop とは?

PEV Loopは、永続的な目標に対してステートレスなPlanner-Executor-Verifier(計画・実行・検証)ループを実行するAIエージェントスキルです。プライマリエージェントは薄いコントローラーとして振る舞い、正規状態を維持し、分離されたロール(P/E/V)をディスパッチし、制限を適用し、結果を報告します。製品自体の計画、実装、評価は行いません。このスキルの主な価値は、各ロールにフレッシュなコンテキストを与え、検証者が計画者や実行者の推論を見られないようにし、すべての実行状態をOS一時ディレクトリ内に保持することで、エージェントのセルフグレーディングや状態汚染を防止する点にあります。主にCodex環境を想定していますが、ネイティブ目標ツールがない場合でも制限付きPEV実行として機能します。反復制限、モデルルーティング、ロール分離、テンポラリのみの状態を強制し、製品ルーブリックにはPEVの内部メカニズムを含めません。最終的な品質ゲートでは、コントローラーの機械的監査と独立した最終検証の両方に合格する必要があります。

対応~Claude Code✓Codex CLI~Cursor
npx skills add merttcetn/pev-loop

Installed? Explore more ライティング&編集 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

PEV ループ

1つの永続的な目標に対して、ステートレスなPlanner-Executor-Verifierループを実行します。プライマリエージェントは薄いコントローラーとして維持します。正規状態を維持し、分離されたロールをディスパッチし、制限を適用し、結果を報告します。製品自体の計画、実装、評価は行いません。

譲れない保証事項

  • 明示的な $pev 呼び出しを要求します。その呼び出しを、一致するネイティブ目標を作成または再利用し、P、E、V サブエージェントをディスパッチするための許可として扱います。
  • コントローラーを製品の作業から遠ざけます。プライマリコンテキストでソースコードを検査したり、変更を実装したり、生のテストログを解釈したり、ルーブリックの満足度を判断したりしてはいけません。
  • すべての P、E、V エージェントをフレッシュなコンテキストで作成します。fork_turns="none" またはランタイムで最も強力な同等のものを使用します。
  • エージェントに自身の作業を評価させてはいけません。
  • プランナーと実行者の推論、サマリー、期待される結果を検証者から隠します。
  • 検証者の証拠だけがルーブリックの満足度を変更できるようにします。
  • すべての実行状態を、一意の名前を持つ1つのOS一時ディレクトリに保存します。リポジトリ、ワークスペース、ホームディレクトリ、またはスキルディレクトリの下に実行状態を作成してはいけません。
  • 実行が終了したら、正確な一時ディレクトリをそのまま残します。その内容をステージング、コミット、プッシュ、公開、または永続的なプロジェクトファイルにコピーしてはいけません。
  • PEV のメカニズムを製品ルーブリックに含めてはいけません。反復制限、モデルルーティング、ロール分離、および一時ディレクトリのみの状態を、コントローラーの機械的監査を通じて強制します。
  • 合格を得るためだけに既存のテストを削除、スキップ、弱体化、または書き換えてはいけません。ユーザーの目標によって必要とされる場合にのみ正当なテスト変更を許可し、その場合は検証者にそれらを精査させます。
  • 最終的な完全ルーブリック検証を迂回してはいけません。

呼び出しの解析

$pev の後に目標と以下のオプション制御を受け入れます:

  • max=N または --max N: 1..10 を許可、デフォルトは 6。
  • using=$skill-name: 指定されたスキルを、それが関連するすべてのロールで独立してロードします。その要件をルーブリックで使用し、実行者にそれに従うことを要求し、検証者にそれを独立して評価することを要求します。

呼び出しに目標が省略されている場合、アクティブなネイティブ目標を読み取ります。どちらも存在しない場合は、目標を尋ねて停止します。

ネイティブ目標ツールが利用可能な場合:

  1. 目標を作成する前に現在の目標を読み取ります。
  2. リクエストされた目標と一致する場合のみ、アクティブな目標を再利用します。
  3. 目標が存在しない場合は作成します。ユーザーが明示的に指定しない限り、トークン予算を設定しません。
  4. 別の未完了の目標が存在する場合は、それを置き換える代わりに、停止してユーザーに解決を依頼します。

ネイティブ目標ツールが利用できない場合、制限付きPEV実行として続行し、自動継続が利用できないことを開示します。

一時状態のブートストラップ

以下を実行します:

python3 <skill-directory>/scripts/init_run.py --max-iterations <N>

返された絶対パスの run_dir をスレッドに記録し、すべてのサブエージェントに明示的に渡します。最初のディスパッチの前に references/contracts.md を読んでください。

goal.json に正確な目標と制約を設定します。1つのフレッシュな仕様プランナーをディスパッチして、完了の変更不可能な定義を作成します。すべてのルーブリック項目に以下を要求します:

  • 未充足で開始すること;
  • 活動ではなく観察可能な結果を説明すること;
  • 許容される証拠を指定すること;
  • ユーザーとリポジトリの制約を維持すること; そして
  • 独立して検証可能であること。

反復回数、エージェント選択、コンテキスト分離、一時パス、コントローラーのブックキーピングなど、内部のPEVメカニズムを製品ルーブリックから除外します。「コミットしない」「プッシュしない」「テストを変更しない」など、リクエストされた結果に制約を課すユーザーから見えるワークスペースの不変条件を維持します。

コントローラーの機械的スキーマゲートの後で rubric.json を凍結します。可変の満足度と証拠は progress.json にのみ保存します。

コントローラーはすべての状態ファイルを所有します。P、E、V エージェントはコンパクトなJSONレスポンスを返さなければならず、一時状態を変更してはいけません。

ループの実行

各反復(1 から max_iterations まで)について、以下のステージを順に実行します。

1. フレッシュなPlannerのディスパッチ

フレッシュな読み取り専用Sol Plannerを起動します。以下の情報のみを与えます:

  • ワークスペースパス;
  • goal.json、rubric.json、progress.json;
  • 前回の検証者の判定(存在する場合);
  • 反復番号と残り予算;
  • 明示的に要求された using= スキル。

Plannerが製品とリポジトリの指示を検査することを許可します。以前のPlannerやExecutorの推論は与えません。

契約に一致する1つの制限付き task_packet を要求します。DONE_CANDIDATE は、有用な作業単位が残っていない場合のみ許可します。完了の証明として扱ってはいけません。

以下の計画を機械的に拒否します:

  • 未充足のルーブリック項目に対処していない;
  • スコープ、制約、検証対象を省略している;
  • 検証者の証拠に応答せずに、失敗した作業単位を繰り返している;
  • テストの弱体化や許可されていない破壊的行動を要求している;
  • 1つのExecutor割り当てに収まらない。

高リスクのセキュリティ、移行、権限、財務、または不可逆的な作業については、実行前にフレッシュな読み取り専用の計画レビューアを1つ挿入します。目標、ルーブリック、およびタスクパケットを与えますが、Plannerの推論は与えません。

Executorをディスパッチする前に、受け入れられたタスクパケットを plan.json に書き込みます。検証後までコントローラーの状態更新を遅延させてはいけません。

2. フレッシュなExecutorのディスパッチ

フレッシュなSolワーカーを起動し、タスクパケットのファイルと責任のみを所有させます。コードベースに他の作業が存在する可能性があり、無関係な変更を維持しなければならないことを伝えます。

以下を与えます:

  • 正確なタスクパケット;
  • ワークスペースパスと該当するリポジトリ指示;
  • スコープの逸脱を防ぐために必要な元の制約;
  • 明示的に要求された using= スキル。

検証者の権限は与えません。1つの意味のある作業単位を実装し、釣り合ったチェックを実行し、Executorレシートのみを返すことを要求します。ルーブリックや一時状態を更新させてはいけません。

検証およびビルドコマンドが、ターゲットワークスペースに付随的なキャッシュ、ログ、カバレッジ出力、その他の非製品アーティファクトを残さないようにします。使い捨て出力は、サポートされている場合、独立して作成されたOS一時ロケーションにルーティングします。それ以外の場合は、その割り当てによって作成された、出所が確実な正確な使い捨てアーティファクトのみを削除します。既存または曖昧なパスを決して削除してはいけません。

ランタイムがモデルオーバーライドをサポートしている場合、以下のように推論努力をルーティングします:

  • 機械的で狭い範囲の実行: gpt-5.6-sol、low で;
  • 通常の実装: gpt-5.6-sol、medium で;
  • 横断的またはリスクのある実装: gpt-5.6-sol、high で。

目標が明示的に要求しない限り、コミットやプッシュをしてはいけません。

3. フレッシュな盲検Verifierのディスパッチ

フレッシュな読み取り専用Sol Verifierを high の推論で起動します。重要なセキュリティ、移行、権限、または不可逆的な作業には xhigh を使用します。

以下のみを与えます:

  • 正確な元の目標と凍結されたルーブリック;
  • ワークスペースまたは生成されたアーティファクト;
  • 該当するリポジトリ指示;
  • ユーザーが指示した検証コマンド;
  • 明示的に要求された using= スキル。

コントローラーの実行ディレクトリ、タスクパケット、Planner出力、Executorレシート、実装サマリー、期待される結果、以前の判定の根拠、またはP/Eの会話履歴は与えません。Verifierのツールが使い捨て出力を必要とする場合、別のOS一時スクラッチディレクトリを与えます。

Verifierが現在の製品を独立して検査し、関連するチェックを実行し、報酬ハッキングのためにテスト変更を調べ、判定契約を返すことを要求します。Verifierは製品、テスト、実行状態、または外部システムを変更してはいけません。

4. 正規状態の更新

コントローラーにレスポンスの形状を検証させ、完全なレスポンスを反復の判定ファイルに書き込み、Verifierが裏付けたステータスと証拠を次のディスパッチの前に progress.json にコピーさせます。弱い証拠を合格として再解釈してはいけません。

  • NEEDS_WORK の場合、新しいPlannerで次の反復を開始します。
  • PASS の場合、以前の満足度ステータスなしで、追加のフレッシュな最終Verifierを1つディスパッチします。すべてのルーブリック項目をゼロから評価することを要求します。
  • 最終 PASS の場合、ロール分離、反復回数、一時ディレクトリのみの状態、および認可境界に関するコントローラーの機械的監査を実行します。両方のゲートが合格した場合のみ、ネイティブ目標を完了とマークします。
  • 最終失敗の場合、反復が残っていれば続行します。

停止条件

フレッシュな最終Verifierがすべてのルーブリック項目を証明した後にのみ、正常に停止します。

製品検証とオーケストレーションの整合性を別々のゲートとして扱います:

  • プロダクトゲート: フレッシュな盲検最終Verifierが凍結ルーブリックを証明する。
  • コントローラーゲート: 機械的にチェック可能な記録が、反復制限、フレッシュロールディスパッチ、一時ディレクトリのみの状態、および許可されていないコミット、プッシュ、公開、デプロイ、または破壊的行動がないことを証明する。

コントローラーのブックキーピングの失敗を製品Verifierに送り返したり、製品ルーブリック項目に変えたりしてはいけません。安全なブックキーピングは可能な場合は直ちに修復します。そうでない場合は、完了を主張せずにコントローラーゲートの失敗を報告します。

反復制限に達した場合:

  • 成功を主張しない;
  • 制限に達したという理由だけで目標を完了またはブロックとマークしない;
  • 満足した項目、残りの項目、決定的な証拠、正確な一時パスを報告する;
  • 明示的な継続のために目標をアクティブのままにする。

ランタイムの繰り返しブロッカーしきい値が真に満たされた場合のみ、目標をブロックとマークします。認可、重要な製品決定、不足している認証情報、または利用できない外部依存関係が安全な進行を妨げる場合、ユーザー入力のために一時停止します。

リカバリ

一時ディレクトリが消失した場合、新しいものを作成し、アクティブなスレッド目標と会話から目標と凍結ルーブリックを再構築します。以前のすべての満足度は未証明として扱い、続行する前にフレッシュな完全Verifierを実行します。

サブエージェントが失敗した場合:

  • クリティカルなP、E、またはVロールを1回、同じ分離境界で再試行;
  • 欠落したVerifierの判定をコントローラーの判断で置き換えてはいけない;
  • 新しいPlannerを通じて過大な作業単位を縮小;
  • 無関係なワークスペースの変更を維持;
  • 反復制限がリカバリを妨げる場合、ギャップを正直に報告する。

最終品質ゲート

成功を返す前に、以下を確認:

  • プライマリエージェントはコントローラーとしてのみ機能した;
  • すべてのロールがフレッシュな分離コンテキストを使用した;
  • どのエージェントも自身の出力を評価しなかった;
  • 検証者はP/Eの推論や期待される結果を見なかった;
  • すべてのルーブリック項目に最終Verifierからの最新かつ直接的な証拠がある;
  • 成功を生み出すために既存のテストが弱体化されなかった;
  • ワークフローによって作成された付随的なコマンドアーティファクトがターゲットワークスペースに残っていない;
  • 実行状態は記録されたOS一時ディレクトリの下にのみ存在する;
  • 実行状態がプロジェクトにコミットまたはコピーされなかった;
  • ネイティブ目標(利用可能な場合)は最終 PASS の後にのみ完了とマークされた。

関連スキル