Skip to content
frontmatter
キー値
specdojo.idprj-0001:pjr-wpr3-exec-run-split-investigation
specdojo.typeproject
specdojo.statusready
specdojo.rulebookspecdojo:pjr-rulebook
specdojo.part_ofprj-0001:pjr-index
specdojo.item_typetodo
specdojo.item_statusdone
specdojo.prioritymedium
specdojo.ownerARC
specdojo.registered_at2026-10-02T12:14:16Z
specdojo.completed_at2026-10-07T22:18:00Z
specdojo.conclusionexec-run.ts の関数の分類・依存・重複・状態遷移を調べ、3 案を PJR-Q761 で比較した。利用者が選択肢 C を選んだ

PJR-WPR3 exec-run.ts の分割方針の調査と選択肢の比較 ​

1. 概要 ​

exec-run.ts の関数・依存・初回と再開の重複を調べ、モジュールの境界と状態遷移の選択肢と推奨案を exec-run.ts の分割方針の決定の個票へ書く。決定はしない(v0.3.0 の公開後)

2. 完了条件 ​

  • 調査と比較だけを行い、src/ のコードは変更しない。決定は prj-0001:pjr-q761-exec-run-module-split で利用者が行う。
  • src/exec-run.ts(2026-10-07 時点で 7,948 行、トップレベルの関数 114 個)の関数を、段階(準備・worktree・agent の起動・親検証・reporter・統合・再開・register の記帳・CLI の登録など)ごとに分類した一覧を作る。関数ごとに行数と、主に呼び出す側・呼ばれる側を示す。
  • 段階の間の依存と、他のモジュール(exec-worktree*.ts・exec-register*.ts・exec-parent-validation.ts・exec-reporter.ts など)への依存を整理し、分割したときに循環依存が生じうる箇所を挙げる。
  • 初回の実行と再開(executor・reporter・統合の各段からの再開)の経路で重複している処理を、関数名と行の範囲で具体的に挙げる。
  • 現在の暗黙の状態(pipeline-state.json の各段の状態と register の状態)の遷移を表にし、初回と再開を 1 つの状態遷移にまとめる場合の形を示す。
  • 選択肢を 3 つ以上比べる(例: 段階ごとのモジュールへの分割のみ、分割と明示的な状態遷移の導入、段階的な切り出しの順序づけ)。各選択肢について、利点・懸念・既存のテストへの影響・作業量・切り出しの順序を書く。
  • 推奨案を 1 つ示し、最初に切り出す範囲と、振る舞いを変えていないことを確かめる方法(既存の unit / integration テスト、追加すべきテスト)を書く。
  • 選択肢の比較を prj-0001:pjr-q761-exec-run-module-split の「検討した選択肢」に書き、決定内容と承認の欄は _TODO_ のまま残す。関数の一覧などの詳しい調査結果は本個票の対応結果に書く。
  • npm run check が通る。

3. 作業内容 ​

No作業担当状態メモ
1関数の分類・依存・重複・状態遷移を調べるARCdoneコードは変更していない
2選択肢を比べ、推奨案を書くARCdonePJR-Q761 の「検討した選択肢」へ
3方針を決めるPOopenPJR-Q761 で利用者が決める

4. 対応結果 ​

4.1. 調査範囲と結論 ​

2026-10-08 時点の src/exec-run.ts は 7,948 行、トップレベル関数は 114 個だった。TypeScript AST で関数宣言、行範囲、同一ファイル内の直接呼び出しを抽出し、実装と関連テストを照合した。src/ のコードは変更していない。

