They should be grouped/tagged by: * whether they apply to a block or a transaction * how much state they require * static * self-contained, such as checking a block body size matches the value in the header * parameterized * checks against current protocol parameters * stateful * checks against ledger state, such as spent UTxOs