@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.
Files changed (629) hide show
  1. package/AGENTS.md +111 -0
  2. package/CHANGELOG.md +14 -0
  3. package/CONTRIBUTING.md +101 -0
  4. package/LICENSE +21 -0
  5. package/README.md +314 -0
  6. package/assets/composition-engine.mmd +34 -0
  7. package/assets/demo-script.sh +17 -0
  8. package/assets/logo-dark.svg +14 -0
  9. package/assets/logo.svg +14 -0
  10. package/assets/pipeline.mmd +39 -0
  11. package/assets/record-demo.sh +51 -0
  12. package/docs/README.md +51 -0
  13. package/docs/adapters/context-mode.md +60 -0
  14. package/docs/concepts/architecture.md +87 -0
  15. package/docs/concepts/artifact-model.md +60 -0
  16. package/docs/concepts/composition-engine.md +36 -0
  17. package/docs/concepts/indexing-and-recall.md +160 -0
  18. package/docs/concepts/observability.md +41 -0
  19. package/docs/concepts/roles-and-workflows.md +59 -0
  20. package/docs/concepts/terminology-policy.md +27 -0
  21. package/docs/getting-started/01-installation.md +78 -0
  22. package/docs/getting-started/02-first-run.md +102 -0
  23. package/docs/getting-started/03-adding-to-project.md +15 -0
  24. package/docs/getting-started/04-host-setup.md +15 -0
  25. package/docs/guides/ci-integration.md +15 -0
  26. package/docs/guides/creating-skills.md +15 -0
  27. package/docs/guides/expertise-module-authoring.md +15 -0
  28. package/docs/guides/hook-development.md +15 -0
  29. package/docs/guides/memory-and-learnings.md +34 -0
  30. package/docs/guides/multi-host-export.md +15 -0
  31. package/docs/guides/troubleshooting.md +101 -0
  32. package/docs/guides/writing-custom-roles.md +15 -0
  33. package/docs/plans/2026-03-15-cli-pipeline-integration-design.md +592 -0
  34. package/docs/plans/2026-03-15-cli-pipeline-integration-plan.md +598 -0
  35. package/docs/plans/2026-03-15-docs-enforcement-plan.md +238 -0
  36. package/docs/readmes/INDEX.md +99 -0
  37. package/docs/readmes/features/expertise/README.md +171 -0
  38. package/docs/readmes/features/exports/README.md +222 -0
  39. package/docs/readmes/features/hooks/README.md +103 -0
  40. package/docs/readmes/features/hooks/loop-cap-guard.md +133 -0
  41. package/docs/readmes/features/hooks/post-tool-capture.md +121 -0
  42. package/docs/readmes/features/hooks/post-tool-lint.md +130 -0
  43. package/docs/readmes/features/hooks/pre-compact-summary.md +122 -0
  44. package/docs/readmes/features/hooks/pre-tool-capture-route.md +100 -0
  45. package/docs/readmes/features/hooks/protected-path-write-guard.md +128 -0
  46. package/docs/readmes/features/hooks/session-start.md +119 -0
  47. package/docs/readmes/features/hooks/stop-handoff-harvest.md +125 -0
  48. package/docs/readmes/features/roles/README.md +157 -0
  49. package/docs/readmes/features/roles/clarifier.md +152 -0
  50. package/docs/readmes/features/roles/content-author.md +190 -0
  51. package/docs/readmes/features/roles/designer.md +193 -0
  52. package/docs/readmes/features/roles/executor.md +184 -0
  53. package/docs/readmes/features/roles/learner.md +210 -0
  54. package/docs/readmes/features/roles/planner.md +182 -0
  55. package/docs/readmes/features/roles/researcher.md +164 -0
  56. package/docs/readmes/features/roles/reviewer.md +184 -0
  57. package/docs/readmes/features/roles/specifier.md +162 -0
  58. package/docs/readmes/features/roles/verifier.md +215 -0
  59. package/docs/readmes/features/schemas/README.md +178 -0
  60. package/docs/readmes/features/skills/README.md +63 -0
  61. package/docs/readmes/features/skills/brainstorming.md +96 -0
  62. package/docs/readmes/features/skills/debugging.md +148 -0
  63. package/docs/readmes/features/skills/design.md +120 -0
  64. package/docs/readmes/features/skills/prepare-next.md +109 -0
  65. package/docs/readmes/features/skills/run-audit.md +159 -0
  66. package/docs/readmes/features/skills/scan-project.md +109 -0
  67. package/docs/readmes/features/skills/self-audit.md +176 -0
  68. package/docs/readmes/features/skills/tdd.md +137 -0
  69. package/docs/readmes/features/skills/using-skills.md +92 -0
  70. package/docs/readmes/features/skills/verification.md +120 -0
  71. package/docs/readmes/features/skills/writing-plans.md +104 -0
  72. package/docs/readmes/features/tooling/README.md +320 -0
  73. package/docs/readmes/features/workflows/README.md +186 -0
  74. package/docs/readmes/features/workflows/author.md +181 -0
  75. package/docs/readmes/features/workflows/clarify.md +154 -0
  76. package/docs/readmes/features/workflows/design-review.md +171 -0
  77. package/docs/readmes/features/workflows/design.md +169 -0
  78. package/docs/readmes/features/workflows/discover.md +162 -0
  79. package/docs/readmes/features/workflows/execute.md +173 -0
  80. package/docs/readmes/features/workflows/learn.md +167 -0
  81. package/docs/readmes/features/workflows/plan-review.md +165 -0
  82. package/docs/readmes/features/workflows/plan.md +170 -0
  83. package/docs/readmes/features/workflows/prepare-next.md +167 -0
  84. package/docs/readmes/features/workflows/review.md +169 -0
  85. package/docs/readmes/features/workflows/run-audit.md +191 -0
  86. package/docs/readmes/features/workflows/spec-challenge.md +159 -0
  87. package/docs/readmes/features/workflows/specify.md +160 -0
  88. package/docs/readmes/features/workflows/verify.md +177 -0
  89. package/docs/readmes/packages/README.md +50 -0
  90. package/docs/readmes/packages/ajv.md +117 -0
  91. package/docs/readmes/packages/context-mode.md +118 -0
  92. package/docs/readmes/packages/gray-matter.md +116 -0
  93. package/docs/readmes/packages/node-test.md +137 -0
  94. package/docs/readmes/packages/yaml.md +112 -0
  95. package/docs/reference/configuration-reference.md +159 -0
  96. package/docs/reference/expertise-index.md +52 -0
  97. package/docs/reference/git-flow.md +43 -0
  98. package/docs/reference/hooks.md +87 -0
  99. package/docs/reference/host-exports.md +50 -0
  100. package/docs/reference/launch-checklist.md +172 -0
  101. package/docs/reference/marketplace-listings.md +76 -0
  102. package/docs/reference/release-process.md +34 -0
  103. package/docs/reference/roles-reference.md +77 -0
  104. package/docs/reference/skills.md +33 -0
  105. package/docs/reference/templates.md +29 -0
  106. package/docs/reference/tooling-cli.md +94 -0
  107. package/docs/truth-claims.yaml +222 -0
  108. package/expertise/PROGRESS.md +63 -0
  109. package/expertise/README.md +18 -0
  110. package/expertise/antipatterns/PROGRESS.md +56 -0
  111. package/expertise/antipatterns/backend/api-design-antipatterns.md +1271 -0
  112. package/expertise/antipatterns/backend/auth-antipatterns.md +1195 -0
  113. package/expertise/antipatterns/backend/caching-antipatterns.md +622 -0
  114. package/expertise/antipatterns/backend/database-antipatterns.md +1038 -0
  115. package/expertise/antipatterns/backend/index.md +24 -0
  116. package/expertise/antipatterns/backend/microservices-antipatterns.md +850 -0
  117. package/expertise/antipatterns/code/architecture-antipatterns.md +919 -0
  118. package/expertise/antipatterns/code/async-antipatterns.md +622 -0
  119. package/expertise/antipatterns/code/code-smells.md +1186 -0
  120. package/expertise/antipatterns/code/dependency-antipatterns.md +1209 -0
  121. package/expertise/antipatterns/code/error-handling-antipatterns.md +1360 -0
  122. package/expertise/antipatterns/code/index.md +27 -0
  123. package/expertise/antipatterns/code/naming-and-abstraction.md +1118 -0
  124. package/expertise/antipatterns/code/state-management-antipatterns.md +1076 -0
  125. package/expertise/antipatterns/code/testing-antipatterns.md +1053 -0
  126. package/expertise/antipatterns/design/accessibility-antipatterns.md +1136 -0
  127. package/expertise/antipatterns/design/dark-patterns.md +1121 -0
  128. package/expertise/antipatterns/design/index.md +22 -0
  129. package/expertise/antipatterns/design/ui-antipatterns.md +1202 -0
  130. package/expertise/antipatterns/design/ux-antipatterns.md +680 -0
  131. package/expertise/antipatterns/frontend/css-layout-antipatterns.md +691 -0
  132. package/expertise/antipatterns/frontend/flutter-antipatterns.md +1827 -0
  133. package/expertise/antipatterns/frontend/index.md +23 -0
  134. package/expertise/antipatterns/frontend/mobile-antipatterns.md +573 -0
  135. package/expertise/antipatterns/frontend/react-antipatterns.md +1128 -0
  136. package/expertise/antipatterns/frontend/spa-antipatterns.md +1235 -0
  137. package/expertise/antipatterns/index.md +31 -0
  138. package/expertise/antipatterns/performance/index.md +20 -0
  139. package/expertise/antipatterns/performance/performance-antipatterns.md +1013 -0
  140. package/expertise/antipatterns/performance/premature-optimization.md +623 -0
  141. package/expertise/antipatterns/performance/scaling-antipatterns.md +785 -0
  142. package/expertise/antipatterns/process/ai-coding-antipatterns.md +853 -0
  143. package/expertise/antipatterns/process/code-review-antipatterns.md +656 -0
  144. package/expertise/antipatterns/process/deployment-antipatterns.md +920 -0
  145. package/expertise/antipatterns/process/index.md +23 -0
  146. package/expertise/antipatterns/process/technical-debt-antipatterns.md +647 -0
  147. package/expertise/antipatterns/security/index.md +20 -0
  148. package/expertise/antipatterns/security/secrets-antipatterns.md +849 -0
  149. package/expertise/antipatterns/security/security-theater.md +843 -0
  150. package/expertise/antipatterns/security/vulnerability-patterns.md +801 -0
  151. package/expertise/architecture/PROGRESS.md +70 -0
  152. package/expertise/architecture/data/caching-architecture.md +671 -0
  153. package/expertise/architecture/data/data-consistency.md +574 -0
  154. package/expertise/architecture/data/data-modeling.md +536 -0
  155. package/expertise/architecture/data/event-streams-and-queues.md +634 -0
  156. package/expertise/architecture/data/index.md +25 -0
  157. package/expertise/architecture/data/search-architecture.md +663 -0
  158. package/expertise/architecture/data/sql-vs-nosql.md +708 -0
  159. package/expertise/architecture/decisions/architecture-decision-records.md +640 -0
  160. package/expertise/architecture/decisions/build-vs-buy.md +616 -0
  161. package/expertise/architecture/decisions/index.md +23 -0
  162. package/expertise/architecture/decisions/monolith-to-microservices.md +790 -0
  163. package/expertise/architecture/decisions/technology-selection.md +616 -0
  164. package/expertise/architecture/distributed/cap-theorem-and-tradeoffs.md +800 -0
  165. package/expertise/architecture/distributed/circuit-breaker-bulkhead.md +741 -0
  166. package/expertise/architecture/distributed/consensus-and-coordination.md +796 -0
  167. package/expertise/architecture/distributed/distributed-systems-fundamentals.md +564 -0
  168. package/expertise/architecture/distributed/idempotency-and-retry.md +796 -0
  169. package/expertise/architecture/distributed/index.md +25 -0
  170. package/expertise/architecture/distributed/saga-pattern.md +797 -0
  171. package/expertise/architecture/foundations/architectural-thinking.md +460 -0
  172. package/expertise/architecture/foundations/coupling-and-cohesion.md +770 -0
  173. package/expertise/architecture/foundations/design-principles-solid.md +649 -0
  174. package/expertise/architecture/foundations/domain-driven-design.md +719 -0
  175. package/expertise/architecture/foundations/index.md +25 -0
  176. package/expertise/architecture/foundations/separation-of-concerns.md +472 -0
  177. package/expertise/architecture/foundations/twelve-factor-app.md +797 -0
  178. package/expertise/architecture/index.md +34 -0
  179. package/expertise/architecture/integration/api-design-graphql.md +638 -0
  180. package/expertise/architecture/integration/api-design-grpc.md +804 -0
  181. package/expertise/architecture/integration/api-design-rest.md +892 -0
  182. package/expertise/architecture/integration/index.md +25 -0
  183. package/expertise/architecture/integration/third-party-integration.md +795 -0
  184. package/expertise/architecture/integration/webhooks-and-callbacks.md +1152 -0
  185. package/expertise/architecture/integration/websockets-realtime.md +791 -0
  186. package/expertise/architecture/mobile-architecture/index.md +22 -0
  187. package/expertise/architecture/mobile-architecture/mobile-app-architecture.md +780 -0
  188. package/expertise/architecture/mobile-architecture/mobile-backend-for-frontend.md +670 -0
  189. package/expertise/architecture/mobile-architecture/offline-first.md +719 -0
  190. package/expertise/architecture/mobile-architecture/push-and-sync.md +782 -0
  191. package/expertise/architecture/patterns/cqrs-event-sourcing.md +717 -0
  192. package/expertise/architecture/patterns/event-driven.md +797 -0
  193. package/expertise/architecture/patterns/hexagonal-clean-architecture.md +870 -0
  194. package/expertise/architecture/patterns/index.md +27 -0
  195. package/expertise/architecture/patterns/layered-architecture.md +736 -0
  196. package/expertise/architecture/patterns/microservices.md +753 -0
  197. package/expertise/architecture/patterns/modular-monolith.md +692 -0
  198. package/expertise/architecture/patterns/monolith.md +626 -0
  199. package/expertise/architecture/patterns/plugin-architecture.md +735 -0
  200. package/expertise/architecture/patterns/serverless.md +780 -0
  201. package/expertise/architecture/scaling/database-scaling.md +615 -0
  202. package/expertise/architecture/scaling/feature-flags-and-rollouts.md +757 -0
  203. package/expertise/architecture/scaling/horizontal-vs-vertical.md +606 -0
  204. package/expertise/architecture/scaling/index.md +24 -0
  205. package/expertise/architecture/scaling/multi-tenancy.md +800 -0
  206. package/expertise/architecture/scaling/stateless-design.md +787 -0
  207. package/expertise/backend/embedded-firmware.md +625 -0
  208. package/expertise/backend/go.md +853 -0
  209. package/expertise/backend/index.md +24 -0
  210. package/expertise/backend/java-spring.md +448 -0
  211. package/expertise/backend/node-typescript.md +625 -0
  212. package/expertise/backend/python-fastapi.md +724 -0
  213. package/expertise/backend/rust.md +458 -0
  214. package/expertise/backend/solidity.md +711 -0
  215. package/expertise/composition-map.yaml +443 -0
  216. package/expertise/content/foundations/content-modeling.md +395 -0
  217. package/expertise/content/foundations/editorial-standards.md +449 -0
  218. package/expertise/content/foundations/index.md +24 -0
  219. package/expertise/content/foundations/microcopy.md +455 -0
  220. package/expertise/content/foundations/terminology-governance.md +509 -0
  221. package/expertise/content/index.md +34 -0
  222. package/expertise/content/patterns/accessibility-copy.md +518 -0
  223. package/expertise/content/patterns/index.md +24 -0
  224. package/expertise/content/patterns/notification-content.md +433 -0
  225. package/expertise/content/patterns/sample-content.md +486 -0
  226. package/expertise/content/patterns/state-copy.md +439 -0
  227. package/expertise/design/PROGRESS.md +58 -0
  228. package/expertise/design/disciplines/dark-mode-theming.md +577 -0
  229. package/expertise/design/disciplines/design-systems.md +595 -0
  230. package/expertise/design/disciplines/index.md +25 -0
  231. package/expertise/design/disciplines/information-architecture.md +800 -0
  232. package/expertise/design/disciplines/interaction-design.md +788 -0
  233. package/expertise/design/disciplines/responsive-design.md +552 -0
  234. package/expertise/design/disciplines/usability-testing.md +516 -0
  235. package/expertise/design/disciplines/user-research.md +792 -0
  236. package/expertise/design/foundations/accessibility-design.md +796 -0
  237. package/expertise/design/foundations/color-theory.md +797 -0
  238. package/expertise/design/foundations/iconography.md +795 -0
  239. package/expertise/design/foundations/index.md +26 -0
  240. package/expertise/design/foundations/motion-and-animation.md +653 -0
  241. package/expertise/design/foundations/rtl-design.md +585 -0
  242. package/expertise/design/foundations/spacing-and-layout.md +607 -0
  243. package/expertise/design/foundations/typography.md +800 -0
  244. package/expertise/design/foundations/visual-hierarchy.md +761 -0
  245. package/expertise/design/index.md +32 -0
  246. package/expertise/design/patterns/authentication-flows.md +474 -0
  247. package/expertise/design/patterns/content-consumption.md +789 -0
  248. package/expertise/design/patterns/data-display.md +618 -0
  249. package/expertise/design/patterns/e-commerce.md +1494 -0
  250. package/expertise/design/patterns/feedback-and-states.md +642 -0
  251. package/expertise/design/patterns/forms-and-input.md +819 -0
  252. package/expertise/design/patterns/gamification.md +801 -0
  253. package/expertise/design/patterns/index.md +31 -0
  254. package/expertise/design/patterns/microinteractions.md +449 -0
  255. package/expertise/design/patterns/navigation.md +800 -0
  256. package/expertise/design/patterns/notifications.md +705 -0
  257. package/expertise/design/patterns/onboarding.md +700 -0
  258. package/expertise/design/patterns/search-and-filter.md +601 -0
  259. package/expertise/design/patterns/settings-and-preferences.md +768 -0
  260. package/expertise/design/patterns/social-and-community.md +748 -0
  261. package/expertise/design/platforms/desktop-native.md +612 -0
  262. package/expertise/design/platforms/index.md +25 -0
  263. package/expertise/design/platforms/mobile-android.md +825 -0
  264. package/expertise/design/platforms/mobile-cross-platform.md +983 -0
  265. package/expertise/design/platforms/mobile-ios.md +699 -0
  266. package/expertise/design/platforms/tablet.md +794 -0
  267. package/expertise/design/platforms/web-dashboard.md +790 -0
  268. package/expertise/design/platforms/web-responsive.md +550 -0
  269. package/expertise/design/psychology/behavioral-nudges.md +449 -0
  270. package/expertise/design/psychology/cognitive-load.md +1191 -0
  271. package/expertise/design/psychology/error-psychology.md +778 -0
  272. package/expertise/design/psychology/index.md +22 -0
  273. package/expertise/design/psychology/persuasive-design.md +736 -0
  274. package/expertise/design/psychology/user-mental-models.md +623 -0
  275. package/expertise/design/tooling/open-pencil.md +266 -0
  276. package/expertise/frontend/angular.md +1073 -0
  277. package/expertise/frontend/desktop-electron.md +546 -0
  278. package/expertise/frontend/flutter.md +782 -0
  279. package/expertise/frontend/index.md +27 -0
  280. package/expertise/frontend/native-android.md +409 -0
  281. package/expertise/frontend/native-ios.md +490 -0
  282. package/expertise/frontend/react-native.md +1160 -0
  283. package/expertise/frontend/react.md +808 -0
  284. package/expertise/frontend/vue.md +1089 -0
  285. package/expertise/humanize/domain-rules-code.md +79 -0
  286. package/expertise/humanize/domain-rules-content.md +67 -0
  287. package/expertise/humanize/domain-rules-technical-docs.md +56 -0
  288. package/expertise/humanize/index.md +35 -0
  289. package/expertise/humanize/self-audit-checklist.md +87 -0
  290. package/expertise/humanize/sentence-patterns.md +218 -0
  291. package/expertise/humanize/vocabulary-blacklist.md +105 -0
  292. package/expertise/i18n/PROGRESS.md +65 -0
  293. package/expertise/i18n/advanced/accessibility-and-i18n.md +28 -0
  294. package/expertise/i18n/advanced/bidirectional-text-algorithm.md +38 -0
  295. package/expertise/i18n/advanced/complex-scripts.md +30 -0
  296. package/expertise/i18n/advanced/performance-and-i18n.md +27 -0
  297. package/expertise/i18n/advanced/testing-i18n.md +28 -0
  298. package/expertise/i18n/content/content-adaptation.md +23 -0
  299. package/expertise/i18n/content/locale-specific-formatting.md +23 -0
  300. package/expertise/i18n/content/machine-translation-integration.md +28 -0
  301. package/expertise/i18n/content/translation-management.md +29 -0
  302. package/expertise/i18n/foundations/date-time-calendars.md +67 -0
  303. package/expertise/i18n/foundations/i18n-architecture.md +272 -0
  304. package/expertise/i18n/foundations/locale-and-language-tags.md +79 -0
  305. package/expertise/i18n/foundations/numbers-currency-units.md +61 -0
  306. package/expertise/i18n/foundations/pluralization-and-gender.md +109 -0
  307. package/expertise/i18n/foundations/string-externalization.md +236 -0
  308. package/expertise/i18n/foundations/text-direction-bidi.md +241 -0
  309. package/expertise/i18n/foundations/unicode-and-encoding.md +86 -0
  310. package/expertise/i18n/index.md +38 -0
  311. package/expertise/i18n/platform/backend-i18n.md +31 -0
  312. package/expertise/i18n/platform/flutter-i18n.md +148 -0
  313. package/expertise/i18n/platform/native-android-i18n.md +36 -0
  314. package/expertise/i18n/platform/native-ios-i18n.md +36 -0
  315. package/expertise/i18n/platform/react-i18n.md +103 -0
  316. package/expertise/i18n/platform/web-css-i18n.md +81 -0
  317. package/expertise/i18n/rtl/arabic-specific.md +175 -0
  318. package/expertise/i18n/rtl/hebrew-specific.md +149 -0
  319. package/expertise/i18n/rtl/rtl-animations-and-transitions.md +111 -0
  320. package/expertise/i18n/rtl/rtl-forms-and-input.md +161 -0
  321. package/expertise/i18n/rtl/rtl-fundamentals.md +211 -0
  322. package/expertise/i18n/rtl/rtl-icons-and-images.md +181 -0
  323. package/expertise/i18n/rtl/rtl-layout-mirroring.md +252 -0
  324. package/expertise/i18n/rtl/rtl-navigation-and-gestures.md +107 -0
  325. package/expertise/i18n/rtl/rtl-testing-and-qa.md +147 -0
  326. package/expertise/i18n/rtl/rtl-typography.md +160 -0
  327. package/expertise/index.md +113 -0
  328. package/expertise/index.yaml +216 -0
  329. package/expertise/infrastructure/cloud-aws.md +597 -0
  330. package/expertise/infrastructure/cloud-gcp.md +599 -0
  331. package/expertise/infrastructure/cybersecurity.md +816 -0
  332. package/expertise/infrastructure/database-mongodb.md +447 -0
  333. package/expertise/infrastructure/database-postgres.md +400 -0
  334. package/expertise/infrastructure/devops-cicd.md +787 -0
  335. package/expertise/infrastructure/index.md +27 -0
  336. package/expertise/performance/PROGRESS.md +50 -0
  337. package/expertise/performance/backend/api-latency.md +1204 -0
  338. package/expertise/performance/backend/background-jobs.md +506 -0
  339. package/expertise/performance/backend/connection-pooling.md +1209 -0
  340. package/expertise/performance/backend/database-query-optimization.md +515 -0
  341. package/expertise/performance/backend/index.md +23 -0
  342. package/expertise/performance/backend/rate-limiting-and-throttling.md +971 -0
  343. package/expertise/performance/foundations/algorithmic-complexity.md +954 -0
  344. package/expertise/performance/foundations/caching-strategies.md +489 -0
  345. package/expertise/performance/foundations/concurrency-and-parallelism.md +847 -0
  346. package/expertise/performance/foundations/index.md +24 -0
  347. package/expertise/performance/foundations/measuring-and-profiling.md +440 -0
  348. package/expertise/performance/foundations/memory-management.md +964 -0
  349. package/expertise/performance/foundations/performance-budgets.md +1314 -0
  350. package/expertise/performance/index.md +31 -0
  351. package/expertise/performance/infrastructure/auto-scaling.md +1059 -0
  352. package/expertise/performance/infrastructure/cdn-and-edge.md +1081 -0
  353. package/expertise/performance/infrastructure/index.md +22 -0
  354. package/expertise/performance/infrastructure/load-balancing.md +1081 -0
  355. package/expertise/performance/infrastructure/observability.md +1079 -0
  356. package/expertise/performance/mobile/index.md +23 -0
  357. package/expertise/performance/mobile/mobile-animations.md +544 -0
  358. package/expertise/performance/mobile/mobile-memory-battery.md +416 -0
  359. package/expertise/performance/mobile/mobile-network.md +452 -0
  360. package/expertise/performance/mobile/mobile-rendering.md +599 -0
  361. package/expertise/performance/mobile/mobile-startup-time.md +505 -0
  362. package/expertise/performance/platform-specific/flutter-performance.md +647 -0
  363. package/expertise/performance/platform-specific/index.md +22 -0
  364. package/expertise/performance/platform-specific/node-performance.md +1307 -0
  365. package/expertise/performance/platform-specific/postgres-performance.md +1366 -0
  366. package/expertise/performance/platform-specific/react-performance.md +1403 -0
  367. package/expertise/performance/web/bundle-optimization.md +1239 -0
  368. package/expertise/performance/web/image-and-media.md +636 -0
  369. package/expertise/performance/web/index.md +24 -0
  370. package/expertise/performance/web/network-optimization.md +1133 -0
  371. package/expertise/performance/web/rendering-performance.md +1098 -0
  372. package/expertise/performance/web/ssr-and-hydration.md +918 -0
  373. package/expertise/performance/web/web-vitals.md +1374 -0
  374. package/expertise/quality/accessibility.md +985 -0
  375. package/expertise/quality/evidence-based-verification.md +499 -0
  376. package/expertise/quality/index.md +24 -0
  377. package/expertise/quality/ml-model-audit.md +614 -0
  378. package/expertise/quality/performance.md +600 -0
  379. package/expertise/quality/testing-api.md +891 -0
  380. package/expertise/quality/testing-mobile.md +496 -0
  381. package/expertise/quality/testing-web.md +849 -0
  382. package/expertise/security/PROGRESS.md +54 -0
  383. package/expertise/security/agentic-identity.md +540 -0
  384. package/expertise/security/compliance-frameworks.md +601 -0
  385. package/expertise/security/data/data-encryption.md +364 -0
  386. package/expertise/security/data/data-privacy-gdpr.md +692 -0
  387. package/expertise/security/data/database-security.md +1171 -0
  388. package/expertise/security/data/index.md +22 -0
  389. package/expertise/security/data/pii-handling.md +531 -0
  390. package/expertise/security/foundations/authentication.md +1041 -0
  391. package/expertise/security/foundations/authorization.md +603 -0
  392. package/expertise/security/foundations/cryptography.md +1001 -0
  393. package/expertise/security/foundations/index.md +25 -0
  394. package/expertise/security/foundations/owasp-top-10.md +1354 -0
  395. package/expertise/security/foundations/secrets-management.md +1217 -0
  396. package/expertise/security/foundations/secure-sdlc.md +700 -0
  397. package/expertise/security/foundations/supply-chain-security.md +698 -0
  398. package/expertise/security/index.md +31 -0
  399. package/expertise/security/infrastructure/cloud-security-aws.md +1296 -0
  400. package/expertise/security/infrastructure/cloud-security-gcp.md +1376 -0
  401. package/expertise/security/infrastructure/container-security.md +721 -0
  402. package/expertise/security/infrastructure/incident-response.md +1295 -0
  403. package/expertise/security/infrastructure/index.md +24 -0
  404. package/expertise/security/infrastructure/logging-and-monitoring.md +1618 -0
  405. package/expertise/security/infrastructure/network-security.md +1337 -0
  406. package/expertise/security/mobile/index.md +23 -0
  407. package/expertise/security/mobile/mobile-android-security.md +1218 -0
  408. package/expertise/security/mobile/mobile-binary-protection.md +1229 -0
  409. package/expertise/security/mobile/mobile-data-storage.md +1265 -0
  410. package/expertise/security/mobile/mobile-ios-security.md +1401 -0
  411. package/expertise/security/mobile/mobile-network-security.md +1520 -0
  412. package/expertise/security/smart-contract-security.md +594 -0
  413. package/expertise/security/testing/index.md +22 -0
  414. package/expertise/security/testing/penetration-testing.md +1258 -0
  415. package/expertise/security/testing/security-code-review.md +1765 -0
  416. package/expertise/security/testing/threat-modeling.md +1074 -0
  417. package/expertise/security/testing/vulnerability-scanning.md +1062 -0
  418. package/expertise/security/web/api-security.md +586 -0
  419. package/expertise/security/web/cors-and-headers.md +433 -0
  420. package/expertise/security/web/csrf.md +562 -0
  421. package/expertise/security/web/file-upload.md +1477 -0
  422. package/expertise/security/web/index.md +25 -0
  423. package/expertise/security/web/injection.md +1375 -0
  424. package/expertise/security/web/session-management.md +1101 -0
  425. package/expertise/security/web/xss.md +1158 -0
  426. package/exports/README.md +17 -0
  427. package/exports/hosts/claude/.claude/agents/clarifier.md +42 -0
  428. package/exports/hosts/claude/.claude/agents/content-author.md +63 -0
  429. package/exports/hosts/claude/.claude/agents/designer.md +55 -0
  430. package/exports/hosts/claude/.claude/agents/executor.md +55 -0
  431. package/exports/hosts/claude/.claude/agents/learner.md +51 -0
  432. package/exports/hosts/claude/.claude/agents/planner.md +53 -0
  433. package/exports/hosts/claude/.claude/agents/researcher.md +43 -0
  434. package/exports/hosts/claude/.claude/agents/reviewer.md +54 -0
  435. package/exports/hosts/claude/.claude/agents/specifier.md +47 -0
  436. package/exports/hosts/claude/.claude/agents/verifier.md +71 -0
  437. package/exports/hosts/claude/.claude/commands/author.md +42 -0
  438. package/exports/hosts/claude/.claude/commands/clarify.md +38 -0
  439. package/exports/hosts/claude/.claude/commands/design-review.md +46 -0
  440. package/exports/hosts/claude/.claude/commands/design.md +44 -0
  441. package/exports/hosts/claude/.claude/commands/discover.md +37 -0
  442. package/exports/hosts/claude/.claude/commands/execute.md +48 -0
  443. package/exports/hosts/claude/.claude/commands/learn.md +38 -0
  444. package/exports/hosts/claude/.claude/commands/plan-review.md +42 -0
  445. package/exports/hosts/claude/.claude/commands/plan.md +39 -0
  446. package/exports/hosts/claude/.claude/commands/prepare-next.md +37 -0
  447. package/exports/hosts/claude/.claude/commands/review.md +40 -0
  448. package/exports/hosts/claude/.claude/commands/run-audit.md +41 -0
  449. package/exports/hosts/claude/.claude/commands/spec-challenge.md +41 -0
  450. package/exports/hosts/claude/.claude/commands/specify.md +38 -0
  451. package/exports/hosts/claude/.claude/commands/verify.md +37 -0
  452. package/exports/hosts/claude/.claude/settings.json +34 -0
  453. package/exports/hosts/claude/CLAUDE.md +19 -0
  454. package/exports/hosts/claude/export.manifest.json +38 -0
  455. package/exports/hosts/claude/host-package.json +67 -0
  456. package/exports/hosts/codex/AGENTS.md +19 -0
  457. package/exports/hosts/codex/export.manifest.json +38 -0
  458. package/exports/hosts/codex/host-package.json +41 -0
  459. package/exports/hosts/cursor/.cursor/hooks.json +16 -0
  460. package/exports/hosts/cursor/.cursor/rules/wazir-core.mdc +19 -0
  461. package/exports/hosts/cursor/export.manifest.json +38 -0
  462. package/exports/hosts/cursor/host-package.json +42 -0
  463. package/exports/hosts/gemini/GEMINI.md +19 -0
  464. package/exports/hosts/gemini/export.manifest.json +38 -0
  465. package/exports/hosts/gemini/host-package.json +41 -0
  466. package/hooks/README.md +18 -0
  467. package/hooks/definitions/loop_cap_guard.yaml +21 -0
  468. package/hooks/definitions/post_tool_capture.yaml +24 -0
  469. package/hooks/definitions/pre_compact_summary.yaml +19 -0
  470. package/hooks/definitions/pre_tool_capture_route.yaml +19 -0
  471. package/hooks/definitions/protected_path_write_guard.yaml +19 -0
  472. package/hooks/definitions/session_start.yaml +19 -0
  473. package/hooks/definitions/stop_handoff_harvest.yaml +20 -0
  474. package/hooks/loop-cap-guard +17 -0
  475. package/hooks/post-tool-lint +36 -0
  476. package/hooks/protected-path-write-guard +17 -0
  477. package/hooks/session-start +41 -0
  478. package/llms-full.txt +2355 -0
  479. package/llms.txt +43 -0
  480. package/package.json +79 -0
  481. package/roles/README.md +20 -0
  482. package/roles/clarifier.md +42 -0
  483. package/roles/content-author.md +63 -0
  484. package/roles/designer.md +55 -0
  485. package/roles/executor.md +55 -0
  486. package/roles/learner.md +51 -0
  487. package/roles/planner.md +53 -0
  488. package/roles/researcher.md +43 -0
  489. package/roles/reviewer.md +54 -0
  490. package/roles/specifier.md +47 -0
  491. package/roles/verifier.md +71 -0
  492. package/schemas/README.md +24 -0
  493. package/schemas/accepted-learning.schema.json +20 -0
  494. package/schemas/author-artifact.schema.json +156 -0
  495. package/schemas/clarification.schema.json +19 -0
  496. package/schemas/design-artifact.schema.json +80 -0
  497. package/schemas/docs-claim.schema.json +18 -0
  498. package/schemas/export-manifest.schema.json +20 -0
  499. package/schemas/hook.schema.json +67 -0
  500. package/schemas/host-export-package.schema.json +18 -0
  501. package/schemas/implementation-plan.schema.json +19 -0
  502. package/schemas/proposed-learning.schema.json +19 -0
  503. package/schemas/research.schema.json +18 -0
  504. package/schemas/review.schema.json +29 -0
  505. package/schemas/run-manifest.schema.json +18 -0
  506. package/schemas/spec-challenge.schema.json +18 -0
  507. package/schemas/spec.schema.json +20 -0
  508. package/schemas/usage.schema.json +102 -0
  509. package/schemas/verification-proof.schema.json +29 -0
  510. package/schemas/wazir-manifest.schema.json +173 -0
  511. package/skills/README.md +40 -0
  512. package/skills/brainstorming/SKILL.md +77 -0
  513. package/skills/debugging/SKILL.md +50 -0
  514. package/skills/design/SKILL.md +61 -0
  515. package/skills/dispatching-parallel-agents/SKILL.md +128 -0
  516. package/skills/executing-plans/SKILL.md +70 -0
  517. package/skills/finishing-a-development-branch/SKILL.md +169 -0
  518. package/skills/humanize/SKILL.md +123 -0
  519. package/skills/init-pipeline/SKILL.md +124 -0
  520. package/skills/prepare-next/SKILL.md +20 -0
  521. package/skills/receiving-code-review/SKILL.md +123 -0
  522. package/skills/requesting-code-review/SKILL.md +105 -0
  523. package/skills/requesting-code-review/code-reviewer.md +108 -0
  524. package/skills/run-audit/SKILL.md +197 -0
  525. package/skills/scan-project/SKILL.md +41 -0
  526. package/skills/self-audit/SKILL.md +153 -0
  527. package/skills/subagent-driven-development/SKILL.md +154 -0
  528. package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
  529. package/skills/subagent-driven-development/implementer-prompt.md +102 -0
  530. package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  531. package/skills/tdd/SKILL.md +23 -0
  532. package/skills/using-git-worktrees/SKILL.md +163 -0
  533. package/skills/using-skills/SKILL.md +95 -0
  534. package/skills/verification/SKILL.md +22 -0
  535. package/skills/wazir/SKILL.md +463 -0
  536. package/skills/writing-plans/SKILL.md +30 -0
  537. package/skills/writing-skills/SKILL.md +157 -0
  538. package/skills/writing-skills/anthropic-best-practices.md +122 -0
  539. package/skills/writing-skills/persuasion-principles.md +50 -0
  540. package/templates/README.md +20 -0
  541. package/templates/artifacts/README.md +10 -0
  542. package/templates/artifacts/accepted-learning.md +19 -0
  543. package/templates/artifacts/accepted-learning.template.json +12 -0
  544. package/templates/artifacts/author.md +74 -0
  545. package/templates/artifacts/author.template.json +19 -0
  546. package/templates/artifacts/clarification.md +21 -0
  547. package/templates/artifacts/clarification.template.json +12 -0
  548. package/templates/artifacts/execute-notes.md +19 -0
  549. package/templates/artifacts/implementation-plan.md +21 -0
  550. package/templates/artifacts/implementation-plan.template.json +11 -0
  551. package/templates/artifacts/learning-proposal.md +19 -0
  552. package/templates/artifacts/next-run-handoff.md +21 -0
  553. package/templates/artifacts/plan-review.md +19 -0
  554. package/templates/artifacts/proposed-learning.template.json +12 -0
  555. package/templates/artifacts/research.md +21 -0
  556. package/templates/artifacts/research.template.json +12 -0
  557. package/templates/artifacts/review-findings.md +19 -0
  558. package/templates/artifacts/review.template.json +11 -0
  559. package/templates/artifacts/run-manifest.template.json +8 -0
  560. package/templates/artifacts/spec-challenge.md +19 -0
  561. package/templates/artifacts/spec-challenge.template.json +11 -0
  562. package/templates/artifacts/spec.md +21 -0
  563. package/templates/artifacts/spec.template.json +12 -0
  564. package/templates/artifacts/verification-proof.md +19 -0
  565. package/templates/artifacts/verification-proof.template.json +11 -0
  566. package/templates/examples/accepted-learning.example.json +14 -0
  567. package/templates/examples/author.example.json +152 -0
  568. package/templates/examples/clarification.example.json +15 -0
  569. package/templates/examples/docs-claim.example.json +8 -0
  570. package/templates/examples/export-manifest.example.json +7 -0
  571. package/templates/examples/host-export-package.example.json +11 -0
  572. package/templates/examples/implementation-plan.example.json +17 -0
  573. package/templates/examples/proposed-learning.example.json +13 -0
  574. package/templates/examples/research.example.json +15 -0
  575. package/templates/examples/research.example.md +6 -0
  576. package/templates/examples/review.example.json +17 -0
  577. package/templates/examples/run-manifest.example.json +9 -0
  578. package/templates/examples/spec-challenge.example.json +14 -0
  579. package/templates/examples/spec.example.json +21 -0
  580. package/templates/examples/verification-proof.example.json +21 -0
  581. package/templates/examples/wazir-manifest.example.yaml +65 -0
  582. package/templates/task-definition-schema.md +99 -0
  583. package/tooling/README.md +20 -0
  584. package/tooling/src/adapters/context-mode.js +50 -0
  585. package/tooling/src/capture/command.js +376 -0
  586. package/tooling/src/capture/store.js +99 -0
  587. package/tooling/src/capture/usage.js +270 -0
  588. package/tooling/src/checks/branches.js +50 -0
  589. package/tooling/src/checks/brand-truth.js +110 -0
  590. package/tooling/src/checks/changelog.js +231 -0
  591. package/tooling/src/checks/command-registry.js +36 -0
  592. package/tooling/src/checks/commits.js +102 -0
  593. package/tooling/src/checks/docs-drift.js +103 -0
  594. package/tooling/src/checks/docs-truth.js +201 -0
  595. package/tooling/src/checks/runtime-surface.js +156 -0
  596. package/tooling/src/cli.js +116 -0
  597. package/tooling/src/command-options.js +56 -0
  598. package/tooling/src/commands/validate.js +320 -0
  599. package/tooling/src/doctor/command.js +91 -0
  600. package/tooling/src/export/command.js +77 -0
  601. package/tooling/src/export/compiler.js +498 -0
  602. package/tooling/src/guards/loop-cap-guard.js +52 -0
  603. package/tooling/src/guards/protected-path-write-guard.js +67 -0
  604. package/tooling/src/index/command.js +152 -0
  605. package/tooling/src/index/storage.js +1061 -0
  606. package/tooling/src/index/summarizers.js +261 -0
  607. package/tooling/src/loaders.js +18 -0
  608. package/tooling/src/project-root.js +22 -0
  609. package/tooling/src/recall/command.js +225 -0
  610. package/tooling/src/schema-validator.js +30 -0
  611. package/tooling/src/state-root.js +40 -0
  612. package/tooling/src/status/command.js +71 -0
  613. package/wazir.manifest.yaml +135 -0
  614. package/workflows/README.md +19 -0
  615. package/workflows/author.md +42 -0
  616. package/workflows/clarify.md +38 -0
  617. package/workflows/design-review.md +46 -0
  618. package/workflows/design.md +44 -0
  619. package/workflows/discover.md +37 -0
  620. package/workflows/execute.md +48 -0
  621. package/workflows/learn.md +38 -0
  622. package/workflows/plan-review.md +42 -0
  623. package/workflows/plan.md +39 -0
  624. package/workflows/prepare-next.md +37 -0
  625. package/workflows/review.md +40 -0
  626. package/workflows/run-audit.md +41 -0
  627. package/workflows/spec-challenge.md +41 -0
  628. package/workflows/specify.md +38 -0
  629. 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)