valid or invalidated — before a single new line of code gets written. This is PM’s answer to a real problem: the thing that got interrupted doesn’t get to just “remember” what was planned. It gets re-validated, the same discipline as saving and restoring context around a hardware interrupt.
Why it exists
A detour might ship changes that invalidate the design or task list of the paused epic. A bug fix might refactor the very interface your feature was building against. A shared-behavior change might make three of your queued tasks redundant — or contradictory. Resuming blindly means building on a stale plan. If the detour was substantial enough to push onto the stack (rather than handled as a minimal detour), it was substantial enough to potentially change what the paused epic needs to do. The gate catches this mechanically rather than relying on an agent to remember to check, or on a human to notice the drift before it compounds into a harder conflict later.How it works
1
Resume triggers the gate
/pm:resume pops the top detour stack frame and checks whether reconcileOnResume was true. If yes, reconcileNeeded: true is set on the paused epic and the gate fires before any code can be written.2
A fresh-context review is dispatched
A clean-context review is delegated via the Task tool with the paused epic id and the detour epic id. It runs with no prior conversation history — this is intentional, preventing any in-session assumptions from contaminating the review.
3
The review reads and diffs
The review reads the paused epic’s proposal (and
tasks.md for openspec-lane epics), then diffs what the detour actually shipped. It returns a structured response:VERDICT: validorVERDICT: invalidatedAMENDMENTS:— one amendment per line (stories to add, remove, or change). Empty if valid.
4
The verdict is written back durably
The verdict is recorded via:This attaches
{verdict, amendments, reconciledAt} to the paused epic’s may-invalidate link to the detour in .conductor/state.json (creating the link if it doesn’t already exist), and clears reconcileNeeded in one step. The judgment survives past this conversation instead of only ever living in the transcript.Verdicts and outcomes
valid
The detour’s changes don’t affect the paused epic’s design or task list. The review says so explicitly. State is updated and you can resume building. No amendments needed.
invalidated
The detour shipped changes that conflict with or supersede part of the paused proposal. You must update the OpenSpec proposal and
tasks.md (or the stories[] for a claude-code-lane epic) to reflect the amendments before writing new code.record-reconcile call is required — even for a valid verdict. It’s what actually clears reconcileNeeded and lifts the gate-guard block. Do not hand-clear reconcileNeeded directly in state.json.
The gate guard
The gate guard is aPreToolUse hook that mechanically blocks Edit, Write, and NotebookEdit while the active epic has reconcileNeeded: true. It is:
- On by default — no configuration required.
- Unconditional — it fires regardless of the repo’s
gateGuardsetting.set-gate-guard offno longer bypasses this specific check; that flag is reserved for any future generalization of the hook mechanism. - The only path past it — run the reconcile gate and call
record-reconcile. There is no override flag.
The reconcile gate applies to all lanes whenever a detour is popped with
reconcileOnResume: true. The OpenSpec two-gate review (Gate 1 / Gate 2) described below is a separate, additional mechanism specific to openspec-lane epics only.OpenSpec two-gate review
Foropenspec-lane epics, PM enforces two separate gate reviews across the epic’s lifecycle — independent of the detour reconcile gate:
Both gates are recorded with:
{verdict, reviewedAt, note?} onto epic.gateReview.gate1 or epic.gateReview.gate2 in state.json. Gate 2 is mechanically enforced: update-epic <id> --status archived rejects the transition for any openspec-lane epic that doesn’t already have a gateReview.gate2.verdict === "pass" recorded. Gate 1 is not itself required at archive time (it gates code, which already happened earlier), though recording it is good practice.
Non-openspec-lane epics (superpowers, claude-code, decision, external) are completely unaffected by the two-gate check. It never runs for them.
An autonomous epic still requires record-gate-review to be called after each real gate review — narration alone in the conversation transcript does not satisfy the archive-time check, and there is no bypass flag.