主な結論は次のとおり。

  • ファイル内には CLI 登録、実行対象の選択、agent 起動、親検証、reporter、worktree 統合、Schedule と Register の状態遷移、Job 実行が同居している。
  • Register worktree の初回と executor 再開は runAgentPipeline、初回・各再開の統合は finalizeRegisterWorktreeRun をすでに共有している。一方、入口の復元・記帳と、Schedule / in-place / Register 間の pipeline 段制御には重複が残る。
  • 一括して状態機械へ置き換えるより、既存の公開 export を façade で維持しながら、純粋な選択処理、agent 呼び出し、pipeline 段、ドメイン別統合の順に切り出す方が、差分と回帰時の切り戻し単位を小さくできる。
  • 推奨は「段階的なモジュール切り出し後に、初回と再開を同じ遷移関数へ載せる」案である。これは調査上の推奨であり、採否は PJR-Q761 exec-run.ts の分割方針を決める で決定する。

4.2. 段階別の全体像 ​

段階主な責務主な関数・行直接依存する既存モジュール
準備・選択option、agent 候補、phase、lock、prompt の解決pinnedExecutor から loadPrompt(398-932)exec-agent-config.ts、exec-strategy.ts、exec-run-lock.ts、exec-slot-lock.ts
親検証・契約executor prompt、再開時 target 被覆、親検証の実行と evidence 追記resolveResumedCoverageTargets から executorRequirements(942-1200)exec-evidence.ts、exec-parent-validation.ts
agent 起動reporter 選択、process 起動、retry、利用制限、保護機構reporterRequirements から agentEnvironment(1202-1596)exec-agent-config.ts、exec-agent-git-state.ts、exec-agent-protected-config.ts、exec-protection-handoff.ts
Schedule 準備claim、plan/result/worktree、review 前 grade、完了事前判定findClaimEventPath から readCompletionPreflight(1598-2029)exec-events.ts、exec-plans.ts、exec-results.ts、exec-worktree*.ts、review-grade.ts
Schedule 実行・統合executor / reporter / 親検証 / commit / merge / block / completerunPreparedTask(2031-2702)exec-pipeline-state.ts、exec-reporter.ts、exec-repo-integration.ts、exec-worktree-ops.ts
状態 CLI自 CLI の validate / refresh / claim / complete / block 呼び出しrunPreparedTaskSafely から spawnBlock(2709-2873)spawn-self.ts、exec-events.ts
Schedule orchestrationauto/manual の準備、worker pool、実行runBatchMode から runManualMode(2875-3272)exec-schedule*.ts、exec-task-view.ts
in-place / Jobworktree を使わない plan、Job command、任意 analysisresolveInPlaceCommand から runJobMode(3278-4310)exec-plans.ts、exec-results.ts、job.ts
Register 選択・pipelineRegister agent 選択、executor、reporter、evidenceresolveRegisterCommand から runAgentPipeline(4316-4835)exec-register.ts、exec-evidence.ts、exec-reporter.ts、exec-pipeline-state.ts
Register 記帳transition、管理対象 path、commitspawnRegisterTransition から registerReporterManagedPaths(4839-4951)register.ts、register-events.ts、register-item.ts
Register in-place1 個票の plan/result/agent/transitionrunSingleRegisterItem(4957-5164)exec-register.ts、exec-results.ts
Register worktree・統合setup、checkpoint、wait、commit、merge、review、cleanupregisterStatePaths から runSingleRegisterItemWorktree(5169-6145)exec-worktree*.ts、exec-repo-integration.ts、exec-repo-trace.ts
Register 再開checkpoint 選択、入力復元、executor / reporter / integrate 再開protectResumableRegisterWorktree から resumeSingleRegisterItemWorktree(6150-6663)exec-register-resume.ts、exec-pipeline-state.ts、exec-task-repos.ts
CLI・cycleRegister 実行、slot 表示、cycle、Schedule 再開、Commander 登録runRegisterMode から registerResumeCommand(6670-7948)commander、exec-run-lock.ts、exec-schedule*.ts

4.3. トップレベル関数一覧 ​

「呼出元」「主な呼出先」は src/exec-run.ts 内の直接呼び出しを示す。外部/CLI は Commander callback またはテストから直接呼ばれる公開 helper を含む。呼出先が多い関数は主要な 4 件までを記載した。

