all hooks are idempotent now