Skip to content

Activities and legal bases

Groups of touchpoints that serve one purpose — the rows of the Art. 30 register — with their legal basis, retention and the data they derive from their touchpoints.

uv run model-wtf compliance activities list [--format json]
uv run model-wtf compliance activities explain <slug>
uv run model-wtf compliance activities create <slug> [--name] [--purpose] [--legal-basis] [--touchpoint unit:id]... [--subject]... [--recipient]... [--retention]
uv run model-wtf compliance activities add <slug> <unit:id>...
uv run model-wtf compliance data why <unit:id>... [--model unit:app.Model] [--manifests] [--format json]

compliance/activities/<slug>.yaml (repository root, activities span units) is the Art. 30 row: name, purpose, legal_basis (consent | contract | legal_obligation | vital_interests | public_task | legitimate_interests, or no_pii — a claim that the activity handles no personal item, verified at every check: no-pii-violated otherwise), data_subjects, touchpoints, recipients (party ids), controller/processor (default: app.yaml's); consent: {record: <ref>, granularity: separate|bundled} for consent-based ones (the stored proof, created with create: {consent_for: <slug>}), interest for legitimate interests (the balancing test), basis_note when two bases compete, dpia_reference when the derived trigger fires. Any of them may be !todo or !missing "why". Everything else is derived from the touchpoints: the data items, hence categories, stores, maximum sensitivity, DPIA trigger, units, recipients and the ops per item. Retention is not a field: the policy is the retention_purge op in the code.