A data inventory is the first artefact, not the last

Every conversation about personal data stalls in the same place: nobody can say which tables hold it. The inventory is not documentation produced at the end, it is the thing everything else depends on.

table.column            category        basis        retention
-----------------------------------------------------------------
users.email             identifier      contract     account life
users.phone             identifier      consent      account life
orders.shipping_address contact         contract     7 years (tax)
audit_log.actor_email   identifier      legit. int.  90 days
jobs.payload            *derived*       varies       7 days
logs-*.request.body     *accidental*    none         30 days

The last two rows are why the exercise is worth doing: personal data in a queue payload and in a log index is data nobody chose to store and everybody has. Grepping the schema for likely column names finds the first eighty percent in an afternoon; the rest comes from reading what actually gets written. Keeping it in the repository next to the migrations means it is reviewed when a column is added rather than rediscovered annually.