A deletion request arrives and the first question is where the data is, which is not a question anybody can answer from memory.
customers:
personal: [name, email, phone, address_line_1]
action: anonymise
reason: order history must survive for accounting
order_events:
personal: [payload.customer_email]
action: redact-json-path
audit_log:
personal: [actor_email, ip_address]
action: retain
reason: legal basis is legitimate interest, 7 years
The reason field is what makes this defensible rather than merely a list — a decision to retain needs a stated basis, and writing it down when the table is created is much easier than reconstructing it under a deadline. A CI check that fails when a migration adds a column not covered by the inventory is the mechanism that keeps it current.