SpecRunnerDocs
ドキュメントPR・merge・archive
GUIDE

PR・merge・archive

Pipelineの出力を人間へ引き渡し、確認・merge・archiveを順序どおりに完了させるためのガイドです。

このページの内容

完了の境界を3段階で捉える

pr-create成功後の状態はawaiting-archiveです。PRを人間が確認してmergeを判断し、archive後にarchivedとなって初めてjobが閉じます。

PIPELINErunning

最終verification、ADR判断、PR作成までを実行。

HANDOFFawaiting-archive

PR作成済み。人間の差分・checks・merge判断を待つ。

TERMINALarchived

archive記録、merge、状態更新、cleanupまで完了。

01conformance

受け入れ基準と構造を承認

02re-verification

最後のcode変更が未検証なら再実行

03adr-gen

standardのみ。opt-inで判断

04pr-create

CLIがPRを作成

実装・build-fixer・code-fixerの最終変更が直近のverificationより新しい場合、PR作成へ進む前にverificationへ戻ります。Standardはその後にADRを判断し、FastはADRを省いて直接PRを作成します。

状態名。 現行のJobStatusにawaiting-mergecompletedはありません。運用表示でもawaiting-archiveを使用します。

ADRはrequestで候補化し、agentが必要性を判断する

adrはrequest.mdのMetaに必須です。ただしtrueは「必ずADRを書く」ではなく、「ADRに値するかを判断する」指定です。

request.md — Meta
- **adr**: true
指定実行結果
adr: falseagent sessionを起動せずskipそのままpr-createへ進む
adr: true + judge no材料を読み、不要と判断ADRを作らず成功扱い
adr: true + judge yes設計判断と代替案を記録specrunner/adr/YYYY-MM-DD-<slug>.md

ADRの有無は実装完了の合否ではありません。長期的に残すべき設計判断があるか、という別の軸です。

PR作成は決定的なCLI step

pr-createはagentへGitHub操作を任せず、GitHub REST APIを使います。titleとbodyもrequest.mdとjob stateから組み立て、commit messageには依存しません。

Titlerequest type由来のprefix + request.mdのH1
Summary「背景」「目的」と、linked IssueがあればFixes行
Workflowspec-review・verification・code-reviewのverdict、回数、結果path
Test planverification resultとtest-cases.mdの確認項目
Attestation commentjournal hash、gate履歴、model、cost。追加失敗はwarning
同じbranchのPRpr-createの結果
存在しない新規作成
OPEN既存PRを再利用。重複作成しない
MERGEDerror。追加変更は新しいbranchが必要
CLOSEDerror。reopenまたは新しいbranchを判断

run --jsonではawaiting-archiveresult: "pr-created"として返し、prUrlを機械的に取得できます。

人間がmerge前に確認する

SpecRunnerのgate通過は、merge判断の代替ではありません。PR上でrequest・実装差分・検証根拠を照合します。

1
requestとの一致

目的、スコープ、受け入れ基準を満たし、意図しない変更がないか。

2
実装差分

権限境界、migration、公開API、依存更新など、影響の大きい箇所を直接確認。

3
検証結果

verification-result.mdとchecksが、現在のPR headに対応しているか。

4
review findings

修正済みfinding、decision-needed、Custom reviewerの結果を確認。

5
ADRとattestation

長期判断の記録、gate順、iteration、costが妥当か。

PR commentのattestationとrepository内の証跡の対応は監査と証跡で確認できます。

承認の境界。 確認後にjob archive --with-mergeを実行する行為が、人間によるmerge承認です。Issue起点の無人mergeは推奨しません。

archiveを記録してからmergeする

推奨経路は--with-mergeです。archiveのfolder移動とstateをfeature branchへ先にcommitし、そのcommitがPR headへ反映された後でchecksとmerge可否を評価します。

terminal
# archive前にidentityとslugの一意性を固定
npx specrunner job ls --all --json
npx specrunner job show <job-id>
npx specrunner job archive --with-merge my-feature
# cleanup後はslugで表示し、出力されたJob IDを固定値と照合
npx specrunner job show my-feature

一覧で同じslugの非終端jobが意図した1件だけで、そのJob IDが固定値と一致する場合だけarchiveします。

01record archive

change folderを移動しfeature branchへpush

02merge gates

protected paths、PR head、checks、conflictを確認

03squash merge

GitHub APIでbase branchへmerge

04close job

integrity検証、archived化、worktree・branch削除

最初のarchive記録より先に手動mergeしません

activeなchange folderを残したままPRをmergeすると、そのfolder移動を同じPRへ載せられません。まず--with-mergeを実行し、archive commitをPRへ含めます。

高リスクpathは自動mergeを止める

.specrunner/config.json
{
  "version": 1,
  "archive": {
    "protectedPaths": [
      ".github/workflows/**",
      "infra/production/**"
    ],
    "postMergeVerify": [
      "npm ci",
      "npm test"
    ]
  }
}

protectedPathsに一致するとarchive commitを記録した時点で停止します。PRを人間が確認して手動でsquash mergeし、同じ--with-mergeを再実行するとpost-merge cleanupへ進めます。file listがAPI上限でtruncateされた場合もfail-closedで停止します。

postMergeVerifyはmerge SHAの一時worktreeで順番に実行します。command失敗は「merge済み」のescalationとなり、自動rollbackしません。base branchを修正してからarchiveを再実行します。fetchやworktree作成自体に失敗した場合はwarningで続行するため、「未検証」の表示を見落とさないでください。

既定timeoutと全設定キーはConfigurationを参照してください。

停止条件と次の操作

検出状態次の操作
PR番号がないarchive開始不可pr-create完了状況をjob showで確認
protected path / file list不完全merge前に停止PRを人間が確認し、必要ならmanual merge
checks pending / timeoutmerge前に停止完了後に同じarchive commandを再実行
checks failedmerge前に停止失敗を修正し、PR head更新後に再実行
conflictmerge前に停止base branchへrebaseし、--force-with-leaseでpush
checks成功 + BLOCKEDmerge前に停止required reviewなどbranch protectionを満たす
postMergeVerify失敗merge済み・cleanup前base branchを修正。rollbackは自動実行されない

同じcommandを再実行して収束させる

PR作成とarchiveは再実行を前提にしています。停止時にstate、worktree、feature branchを先に削除せず、原因を解消して同じslugを使います。

OPEN PRがある同じPRを再利用
archive commit記録済み重複移動・commitを避けてchecks待ちから継続
merge済み + archive記録済み状態更新とpost-merge cleanupへ進む
すでにarchived成功no-op。追加操作は不要
cleanup warninggit worktree listとbranchを確認し、残骸だけ手動整理
terminal
# archive前にidentityとslugの一意性を固定
npx specrunner job ls --all --json
npx specrunner job show <job-id>
npx specrunner job archive --with-merge my-feature
# cleanup後はslugで表示し、出力されたJob IDを固定値と照合
npx specrunner job show my-feature

同じslugの非終端jobが意図した1件だけで、一覧のJob IDが固定値と一致することを再実行前にも確認します。

具体的なerror別の復旧commandはトラブル対応を参照してください。

参照ソース 9