relay-merge について
relay-merge は、relay-review が合格判定を記録した後に、対応する GitHub のマージを完了するスキルです。PR、保持されたワークツリー、永続化されたレビュー証拠が同じコミットを示すことを確認し、マージ記録と後処理を行います。
主な機能
- 01読み取り専用のマージ可否ゲート
- 02PR とワークツリー間のコミット照合
- 03方式を指定した GitHub の明示的マージ
- 04再試行可能な認可とマージ記録
- 05条件付きのリンク済みワークツリー削除
活用シーン
- 01Relay のレビュー合格後に GitHub PR をマージ
- 02中断したマージやマージキュー要求の再開
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ sungjunlee/ dev-relay --skill relay-mergeインストール後、Claude Code で/relay-mergeを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/append-learnings.mdfull-gate.mdlegacy-score-reports.mdoperator-emergencies.mdscripts/append-learnings.jsfinalize-run-terminal.jsfinalize-run.jsgate-check.jsreview-gate.jsrun-full-gate-helpers.jsrun-full-gate.jssprint-owner.jssprint-state-helpers.jssprint-state.js詳細
Relay Merge
relay-review が合格判定を記録した後、サポート対象の GitHub ルートでのみ使用してください。
ローカルの Reviewed Result は正規のリカバリーを経てクローズし、このスキルには進みません。
マージは引き続きオペレーターによる明示的な操作です。レビューのバイパスや可変状態の上書きは Relay の契約に含まれません。
Inputs
- 不変の Relay
run.jsonと追記専用のevents.jsonl。 - 保持されている実行用ワークツリーと、そのワークツリーに対応する正確なオープン PR。
--run-idまたは明示的な--run-dir。- 任意の不透明なオペレーター ID、マージ方式、操作 ID。
Process
1. 読み取り専用ゲート
RUN_ID=<run-id-from-dispatch>
node "${RELAY_SKILL_ROOT:-skills}/relay-merge/scripts/gate-check.js" \
--repo . --run-id "$RUN_ID" --json
このゲートは正規の Relay inspect を呼び出し、次のすべてが同じコミットを示さない場合は安全側に失敗します。
- GitHub のライブ PR ヘッドとリモートブランチ。
- 保持されているワークツリーの HEAD と Git ツリー。
- 永続的な PR 事実。
- 合格した検証の事実。
- 独立したレビューの事実と、凍結された Done Criteria のハッシュ。
導出されたアクションが merge でない場合は、そのアクションに従ってください。PR コメント、廃止された状態、または証拠の欠落を根拠に、マージの上書きを作り出してはいけません。
2. 明示的なマージとクリーンアップ
node "${RELAY_SKILL_ROOT:-skills}/relay-merge/scripts/finalize-run.js" \
--repo . --run-id "$RUN_ID" --merge-method squash --json
finalize-run.js は実行ロックの取得後に検査を再実行し、永続的なマージ許可を発行して GitHub を呼び出し、対象の PR が正確にマージされたことを再検証してから、merge_recorded の事実を 1 件追記します。その後、クリーンなリンク済みワークツリーを削除します。ダーティ、変更済み、未登録、またはリポジトリが一致しないワークツリーは、強制削除せず保持されます。
Finalize は GitHub REST の /user エンドポイントを呼び出しません。--actor はマージを行うオペレーターを記録します。
許可とマージレシートにより、クラッシュをまたぐ再試行が冪等になります。中断後は、同じアクターと方式で同じコマンドを再実行してください。永続化された許可値が正となります。どちらかの値を変更すると、GitHub への次のマージリクエストが送信される前に失敗します。オペレーターが外部で記録できる安定した相関 ID を必要とする場合は、--operation-id <id> を使用してください。--no-cleanup を指定すると、ワークツリーを意図的に保持します。その後、通常の再実行を行うと、再度マージすることなく最終クリーンアップが実行されます。
GitHub は PR がオープンのままでも、リクエストをマージキューに受け付けることがあります。この場合、status: merge_pending が返されます。再実行時には永続化された保留中のリクエストが確認され、再送信は行われません。GitHub がレビュー済みの正確なヘッドがマージされたと報告した後にのみ、マージが記録されます。
外部呼び出しの直前に、finalize は不変のリクエスト意図を fsync します。クラッシュ後にその意図が残っており、GitHub が正確なマージもキューに入ったリクエストも証明できない場合、finalize は結果が曖昧であるというエラーで失敗し、重複呼び出しのリスクを冒す代わりに、正規のリカバリーを要求します。
最終事前チェックでは、不変の設定済みベースとソース SHA を再確認します。GitHub のレビュー段階では、ライブのレビュー済みベースから三点比較のセマンティクスでパッチを作成するため、レビュー前に必要なベース更新によって、ベースのみのパスがブランチに帰属することはありません。レビュー後にベースコミットが進んだ場合、finalize はレビュー済みベースがその祖先であることを確認し、レビュー済みの正確な Git パスセットと GitHub によるベースの前進パスを比較します。重複がなければマージ可能です。重複がある場合は型付きエラーとなり、ブランチを現在のベースに更新したうえで、正規の検証を行う必要があります。続く再レビューでは、新しいライブ PR ベースを三点比較の左側として使うため、ブランチ固有の変更のみがステージングされます。パスの重複はあくまで代替指標であり、異なるパス間の意味的な競合はこの証明の対象外です。GitHub の比較機能ではファイルの証拠が最大 300 件に制限されます。この上限への到達と、コミットのページネーションが不完全な場合は、安全側に失敗します。
GitHub のマージ API には、アトミックなソース SHA 期待値ガード(--match-head-commit)がありますが、ベースの期待値に対する compare-and-swap はありません。そのため、リクエスト前にベースの付け替えが検出された場合は安全側に失敗します。一方、チェック後からリクエスト前までに外部のコラボレーターが PR メタデータを変更する残存のベース競合は、弱められたソース SHA や設定済みベースの不変条件ではなく、文書化された GitHub プラットフォーム上の脅威境界です。
マージリクエスト後のマージキューまたはベースの移動は再開時に再確認されますが、Relay は外部で完了したマージを取り消すことはできません。
3. 任意のマージ後プロジェクト更新
append-learnings.js と dev-backlog のスプリント更新は、個別のプロジェクト変更です。
finalize-run.js が status: merged を返した後に、明示的に実行してください。
これらはマージトランザクションの一部ではありません。
マーカーで範囲を指定する学習内容の書き込みについては
references/append-learnings.md を、
復旧方法については
references/operator-emergencies.md を参照してください。直列化されたフルスイートゲートのガイダンスは
references/full-gate.md にあります。