hook: completion-gate.sh + gate-check.py
Part 3 · EACH TOOL · Slide 50 of 60
Event: Stop · 60 s. If gates/ACTIVE.md exists, runs every declared gate command; a red gate blocks "done" with the failing command shown. No gates file → inert. Fails open with a note when the payload is unreadable. This repo's own contract has three gates. Stop ──► gate-check ──► 0 green / red: "completion not earned"