段階関数行範囲(行数)主な呼出元主な呼出先
準備・選択pinnedExecutor398-400 (3)prepareSingleTask, resolveInPlaceCommand-
準備・選択pinnedReporter402-404 (3)prepareSingleTask, runInPlaceMode-
準備・選択resolveAgentOverride409-448 (40)resolveReporterAgentCandidates, prepareSingleTask, runCommandJobMode-
準備・選択runCompletionDrivenWorkerPool509-562 (54)runBatchMode, runRegisterMode-
準備・選択buildTaskPhaseMap564-622 (59)runBatchMode, runManualMode, runResumeMode-
準備・選択resolveTaskPhaseContext624-653 (30)prepareSingleTask-
準備・選択selectCandidates655-704 (50)resolveReporterAgentCandidates, prepareSingleTask, resolveInPlaceCommand-
準備・選択collectBusyActors709-723 (15)prepareSingleTask-
agent 起動isRateLimitError725-752 (28)executeAgent-
準備・選択resolveExecDefaultsPath754-773 (20)resolveJoinSlotLimit, runBatchMode, runManualMode-
準備・選択configuredWorktreeBase775-786 (12)runBatchMode, runManualMode, runRegisterMode-
準備・選択parseParallel788-798 (11)runBatchMode, runRegisterMode, registerRunCommand-
準備・選択parseExecRunBusyPolicy800-806 (7)withProjectExecRunLock-
準備・選択resolveRegisterWorktree808-818 (11)registerRunCommand-
準備・選択resolveJoinSlotLimit832-838 (7)withProjectExecRunLockresolveExecDefaultsPath
準備・選択withProjectExecRunLock840-904 (65)registerRunCommand, registerCycleCommand, registerResumeCommandparseExecRunBusyPolicy, resolveJoinSlotLimit
agent 起動delay906-908 (3)runWithRetry-
準備・選択expandPromptRefs910-927 (18)loadPrompt, runInPlaceMode, runCommandJobMode-
準備・選択loadPrompt929-932 (4)prepareSingleTaskexpandPromptRefs
親検証・契約resolveResumedCoverageTargets942-954 (13)buildExecutorPrompt, resumedTargetCoverageFailure-
親検証・契約executorEvidenceContract956-1043 (88)buildExecutorPrompt-
親検証・契約buildExecutorPrompt1045-1056 (12)prepareSingleTask, runPreparedTask, runInPlaceModeresolveResumedCoverageTargets, executorEvidenceContract
親検証・契約resumedTargetCoverageFailure1058-1073 (16)runPreparedTask, runAgentPipelineresolveResumedCoverageTargets
親検証・契約runConfiguredParentValidationBatch1084-1103 (20)親検証 wrapper 3 関数-
親検証・契約runConfiguredParentValidations1105-1111 (7)外部/CLIrunConfiguredParentValidationBatch
親検証・契約refreshParentValidationsForReporterResume1113-1159 (47)runPreparedTask, resumeRegisterIntegration, resumeSingleRegisterItemWorktreerunConfiguredParentValidationBatch
親検証・契約appendParentValidationsToExecutorEvidence1164-1190 (27)runPreparedTask, runInPlaceMode, runAgentPipelinerunConfiguredParentValidationBatch
準備・選択executorRequirements1192-1200 (9)prepareSingleTask, resolveInPlaceCommand-
準備・選択reporterRequirements1202-1210 (9)resolveReporterAgentCandidates, prepareSingleTask-
準備・選択resolveReporterAgentCandidates1212-1266 (55)prepareSingleTask, runInPlaceModereporterRequirements, resolveAgentOverride, selectCandidates
準備・選択loadRosterForExecutionPath1268-1284 (17)runBatchMode, runManualMode, runInPlaceMode-
agent 起動executeAgent1286-1353 (68)runWithRetryisRateLimitError
agent 起動reportProtectionHandoffRecord1366-1372 (7)runWithRetry, spawnAgentInPlace-
agent 起動rateLimitPrefix1377-1379 (3)runWithRetry-
agent 起動runWithRetry1381-1561 (181)runPreparedTask, runInPlaceMode, runReporterStageexecuteAgent, rateLimitPrefix, reportProtectionHandoffRecord, delay
worktreepathInsideWorktree1563-1569 (7)agentEnvironment, runPreparedTask, registerPathsInsideWorktree-
worktreereportProductWorktrees1571-1578 (8)prepareSingleTask, runSingleRegisterItemWorktree-
agent 起動agentEnvironment1583-1596 (14)runPreparedTask, runReporterStage, runAgentPipelinepathInsideWorktree
Schedule 準備findClaimEventPath1598-1603 (6)prepareSingleTask, prepareScheduleIntegrationResume-
Schedule 準備gradeBeforeReviewPlan1608-1641 (34)prepareSingleTask, runInPlaceMode-
Schedule 準備prepareSingleTask1643-1978 (336)runBatchMode, runManualMode, runResumeModeagent 選択、plan/result、claim、worktree 準備
統合downgradeUnfilledResult1986-2001 (16)runPreparedTask, finalizeRegisterWorktreeRun-
Schedule 準備checkCompletionBeforeIntegration2003-2010 (8)readCompletionPreflight-
Schedule 準備readCompletionPreflight2012-2029 (18)runPreparedTaskcheckCompletionBeforeIntegration
Schedule 実行・統合runPreparedTask2031-2702 (672)runPreparedTaskSafely, runManualMode, runResumeModeagent、親検証、reporter、統合、状態遷移
Schedule 実行runPreparedTaskSafely2709-2748 (40)runBatchModerunPreparedTask, spawnBlock
状態 CLIspawnSelf2750-2754 (5)各 spawn* helper-
状態 CLIspawnValidate2756-2760 (5)registerRunCommand, runCycleModespawnSelf
状態 CLIspawnRefresh2762-2766 (5)runBatchMode, registerRunCommand, runCycleModespawnSelf
状態 CLIspawnScheduleBuild2768-2772 (5)rebuildStaleGeneratedTracksForCyclespawnSelf
状態 CLIspawnIndexBuild2777-2779 (3)runBatchMode, runCycleModespawnSelf
状態 CLIspawnClaim2781-2795 (15)prepareSingleTask, runInPlaceModespawnSelf
状態 CLIspawnComplete2797-2801 (5)runPreparedTask, runInPlaceModespawnSelf
状態 CLIspawnRelease2805-2824 (20)prepareSingleTaskspawnSelf
状態遷移extractBlockReason2832-2846 (15)Schedule / in-place / Register pipeline-
状態遷移pipelineRecoveryMeta2848-2860 (13)runPreparedTask, runInPlaceMode-
状態 CLIspawnBlock2862-2873 (12)Schedule の実行・安全 wrapperspawnSelf
Schedule orchestrationrunBatchMode2875-3095 (221)registerRunCommand, runCycleMode準備、worker pool、実行、refresh
Schedule 準備resolveClaimingActor3100-3111 (12)runManualMode, runResumeMode-
Schedule orchestrationrunManualMode3113-3272 (160)registerRunCommand準備、claim actor 解決、実行
in-place 準備resolveInPlaceCommand3278-3330 (53)runInPlaceMode, runJobModepinnedExecutor, selectCandidates, executorRequirements
in-place 準備resolveInPlaceAgentPipeline3344-3379 (36)runInPlaceMode-
agent 起動spawnAgentInPlace3381-3440 (60)runInPlaceMode, runJobMode, runSingleRegisterItemreportProtectionHandoffRecord
in-place 実行runInPlaceMode3444-3918 (475)registerRunCommandplan/result、executor、親検証、reporter、完了
Job 実行runCommandJobMode3920-4143 (224)runJobModecommand evidence、任意 reporter、Job 完了
Job 実行runJobMode4145-4310 (166)registerRunCommandJob materialize、command / agent 分岐
Register 選択resolveRegisterCommand4316-4376 (61)Register の 3 実行経路selectCandidates
Register 選択isRegisterPipelineRequested4381-4385 (5)Register の 3 実行経路-
Register 選択parseRegisterExecutorSelection4396-4438 (43)runRegisterMode-
Register 選択selectedRegisterExecutor4440-4446 (7)runRegisterMode-
Register 選択resolveRegisterPipelineCommand4451-4504 (54)Job / Register の pipeline 経路resolveAgentOverride
reporterrunReporterStage4509-4637 (129)Job、runAgentPipeline、reporter 再開agentEnvironment, runWithRetry
pipelinerunAgentPipeline4645-4835 (191)Job、Register 初回、executor 再開executor、evidence、親検証、runReporterStage
Register 記帳spawnRegisterTransition4839-4847 (9)Register 実行・再開・派生 view 更新spawnSelf
Register 記帳commitRegisterItemChanges4868-4889 (22)runSingleRegisterItemcommitSubject
pathrepoRelativePath4891-4893 (3)Schedule / Register の記帳と統合-
統合commitSubject4899-4904 (6)Schedule / Register の commit-
Register 記帳registerEventPathForTicket4906-4915 (10)Register 管理 path helper-
Register 記帳registerRunnerManagedPaths4917-4943 (27)Register 初回 / 再開registerEventPathForTicket, repoRelativePath
Register 記帳registerReporterManagedPaths4945-4951 (7)Register pipeline 初回 / 再開-
Register in-placerunSingleRegisterItem4957-5164 (208)runRegisterModeplan/result、transition、agent / pipeline、commit
Register 記帳registerStatePaths5169-5190 (22)commitRegisterStaterepoRelativePath, registerEventPathForTicket
Register 記帳commitRegisterState5194-5214 (21)wait / 成功統合registerStatePaths, repoRelativePath
worktreeregisterPathsInsideWorktree5216-5228 (13)finalizeRegisterWorktreeRunpathInsideWorktree
Register 記帳copyRepoPaths5232-5249 (18)wait / 再開repoRelativePath
Register 記帳registerFailureArtifactPaths5254-5258 (5)registerWaitSummaryrepoRelativePath
Register 記帳restorePreservedRegisterTicket5268-5302 (35)syncExecBranchAfterWaitrepoRelativePath
Register 記帳registerTransitionPaths5307-5317 (11)resumeSingleRegisterItemWorktreeregisterEventPathForTicket
Register 記帳registerBookkeepingPaths5322-5338 (17)resumeSingleRegisterItemWorktreeregisterRunnerManagedPaths
Register 記帳rebuildRootRegisterViews5343-5347 (5)Register finalize / 再開spawnRegisterTransition
Register 記帳registerWaitSummary5353-5423 (71)Register finalize / setup 失敗copy、wait transition、commit、branch 同期
Register 記帳commitRegisterWaitState5429-5462 (34)registerWaitSummaryisRegisterResultPath, commitRegisterState
Register 記帳isRegisterResultPath5464-5466 (3)commitRegisterWaitStaterepoRelativePath
worktreesyncExecBranchAfterWait5476-5543 (68)registerWaitSummarycopy、ticket 復元、commit
統合recordIntegrateStage5548-5564 (17)Schedule / Register 統合-
統合recordRepoIntegration5569-5585 (17)Schedule / Register 統合-
統合integrateLogPath5587-5589 (3)Schedule / Register 統合-
Register 統合finalizeRegisterWorktreeRun5596-5922 (327)初回、reporter 再開、integrate 再開result、commit、merge、review / waiting、cleanup
Register worktreerunSingleRegisterItemWorktree5928-6145 (218)runRegisterModesetup、agent / pipeline、finalizeRegisterWorktreeRun
再開準備protectResumableRegisterWorktree6150-6178 (29)runSingleRegisterItemWorktree-
再開準備resolveRegisterResumeReporter6182-6215 (34)resumeSingleRegisterItemWorktreeresolveAgentOverride
再開準備resolveRegisterResumeExecutor6219-6252 (34)resumeSingleRegisterItemWorktreeresolveAgentOverride
Register 再開resumeRegisterIntegration6258-6338 (81)resumeSingleRegisterItemWorktree親検証 refresh、finalizeRegisterWorktreeRun
Register 再開resumeSingleRegisterItemWorktree6347-6663 (317)runRegisterModecheckpoint 復元、同期、段分岐、共通 stage / finalize
Register orchestrationrunRegisterMode6670-6896 (227)registerRunCommand選択、並列 worker、初回 / 再開分岐
CLIregisterRunCommand6898-7252 (355)外部/CLIoption 定義、lock、Job / Register / Schedule 分岐
CLIformatExecSlotsReport7256-7293 (38)registerSlotsCommand-
CLIregisterSlotsCommand7295-7320 (26)外部/CLIslot 収集・表示
cyclerebuildStaleGeneratedTracksForCycle7335-7368 (34)runBatchMode, runCycleModespawnScheduleBuild
cyclerunCycleMode7391-7501 (111)registerCycleCommandresume、index、build、validate、refresh、auto
CLIregisterCycleCommand7503-7555 (53)外部/CLIlock、runCycleMode
Schedule 再開prepareScheduleIntegrationResume7560-7630 (71)runResumeModecheckpoint と claim 復元
Schedule 再開runResumeMode7637-7888 (252)cycle、registerResumeCommanddeferred / pipeline 段判定、prepare、実行
CLIregisterResumeCommand7890-7948 (59)外部/CLIlock、runResumeMode

