@wazir-dev/cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +111 -0
- package/CHANGELOG.md +14 -0
- package/CONTRIBUTING.md +101 -0
- package/LICENSE +21 -0
- package/README.md +314 -0
- package/assets/composition-engine.mmd +34 -0
- package/assets/demo-script.sh +17 -0
- package/assets/logo-dark.svg +14 -0
- package/assets/logo.svg +14 -0
- package/assets/pipeline.mmd +39 -0
- package/assets/record-demo.sh +51 -0
- package/docs/README.md +51 -0
- package/docs/adapters/context-mode.md +60 -0
- package/docs/concepts/architecture.md +87 -0
- package/docs/concepts/artifact-model.md +60 -0
- package/docs/concepts/composition-engine.md +36 -0
- package/docs/concepts/indexing-and-recall.md +160 -0
- package/docs/concepts/observability.md +41 -0
- package/docs/concepts/roles-and-workflows.md +59 -0
- package/docs/concepts/terminology-policy.md +27 -0
- package/docs/getting-started/01-installation.md +78 -0
- package/docs/getting-started/02-first-run.md +102 -0
- package/docs/getting-started/03-adding-to-project.md +15 -0
- package/docs/getting-started/04-host-setup.md +15 -0
- package/docs/guides/ci-integration.md +15 -0
- package/docs/guides/creating-skills.md +15 -0
- package/docs/guides/expertise-module-authoring.md +15 -0
- package/docs/guides/hook-development.md +15 -0
- package/docs/guides/memory-and-learnings.md +34 -0
- package/docs/guides/multi-host-export.md +15 -0
- package/docs/guides/troubleshooting.md +101 -0
- package/docs/guides/writing-custom-roles.md +15 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-design.md +592 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-plan.md +598 -0
- package/docs/plans/2026-03-15-docs-enforcement-plan.md +238 -0
- package/docs/readmes/INDEX.md +99 -0
- package/docs/readmes/features/expertise/README.md +171 -0
- package/docs/readmes/features/exports/README.md +222 -0
- package/docs/readmes/features/hooks/README.md +103 -0
- package/docs/readmes/features/hooks/loop-cap-guard.md +133 -0
- package/docs/readmes/features/hooks/post-tool-capture.md +121 -0
- package/docs/readmes/features/hooks/post-tool-lint.md +130 -0
- package/docs/readmes/features/hooks/pre-compact-summary.md +122 -0
- package/docs/readmes/features/hooks/pre-tool-capture-route.md +100 -0
- package/docs/readmes/features/hooks/protected-path-write-guard.md +128 -0
- package/docs/readmes/features/hooks/session-start.md +119 -0
- package/docs/readmes/features/hooks/stop-handoff-harvest.md +125 -0
- package/docs/readmes/features/roles/README.md +157 -0
- package/docs/readmes/features/roles/clarifier.md +152 -0
- package/docs/readmes/features/roles/content-author.md +190 -0
- package/docs/readmes/features/roles/designer.md +193 -0
- package/docs/readmes/features/roles/executor.md +184 -0
- package/docs/readmes/features/roles/learner.md +210 -0
- package/docs/readmes/features/roles/planner.md +182 -0
- package/docs/readmes/features/roles/researcher.md +164 -0
- package/docs/readmes/features/roles/reviewer.md +184 -0
- package/docs/readmes/features/roles/specifier.md +162 -0
- package/docs/readmes/features/roles/verifier.md +215 -0
- package/docs/readmes/features/schemas/README.md +178 -0
- package/docs/readmes/features/skills/README.md +63 -0
- package/docs/readmes/features/skills/brainstorming.md +96 -0
- package/docs/readmes/features/skills/debugging.md +148 -0
- package/docs/readmes/features/skills/design.md +120 -0
- package/docs/readmes/features/skills/prepare-next.md +109 -0
- package/docs/readmes/features/skills/run-audit.md +159 -0
- package/docs/readmes/features/skills/scan-project.md +109 -0
- package/docs/readmes/features/skills/self-audit.md +176 -0
- package/docs/readmes/features/skills/tdd.md +137 -0
- package/docs/readmes/features/skills/using-skills.md +92 -0
- package/docs/readmes/features/skills/verification.md +120 -0
- package/docs/readmes/features/skills/writing-plans.md +104 -0
- package/docs/readmes/features/tooling/README.md +320 -0
- package/docs/readmes/features/workflows/README.md +186 -0
- package/docs/readmes/features/workflows/author.md +181 -0
- package/docs/readmes/features/workflows/clarify.md +154 -0
- package/docs/readmes/features/workflows/design-review.md +171 -0
- package/docs/readmes/features/workflows/design.md +169 -0
- package/docs/readmes/features/workflows/discover.md +162 -0
- package/docs/readmes/features/workflows/execute.md +173 -0
- package/docs/readmes/features/workflows/learn.md +167 -0
- package/docs/readmes/features/workflows/plan-review.md +165 -0
- package/docs/readmes/features/workflows/plan.md +170 -0
- package/docs/readmes/features/workflows/prepare-next.md +167 -0
- package/docs/readmes/features/workflows/review.md +169 -0
- package/docs/readmes/features/workflows/run-audit.md +191 -0
- package/docs/readmes/features/workflows/spec-challenge.md +159 -0
- package/docs/readmes/features/workflows/specify.md +160 -0
- package/docs/readmes/features/workflows/verify.md +177 -0
- package/docs/readmes/packages/README.md +50 -0
- package/docs/readmes/packages/ajv.md +117 -0
- package/docs/readmes/packages/context-mode.md +118 -0
- package/docs/readmes/packages/gray-matter.md +116 -0
- package/docs/readmes/packages/node-test.md +137 -0
- package/docs/readmes/packages/yaml.md +112 -0
- package/docs/reference/configuration-reference.md +159 -0
- package/docs/reference/expertise-index.md +52 -0
- package/docs/reference/git-flow.md +43 -0
- package/docs/reference/hooks.md +87 -0
- package/docs/reference/host-exports.md +50 -0
- package/docs/reference/launch-checklist.md +172 -0
- package/docs/reference/marketplace-listings.md +76 -0
- package/docs/reference/release-process.md +34 -0
- package/docs/reference/roles-reference.md +77 -0
- package/docs/reference/skills.md +33 -0
- package/docs/reference/templates.md +29 -0
- package/docs/reference/tooling-cli.md +94 -0
- package/docs/truth-claims.yaml +222 -0
- package/expertise/PROGRESS.md +63 -0
- package/expertise/README.md +18 -0
- package/expertise/antipatterns/PROGRESS.md +56 -0
- package/expertise/antipatterns/backend/api-design-antipatterns.md +1271 -0
- package/expertise/antipatterns/backend/auth-antipatterns.md +1195 -0
- package/expertise/antipatterns/backend/caching-antipatterns.md +622 -0
- package/expertise/antipatterns/backend/database-antipatterns.md +1038 -0
- package/expertise/antipatterns/backend/index.md +24 -0
- package/expertise/antipatterns/backend/microservices-antipatterns.md +850 -0
- package/expertise/antipatterns/code/architecture-antipatterns.md +919 -0
- package/expertise/antipatterns/code/async-antipatterns.md +622 -0
- package/expertise/antipatterns/code/code-smells.md +1186 -0
- package/expertise/antipatterns/code/dependency-antipatterns.md +1209 -0
- package/expertise/antipatterns/code/error-handling-antipatterns.md +1360 -0
- package/expertise/antipatterns/code/index.md +27 -0
- package/expertise/antipatterns/code/naming-and-abstraction.md +1118 -0
- package/expertise/antipatterns/code/state-management-antipatterns.md +1076 -0
- package/expertise/antipatterns/code/testing-antipatterns.md +1053 -0
- package/expertise/antipatterns/design/accessibility-antipatterns.md +1136 -0
- package/expertise/antipatterns/design/dark-patterns.md +1121 -0
- package/expertise/antipatterns/design/index.md +22 -0
- package/expertise/antipatterns/design/ui-antipatterns.md +1202 -0
- package/expertise/antipatterns/design/ux-antipatterns.md +680 -0
- package/expertise/antipatterns/frontend/css-layout-antipatterns.md +691 -0
- package/expertise/antipatterns/frontend/flutter-antipatterns.md +1827 -0
- package/expertise/antipatterns/frontend/index.md +23 -0
- package/expertise/antipatterns/frontend/mobile-antipatterns.md +573 -0
- package/expertise/antipatterns/frontend/react-antipatterns.md +1128 -0
- package/expertise/antipatterns/frontend/spa-antipatterns.md +1235 -0
- package/expertise/antipatterns/index.md +31 -0
- package/expertise/antipatterns/performance/index.md +20 -0
- package/expertise/antipatterns/performance/performance-antipatterns.md +1013 -0
- package/expertise/antipatterns/performance/premature-optimization.md +623 -0
- package/expertise/antipatterns/performance/scaling-antipatterns.md +785 -0
- package/expertise/antipatterns/process/ai-coding-antipatterns.md +853 -0
- package/expertise/antipatterns/process/code-review-antipatterns.md +656 -0
- package/expertise/antipatterns/process/deployment-antipatterns.md +920 -0
- package/expertise/antipatterns/process/index.md +23 -0
- package/expertise/antipatterns/process/technical-debt-antipatterns.md +647 -0
- package/expertise/antipatterns/security/index.md +20 -0
- package/expertise/antipatterns/security/secrets-antipatterns.md +849 -0
- package/expertise/antipatterns/security/security-theater.md +843 -0
- package/expertise/antipatterns/security/vulnerability-patterns.md +801 -0
- package/expertise/architecture/PROGRESS.md +70 -0
- package/expertise/architecture/data/caching-architecture.md +671 -0
- package/expertise/architecture/data/data-consistency.md +574 -0
- package/expertise/architecture/data/data-modeling.md +536 -0
- package/expertise/architecture/data/event-streams-and-queues.md +634 -0
- package/expertise/architecture/data/index.md +25 -0
- package/expertise/architecture/data/search-architecture.md +663 -0
- package/expertise/architecture/data/sql-vs-nosql.md +708 -0
- package/expertise/architecture/decisions/architecture-decision-records.md +640 -0
- package/expertise/architecture/decisions/build-vs-buy.md +616 -0
- package/expertise/architecture/decisions/index.md +23 -0
- package/expertise/architecture/decisions/monolith-to-microservices.md +790 -0
- package/expertise/architecture/decisions/technology-selection.md +616 -0
- package/expertise/architecture/distributed/cap-theorem-and-tradeoffs.md +800 -0
- package/expertise/architecture/distributed/circuit-breaker-bulkhead.md +741 -0
- package/expertise/architecture/distributed/consensus-and-coordination.md +796 -0
- package/expertise/architecture/distributed/distributed-systems-fundamentals.md +564 -0
- package/expertise/architecture/distributed/idempotency-and-retry.md +796 -0
- package/expertise/architecture/distributed/index.md +25 -0
- package/expertise/architecture/distributed/saga-pattern.md +797 -0
- package/expertise/architecture/foundations/architectural-thinking.md +460 -0
- package/expertise/architecture/foundations/coupling-and-cohesion.md +770 -0
- package/expertise/architecture/foundations/design-principles-solid.md +649 -0
- package/expertise/architecture/foundations/domain-driven-design.md +719 -0
- package/expertise/architecture/foundations/index.md +25 -0
- package/expertise/architecture/foundations/separation-of-concerns.md +472 -0
- package/expertise/architecture/foundations/twelve-factor-app.md +797 -0
- package/expertise/architecture/index.md +34 -0
- package/expertise/architecture/integration/api-design-graphql.md +638 -0
- package/expertise/architecture/integration/api-design-grpc.md +804 -0
- package/expertise/architecture/integration/api-design-rest.md +892 -0
- package/expertise/architecture/integration/index.md +25 -0
- package/expertise/architecture/integration/third-party-integration.md +795 -0
- package/expertise/architecture/integration/webhooks-and-callbacks.md +1152 -0
- package/expertise/architecture/integration/websockets-realtime.md +791 -0
- package/expertise/architecture/mobile-architecture/index.md +22 -0
- package/expertise/architecture/mobile-architecture/mobile-app-architecture.md +780 -0
- package/expertise/architecture/mobile-architecture/mobile-backend-for-frontend.md +670 -0
- package/expertise/architecture/mobile-architecture/offline-first.md +719 -0
- package/expertise/architecture/mobile-architecture/push-and-sync.md +782 -0
- package/expertise/architecture/patterns/cqrs-event-sourcing.md +717 -0
- package/expertise/architecture/patterns/event-driven.md +797 -0
- package/expertise/architecture/patterns/hexagonal-clean-architecture.md +870 -0
- package/expertise/architecture/patterns/index.md +27 -0
- package/expertise/architecture/patterns/layered-architecture.md +736 -0
- package/expertise/architecture/patterns/microservices.md +753 -0
- package/expertise/architecture/patterns/modular-monolith.md +692 -0
- package/expertise/architecture/patterns/monolith.md +626 -0
- package/expertise/architecture/patterns/plugin-architecture.md +735 -0
- package/expertise/architecture/patterns/serverless.md +780 -0
- package/expertise/architecture/scaling/database-scaling.md +615 -0
- package/expertise/architecture/scaling/feature-flags-and-rollouts.md +757 -0
- package/expertise/architecture/scaling/horizontal-vs-vertical.md +606 -0
- package/expertise/architecture/scaling/index.md +24 -0
- package/expertise/architecture/scaling/multi-tenancy.md +800 -0
- package/expertise/architecture/scaling/stateless-design.md +787 -0
- package/expertise/backend/embedded-firmware.md +625 -0
- package/expertise/backend/go.md +853 -0
- package/expertise/backend/index.md +24 -0
- package/expertise/backend/java-spring.md +448 -0
- package/expertise/backend/node-typescript.md +625 -0
- package/expertise/backend/python-fastapi.md +724 -0
- package/expertise/backend/rust.md +458 -0
- package/expertise/backend/solidity.md +711 -0
- package/expertise/composition-map.yaml +443 -0
- package/expertise/content/foundations/content-modeling.md +395 -0
- package/expertise/content/foundations/editorial-standards.md +449 -0
- package/expertise/content/foundations/index.md +24 -0
- package/expertise/content/foundations/microcopy.md +455 -0
- package/expertise/content/foundations/terminology-governance.md +509 -0
- package/expertise/content/index.md +34 -0
- package/expertise/content/patterns/accessibility-copy.md +518 -0
- package/expertise/content/patterns/index.md +24 -0
- package/expertise/content/patterns/notification-content.md +433 -0
- package/expertise/content/patterns/sample-content.md +486 -0
- package/expertise/content/patterns/state-copy.md +439 -0
- package/expertise/design/PROGRESS.md +58 -0
- package/expertise/design/disciplines/dark-mode-theming.md +577 -0
- package/expertise/design/disciplines/design-systems.md +595 -0
- package/expertise/design/disciplines/index.md +25 -0
- package/expertise/design/disciplines/information-architecture.md +800 -0
- package/expertise/design/disciplines/interaction-design.md +788 -0
- package/expertise/design/disciplines/responsive-design.md +552 -0
- package/expertise/design/disciplines/usability-testing.md +516 -0
- package/expertise/design/disciplines/user-research.md +792 -0
- package/expertise/design/foundations/accessibility-design.md +796 -0
- package/expertise/design/foundations/color-theory.md +797 -0
- package/expertise/design/foundations/iconography.md +795 -0
- package/expertise/design/foundations/index.md +26 -0
- package/expertise/design/foundations/motion-and-animation.md +653 -0
- package/expertise/design/foundations/rtl-design.md +585 -0
- package/expertise/design/foundations/spacing-and-layout.md +607 -0
- package/expertise/design/foundations/typography.md +800 -0
- package/expertise/design/foundations/visual-hierarchy.md +761 -0
- package/expertise/design/index.md +32 -0
- package/expertise/design/patterns/authentication-flows.md +474 -0
- package/expertise/design/patterns/content-consumption.md +789 -0
- package/expertise/design/patterns/data-display.md +618 -0
- package/expertise/design/patterns/e-commerce.md +1494 -0
- package/expertise/design/patterns/feedback-and-states.md +642 -0
- package/expertise/design/patterns/forms-and-input.md +819 -0
- package/expertise/design/patterns/gamification.md +801 -0
- package/expertise/design/patterns/index.md +31 -0
- package/expertise/design/patterns/microinteractions.md +449 -0
- package/expertise/design/patterns/navigation.md +800 -0
- package/expertise/design/patterns/notifications.md +705 -0
- package/expertise/design/patterns/onboarding.md +700 -0
- package/expertise/design/patterns/search-and-filter.md +601 -0
- package/expertise/design/patterns/settings-and-preferences.md +768 -0
- package/expertise/design/patterns/social-and-community.md +748 -0
- package/expertise/design/platforms/desktop-native.md +612 -0
- package/expertise/design/platforms/index.md +25 -0
- package/expertise/design/platforms/mobile-android.md +825 -0
- package/expertise/design/platforms/mobile-cross-platform.md +983 -0
- package/expertise/design/platforms/mobile-ios.md +699 -0
- package/expertise/design/platforms/tablet.md +794 -0
- package/expertise/design/platforms/web-dashboard.md +790 -0
- package/expertise/design/platforms/web-responsive.md +550 -0
- package/expertise/design/psychology/behavioral-nudges.md +449 -0
- package/expertise/design/psychology/cognitive-load.md +1191 -0
- package/expertise/design/psychology/error-psychology.md +778 -0
- package/expertise/design/psychology/index.md +22 -0
- package/expertise/design/psychology/persuasive-design.md +736 -0
- package/expertise/design/psychology/user-mental-models.md +623 -0
- package/expertise/design/tooling/open-pencil.md +266 -0
- package/expertise/frontend/angular.md +1073 -0
- package/expertise/frontend/desktop-electron.md +546 -0
- package/expertise/frontend/flutter.md +782 -0
- package/expertise/frontend/index.md +27 -0
- package/expertise/frontend/native-android.md +409 -0
- package/expertise/frontend/native-ios.md +490 -0
- package/expertise/frontend/react-native.md +1160 -0
- package/expertise/frontend/react.md +808 -0
- package/expertise/frontend/vue.md +1089 -0
- package/expertise/humanize/domain-rules-code.md +79 -0
- package/expertise/humanize/domain-rules-content.md +67 -0
- package/expertise/humanize/domain-rules-technical-docs.md +56 -0
- package/expertise/humanize/index.md +35 -0
- package/expertise/humanize/self-audit-checklist.md +87 -0
- package/expertise/humanize/sentence-patterns.md +218 -0
- package/expertise/humanize/vocabulary-blacklist.md +105 -0
- package/expertise/i18n/PROGRESS.md +65 -0
- package/expertise/i18n/advanced/accessibility-and-i18n.md +28 -0
- package/expertise/i18n/advanced/bidirectional-text-algorithm.md +38 -0
- package/expertise/i18n/advanced/complex-scripts.md +30 -0
- package/expertise/i18n/advanced/performance-and-i18n.md +27 -0
- package/expertise/i18n/advanced/testing-i18n.md +28 -0
- package/expertise/i18n/content/content-adaptation.md +23 -0
- package/expertise/i18n/content/locale-specific-formatting.md +23 -0
- package/expertise/i18n/content/machine-translation-integration.md +28 -0
- package/expertise/i18n/content/translation-management.md +29 -0
- package/expertise/i18n/foundations/date-time-calendars.md +67 -0
- package/expertise/i18n/foundations/i18n-architecture.md +272 -0
- package/expertise/i18n/foundations/locale-and-language-tags.md +79 -0
- package/expertise/i18n/foundations/numbers-currency-units.md +61 -0
- package/expertise/i18n/foundations/pluralization-and-gender.md +109 -0
- package/expertise/i18n/foundations/string-externalization.md +236 -0
- package/expertise/i18n/foundations/text-direction-bidi.md +241 -0
- package/expertise/i18n/foundations/unicode-and-encoding.md +86 -0
- package/expertise/i18n/index.md +38 -0
- package/expertise/i18n/platform/backend-i18n.md +31 -0
- package/expertise/i18n/platform/flutter-i18n.md +148 -0
- package/expertise/i18n/platform/native-android-i18n.md +36 -0
- package/expertise/i18n/platform/native-ios-i18n.md +36 -0
- package/expertise/i18n/platform/react-i18n.md +103 -0
- package/expertise/i18n/platform/web-css-i18n.md +81 -0
- package/expertise/i18n/rtl/arabic-specific.md +175 -0
- package/expertise/i18n/rtl/hebrew-specific.md +149 -0
- package/expertise/i18n/rtl/rtl-animations-and-transitions.md +111 -0
- package/expertise/i18n/rtl/rtl-forms-and-input.md +161 -0
- package/expertise/i18n/rtl/rtl-fundamentals.md +211 -0
- package/expertise/i18n/rtl/rtl-icons-and-images.md +181 -0
- package/expertise/i18n/rtl/rtl-layout-mirroring.md +252 -0
- package/expertise/i18n/rtl/rtl-navigation-and-gestures.md +107 -0
- package/expertise/i18n/rtl/rtl-testing-and-qa.md +147 -0
- package/expertise/i18n/rtl/rtl-typography.md +160 -0
- package/expertise/index.md +113 -0
- package/expertise/index.yaml +216 -0
- package/expertise/infrastructure/cloud-aws.md +597 -0
- package/expertise/infrastructure/cloud-gcp.md +599 -0
- package/expertise/infrastructure/cybersecurity.md +816 -0
- package/expertise/infrastructure/database-mongodb.md +447 -0
- package/expertise/infrastructure/database-postgres.md +400 -0
- package/expertise/infrastructure/devops-cicd.md +787 -0
- package/expertise/infrastructure/index.md +27 -0
- package/expertise/performance/PROGRESS.md +50 -0
- package/expertise/performance/backend/api-latency.md +1204 -0
- package/expertise/performance/backend/background-jobs.md +506 -0
- package/expertise/performance/backend/connection-pooling.md +1209 -0
- package/expertise/performance/backend/database-query-optimization.md +515 -0
- package/expertise/performance/backend/index.md +23 -0
- package/expertise/performance/backend/rate-limiting-and-throttling.md +971 -0
- package/expertise/performance/foundations/algorithmic-complexity.md +954 -0
- package/expertise/performance/foundations/caching-strategies.md +489 -0
- package/expertise/performance/foundations/concurrency-and-parallelism.md +847 -0
- package/expertise/performance/foundations/index.md +24 -0
- package/expertise/performance/foundations/measuring-and-profiling.md +440 -0
- package/expertise/performance/foundations/memory-management.md +964 -0
- package/expertise/performance/foundations/performance-budgets.md +1314 -0
- package/expertise/performance/index.md +31 -0
- package/expertise/performance/infrastructure/auto-scaling.md +1059 -0
- package/expertise/performance/infrastructure/cdn-and-edge.md +1081 -0
- package/expertise/performance/infrastructure/index.md +22 -0
- package/expertise/performance/infrastructure/load-balancing.md +1081 -0
- package/expertise/performance/infrastructure/observability.md +1079 -0
- package/expertise/performance/mobile/index.md +23 -0
- package/expertise/performance/mobile/mobile-animations.md +544 -0
- package/expertise/performance/mobile/mobile-memory-battery.md +416 -0
- package/expertise/performance/mobile/mobile-network.md +452 -0
- package/expertise/performance/mobile/mobile-rendering.md +599 -0
- package/expertise/performance/mobile/mobile-startup-time.md +505 -0
- package/expertise/performance/platform-specific/flutter-performance.md +647 -0
- package/expertise/performance/platform-specific/index.md +22 -0
- package/expertise/performance/platform-specific/node-performance.md +1307 -0
- package/expertise/performance/platform-specific/postgres-performance.md +1366 -0
- package/expertise/performance/platform-specific/react-performance.md +1403 -0
- package/expertise/performance/web/bundle-optimization.md +1239 -0
- package/expertise/performance/web/image-and-media.md +636 -0
- package/expertise/performance/web/index.md +24 -0
- package/expertise/performance/web/network-optimization.md +1133 -0
- package/expertise/performance/web/rendering-performance.md +1098 -0
- package/expertise/performance/web/ssr-and-hydration.md +918 -0
- package/expertise/performance/web/web-vitals.md +1374 -0
- package/expertise/quality/accessibility.md +985 -0
- package/expertise/quality/evidence-based-verification.md +499 -0
- package/expertise/quality/index.md +24 -0
- package/expertise/quality/ml-model-audit.md +614 -0
- package/expertise/quality/performance.md +600 -0
- package/expertise/quality/testing-api.md +891 -0
- package/expertise/quality/testing-mobile.md +496 -0
- package/expertise/quality/testing-web.md +849 -0
- package/expertise/security/PROGRESS.md +54 -0
- package/expertise/security/agentic-identity.md +540 -0
- package/expertise/security/compliance-frameworks.md +601 -0
- package/expertise/security/data/data-encryption.md +364 -0
- package/expertise/security/data/data-privacy-gdpr.md +692 -0
- package/expertise/security/data/database-security.md +1171 -0
- package/expertise/security/data/index.md +22 -0
- package/expertise/security/data/pii-handling.md +531 -0
- package/expertise/security/foundations/authentication.md +1041 -0
- package/expertise/security/foundations/authorization.md +603 -0
- package/expertise/security/foundations/cryptography.md +1001 -0
- package/expertise/security/foundations/index.md +25 -0
- package/expertise/security/foundations/owasp-top-10.md +1354 -0
- package/expertise/security/foundations/secrets-management.md +1217 -0
- package/expertise/security/foundations/secure-sdlc.md +700 -0
- package/expertise/security/foundations/supply-chain-security.md +698 -0
- package/expertise/security/index.md +31 -0
- package/expertise/security/infrastructure/cloud-security-aws.md +1296 -0
- package/expertise/security/infrastructure/cloud-security-gcp.md +1376 -0
- package/expertise/security/infrastructure/container-security.md +721 -0
- package/expertise/security/infrastructure/incident-response.md +1295 -0
- package/expertise/security/infrastructure/index.md +24 -0
- package/expertise/security/infrastructure/logging-and-monitoring.md +1618 -0
- package/expertise/security/infrastructure/network-security.md +1337 -0
- package/expertise/security/mobile/index.md +23 -0
- package/expertise/security/mobile/mobile-android-security.md +1218 -0
- package/expertise/security/mobile/mobile-binary-protection.md +1229 -0
- package/expertise/security/mobile/mobile-data-storage.md +1265 -0
- package/expertise/security/mobile/mobile-ios-security.md +1401 -0
- package/expertise/security/mobile/mobile-network-security.md +1520 -0
- package/expertise/security/smart-contract-security.md +594 -0
- package/expertise/security/testing/index.md +22 -0
- package/expertise/security/testing/penetration-testing.md +1258 -0
- package/expertise/security/testing/security-code-review.md +1765 -0
- package/expertise/security/testing/threat-modeling.md +1074 -0
- package/expertise/security/testing/vulnerability-scanning.md +1062 -0
- package/expertise/security/web/api-security.md +586 -0
- package/expertise/security/web/cors-and-headers.md +433 -0
- package/expertise/security/web/csrf.md +562 -0
- package/expertise/security/web/file-upload.md +1477 -0
- package/expertise/security/web/index.md +25 -0
- package/expertise/security/web/injection.md +1375 -0
- package/expertise/security/web/session-management.md +1101 -0
- package/expertise/security/web/xss.md +1158 -0
- package/exports/README.md +17 -0
- package/exports/hosts/claude/.claude/agents/clarifier.md +42 -0
- package/exports/hosts/claude/.claude/agents/content-author.md +63 -0
- package/exports/hosts/claude/.claude/agents/designer.md +55 -0
- package/exports/hosts/claude/.claude/agents/executor.md +55 -0
- package/exports/hosts/claude/.claude/agents/learner.md +51 -0
- package/exports/hosts/claude/.claude/agents/planner.md +53 -0
- package/exports/hosts/claude/.claude/agents/researcher.md +43 -0
- package/exports/hosts/claude/.claude/agents/reviewer.md +54 -0
- package/exports/hosts/claude/.claude/agents/specifier.md +47 -0
- package/exports/hosts/claude/.claude/agents/verifier.md +71 -0
- package/exports/hosts/claude/.claude/commands/author.md +42 -0
- package/exports/hosts/claude/.claude/commands/clarify.md +38 -0
- package/exports/hosts/claude/.claude/commands/design-review.md +46 -0
- package/exports/hosts/claude/.claude/commands/design.md +44 -0
- package/exports/hosts/claude/.claude/commands/discover.md +37 -0
- package/exports/hosts/claude/.claude/commands/execute.md +48 -0
- package/exports/hosts/claude/.claude/commands/learn.md +38 -0
- package/exports/hosts/claude/.claude/commands/plan-review.md +42 -0
- package/exports/hosts/claude/.claude/commands/plan.md +39 -0
- package/exports/hosts/claude/.claude/commands/prepare-next.md +37 -0
- package/exports/hosts/claude/.claude/commands/review.md +40 -0
- package/exports/hosts/claude/.claude/commands/run-audit.md +41 -0
- package/exports/hosts/claude/.claude/commands/spec-challenge.md +41 -0
- package/exports/hosts/claude/.claude/commands/specify.md +38 -0
- package/exports/hosts/claude/.claude/commands/verify.md +37 -0
- package/exports/hosts/claude/.claude/settings.json +34 -0
- package/exports/hosts/claude/CLAUDE.md +19 -0
- package/exports/hosts/claude/export.manifest.json +38 -0
- package/exports/hosts/claude/host-package.json +67 -0
- package/exports/hosts/codex/AGENTS.md +19 -0
- package/exports/hosts/codex/export.manifest.json +38 -0
- package/exports/hosts/codex/host-package.json +41 -0
- package/exports/hosts/cursor/.cursor/hooks.json +16 -0
- package/exports/hosts/cursor/.cursor/rules/wazir-core.mdc +19 -0
- package/exports/hosts/cursor/export.manifest.json +38 -0
- package/exports/hosts/cursor/host-package.json +42 -0
- package/exports/hosts/gemini/GEMINI.md +19 -0
- package/exports/hosts/gemini/export.manifest.json +38 -0
- package/exports/hosts/gemini/host-package.json +41 -0
- package/hooks/README.md +18 -0
- package/hooks/definitions/loop_cap_guard.yaml +21 -0
- package/hooks/definitions/post_tool_capture.yaml +24 -0
- package/hooks/definitions/pre_compact_summary.yaml +19 -0
- package/hooks/definitions/pre_tool_capture_route.yaml +19 -0
- package/hooks/definitions/protected_path_write_guard.yaml +19 -0
- package/hooks/definitions/session_start.yaml +19 -0
- package/hooks/definitions/stop_handoff_harvest.yaml +20 -0
- package/hooks/loop-cap-guard +17 -0
- package/hooks/post-tool-lint +36 -0
- package/hooks/protected-path-write-guard +17 -0
- package/hooks/session-start +41 -0
- package/llms-full.txt +2355 -0
- package/llms.txt +43 -0
- package/package.json +79 -0
- package/roles/README.md +20 -0
- package/roles/clarifier.md +42 -0
- package/roles/content-author.md +63 -0
- package/roles/designer.md +55 -0
- package/roles/executor.md +55 -0
- package/roles/learner.md +51 -0
- package/roles/planner.md +53 -0
- package/roles/researcher.md +43 -0
- package/roles/reviewer.md +54 -0
- package/roles/specifier.md +47 -0
- package/roles/verifier.md +71 -0
- package/schemas/README.md +24 -0
- package/schemas/accepted-learning.schema.json +20 -0
- package/schemas/author-artifact.schema.json +156 -0
- package/schemas/clarification.schema.json +19 -0
- package/schemas/design-artifact.schema.json +80 -0
- package/schemas/docs-claim.schema.json +18 -0
- package/schemas/export-manifest.schema.json +20 -0
- package/schemas/hook.schema.json +67 -0
- package/schemas/host-export-package.schema.json +18 -0
- package/schemas/implementation-plan.schema.json +19 -0
- package/schemas/proposed-learning.schema.json +19 -0
- package/schemas/research.schema.json +18 -0
- package/schemas/review.schema.json +29 -0
- package/schemas/run-manifest.schema.json +18 -0
- package/schemas/spec-challenge.schema.json +18 -0
- package/schemas/spec.schema.json +20 -0
- package/schemas/usage.schema.json +102 -0
- package/schemas/verification-proof.schema.json +29 -0
- package/schemas/wazir-manifest.schema.json +173 -0
- package/skills/README.md +40 -0
- package/skills/brainstorming/SKILL.md +77 -0
- package/skills/debugging/SKILL.md +50 -0
- package/skills/design/SKILL.md +61 -0
- package/skills/dispatching-parallel-agents/SKILL.md +128 -0
- package/skills/executing-plans/SKILL.md +70 -0
- package/skills/finishing-a-development-branch/SKILL.md +169 -0
- package/skills/humanize/SKILL.md +123 -0
- package/skills/init-pipeline/SKILL.md +124 -0
- package/skills/prepare-next/SKILL.md +20 -0
- package/skills/receiving-code-review/SKILL.md +123 -0
- package/skills/requesting-code-review/SKILL.md +105 -0
- package/skills/requesting-code-review/code-reviewer.md +108 -0
- package/skills/run-audit/SKILL.md +197 -0
- package/skills/scan-project/SKILL.md +41 -0
- package/skills/self-audit/SKILL.md +153 -0
- package/skills/subagent-driven-development/SKILL.md +154 -0
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/skills/subagent-driven-development/implementer-prompt.md +102 -0
- package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/skills/tdd/SKILL.md +23 -0
- package/skills/using-git-worktrees/SKILL.md +163 -0
- package/skills/using-skills/SKILL.md +95 -0
- package/skills/verification/SKILL.md +22 -0
- package/skills/wazir/SKILL.md +463 -0
- package/skills/writing-plans/SKILL.md +30 -0
- package/skills/writing-skills/SKILL.md +157 -0
- package/skills/writing-skills/anthropic-best-practices.md +122 -0
- package/skills/writing-skills/persuasion-principles.md +50 -0
- package/templates/README.md +20 -0
- package/templates/artifacts/README.md +10 -0
- package/templates/artifacts/accepted-learning.md +19 -0
- package/templates/artifacts/accepted-learning.template.json +12 -0
- package/templates/artifacts/author.md +74 -0
- package/templates/artifacts/author.template.json +19 -0
- package/templates/artifacts/clarification.md +21 -0
- package/templates/artifacts/clarification.template.json +12 -0
- package/templates/artifacts/execute-notes.md +19 -0
- package/templates/artifacts/implementation-plan.md +21 -0
- package/templates/artifacts/implementation-plan.template.json +11 -0
- package/templates/artifacts/learning-proposal.md +19 -0
- package/templates/artifacts/next-run-handoff.md +21 -0
- package/templates/artifacts/plan-review.md +19 -0
- package/templates/artifacts/proposed-learning.template.json +12 -0
- package/templates/artifacts/research.md +21 -0
- package/templates/artifacts/research.template.json +12 -0
- package/templates/artifacts/review-findings.md +19 -0
- package/templates/artifacts/review.template.json +11 -0
- package/templates/artifacts/run-manifest.template.json +8 -0
- package/templates/artifacts/spec-challenge.md +19 -0
- package/templates/artifacts/spec-challenge.template.json +11 -0
- package/templates/artifacts/spec.md +21 -0
- package/templates/artifacts/spec.template.json +12 -0
- package/templates/artifacts/verification-proof.md +19 -0
- package/templates/artifacts/verification-proof.template.json +11 -0
- package/templates/examples/accepted-learning.example.json +14 -0
- package/templates/examples/author.example.json +152 -0
- package/templates/examples/clarification.example.json +15 -0
- package/templates/examples/docs-claim.example.json +8 -0
- package/templates/examples/export-manifest.example.json +7 -0
- package/templates/examples/host-export-package.example.json +11 -0
- package/templates/examples/implementation-plan.example.json +17 -0
- package/templates/examples/proposed-learning.example.json +13 -0
- package/templates/examples/research.example.json +15 -0
- package/templates/examples/research.example.md +6 -0
- package/templates/examples/review.example.json +17 -0
- package/templates/examples/run-manifest.example.json +9 -0
- package/templates/examples/spec-challenge.example.json +14 -0
- package/templates/examples/spec.example.json +21 -0
- package/templates/examples/verification-proof.example.json +21 -0
- package/templates/examples/wazir-manifest.example.yaml +65 -0
- package/templates/task-definition-schema.md +99 -0
- package/tooling/README.md +20 -0
- package/tooling/src/adapters/context-mode.js +50 -0
- package/tooling/src/capture/command.js +376 -0
- package/tooling/src/capture/store.js +99 -0
- package/tooling/src/capture/usage.js +270 -0
- package/tooling/src/checks/branches.js +50 -0
- package/tooling/src/checks/brand-truth.js +110 -0
- package/tooling/src/checks/changelog.js +231 -0
- package/tooling/src/checks/command-registry.js +36 -0
- package/tooling/src/checks/commits.js +102 -0
- package/tooling/src/checks/docs-drift.js +103 -0
- package/tooling/src/checks/docs-truth.js +201 -0
- package/tooling/src/checks/runtime-surface.js +156 -0
- package/tooling/src/cli.js +116 -0
- package/tooling/src/command-options.js +56 -0
- package/tooling/src/commands/validate.js +320 -0
- package/tooling/src/doctor/command.js +91 -0
- package/tooling/src/export/command.js +77 -0
- package/tooling/src/export/compiler.js +498 -0
- package/tooling/src/guards/loop-cap-guard.js +52 -0
- package/tooling/src/guards/protected-path-write-guard.js +67 -0
- package/tooling/src/index/command.js +152 -0
- package/tooling/src/index/storage.js +1061 -0
- package/tooling/src/index/summarizers.js +261 -0
- package/tooling/src/loaders.js +18 -0
- package/tooling/src/project-root.js +22 -0
- package/tooling/src/recall/command.js +225 -0
- package/tooling/src/schema-validator.js +30 -0
- package/tooling/src/state-root.js +40 -0
- package/tooling/src/status/command.js +71 -0
- package/wazir.manifest.yaml +135 -0
- package/workflows/README.md +19 -0
- package/workflows/author.md +42 -0
- package/workflows/clarify.md +38 -0
- package/workflows/design-review.md +46 -0
- package/workflows/design.md +44 -0
- package/workflows/discover.md +37 -0
- package/workflows/execute.md +48 -0
- package/workflows/learn.md +38 -0
- package/workflows/plan-review.md +42 -0
- package/workflows/plan.md +39 -0
- package/workflows/prepare-next.md +37 -0
- package/workflows/review.md +40 -0
- package/workflows/run-audit.md +41 -0
- package/workflows/spec-challenge.md +41 -0
- package/workflows/specify.md +38 -0
- package/workflows/verify.md +37 -0
|
@@ -0,0 +1,692 @@
|
|
|
1
|
+
# Data Privacy & GDPR Compliance
|
|
2
|
+
|
|
3
|
+
> Security expertise module for AI agents building privacy-by-design applications.
|
|
4
|
+
> Covers GDPR, CCPA/CPRA, LGPD, PIPEDA, ePrivacy Directive, and implementation patterns.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. Threat Landscape
|
|
9
|
+
|
|
10
|
+
### 1.1 Enforcement Trends (2023-2025)
|
|
11
|
+
|
|
12
|
+
As of March 2025, over 2,245 GDPR fines totaling ~EUR 5.65 billion have been recorded,
|
|
13
|
+
with >60% (EUR 3.8B+) imposed since January 2023 alone.
|
|
14
|
+
|
|
15
|
+
**Largest GDPR fines:**
|
|
16
|
+
|
|
17
|
+
| Year | Entity | Fine (EUR) | Reason |
|
|
18
|
+
|------|----------------------|---------------|------------------------------------------------------|
|
|
19
|
+
| 2023 | Meta (Facebook) | 1,200,000,000 | Transferring EU user data to US without safeguards |
|
|
20
|
+
| 2021 | Amazon Europe | 746,000,000 | Behavioral advertising without valid consent |
|
|
21
|
+
| 2022 | Instagram (Meta) | 405,000,000 | Children's data exposure |
|
|
22
|
+
| 2023 | TikTok | 345,000,000 | Children's data processing violations |
|
|
23
|
+
| 2025 | Google (Gmail) | 325,000,000 | Unsolicited advertising to Gmail users (CNIL) |
|
|
24
|
+
| 2024 | LinkedIn (Microsoft) | 310,000,000 | Unlawful processing for behavioral analysis |
|
|
25
|
+
| 2024 | Uber | 290,000,000 | Transferring driver data EU-US without safeguards |
|
|
26
|
+
| 2024 | Meta (breach) | 251,000,000 | 2018 data breach affecting 29M users |
|
|
27
|
+
| 2024 | Clearview AI | 30,500,000 | Illegal facial recognition from scraped images |
|
|
28
|
+
|
|
29
|
+
### 1.2 CCPA/CPRA Enforcement
|
|
30
|
+
|
|
31
|
+
- 2025: CPPA increased fine amounts; cybersecurity audit and ADMT regulations adopted.
|
|
32
|
+
- Sept 2025: Tractor Supply fined USD 1.35M for CCPA violations.
|
|
33
|
+
- Businesses >USD 100M revenue must submit cybersecurity audit certs by April 2028.
|
|
34
|
+
|
|
35
|
+
### 1.3 Class Actions & Collective Redress
|
|
36
|
+
|
|
37
|
+
- Dec 2024: NOYB approved as "qualified entity" in Austria/Ireland for representative actions.
|
|
38
|
+
- Planned 2025 class actions: tracking without consent, dark patterns, data sales without basis.
|
|
39
|
+
- NOYB threatened Meta with class action over AI training on EU user data without opt-in.
|
|
40
|
+
|
|
41
|
+
### 1.4 Regulatory Scrutiny Areas
|
|
42
|
+
|
|
43
|
+
- **AI training on personal data** — explicit consent or legitimate interest with opt-out required.
|
|
44
|
+
- **Cross-border transfers** — EU-US DPF survived Sept 2025 challenge but NOYB appeal pending.
|
|
45
|
+
- **Children's data** — TikTok EUR 345M, Instagram EUR 405M.
|
|
46
|
+
- **Dark patterns** — Google EUR 150M, Meta EUR 60M for manipulative consent UX.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 2. Core Security Principles
|
|
51
|
+
|
|
52
|
+
### 2.1 Privacy by Design (7 Foundational Principles — GDPR Article 25)
|
|
53
|
+
|
|
54
|
+
1. **Proactive not Reactive** — Prevent privacy violations before they occur.
|
|
55
|
+
2. **Privacy as the Default** — Maximum privacy without user action required.
|
|
56
|
+
3. **Privacy Embedded into Design** — Integral to architecture, not a bolt-on.
|
|
57
|
+
4. **Full Functionality** — Avoid false trade-offs between privacy and features.
|
|
58
|
+
5. **End-to-End Security** — Full lifecycle protection, collection to deletion.
|
|
59
|
+
6. **Visibility and Transparency** — All operations verifiable and auditable.
|
|
60
|
+
7. **Respect for User Privacy** — User-centric design; individual interests paramount.
|
|
61
|
+
|
|
62
|
+
### 2.2 Privacy Design Strategies
|
|
63
|
+
|
|
64
|
+
- **Data-oriented:** MINIMISE, HIDE (encrypt/hash), SEPARATE (isolated contexts), ABSTRACT (aggregate).
|
|
65
|
+
- **Process-oriented:** INFORM (notify), CONTROL (user agency), ENFORCE (technical policy), DEMONSTRATE (prove compliance).
|
|
66
|
+
|
|
67
|
+
### 2.3 Lawful Basis for Processing (Article 6)
|
|
68
|
+
|
|
69
|
+
Six bases — identify and document one BEFORE processing:
|
|
70
|
+
1. **Consent** — Freely given, specific, informed, unambiguous affirmative action.
|
|
71
|
+
2. **Contract** — Necessary for contract with data subject.
|
|
72
|
+
3. **Legal obligation** — Required by law.
|
|
73
|
+
4. **Vital interests** — Protecting someone's life.
|
|
74
|
+
5. **Public task** — Task in the public interest.
|
|
75
|
+
6. **Legitimate interests** — Balancing test required; does not override subject rights.
|
|
76
|
+
|
|
77
|
+
### 2.4 Consent Requirements (Articles 4(11), 7)
|
|
78
|
+
|
|
79
|
+
- **Freely given** — no bundling with service access.
|
|
80
|
+
- **Specific** — separate consent per processing purpose.
|
|
81
|
+
- **Informed** — clear, plain language.
|
|
82
|
+
- **Unambiguous** — clear affirmative action (no pre-ticked boxes).
|
|
83
|
+
- **Withdrawable** — as easy to withdraw as to give.
|
|
84
|
+
- **Documented** — maintain auditable records.
|
|
85
|
+
|
|
86
|
+
### 2.5 Data Subject Rights (Articles 12-23)
|
|
87
|
+
|
|
88
|
+
| Right | Article | Time | Key Requirement |
|
|
89
|
+
|---------------------------|---------|-------|--------------------------------------------|
|
|
90
|
+
| Right to be informed | 13-14 | At collection | Privacy notice at data collection |
|
|
91
|
+
| Right of access (DSAR) | 15 | 30 days | Copy of personal data + processing info |
|
|
92
|
+
| Right to rectification | 16 | 30 days | Correct inaccurate data |
|
|
93
|
+
| Right to erasure | 17 | 30 days | Delete when no longer necessary |
|
|
94
|
+
| Right to restrict | 18 | 30 days | Stop processing but retain data |
|
|
95
|
+
| Right to portability | 20 | 30 days | Machine-readable format |
|
|
96
|
+
| Right to object | 21 | 30 days | Stop processing for direct marketing |
|
|
97
|
+
| Automated decisions | 22 | 30 days | Right not to be subject to profiling |
|
|
98
|
+
|
|
99
|
+
### 2.6 DPIA (Article 35)
|
|
100
|
+
|
|
101
|
+
Required BEFORE high-risk processing (systematic profiling, large-scale special categories,
|
|
102
|
+
public monitoring). Must contain: processing description, necessity/proportionality assessment,
|
|
103
|
+
risk assessment, mitigation measures, DPO sign-off.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## 3. Implementation Patterns
|
|
108
|
+
|
|
109
|
+
### 3.1 Consent Management (Cookie Banners Done Right)
|
|
110
|
+
|
|
111
|
+
- Block ALL non-essential cookies until consent obtained.
|
|
112
|
+
- Accept and Reject buttons with **equal visual prominence** (same size, font, color).
|
|
113
|
+
- Same number of clicks to opt out as to opt in.
|
|
114
|
+
- Granular category choices (necessary, analytics, marketing, preferences).
|
|
115
|
+
- Log consent with timestamps; provide preference center for ongoing management.
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
// Consent middleware (TypeScript/Express)
|
|
119
|
+
interface ConsentRecord {
|
|
120
|
+
userId: string;
|
|
121
|
+
timestamp: Date;
|
|
122
|
+
categories: { necessary: true; analytics: boolean; marketing: boolean; preferences: boolean };
|
|
123
|
+
source: 'banner' | 'preference-center' | 'api';
|
|
124
|
+
version: string;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function consentMiddleware(req: Request, res: Response, next: NextFunction): void {
|
|
128
|
+
const consent = parseConsentCookie(req.cookies['privacy_consent']);
|
|
129
|
+
req.consentCategories = consent?.categories
|
|
130
|
+
?? { necessary: true, analytics: false, marketing: false, preferences: false };
|
|
131
|
+
|
|
132
|
+
if (!req.consentCategories.analytics) res.removeHeader('X-Analytics-ID');
|
|
133
|
+
if (!req.consentCategories.marketing) blockMarketingScripts(res);
|
|
134
|
+
next();
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### 3.2 DSAR Automation Endpoint
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
app.post('/api/privacy/dsar', authenticateUser, rateLimit({ max: 3, windowMs: 86400000 }),
|
|
142
|
+
async (req, res) => {
|
|
143
|
+
const { type } = req.body; // 'access' | 'portability' | 'erasure' | 'rectification'
|
|
144
|
+
|
|
145
|
+
// Identity verification (mandatory)
|
|
146
|
+
if (!await verifyIdentity(req.user, req.body.verificationToken)) {
|
|
147
|
+
return res.status(403).json({ error: 'Identity verification required' });
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Create tracked request (30-day SLA clock starts)
|
|
151
|
+
const dsar = await dsarService.create({
|
|
152
|
+
userId: req.user.id, type, requestedAt: new Date(),
|
|
153
|
+
deadline: addDays(new Date(), 30), status: 'processing',
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
// Fan out data collection across microservices
|
|
157
|
+
const sources = ['user-service', 'order-service', 'analytics-service',
|
|
158
|
+
'email-service', 'support-service', 'payment-service'];
|
|
159
|
+
Promise.all(sources.map(s => dataCollector.requestData(s, req.user.id, dsar.id)))
|
|
160
|
+
.then(async (results) => {
|
|
161
|
+
const format = type === 'portability' ? 'json' : 'pdf';
|
|
162
|
+
const report = await reportGenerator.compile(results, format);
|
|
163
|
+
await notifyUser(req.user.id, 'Your data export is ready', report.downloadUrl);
|
|
164
|
+
await dsarService.update(dsar.id, { status: 'completed', completedAt: new Date() });
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
res.json({ requestId: dsar.id, estimatedCompletion: dsar.deadline });
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### 3.3 Right to Deletion (Cascading Deletes)
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
class DeletionService {
|
|
175
|
+
private readonly services = [
|
|
176
|
+
{ name: 'user-profile', hardDelete: true },
|
|
177
|
+
{ name: 'user-content', hardDelete: true },
|
|
178
|
+
{ name: 'analytics', hardDelete: false }, // Anonymize (legitimate interest)
|
|
179
|
+
{ name: 'payments', hardDelete: false }, // Pseudonymize (tax law retention)
|
|
180
|
+
{ name: 'support-tickets', hardDelete: true },
|
|
181
|
+
{ name: 'backups', hardDelete: true }, // Scheduled purge
|
|
182
|
+
];
|
|
183
|
+
|
|
184
|
+
async executeErasure(userId: string, dsarId: string): Promise<DeletionReport> {
|
|
185
|
+
const report: DeletionReport = { dsarId, userId, results: [] };
|
|
186
|
+
for (const svc of this.services) {
|
|
187
|
+
try {
|
|
188
|
+
if (svc.hardDelete) await this.hardDelete(svc.name, userId);
|
|
189
|
+
else if (svc.name === 'analytics') await this.anonymize(svc.name, userId);
|
|
190
|
+
else if (svc.name === 'payments') await this.pseudonymize(svc.name, userId);
|
|
191
|
+
report.results.push({ service: svc.name, status: 'completed' });
|
|
192
|
+
} catch (error) {
|
|
193
|
+
report.results.push({ service: svc.name, status: 'failed', error: error.message });
|
|
194
|
+
await this.alertDPO(dsarId, svc.name, error);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
await this.scheduleBackupPurge(userId, addDays(new Date(), 30));
|
|
198
|
+
return report;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### 3.4 Data Retention Scheduler
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
class RetentionScheduler {
|
|
207
|
+
private readonly policies: RetentionPolicy[] = [
|
|
208
|
+
{ dataType: 'session_logs', retentionDays: 90, action: 'delete' },
|
|
209
|
+
{ dataType: 'analytics_events', retentionDays: 365, action: 'anonymize' },
|
|
210
|
+
{ dataType: 'inactive_accounts', retentionDays: 730, action: 'notify_then_delete' },
|
|
211
|
+
{ dataType: 'financial_records', retentionDays: 2555, action: 'pseudonymize' },
|
|
212
|
+
{ dataType: 'consent_records', retentionDays: 2555, action: 'retain' },
|
|
213
|
+
];
|
|
214
|
+
|
|
215
|
+
async enforceRetention(): Promise<void> { // Run daily via cron
|
|
216
|
+
for (const policy of this.policies) {
|
|
217
|
+
const cutoff = subDays(new Date(), policy.retentionDays);
|
|
218
|
+
switch (policy.action) {
|
|
219
|
+
case 'delete':
|
|
220
|
+
await db.query(`DELETE FROM ${policy.dataType} WHERE created_at < $1`, [cutoff]);
|
|
221
|
+
break;
|
|
222
|
+
case 'anonymize':
|
|
223
|
+
await db.query(
|
|
224
|
+
`UPDATE ${policy.dataType} SET user_id = 'anon-' || md5(user_id::text),
|
|
225
|
+
ip_address = NULL, email = NULL WHERE created_at < $1 AND anonymized = false`,
|
|
226
|
+
[cutoff]);
|
|
227
|
+
break;
|
|
228
|
+
case 'notify_then_delete':
|
|
229
|
+
await this.notifyPendingDeletion(policy.dataType, subDays(cutoff, 30), cutoff);
|
|
230
|
+
await db.query(
|
|
231
|
+
`DELETE FROM ${policy.dataType} WHERE created_at < $1 AND deletion_notified = true`,
|
|
232
|
+
[cutoff]);
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
await auditLog.record({ action: 'retention_enforcement', dataType: policy.dataType, cutoff });
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### 3.5 International Data Transfers (Post-Schrems II)
|
|
242
|
+
|
|
243
|
+
| Mechanism | Status | Notes |
|
|
244
|
+
|------------------------------------|-----------------------|---------------------------------------|
|
|
245
|
+
| EU-US Data Privacy Framework (DPF) | Active (challenged) | Survived Sept 2025 General Court ruling |
|
|
246
|
+
| Standard Contractual Clauses (SCCs)| Active | New simplified SCCs expected Q2 2025 |
|
|
247
|
+
| Binding Corporate Rules (BCRs) | Active | For intra-group transfers |
|
|
248
|
+
| Adequacy Decisions | 14 countries | UK, Japan, South Korea, Canada, etc. |
|
|
249
|
+
| Transfer Impact Assessments (TIAs) | Required with SCCs | CNIL guidance issued Jan 2025 |
|
|
250
|
+
|
|
251
|
+
Implementation: Map all cross-border flows, identify legal mechanism for each, conduct TIAs
|
|
252
|
+
with SCCs, encrypt in transit + at rest, monitor adequacy decision status, document in ROPA.
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## 4. Vulnerability Catalog
|
|
257
|
+
|
|
258
|
+
### V-PRIV-01: Processing Without Valid Consent
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
// VULNERABLE
|
|
262
|
+
app.post('/subscribe', async (req, res) => {
|
|
263
|
+
await db.query('INSERT INTO subscribers VALUES ($1)', [req.body.email]);
|
|
264
|
+
await analytics.track(req.body.email); // No consent for analytics
|
|
265
|
+
await marketing.addSegment(req.body.email); // No consent for marketing
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
// COMPLIANT
|
|
269
|
+
app.post('/subscribe', async (req, res) => {
|
|
270
|
+
const { email, consentAnalytics, consentMarketing } = req.body;
|
|
271
|
+
await consentStore.record({ email, purposes: { consentAnalytics, consentMarketing } });
|
|
272
|
+
await db.query('INSERT INTO subscribers VALUES ($1)', [email]);
|
|
273
|
+
if (consentAnalytics) await analytics.track(email);
|
|
274
|
+
if (consentMarketing) await marketing.addSegment(email);
|
|
275
|
+
});
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### V-PRIV-02: Dark Patterns in Consent UI
|
|
279
|
+
|
|
280
|
+
```html
|
|
281
|
+
<!-- VULNERABLE: Asymmetric buttons -->
|
|
282
|
+
<button class="btn-primary btn-large">Accept All</button>
|
|
283
|
+
<a href="/settings" class="text-small text-grey">Manage preferences</a>
|
|
284
|
+
|
|
285
|
+
<!-- COMPLIANT: Equal prominence -->
|
|
286
|
+
<button class="btn-secondary" onclick="rejectAll()">Reject All</button>
|
|
287
|
+
<button class="btn-secondary" onclick="savePreferences()">Save Preferences</button>
|
|
288
|
+
<button class="btn-secondary" onclick="acceptAll()">Accept All</button>
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### V-PRIV-03: No Data Deletion Mechanism
|
|
292
|
+
Violation of Article 17. Netflix fined EUR 4.75M for inadequate DSAR responses.
|
|
293
|
+
|
|
294
|
+
### V-PRIV-04: Excessive Data Collection
|
|
295
|
+
|
|
296
|
+
```typescript
|
|
297
|
+
// VULNERABLE: Collecting SSN, DOB, gender for a newsletter
|
|
298
|
+
interface Form { email: string; ssn: string; dob: string; gender: string; }
|
|
299
|
+
// COMPLIANT: Only what is necessary
|
|
300
|
+
interface Form { email: string; }
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### V-PRIV-05: Third-Party Tracking Without Consent
|
|
304
|
+
|
|
305
|
+
```html
|
|
306
|
+
<!-- VULNERABLE: Loading trackers before consent -->
|
|
307
|
+
<script src="https://www.googletagmanager.com/gtag/js?id=GA_ID"></script>
|
|
308
|
+
<script src="https://connect.facebook.net/en_US/fbevents.js"></script>
|
|
309
|
+
|
|
310
|
+
<!-- COMPLIANT: Load only after consent -->
|
|
311
|
+
<script>
|
|
312
|
+
document.addEventListener('consent-granted', () => {
|
|
313
|
+
if (getConsent('analytics')) loadScript('gtag.js');
|
|
314
|
+
});
|
|
315
|
+
</script>
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### V-PRIV-06: Data Retained Beyond Purpose
|
|
319
|
+
Violation of storage limitation (Article 5(1)(e)). Every data category needs a documented
|
|
320
|
+
retention period with automated enforcement.
|
|
321
|
+
|
|
322
|
+
### V-PRIV-07: Missing Privacy Policy
|
|
323
|
+
Violation of Articles 12-14. Must include: controller identity, purposes, legal basis,
|
|
324
|
+
recipients, transfers, retention periods, subject rights, right to complain.
|
|
325
|
+
|
|
326
|
+
### V-PRIV-08: No Breach Notification Mechanism
|
|
327
|
+
Article 33 requires 72-hour notification to supervisory authority.
|
|
328
|
+
|
|
329
|
+
### V-PRIV-09: Insecure DSAR Identity Verification
|
|
330
|
+
Responding without verification = potential data breach. Use existing auth; do not collect
|
|
331
|
+
new PII solely for verification.
|
|
332
|
+
|
|
333
|
+
### V-PRIV-10: Cross-Border Transfer Without Legal Basis
|
|
334
|
+
Uber fined EUR 290M. Store EU data in EU regions or ensure valid transfer mechanism.
|
|
335
|
+
|
|
336
|
+
### V-PRIV-11: No Consent Withdrawal Mechanism
|
|
337
|
+
Article 7(3): withdrawal must be as easy as giving consent. No "call us to unsubscribe."
|
|
338
|
+
|
|
339
|
+
### V-PRIV-12: Sharing Data Without Data Processing Agreement
|
|
340
|
+
Article 28: DPA required with every processor (analytics, email, CRM, hosting, payments).
|
|
341
|
+
|
|
342
|
+
### V-PRIV-13: No Records of Processing Activities (ROPA)
|
|
343
|
+
Article 30: mandatory for 250+ employees or high-risk processing.
|
|
344
|
+
|
|
345
|
+
### V-PRIV-14: Using Personal Data for AI Training Without Basis
|
|
346
|
+
NOYB threatened Meta with class action. Requires explicit consent or legitimate interest with opt-out.
|
|
347
|
+
|
|
348
|
+
### V-PRIV-15: Children's Data Without Age Verification
|
|
349
|
+
Article 8: parental consent for under 16 (or 13 per member state).
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## 5. Security Checklist
|
|
354
|
+
|
|
355
|
+
### Pre-Development
|
|
356
|
+
- [ ] Identify lawful basis for each processing activity (Article 6)
|
|
357
|
+
- [ ] Conduct DPIA for high-risk processing (Article 35)
|
|
358
|
+
- [ ] Map all personal data flows (collection, storage, processing, sharing, deletion)
|
|
359
|
+
- [ ] Document retention periods per data category
|
|
360
|
+
- [ ] Execute DPAs with all third-party processors (Article 28)
|
|
361
|
+
- [ ] Map international transfers and identify transfer mechanisms
|
|
362
|
+
|
|
363
|
+
### Data Collection
|
|
364
|
+
- [ ] Consent banner with equal-prominence accept/reject buttons
|
|
365
|
+
- [ ] Block non-essential cookies/trackers until consent obtained
|
|
366
|
+
- [ ] Granular consent per purpose (not bundled)
|
|
367
|
+
- [ ] Privacy notice at point of collection (Articles 13-14)
|
|
368
|
+
- [ ] Data minimization — collect only necessary fields
|
|
369
|
+
- [ ] Age verification for services accessible to minors
|
|
370
|
+
|
|
371
|
+
### Data Storage & Processing
|
|
372
|
+
- [ ] Encrypt at rest (AES-256) and in transit (TLS 1.2+)
|
|
373
|
+
- [ ] Least-privilege access controls for personal data
|
|
374
|
+
- [ ] Pseudonymize/anonymize where full identification not needed
|
|
375
|
+
- [ ] Automated data retention scheduler
|
|
376
|
+
- [ ] Audit logs of all personal data access and modifications
|
|
377
|
+
- [ ] EU data stored in EU regions (or valid transfer mechanism)
|
|
378
|
+
|
|
379
|
+
### Data Subject Rights
|
|
380
|
+
- [ ] DSAR intake endpoint with identity verification
|
|
381
|
+
- [ ] Data export in machine-readable format (Article 20)
|
|
382
|
+
- [ ] Cascading deletion across all services and backups
|
|
383
|
+
- [ ] Consent withdrawal in same clicks as consent granting
|
|
384
|
+
- [ ] Preference center for ongoing consent management
|
|
385
|
+
- [ ] SLA tracking (30 days GDPR, 45 days CCPA) with alerts
|
|
386
|
+
|
|
387
|
+
### Breach Response
|
|
388
|
+
- [ ] Automated breach detection and alerting
|
|
389
|
+
- [ ] Notification templates (supervisory authority + data subjects)
|
|
390
|
+
- [ ] 72-hour notification workflow tested quarterly
|
|
391
|
+
- [ ] Breach assessment process documented
|
|
392
|
+
- [ ] Supervisory authority contact details maintained
|
|
393
|
+
|
|
394
|
+
### Governance
|
|
395
|
+
- [ ] DPO appointed where required (Article 37)
|
|
396
|
+
- [ ] ROPA maintained (Article 30)
|
|
397
|
+
- [ ] Annual privacy compliance audit
|
|
398
|
+
- [ ] Staff training on personal data handling (at least annually)
|
|
399
|
+
|
|
400
|
+
---
|
|
401
|
+
|
|
402
|
+
## 6. Tools & Automation
|
|
403
|
+
|
|
404
|
+
### Consent Management Platforms
|
|
405
|
+
|
|
406
|
+
| Tool | Best For | GDPR | CCPA | Price |
|
|
407
|
+
|---------------|---------------|------|------|---------------------|
|
|
408
|
+
| OneTrust | Enterprise | Yes | Yes | USD 33-2000/mo |
|
|
409
|
+
| Cookiebot | SMB | Yes | Yes | EUR 7-50/mo |
|
|
410
|
+
| CookieYes | Budget | Yes | Yes | Free-USD 49/mo |
|
|
411
|
+
| Osano | Mid-market | Yes | Yes | USD 199-499/mo |
|
|
412
|
+
| Usercentrics | Multi-region | Yes | Yes | Custom |
|
|
413
|
+
|
|
414
|
+
### DSAR Automation
|
|
415
|
+
- **DataGrail** — Automated discovery across 100+ integrations.
|
|
416
|
+
- **TrustArc** — End-to-end DSR fulfillment with identity verification.
|
|
417
|
+
- **BigID** — ML-powered data discovery, classification, DSAR automation.
|
|
418
|
+
- **OneTrust** — Rights management, intake forms, SLA tracking.
|
|
419
|
+
|
|
420
|
+
### Data Mapping & Discovery
|
|
421
|
+
- **BigID** — ML-powered classification. **Collibra** — Governance and lineage.
|
|
422
|
+
- **OneTrust** — Flow visualization. **DataGrail** — Real-time SaaS mapping.
|
|
423
|
+
|
|
424
|
+
### Privacy Impact Assessment
|
|
425
|
+
- **CNIL PIA Tool** — Free, open source (https://www.cnil.fr/en/open-source-pia-software).
|
|
426
|
+
- **OneTrust** — Templates, risk scoring, workflow. **TrustArc** — Regulatory intelligence.
|
|
427
|
+
|
|
428
|
+
### Cookie Scanners
|
|
429
|
+
- **Cookiebot** — Automated monthly scanning. **Blacklight** — Free tracker detection (The Markup).
|
|
430
|
+
|
|
431
|
+
### Privacy-Preserving Analytics
|
|
432
|
+
|
|
433
|
+
| Tool | Cookie-Free | GDPR w/o Consent | Open Source |
|
|
434
|
+
|-----------|-------------|-------------------|------------|
|
|
435
|
+
| Plausible | Yes | Yes | Yes |
|
|
436
|
+
| Fathom | Yes | Yes | No |
|
|
437
|
+
| Umami | Yes | Yes | Yes |
|
|
438
|
+
| Matomo | Configurable| Configurable | Yes |
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## 7. Platform-Specific Guidance
|
|
443
|
+
|
|
444
|
+
### 7.1 Web (Cookie Consent & Tracking)
|
|
445
|
+
|
|
446
|
+
```typescript
|
|
447
|
+
class CookieConsentManager {
|
|
448
|
+
private readonly VERSION = '2.1';
|
|
449
|
+
|
|
450
|
+
init(): void {
|
|
451
|
+
const consent = this.getStoredConsent();
|
|
452
|
+
if (!consent || consent.version !== this.VERSION) {
|
|
453
|
+
this.showBanner();
|
|
454
|
+
this.blockNonEssentialScripts(); // Set type="text/plain" on data-consent scripts
|
|
455
|
+
} else {
|
|
456
|
+
this.applyConsent(consent);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
private applyConsent(consent: ConsentRecord): void {
|
|
461
|
+
document.querySelectorAll('script[data-consent]').forEach(el => {
|
|
462
|
+
const s = el as HTMLScriptElement;
|
|
463
|
+
if (consent.categories[s.dataset.consent as string]) {
|
|
464
|
+
const n = document.createElement('script');
|
|
465
|
+
n.src = s.src; n.type = 'text/javascript';
|
|
466
|
+
s.parentNode?.replaceChild(n, s);
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
acceptAll(): void { this.save({ necessary: true, analytics: true, marketing: true, preferences: true }); }
|
|
472
|
+
rejectAll(): void { this.save({ necessary: true, analytics: false, marketing: false, preferences: false }); }
|
|
473
|
+
|
|
474
|
+
private save(categories: ConsentCategories): void {
|
|
475
|
+
const record = { categories, version: this.VERSION, timestamp: new Date().toISOString() };
|
|
476
|
+
localStorage.setItem('privacy_consent', JSON.stringify(record));
|
|
477
|
+
this.applyConsent(record as ConsentRecord);
|
|
478
|
+
fetch('/api/privacy/consent', { method: 'POST', body: JSON.stringify(record),
|
|
479
|
+
headers: { 'Content-Type': 'application/json' } }); // Audit trail
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
### 7.2 Mobile
|
|
485
|
+
|
|
486
|
+
**iOS — App Tracking Transparency (ATT):** Since iOS 14.5, apps MUST request ATT permission
|
|
487
|
+
before accessing IDFA. Without permission, IDFA returns all zeros.
|
|
488
|
+
|
|
489
|
+
```swift
|
|
490
|
+
import AppTrackingTransparency
|
|
491
|
+
func requestTrackingPermission() {
|
|
492
|
+
ATTrackingManager.requestTrackingAuthorization { status in
|
|
493
|
+
switch status {
|
|
494
|
+
case .authorized:
|
|
495
|
+
let idfa = ASIdentifierManager.shared().advertisingIdentifier
|
|
496
|
+
analytics.setAdvertisingId(idfa.uuidString)
|
|
497
|
+
case .denied, .restricted: analytics.enablePrivacyMode()
|
|
498
|
+
case .notDetermined: break
|
|
499
|
+
@unknown default: analytics.enablePrivacyMode()
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
**Android — GAID:** Check `isLimitAdTrackingEnabled` before using advertising ID.
|
|
506
|
+
Even if allowed by OS, still need GDPR consent for EU users.
|
|
507
|
+
|
|
508
|
+
**Mobile-specific:** Request ATT at contextually appropriate moment (not first launch).
|
|
509
|
+
Encrypt local storage (Keychain/Keystore). Clear cached PII on logout.
|
|
510
|
+
|
|
511
|
+
### 7.3 Analytics
|
|
512
|
+
|
|
513
|
+
**GA4 Consent Mode v2:**
|
|
514
|
+
|
|
515
|
+
```javascript
|
|
516
|
+
gtag('consent', 'default', {
|
|
517
|
+
'ad_storage': 'denied', 'ad_user_data': 'denied',
|
|
518
|
+
'ad_personalization': 'denied', 'analytics_storage': 'denied',
|
|
519
|
+
'wait_for_update': 500,
|
|
520
|
+
});
|
|
521
|
+
// After CMP consent:
|
|
522
|
+
function updateConsent(cats) {
|
|
523
|
+
gtag('consent', 'update', {
|
|
524
|
+
'ad_storage': cats.marketing ? 'granted' : 'denied',
|
|
525
|
+
'analytics_storage': cats.analytics ? 'granted' : 'denied',
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
**Recommendation:** Use Plausible or Fathom by default (no cookies, no consent needed).
|
|
531
|
+
Only use GA4 if marketing attribution features are required; implement Consent Mode v2.
|
|
532
|
+
|
|
533
|
+
---
|
|
534
|
+
|
|
535
|
+
## 8. Incident Patterns
|
|
536
|
+
|
|
537
|
+
### 8.1 Data Breach Notification (72-Hour Rule — Articles 33-34)
|
|
538
|
+
|
|
539
|
+
```
|
|
540
|
+
Hour 0: Breach detected → activate response team, begin containment
|
|
541
|
+
Hour 0-24: Assess scope, severity, risk to individuals' rights
|
|
542
|
+
If NOT likely risk: document decision, no notification needed
|
|
543
|
+
If likely risk: prepare supervisory authority notification
|
|
544
|
+
Hour 24-48: Draft notifications; identify affected data subjects
|
|
545
|
+
Hour 48-72: Submit to lead supervisory authority (nature of breach, DPO contact,
|
|
546
|
+
likely consequences, measures taken/proposed)
|
|
547
|
+
If delay unavoidable: provide reasons
|
|
548
|
+
Post-72h: Notify data subjects if high risk (Art 34); submit supplementary info;
|
|
549
|
+
phased notifications acceptable; document in breach register
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
### 8.2 DSAR Response Protocol (30 Days)
|
|
553
|
+
|
|
554
|
+
```
|
|
555
|
+
Day 0: Log request, start SLA clock, acknowledge within 3 business days
|
|
556
|
+
Day 1-5: Verify identity via existing authentication
|
|
557
|
+
Day 5-20: Query all systems, compile data, redact third-party PII
|
|
558
|
+
Day 20-28: Legal review, prepare export (machine-readable for portability)
|
|
559
|
+
Day 28-30: Deliver via secure channel; first copy free
|
|
560
|
+
If extension needed: notify before day 30 (max +2 months)
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
### 8.3 Regulatory Inquiry Response
|
|
564
|
+
|
|
565
|
+
Respond within specified timeframe (14-30 days). Involve DPO and counsel immediately.
|
|
566
|
+
Cooperate fully — obstruction increases fine severity. Preserve evidence, document all
|
|
567
|
+
communications, conduct parallel internal investigation.
|
|
568
|
+
|
|
569
|
+
---
|
|
570
|
+
|
|
571
|
+
## 9. Compliance & Standards Reference
|
|
572
|
+
|
|
573
|
+
### GDPR Key Articles
|
|
574
|
+
|
|
575
|
+
| Article(s) | Topic | Summary |
|
|
576
|
+
|------------|----------------------------------|---------------------------------------------|
|
|
577
|
+
| 5 | Principles | Lawfulness, fairness, transparency, minimization, accuracy, storage limitation, integrity |
|
|
578
|
+
| 6 | Lawful basis | Six legal bases for processing |
|
|
579
|
+
| 7-8 | Consent / Children | Demonstrable, specific, withdrawable; parental consent for minors |
|
|
580
|
+
| 9 | Special categories | Biometric, health, racial data — explicit consent required |
|
|
581
|
+
| 12-14 | Transparency | Clear communication, information at collection |
|
|
582
|
+
| 15-22 | Data subject rights | Access, rectification, erasure, portability, object, automated decisions |
|
|
583
|
+
| 25 | Privacy by design/default | Technical and organizational measures |
|
|
584
|
+
| 28 | Processor obligations | DPA requirements |
|
|
585
|
+
| 30 | Records of processing | ROPA mandatory for 250+ employees or high-risk |
|
|
586
|
+
| 32-34 | Security & breach notification | Appropriate measures, 72hr notification, subject notification |
|
|
587
|
+
| 44-49 | International transfers | Adequacy, SCCs, BCRs, derogations |
|
|
588
|
+
|
|
589
|
+
### CCPA/CPRA (California)
|
|
590
|
+
- **Scope:** USD 25M+ revenue, 100K+ consumers' data, or 50%+ revenue from data sales.
|
|
591
|
+
- **Rights:** Know, delete, opt-out of sale/sharing, correct, limit sensitive data use.
|
|
592
|
+
- **Response:** 45 days (extendable +45). Penalties: USD 2,500/unintentional, USD 7,500/intentional.
|
|
593
|
+
- **Required:** "Do Not Sell" link on homepage. Private right of action for breach of unencrypted data.
|
|
594
|
+
|
|
595
|
+
### LGPD (Brazil)
|
|
596
|
+
- **Scope:** Processing of personal data of individuals in Brazil. 10 legal bases.
|
|
597
|
+
- **DPO:** Required for all controllers. **Penalties:** Up to 2% revenue, capped BRL 50M/violation.
|
|
598
|
+
|
|
599
|
+
### PIPEDA (Canada)
|
|
600
|
+
- **Scope:** Private-sector commercial activities. Allows implied consent in low-risk scenarios.
|
|
601
|
+
- **Breach:** Mandatory notification for "real risk of significant harm."
|
|
602
|
+
|
|
603
|
+
### ePrivacy Directive (EU)
|
|
604
|
+
- Cookie consent required for non-essential cookies (Article 5(3)).
|
|
605
|
+
- Opt-in for email/SMS marketing (soft opt-in exception for existing customers).
|
|
606
|
+
- Lex specialis alongside GDPR. ePrivacy Regulation replacement still pending.
|
|
607
|
+
|
|
608
|
+
---
|
|
609
|
+
|
|
610
|
+
## 10. Code Examples
|
|
611
|
+
|
|
612
|
+
### 10.1 Consent Validation Middleware
|
|
613
|
+
|
|
614
|
+
```typescript
|
|
615
|
+
function requireConsent(...purposes: string[]) {
|
|
616
|
+
return async (req: Request, res: Response, next: NextFunction) => {
|
|
617
|
+
const consent = await consentStore.getCurrent(req.user?.id);
|
|
618
|
+
if (!consent || consent.version !== CURRENT_CONSENT_VERSION) {
|
|
619
|
+
return res.status(451).json({ error: 'Consent required', consentUrl: '/api/privacy/consent' });
|
|
620
|
+
}
|
|
621
|
+
const missing = purposes.filter(p => !consent.categories[p]);
|
|
622
|
+
if (missing.length > 0) {
|
|
623
|
+
return res.status(451).json({ error: 'Additional consent required', missing });
|
|
624
|
+
}
|
|
625
|
+
req.consent = consent;
|
|
626
|
+
next();
|
|
627
|
+
};
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
// Usage
|
|
631
|
+
app.post('/api/recommendations', requireConsent('analytics', 'preferences'), handler);
|
|
632
|
+
app.post('/api/marketing/email', requireConsent('marketing'), handler);
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
### 10.2 Privacy-Preserving Logging
|
|
636
|
+
|
|
637
|
+
```typescript
|
|
638
|
+
// VULNERABLE
|
|
639
|
+
logger.info(`User ${user.email} logged in from ${req.ip}`);
|
|
640
|
+
|
|
641
|
+
// COMPLIANT
|
|
642
|
+
logger.info(`User ${hash(user.id)} logged in from ${anonymizeIp(req.ip)}`);
|
|
643
|
+
|
|
644
|
+
function anonymizeIp(ip: string): string {
|
|
645
|
+
return ip.includes('.') ? ip.replace(/\.\d+$/, '.0')
|
|
646
|
+
: ip.replace(/:[\da-f]{1,4}:[\da-f]{1,4}:[\da-f]{1,4}:[\da-f]{1,4}:[\da-f]{1,4}$/, ':0:0:0:0:0');
|
|
647
|
+
}
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
### 10.3 Data Portability Export (Article 20)
|
|
651
|
+
|
|
652
|
+
```typescript
|
|
653
|
+
async function generatePortabilityExport(userId: string): Promise<Buffer> {
|
|
654
|
+
const [profile, orders, posts] = await Promise.all([
|
|
655
|
+
userService.getProfile(userId),
|
|
656
|
+
orderService.getOrders(userId),
|
|
657
|
+
contentService.getPosts(userId),
|
|
658
|
+
]);
|
|
659
|
+
return Buffer.from(JSON.stringify({
|
|
660
|
+
exportedAt: new Date().toISOString(),
|
|
661
|
+
format: 'GDPR Article 20 Data Portability Export',
|
|
662
|
+
dataController: { name: 'Company', contact: 'dpo@company.com' },
|
|
663
|
+
personalData: {
|
|
664
|
+
profile: { email: profile.email, displayName: profile.displayName },
|
|
665
|
+
orders: orders.map(o => ({ id: o.id, date: o.createdAt, items: o.items })),
|
|
666
|
+
content: posts.map(p => ({ title: p.title, body: p.body, createdAt: p.createdAt })),
|
|
667
|
+
},
|
|
668
|
+
}, null, 2), 'utf-8');
|
|
669
|
+
}
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
---
|
|
673
|
+
|
|
674
|
+
## References
|
|
675
|
+
|
|
676
|
+
### Regulatory Sources
|
|
677
|
+
- GDPR Full Text: https://gdpr-info.eu/
|
|
678
|
+
- EDPB Guidelines: https://www.edpb.europa.eu/our-work-tools/general-guidance
|
|
679
|
+
- CCPA/CPRA: https://oag.ca.gov/privacy/ccpa | https://cppa.ca.gov/announcements/
|
|
680
|
+
- LGPD: https://www.gov.br/cidadania/pt-br/acesso-a-informacao/lgpd
|
|
681
|
+
- PIPEDA: https://www.priv.gc.ca/en/privacy-topics/privacy-laws-in-canada/pipeda/
|
|
682
|
+
|
|
683
|
+
### Enforcement Trackers
|
|
684
|
+
- GDPR Enforcement Tracker: https://www.enforcementtracker.com/
|
|
685
|
+
- CMS Report 2024/2025: https://cms.law/en/int/publication/gdpr-enforcement-tracker-report
|
|
686
|
+
- NOYB: https://noyb.eu/en/fines-resulting-noyb-litigation
|
|
687
|
+
|
|
688
|
+
### Tools
|
|
689
|
+
- OneTrust: https://www.onetrust.com/ | Cookiebot: https://www.cookiebot.com/
|
|
690
|
+
- Plausible: https://plausible.io/ | Fathom: https://usefathom.com/
|
|
691
|
+
- DataGrail: https://www.datagrail.io/ | BigID: https://bigid.com/
|
|
692
|
+
- CNIL PIA Tool: https://www.cnil.fr/en/open-source-pia-software
|