Consent
Gate 6. It governs whether a person may be contacted, and it is the one gate whose answer is not the company's to give.
A ledger, not a state table
Consent is recorded as an append-mostly ledger. Revocation sets a timestamp; it never deletes the record.
The reason is evidentiary. Consent may be withdrawn by any reasonable means and must be honoured, and a deleted record cannot prove you honoured a withdrawal you no longer have. Re-consenting is a new row, never the resurrection of an old one.
Resolved as of an instant
Asking whether consent exists is always asking about a moment in time. A consent captured later must not retroactively authorise an earlier send, or replaying history reaches a different answer than the original decision did.
The required basis is derived, never declared
Which basis an action requires is derived from the capability by
requiredBasisFor(). It is never declared by the thing proposing the action.
A proposer allowed to declare its own requirement declares none.
Bases
none, legitimate_interest, contract, express, express_written. They are not
a rank: which basis satisfies a requirement is a table, because the relationships are
not a single ordering.