4.4. 依存方向と循環依存のリスク ​

目標とする依存方向は CLI -> domain orchestration -> pipeline stage -> adapter / state store とし、型と純粋な遷移規則だけを下位の contract module に置く。

境界候補移す主な責務依存先循環を避ける条件
exec-run-options.tsoption parse、agent / phase 選択、実行設定解決exec-agent-config.ts、exec-strategy.ts、specdojo-config.tsexec-run.ts の orchestration を import しない
exec-agent-runner.tsexecuteAgent、retry、rate limit、保護機構、agent 環境agent config / protection modulesSchedule / Register の型を受けず、cwd、候補、prompt、環境だけを入力にする
exec-pipeline-runner.tsexecutor、親検証、reporter、evidence、stage checkpointexec-agent-runner.ts、exec-evidence.ts、exec-parent-validation.ts、exec-reporter.ts、exec-pipeline-state.tsRegister 再開から直接 orchestration を呼ばず、共通の runStage API に依存する
exec-schedule-runner.tsSchedule prepare、claim / block / complete、統合pipeline runner、worktree / repo integrationCLI 登録を import しない。状態変更は callback または小さな port にする
exec-register-runner.tsRegister 初回、記帳、wait / review、worktree 統合pipeline runner、register modules、worktree / repo integrationexec-register-resume.ts と相互 import しない。resume selector は純粋に target を返す
exec-run-state-machine.ts次段の純粋判定、許可遷移、checkpoint の正規化contract 型のみSchedule / Register の副作用 module を import しない
exec-run-command.tsCommander option と各 orchestrator の呼び分けSchedule / Register / Job runner実装 module から CLI module へ逆 import しない

