pattern matching on known bad commands is a deny list with extra steps. the dangerous action is the one that looks normal.
the context policy was the big "aha" moment for me where the same command can trigger a different decision depending where you are on rm __pycache__ inside the project is fine, rm ~/.bashrc is not.
but.. nah won't catch an agent that does a set of actions that look normal and you approve - stateless hooks have limits, but for most stuff that's structurally classifiable, I find that it works very well without being intrusive to my flow.