|
| 1 | +--- |
| 2 | +name: audit-basicrum-privacy |
| 3 | +description: Audit Basicrum's privacy implementation and disclosures. Use for GDPR, ePrivacy, cookies, consent, telemetry data flows, collector roles, retention, transfers, privacy-policy text, plugin descriptions, or release privacy reviews. |
| 4 | +--- |
| 5 | + |
| 6 | +# Audit Basicrum Privacy |
| 7 | + |
| 8 | +## Purpose |
| 9 | + |
| 10 | +Perform an evidence-based privacy engineering and compliance-readiness review of |
| 11 | +the WordPress plugin, its bundled browser code, and its documented collector |
| 12 | +relationship. Do not certify the plugin or a site as "GDPR compliant" and do not |
| 13 | +replace advice from qualified counsel. |
| 14 | + |
| 15 | +## Establish Scope |
| 16 | + |
| 17 | +1. Identify the deployment model: hosted or self-hosted collector, applicable |
| 18 | + jurisdictions, target visitors, and enabled Basicrum features. |
| 19 | +2. Identify the likely roles of the site operator, Basicrum, hosting providers, |
| 20 | + and other recipients. Record unknown controller, processor, joint-controller, |
| 21 | + subprocessor, contract, transfer, retention, and lawful-basis questions as |
| 22 | + `NEEDS LEGAL DECISION`; do not guess. |
| 23 | +3. Review current official primary sources. At minimum, consult the WordPress |
| 24 | + Plugin Handbook privacy guidance, GDPR text, ePrivacy Article 5(3), and EDPB |
| 25 | + consent guidance. Record source links, jurisdiction, and access date. |
| 26 | +4. Treat ePrivacy storage or terminal-access rules separately from GDPR lawful |
| 27 | + basis. Do not assume that a GDPR lawful basis automatically permits cookies. |
| 28 | + |
| 29 | +## Trace the Real Data Flow |
| 30 | + |
| 31 | +Inspect code and runtime behavior rather than relying on documentation alone. |
| 32 | +Include `src/Assets.php`, `src/Admin/Privacy.php`, settings and validation code, |
| 33 | +both loader variants, bundled Boomerang code and plugins, consent adapters, |
| 34 | +uninstall behavior, PHP tests, browser tests, and an intercepted representative |
| 35 | +beacon. |
| 36 | + |
| 37 | +Create an inventory with one row per data element or storage operation: |
| 38 | + |
| 39 | +- source and trigger; |
| 40 | +- exact field, identifier, URL component, or cookie/storage key; |
| 41 | +- purpose and feature dependency; |
| 42 | +- recipient and onward recipient; |
| 43 | +- transmission security and access boundary; |
| 44 | +- retention and deletion path; |
| 45 | +- behavior before consent, after opt-in, after denial, and after withdrawal; |
| 46 | +- corresponding public disclosure and unresolved legal decision. |
| 47 | + |
| 48 | +Pay particular attention to full page and resource URLs, query strings, |
| 49 | +referrers, IP addresses observed by the collector, user agents, device and |
| 50 | +network attributes, performance and interaction timings, Brum Site ID, page |
| 51 | +type, cross-page identifiers, and accidental sensitive data in URLs. Minimize or |
| 52 | +remove collection that is not necessary for the documented purpose. |
| 53 | + |
| 54 | +## Audit Cookies and Consent |
| 55 | + |
| 56 | +1. Enumerate every cookie and browser-storage value read, created, refreshed, |
| 57 | + or removed by Basicrum or bundled code. Record name, host/domain, path, |
| 58 | + lifetime, Secure, SameSite, purpose, and proposed essential/non-essential |
| 59 | + classification. |
| 60 | +2. Verify that a new installation uses the privacy-protective loading default. |
| 61 | +3. In consent-controlled mode, verify that no monitoring request, identifier, |
| 62 | + or non-essential storage occurs before the external tool's authoritative |
| 63 | + opt-in callback. |
| 64 | +4. Verify opt-in is idempotent and cannot load duplicate instrumentation. |
| 65 | +5. Verify denial and withdrawal stop future collection and remove Basicrum |
| 66 | + cookies across the supported host and parent-domain cases. Clearly document |
| 67 | + any collection that cannot be undone without a page reload. |
| 68 | +6. Verify immediate mode is intentional, plainly warned, and never described as |
| 69 | + automatically lawful. |
| 70 | +7. Test granted, denied, unknown, and region-dependent consent states for each |
| 71 | + supported adapter, using both readable and minified production loaders. |
| 72 | + |
| 73 | +## Audit WordPress Integration and Disclosures |
| 74 | + |
| 75 | +Compare actual behavior with all public and administrator-facing statements: |
| 76 | + |
| 77 | +- the plugin header `Description`; |
| 78 | +- the `readme.txt` short and long descriptions and FAQ; |
| 79 | +- repository documentation and consent integration examples; |
| 80 | +- settings labels, warnings, and help text; |
| 81 | +- editable WordPress Privacy Policy Guide content registered through |
| 82 | + `wp_add_privacy_policy_content()`. |
| 83 | + |
| 84 | +Require an explicit privacy-first statement in the plugin header and WordPress |
| 85 | +readme, but reject blanket compliance claims. Disclose the actual data |
| 86 | +categories, purposes, recipients, cookies, consent modes, withdrawal limits, |
| 87 | +and site-operator responsibilities in language a webmaster can act on. |
| 88 | + |
| 89 | +Determine from evidence whether WordPress personal-data exporter and eraser |
| 90 | +callbacks apply. If the plugin stores no visitor personal data in WordPress, |
| 91 | +mark them `NOT APPLICABLE` with evidence and separately assess rights handling |
| 92 | +at the remote collector. Verify uninstall removes plugin settings without |
| 93 | +silently claiming that remote telemetry was erased. |
| 94 | + |
| 95 | +## Verify With Tests |
| 96 | + |
| 97 | +Add or run proportionate tests for every changed privacy boundary: |
| 98 | + |
| 99 | +- PHP tests for privacy-safe defaults, disabled/missing-setting runtime gates, |
| 100 | + settings validation, and Privacy Policy Guide content; |
| 101 | +- browser tests for pre-consent silence, one-time opt-in, denial, withdrawal, |
| 102 | + cookie cleanup, HTTP/HTTPS behavior, subdomains, and both loader variants; |
| 103 | +- runtime interception that records the actual request URL, headers, payload, |
| 104 | + cookies, and browser storage without contacting a production collector; |
| 105 | +- packaging checks that confirm the reviewed privacy text and production |
| 106 | + assets are present in the release ZIP. |
| 107 | + |
| 108 | +Run the narrow tests first, then the repository checks affected by the change. |
| 109 | +Never treat a passing automated test as legal approval. |
| 110 | + |
| 111 | +## Report the Audit |
| 112 | + |
| 113 | +Use only these statuses: |
| 114 | + |
| 115 | +- `PASS` - code, runtime evidence, tests, and disclosure agree. |
| 116 | +- `FAIL` - a concrete privacy, consent, cookie, security, or disclosure defect. |
| 117 | +- `NEEDS LEGAL DECISION` - the answer depends on jurisdiction, contracts, |
| 118 | + purpose, legal basis, retention, transfers, or operator configuration. |
| 119 | +- `NOT APPLICABLE` - supported by evidence, not assumption. |
| 120 | + |
| 121 | +For each item, report requirement or risk, status, code/runtime evidence, |
| 122 | +current official source, remediation, and owner. Separate plugin engineering |
| 123 | +work from collector/backend work and site-operator or counsel decisions. End |
| 124 | +with residual risks and the exact tests run. Never conclude with an unqualified |
| 125 | +claim of GDPR or cookie-law compliance. |
0 commit comments