A project's rulesets can vary widely. Custom approval hooks can be useful to keep changes in check.
An approval hook contract must implement a function that tells the world if the state of a proposed ruleset is empty, upcoming, active, approvalExpected, approved, or failed, as defined in JBApprovalStatus.
If a queued ruleset fails to be approved by an approval hook, it will not be used. Instead, a copy of the current ruleset will be used as the next cycle.
An approval hook is a custom contract that adheres to the IJBRulesetApprovalHook interface, which can be attached to a project's rulesets to create restrictive conditions according to which proposed queued rulesets must follow in order to take effect.