特に循環が生じやすい箇所は次の 4 点である。

  1. exec-register-resume.ts は現在 exec-pipeline-state.ts だけに依存する純粋な選択・復元側である。ここへ runAgentPipeline を移すと Register orchestration との相互依存になるため、実行は共通 pipeline runner 側に置く。
  2. finalizeRegisterWorktreeRun は Register transition と汎用 repository 統合の両方を呼ぶ。汎用 integration module が Register module を import すると逆向きになるため、beforeProjectMerge など既存 callback 境界を維持する。
  3. PreparedTask、RegisterRunContext、AgentRunCandidate などが exec-run.ts 内部型のままだと、切り出し先が façade を import して循環する。共有 contract へ先に移す。
  4. 既存テストは exec-run.ts から複数 helper を import している。呼出元を一度に変更せず、exec-run.ts から再 export する façade を移行期間中に残す。

4.5. 初回と再開、および実行形態間の重複 ​

重複する処理初回側再開側 / 他経路現状と切り出し方
pipeline state 作成・executor の running / 完了記録runPreparedTask 2158-2293、runAgentPipeline 4682-4808runInPlaceMode 3663-3748、executor 再開は runAgentPipeline 6561-6579state 作成、executor 実行、evidence 記録を stage runner へ統合する
reporter の開始、形式 retry、result 描画、状態記録runPreparedTask 2295-2418、runInPlaceMode 3750-3840runReporterStage 4509-4637、reporter 再開 6627-6643runReporterStage を共通実装にし、Schedule / in-place も呼ぶ
親検証の初回追記と再開時 refresh初回は 2287-2293、4802-4808Schedule reporter 再開 2134-2140、Register integrate 再開 6302-6311、reporter 再開 6617-6624ensureParentValidations(stage, force) の 1 API にする
Register の item / worktree / plan / result / bookkeeping 準備初回 runSingleRegisterItemWorktree 5934-6074再開 resumeSingleRegisterItemWorktree 6353-6533RegisterRunSession を復元または新規作成する prepare 関数へまとめる
Register の start と root view 再構築初回 6017-6041再開 6424-6453transition port として共通化し、理由だけを入力にする
Register の実行後 finalize 呼び出し初回 6126-6144integrate 6317-6337、executor 6581-6597、reporter 6645-6662呼び出し引数を outcome object にまとめ、1 つの終了経路にする。中核処理自体は既に共通化済み
Schedule と Register の commit / merge / cleanupSchedule runPreparedTask 2421-2701Register finalizeRegisterWorktreeRun 5596-5922状態遷移はドメイン別のまま、repository integration の共通 port だけを共有する

