PJR-ZPJZ 破棄された実行試行を表す result status superseded を追加する
1. 概要
exec-result の status は in_progress、complete、blocked の3値しかなく、再実行によって後続の実行に置き換えられた試行を表せない。PJR-DCTG では1回目の実行が checkpoint 失敗で成果を残さず終了し、2回目が成功したが、1回目の result は in_progress のまま残っている。実行中に見える in_progress も、解決すべきブロックに見える blocked も実態と合わない。SpecDojo は resume や force-restart など再実行を前提とした設計であり、破棄された試行は今後も発生する。schema へ superseded を追加し、誰がいつ設定するかを含めて運用を定める。
2. 完了条件
exec-result-frontmatter.schema.yamlのstatusにsupersededが追加され、意味が説明されている。supersededを設定する主体とタイミングが決まっている。同一タスクで新しい run を開始したとき、未完了のまま残る先行 result を runner が遷移させる案を軸に検討する。completeの result を後からsupersededへ落とさない。完了した実行の記録は書き換えない。- 既存の残置 result(
pjr-dctg-20260818T151438Z-ce4f-result.md)がsupersededへ移行されている。 - 一覧や状態集計(
exec statusなど)でsupersededが「実行中」や「対応が必要なブロック」として扱われない。 statusの意味の違いが rulebook またはガイドへ記載されている。in_progressは実行中、blockedは解決すべき停止、supersededは後続の実行に置き換えられた試行、と区別できる。- 上記を検証する unit test が追加され、
npm run test:unit、npm run validate:schema、npm run lint:fmが成功する。
3. 作業内容
| No | 作業 | 担当 | 状態 | メモ |
|---|---|---|---|---|
| 1 | superseded の意味と、他の値との境界を定義する | ARC | done | 対応不要な破棄済み試行として定義し、blocked と区別した |
| 2 | schema へ値を追加する | ARC | done | exec-result-frontmatter.schema.yaml の enum と説明を更新した |
| 3 | 設定主体とタイミングを決めて実装する | ARC | done | runner が一意名 result の scaffold 時に先行未完了 result を遷移させる |
| 4 | 状態集計や一覧での扱いを確認する | ARC | done | exec status は event log 由来のタスク状態を集計し、result status を集計しない |
| 5 | 既存の残置 result を移行する | ARC | done | PJR-DCTG の1回目(ce4f)を2回目の開始時刻で superseded に移行した |
| 6 | rulebook またはガイドへ status の区別を記載する | ARC | done | plan/resultライフサイクルガイドへ4値と遷移ルールを記載した |
| 7 | unit test を追加する | ARC | done | 未完了の自動遷移、complete の保持、固定名 result の非遷移を追加した |
4. 対応結果
exec-result-frontmatter.schema.yamlとExecResultMetaの status にsupersededを追加した。completed_atは試行が終端 status へ到達した時刻とし、supersededでは後続 run の開始時刻を記録する。- runner の result scaffold 処理で、同じ
task_idを持つ先行の一意名 result を検索し、in_progress/blockedだけをsupersededへ更新するようにした。complete/ 既にsupersededの result、固定名 result の再利用、同じ run のresumeは変更しない。 - register の in-place / worktree 実行では、遷移した先行 result も runner 管理対象へ含め、当該 run の checkpoint / commit から漏れないようにした。
- plan/resultライフサイクルガイド に4値の意味、設定主体・タイミング、
exec statusのタスク状態集計との分離を記載した。 pjr-dctg-20260818T151438Z-ce4f-result.mdをsupersededへ移行し、後続 run のstarted_at(2026-08-18T15:17:19.842Z)をcompleted_atに記録した。- unit test で先行
in_progress/blockedresult の自動遷移、block_reasonの除去、completeresult の保持、固定名 result を再利用する場合の非遷移を検証した。関連3 suite 62件、typecheck、ESLint、対象Markdown/frontmatter、catalog/index の検証は成功した。全1,257件を対象にしたnpm run test:unitはプロセスが終了せず中断し、npm run validate:schemaは sandbox の tsx IPC 制約で停止したが、同じvalidatorをnode --import tsxで実行して全対象の適合を確認した。npm run lint:fmは今回未変更の既存planにある未エスケープ<domain>1件で失敗し、変更対象ファイルのみの実行は成功した。
5. 関連ドキュメント
- 事象が確認された項目: PJR-DCTG data-flow等からDCT成果物インスタンスを判定するagentの実装(本対応の完了までクローズを保留する)
- 再実行を前提とした設計: PJR-6VFN exec run --register で executor 成功後に reporter だけを再開できるようにする
- 変更対象の schema:
docs/specdojo/schemas/v1/exec-result-frontmatter.schema.yaml - 変更対象の実装:
src/exec-results.tsの status 更新と result の scaffold 処理、src/exec-run.tsの register checkpoint / commit 対象