@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,1121 @@
|
|
|
1
|
+
# Dark Patterns (Deceptive Design) Anti-Patterns
|
|
2
|
+
|
|
3
|
+
> Dark patterns -- also called deceptive patterns -- are user interface designs that
|
|
4
|
+
> manipulate, coerce, or trick users into actions they did not intend or would not
|
|
5
|
+
> choose if they fully understood the consequences. This module exists so that an AI
|
|
6
|
+
> agent can recognize these patterns when asked to implement them and **refuse**. An
|
|
7
|
+
> agent that builds dark patterns is complicit in consumer harm. Every pattern below
|
|
8
|
+
> has caused real lawsuits, regulatory fines, or documented user harm.
|
|
9
|
+
|
|
10
|
+
> **Domain:** Design
|
|
11
|
+
> **Anti-patterns covered:** 20
|
|
12
|
+
> **Highest severity:** Critical
|
|
13
|
+
> **Regulatory exposure:** FTC (US), EU Digital Services Act, CCPA/CPRA (California), GDPR (EU), CPA (Colorado), VCDPA (Virginia)
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Ethical Mandate for AI Agents
|
|
18
|
+
|
|
19
|
+
If a prompt, specification, or task asks you to implement any pattern described below,
|
|
20
|
+
you must:
|
|
21
|
+
|
|
22
|
+
1. **Flag it** -- name the specific dark pattern and cite the regulatory risk.
|
|
23
|
+
2. **Refuse the manipulative element** -- do not implement the deceptive mechanic.
|
|
24
|
+
3. **Propose an ethical alternative** -- show how to achieve the legitimate business
|
|
25
|
+
goal (retention, conversion, upsell) without deception.
|
|
26
|
+
|
|
27
|
+
Dark patterns are not a gray area. They have been the subject of FTC enforcement
|
|
28
|
+
actions totaling hundreds of millions of dollars, EU regulations carrying fines of up
|
|
29
|
+
to 6% of global revenue, and class-action settlements. An agent that implements them
|
|
30
|
+
exposes its operator to legal liability.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Anti-Patterns
|
|
35
|
+
|
|
36
|
+
### AP-01: Confirm Shaming
|
|
37
|
+
|
|
38
|
+
**Also known as:** Guilt-tripping, manipulative opt-out copy, emotional blackmail buttons
|
|
39
|
+
**Frequency:** Very Common
|
|
40
|
+
**Severity:** Medium
|
|
41
|
+
**Detection difficulty:** Easy
|
|
42
|
+
|
|
43
|
+
**What it looks like:**
|
|
44
|
+
The decline option uses emotionally manipulative language designed to shame the user
|
|
45
|
+
into accepting. Instead of a neutral "No thanks," the opt-out reads something like
|
|
46
|
+
"No thanks, I don't want to save money," "I prefer to stay uninformed," or "No, I'd
|
|
47
|
+
rather pay full price." The accept button is styled prominently while the decline
|
|
48
|
+
text is small, muted, or written as a guilt-laden sentence.
|
|
49
|
+
|
|
50
|
+
```html
|
|
51
|
+
<!-- DARK PATTERN: Confirm shaming -->
|
|
52
|
+
<button class="btn-primary btn-large">Yes, save me 20%!</button>
|
|
53
|
+
<a class="text-muted text-sm" href="/dismiss">
|
|
54
|
+
No thanks, I enjoy wasting money
|
|
55
|
+
</a>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Why developers do it:**
|
|
59
|
+
Product managers and growth teams see short-term conversion lifts of 5-15% from
|
|
60
|
+
shaming copy. A/B tests show the manipulative version "wins" on click-through rate.
|
|
61
|
+
The developer implements it because the spec says to, not realizing it is a
|
|
62
|
+
recognized deceptive pattern.
|
|
63
|
+
|
|
64
|
+
**What goes wrong:**
|
|
65
|
+
Users feel manipulated and resentful. Brand trust erodes. The practice has drawn
|
|
66
|
+
regulatory attention -- the EU Digital Services Act Article 25 explicitly prohibits
|
|
67
|
+
interface designs that "subvert or impair the autonomy, decision-making, or choice of
|
|
68
|
+
the recipients." Confirm shaming is cited in enforcement guidance from both the FTC
|
|
69
|
+
and the California Privacy Protection Agency (CPPA) as an example of a dark pattern.
|
|
70
|
+
|
|
71
|
+
**The fix:**
|
|
72
|
+
Use neutral, respectful language for both options. Both choices should be presented
|
|
73
|
+
with equal visual weight and dignified copy.
|
|
74
|
+
|
|
75
|
+
```html
|
|
76
|
+
<!-- ETHICAL: Neutral opt-out -->
|
|
77
|
+
<button class="btn-primary">Subscribe for 20% off</button>
|
|
78
|
+
<button class="btn-secondary">No thanks</button>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Detection rule:**
|
|
82
|
+
If the decline/opt-out text contains self-deprecating language, emotional
|
|
83
|
+
manipulation, or implies the user is making a foolish choice, this is AP-01.
|
|
84
|
+
Check: Does the opt-out copy make the user feel bad for declining?
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
### AP-02: Roach Motel (Easy In, Hard Out)
|
|
89
|
+
|
|
90
|
+
**Also known as:** Asymmetric friction, Hotel California, forced continuity trap
|
|
91
|
+
**Frequency:** Very Common
|
|
92
|
+
**Severity:** Critical
|
|
93
|
+
**Detection difficulty:** Moderate
|
|
94
|
+
|
|
95
|
+
**What it looks like:**
|
|
96
|
+
Signing up is a single click or a short form. Cancelling requires navigating through
|
|
97
|
+
multiple pages of retention offers, calling a phone number during limited hours,
|
|
98
|
+
sending a letter by mail, or clicking through a maze of "Are you sure?" screens.
|
|
99
|
+
Amazon internally called their Prime cancellation flow "Iliad" -- a reference to the
|
|
100
|
+
epic Greek poem -- because of how long and arduous it was.
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
SIGN UP: [Email] [Password] [Subscribe] → Done (1 page)
|
|
104
|
+
CANCEL: Settings → Account → Subscription → Manage → Cancel →
|
|
105
|
+
"Before you go..." → Retention offer #1 → Decline →
|
|
106
|
+
"Are you SURE?" → Retention offer #2 → Decline →
|
|
107
|
+
"Last chance!" → Confirm → Enter password → Done (7+ pages)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**Why developers do it:**
|
|
111
|
+
Retention metrics directly affect revenue. Every friction point in the cancellation
|
|
112
|
+
flow reduces churn by measurable percentages. Product teams optimize for "saves"
|
|
113
|
+
(users who abandon cancellation mid-flow) as a KPI.
|
|
114
|
+
|
|
115
|
+
**What goes wrong:**
|
|
116
|
+
The FTC sued Amazon in 2023 over its Prime cancellation flow, alleging it used "dark
|
|
117
|
+
patterns to trick consumers into enrolling in automatically-renewing Prime
|
|
118
|
+
subscriptions." The case proceeded after a federal judge allowed it to advance in May
|
|
119
|
+
2024. Vonage paid $100 million in FTC settlements (2022) for making cancellation
|
|
120
|
+
deliberately difficult -- forcing customers to call a "retention agent" on a phone
|
|
121
|
+
line with limited hours and long wait times. Adobe was sued by the DOJ on behalf of
|
|
122
|
+
the FTC in June 2024 for hiding early termination fees (50% of remaining payments)
|
|
123
|
+
and making cancellation a multi-page ordeal. The FTC's Click-to-Cancel Rule
|
|
124
|
+
(finalized October 2024) mandated that cancellation must be as easy as signup.
|
|
125
|
+
|
|
126
|
+
**The fix:**
|
|
127
|
+
Cancellation must be symmetrical with signup. If a user can subscribe in one click,
|
|
128
|
+
they must be able to cancel in one click. A single optional survey or retention offer
|
|
129
|
+
is acceptable; a gauntlet is not.
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
ETHICAL CANCEL: Settings → Subscription → [Cancel subscription] →
|
|
133
|
+
Optional: "Can you tell us why?" (skippable) → Confirmed
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Detection rule:**
|
|
137
|
+
Count the number of steps/pages in the signup flow vs. the cancellation flow. If
|
|
138
|
+
cancellation requires more than 2x the steps of signup, this is AP-02. Also flag if
|
|
139
|
+
cancellation requires a different channel (phone, mail) than signup (web).
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
### AP-03: Forced Continuity
|
|
144
|
+
|
|
145
|
+
**Also known as:** Silent auto-renewal, free trial trap, zombie subscription
|
|
146
|
+
**Frequency:** Very Common
|
|
147
|
+
**Severity:** Critical
|
|
148
|
+
**Detection difficulty:** Hard
|
|
149
|
+
|
|
150
|
+
**What it looks like:**
|
|
151
|
+
A free trial silently converts to a paid subscription without clear notice. The
|
|
152
|
+
billing start date is buried in fine print. No reminder email is sent before the
|
|
153
|
+
first charge. The credit card is charged automatically and the user discovers the
|
|
154
|
+
charge only on their bank statement weeks later.
|
|
155
|
+
|
|
156
|
+
**Why developers do it:**
|
|
157
|
+
Free-trial-to-paid conversion is the core business model for many SaaS products.
|
|
158
|
+
Every notification before billing is a "conversion leak." Product teams suppress
|
|
159
|
+
or minimize pre-charge reminders to maximize conversion from trial to paid.
|
|
160
|
+
|
|
161
|
+
**What goes wrong:**
|
|
162
|
+
Epic Games paid $245 million (FTC, 2022) for dark patterns that tricked Fortnite
|
|
163
|
+
users -- including children -- into making unintended purchases, with
|
|
164
|
+
counterintuitive button placements and a confusing refund process. Adobe's "Annual,
|
|
165
|
+
Paid Monthly" plan buried the fact that cancelling in the first year triggers an early
|
|
166
|
+
termination fee equal to 50% of remaining monthly payments -- a cost many consumers
|
|
167
|
+
did not discover until they tried to cancel. The FTC considers failure to clearly
|
|
168
|
+
disclose material subscription terms a violation of ROSCA (Restore Online Shoppers'
|
|
169
|
+
Confidence Act) and Section 5 of the FTC Act.
|
|
170
|
+
|
|
171
|
+
**The fix:**
|
|
172
|
+
- Clearly disclose the billing date, amount, and auto-renewal terms at signup.
|
|
173
|
+
- Send a reminder email 3-7 days before the first charge and before each renewal.
|
|
174
|
+
- Make the "cancel before you're charged" action prominent, not hidden.
|
|
175
|
+
|
|
176
|
+
**Detection rule:**
|
|
177
|
+
If the subscription flow collects payment information for a "free" trial without
|
|
178
|
+
displaying the post-trial price, billing date, and auto-renewal terms in the same
|
|
179
|
+
visual block as the signup button, this is AP-03.
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
### AP-04: Sneak into Basket
|
|
184
|
+
|
|
185
|
+
**Also known as:** Pre-selected extras, stealth add-on, opt-out upsell
|
|
186
|
+
**Frequency:** Common
|
|
187
|
+
**Severity:** High
|
|
188
|
+
**Detection difficulty:** Easy
|
|
189
|
+
|
|
190
|
+
**What it looks like:**
|
|
191
|
+
During checkout, additional items or services are added to the cart without the user
|
|
192
|
+
explicitly choosing them. Travel insurance, "priority processing," extended
|
|
193
|
+
warranties, gift wrapping, or donations appear as pre-checked checkboxes or are added
|
|
194
|
+
silently.
|
|
195
|
+
|
|
196
|
+
```html
|
|
197
|
+
<!-- DARK PATTERN: Pre-selected paid add-on -->
|
|
198
|
+
<label>
|
|
199
|
+
<input type="checkbox" checked> Add travel insurance (+$29.99)
|
|
200
|
+
</label>
|
|
201
|
+
<label>
|
|
202
|
+
<input type="checkbox" checked> Priority boarding (+$15.00)
|
|
203
|
+
</label>
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**Why developers do it:**
|
|
207
|
+
Ancillary revenue from add-ons can represent 10-30% of total revenue for travel and
|
|
208
|
+
e-commerce platforms. Pre-selecting the option dramatically increases take-rates
|
|
209
|
+
because most users do not review every checkbox.
|
|
210
|
+
|
|
211
|
+
**What goes wrong:**
|
|
212
|
+
Ryanair faced repeated regulatory action across the EU for pre-selecting travel
|
|
213
|
+
insurance and priority boarding options during checkout. The EU Consumer Rights
|
|
214
|
+
Directive (Article 22) explicitly requires that pre-ticked checkboxes resulting in
|
|
215
|
+
additional payments are prohibited. The EU Digital Services Act reinforces this. In
|
|
216
|
+
the US, the FTC treats sneak-into-basket as a deceptive trade practice.
|
|
217
|
+
|
|
218
|
+
**The fix:**
|
|
219
|
+
All paid add-ons must default to unchecked. The user must take an affirmative action
|
|
220
|
+
to opt in. Show a clear price breakdown before final purchase confirmation.
|
|
221
|
+
|
|
222
|
+
```html
|
|
223
|
+
<!-- ETHICAL: Opt-in add-on -->
|
|
224
|
+
<label>
|
|
225
|
+
<input type="checkbox"> Add travel insurance (+$29.99)
|
|
226
|
+
</label>
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**Detection rule:**
|
|
230
|
+
If a checkout flow contains a `<input type="checkbox" checked>` or equivalent
|
|
231
|
+
default-on toggle for any item that costs money, this is AP-04.
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
### AP-05: Hidden Costs
|
|
236
|
+
|
|
237
|
+
**Also known as:** Drip pricing, fee creep, sticker-shock checkout
|
|
238
|
+
**Frequency:** Very Common
|
|
239
|
+
**Severity:** High
|
|
240
|
+
**Detection difficulty:** Moderate
|
|
241
|
+
|
|
242
|
+
**What it looks like:**
|
|
243
|
+
The advertised price is low, but service fees, processing fees, facility charges,
|
|
244
|
+
"convenience" fees, taxes, and surcharges appear only at the final checkout step --
|
|
245
|
+
after the user has invested time selecting options and entering information.
|
|
246
|
+
|
|
247
|
+
```
|
|
248
|
+
Advertised: Concert ticket — $50.00
|
|
249
|
+
At checkout: Ticket: $50.00
|
|
250
|
+
Service fee: $12.50
|
|
251
|
+
Facility fee: $5.00
|
|
252
|
+
Processing fee: $8.95
|
|
253
|
+
Order fee: $4.55
|
|
254
|
+
────────────────────────
|
|
255
|
+
Total: $81.00
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
**Why developers do it:**
|
|
259
|
+
Lower displayed prices attract more initial clicks. By the time hidden fees appear,
|
|
260
|
+
the user has invested "sunk cost" (time selecting seats, entering info) and is less
|
|
261
|
+
likely to abandon. This is a textbook exploitation of the sunk cost fallacy.
|
|
262
|
+
|
|
263
|
+
**What goes wrong:**
|
|
264
|
+
Ticketmaster and Live Nation have faced continuous regulatory scrutiny and class-action
|
|
265
|
+
lawsuits over drip pricing. The FTC proposed a rule in 2023 specifically targeting
|
|
266
|
+
"junk fees" and hidden costs. Multiple US states have passed drip-pricing laws. The
|
|
267
|
+
practice destroys trust: a 2019 Princeton/University of Chicago study found hidden
|
|
268
|
+
costs on 10% of 11,000 e-commerce sites surveyed.
|
|
269
|
+
|
|
270
|
+
**The fix:**
|
|
271
|
+
Show the total price (including all mandatory fees) from the first moment a price is
|
|
272
|
+
displayed. If fees vary, show a price range or estimate. Display an itemized breakdown
|
|
273
|
+
but never hide mandatory costs until checkout.
|
|
274
|
+
|
|
275
|
+
**Detection rule:**
|
|
276
|
+
If mandatory fees (service fees, processing fees, facility charges) are not displayed
|
|
277
|
+
alongside the initially advertised price but appear only at checkout, this is AP-05.
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
### AP-06: Privacy Zuckering
|
|
282
|
+
|
|
283
|
+
**Also known as:** Consent dark pattern, over-permissioning, data grab
|
|
284
|
+
**Frequency:** Very Common
|
|
285
|
+
**Severity:** Critical
|
|
286
|
+
**Detection difficulty:** Hard
|
|
287
|
+
|
|
288
|
+
**What it looks like:**
|
|
289
|
+
The interface is designed to trick users into sharing more personal data than they
|
|
290
|
+
intended. Privacy-invasive defaults are pre-selected. The "Accept All" button is large
|
|
291
|
+
and colorful; "Manage Preferences" is a small gray link. Consent dialogs use confusing
|
|
292
|
+
language or double negatives. The privacy policy is written to be incomprehensible.
|
|
293
|
+
|
|
294
|
+
```html
|
|
295
|
+
<!-- DARK PATTERN: Asymmetric consent dialog -->
|
|
296
|
+
<button class="btn-primary btn-xl">Accept All Cookies</button>
|
|
297
|
+
<a class="text-xs text-gray-400 underline" href="/manage">
|
|
298
|
+
Manage preferences
|
|
299
|
+
</a>
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Why developers do it:**
|
|
303
|
+
More user data means better ad targeting, higher ad revenue, richer analytics, and
|
|
304
|
+
more valuable data assets. Making privacy controls hard to find or use ensures that
|
|
305
|
+
the vast majority of users accept maximum data collection.
|
|
306
|
+
|
|
307
|
+
**What goes wrong:**
|
|
308
|
+
The term "Privacy Zuckering" was coined after Facebook's (now Meta's) repeated pattern
|
|
309
|
+
of defaulting users into maximum data sharing. Meta has faced billions of dollars in
|
|
310
|
+
GDPR fines across the EU. In January 2023, Ireland's Data Protection Commission fined
|
|
311
|
+
Meta 390 million euros for GDPR violations related to how consent was obtained. The
|
|
312
|
+
California Privacy Protection Agency (CPPA) issued enforcement guidance in September
|
|
313
|
+
2024 specifically identifying asymmetric cookie banners as dark patterns that violate
|
|
314
|
+
the CCPA. Under GDPR, consent obtained through dark patterns is not valid consent.
|
|
315
|
+
|
|
316
|
+
**The fix:**
|
|
317
|
+
Present accept and reject options with equal visual prominence. Default to minimum
|
|
318
|
+
data collection. Use clear, plain language. Provide a single-click "Reject All"
|
|
319
|
+
that is as prominent as "Accept All."
|
|
320
|
+
|
|
321
|
+
```html
|
|
322
|
+
<!-- ETHICAL: Symmetric consent -->
|
|
323
|
+
<button class="btn-primary">Accept All</button>
|
|
324
|
+
<button class="btn-primary">Reject All</button>
|
|
325
|
+
<button class="btn-secondary">Customize</button>
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
**Detection rule:**
|
|
329
|
+
If "Accept" and "Reject/Decline" options for data collection differ in size, color,
|
|
330
|
+
prominence, or number of clicks required, this is AP-06. Also flag if there is no
|
|
331
|
+
"Reject All" button at parity with "Accept All."
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
### AP-07: Trick Questions
|
|
336
|
+
|
|
337
|
+
**Also known as:** Confusing opt-in/opt-out, double negative consent, inverted checkbox
|
|
338
|
+
**Frequency:** Common
|
|
339
|
+
**Severity:** High
|
|
340
|
+
**Detection difficulty:** Moderate
|
|
341
|
+
|
|
342
|
+
**What it looks like:**
|
|
343
|
+
The opt-in/opt-out checkbox is worded so that checking it means the opposite of what
|
|
344
|
+
users expect. Double negatives make it unclear whether checking the box grants or
|
|
345
|
+
denies permission. Different checkboxes use inconsistent logic on the same page.
|
|
346
|
+
|
|
347
|
+
```html
|
|
348
|
+
<!-- DARK PATTERN: Inverted opt-out -->
|
|
349
|
+
<label>
|
|
350
|
+
<input type="checkbox">
|
|
351
|
+
Uncheck this box if you prefer not to not receive our emails
|
|
352
|
+
</label>
|
|
353
|
+
|
|
354
|
+
<!-- DARK PATTERN: Mixed logic -->
|
|
355
|
+
<label>
|
|
356
|
+
<input type="checkbox" checked> Send me special offers (opt-in)
|
|
357
|
+
</label>
|
|
358
|
+
<label>
|
|
359
|
+
<input type="checkbox"> Do NOT share my data with partners (opt-out)
|
|
360
|
+
</label>
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
**Why developers do it:**
|
|
364
|
+
Confusing wording inflates opt-in rates. Marketing teams get to report higher
|
|
365
|
+
"consent" numbers. The intentional confusion creates plausible deniability: "The
|
|
366
|
+
option was there -- they just didn't read it carefully."
|
|
367
|
+
|
|
368
|
+
**What goes wrong:**
|
|
369
|
+
The CCPA/CPRA explicitly defines dark patterns to include interfaces that "subvert or
|
|
370
|
+
impair user autonomy, decisionmaking, or choice." Trick questions are a textbook
|
|
371
|
+
example cited in the CPPA's 2024 enforcement advisory. Under GDPR, consent must be
|
|
372
|
+
"freely given, specific, informed and unambiguous" -- trick questions fail every one
|
|
373
|
+
of those tests, rendering the consent legally void.
|
|
374
|
+
|
|
375
|
+
**The fix:**
|
|
376
|
+
Use affirmative, single-positive language. Every checkbox should mean the same thing:
|
|
377
|
+
checked = yes, unchecked = no. Never use double negatives. All checkboxes on the same
|
|
378
|
+
form should follow the same logic direction.
|
|
379
|
+
|
|
380
|
+
**Detection rule:**
|
|
381
|
+
If a checkbox label contains a negation ("not," "don't," "un-") or a double negative,
|
|
382
|
+
this is AP-07. Also flag if checkboxes on the same form use inconsistent logic
|
|
383
|
+
(some opt-in, some opt-out).
|
|
384
|
+
|
|
385
|
+
---
|
|
386
|
+
|
|
387
|
+
### AP-08: Misdirection
|
|
388
|
+
|
|
389
|
+
**Also known as:** Visual manipulation, attention diversion, decoy prominence
|
|
390
|
+
**Frequency:** Common
|
|
391
|
+
**Severity:** High
|
|
392
|
+
**Detection difficulty:** Moderate
|
|
393
|
+
|
|
394
|
+
**What it looks like:**
|
|
395
|
+
The interface uses visual hierarchy, color, size, and placement to draw attention to
|
|
396
|
+
the option the business wants the user to choose, while making the user-beneficial
|
|
397
|
+
option visually recessive. The "Upgrade" button is large and green; the "Keep current
|
|
398
|
+
plan" link is small gray text. The dialog is designed so that the eye naturally falls
|
|
399
|
+
on the desired action.
|
|
400
|
+
|
|
401
|
+
```html
|
|
402
|
+
<!-- DARK PATTERN: Visual misdirection -->
|
|
403
|
+
<div class="upgrade-dialog">
|
|
404
|
+
<h2>Upgrade to Premium!</h2>
|
|
405
|
+
<button class="btn-green btn-xl shadow-lg animate-pulse">
|
|
406
|
+
Upgrade Now - $9.99/mo
|
|
407
|
+
</button>
|
|
408
|
+
<p class="text-xs text-gray-300 mt-4">
|
|
409
|
+
<a href="/dismiss">keep free plan</a>
|
|
410
|
+
</p>
|
|
411
|
+
</div>
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
**Why developers do it:**
|
|
415
|
+
Growth teams optimize for conversion. Making the revenue-generating option visually
|
|
416
|
+
dominant is an easy win. The technique is subtle enough that it often passes design
|
|
417
|
+
review without being flagged as manipulative.
|
|
418
|
+
|
|
419
|
+
**What goes wrong:**
|
|
420
|
+
When misdirection crosses from "good UX hierarchy" into manipulation, it violates
|
|
421
|
+
the DSA Article 25 prohibition on designs that "distort or impair the ability of
|
|
422
|
+
recipients to make autonomous and informed choices." The line is crossed when the
|
|
423
|
+
less profitable option is deliberately hidden or made to look like it is not a real
|
|
424
|
+
option. Microsoft faced backlash and regulatory complaints when its Windows 10
|
|
425
|
+
upgrade prompt was redesigned so that clicking the X button (which users understood
|
|
426
|
+
as "dismiss/close") instead initiated the upgrade.
|
|
427
|
+
|
|
428
|
+
**The fix:**
|
|
429
|
+
Both options must be clearly visible and accessible. The user-beneficial option
|
|
430
|
+
(keep current plan, dismiss, decline) must be a real button, not a tiny link. Visual
|
|
431
|
+
hierarchy can highlight a recommended option, but the alternative must be equally
|
|
432
|
+
discoverable.
|
|
433
|
+
|
|
434
|
+
**Detection rule:**
|
|
435
|
+
If the business-beneficial option is a large styled button and the user-beneficial
|
|
436
|
+
option is unstyled inline text, a tiny link, or positioned where it appears to be
|
|
437
|
+
decorative text rather than an actionable choice, this is AP-08.
|
|
438
|
+
|
|
439
|
+
---
|
|
440
|
+
|
|
441
|
+
### AP-09: Urgency and Scarcity Manipulation
|
|
442
|
+
|
|
443
|
+
**Also known as:** Fake timers, phantom stock, FOMO manufacturing, artificial scarcity
|
|
444
|
+
**Frequency:** Very Common
|
|
445
|
+
**Severity:** High
|
|
446
|
+
**Detection difficulty:** Moderate
|
|
447
|
+
|
|
448
|
+
**What it looks like:**
|
|
449
|
+
Countdown timers that reset when they expire. "Only 2 left in stock!" messages that
|
|
450
|
+
never change. "5 other people are looking at this right now" notifications that are
|
|
451
|
+
fabricated or inflated. "Deal ends in 00:14:32" clocks that are not tied to any real
|
|
452
|
+
deadline.
|
|
453
|
+
|
|
454
|
+
```javascript
|
|
455
|
+
// DARK PATTERN: Fake urgency timer that resets
|
|
456
|
+
function startTimer() {
|
|
457
|
+
let seconds = 900; // 15 minutes
|
|
458
|
+
setInterval(() => {
|
|
459
|
+
seconds--;
|
|
460
|
+
if (seconds <= 0) seconds = 900; // Reset silently
|
|
461
|
+
display(seconds);
|
|
462
|
+
}, 1000);
|
|
463
|
+
}
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
**Why developers do it:**
|
|
467
|
+
Urgency and scarcity are powerful psychological triggers. They exploit loss aversion
|
|
468
|
+
-- the fear of missing out (FOMO) is stronger than the desire to gain. Even a 5%
|
|
469
|
+
conversion lift from a fake timer looks compelling in an A/B test dashboard.
|
|
470
|
+
|
|
471
|
+
**What goes wrong:**
|
|
472
|
+
Booking.com has faced sustained regulatory pressure from the Dutch consumer
|
|
473
|
+
organization Consumentenbond for fake scarcity messaging ("Only 1 room left!"),
|
|
474
|
+
fabricated social proof ("5 others are looking"), and fake discounts. The EU Digital
|
|
475
|
+
Services Act explicitly targets "practices that create a false impression of urgency"
|
|
476
|
+
in its dark pattern prohibition. Under the proposed EU Digital Fairness Act (expected
|
|
477
|
+
mid-2026), platforms must prove that urgency messages reflect actual availability or
|
|
478
|
+
face fines. Research shows that while fake urgency temporarily boosts conversions,
|
|
479
|
+
it causes lasting trust damage when users discover the deception.
|
|
480
|
+
|
|
481
|
+
**The fix:**
|
|
482
|
+
Only display urgency or scarcity information that is factually accurate and
|
|
483
|
+
dynamically tied to real data. If stock is genuinely low, show it. If there is a real
|
|
484
|
+
deadline, show it. Never fabricate or inflate these signals.
|
|
485
|
+
|
|
486
|
+
```javascript
|
|
487
|
+
// ETHICAL: Real stock count from inventory API
|
|
488
|
+
async function showStock(productId) {
|
|
489
|
+
const { count } = await inventory.getStock(productId);
|
|
490
|
+
if (count <= 5 && count > 0) {
|
|
491
|
+
display(`Only ${count} left in stock`);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
**Detection rule:**
|
|
497
|
+
If a countdown timer resets, loops, or is initialized from a hardcoded value rather
|
|
498
|
+
than a real deadline from a backend API, this is AP-09. If stock/availability messages
|
|
499
|
+
use hardcoded values or random numbers, this is AP-09.
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
### AP-10: Obstruction
|
|
504
|
+
|
|
505
|
+
**Also known as:** Cancellation maze, support runaround, process friction
|
|
506
|
+
**Frequency:** Very Common
|
|
507
|
+
**Severity:** Critical
|
|
508
|
+
**Detection difficulty:** Moderate
|
|
509
|
+
|
|
510
|
+
**What it looks like:**
|
|
511
|
+
A process that should be simple is deliberately complicated with unnecessary steps,
|
|
512
|
+
required phone calls, long hold times, confusing navigation, or requirements to
|
|
513
|
+
contact support via specific channels during limited hours. This is the generalized
|
|
514
|
+
form of the Roach Motel (AP-02) applied beyond subscriptions: deleting an account,
|
|
515
|
+
requesting a data export, submitting a refund, opting out of data sharing.
|
|
516
|
+
|
|
517
|
+
**Why developers do it:**
|
|
518
|
+
Each friction point reduces the completion rate of the undesirable action (from the
|
|
519
|
+
business perspective). A cancellation flow with 7 steps has a lower completion rate
|
|
520
|
+
than one with 2 steps, purely from drop-off at each step.
|
|
521
|
+
|
|
522
|
+
**What goes wrong:**
|
|
523
|
+
Vonage's $100 million FTC settlement (2022) was specifically about obstruction: the
|
|
524
|
+
company forced customers to cancel only by calling a "retention agent" on the phone,
|
|
525
|
+
then reduced the cancellation line's hours and staffing, creating long waits and
|
|
526
|
+
dropped calls. The FTC found that Vonage continued charging customers even after they
|
|
527
|
+
explicitly requested cancellation. Under the CCPA, businesses must respond to
|
|
528
|
+
consumer data deletion requests without requiring excessive steps; the CPPA's 2024
|
|
529
|
+
enforcement advisory specifically flags multi-step data request flows as dark
|
|
530
|
+
patterns.
|
|
531
|
+
|
|
532
|
+
**The fix:**
|
|
533
|
+
Any user-initiated process (cancel, delete, refund, opt-out, data export) should
|
|
534
|
+
require no more steps than the corresponding sign-up or opt-in process. Provide the
|
|
535
|
+
same channel (web self-service) for exit as for entry. Never require a phone call for
|
|
536
|
+
something that was done online.
|
|
537
|
+
|
|
538
|
+
**Detection rule:**
|
|
539
|
+
If any user-initiated exit process (cancel, delete account, request refund, opt out)
|
|
540
|
+
requires a phone call, postal mail, or more than 3 clicks/screens beyond
|
|
541
|
+
authentication, this is AP-10.
|
|
542
|
+
|
|
543
|
+
---
|
|
544
|
+
|
|
545
|
+
### AP-11: Disguised Ads
|
|
546
|
+
|
|
547
|
+
**Also known as:** Native ad camouflage, fake download buttons, content-ad blending
|
|
548
|
+
**Frequency:** Common
|
|
549
|
+
**Severity:** Medium
|
|
550
|
+
**Detection difficulty:** Easy
|
|
551
|
+
|
|
552
|
+
**What it looks like:**
|
|
553
|
+
Advertisements are designed to look like native content, navigation elements, or
|
|
554
|
+
functional UI components. Fake "Download" buttons on software sites that are actually
|
|
555
|
+
ads. Sponsored content without clear disclosure. Search results where the top entries
|
|
556
|
+
are paid placements indistinguishable from organic results.
|
|
557
|
+
|
|
558
|
+
**Why developers do it:**
|
|
559
|
+
Ads that blend with content get higher click-through rates. Native ad revenue can be
|
|
560
|
+
2-5x higher than clearly labeled ads. The more the ad looks like real content, the
|
|
561
|
+
more clicks it receives.
|
|
562
|
+
|
|
563
|
+
**What goes wrong:**
|
|
564
|
+
The FTC's Endorsement Guides (updated 2023) require clear and conspicuous disclosure
|
|
565
|
+
of material connections and paid promotions. Google was fined 2.42 billion euros by
|
|
566
|
+
the European Commission (2017) for favoring its own shopping ads over organic results.
|
|
567
|
+
The FTC has taken action against advertisers and publishers who blur the line between
|
|
568
|
+
editorial content and paid promotions. Children are especially vulnerable to disguised
|
|
569
|
+
ads, which is why COPPA and the Children's Code impose stricter requirements.
|
|
570
|
+
|
|
571
|
+
**The fix:**
|
|
572
|
+
All advertisements must be clearly labeled with terms like "Ad," "Sponsored," or
|
|
573
|
+
"Promoted." Ad styling must be visually distinct from editorial content. Download
|
|
574
|
+
buttons must only link to the actual download, not to ad redirects.
|
|
575
|
+
|
|
576
|
+
**Detection rule:**
|
|
577
|
+
If an interactive element (button, link, card) is styled to look like native content
|
|
578
|
+
or a functional UI component but actually navigates to a third-party ad, sponsor, or
|
|
579
|
+
affiliate link without visible disclosure adjacent to the element, this is AP-11.
|
|
580
|
+
|
|
581
|
+
---
|
|
582
|
+
|
|
583
|
+
### AP-12: Friend Spam
|
|
584
|
+
|
|
585
|
+
**Also known as:** Contact harvesting, social spam, permission abuse
|
|
586
|
+
**Frequency:** Occasional
|
|
587
|
+
**Severity:** High
|
|
588
|
+
**Detection difficulty:** Moderate
|
|
589
|
+
|
|
590
|
+
**What it looks like:**
|
|
591
|
+
The application requests access to the user's contacts "to find friends on the
|
|
592
|
+
platform," then sends unsolicited messages to every contact -- styled to appear as
|
|
593
|
+
personal messages from the user rather than platform-generated spam.
|
|
594
|
+
|
|
595
|
+
**Why developers do it:**
|
|
596
|
+
Viral growth through contact importation is extremely effective. Messages that appear
|
|
597
|
+
to come from a friend have dramatically higher open and click rates than generic
|
|
598
|
+
marketing. The growth loop of "import contacts, spam them, some sign up, repeat" is
|
|
599
|
+
a core growth hack.
|
|
600
|
+
|
|
601
|
+
**What goes wrong:**
|
|
602
|
+
LinkedIn settled a class-action lawsuit for $13 million over its "Add Connections"
|
|
603
|
+
feature, which spammed users' contacts with messages designed to look like personal
|
|
604
|
+
emails from the user. The court found LinkedIn had exceeded the scope of the
|
|
605
|
+
permission granted. Path, the social network, was fined $800,000 by the FTC in 2013
|
|
606
|
+
for collecting entire address books from users -- including children -- without
|
|
607
|
+
consent. Under CAN-SPAM and GDPR, sending unsolicited commercial messages to contacts
|
|
608
|
+
without their consent violates anti-spam laws.
|
|
609
|
+
|
|
610
|
+
**The fix:**
|
|
611
|
+
If you request contact access, clearly explain exactly what will happen with the data.
|
|
612
|
+
Never send messages to contacts without the user explicitly reviewing and approving
|
|
613
|
+
each message. Default to not sending. Show a preview of the exact message that will
|
|
614
|
+
be sent.
|
|
615
|
+
|
|
616
|
+
**Detection rule:**
|
|
617
|
+
If a "Find Friends" or "Import Contacts" flow sends messages to imported contacts
|
|
618
|
+
without showing the user an explicit preview of the message and requiring per-message
|
|
619
|
+
or per-batch approval, this is AP-12.
|
|
620
|
+
|
|
621
|
+
---
|
|
622
|
+
|
|
623
|
+
### AP-13: Bait and Switch
|
|
624
|
+
|
|
625
|
+
**Also known as:** Promise-and-swap, feature hostage, upgrade trap
|
|
626
|
+
**Frequency:** Common
|
|
627
|
+
**Severity:** High
|
|
628
|
+
**Detection difficulty:** Moderate
|
|
629
|
+
|
|
630
|
+
**What it looks like:**
|
|
631
|
+
The user sets out to do one thing, but the interface redirects them to something
|
|
632
|
+
different. A "free" photo editor lets you spend 20 minutes editing, then demands
|
|
633
|
+
payment to save. A button labeled "Close" actually triggers an action (like installing
|
|
634
|
+
software). An advertised product is "out of stock" but a more expensive alternative
|
|
635
|
+
is conveniently suggested.
|
|
636
|
+
|
|
637
|
+
**Why developers do it:**
|
|
638
|
+
The sunk cost fallacy makes users more likely to pay after investing time. The
|
|
639
|
+
technique generates conversions that would not exist if the true cost or action were
|
|
640
|
+
disclosed upfront. Microsoft famously used this with Windows 10 upgrades: the X
|
|
641
|
+
(close) button on the upgrade nag dialog was changed to mean "accept and schedule
|
|
642
|
+
upgrade" rather than "dismiss," triggering widespread installations users did not
|
|
643
|
+
consent to.
|
|
644
|
+
|
|
645
|
+
**What goes wrong:**
|
|
646
|
+
Microsoft faced a $10,000 legal judgment in 2016 when a user successfully sued after
|
|
647
|
+
an unwanted Windows 10 upgrade disrupted her business. The backlash generated
|
|
648
|
+
sustained negative press coverage and regulatory complaints. The FTC considers bait
|
|
649
|
+
and switch a deceptive trade practice under Section 5 of the FTC Act, with case law
|
|
650
|
+
dating back decades.
|
|
651
|
+
|
|
652
|
+
**The fix:**
|
|
653
|
+
Every interactive element must do exactly what its label says. A close button closes.
|
|
654
|
+
A dismiss button dismisses. If a feature requires payment, state the cost before the
|
|
655
|
+
user invests time using it, not after.
|
|
656
|
+
|
|
657
|
+
**Detection rule:**
|
|
658
|
+
If a button, link, or interactive element performs an action different from what its
|
|
659
|
+
label communicates, or if a "free" feature requires payment to complete the workflow
|
|
660
|
+
the user has already started, this is AP-13.
|
|
661
|
+
|
|
662
|
+
---
|
|
663
|
+
|
|
664
|
+
### AP-14: Nagging
|
|
665
|
+
|
|
666
|
+
**Also known as:** Persistent prompts, dismissal denial, upgrade harassment
|
|
667
|
+
**Frequency:** Very Common
|
|
668
|
+
**Severity:** Medium
|
|
669
|
+
**Detection difficulty:** Easy
|
|
670
|
+
|
|
671
|
+
**What it looks like:**
|
|
672
|
+
The same prompt, dialog, or notification appears repeatedly despite the user
|
|
673
|
+
dismissing it. There is no "Don't ask again" option, or the option exists but does
|
|
674
|
+
not work. The interruption degrades the user experience until the user capitulates.
|
|
675
|
+
|
|
676
|
+
**Why developers do it:**
|
|
677
|
+
Repeated exposure increases conversion. Even a 1% conversion rate on a nagging dialog
|
|
678
|
+
shown 50 times eventually yields results. Product teams measure the aggregate
|
|
679
|
+
conversion from nagging and see it as "free" revenue.
|
|
680
|
+
|
|
681
|
+
**What goes wrong:**
|
|
682
|
+
Microsoft's Windows 10 upgrade nagging campaign (2015-2016) became one of the most
|
|
683
|
+
widely cited examples of nagging as a dark pattern. The system blocked users with
|
|
684
|
+
full-screen upgrade prompts that had no permanent dismissal option, only "Remind me
|
|
685
|
+
later." Windows 10 continued this pattern with "Finish setting up your PC" prompts
|
|
686
|
+
that nagged users to create Microsoft accounts. Mozilla publicly condemned Microsoft
|
|
687
|
+
in 2024 for using dark patterns to push Windows users toward Edge browser, including
|
|
688
|
+
persistent prompts when users attempted to change their default browser.
|
|
689
|
+
|
|
690
|
+
**The fix:**
|
|
691
|
+
Every dismissable prompt must include a "Don't show again" option that permanently
|
|
692
|
+
suppresses it. Respect the user's choice. Limit notification frequency. Never block
|
|
693
|
+
core functionality behind a dismissal-only dialog.
|
|
694
|
+
|
|
695
|
+
**Detection rule:**
|
|
696
|
+
If a dismissable dialog or prompt reappears after the user has dismissed it, and there
|
|
697
|
+
is no permanent "Don't show again" mechanism, this is AP-14. Also flag if a "Don't
|
|
698
|
+
show again" checkbox or option exists but the prompt reappears anyway.
|
|
699
|
+
|
|
700
|
+
---
|
|
701
|
+
|
|
702
|
+
### AP-15: Comparison Prevention
|
|
703
|
+
|
|
704
|
+
**Also known as:** Price obfuscation, feature-matrix confusion, plan incomparability
|
|
705
|
+
**Frequency:** Common
|
|
706
|
+
**Severity:** Medium
|
|
707
|
+
**Detection difficulty:** Hard
|
|
708
|
+
|
|
709
|
+
**What it looks like:**
|
|
710
|
+
Pricing plans are structured so that direct comparison is difficult or impossible.
|
|
711
|
+
Different plans use different billing periods (monthly vs. annual vs. per-seat vs.
|
|
712
|
+
per-usage). Feature names differ across tiers. The pricing page requires selecting
|
|
713
|
+
dates, team sizes, or other parameters before any price is visible. Feature matrices
|
|
714
|
+
are deliberately designed to be confusing.
|
|
715
|
+
|
|
716
|
+
**Why developers do it:**
|
|
717
|
+
When users cannot easily compare, they are more likely to choose the option the
|
|
718
|
+
business wants (usually the most expensive one). Obfuscation prevents the "race to
|
|
719
|
+
the bottom" on price and makes it harder for competitors to undercut.
|
|
720
|
+
|
|
721
|
+
**What goes wrong:**
|
|
722
|
+
Price comparison prevention is one of Harry Brignull's original dark patterns
|
|
723
|
+
documented on deceptive.design. The EU Digital Fairness Act proposal (expected
|
|
724
|
+
mid-2026) will specifically target practices that make comparison difficult. Users
|
|
725
|
+
who discover they overpaid due to deliberate obfuscation file chargebacks, leave
|
|
726
|
+
negative reviews, and churn -- the lifetime value loss exceeds the short-term margin
|
|
727
|
+
gain.
|
|
728
|
+
|
|
729
|
+
**The fix:**
|
|
730
|
+
Display all plans in a single, aligned comparison table with consistent feature names,
|
|
731
|
+
the same billing period, and visible per-unit prices. Make the total cost clear before
|
|
732
|
+
the user has to provide any personal information. Enable rather than prevent informed
|
|
733
|
+
comparison.
|
|
734
|
+
|
|
735
|
+
**Detection rule:**
|
|
736
|
+
If a pricing page requires user input (dates, team size, contact sales) before showing
|
|
737
|
+
any price, or if plan tiers use different billing units that cannot be directly
|
|
738
|
+
compared, this is AP-15.
|
|
739
|
+
|
|
740
|
+
---
|
|
741
|
+
|
|
742
|
+
### AP-16: Default to Most Expensive
|
|
743
|
+
|
|
744
|
+
**Also known as:** Preselected premium, auto-upsell, inflated default
|
|
745
|
+
**Frequency:** Common
|
|
746
|
+
**Severity:** Medium
|
|
747
|
+
**Detection difficulty:** Easy
|
|
748
|
+
|
|
749
|
+
**What it looks like:**
|
|
750
|
+
The most expensive option is pre-selected in a plan chooser, shipping method selector,
|
|
751
|
+
or configuration wizard. The user must actively downgrade to find the cheaper option.
|
|
752
|
+
The default tier is labeled "Recommended" or "Most Popular" regardless of whether it
|
|
753
|
+
matches the user's needs.
|
|
754
|
+
|
|
755
|
+
```html
|
|
756
|
+
<!-- DARK PATTERN: Pre-selected expensive option -->
|
|
757
|
+
<div class="plan selected highlighted">Premium — $49/mo (Recommended!)</div>
|
|
758
|
+
<div class="plan">Standard — $19/mo</div>
|
|
759
|
+
<div class="plan text-muted">Basic — $9/mo</div>
|
|
760
|
+
```
|
|
761
|
+
|
|
762
|
+
**Why developers do it:**
|
|
763
|
+
Defaults are powerful -- research shows 70-90% of users accept defaults. Pre-selecting
|
|
764
|
+
the premium tier dramatically increases average revenue per user. The "Recommended"
|
|
765
|
+
label provides cover for the pre-selection.
|
|
766
|
+
|
|
767
|
+
**What goes wrong:**
|
|
768
|
+
GoDaddy pre-selects paid "Privacy Protection" add-ons when users purchase domain
|
|
769
|
+
names, leading to higher-than-expected charges. While not yet the subject of major
|
|
770
|
+
enforcement, this practice falls clearly within the scope of EU and US dark pattern
|
|
771
|
+
regulations. The FTC's unfairness doctrine applies when material terms are selected
|
|
772
|
+
without the consumer's informed consent.
|
|
773
|
+
|
|
774
|
+
**The fix:**
|
|
775
|
+
Either default to the cheapest option or default to no selection, requiring the user
|
|
776
|
+
to make an active choice. If labeling an option "Recommended," ensure the
|
|
777
|
+
recommendation is based on the user's actual stated needs, not on margin.
|
|
778
|
+
|
|
779
|
+
**Detection rule:**
|
|
780
|
+
If a plan selector, shipping method, or configuration option defaults to the most
|
|
781
|
+
expensive choice without the user having provided any information about their needs,
|
|
782
|
+
this is AP-16.
|
|
783
|
+
|
|
784
|
+
---
|
|
785
|
+
|
|
786
|
+
### AP-17: Emotional Manipulation in Copy
|
|
787
|
+
|
|
788
|
+
**Also known as:** Guilt copy, fear copy, loss-framing, weaponized empathy
|
|
789
|
+
**Frequency:** Common
|
|
790
|
+
**Severity:** Medium
|
|
791
|
+
**Detection difficulty:** Moderate
|
|
792
|
+
|
|
793
|
+
**What it looks like:**
|
|
794
|
+
Interface copy uses emotional pressure beyond simple persuasion: fear of loss ("Your
|
|
795
|
+
account is at risk!"), guilt ("Your team is counting on you"), faked sadness ("We'll
|
|
796
|
+
miss you" with a crying mascot on the cancellation page), or manufactured obligation.
|
|
797
|
+
This is the broader pattern of which confirm shaming (AP-01) is a specific subtype.
|
|
798
|
+
|
|
799
|
+
**Why developers do it:**
|
|
800
|
+
Emotional copy outperforms neutral copy on short-term metrics. A "We'll miss you"
|
|
801
|
+
cancellation page with a sad mascot may reduce cancellation completion by 10-15%.
|
|
802
|
+
Copywriters are incentivized to maximize emotional impact.
|
|
803
|
+
|
|
804
|
+
**What goes wrong:**
|
|
805
|
+
Emotional manipulation in cancellation flows has been cited in multiple FTC complaints.
|
|
806
|
+
When combined with obstruction (AP-10), it becomes a compounding dark pattern that
|
|
807
|
+
regulators treat with heightened scrutiny. Users who feel manipulated share their
|
|
808
|
+
experience on social media, generating negative brand sentiment that persists far
|
|
809
|
+
longer than the retained subscription revenue.
|
|
810
|
+
|
|
811
|
+
**The fix:**
|
|
812
|
+
Use clear, neutral, professional language. It is acceptable to communicate value
|
|
813
|
+
("Here's what you'll lose access to") but not to use guilt, shame, fear, or fake
|
|
814
|
+
emotion to influence the decision. Remove sad mascots, crying emojis, and guilt
|
|
815
|
+
language from exit flows.
|
|
816
|
+
|
|
817
|
+
**Detection rule:**
|
|
818
|
+
If cancellation, unsubscribe, or opt-out flows contain emotional language (sad,
|
|
819
|
+
crying, disappointed, worried, at risk, miss you, counting on you), animated sad
|
|
820
|
+
characters, or guilt-inducing imagery, this is AP-17.
|
|
821
|
+
|
|
822
|
+
---
|
|
823
|
+
|
|
824
|
+
### AP-18: Pre-Selected Options That Cost Money
|
|
825
|
+
|
|
826
|
+
**Also known as:** Opt-out add-ons, default paid extras, consent by inertia
|
|
827
|
+
**Frequency:** Common
|
|
828
|
+
**Severity:** High
|
|
829
|
+
**Detection difficulty:** Easy
|
|
830
|
+
|
|
831
|
+
**What it looks like:**
|
|
832
|
+
Checkboxes for paid services, donations, or upgrades are checked by default during
|
|
833
|
+
signup or checkout. The user must notice and uncheck them to avoid charges. Often the
|
|
834
|
+
checkboxes are placed far from the main flow, below the fold, or in a visually
|
|
835
|
+
de-emphasized area.
|
|
836
|
+
|
|
837
|
+
A notorious example: Ryanair once hid the "No travel insurance" option in a dropdown
|
|
838
|
+
menu between "Latvia" and "Lithuania" in a country selection list, making it nearly
|
|
839
|
+
impossible to find the opt-out.
|
|
840
|
+
|
|
841
|
+
**Why developers do it:**
|
|
842
|
+
Opt-out defaults exploit inertia. Most users do not read every element on a page.
|
|
843
|
+
Pre-checked paid options can generate significant ancillary revenue with minimal
|
|
844
|
+
apparent user resistance.
|
|
845
|
+
|
|
846
|
+
**What goes wrong:**
|
|
847
|
+
The EU Consumer Rights Directive (Article 22) explicitly prohibits pre-ticked
|
|
848
|
+
checkboxes that result in additional payments: "The trader shall seek the express
|
|
849
|
+
consent of the consumer to any extra payment in addition to the remuneration agreed
|
|
850
|
+
upon." Ryanair was forced by the European Commission to change its practices. In the
|
|
851
|
+
US, pre-selected paid options violate FTC guidance on negative option marketing.
|
|
852
|
+
|
|
853
|
+
**The fix:**
|
|
854
|
+
All paid options must default to unchecked/unselected. The user must take affirmative
|
|
855
|
+
action (clicking, tapping, checking) to add any paid item or service. This is not a
|
|
856
|
+
recommendation -- it is a legal requirement in the EU and an enforceable standard in
|
|
857
|
+
the US.
|
|
858
|
+
|
|
859
|
+
**Detection rule:**
|
|
860
|
+
If any checkbox, toggle, or radio button that results in a monetary charge is in a
|
|
861
|
+
selected/checked state by default, this is AP-18. No exceptions.
|
|
862
|
+
|
|
863
|
+
---
|
|
864
|
+
|
|
865
|
+
### AP-19: Disguised Data Collection
|
|
866
|
+
|
|
867
|
+
**Also known as:** Dark consent, permission creep, surveillance by default
|
|
868
|
+
**Frequency:** Common
|
|
869
|
+
**Severity:** Critical
|
|
870
|
+
**Detection difficulty:** Very Hard
|
|
871
|
+
|
|
872
|
+
**What it looks like:**
|
|
873
|
+
The application collects data beyond what is needed for the stated purpose, disguised
|
|
874
|
+
as a required step. A flashlight app requests contacts, camera, and location. A
|
|
875
|
+
checkout form asks for birth date and phone number as "required" fields when they are
|
|
876
|
+
not needed for the transaction. Analytics and tracking pixels are loaded without
|
|
877
|
+
disclosure or consent.
|
|
878
|
+
|
|
879
|
+
**Why developers do it:**
|
|
880
|
+
More data enables better targeting, personalization, and monetization. Collecting data
|
|
881
|
+
"while we can" is treated as free option value. Product teams fear that if they ask
|
|
882
|
+
for data later, users will decline.
|
|
883
|
+
|
|
884
|
+
**What goes wrong:**
|
|
885
|
+
Path (social network) was fined $800,000 by the FTC for secretly collecting entire
|
|
886
|
+
address books from users' mobile devices without consent. Google was fined 50 million
|
|
887
|
+
euros by France's CNIL under GDPR for lack of transparency in data collection. Under
|
|
888
|
+
GDPR's data minimization principle (Article 5(1)(c)), collecting data beyond what is
|
|
889
|
+
necessary for the stated purpose is illegal. The CCPA requires businesses to disclose
|
|
890
|
+
at the point of collection what data is being collected and why.
|
|
891
|
+
|
|
892
|
+
**The fix:**
|
|
893
|
+
Collect only the data necessary for the stated function. Mark truly optional fields
|
|
894
|
+
as "Optional." Never mark data as "required" unless the feature literally cannot
|
|
895
|
+
function without it. Disclose all tracking and analytics. Obtain informed consent
|
|
896
|
+
before collecting any data beyond the minimum required.
|
|
897
|
+
|
|
898
|
+
**Detection rule:**
|
|
899
|
+
If a form marks fields as "required" that are not necessary for the core function
|
|
900
|
+
(e.g., birth date on a shipping form, phone number on a digital download), or if the
|
|
901
|
+
app requests device permissions unrelated to its core function, this is AP-19.
|
|
902
|
+
|
|
903
|
+
---
|
|
904
|
+
|
|
905
|
+
### AP-20: Interface Interference
|
|
906
|
+
|
|
907
|
+
**Also known as:** Visual manipulation, action ambiguity, toggleware
|
|
908
|
+
**Frequency:** Common
|
|
909
|
+
**Severity:** High
|
|
910
|
+
**Detection difficulty:** Moderate
|
|
911
|
+
|
|
912
|
+
**What it looks like:**
|
|
913
|
+
The interface deliberately makes it ambiguous which option does what. Toggle switches
|
|
914
|
+
where "on" and "off" states are visually indistinguishable. Buttons that change
|
|
915
|
+
position between screens so muscle memory causes the user to click the wrong one.
|
|
916
|
+
Dialogs where "Yes" and "No" are swapped from the standard OS convention. Tiny close
|
|
917
|
+
buttons on overlays.
|
|
918
|
+
|
|
919
|
+
```html
|
|
920
|
+
<!-- DARK PATTERN: Ambiguous toggle -->
|
|
921
|
+
<div class="toggle">
|
|
922
|
+
<span class="gray">Share data</span>
|
|
923
|
+
<!-- Is this on or off? The gray color is ambiguous -->
|
|
924
|
+
<div class="toggle-track bg-gray-400">
|
|
925
|
+
<div class="toggle-thumb" style="left: 0"></div>
|
|
926
|
+
</div>
|
|
927
|
+
</div>
|
|
928
|
+
```
|
|
929
|
+
|
|
930
|
+
**Why developers do it:**
|
|
931
|
+
Ambiguity benefits the default (which is usually the business-preferred option). If
|
|
932
|
+
users cannot tell whether they have opted in or out, they tend to leave the setting
|
|
933
|
+
as-is, which is typically the privacy-invasive or revenue-generating default.
|
|
934
|
+
|
|
935
|
+
**What goes wrong:**
|
|
936
|
+
The Mathur et al. study (Princeton/University of Chicago, 2019) identified "interface
|
|
937
|
+
interference" as one of the five high-level categories of dark patterns across 11,000
|
|
938
|
+
websites. The EU Digital Services Act Article 25 specifically prohibits practices that
|
|
939
|
+
"give more prominence to certain choices" or make "the procedure for terminating a
|
|
940
|
+
service more difficult than subscribing to it." GDPR enforcement bodies have fined
|
|
941
|
+
companies for consent interfaces where the opt-out state was visually
|
|
942
|
+
indistinguishable from the opt-in state.
|
|
943
|
+
|
|
944
|
+
**The fix:**
|
|
945
|
+
Use clear visual states for all toggles and controls. On/off, yes/no, and opt-in/
|
|
946
|
+
opt-out must be unambiguous. Follow platform conventions for button placement (e.g.,
|
|
947
|
+
primary action on the right on web, left on iOS). Use color, labels, and icons
|
|
948
|
+
together -- never rely on a single visual cue.
|
|
949
|
+
|
|
950
|
+
**Detection rule:**
|
|
951
|
+
If toggle switches lack clear on/off labels, if button positions are inconsistent
|
|
952
|
+
between related screens, or if the visual difference between two states of a control
|
|
953
|
+
requires careful inspection to distinguish, this is AP-20.
|
|
954
|
+
|
|
955
|
+
---
|
|
956
|
+
|
|
957
|
+
## Root Cause Analysis
|
|
958
|
+
|
|
959
|
+
| Anti-Pattern | Root Cause | Prevention |
|
|
960
|
+
|-------------|------------|------------|
|
|
961
|
+
| AP-01: Confirm Shaming | Growth team optimizing for conversion without ethical review | Require copy review for all opt-out language; ban self-deprecating decline text |
|
|
962
|
+
| AP-02: Roach Motel | Retention KPIs that reward friction over value | Enforce symmetry: cancellation steps <= signup steps |
|
|
963
|
+
| AP-03: Forced Continuity | Subscription metrics that reward silent conversions | Mandate pre-charge notifications; show billing terms at signup |
|
|
964
|
+
| AP-04: Sneak into Basket | Ancillary revenue targets incentivize stealth add-ons | Default all paid options to unchecked; require affirmative action |
|
|
965
|
+
| AP-05: Hidden Costs | Low displayed prices win in competitive comparison | Show total price from first display; include all mandatory fees |
|
|
966
|
+
| AP-06: Privacy Zuckering | Data collection maximized for ad targeting/monetization | Symmetric consent UIs; reject-all at parity with accept-all |
|
|
967
|
+
| AP-07: Trick Questions | Marketing inflates consent numbers through confusion | Single-positive language only; consistent checkbox logic |
|
|
968
|
+
| AP-08: Misdirection | Conversion optimization treats user attention as a resource to exploit | Both options must be real buttons with adequate visual weight |
|
|
969
|
+
| AP-09: Urgency/Scarcity Manipulation | Short-term conversion pressure from growth targets | Only display factually accurate, API-driven urgency data |
|
|
970
|
+
| AP-10: Obstruction | Retention economics reward friction in exit flows | Channel symmetry: exit via same method as entry |
|
|
971
|
+
| AP-11: Disguised Ads | Native ad revenue dramatically exceeds labeled ad revenue | Clear "Ad" labels; visually distinct ad styling |
|
|
972
|
+
| AP-12: Friend Spam | Viral growth metrics incentivize contact exploitation | Explicit per-message approval; preview before send |
|
|
973
|
+
| AP-13: Bait and Switch | Sunk cost exploitation drives post-investment conversion | Disclose all costs before user invests time |
|
|
974
|
+
| AP-14: Nagging | Aggregate conversion from repeated prompts appears "free" | Permanent "Don't show again" option; respect dismissal |
|
|
975
|
+
| AP-15: Comparison Prevention | Price obfuscation protects margins from informed comparison | Aligned comparison tables; same billing units across tiers |
|
|
976
|
+
| AP-16: Default to Most Expensive | Default acceptance rates (70-90%) directly increase ARPU | Default to cheapest or no selection |
|
|
977
|
+
| AP-17: Emotional Manipulation | Emotional copy outperforms neutral copy on short-term metrics | Neutral professional language in all exit flows |
|
|
978
|
+
| AP-18: Pre-Selected Paid Options | Opt-out defaults exploit user inertia for ancillary revenue | All paid items default to unselected (EU law requires this) |
|
|
979
|
+
| AP-19: Disguised Data Collection | "Collect now, use later" treated as free option value | Data minimization; only required fields marked required |
|
|
980
|
+
| AP-20: Interface Interference | Ambiguity benefits the business-preferred default | Clear visual states; platform conventions; labels + color + icons |
|
|
981
|
+
|
|
982
|
+
### Underlying Drivers
|
|
983
|
+
|
|
984
|
+
The root causes above share three structural drivers:
|
|
985
|
+
|
|
986
|
+
1. **Metric misalignment** -- When teams are measured on conversion rate, retention
|
|
987
|
+
rate, or data collected, without a countervailing metric for user trust, ethical
|
|
988
|
+
compliance, or regulatory risk, dark patterns become the "rational" optimization.
|
|
989
|
+
|
|
990
|
+
2. **Asymmetric A/B testing** -- Dark patterns almost always "win" A/B tests on
|
|
991
|
+
short-term metrics. The damage (brand erosion, regulatory fines, churn from
|
|
992
|
+
resentment) is not captured in the test's time horizon.
|
|
993
|
+
|
|
994
|
+
3. **Diffusion of responsibility** -- The PM writes the spec, the designer creates
|
|
995
|
+
the mock, the developer implements it, the QA verifies it works. No single person
|
|
996
|
+
owns the ethical evaluation. An AI agent asked to implement a dark pattern is often
|
|
997
|
+
the last checkpoint before it ships.
|
|
998
|
+
|
|
999
|
+
---
|
|
1000
|
+
|
|
1001
|
+
## Self-Check Questions
|
|
1002
|
+
|
|
1003
|
+
An AI agent should ask these questions before implementing any user-facing flow:
|
|
1004
|
+
|
|
1005
|
+
1. **Symmetry test:** Is the exit path (cancel, unsubscribe, delete) as simple as
|
|
1006
|
+
the entry path (subscribe, sign up, create)?
|
|
1007
|
+
2. **Neutral language test:** If I read the opt-out copy aloud, does it sound
|
|
1008
|
+
manipulative, guilt-tripping, or condescending?
|
|
1009
|
+
3. **Prominence test:** Are both the accept and decline options visible, clearly
|
|
1010
|
+
labeled, and of comparable visual weight?
|
|
1011
|
+
4. **Default test:** Do any pre-selected options result in the user spending money
|
|
1012
|
+
or sharing data they did not explicitly choose to?
|
|
1013
|
+
5. **Transparency test:** Are all costs, fees, and charges visible from the moment a
|
|
1014
|
+
price is first displayed, or are some revealed only at checkout?
|
|
1015
|
+
6. **Consent test:** Is consent obtained through clear affirmative action, or through
|
|
1016
|
+
confusing language, pre-checked boxes, or double negatives?
|
|
1017
|
+
7. **Urgency test:** Are timers, stock counts, and scarcity messages driven by real
|
|
1018
|
+
backend data, or are they hardcoded/fabricated?
|
|
1019
|
+
8. **Data minimization test:** Is every "required" field actually needed for the
|
|
1020
|
+
function to work, or are some collecting data beyond what is necessary?
|
|
1021
|
+
9. **Persistence test:** Does a dismissed prompt stay dismissed, or does it reappear?
|
|
1022
|
+
Is there a permanent opt-out?
|
|
1023
|
+
10. **Channel symmetry test:** Can the user accomplish the exit action through the same
|
|
1024
|
+
channel (web, app) they used for the entry action, or are they forced to call,
|
|
1025
|
+
email, or mail?
|
|
1026
|
+
11. **Label accuracy test:** Does every button, link, and control do exactly what its
|
|
1027
|
+
label says it does?
|
|
1028
|
+
12. **Comparison test:** Can a user compare all available options (plans, pricing,
|
|
1029
|
+
features) in a single view with consistent units?
|
|
1030
|
+
13. **Contact permission test:** If the app requests access to contacts, does it show
|
|
1031
|
+
the user exactly what will be sent before sending anything?
|
|
1032
|
+
14. **Emotional neutrality test:** Does the cancellation or opt-out flow use
|
|
1033
|
+
emotional language, sad imagery, or guilt-inducing copy?
|
|
1034
|
+
15. **Toggle clarity test:** Can a user immediately tell whether a toggle or checkbox
|
|
1035
|
+
is in its on or off state without careful inspection?
|
|
1036
|
+
|
|
1037
|
+
---
|
|
1038
|
+
|
|
1039
|
+
## Code Smell Quick Reference
|
|
1040
|
+
|
|
1041
|
+
| If you see... | Suspect... | Verify... |
|
|
1042
|
+
|---------------|-----------|-----------|
|
|
1043
|
+
| Opt-out text containing "I don't want to," "No thanks, I prefer to," or self-deprecating language | AP-01: Confirm Shaming | Does the decline copy shame the user for their choice? |
|
|
1044
|
+
| Cancellation flow with 4+ screens/steps | AP-02: Roach Motel | Compare step count with signup flow; flag if cancel > 2x signup |
|
|
1045
|
+
| Payment info collected for "free trial" without visible post-trial price and date | AP-03: Forced Continuity | Are billing terms shown in the same visual block as the signup CTA? |
|
|
1046
|
+
| `<input type="checkbox" checked>` for any paid add-on | AP-04/AP-18: Sneak into Basket / Pre-Selected Paid | Does the default-checked item cost money? |
|
|
1047
|
+
| Mandatory fees appearing only at the final checkout step | AP-05: Hidden Costs | Is the total price (all fees included) shown from first display? |
|
|
1048
|
+
| "Accept All" as a large button, "Reject" as a small link | AP-06: Privacy Zuckering | Are accept and reject at visual parity? |
|
|
1049
|
+
| Checkbox labels containing "not," "un-," or double negatives | AP-07: Trick Questions | Is the checkbox logic clear and single-positive? |
|
|
1050
|
+
| Primary CTA is a large styled button, alternative is unstyled tiny text | AP-08: Misdirection | Is the user-beneficial option a real, visible button? |
|
|
1051
|
+
| Countdown timer initialized from hardcoded value, not API | AP-09: Urgency Manipulation | Does the timer reset? Is it connected to a real deadline? |
|
|
1052
|
+
| Cancellation requiring phone call, mail, or different channel than signup | AP-10: Obstruction | Can the user exit through the same channel they entered? |
|
|
1053
|
+
| Clickable elements styled as content without "Ad" or "Sponsored" label | AP-11: Disguised Ads | Is ad content clearly distinguishable from editorial content? |
|
|
1054
|
+
| "Import contacts" flow that sends messages without per-message preview | AP-12: Friend Spam | Does the user approve the exact message before it is sent? |
|
|
1055
|
+
| Close/dismiss button that triggers an action instead of dismissing | AP-13: Bait and Switch | Does every button do exactly what its label says? |
|
|
1056
|
+
| Dismissed dialog reappearing with no permanent suppress option | AP-14: Nagging | Is there a working "Don't show again" mechanism? |
|
|
1057
|
+
| Pricing page requiring input before showing any price | AP-15: Comparison Prevention | Can all plans be compared in a single view? |
|
|
1058
|
+
| Most expensive plan pre-selected in a plan chooser | AP-16: Default to Most Expensive | Is the default selection based on user needs or margin? |
|
|
1059
|
+
| Sad mascots, crying emojis, or guilt language in exit flows | AP-17: Emotional Manipulation | Is the exit flow copy emotionally neutral? |
|
|
1060
|
+
| Form marking birthday, phone as "required" for a digital download | AP-19: Disguised Data Collection | Is every required field necessary for the core function? |
|
|
1061
|
+
| Toggle switch with ambiguous on/off visual state | AP-20: Interface Interference | Can the user immediately tell the toggle state? |
|
|
1062
|
+
|
|
1063
|
+
---
|
|
1064
|
+
|
|
1065
|
+
## Regulatory Landscape Summary
|
|
1066
|
+
|
|
1067
|
+
| Jurisdiction | Law/Regulation | Dark Pattern Provisions | Penalties |
|
|
1068
|
+
|-------------|---------------|------------------------|-----------|
|
|
1069
|
+
| **US (Federal)** | FTC Act Section 5, ROSCA | Deceptive and unfair trade practices; dark patterns in subscriptions | Civil penalties per violation; consent decrees (Vonage: $100M, Epic: $245M) |
|
|
1070
|
+
| **US (Federal)** | FTC Click-to-Cancel Rule (2024) | Cancellation must be as easy as signup (vacated by 8th Circuit July 2025, but FTC can still enforce under Section 5 and ROSCA) | Civil penalties |
|
|
1071
|
+
| **US (California)** | CCPA/CPRA | Dark patterns defined as interfaces that "subvert or impair user autonomy"; consent obtained via dark patterns is void | $2,500 per violation; $7,500 per intentional violation |
|
|
1072
|
+
| **US (Colorado)** | CPA | Consent obtained via dark patterns is not valid consent | AG enforcement |
|
|
1073
|
+
| **US (Virginia)** | VCDPA | Similar to CCPA dark pattern provisions | AG enforcement |
|
|
1074
|
+
| **EU** | Digital Services Act (Art. 25) | Prohibits designs that "distort or impair autonomy, decision-making, or choice" | Up to 6% of global annual revenue |
|
|
1075
|
+
| **EU** | Consumer Rights Directive (Art. 22) | Pre-ticked checkboxes for additional payments prohibited | Member state enforcement |
|
|
1076
|
+
| **EU** | GDPR | Consent must be freely given, specific, informed, unambiguous; dark pattern consent is void | Up to 4% of global annual revenue or 20M euros |
|
|
1077
|
+
| **EU** | Digital Fairness Act (proposed, ~2026) | Expanded dark pattern prohibitions; platforms must prove urgency claims are factual | TBD |
|
|
1078
|
+
| **India** | Consumer Protection Act (2019) + Guidelines | Dark patterns guidelines issued 2023; 13 categories of prohibited dark patterns | Penalties under consumer protection law |
|
|
1079
|
+
|
|
1080
|
+
---
|
|
1081
|
+
|
|
1082
|
+
## Agent Behavioral Protocol
|
|
1083
|
+
|
|
1084
|
+
When an AI agent identifies a dark pattern in a specification, design, or code it is
|
|
1085
|
+
asked to implement, it should follow this protocol:
|
|
1086
|
+
|
|
1087
|
+
```
|
|
1088
|
+
1. IDENTIFY — Name the specific dark pattern (AP-01 through AP-20)
|
|
1089
|
+
2. CITE — Reference the regulatory risk (FTC, DSA, CCPA, GDPR)
|
|
1090
|
+
3. REFUSE — Decline to implement the manipulative element
|
|
1091
|
+
4. PROPOSE — Offer an ethical alternative that achieves the legitimate
|
|
1092
|
+
business goal without deception
|
|
1093
|
+
5. ESCALATE — If the requester insists, note that implementation would
|
|
1094
|
+
create legal liability and recommend legal review
|
|
1095
|
+
```
|
|
1096
|
+
|
|
1097
|
+
Example agent response:
|
|
1098
|
+
|
|
1099
|
+
> "This specification asks me to implement a cancellation flow with 7 steps including
|
|
1100
|
+
> a required phone call. This matches AP-02 (Roach Motel) and AP-10 (Obstruction).
|
|
1101
|
+
> The FTC fined Vonage $100 million for a similar pattern, and sued Amazon over its
|
|
1102
|
+
> 'Iliad' cancellation flow. I recommend a 2-step cancellation flow with an optional
|
|
1103
|
+
> retention survey. I cannot implement the requested flow as specified."
|
|
1104
|
+
|
|
1105
|
+
---
|
|
1106
|
+
|
|
1107
|
+
*Researched: 2026-03-08 | Sources: FTC enforcement actions (Amazon, Vonage, Epic Games, Adobe), EU Digital Services Act Article 25, CCPA/CPRA dark pattern definitions, CPPA Enforcement Advisory (September 2024), Harry Brignull / deceptive.design taxonomy, Mathur et al. (Princeton/UChicago, 2019) study of 11,000 websites, EU Consumer Rights Directive Article 22, GDPR Articles 5-7, LinkedIn $13M class-action settlement, FTC Click-to-Cancel Rule (October 2024)*
|
|
1108
|
+
|
|
1109
|
+
Sources:
|
|
1110
|
+
- [FTC Action Against Vonage — $100 Million Settlement](https://www.ftc.gov/news-events/news/press-releases/2022/11/ftc-action-against-vonage-results-100-million-customers-trapped-illegal-dark-patterns-junk-fees-when-trying-cancel-service)
|
|
1111
|
+
- [FTC v. Amazon (ROSCA) — Prime Dark Patterns Complaint](https://www.ftc.gov/legal-library/browse/cases-proceedings/2123050-amazoncom-inc-rosca-ftc-v)
|
|
1112
|
+
- [FTC Action Against Adobe — Hidden Fees and Cancellation Barriers](https://www.ftc.gov/news-events/news/press-releases/2024/06/ftc-takes-action-against-adobe-executives-hiding-fees-preventing-consumers-easily-cancelling)
|
|
1113
|
+
- [FTC v. Epic Games — $245 Million Dark Patterns Settlement](https://www.ftc.gov/business-guidance/blog/2022/12/245-million-ftc-settlement-alleges-fortnite-owner-epic-games-used-digital-dark-patterns-charge)
|
|
1114
|
+
- [CPPA Enforcement Advisory on Dark Patterns (September 2024)](https://cppa.ca.gov/announcements/2024/20240904.html)
|
|
1115
|
+
- [EU Digital Services Act — Dark Pattern Prohibition](https://digital-strategy.ec.europa.eu/en/policies/digital-services-act)
|
|
1116
|
+
- [Deceptive Patterns (Harry Brignull) — Taxonomy and Case Database](https://www.deceptive.design/)
|
|
1117
|
+
- [LinkedIn $13M Dark Patterns Settlement — Friend Spam](https://www.fastcompany.com/3051906/after-lawsuit-settlement-linkedins-dishonest-design-is-now-a-13-million-problem)
|
|
1118
|
+
- [Dark Patterns Lawsuits and FTC Click-to-Cancel Rule](https://www.coulsonpc.com/coulson-pc-blog/dark-patterns-ftc-click-to-cancel-rule)
|
|
1119
|
+
- [EU Regulating Dark Patterns — Towards Digital Fairness](https://www.europarl.europa.eu/RegData/etudes/ATAG/2025/767191/EPRS_ATA(2025)767191_EN.pdf)
|
|
1120
|
+
- [Dark Patterns on Booking.com — Manipulation Tactics](https://behavioralinsight.substack.com/p/dark-patterns-on-bookingcom-manipulation)
|
|
1121
|
+
- [2024 Most Notable FTC Actions Against Dark Patterns](https://www.goodwinlaw.com/en/news-and-events/news/2024/12/announcements-finance-fs-2024-most-notable-ftc-actions-against-dark-patterns-and-ai)
|