Schedule 再開は runResumeMode で PreparedTask に pipelineResumeStage を埋め、初回と同じ runPreparedTask に合流している。Register 再開も executor は runAgentPipeline、全段の終了は finalizeRegisterWorktreeRun に合流する。この既存の合流点を維持し、合流前の「どこから始めるか」という分岐を純粋な遷移関数へ移すのが安全である。

4.6. 現在の状態遷移 ​

pipeline-state.json は executor と reporter を必須、integrate を任意で持つ。各段の共通 status は pending / running / succeeded / failed / rate_limited / blocked である。integrate の repository 別状態は pending / merged / unchanged / failed である。

現在位置event / 条件pipeline stateRegister item次の処理
新規pipeline 作成executor / reporter=pending、integrate=未作成start で in-progressexecutor
executor起動executor=running、attempt 加算in-progressagent 完了待ち
executor成功executor=succeeded、artifact_ref に evidencein-progress親検証、reporter
executor利用制限 / 保護 block / 失敗rate_limited / blocked / failedworktree 実行は waitingexecutor 再開または再実行判断
reporter起動reporter=runningin-progressreporter 完了待ち
reporter成功reporter=succeeded、result refin-progressintegrate
reporter利用制限 / 失敗rate_limited / failedwaitingreporter 再開
integratecommit / merge 開始integrate=running、repository=pendingin-progressrepository ごとの統合
integraterepository 成功 / 変更なしrepository=merged / unchangedin-progress次 repository または cleanup
integrate失敗integrate / repository=failedmerge 前は waiting、merge 済み cleanup 失敗は reviewintegrate 再開
integrate成功・cleanup 完了integrate=succeededreview人が確認して close

