Skip to content

Statutory mapping

Uganda's Data Protection and Privacy Act, 2019. One row per duty: the section, the mechanism, where it lives, and its state.

Read this page beside What is not yet true. Neither is complete without the other.

State is one of: built — implemented and covered by tests; partial — implemented with a stated gap; not built — no mechanism exists.

Lawful processing

Section Duty Mechanism Where State
s.7(1) Processing needs a lawful basis lawful_basis is mandatory on every record; the enum is the closed list of grounds packages/schema envelope; facts_lawful_basis_stated partial — the constraint is NOT VALID, so it binds new rows only
s.7(2) Consent must be specific A grant names grantee, purpose, record types and expiry; all five required src/consent built
s.7(3) Right to object Objection records, resolved and their effect stored at insert time src/consent, migration 0032 built
s.9 Special personal data special_data_consent required for financial records; kernel_financial_records_without_special_consent should be zero src/consent, /v1/metrics partial — s.9(3)(c) member-body reliance is with counsel

Notice and transparency

Section Duty Mechanism Where State
s.13(1)(i) Tell the subject the retention period Retention notice returned with collection-facing responses src/consent (J5) built
s.16(4) Tell recipients when a record is corrected Corrections queue a notification per prior disclosure; kernel_disclosure_notifications_outstanding counts them src/records, /v1/metrics partial — the obligation is tracked; no channel exists to discharge it

Data minimisation and accuracy

Section Duty Mechanism Where State
s.18(4) De-identify where the purpose no longer needs identity — — not built
s.20(2) Verify data recurrently Monthly verification procedure Runbook §6 partial — written procedure, never executed against real data

Security and incidents

Section Duty Mechanism Where State
s.23 Notify a breach Breach procedure with notification steps Runbook §1 partial — the procedure exists; contact rows are empty and it has never been rehearsed

Subject rights

Section Duty Mechanism Where State
s.24(1) Access to data held Subject-access route, keyed to the verified subject; no subject parameter src/consent built
s.24(1)(c) Name who it was disclosed to Every access-log entry returned, third parties named audit schema built
s.24(4) Withhold parts identifying another individual Field-level redaction — asserted_by withheld, the record still returned src/consent built
s.27 Automated decisions The kernel makes none: no scores, no ratings, no automated decision path; enforced by a naming invariant test test/invariants/naming.test.ts built, by not building

Registration and accountability

Section Duty Mechanism Where State
s.29 Register with the PDPO — — not done
s.36 Retain records of processing Append-only store; the audit log is a statutory record in its own right audit schema, ADR 0025 built
s.37 Produce records to the regulator on demand The audit log is queryable audit schema partial — no operator tooling to read it. A duty that requires a hand-written SQL query under time pressure is not discharged

What the mapping does not claim

  • Not a legal opinion. No counsel has reviewed this mapping.
  • Not evidence of compliance. No real personal data has ever been stored, so none of these mechanisms has been exercised against a live subject.
  • Not security assurance. There has been no penetration test, and the verified-subject header is a trust boundary the kernel cannot defend by itself — see The authorisation model.
  • Not tamper evidence. No Merkle root has been published. See Anchoring.

The relevant decisions are 0019, 0025, 0029, 0030, 0031, 0032 and 0035 — indexed under Decisions.