@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,1202 @@
1
+ # UI Design Anti-Patterns
2
+
3
+ > UI anti-patterns are recurring visual and interaction design mistakes that degrade
4
+ > usability, accessibility, and user trust. They are especially dangerous because
5
+ > they often look acceptable in static mockups and only reveal their damage when
6
+ > real users interact with real content on real devices. A single poor contrast
7
+ > ratio can exclude millions of users; a single ambiguous form field cost Expedia
8
+ > $12 million per year in lost revenue.
9
+
10
+ > **Domain:** Design
11
+ > **Anti-patterns covered:** 22
12
+ > **Highest severity:** Critical
13
+
14
+ ---
15
+
16
+ ## Anti-Patterns
17
+
18
+ ### AP-01: Ghost Labels (Placeholder Text as the Only Label)
19
+
20
+ **Also known as:** Disappearing labels, placeholder-only inputs, vanishing hints
21
+ **Frequency:** Very Common
22
+ **Severity:** High
23
+ **Detection difficulty:** Easy
24
+
25
+ **What it looks like:**
26
+ Form inputs use placeholder text inside the field as the sole label. When users
27
+ click or tab into the field, the label disappears. There is no persistent visible
28
+ label outside the input. The user must remember what each field was asking for
29
+ while typing.
30
+
31
+ ```html
32
+ <!-- Anti-pattern: placeholder as only label -->
33
+ <input type="text" placeholder="Email address" />
34
+ <input type="password" placeholder="Password" />
35
+
36
+ <!-- Correct: visible label + optional placeholder hint -->
37
+ <label for="email">Email address</label>
38
+ <input type="email" id="email" placeholder="you@example.com" />
39
+ ```
40
+
41
+ **Why developers do it:**
42
+ It looks clean and minimalist. It saves vertical space. Designers see the empty
43
+ state in mockups and think "the user will know what to do." The placeholder
44
+ appears to serve double duty, and removing the label feels like an elegant
45
+ simplification.
46
+
47
+ **What goes wrong:**
48
+ - Users with short-term memory issues, cognitive disabilities, ADHD, or traumatic
49
+ brain injuries lose track of what the field requires the moment they start typing.
50
+ - On long forms (5+ fields), even users without disabilities frequently tab back
51
+ to check what a field was asking -- they must delete their entry and click away
52
+ to see the placeholder again.
53
+ - Screen readers may not announce placeholder text at all -- the field is
54
+ effectively unlabeled for blind users, violating WCAG 1.3.1 (Info and
55
+ Relationships) and 3.3.2 (Labels or Instructions).
56
+ - Placeholder text defaults to light gray (#999 on white), which fails WCAG
57
+ contrast minimums (2.85:1 vs. the required 4.5:1).
58
+ - Nielsen Norman Group research explicitly warns: "Placeholder text in form fields
59
+ is harmful." Their studies found increased error rates and completion times
60
+ across all tested demographics.
61
+
62
+ **The fix:**
63
+ Always use a visible `<label>` element associated via `for`/`id` with the input.
64
+ Place the label above or to the left of the field. If you want the compact
65
+ aesthetic, use the floating label pattern (label starts inside, animates above on
66
+ focus) -- but ensure the label remains visible at all times once the field has
67
+ focus or content. Reserve placeholder text for supplementary hints like format
68
+ examples ("MM/DD/YYYY").
69
+
70
+ **Detection rule:**
71
+ If you see an `<input>` or `<textarea>` with a `placeholder` attribute but no
72
+ associated `<label>` element (or `aria-label` / `aria-labelledby`), this is AP-01.
73
+
74
+ ---
75
+
76
+ ### AP-02: The Invisible Wall (Poor Contrast Ratios)
77
+
78
+ **Also known as:** Low-contrast text, gray-on-gray, whisper text
79
+ **Frequency:** Very Common
80
+ **Severity:** Critical
81
+ **Detection difficulty:** Easy
82
+
83
+ **What it looks like:**
84
+ Text is rendered in a color too similar to its background. Common offenders:
85
+ light gray body text on white (#999 on #FFF = 2.85:1), white text on pastel
86
+ backgrounds, dark gray on black (#666 on #000 = 2.5:1), or text overlaid on
87
+ photographs without a scrim.
88
+
89
+ **Why developers do it:**
90
+ Designers pursue a "clean" or "modern" aesthetic. Light gray text looks
91
+ sophisticated in Figma on a calibrated 5K monitor. Stakeholders request "less
92
+ visual noise." Nobody checks the contrast ratio with a tool.
93
+
94
+ **What goes wrong:**
95
+ - WCAG 2.1 SC 1.4.3 requires a minimum contrast ratio of 4.5:1 for normal text
96
+ and 3:1 for large text (18px+ or 14px+ bold). Failing this is a Level AA
97
+ violation, making the product legally non-compliant in jurisdictions with
98
+ accessibility mandates (ADA, EAA, Section 508).
99
+ - An estimated 300 million people worldwide have color vision deficiency. Low
100
+ contrast compounds the problem, making text effectively invisible.
101
+ - Even users with perfect vision struggle in suboptimal conditions: bright
102
+ sunlight on a phone, aging laptop screens, low-brightness battery-saver modes.
103
+ - WebAIM's Million Home Page analysis (2024) found that 83.6% of home pages had
104
+ detectable WCAG 2 contrast failures -- the single most common accessibility
105
+ error on the web, year after year.
106
+
107
+ **The fix:**
108
+ Use a contrast checker (WebAIM Contrast Checker, Stark plugin, Chrome DevTools
109
+ audit) during design, not after. Set minimum contrast ratios as design tokens:
110
+ `--color-text-primary` must pass 4.5:1 against `--color-bg-primary`. For text on
111
+ images, use a semi-transparent overlay (scrim) behind the text. Test on a
112
+ low-brightness phone screen and in direct sunlight.
113
+
114
+ **Detection rule:**
115
+ If any text element has a computed contrast ratio below 4.5:1 against its
116
+ background (or below 3:1 for large text), this is AP-02. Automated tools like
117
+ axe-core and Lighthouse flag this reliably.
118
+
119
+ ---
120
+
121
+ ### AP-03: Thumbs Down (Tiny Touch Targets on Mobile)
122
+
123
+ **Also known as:** Needle-eye taps, micro buttons, fat-finger traps
124
+ **Frequency:** Very Common
125
+ **Severity:** High
126
+ **Detection difficulty:** Moderate
127
+
128
+ **What it looks like:**
129
+ Interactive elements (buttons, links, checkboxes, icon buttons) render smaller
130
+ than 44x44 CSS pixels on touch devices. Close/dismiss buttons are 16x16px icons.
131
+ Table rows have inline "edit" links at 12px font size with no padding. Radio
132
+ buttons use the browser default 13x13px hit area.
133
+
134
+ **Why developers do it:**
135
+ The design was created desktop-first and nobody re-evaluated touch targets.
136
+ Developers test with a mouse pointer (1px precision) rather than a fingertip
137
+ (~7mm imprecision). Dense information layouts are prioritized over touch
138
+ ergonomics.
139
+
140
+ **What goes wrong:**
141
+ - WCAG 2.5.8 (Target Size Minimum, Level AA) requires 24x24 CSS pixels minimum.
142
+ WCAG 2.5.5 (Target Size Enhanced, Level AAA) requires 44x44 CSS pixels.
143
+ Apple HIG recommends 44pt minimum; Material Design recommends 48dp.
144
+ - Users with motor impairments, hand tremors, or limited dexterity physically
145
+ cannot hit small targets. This is not an edge case -- it includes users with
146
+ arthritis, Parkinson's disease, and temporary injuries.
147
+ - "Rage taps" (Smashing Magazine research) -- users tapping repeatedly on a
148
+ small target they keep missing -- are a leading indicator of frustration and
149
+ session abandonment on mobile.
150
+ - Adjacent tiny targets cause mis-taps: the user hits "delete" when they meant
151
+ "edit" because the two 20px icons are 4px apart.
152
+
153
+ **The fix:**
154
+ Set a minimum interactive size of 44x44 CSS pixels via padding, min-width, and
155
+ min-height -- even if the visual element (icon, text) is smaller. Maintain at
156
+ least 8px spacing between adjacent touch targets. Use CSS `touch-action` and
157
+ `pointer` media queries to adjust sizing for touch devices. Test with a real
158
+ finger on a real phone.
159
+
160
+ ```css
161
+ /* Minimum touch target */
162
+ .btn-icon {
163
+ min-width: 44px;
164
+ min-height: 44px;
165
+ display: inline-flex;
166
+ align-items: center;
167
+ justify-content: center;
168
+ }
169
+ ```
170
+
171
+ **Detection rule:**
172
+ If any clickable element (button, link, input, interactive icon) has a rendered
173
+ size below 44x44 CSS pixels on viewports <= 1024px wide, this is AP-03. Check
174
+ both the element dimensions and the spacing to its nearest interactive neighbor.
175
+
176
+ ---
177
+
178
+ ### AP-04: The Monochrome Signal (Using Color Alone to Convey Information)
179
+
180
+ **Also known as:** Color-only encoding, red-means-error, traffic-light UI
181
+ **Frequency:** Common
182
+ **Severity:** Critical
183
+ **Detection difficulty:** Moderate
184
+
185
+ **What it looks like:**
186
+ Form validation shows errors only by turning the input border red -- no icon, no
187
+ text message. A dashboard chart distinguishes five data series solely by color.
188
+ A calendar marks holidays with a green background and deadlines with red, with no
189
+ text or icon difference. Status badges use green/yellow/red dots with no labels.
190
+
191
+ **Why developers do it:**
192
+ Color is the fastest visual differentiator and requires the least screen space.
193
+ Traffic light metaphors (red/yellow/green) feel universally understood. Adding
194
+ icons or text to every status indicator feels redundant and clutters the layout.
195
+
196
+ **What goes wrong:**
197
+ - WCAG 1.4.1 (Use of Color, Level A) -- the most fundamental accessibility
198
+ level -- explicitly prohibits using color as the only visual means of conveying
199
+ information. This is a baseline legal requirement, not a nice-to-have.
200
+ - Approximately 8% of men and 0.5% of women have color vision deficiency
201
+ (roughly 350 million people worldwide). Red-green color blindness is the most
202
+ common form, which directly undermines the ubiquitous red/green
203
+ success/error pattern.
204
+ - Monochrome displays, high-contrast modes, print-to-PDF, and screen readers
205
+ all strip color information entirely.
206
+ - Real-world consequence: medical software that used only color to distinguish
207
+ patient alert severity levels caused clinicians to miss critical alerts, leading
208
+ to documented adverse events (ECRI Institute reports on EHR usability).
209
+
210
+ **The fix:**
211
+ Always pair color with at least one additional visual cue: an icon (checkmark for
212
+ success, X for error), a text label ("Error", "Warning"), a pattern or shape
213
+ change, or a border/underline style. For charts, use patterns (dashed, dotted,
214
+ solid) alongside colors, and provide a text data table as an alternative.
215
+
216
+ ```html
217
+ <!-- Anti-pattern: color only -->
218
+ <span style="color: red;">Username</span>
219
+
220
+ <!-- Correct: color + icon + text -->
221
+ <span style="color: red;">
222
+ <svg aria-hidden="true"><!-- error icon --></svg>
223
+ Username — This field is required
224
+ </span>
225
+ ```
226
+
227
+ **Detection rule:**
228
+ If any UI element communicates state (error, success, warning, active, disabled)
229
+ or differentiates data series using only a color change -- with no icon, text,
230
+ pattern, or shape difference -- this is AP-04.
231
+
232
+ ---
233
+
234
+ ### AP-05: The Text Avalanche (Walls of Text Without Visual Hierarchy)
235
+
236
+ **Also known as:** The gray wall, content dump, undifferentiated text block
237
+ **Frequency:** Very Common
238
+ **Severity:** Medium
239
+ **Detection difficulty:** Easy
240
+
241
+ **What it looks like:**
242
+ A page or section presents large blocks of body text with no headings, no
243
+ subheadings, no bullet lists, no bold key phrases, no images or diagrams to break
244
+ the flow. Everything is the same font size, weight, and color. Paragraphs run 8+
245
+ lines without a break. Settings pages list 30 options in a single unstructured
246
+ column.
247
+
248
+ **Why developers do it:**
249
+ Content was pasted from a requirements document or CMS without design review.
250
+ The developer focused on functionality ("the information is there") rather than
251
+ scannability. Time pressure eliminated the design pass. There is no design system
252
+ enforcing heading levels.
253
+
254
+ **What goes wrong:**
255
+ - Nielsen Norman Group eye-tracking research shows users scan rather than read
256
+ web content. Without hierarchy, users enter "scan failure" mode: their eyes
257
+ bounce across the page without landing on key information, and they give up.
258
+ - The F-pattern and layer-cake scanning patterns both depend on visually distinct
259
+ headings. Without them, users default to reading the first few words of the
260
+ first paragraph and abandoning the page.
261
+ - Conversion rates drop measurably. Marketing research consistently shows that
262
+ structured content with clear headers outperforms wall-of-text layouts by
263
+ 47-58% in comprehension and task completion.
264
+ - Accessibility: screen reader users navigate by headings (the H key in NVDA/JAWS).
265
+ A page with no heading structure forces them to listen linearly to all content.
266
+
267
+ **The fix:**
268
+ Apply a typographic hierarchy: H1 for page title, H2 for sections, H3 for
269
+ subsections. Use bullet/numbered lists for sequences or options. Bold key terms
270
+ at the start of paragraphs. Keep paragraphs under 4 lines. Add whitespace
271
+ between sections. If a text block exceeds 150 words, look for an opportunity to
272
+ extract a summary, a table, or a diagram.
273
+
274
+ **Detection rule:**
275
+ If a content area contains more than 200 words with no heading elements
276
+ (`<h2>` through `<h6>`), no list elements, and no visual differentiation (bold,
277
+ size change, color accent), this is AP-05.
278
+
279
+ ---
280
+
281
+ ### AP-06: The Pixel-Perfect Mirage (Designs That Break With Real Content)
282
+
283
+ **Also known as:** Lorem Ipsum syndrome, mockup-only design, static-content assumption
284
+ **Frequency:** Common
285
+ **Severity:** High
286
+ **Detection difficulty:** Hard
287
+
288
+ **What it looks like:**
289
+ A card layout looks perfect with the designer's curated 12-word title and 2-line
290
+ description. In production, a user enters a 60-word title and the layout
291
+ explodes: text overflows, overlaps adjacent elements, or gets clipped without
292
+ indication. A profile component assumes all names are "John Smith" length and
293
+ breaks with "Wolfeschlegelsteinhausenbergerdorff." A price display has room for
294
+ "$9.99" but not "$12,349.99."
295
+
296
+ **Why developers do it:**
297
+ Designers work in tools like Figma where content is controlled and static. The
298
+ handoff specifies exact pixel dimensions. Developers implement what they see in
299
+ the mockup using fixed heights and widths. Nobody tests with edge-case content
300
+ (empty strings, maximum-length inputs, RTL text, special characters).
301
+
302
+ **What goes wrong:**
303
+ - Layouts overflow, clip, or overlap -- creating both visual bugs and functional
304
+ failures (buttons hidden behind overflowing text, truncated phone numbers).
305
+ - Localization multiplies the problem: German text averages 30% longer than
306
+ English; Arabic and Hebrew require RTL layout; CJK characters have different
307
+ line-breaking rules.
308
+ - The myth of pixel perfection is harmful in modern development: there are
309
+ thousands of viewport sizes, and a layout that cannot flex is a layout that
310
+ will break. Josh Comeau notes: "In a strict sense, pixel perfection is not
311
+ actually possible. The HTML and CSS we write will run on a dizzying array of
312
+ devices."
313
+
314
+ **The fix:**
315
+ Design with content extremes from day one. Create mockups with: empty content,
316
+ single-word content, maximum-length content, and translated content (German for
317
+ length, Arabic for RTL). Use CSS that accommodates variability: `min-height`
318
+ instead of `height`, `overflow-wrap: break-word`, text truncation with ellipsis
319
+ and tooltips for bounded containers. Define a content contract: what is the
320
+ minimum, maximum, and typical length for every text field?
321
+
322
+ **Detection rule:**
323
+ If a container uses fixed `height` or `width` on a text-bearing element without
324
+ `overflow` handling, or if mockups contain exclusively "perfect length" lorem
325
+ ipsum content with no stress-test variants, this is AP-06.
326
+
327
+ ---
328
+
329
+ ### AP-07: The Mystery Icon (Icons Without Labels)
330
+
331
+ **Also known as:** Mystery meat navigation, hieroglyphic UI, icon roulette
332
+ **Frequency:** Very Common
333
+ **Severity:** High
334
+ **Detection difficulty:** Easy
335
+
336
+ **What it looks like:**
337
+ A toolbar presents a row of unlabeled icons: a gear, a pencil, a cloud, an arrow,
338
+ three dots, a bell, a person silhouette. The user must hover over each one
339
+ (desktop) or tap experimentally (mobile) to discover what it does. Navigation
340
+ relies entirely on icon recognition.
341
+
342
+ **Why developers do it:**
343
+ Icons save horizontal space. Designers assume commonly used icons (hamburger,
344
+ gear, magnifying glass) are universally understood. Adding text labels makes the
345
+ toolbar look "cluttered." The designer's familiarity with the interface creates a
346
+ false consensus effect -- "if I know what it means, everyone does."
347
+
348
+ **What goes wrong:**
349
+ - Nielsen Norman Group icon usability research found that icons-only navigation
350
+ decreased findability by nearly 50% compared to labeled alternatives. Task
351
+ completion times increased by up to 18%.
352
+ - The same icon means different things in different contexts. NNGroup's testing
353
+ showed that users predicted wildly different functionalities for the same icon:
354
+ a storefront icon was interpreted as "homepage," "store locations," "in-store
355
+ deals," and "related retailers" by different users.
356
+ - Tooltips on hover fail on touch devices entirely. There is no hover state on
357
+ a phone or tablet.
358
+ - Material Design's icon-heavy approach has been specifically criticized for
359
+ creating mystery meat navigation -- a term from early web design that returned
360
+ with modern minimalism.
361
+
362
+ **The fix:**
363
+ Always pair icons with visible text labels. The label should be visible at all
364
+ times, not revealed on hover. For space-constrained toolbars, use an icon +
365
+ label on larger viewports and icon + tooltip + `aria-label` on smaller viewports
366
+ (accepting the discoverability trade-off). The only icons that can arguably stand
367
+ alone are: close (X), search (magnifying glass), and play/pause -- and even
368
+ these benefit from labels.
369
+
370
+ **Detection rule:**
371
+ If a clickable icon has no adjacent visible text label AND no `aria-label` or
372
+ `aria-labelledby`, this is AP-07. Even with aria attributes, if there is no
373
+ visible label, flag it as a discoverability concern.
374
+
375
+ ---
376
+
377
+ ### AP-08: The Infinite Truncation (Truncated Text Without Escape Hatch)
378
+
379
+ **Also known as:** Clipped content, ellipsis trap, hidden information
380
+ **Frequency:** Common
381
+ **Severity:** Medium
382
+ **Detection difficulty:** Moderate
383
+
384
+ **What it looks like:**
385
+ A table cell, card title, or list item shows text ending in "..." with no way
386
+ to see the full content. Hovering does nothing. There is no tooltip, no expand
387
+ option, no detail view. The user sees "Payment to Acme Corp for Q3 ser..." and
388
+ has no way to determine whether it says "services" or "server maintenance."
389
+
390
+ **Why developers do it:**
391
+ CSS `text-overflow: ellipsis` is a one-line fix for overflow problems. The
392
+ developer added it to prevent layout breakage and moved on. Nobody implemented
393
+ the companion interaction (tooltip, expand, or link to detail view) because it
394
+ was not in the ticket.
395
+
396
+ **What goes wrong:**
397
+ - Users lose access to critical information. In financial applications, truncated
398
+ transaction descriptions prevent users from identifying charges. In project
399
+ management tools, truncated task names cause confusion and duplication.
400
+ - Truncation is often applied uniformly regardless of content importance -- a
401
+ user's full name is truncated the same as a decorative subtitle.
402
+ - On data tables, truncation compounds with column resizing -- users cannot
403
+ see data AND cannot make columns wider to reveal it.
404
+
405
+ **The fix:**
406
+ Every truncated element needs an escape hatch. The minimum is a `title` attribute
407
+ for native browser tooltips. Better: a custom tooltip component that appears on
408
+ hover/focus (and on long-press for mobile). Best: a click/tap to expand, a detail
409
+ panel, or a resizable column. Also consider whether truncation is appropriate at
410
+ all -- if the content is critical, allocate more space for it.
411
+
412
+ ```css
413
+ .truncated {
414
+ white-space: nowrap;
415
+ overflow: hidden;
416
+ text-overflow: ellipsis;
417
+ }
418
+ /* Pair with a title attribute or tooltip component */
419
+ ```
420
+
421
+ **Detection rule:**
422
+ If an element has `text-overflow: ellipsis` or is programmatically truncated
423
+ without a corresponding `title` attribute, tooltip component, or expand
424
+ interaction, this is AP-08.
425
+
426
+ ---
427
+
428
+ ### AP-09: The Rigid Grid (Fixed-Width Layouts That Don't Respond)
429
+
430
+ **Also known as:** Desktop-only layout, breakpoint blindness, 960px forever
431
+ **Frequency:** Common
432
+ **Severity:** High
433
+ **Detection difficulty:** Easy
434
+
435
+ **What it looks like:**
436
+ The layout uses fixed pixel widths (`width: 1200px`, `max-width: 960px`) with no
437
+ responsive breakpoints. On mobile, the page either requires horizontal scrolling
438
+ or is scaled down to illegibly small text. Elements overlap or fall off-screen at
439
+ intermediate viewport sizes.
440
+
441
+ **Why developers do it:**
442
+ The design was created for a single desktop resolution. Fixed layouts are faster
443
+ to implement -- no media queries, no flexible grids, no testing across devices.
444
+ Internal tools are built "for desktop only" even though stakeholders increasingly
445
+ access them on tablets and phones.
446
+
447
+ **What goes wrong:**
448
+ - As of 2025, mobile devices account for approximately 60% of global web traffic
449
+ (Statcounter). A desktop-only layout excludes the majority of users.
450
+ - Horizontal scrolling on a vertical-scroll page is a severe usability violation.
451
+ Users expect to scroll vertically; horizontal scroll is neither discovered nor
452
+ tolerated (NNGroup research: horizontal scrolling is the #2 most-hated web
453
+ interaction after pop-ups).
454
+ - WCAG 1.4.10 (Reflow, Level AA) requires that content reflows at 320 CSS
455
+ pixels wide without horizontal scrolling (except for content that requires
456
+ two-dimensional layout, like data tables).
457
+ - Fixed layouts break when users zoom (Ctrl/Cmd +), another accessibility
458
+ requirement (WCAG 1.4.4 Resize Text).
459
+
460
+ **The fix:**
461
+ Use relative units (%, rem, em, vw) instead of fixed pixels for container widths.
462
+ Implement a responsive grid system (CSS Grid or Flexbox) with breakpoints at
463
+ common thresholds (320px, 768px, 1024px, 1440px). Test at every breakpoint and
464
+ at intermediate widths. Use `min-width` and `max-width` rather than `width` for
465
+ containers.
466
+
467
+ **Detection rule:**
468
+ If a layout container has a fixed `width` in pixels without responsive
469
+ breakpoints (media queries), or if the page requires horizontal scrolling at
470
+ any viewport width >= 320px, this is AP-09.
471
+
472
+ ---
473
+
474
+ ### AP-10: The Z-Index Arms Race (Stacking Context Wars)
475
+
476
+ **Also known as:** z-index: 99999, stacking context chaos, layer wars
477
+ **Frequency:** Common
478
+ **Severity:** Medium
479
+ **Detection difficulty:** Hard
480
+
481
+ **What it looks like:**
482
+ The codebase contains escalating z-index values: modals at 9999, dropdowns at
483
+ 10000, tooltips at 99999, and a "critical" notification at 999999. A new feature
484
+ adds z-index: 10000000. Elements still appear behind other elements unexpectedly.
485
+ Developers "fix" layering issues by incrementing z-index rather than
486
+ understanding stacking contexts.
487
+
488
+ ```css
489
+ /* The arms race in action */
490
+ .dropdown { z-index: 100; } /* seemed enough at first */
491
+ .modal { z-index: 1000; } /* needed to be above dropdown */
492
+ .tooltip { z-index: 10000; } /* needed to be above modal */
493
+ .notification { z-index: 99999; } /* "this MUST be on top" */
494
+ .cookie-banner { z-index: 2147483647; } /* the nuclear option */
495
+ ```
496
+
497
+ **Why developers do it:**
498
+ Z-index feels intuitive: higher number = more on top. When something appears
499
+ behind another element, the instinctive fix is to increase the number. The
500
+ actual mechanism -- stacking contexts created by properties like `opacity`,
501
+ `transform`, `will-change`, and `position` -- is poorly understood. As Philip
502
+ Walton documented: "What no one told you about z-index" is that z-index values
503
+ only compete within the same stacking context.
504
+
505
+ **What goes wrong:**
506
+ - A modal with z-index: 99999 inside a parent with `transform: translateZ(0)`
507
+ creates a new stacking context. The modal can never appear above siblings of
508
+ that parent, regardless of its z-index value.
509
+ - The codebase becomes unmaintainable: developers cannot predict layering without
510
+ reading every z-index in the project. New features routinely break existing
511
+ layering.
512
+ - Third-party widgets (chat bubbles, cookie banners, analytics overlays) inject
513
+ their own extreme z-index values, creating conflicts that are nearly impossible
514
+ to resolve.
515
+
516
+ **The fix:**
517
+ Define a z-index scale in design tokens with named layers:
518
+
519
+ ```css
520
+ :root {
521
+ --z-dropdown: 100;
522
+ --z-sticky: 200;
523
+ --z-overlay: 300;
524
+ --z-modal: 400;
525
+ --z-notification: 500;
526
+ --z-tooltip: 600;
527
+ }
528
+ ```
529
+
530
+ Use the `isolation: isolate` property to create intentional stacking contexts
531
+ without arbitrary z-index values. Audit the codebase for unintentional stacking
532
+ context creation (`transform`, `opacity < 1`, `filter`, `will-change`).
533
+ Document the layer hierarchy. Never use a z-index value that is not from the
534
+ defined scale.
535
+
536
+ **Detection rule:**
537
+ If the codebase contains z-index values above 1000, or if more than 3 different
538
+ z-index values are used without a defined scale/token system, or if z-index bugs
539
+ are recurring, this is AP-10.
540
+
541
+ ---
542
+
543
+ ### AP-11: The Font Carnival (Too Many Fonts and Colors)
544
+
545
+ **Also known as:** Visual cacophony, design-by-committee, style soup
546
+ **Frequency:** Common
547
+ **Severity:** Medium
548
+ **Detection difficulty:** Easy
549
+
550
+ **What it looks like:**
551
+ A single page uses 4+ different typefaces, 6+ font sizes with no consistent
552
+ scale, and 10+ colors with no discernible palette. Headings alternate between
553
+ serif and sans-serif. Body text varies between 13px, 14px, 15px, and 16px
554
+ across different sections. Accent colors change from blue to teal to purple
555
+ with no pattern.
556
+
557
+ **Why developers do it:**
558
+ Multiple designers contributed without a shared design system. Developers
559
+ chose fonts ad hoc when building individual components. Over time, each new
560
+ feature introduced "just one more" color or typeface. Nobody audited the
561
+ accumulated visual debt.
562
+
563
+ **What goes wrong:**
564
+ - Cognitive load increases: the brain attempts to assign meaning to each visual
565
+ variation (different font = different category?), consuming processing power
566
+ that should go toward understanding content.
567
+ - The interface looks unprofessional and undermines user trust. Research from
568
+ the Stanford Web Credibility Project found that visual design is the #1
569
+ factor users cite when evaluating a website's credibility.
570
+ - Maintenance becomes expensive: every new component must choose from the
571
+ existing chaos or add to it. Design reviews become style arguments.
572
+ - Performance: each additional font family adds 50-200KB of network payload
573
+ and a render-blocking resource.
574
+
575
+ **The fix:**
576
+ Limit to 2 typefaces maximum (one for headings, one for body -- or a single
577
+ versatile family). Define a type scale (e.g., 12/14/16/20/24/32/48px) using a
578
+ modular ratio. Limit the color palette to: 1 primary, 1 secondary, 1 accent,
579
+ plus neutral grays and semantic colors (error red, warning amber, success green,
580
+ info blue). Codify these as design tokens. Lint for non-token values.
581
+
582
+ **Detection rule:**
583
+ If a project uses more than 3 font families, more than 7 distinct font sizes
584
+ without a systematic scale, or more than 8 non-semantic colors, this is AP-11.
585
+
586
+ ---
587
+
588
+ ### AP-12: The Inconsistent Button Bar (Mismatched Button Styles and Placement)
589
+
590
+ **Also known as:** Button roulette, CTA confusion, action ambiguity
591
+ **Frequency:** Very Common
592
+ **Severity:** Medium
593
+ **Detection difficulty:** Easy
594
+
595
+ **What it looks like:**
596
+ Primary actions use filled buttons on some pages and outlined buttons on others.
597
+ "Save" is on the right in one form and on the left in another. Destructive
598
+ actions (Delete) use the same styling as primary actions (Save). Some buttons
599
+ have icons, some do not. Button sizes vary: 32px height here, 40px there, 48px
600
+ elsewhere.
601
+
602
+ **Why developers do it:**
603
+ Different developers or teams built different pages. There is no button component
604
+ library, or it exists but is not enforced. Each developer implemented buttons to
605
+ match the nearest screenshot. Design inconsistency in the mockups propagated into
606
+ inconsistency in the product.
607
+
608
+ **What goes wrong:**
609
+ - Users cannot build muscle memory. When "Save" moves from the right side to the
610
+ left side between pages, users hit "Cancel" by reflex. When destructive and
611
+ constructive actions look identical, users delete data by accident.
612
+ - Jakob's Law (Nielsen): users spend most of their time on other sites. They
613
+ expect your site to work like the ones they already know. Inconsistency within
614
+ your own product violates even this internal consistency expectation.
615
+ - Conversion rate suffers when users hesitate because they cannot identify the
616
+ primary action. If three buttons look equally prominent, none of them is
617
+ prominent.
618
+
619
+ **The fix:**
620
+ Define a button hierarchy in the design system: Primary (filled, high contrast),
621
+ Secondary (outlined or toned), Tertiary (text-only), Destructive (red or
622
+ clearly differentiated). Standardize placement: primary action on the trailing
623
+ side (right in LTR, left in RTL), cancel/secondary on the leading side.
624
+ Standardize size at one or two heights (36px compact, 44px default). Enforce
625
+ via shared components, not guidelines documents that nobody reads.
626
+
627
+ **Detection rule:**
628
+ If the same logical action (Save, Submit, Confirm) uses different button styles,
629
+ sizes, or positions across different screens in the same product, this is AP-12.
630
+
631
+ ---
632
+
633
+ ### AP-13: The Spacing Lottery (Inconsistent Spacing and Alignment)
634
+
635
+ **Also known as:** Random whitespace, alignment drift, the eyeball grid
636
+ **Frequency:** Very Common
637
+ **Severity:** Medium
638
+ **Detection difficulty:** Moderate
639
+
640
+ **What it looks like:**
641
+ Spacing between elements varies arbitrarily: 8px gap here, 12px there, 17px
642
+ elsewhere. Form labels are 4px above their inputs in one section and 10px in
643
+ another. Cards in a grid have uneven gutters. Text is sometimes left-aligned,
644
+ sometimes centered, within the same content type. Margins and padding use
645
+ inconsistent values that follow no scale.
646
+
647
+ **Why developers do it:**
648
+ Developers adjust spacing by visual approximation ("that looks about right")
649
+ rather than using a defined spacing scale. Different components are implemented
650
+ at different times with slightly different values. The design mockup specified
651
+ exact values, but they were transcribed inconsistently.
652
+
653
+ **What goes wrong:**
654
+ - Inconsistent spacing breaks Gestalt grouping principles: users perceive
655
+ elements as related or unrelated based on proximity. Random spacing sends
656
+ false signals about information relationships.
657
+ - The interface looks "off" -- users cannot articulate why, but they perceive
658
+ the lack of precision as lower quality. Trust and credibility decrease.
659
+ - Maintenance multiplies: every new component requires ad-hoc spacing decisions
660
+ rather than drawing from a system.
661
+
662
+ **The fix:**
663
+ Define a spacing scale based on a base unit (typically 4px or 8px): 0, 4, 8, 12,
664
+ 16, 24, 32, 48, 64. Use only values from this scale. Implement as CSS custom
665
+ properties or utility classes. Align all elements to a consistent baseline grid.
666
+ Use Flexbox/Grid gap properties rather than individual margins.
667
+
668
+ ```css
669
+ :root {
670
+ --space-xs: 4px;
671
+ --space-sm: 8px;
672
+ --space-md: 16px;
673
+ --space-lg: 24px;
674
+ --space-xl: 32px;
675
+ --space-2xl: 48px;
676
+ }
677
+ ```
678
+
679
+ **Detection rule:**
680
+ If spacing values in a project include more than 2 values not on a defined scale
681
+ (e.g., 13px, 17px, 22px when the scale is multiples of 4), or if the same
682
+ component type has different spacing in different instances, this is AP-13.
683
+
684
+ ---
685
+
686
+ ### AP-14: The Silent Sentinel (Disabled Buttons Without Explanation)
687
+
688
+ **Also known as:** Grayed-out mystery, the mute button, unexplained disabled state
689
+ **Frequency:** Very Common
690
+ **Severity:** High
691
+ **Detection difficulty:** Easy
692
+
693
+ **What it looks like:**
694
+ A "Submit" button is grayed out and unclickable. The user has filled in what they
695
+ believe is all required information, but the button remains disabled. There is no
696
+ message explaining what is missing or what condition must be met. The user stares
697
+ at the form, trying to guess what is wrong.
698
+
699
+ **Why developers do it:**
700
+ It feels like the "safe" UX choice -- preventing invalid submissions is good,
701
+ right? The developer disables the button until validation passes and assumes the
702
+ user will figure out what to fix. The validation logic is in JavaScript but the
703
+ feedback is not surfaced to the UI.
704
+
705
+ **What goes wrong:**
706
+ - Smashing Magazine's research on disabled buttons found they are one of the most
707
+ frustrating design patterns on the web. Users describe the experience as
708
+ "the system is playing a puzzle game -- something is wrong, but it won't tell
709
+ you what."
710
+ - Disabled buttons in HTML cannot receive focus by default, making them invisible
711
+ to screen reader users. A blind user may never know the button exists.
712
+ - Users abandon forms rather than guess. This directly reduces conversion rates.
713
+ - The problem worsens on mobile where the disabled button may be off-screen at
714
+ the bottom of the page, and the unfilled required field is scrolled out of
715
+ view above.
716
+
717
+ **The fix:**
718
+ Keep the button enabled. When the user clicks it with incomplete/invalid data,
719
+ show clear inline error messages next to each problem field. If you must disable
720
+ the button, add a visible message below or beside it explaining why ("Please fill
721
+ in all required fields" or, better, specifically: "Email address is required").
722
+ Use `aria-disabled="true"` instead of the `disabled` attribute so the button
723
+ remains focusable and screen readers can announce it along with the explanation.
724
+
725
+ **Detection rule:**
726
+ If a `<button>` has the `disabled` attribute and there is no visible adjacent
727
+ text explaining the disabled state, this is AP-14.
728
+
729
+ ---
730
+
731
+ ### AP-15: The Notification Avalanche (Notification and Alert Overload)
732
+
733
+ **Also known as:** Alert fatigue, notification blindness, cry-wolf syndrome
734
+ **Frequency:** Common
735
+ **Severity:** High
736
+ **Detection difficulty:** Moderate
737
+
738
+ **What it looks like:**
739
+ The application fires multiple toast notifications, banners, badges, and modal
740
+ alerts for routine events. A user logs in and sees: a cookie consent banner, a
741
+ "what's new" modal, a promotional banner, 3 badge counts, and a toast about
742
+ a background sync completing. SOC dashboards show 3,800+ alerts per day.
743
+ Every state change produces a notification.
744
+
745
+ **Why developers do it:**
746
+ Each notification was added by a different team or in a different sprint. Each
747
+ one seemed important in isolation. There is no centralized notification strategy
748
+ or priority system. Product managers want to "keep users informed" and marketing
749
+ wants to "drive engagement."
750
+
751
+ **What goes wrong:**
752
+ - Alert fatigue is a documented phenomenon: when users receive too many
753
+ notifications, they become desensitized and ignore all of them -- including
754
+ critical ones. Industry data shows 25-30% of alerts go uninvestigated due to
755
+ overload.
756
+ - Research shows frequent notifications increase cognitive load by 37% and reduce
757
+ task completion efficiency by 28%.
758
+ - The "cry wolf" effect means that when a genuinely important alert fires, users
759
+ dismiss it reflexively along with the noise.
760
+ - In healthcare IT, alert fatigue is a patient safety concern: clinicians override
761
+ 90-96% of drug interaction alerts because the system generates too many
762
+ low-severity warnings (ECRI Institute, Joint Commission reports).
763
+ - In engineering, alert fatigue contributed to employee turnover for 62% of
764
+ participants in industry surveys.
765
+
766
+ **The fix:**
767
+ Implement a notification priority system: Critical (requires immediate action),
768
+ Warning (should see soon), Info (nice to know), Silent (log only). Limit
769
+ simultaneous visible notifications to 1-2. Queue non-critical notifications.
770
+ Consolidate related alerts ("3 new comments" instead of 3 separate toasts).
771
+ Allow users to configure notification preferences. Never show marketing/promo
772
+ content in the same channel as system alerts.
773
+
774
+ **Detection rule:**
775
+ If a user action or page load triggers more than 2 simultaneous visible
776
+ notifications, or if the application has no notification priority/severity
777
+ system, this is AP-15.
778
+
779
+ ---
780
+
781
+ ### AP-16: The Kitchen Sink Dashboard (Cluttered Information Displays)
782
+
783
+ **Also known as:** Dashboard maximalism, chart overload, metrics dumping ground
784
+ **Frequency:** Common
785
+ **Severity:** Medium
786
+ **Detection difficulty:** Easy
787
+
788
+ **What it looks like:**
789
+ A dashboard crams 15+ charts, tables, KPIs, and widgets onto a single screen.
790
+ Every metric the system tracks is visible simultaneously. There is no visual
791
+ hierarchy -- a trivial "total page views" counter gets the same prominence as
792
+ a critical "server error rate" alert. Colors are used inconsistently across
793
+ charts. The user must scroll extensively or scan frantically to find the one
794
+ number they need.
795
+
796
+ **Why developers do it:**
797
+ Stakeholders request "just add this metric too" iteratively. Nobody curates
798
+ or removes metrics. The dashboard evolves by accretion: each sprint adds a
799
+ widget, none are removed. Designers think more data equals more value.
800
+
801
+ **What goes wrong:**
802
+ - Cognitive overload: Miller's Law suggests working memory holds 7 +/- 2 items.
803
+ A dashboard with 20 charts exceeds this, causing users to miss critical signals.
804
+ - Inconsistent color usage across charts causes misinterpretation. If "revenue"
805
+ is blue in one chart and green in another, users draw false connections.
806
+ - Performance degrades: rendering 15+ charts with live data creates noticeable
807
+ lag, especially on lower-powered devices.
808
+ - Databox research on dashboard design mistakes found that overcrowding with
809
+ too many visuals, inconsistent color usage, and unclear labeling are the top
810
+ three design errors in analytics dashboards.
811
+
812
+ **The fix:**
813
+ Follow the "5-9 visualizations per dashboard" rule. Create a hierarchy: the
814
+ most critical 2-3 KPIs get prominent placement at the top. Secondary metrics
815
+ go in a scrollable section below. Tertiary data is available via drill-down
816
+ or separate pages. Use consistent color encoding across all charts (if
817
+ "revenue" is blue, it is always blue). Provide filters and date ranges
818
+ rather than showing everything at once. Run a "red route" analysis: what are
819
+ the 3 things users check first? Those go at the top.
820
+
821
+ **Detection rule:**
822
+ If a single dashboard view contains more than 9 distinct data visualizations
823
+ without tabs/filters to segment them, or if the same metric uses different
824
+ colors across different charts, this is AP-16.
825
+
826
+ ---
827
+
828
+ ### AP-17: The Format Babel (Inconsistent Date, Time, and Number Formats)
829
+
830
+ **Also known as:** Locale chaos, format roulette, DD/MM vs MM/DD
831
+ **Frequency:** Common
832
+ **Severity:** Medium
833
+ **Detection difficulty:** Moderate
834
+
835
+ **What it looks like:**
836
+ The same application displays dates as "03/07/2026" in one view, "2026-03-07" in
837
+ another, "March 7, 2026" in a third, and "7 Mar" in a fourth. Times appear as
838
+ "3:00 PM" on some screens and "15:00" on others. Numbers show as "1,234.56" in
839
+ one column and "1.234,56" in the next. Currency appears as "$100", "100 USD",
840
+ and "100.00" within the same transaction list.
841
+
842
+ **Why developers do it:**
843
+ Different developers format dates and numbers inline using different approaches.
844
+ No shared formatting utility exists. Backend APIs return ISO 8601 timestamps
845
+ and the frontend formats them inconsistently. When localization is added later,
846
+ it is applied to some surfaces but not others.
847
+
848
+ **What goes wrong:**
849
+ - Ambiguous dates cause real errors: "03/07/2026" is March 7 in the US but
850
+ July 3 in Europe. In financial and medical applications, date
851
+ misinterpretation has caused documented incidents.
852
+ - LibreOffice Bug #161361 demonstrated that clicking "Apply" multiple times on
853
+ a date field toggled between July 10 and October 7 due to format
854
+ inconsistency.
855
+ - Users lose trust when the same number appears different in two places -- it
856
+ suggests the data itself may be unreliable.
857
+ - Omitting currency or units is dangerous: "$100" vs "100" vs "100 EUR" creates
858
+ ambiguity that, in financial applications, can mean real monetary losses.
859
+
860
+ **The fix:**
861
+ Create a single formatting utility (e.g., `formatDate()`, `formatCurrency()`,
862
+ `formatNumber()`) that every surface uses. Respect the user's locale (from
863
+ browser or profile settings). Use the `Intl` API in JavaScript:
864
+
865
+ ```javascript
866
+ // One utility, used everywhere
867
+ const formatDate = (iso) =>
868
+ new Intl.DateTimeFormat(userLocale, {
869
+ year: 'numeric', month: 'short', day: 'numeric'
870
+ }).format(new Date(iso));
871
+
872
+ const formatCurrency = (amount, currency = 'USD') =>
873
+ new Intl.NumberFormat(userLocale, {
874
+ style: 'currency', currency
875
+ }).format(amount);
876
+ ```
877
+
878
+ Always display currency codes or symbols. Always display units. Store dates in
879
+ ISO 8601 internally and format only at the display layer.
880
+
881
+ **Detection rule:**
882
+ If the same type of data (dates, numbers, currency) is formatted differently
883
+ across different views or components in the same application, or if raw ISO
884
+ timestamps or unformatted numbers appear in the UI, this is AP-17.
885
+
886
+ ---
887
+
888
+ ### AP-18: The Spreadsheet Table (Poor Data Table Design)
889
+
890
+ **Also known as:** The horizontal scroll nightmare, the unreadable grid, data dump table
891
+ **Frequency:** Common
892
+ **Severity:** Medium
893
+ **Detection difficulty:** Easy
894
+
895
+ **What it looks like:**
896
+ A data table has 15+ columns, requiring horizontal scrolling on all but the
897
+ widest monitors. Column headers scroll out of view. Row data is not aligned
898
+ to its header. There is no sticky first column for row identification. On mobile,
899
+ the table is either horizontally scrollable (with no indication that more columns
900
+ exist) or shrunk to illegibility.
901
+
902
+ **Why developers do it:**
903
+ The backend returns 15 fields, so the frontend displays 15 columns. The
904
+ developer used a basic HTML `<table>` or a data grid library with defaults.
905
+ Nobody designed the table for the actual viewport sizes users would encounter.
906
+ "It works on my 27-inch monitor" is the implicit assumption.
907
+
908
+ **What goes wrong:**
909
+ - Users lose context: when scrolling horizontally, they can no longer see which
910
+ row they are reading (the identifier column scrolled off-screen) or which
911
+ column a value belongs to (the header scrolled off-screen).
912
+ - Simultaneous horizontal and vertical scrolling (common on large datasets in
913
+ small viewports) is a severe usability failure.
914
+ - NNGroup research on mobile tables found that forcing horizontal scrolling on
915
+ mobile causes users to miss data or give up exploring the table entirely.
916
+ - Zebra striping, a common readability aid, is frequently omitted or inconsistent,
917
+ making it hard to track rows across wide tables.
918
+
919
+ **The fix:**
920
+ For wide tables: freeze the first column (row identifier) and allow horizontal
921
+ scroll on remaining columns with a visual indicator (gradient, arrow) showing
922
+ more content exists. Hide non-essential columns by default; let users choose
923
+ which to show. For mobile: transform rows into card views (stack label-value
924
+ pairs vertically) or use a responsive pattern that prioritizes the most important
925
+ 2-3 columns. Always use sticky headers. Add zebra striping for readability.
926
+
927
+ **Detection rule:**
928
+ If a table requires horizontal scrolling at the application's primary viewport
929
+ width, or if column headers do not remain visible during vertical scroll, or
930
+ if no mobile-specific table rendering exists, this is AP-18.
931
+
932
+ ---
933
+
934
+ ### AP-19: The Unit Phantom (Missing Units, Currency, and Context)
935
+
936
+ **Also known as:** Naked numbers, ambiguous values, unitless data
937
+ **Frequency:** Common
938
+ **Severity:** High
939
+ **Detection difficulty:** Easy
940
+
941
+ **What it looks like:**
942
+ A dashboard shows "Revenue: 1,234,567" -- is that dollars, euros, yen, cents?
943
+ A settings panel shows "Timeout: 30" -- seconds? minutes? milliseconds? A
944
+ product listing shows "Weight: 2.5" -- kg? lbs? A form asks for "Amount" with
945
+ no currency indicator.
946
+
947
+ **Why developers do it:**
948
+ The developer knows the unit because they wrote the code. The unit is "obvious"
949
+ within the engineering context. Adding units to every label feels redundant.
950
+ The database stores raw numbers and the UI displays what it receives.
951
+
952
+ **What goes wrong:**
953
+ - The Mars Climate Orbiter was lost in 1999 because one team used metric units
954
+ and another used imperial, and the interface between them did not label units.
955
+ Cost: $327.6 million. Unit ambiguity at the UI level creates the same class
956
+ of misinterpretation at the human level.
957
+ - In financial applications, missing currency symbols cause users to transact in
958
+ the wrong currency. In e-commerce, missing weight or dimension units cause
959
+ incorrect purchase decisions and returns.
960
+ - In configuration panels, unitless timeouts and thresholds lead to
961
+ misconfiguration: a developer sets "30" thinking seconds, but the system
962
+ interprets milliseconds -- resulting in a 30ms timeout that fails every
963
+ request.
964
+
965
+ **The fix:**
966
+ Always display the unit alongside the number. For currency, use the currency
967
+ symbol or ISO 4217 code. For measurements, use the unit abbreviation. For
968
+ configuration fields, include the unit in the input's suffix or helper text.
969
+ If the unit might be ambiguous, spell it out.
970
+
971
+ ```html
972
+ <!-- Anti-pattern -->
973
+ <span>Timeout: 30</span>
974
+ <span>Revenue: 1,234,567</span>
975
+
976
+ <!-- Correct -->
977
+ <span>Timeout: 30 seconds</span>
978
+ <span>Revenue: $1,234,567 USD</span>
979
+ ```
980
+
981
+ **Detection rule:**
982
+ If a numeric value is displayed without an accompanying unit, currency symbol,
983
+ or contextual label that makes the unit unambiguous, this is AP-19.
984
+
985
+ ---
986
+
987
+ ### AP-20: The Superfluous Field (Unnecessary Form Fields)
988
+
989
+ **Also known as:** Over-collection, the Expedia problem, form bloat
990
+ **Frequency:** Common
991
+ **Severity:** High
992
+ **Detection difficulty:** Easy
993
+
994
+ **What it looks like:**
995
+ A checkout form asks for "Company Name" (optional), "Fax Number," "Middle Name,"
996
+ and "How did you hear about us?" before the user can complete a purchase. A
997
+ registration form has 12 fields when only email and password are needed. An
998
+ optional field is present that no downstream process actually uses.
999
+
1000
+ **Why developers do it:**
1001
+ "We might need this data later." Product managers request fields "for analytics."
1002
+ The form was copied from a paper form. Nobody questioned whether each field
1003
+ actually affects the transaction. Optional fields seem harmless because they
1004
+ are optional.
1005
+
1006
+ **What goes wrong:**
1007
+ - Expedia discovered that a single optional "Company" field was costing them
1008
+ $12 million per year. Users confused "Company" with their bank name, entered
1009
+ their bank's address instead of their home address, and credit card
1010
+ verification failed. Some users abandoned checkout entirely due to the
1011
+ confusion. Removing the field immediately recovered the revenue.
1012
+ - Baymard Institute research found that the average checkout has 14.88 form
1013
+ fields, but the optimal count is 6-8. Every additional field increases
1014
+ abandonment by approximately 2%.
1015
+ - GDPR, CCPA, and similar regulations penalize collection of unnecessary
1016
+ personal data. Fields you do not need become compliance liabilities.
1017
+
1018
+ **The fix:**
1019
+ Audit every form field against two criteria: (1) Is this data required to
1020
+ complete the current transaction? (2) Is there a documented downstream consumer
1021
+ for this data? If both answers are no, remove the field. If the data is
1022
+ genuinely optional and useful, move it to a post-completion profile step. Label
1023
+ remaining optional fields clearly with "(optional)" -- do not use asterisks
1024
+ for required fields, as this forces users to scan for asterisks on every field.
1025
+
1026
+ **Detection rule:**
1027
+ If a form contains fields marked "optional" with no documented consumer, or if
1028
+ a form has more than 8 fields for a single transaction (checkout, registration,
1029
+ contact), this is AP-20.
1030
+
1031
+ ---
1032
+
1033
+ ### AP-21: The Content-Length Assumption (Not Designing for Variable Content)
1034
+
1035
+ **Also known as:** Happy-path-only layout, best-case design, single-locale layout
1036
+ **Frequency:** Common
1037
+ **Severity:** Medium
1038
+ **Detection difficulty:** Hard
1039
+
1040
+ **What it looks like:**
1041
+ A card grid looks perfect when every card has a 3-word title and a 2-line
1042
+ description. But one card has a 15-word title and the grid misaligns -- card
1043
+ heights differ, text overflows, and the layout looks broken. A navigation
1044
+ menu works with 5 items but breaks visually when a sixth is added. An empty
1045
+ state shows a blank white area with no guidance.
1046
+
1047
+ **Why developers do it:**
1048
+ Testing uses representative content, not extreme content. Designers create
1049
+ mockups with ideal-length strings. Nobody tests: What if this list has 0 items?
1050
+ 1 item? 1,000 items? What if the title is 3 characters? 300 characters? What
1051
+ if the user's locale is German (text 30% longer) or Chinese (characters that
1052
+ don't word-wrap the same way)?
1053
+
1054
+ **What goes wrong:**
1055
+ - Zero-item states (empty states) show confusing blank areas instead of helpful
1056
+ messages ("No results yet. Create your first project.").
1057
+ - Single-item states break grid layouts designed for 3+ items.
1058
+ - Maximum-content states cause overflow, misalignment, and sometimes data loss
1059
+ (text clipped without truncation indicator).
1060
+ - Localization amplifies every content-length bug: German translations are 30%
1061
+ longer, Finnish compound words can be extremely long, and Arabic text reflows
1062
+ right-to-left.
1063
+
1064
+ **The fix:**
1065
+ Design and test for four content states: empty (0 items), minimal (1 item or
1066
+ shortest possible content), typical (average content), and extreme (maximum
1067
+ content, longest translations). Use CSS that handles variability: `min-height`
1068
+ instead of `height`, `flex-wrap: wrap` for grids, explicit empty states with
1069
+ illustration and guidance text. Create a content stress-test checklist and
1070
+ run it before every release.
1071
+
1072
+ **Detection rule:**
1073
+ If a component has no defined empty state, or if testing has only been performed
1074
+ with "average" content lengths, or if localized builds have not been tested for
1075
+ layout integrity, this is AP-21.
1076
+
1077
+ ---
1078
+
1079
+ ### AP-22: The Ambiguous Form Field (Unclear Labels and Missing Context)
1080
+
1081
+ **Also known as:** Guess-what-I-mean inputs, context-free fields, the Expedia label
1082
+ **Frequency:** Common
1083
+ **Severity:** High
1084
+ **Detection difficulty:** Moderate
1085
+
1086
+ **What it looks like:**
1087
+ A form field is labeled "Address" without specifying home, billing, or shipping.
1088
+ A field labeled "Name" does not clarify whether it wants full name, first name,
1089
+ or username. A date field provides no format hint (MM/DD/YYYY vs DD/MM/YYYY).
1090
+ An "Amount" field has no currency context. A "Phone" field gives no guidance on
1091
+ whether to include country code.
1092
+
1093
+ **Why developers do it:**
1094
+ The developer knows what the field means in the context of the backend model.
1095
+ Labels are pulled from database column names. The brevity of single-word labels
1096
+ feels clean and space-efficient. Helping text is seen as clutter.
1097
+
1098
+ **What goes wrong:**
1099
+ - The Expedia incident was fundamentally a labeling problem: "Company" was
1100
+ ambiguous enough for users to enter their bank name. "Address" was ambiguous
1101
+ enough for users to enter their bank's address. Clearer labels ("Your Home
1102
+ Address," "Your Company Name (optional)") would have prevented $12 million in
1103
+ annual losses.
1104
+ - In international contexts, "Phone" without format guidance generates a mix of
1105
+ formats that break validation and downstream processing.
1106
+ - Ambiguous date fields cause systematic data errors: half of international users
1107
+ enter DD/MM/YYYY when the system expects MM/DD/YYYY, resulting in corrupted
1108
+ date data that surfaces months later.
1109
+
1110
+ **The fix:**
1111
+ Use specific, descriptive labels: "Home address," "Billing address," "First
1112
+ name," "Last name." Add helper text below the field for format or context
1113
+ guidance: "Enter your home address as it appears on your credit card statement."
1114
+ For date fields, either use a date picker or show the expected format explicitly.
1115
+ For international inputs, show the expected format and provide input masking.
1116
+
1117
+ **Detection rule:**
1118
+ If a form label is a single generic word ("Address," "Name," "Phone," "Amount,"
1119
+ "Date") without qualifying context, helper text, or input formatting, this
1120
+ is AP-22.
1121
+
1122
+ ---
1123
+
1124
+ ## Root Cause Analysis
1125
+
1126
+ | Anti-Pattern | Root Cause | Prevention |
1127
+ |-------------|------------|------------|
1128
+ | AP-01: Ghost Labels | Aesthetic prioritization over usability | Accessibility audit checklist; WCAG 3.3.2 compliance check |
1129
+ | AP-02: Invisible Wall | Uncalibrated design environments | Contrast checker in design pipeline; automated a11y testing |
1130
+ | AP-03: Thumbs Down | Desktop-first development mindset | Mobile-first design; real-device testing protocol |
1131
+ | AP-04: Monochrome Signal | Over-reliance on color as visual shortcut | WCAG 1.4.1 compliance check; color-blind simulation testing |
1132
+ | AP-05: Text Avalanche | No content design process | Heading structure requirements; content design review |
1133
+ | AP-06: Pixel-Perfect Mirage | Static mockup culture | Content stress-test protocol; responsive design tokens |
1134
+ | AP-07: Mystery Icon | Designer familiarity bias | Icon usability testing; mandatory label policy |
1135
+ | AP-08: Infinite Truncation | CSS-only overflow fix | Truncation component with built-in tooltip/expand |
1136
+ | AP-09: Rigid Grid | Desktop-only requirements | Responsive-first implementation; WCAG 1.4.10 compliance |
1137
+ | AP-10: Z-Index Arms Race | Misunderstanding of stacking contexts | Z-index token scale; CSS architecture guidelines |
1138
+ | AP-11: Font Carnival | No design system enforcement | Design token linting; limited font/color palette |
1139
+ | AP-12: Inconsistent Buttons | Decentralized component ownership | Shared button component library; design system |
1140
+ | AP-13: Spacing Lottery | Ad-hoc spacing decisions | Spacing scale tokens; automated spacing audit |
1141
+ | AP-14: Silent Sentinel | Misapplied progressive disclosure | Active buttons with inline validation errors |
1142
+ | AP-15: Notification Avalanche | Feature-team silos adding alerts independently | Centralized notification priority system |
1143
+ | AP-16: Kitchen Sink Dashboard | Accretion without curation | Dashboard review cadence; information hierarchy |
1144
+ | AP-17: Format Babel | No shared formatting utility | Centralized Intl-based formatting functions |
1145
+ | AP-18: Spreadsheet Table | Backend-schema-driven UI | Responsive table component; column prioritization |
1146
+ | AP-19: Unit Phantom | Developer context assumption | "Always show units" rule; display layer formatting |
1147
+ | AP-20: Superfluous Field | "Might need it" data hoarding | Field audit against downstream consumers; GDPR review |
1148
+ | AP-21: Content-Length Assumption | Happy-path-only testing | Four-state content testing (empty/min/typical/max) |
1149
+ | AP-22: Ambiguous Form Field | Backend model names as UI labels | Descriptive label policy; user-tested field labels |
1150
+
1151
+ ---
1152
+
1153
+ ## Self-Check Questions
1154
+
1155
+ 1. Does every form input have a visible, persistent label that remains when the field has focus and content?
1156
+ 2. Have I checked the contrast ratio of all text against its background using an automated tool -- including text on images, colored backgrounds, and disabled states?
1157
+ 3. Is every interactive element at least 44x44 CSS pixels on touch devices, with at least 8px spacing from adjacent targets?
1158
+ 4. If I remove all color from this screen (convert to grayscale), can a user still understand every status, category, and action?
1159
+ 5. Does this content block have headings, lists, or other visual structure -- or is it an undifferentiated wall of text?
1160
+ 6. What happens to this layout when the content is empty? One word? One hundred words? Translated to German?
1161
+ 7. Can a user identify every icon's function without hovering, tapping, or guessing?
1162
+ 8. If text is truncated anywhere, can the user access the full text through a tooltip, expand action, or detail view?
1163
+ 9. Does this layout work at 320px wide, 768px wide, and 1440px wide? Does it work when the user zooms to 200%?
1164
+ 10. Am I using a defined z-index scale, or am I adding an arbitrary number "to make it appear on top"?
1165
+ 11. Am I using more than 2 font families or more than 8 colors on this page?
1166
+ 12. Is the primary action button visually distinct from secondary and destructive actions, and is it in the same position as on every other page?
1167
+ 13. Does every disabled element explain why it is disabled and what the user must do to enable it?
1168
+ 14. How many notifications does a user see on first load? Is each one necessary and prioritized?
1169
+ 15. Does every numeric value on screen include its unit, currency, or measurement context?
1170
+
1171
+ ---
1172
+
1173
+ ## Code Smell Quick Reference
1174
+
1175
+ | If you see... | Suspect... | Verify... |
1176
+ |---------------|-----------|-----------|
1177
+ | `<input placeholder="...">` with no `<label>` | AP-01: Ghost Labels | Check for `aria-label` or `aria-labelledby`; if absent, fix with visible label |
1178
+ | Text color close to background color (gray on white, etc.) | AP-02: Invisible Wall | Run contrast checker; must be >= 4.5:1 for normal text |
1179
+ | Interactive element smaller than 44x44px | AP-03: Thumbs Down | Measure rendered size on mobile viewport; check touch target spacing |
1180
+ | Status shown only via color (red border, green dot) | AP-04: Monochrome Signal | Verify a second visual cue exists (icon, text, shape) |
1181
+ | 200+ word block with no `<h2>`-`<h6>`, no lists | AP-05: Text Avalanche | Add heading hierarchy; break into scannable sections |
1182
+ | Fixed `height`/`width` on text containers | AP-06: Pixel-Perfect Mirage | Test with empty, short, long, and translated content |
1183
+ | Icon button with no visible text label | AP-07: Mystery Icon | Add visible label; at minimum add `aria-label` |
1184
+ | `text-overflow: ellipsis` with no `title` or tooltip | AP-08: Infinite Truncation | Add tooltip, expand action, or detail view link |
1185
+ | `width: 960px` or similar fixed container | AP-09: Rigid Grid | Replace with responsive units (%, vw, max-width) and media queries |
1186
+ | `z-index` value > 1000 or escalating values | AP-10: Z-Index Arms Race | Implement z-index token scale; check for unintended stacking contexts |
1187
+ | 3+ `font-family` declarations or 8+ distinct colors | AP-11: Font Carnival | Audit against design tokens; reduce to systematic palette |
1188
+ | Same action styled differently across pages | AP-12: Inconsistent Buttons | Extract shared button component; standardize hierarchy |
1189
+ | Spacing values like 13px, 17px, 22px (off-scale) | AP-13: Spacing Lottery | Replace with spacing scale tokens (multiples of 4 or 8) |
1190
+ | `<button disabled>` with no adjacent explanation | AP-14: Silent Sentinel | Add visible helper text or switch to active button with validation |
1191
+ | Multiple toast/banner/modal on single user action | AP-15: Notification Avalanche | Implement notification priority queue; limit concurrent alerts |
1192
+ | Dashboard with 10+ charts on single view | AP-16: Kitchen Sink Dashboard | Prioritize top 5-7 metrics; move rest to drill-down views |
1193
+ | Same date shown as MM/DD and DD/MM in same app | AP-17: Format Babel | Centralize formatting through shared Intl utility |
1194
+ | Table with 10+ columns and horizontal scroll | AP-18: Spreadsheet Table | Add frozen columns, responsive card view, column visibility controls |
1195
+ | Numeric value displayed without unit or currency | AP-19: Unit Phantom | Add unit label, currency symbol, or contextual indicator |
1196
+ | Form with 10+ fields or unused "optional" fields | AP-20: Superfluous Field | Audit each field for downstream consumer; remove unused fields |
1197
+ | Component tested only with ideal-length content | AP-21: Content-Length Assumption | Test with empty, min, typical, max, and localized content |
1198
+ | Field labeled with single generic word ("Address") | AP-22: Ambiguous Form Field | Make label specific ("Home Address"); add helper text |
1199
+
1200
+ ---
1201
+
1202
+ *Researched: 2026-03-08 | Sources: [Nielsen Norman Group - Placeholders in Form Fields Are Harmful](https://www.nngroup.com/articles/form-design-placeholders/), [Nielsen Norman Group - Icon Usability](https://www.nngroup.com/articles/icon-usability/), [Nielsen Norman Group - Hamburger Menus and Hidden Navigation](https://www.nngroup.com/articles/hamburger-menus/), [Smashing Magazine - Frustrating Design Patterns: Disabled Buttons](https://www.smashingmagazine.com/2021/08/frustrating-design-patterns-disabled-buttons/), [Smashing Magazine - Accessible Target Sizes Cheatsheet](https://www.smashingmagazine.com/2023/04/accessible-tap-target-sizes-rage-taps-clicks/), [W3C WCAG 2.1 - Understanding SC 1.4.1 Use of Color](https://www.w3.org/WAI/WCAG21/Understanding/use-of-color.html), [W3C WCAG 2.1 - Understanding SC 1.4.3 Contrast Minimum](https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html), [W3C WCAG 2.2 - Understanding SC 2.5.8 Target Size Minimum](https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html), [W3C WCAG 2.1 - Understanding SC 1.4.10 Reflow](https://www.w3.org/WAI/WCAG21/Understanding/reflow.html), [WebAIM - Contrast and Color Accessibility](https://webaim.org/articles/contrast/), [Deque - Accessible Forms: The Problem with Placeholders](https://www.deque.com/blog/accessible-forms-the-problem-with-placeholders/), [Philip Walton - What No One Told You About Z-Index](https://philipwalton.com/articles/what-no-one-told-you-about-z-index/), [Josh Comeau - What The Heck, Z-Index](https://www.joshwcomeau.com/css/stacking-contexts/), [Josh Comeau - Chasing the Pixel-Perfect Dream](https://www.joshwcomeau.com/css/pixel-perfection/), [UX Movement - The $12 Million Optional Form Field (Expedia)](https://uxmovement.com/thinking/the-12-million-optional-form-field/), [Databox - Bad Dashboard Examples: 10 Common Mistakes](https://databox.com/bad-dashboard-examples), [IxDF - 7 Bad UI Design Examples](https://ixdf.org/literature/article/bad-ui-design-examples), [CareerFoundry - 10 Examples of Bad UI Design](https://careerfoundry.com/en/blog/ui-design/common-ui-design-mistakes/), [Cursor - Avoiding Anti-Patterns in Forms](https://cursor.co.uk/blog/avoiding-anti-patterns-in-forms), [MagicBell - Alert Fatigue](https://www.magicbell.com/blog/alert-fatigue), [Natalia Cackowska - Cures to Horizontal Scrolling Tables](https://nataliacackowska.com/blog/cures-to-horizontal-scrolling-tables), [ICS - Anti-Patterns of User Experience Design](https://www.ics.com/blog/anti-patterns-user-experience-design), [UI-Patterns - User Interface Anti-Patterns](https://ui-patterns.com/blog/User-Interface-AntiPatterns)*