再開対象の選択は exec-register-resume.ts が担う。

  • executor が rate_limited / blocked、または evidence のない running なら executor から再開する。
  • executor が running でも有効な evidence があれば succeeded として復元し、reporter から再開する。
  • executor が succeeded で reporter が未成功なら reporter、両方 succeeded なら integrate から再開する。
  • --resume-from executor は reporter 段にいる場合だけ executor へ戻せる。integrate 段から executor へは戻さない。

初回と再開を同じ遷移にまとめる場合は、CLI の --resume 自体を別フローにせず、「checkpoint を新規作成するか読み込むか」だけを入口の差にする。

統一後の state成功時の次 state失敗時の保持実行する副作用
prepareexecutorprepare新規は plan/result/worktree 作成、再開は artifact 復元と統合先同期
executorparent_validationexecutoragent、evidence、attempt 記録
parent_validationreporter 有りなら reporter、無しなら integrateparent_validationallowlist 検証と evidence 追記
reporterintegratereporterreporter、result 描画
integratecleanupintegraterepository ごとの commit / merge、進捗 checkpoint
cleanupdonecleanupworktree / branch 撤去、派生 view 再構築
done--Schedule complete または Register review

遷移 API は nextStage(checkpoint, requestedResumeFrom?) を純粋関数とし、副作用側は runStage(stage, context) の outcome を checkpoint へ反映する。初回は空の checkpoint、再開は永続 checkpoint を同じ loop に渡す。最初の切り出しでは現行互換のため executor 再開時の新しい run_id 発行を維持し、同一 run_id の attempt に統合するかは別判断にする。

