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. Then the loop: a correction or dirty refuter round no lesson cites, or a "not tested" no open record carries, blocks "done" and prints the exact add command. No gates file → the loop still runs. Fails open with a note when the payload is unreadable. Stop ──► gates · uncited lessons · untested admissions ──► 0 / red