The set -euo pipefail combined with grep returning non-zero on files without a :tangle header (like ROADMAP.org) caused the hook to abort silently, preventing commits. Added || true to the grep pipeline.