release-train-runner について
release-train-runner は、レビュー済みPRを指定順にリリースブランチへ統合するメンテナー向けスキルです。各PRを順番に検証、マージ、テストし、リリースPRとローカルレポートを作成します。
主な機能
- 01PRを順番に検証・統合
- 02マージごとの競合解決とテスト
- 03必要に応じた依存ロックファイルの再生成
- 04リリースブランチと統合リリースPRの作成
- 05ローカルレポートと結果マーカーの出力
活用シーン
- 01レビュー済みPRをリリースブランチに集約
- 02各統合をテストし、スキップしたPRを記録
- 03リリースPR用の統合手動テスト計画を作成
- 04リリース結果レポートを生成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ fellowship-dev/ dogfooded-skills --skill release-train-runnerインストール後、Claude Code で/release-train-runnerを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
CONTEXT.mdshared/release-pr-template.mdreport-template.mdtest-commands.mdstages/00-claim-compute/CONTEXT.mdstages/01-preflight/CONTEXT.mdstages/02-release-branch/CONTEXT.mdstages/03-validate-integrate/CONTEXT.mdstages/04-lockfiles/CONTEXT.mdstages/05-push-release-pr/CONTEXT.mdstages/06-release-env/CONTEXT.mdstages/07-report/CONTEXT.md詳細
目的
リモートコンピューティング環境(Ona または Codespaces)で、レビュー済みの N 個の PR を順番に 1 件ずつ、単一のリリースブランチにマージします。マージのたびにテストスイート全体を実行します。競合を記録し、統合された手動テスト計画を含むリリース PR を 1 件作成し、ローカルレポートも作成します。
このスキルは OPERATOR セッションで実行され、ワーカーのライフサイクルを管理します。ゲートウェイの worker API(pylot-cli スキルの § Workers を参照)を使ってリポジトリの worker devbox を起動し、ステージ 01〜06 をワーカー経由で実行します。ステージ 00(コンピューティング環境の確保)とステージ 07(レポートと結果マーカー)は、オペレーター内でインライン実行します。
この手順は完全に逐次実行します。 並列処理は一切ありません。PR ごとに、ほかのすべての PR に新たな競合が発生するため、ステージ 03 内の単一ループで、指定された順序に従って PR を 1 件ずつ検証し、統合する必要があります。PR ごとにサブエージェントを並列起動してはいけません。
ワーカーのセットアップ
ステージ 00(コンピューティング環境の確保後)で、ステージ 01〜06 用のワーカーを起動します。
REPO="${0:-$PYLOT_REPO}"
SPAWN_RESP=$(curl -s --max-time 90 -X POST \
-H "Authorization: Bearer $PYLOT_DISPATCH_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"repo\": \"$REPO\"}" \
"${PYLOT_API}/missions/${PYLOT_JOB_ID}/workers")
WID=$(echo "$SPAWN_RESP" | python3 -c 'import sys,json; print(json.load(sys.stdin).get("worker_id",""))' 2>/dev/null)
各ステージは pylot-cli の drive loop(§ Workers → Drive)を使って個別のプロンプトとして実行します(上記の raw-curl 形式は、使用可能な CLI がない場合の § Workers → Fallback を参照)。ステージ間ではアイドル状態になるまでポーリングします。ステージ 06 の完了後、インラインのステージ 07 でレポートを作成し、結果マーカーを出力する前に、ワーカーを停止します。
curl -s --max-time 30 -X POST \
-H "Authorization: Bearer $PYLOT_DISPATCH_TOKEN" \
"${PYLOT_API}/missions/${PYLOT_JOB_ID}/workers/${WID}/stop" >/dev/null 2>&1 || true
引数
| Param | Required | Default | Notes |
|---|---|---|---|
repo | はい | — | org/repo。例:Lexgo-cl/rails-backend($0 として解析) |
pr_numbers | はい | — | マージ順にスペース区切りで指定する PR 番号。例:1372 1375 1430($1 $2 $3 ...) |
instructions | いいえ | — | 末尾の括弧内に指定する補足ガイダンス。対象範囲を絞り込みます |
$ARGUMENTS から解析します。最初のトークンはリポジトリ、残りの裸の整数は順番に PR 番号、末尾の (...) は任意の補足指示です。マージ順は、指定された順序です。
実行内容
8 ステージの完全逐次 ICM 手順です。
| Stage | Mode | Description |
|---|---|---|
| 00-claim-compute | インライン | リモート環境(Ona または Codespaces)を確保し、REMOTE_EXEC と REPO_DIR を設定します |
| 01-preflight | サブエージェント | デフォルトブランチと PR マニフェストの確認、PR の検証、環境のクリーンアップ |
| 02-release-branch | サブエージェント | デフォルトブランチから release/YYYY-MM-DD を作成します |
| 03-validate-integrate | サブエージェント | 指定順の逐次ループ:PR ごとに、検証 → マージ → 競合解決 → テスト → 記録を実施し、次の PR に進みます |
| 04-lockfiles | サブエージェント | マージした PR のいずれかが依存関係に変更を加えた場合、ロックファイルを再生成し、再テストします |
| 05-push-release-pr | サブエージェント | リリースブランチをプッシュし、統合テスト計画を含むリリース PR を 1 件作成します |
| 06-release-env | サブエージェント | 非同期トリガー通知を書き込み、リモートコンピューティング環境を解放または停止します |
| 07-report | インライン | ローカルのレポートファイルを書き込み、結果マーカーを出力します |
ステージ 03 は、重要な判断を行う独立したステージです。PR の検証、競合の解決、マージの判定をすべて 1 つのクリーンなコンテキスト内で行い、PR を順次ループ処理します。
引き継ぎ先
すべての引き継ぎファイルは、リポジトリの作業ディレクトリ内にあります。
.procedure-output/release-train-runner/{stage}/handoff.md
ステージ 00 で、コンピューティング環境の確保に関するコンテキストを書き込みます。各サブエージェントステージに渡すのは、CONTEXT.md に入力として記載された引き継ぎ情報のみです。オーケストレーターのコンテキスト全体を渡してはいけません。
実行
ステージ 00(インライン)
ステージ 00 は自分で(オーケレーターのコンテキストで)実行します。CONTEXT.md を読み込みます。
.claude/skills/release-train-runner/stages/00-claim-compute/CONTEXT.md
リモート環境を確保し、REMOTE_EXEC と REPO_DIR を解決して、引き継ぎ情報を .procedure-output/release-train-runner/00-claim-compute/handoff.md に書き込みます。
ステージ 01 → 06(順次実行するサブエージェント — 一度に 1 つ)
各ステージを順番に実行し、それぞれについて Task を正確に 1 つ起動してください。次のステージを起動する前に、現在のステージが完了するまで待機してください。同じ応答で 2 つのステージを起動してはいけません。並列ステージはありません。
各 Task のプロンプトは自己完結している必要があります。
- ステージの CONTEXT.md に記載されている入力の引き継ぎパスのみを含めてください
- ステージの CONTEXT.md へのパスを含めてください
- オーケストレーターの履歴や、それまでの推論は渡さないでください
Task プロンプトのテンプレート:
You are running stage {NN}-{name} of the release-train-runner procedure.
Read your stage instructions:
.claude/skills/release-train-runner/stages/{NN}-{name}/CONTEXT.md
Your inputs:
.procedure-output/release-train-runner/{prior-stage}/handoff.md
(...any other handoffs the CONTEXT.md lists)
Write your output to:
.procedure-output/release-train-runner/{NN}-{name}/handoff.md
Execute all steps in CONTEXT.md. Write handoff.md before exiting.
いずれかのステージでハードブロッカー(例:00 でコンピュートがない、01 で有効な PR が 0 件)が発生した場合は、該当する結果マーカーを出力して停止してください。ステージ 03 で PR が 1 件スキップされても、チェーンは停止しません。
ステージ 07(インライン)
ステージ 07 は自分で(オーケストレーターのコンテキスト内で)実行してください。CONTEXT.md を読みます。
.claude/skills/release-train-runner/stages/07-report/CONTEXT.md
ローカルレポートファイルを書き込んだ後、オーケストレーターから [pylot] outcome=... マーカーを出力してください(サブエージェントからは出力しないでください)。
ステージの引き継ぎチェーン
00 ─► 01 ─► 02 ─► 03 ─► 04 ─► 05 ─► 06 ─► 07 (inline, reads all)
(per-PR loop:
validate → merge → resolve → test,
one PR at a time, in order)
終了パス
- 成功:ステージ 07 が次を出力します
[pylot] outcome="release train ready: N PRs merged into release/YYYY-MM-DD" status=success - 失敗:失敗したステージが次を出力します
[pylot] outcome="release-train failed at stage NN: {reason}" status=failed - ブロック:コンピュートを確保できない場合(00)、またはマージ対象となる有効な PR がない場合(01) →
[pylot] outcome="release-train blocked: {reason}" status=blocked
結果マーカーは常にオーケストレーターが(インラインで)出力し、サブエージェントは出力しません。
厳守事項
- 完全な逐次実行 — 並列処理は禁止。 1 回の応答で Task 呼び出しを 2 つ起動してはいけません。並列ステージはありません。
- PR ごとの検証と統合は順番どおりに逐次実行します。 ステージ 03 は、指定された順序で PR を 1 件ずつ処理します。PR ごとにサブエージェントを並列起動してはいけません。マージのたびに、後続のすべての PR の競合範囲が変わるためです。
- PR のレビューは全体の整合性を保って行います — diff 全体と、すべての観点をまとめて確認します。PR のレビューをファイルや観点ごとに分割してはいけません。
- ステージ 00 はインラインで実行します — オーケストレーターのコンテキスト内でコンピュートを確保し、後続ステージで
REMOTE_EXEC/REPO_DIRが安定して使えるようにします。 - ステージ 07 はインラインで実行します —
[pylot] outcome=...マーカーは必ずオーケストレーターが出力してください。 - オーケストレーターのコンテキスト全体をサブエージェントの Task プロンプトに渡してはいけません — 入力のみを渡してください。
- 各ステージは、次のステージが読み取る前に handoff.md を書き込みます。
- ステージをスキップしてはいけません — 実行内容が「作業なし」の場合も、すべてのステージを実行してください(例:ステージ 04 で依存関係の変更がない場合も、実行して「ロックファイルの変更なし」と記録します)。
- 中断ではなくスキップしてください。 検証に失敗した PR、解消できない競合がある PR、またはテストを失敗させる PR はスキップまたは取り消して記録します。リリーストレイン自体は中断しません。
- リリース PR をマージせず、強制プッシュせず、常に
--no-ffを使用し、マージのたびに必ずテストしてください。 Max がリリース PR を手動でレビューおよびマージします。 - Quest は使用禁止。 報告はローカルレポートファイル(ステージ 07)と非同期トリガー通知(ステージ 06)のみです。Quest POST、Quest トークン、Quest URL は一切使用しません。
参照ファイル
CONTEXT.md— アーキテクチャの概要shared/release-pr-template.md— リリース PR 本文のテンプレート(ステージ 05 で使用)shared/report-template.md— ローカルレポートのテンプレート(ステージ 07 で使用)shared/test-commands.md— プロジェクトごとのテストコマンド一覧(ステージ 03 および 04 で使用)stages/NN-name/CONTEXT.md— ステージごとの入力、タスク、出力仕様