4.7. 選択肢と推奨案 ​

比較の詳細は PJR-Q761 exec-run.ts の分割方針を決める の「検討した選択肢」に記載した。

推奨は選択肢 C「段階的に切り出し、その後に明示的な状態遷移を導入」である。最初の切り出しは次の順にする。

  1. AgentRunCandidate など共有 contract と、option / agent 選択の純粋 helper を移す。exec-run.ts の既存 export は再 export で維持する。
  2. executeAgent / runWithRetry / 保護機構を exec-agent-runner.ts へ移す。
  3. runReporterStage と executor evidence / 親検証処理を exec-pipeline-runner.ts へ移し、Schedule と in-place の重複をその API へ寄せる。
  4. Register の setup / bookkeeping / finalize / resume と Schedule の prepare / finalize をドメイン別 module へ移す。
  5. 既存の checkpoint schema と再開挙動を維持したまま、初回と再開の開始段判定を純粋な状態遷移へ置き換える。
  6. 最後に Commander 登録だけを exec-run-command.ts へ移し、exec-run.ts は互換 façade とする。

振る舞いを変えていないことは、次で確認する。

  • 既存 unit: tests/src/exec-run*.test.ts、tests/src/exec-pipeline-state.test.ts、tests/src/exec-register-resume.test.ts。
  • 既存 integration: tests/src/exec-pipeline-e2e.integration.test.ts、tests/src/exec-register-pipeline-e2e.integration.test.ts、tests/src/exec-task-repos.integration.test.ts、tests/src/exec-register-worktree.integration.test.ts。
  • 既存 CLI / in-place: tests/src/exec-run-inplace.test.ts、tests/src/exec-run-lock-command.test.ts、tests/src/exec-cycle.integration.test.ts。
  • 追加する characterization test: 初回・executor / reporter / integrate 再開の開始段と遷移列、各段の失敗後 checkpoint、merge 済み cleanup 再開、親検証再実行、run_id と attempt の現行互換。
  • 追加する構造 test: 下位 module が exec-run.ts や CLI module を import しないこと、および既存の exec-run.ts export が維持されること。

残課題は、v0.3.0 公開後に PJR-Q761 で案を決定し、実装項目へ分割することである。本調査では決定、コード変更、schema 変更を行っていない。

5. 関連ドキュメント ​