無人自動実行 (Away Run)
オペレーターが離席している間、キューが処理されます。各アイテムは新しいヘッドレスプロセスで実行されるため、利用制限やクラッシュが発生しても、影響は1つのイテレーションにとどまり、夜間の実行全体が中断されることはありません。状態はランフォルダのディスク上に保存され、プロセスの終了が /clear の代わりとなります。claude -p 用のフラグファクトは headless-claude スキルにあります。
リポジトリ設定とプロファイル。 <repo>/.claude/project-workflow.json はオプションです。このスキルは、キー projects_dir(デフォルト my-projects)、profile(デフォルト <projects_dir>/WORKFLOW.md)、backlog_file(デフォルト <projects_dir>/backlog.md)、および bootstrap(argv リスト、または null)を読み取ります。プロファイルのセクション「§ 無人自動実行」が存在する場合は、それを読み取ります:テストコマンド、発見ソース、自動許可クラス。プロファイルとこのスキルで異なる場合は、プロファイルが優先されます。
フェーズ — フェーズに入るときに1つのファイルをロードする
| フェーズ | 担当 | 参照先 |
|---|---|---|
| arm | オペレーター(同席) | 以下の § Arm(準備)、次に discover.md でキューを構築 |
| iteration | away-orchestrator、プロセスごとに1つ | iteration.md |
| status, disarm | オペレーター | 以下の § Status(状態確認)、§ Disarm(解除) |
project-workflow と away-run はファイル(バックログファイル、<projects_dir>/proposals/open/)を共有しますが、呼び出しは共有しません。ただし1つ例外があります:project 行は、無人モードで Skill ツールを介して /project-workflow を呼び出します。
プロジェクトウェーブは複数の project 行にまたがり、各 wave.md の § Session shape のステップグループ(1; 2-3; 4-7)ごとに1つずつ実行されます。各行は、ステップ ## Resume で指定された名前からそのグループの終わりまでを処理し、chore(<NNNN>): checkpoint wave N at step <n> でコミットし、境界に達していなければ次のステップのフォローオン行を追加します。行は、少なくとも1つのステップを完了した場合にのみ、attempts 0 でフォローオン行を1つ追加します。1つもステップを完了しなかった行は claimed 状態のままとなり、自身の attempts で再試行します。これは終了します:各フォローオン行はウェーブの7つのステップのうち少なくとも1つを進め、試行上限により完了しないステップは終了します。チェックポイントと ## Resume のみがハンドオフです(iteration.md § 3)。
レイアウト
<repo>-worktrees/away-<date>/ ワークツリー、ブランチ away/<date>、main から分岐
<run folder>/ away/<date> で追跡:arm.ps1 -RunFolder、
queue.md decisions.md log.md デフォルト <projects_dir>/away/<date>/
morning-report.md クローズアウトイテレーションによって書き込まれる
<repo>-worktrees/away-<date>-run/ スクラッチ、追跡外:away.env, watchdog.sh,
entry-prompt.md, watchdog.log, iter-NNN.*, locks
scheduled task away-<repo>-<date> 15分ごと、ハードストップまで
キューの行
templates/queue.md にスキーマがあります。列:id | item | agent | status | claimed_by | lease_until | attempts | evidence。agent は mechanical-worker、stream-worker、researcher、project、または discover です。キューを編集するたびにロックを取得します:mkdir <scratch>/queue.lock(アトミック操作;失敗した場合は10秒ごとに2分間再試行;最終更新から10分以上経過したロックフォルダは、owner ファイルの有無にかかわらず、古いものとみなして削除)、編集後、rm -rf でロックを削除します。2分間の再試行に失敗した場合の対処は iteration.md § 2 および § 4 にあります。クレームは、claimed_by をイテレーションのクレームタグ(iter-NNN、エントリプロンプトで指定されたとおり)に設定し、lease_until も設定します。リース期限が切れている場合は、イテレーションが停止したことを意味し、その行は再びクレーム可能になり、attempts が +1 されます。
準備(オペレーター同席)
- キュー。
discover.mdを使用してキューを構築します:名前付きチェックが設定されたティア1の行のみ。ティア2の作業は提案になります。行が遭遇する可能性のあるすべての決定に対してデフォルト名を付けます。決定が未定義でデフォルトがない行はキューに入れられません。 - 姿勢。 明確に述べます:この実行は
--permission-mode bypassPermissionsを使用するため、すべてのツール呼び出しはプロンプトなしで実行されます。グローバル拒否ルールは引き続き適用されます。「ゲートなし」(未解決の質問は名前付きデフォルトになり、失敗はスキップして再試行)は実行ごとにオプトインであり、キュー ヘッダーでgates: noneとして設定します。以前の実行から推測されることはありません。 - 準備。 最初にドライラン、次に実際の実行を PowerShell から行います:
powershell -NoProfile -File <skill>/arm.ps1 -Repo <path> -StopAt "<YYYY-MM-DD HH:MM>" -Queue <queue.md> -WhatIf。mainからaway/<date>にワークツリーを作成し、templates/からランフォルダをシードしてキューと共にコミットし、設定されたbootstrapargv({worktree}はワークツリーパスに置き換えられ、cwd はメインチェックアウト;キーが存在しないか null の場合はスキップ)を実行してその終了を待ち、watchdog.shとentry-prompt.mdをスクラッチにコピーし、away.envを書き込み、タスクを登録します(Register-ScheduledTaskを使用、決してschtasks /Createは使用しないでください:PowerShell 5.1 は/TRの引用を壊します)。bootstrap がゼロ以外で終了した場合、タスクが存在する前に拒否されます。ワークツリーとブランチは検査のために残されます。タスクにはプリンシパルがないため、オペレーターがログオンしている間のみ実行され、コンソールウィンドウを閉じると強制終了されます:画面をロックし、ログオフしないでください。 - 確認。
Get-ScheduledTask -TaskName 'away-*'でタスクが表示されます。最初の実行によりwatchdog upがwatchdog.logに書き込まれます。 - 準備後のキュー編集。 arm.ps1 はキューを一度コミットします。準備後に行ったキュー編集は、
away/<date>上で自分でコミットしてください(タスクが起動したら、キュー ロックの下で行います):イテレーションは、自分が作成していない未コミットの作業を他人のものと見なし、ステージングすることはありません。
ウォッチドッグの動作(watchdog.sh)
claude -p --agent away-orchestrator --max-turns Nを起動し、プロンプトは標準入力から渡します。モデルと努力量はエージェントのフロントマターから取得します。--effort、TTL フラグ、--disable-slash-commands(Skill が無効になるため)は使用しません。- イテレーションの成否は、
is_error/api_error_statusとqueue.mdが変更されたかどうかで判断し、num_turnsでは判断しません。キューに変更がなく3回のイテレーションが続くと終了します。 - 利用制限:メッセージに記載されたリセット時間までスリープします。「Opus の制限に達しました」というメッセージの場合は、
mechanical-worker行でのみ Sonnet(--model sonnet)で継続します。クレーム可能な行がない場合は、リセット時間までスリープします。 - 予算超過(
subtypeerror_max_budget_usd、kindbudget):スリープしません。制限はプロセスごとなためです。行のクレームは保持されるため、次のイテレーションは次の行を取得し、この行はリース期限が切れたときに戻ります。超過はエラーと同様にFAIL_MAXにカウントされます。 - クォータ予約:5時間のローリングウィンドウで
WINDOW_CAP_USDの推定使用額に達した場合、ウィンドウが空くまでスリープします。最後のRESERVE_MIN分はクローズアウト用に予約されます。 - キューが空:1回のクローズアウトイテレーションが朝のレポートを書き込み、終了します。それ以外の終了では、ウォッチドッグがスタブレポートを書き込みます。すべての終了で
STOPが書き込まれるため、以降のタスク実行は何もしません。STOPを削除すると再開します。 - 各アイテムイテレーションの後、そのイテレーションのクレームタグで保持されているリースを期限切れにします。これにより、制限やエラーで中断された行が、クローズアウトまで保留されることなく再試行されます。この処理はクローズアウト後(何もクレームしない)および予算超過後(上記参照)はスキップされます。
- 各イテレーションの開始時に
claude: <path>をログに記録します:これから実行するバイナリです。 main上、メインチェックアウト上、またはaway/*以外のブランチ上では実行を拒否します。- ドライラン:
CLAUDE=<スタブスクリプト> AWAY_NO_SLEEP=1 bash watchdog.sh <away.env>をaway/*上のスクラッチワークツリーに対して実行します。スリープはログに記録されますが、実際にはスリープしません。環境に設定されたCLAUDEまたはPYはaway.envで指定されたものを上書きするため、armで書き込まれたaway.envがあってもスタブが実行されます。ログ行claude: <スタブ>で確認してください。
状態確認
<scratch>/watchdog.log の末尾を確認します。queue.md を読みます。「別のウォッチドッグが動作中」と表示されるのを信頼する前に、claude.exe プロセス(tasklist)と最近の iteration N starting 行を確認してください:孤立したロックがあると、すべての実行が静かに停止します。Git Bash には pgrep はありません。
解除
powershell -NoProfile -File <skill>/disarm.ps1 -Repo <path> -Date <date>:STOP を書き込み、タスクの登録を解除し、Get-ScheduledTask -TaskName 'away-*' が何も返さないことを確認します。タスクが登録されたままになると、bash が15分ごとに起動し続けます。ワークツリーとブランチは確認のために残ります:朝のレポートを読み、その後、リポジトリの通常の方法で away/<date> をマージするか、削除します。
このように構築されている理由
- 回復力は CLI の外部にあります。
CronCreate durable:trueはセッション限定に戻りました(2026-09-19)。/loopは同じセッションに再入します。Bash ツール呼び出しからのnohup … &はそのシェルに所属します。Git Bash にはsetsidがありません。 - 利用制限は、増加するバックオフではなく、メッセージに記載されたリセット時間までスリープして対処します。また、イテレーションが低い
num_turnsで失敗と判断されることはありません。バックオフはリセットを過ぎてしまい、イテレーションは報告された1ターンで行を終了できるためです。