PreToolUse hook that intercepts every Edit, Write, and NotebookEdit call and blocks them while the active epic has reconcileNeeded: true. This is the one place PM tolerates mechanical blocking over pure instruction — protecting you from overwriting work before a detour is properly reconciled.
How it works
EveryEdit, Write, and NotebookEdit call is intercepted by the hook. Before allowing the tool call to proceed, PM checks whether the currently active epic has reconcileNeeded: true — meaning the epic popped out of a detour and still owes a reconcile gate.
- If
reconcileNeededistrue: the tool call is blocked with a message directing you to run the reconciler agent via/pm:resume. - If
reconcileNeededisfalseor absent: the tool call proceeds normally. Epics with no pending reconcile are completely unaffected.
Always on for reconcile-owed epics
This check is always active for any epic carryingreconcileNeeded: true — including epics that already had the flag set before this behavior was introduced. It previously required an explicit set-gate-guard on; real-usage feedback showed that opt-in was never actually turned on across several sessions where it would have caught a real skip, so the default was flipped.
There is no bypass for this case. Running set-gate-guard off does not silence the reconcile-owed block. The only path through it is completing the reconcile gate: run /pm:resume, let the reconciler agent complete the reconcile gate, and the block clears automatically. Once cleared, file writes proceed as normal.
The set-gate-guard command
The command still exists and toggles the repo-level gateGuard flag in state.json:
Checking gate guard status
Run/pm:gate-guard at any time to inspect the current state of the hook — whether gateGuard is on or off in state.json, and whether any epic currently carries reconcileNeeded: true. This is the fastest way to understand why a write was blocked without digging into state.json directly.
The gate guard hook is dormant until
/pm:init has been run in a project. It activates only in projects that have been initialized and have a .conductor/state.json present.