@wazir-dev/cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +111 -0
- package/CHANGELOG.md +14 -0
- package/CONTRIBUTING.md +101 -0
- package/LICENSE +21 -0
- package/README.md +314 -0
- package/assets/composition-engine.mmd +34 -0
- package/assets/demo-script.sh +17 -0
- package/assets/logo-dark.svg +14 -0
- package/assets/logo.svg +14 -0
- package/assets/pipeline.mmd +39 -0
- package/assets/record-demo.sh +51 -0
- package/docs/README.md +51 -0
- package/docs/adapters/context-mode.md +60 -0
- package/docs/concepts/architecture.md +87 -0
- package/docs/concepts/artifact-model.md +60 -0
- package/docs/concepts/composition-engine.md +36 -0
- package/docs/concepts/indexing-and-recall.md +160 -0
- package/docs/concepts/observability.md +41 -0
- package/docs/concepts/roles-and-workflows.md +59 -0
- package/docs/concepts/terminology-policy.md +27 -0
- package/docs/getting-started/01-installation.md +78 -0
- package/docs/getting-started/02-first-run.md +102 -0
- package/docs/getting-started/03-adding-to-project.md +15 -0
- package/docs/getting-started/04-host-setup.md +15 -0
- package/docs/guides/ci-integration.md +15 -0
- package/docs/guides/creating-skills.md +15 -0
- package/docs/guides/expertise-module-authoring.md +15 -0
- package/docs/guides/hook-development.md +15 -0
- package/docs/guides/memory-and-learnings.md +34 -0
- package/docs/guides/multi-host-export.md +15 -0
- package/docs/guides/troubleshooting.md +101 -0
- package/docs/guides/writing-custom-roles.md +15 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-design.md +592 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-plan.md +598 -0
- package/docs/plans/2026-03-15-docs-enforcement-plan.md +238 -0
- package/docs/readmes/INDEX.md +99 -0
- package/docs/readmes/features/expertise/README.md +171 -0
- package/docs/readmes/features/exports/README.md +222 -0
- package/docs/readmes/features/hooks/README.md +103 -0
- package/docs/readmes/features/hooks/loop-cap-guard.md +133 -0
- package/docs/readmes/features/hooks/post-tool-capture.md +121 -0
- package/docs/readmes/features/hooks/post-tool-lint.md +130 -0
- package/docs/readmes/features/hooks/pre-compact-summary.md +122 -0
- package/docs/readmes/features/hooks/pre-tool-capture-route.md +100 -0
- package/docs/readmes/features/hooks/protected-path-write-guard.md +128 -0
- package/docs/readmes/features/hooks/session-start.md +119 -0
- package/docs/readmes/features/hooks/stop-handoff-harvest.md +125 -0
- package/docs/readmes/features/roles/README.md +157 -0
- package/docs/readmes/features/roles/clarifier.md +152 -0
- package/docs/readmes/features/roles/content-author.md +190 -0
- package/docs/readmes/features/roles/designer.md +193 -0
- package/docs/readmes/features/roles/executor.md +184 -0
- package/docs/readmes/features/roles/learner.md +210 -0
- package/docs/readmes/features/roles/planner.md +182 -0
- package/docs/readmes/features/roles/researcher.md +164 -0
- package/docs/readmes/features/roles/reviewer.md +184 -0
- package/docs/readmes/features/roles/specifier.md +162 -0
- package/docs/readmes/features/roles/verifier.md +215 -0
- package/docs/readmes/features/schemas/README.md +178 -0
- package/docs/readmes/features/skills/README.md +63 -0
- package/docs/readmes/features/skills/brainstorming.md +96 -0
- package/docs/readmes/features/skills/debugging.md +148 -0
- package/docs/readmes/features/skills/design.md +120 -0
- package/docs/readmes/features/skills/prepare-next.md +109 -0
- package/docs/readmes/features/skills/run-audit.md +159 -0
- package/docs/readmes/features/skills/scan-project.md +109 -0
- package/docs/readmes/features/skills/self-audit.md +176 -0
- package/docs/readmes/features/skills/tdd.md +137 -0
- package/docs/readmes/features/skills/using-skills.md +92 -0
- package/docs/readmes/features/skills/verification.md +120 -0
- package/docs/readmes/features/skills/writing-plans.md +104 -0
- package/docs/readmes/features/tooling/README.md +320 -0
- package/docs/readmes/features/workflows/README.md +186 -0
- package/docs/readmes/features/workflows/author.md +181 -0
- package/docs/readmes/features/workflows/clarify.md +154 -0
- package/docs/readmes/features/workflows/design-review.md +171 -0
- package/docs/readmes/features/workflows/design.md +169 -0
- package/docs/readmes/features/workflows/discover.md +162 -0
- package/docs/readmes/features/workflows/execute.md +173 -0
- package/docs/readmes/features/workflows/learn.md +167 -0
- package/docs/readmes/features/workflows/plan-review.md +165 -0
- package/docs/readmes/features/workflows/plan.md +170 -0
- package/docs/readmes/features/workflows/prepare-next.md +167 -0
- package/docs/readmes/features/workflows/review.md +169 -0
- package/docs/readmes/features/workflows/run-audit.md +191 -0
- package/docs/readmes/features/workflows/spec-challenge.md +159 -0
- package/docs/readmes/features/workflows/specify.md +160 -0
- package/docs/readmes/features/workflows/verify.md +177 -0
- package/docs/readmes/packages/README.md +50 -0
- package/docs/readmes/packages/ajv.md +117 -0
- package/docs/readmes/packages/context-mode.md +118 -0
- package/docs/readmes/packages/gray-matter.md +116 -0
- package/docs/readmes/packages/node-test.md +137 -0
- package/docs/readmes/packages/yaml.md +112 -0
- package/docs/reference/configuration-reference.md +159 -0
- package/docs/reference/expertise-index.md +52 -0
- package/docs/reference/git-flow.md +43 -0
- package/docs/reference/hooks.md +87 -0
- package/docs/reference/host-exports.md +50 -0
- package/docs/reference/launch-checklist.md +172 -0
- package/docs/reference/marketplace-listings.md +76 -0
- package/docs/reference/release-process.md +34 -0
- package/docs/reference/roles-reference.md +77 -0
- package/docs/reference/skills.md +33 -0
- package/docs/reference/templates.md +29 -0
- package/docs/reference/tooling-cli.md +94 -0
- package/docs/truth-claims.yaml +222 -0
- package/expertise/PROGRESS.md +63 -0
- package/expertise/README.md +18 -0
- package/expertise/antipatterns/PROGRESS.md +56 -0
- package/expertise/antipatterns/backend/api-design-antipatterns.md +1271 -0
- package/expertise/antipatterns/backend/auth-antipatterns.md +1195 -0
- package/expertise/antipatterns/backend/caching-antipatterns.md +622 -0
- package/expertise/antipatterns/backend/database-antipatterns.md +1038 -0
- package/expertise/antipatterns/backend/index.md +24 -0
- package/expertise/antipatterns/backend/microservices-antipatterns.md +850 -0
- package/expertise/antipatterns/code/architecture-antipatterns.md +919 -0
- package/expertise/antipatterns/code/async-antipatterns.md +622 -0
- package/expertise/antipatterns/code/code-smells.md +1186 -0
- package/expertise/antipatterns/code/dependency-antipatterns.md +1209 -0
- package/expertise/antipatterns/code/error-handling-antipatterns.md +1360 -0
- package/expertise/antipatterns/code/index.md +27 -0
- package/expertise/antipatterns/code/naming-and-abstraction.md +1118 -0
- package/expertise/antipatterns/code/state-management-antipatterns.md +1076 -0
- package/expertise/antipatterns/code/testing-antipatterns.md +1053 -0
- package/expertise/antipatterns/design/accessibility-antipatterns.md +1136 -0
- package/expertise/antipatterns/design/dark-patterns.md +1121 -0
- package/expertise/antipatterns/design/index.md +22 -0
- package/expertise/antipatterns/design/ui-antipatterns.md +1202 -0
- package/expertise/antipatterns/design/ux-antipatterns.md +680 -0
- package/expertise/antipatterns/frontend/css-layout-antipatterns.md +691 -0
- package/expertise/antipatterns/frontend/flutter-antipatterns.md +1827 -0
- package/expertise/antipatterns/frontend/index.md +23 -0
- package/expertise/antipatterns/frontend/mobile-antipatterns.md +573 -0
- package/expertise/antipatterns/frontend/react-antipatterns.md +1128 -0
- package/expertise/antipatterns/frontend/spa-antipatterns.md +1235 -0
- package/expertise/antipatterns/index.md +31 -0
- package/expertise/antipatterns/performance/index.md +20 -0
- package/expertise/antipatterns/performance/performance-antipatterns.md +1013 -0
- package/expertise/antipatterns/performance/premature-optimization.md +623 -0
- package/expertise/antipatterns/performance/scaling-antipatterns.md +785 -0
- package/expertise/antipatterns/process/ai-coding-antipatterns.md +853 -0
- package/expertise/antipatterns/process/code-review-antipatterns.md +656 -0
- package/expertise/antipatterns/process/deployment-antipatterns.md +920 -0
- package/expertise/antipatterns/process/index.md +23 -0
- package/expertise/antipatterns/process/technical-debt-antipatterns.md +647 -0
- package/expertise/antipatterns/security/index.md +20 -0
- package/expertise/antipatterns/security/secrets-antipatterns.md +849 -0
- package/expertise/antipatterns/security/security-theater.md +843 -0
- package/expertise/antipatterns/security/vulnerability-patterns.md +801 -0
- package/expertise/architecture/PROGRESS.md +70 -0
- package/expertise/architecture/data/caching-architecture.md +671 -0
- package/expertise/architecture/data/data-consistency.md +574 -0
- package/expertise/architecture/data/data-modeling.md +536 -0
- package/expertise/architecture/data/event-streams-and-queues.md +634 -0
- package/expertise/architecture/data/index.md +25 -0
- package/expertise/architecture/data/search-architecture.md +663 -0
- package/expertise/architecture/data/sql-vs-nosql.md +708 -0
- package/expertise/architecture/decisions/architecture-decision-records.md +640 -0
- package/expertise/architecture/decisions/build-vs-buy.md +616 -0
- package/expertise/architecture/decisions/index.md +23 -0
- package/expertise/architecture/decisions/monolith-to-microservices.md +790 -0
- package/expertise/architecture/decisions/technology-selection.md +616 -0
- package/expertise/architecture/distributed/cap-theorem-and-tradeoffs.md +800 -0
- package/expertise/architecture/distributed/circuit-breaker-bulkhead.md +741 -0
- package/expertise/architecture/distributed/consensus-and-coordination.md +796 -0
- package/expertise/architecture/distributed/distributed-systems-fundamentals.md +564 -0
- package/expertise/architecture/distributed/idempotency-and-retry.md +796 -0
- package/expertise/architecture/distributed/index.md +25 -0
- package/expertise/architecture/distributed/saga-pattern.md +797 -0
- package/expertise/architecture/foundations/architectural-thinking.md +460 -0
- package/expertise/architecture/foundations/coupling-and-cohesion.md +770 -0
- package/expertise/architecture/foundations/design-principles-solid.md +649 -0
- package/expertise/architecture/foundations/domain-driven-design.md +719 -0
- package/expertise/architecture/foundations/index.md +25 -0
- package/expertise/architecture/foundations/separation-of-concerns.md +472 -0
- package/expertise/architecture/foundations/twelve-factor-app.md +797 -0
- package/expertise/architecture/index.md +34 -0
- package/expertise/architecture/integration/api-design-graphql.md +638 -0
- package/expertise/architecture/integration/api-design-grpc.md +804 -0
- package/expertise/architecture/integration/api-design-rest.md +892 -0
- package/expertise/architecture/integration/index.md +25 -0
- package/expertise/architecture/integration/third-party-integration.md +795 -0
- package/expertise/architecture/integration/webhooks-and-callbacks.md +1152 -0
- package/expertise/architecture/integration/websockets-realtime.md +791 -0
- package/expertise/architecture/mobile-architecture/index.md +22 -0
- package/expertise/architecture/mobile-architecture/mobile-app-architecture.md +780 -0
- package/expertise/architecture/mobile-architecture/mobile-backend-for-frontend.md +670 -0
- package/expertise/architecture/mobile-architecture/offline-first.md +719 -0
- package/expertise/architecture/mobile-architecture/push-and-sync.md +782 -0
- package/expertise/architecture/patterns/cqrs-event-sourcing.md +717 -0
- package/expertise/architecture/patterns/event-driven.md +797 -0
- package/expertise/architecture/patterns/hexagonal-clean-architecture.md +870 -0
- package/expertise/architecture/patterns/index.md +27 -0
- package/expertise/architecture/patterns/layered-architecture.md +736 -0
- package/expertise/architecture/patterns/microservices.md +753 -0
- package/expertise/architecture/patterns/modular-monolith.md +692 -0
- package/expertise/architecture/patterns/monolith.md +626 -0
- package/expertise/architecture/patterns/plugin-architecture.md +735 -0
- package/expertise/architecture/patterns/serverless.md +780 -0
- package/expertise/architecture/scaling/database-scaling.md +615 -0
- package/expertise/architecture/scaling/feature-flags-and-rollouts.md +757 -0
- package/expertise/architecture/scaling/horizontal-vs-vertical.md +606 -0
- package/expertise/architecture/scaling/index.md +24 -0
- package/expertise/architecture/scaling/multi-tenancy.md +800 -0
- package/expertise/architecture/scaling/stateless-design.md +787 -0
- package/expertise/backend/embedded-firmware.md +625 -0
- package/expertise/backend/go.md +853 -0
- package/expertise/backend/index.md +24 -0
- package/expertise/backend/java-spring.md +448 -0
- package/expertise/backend/node-typescript.md +625 -0
- package/expertise/backend/python-fastapi.md +724 -0
- package/expertise/backend/rust.md +458 -0
- package/expertise/backend/solidity.md +711 -0
- package/expertise/composition-map.yaml +443 -0
- package/expertise/content/foundations/content-modeling.md +395 -0
- package/expertise/content/foundations/editorial-standards.md +449 -0
- package/expertise/content/foundations/index.md +24 -0
- package/expertise/content/foundations/microcopy.md +455 -0
- package/expertise/content/foundations/terminology-governance.md +509 -0
- package/expertise/content/index.md +34 -0
- package/expertise/content/patterns/accessibility-copy.md +518 -0
- package/expertise/content/patterns/index.md +24 -0
- package/expertise/content/patterns/notification-content.md +433 -0
- package/expertise/content/patterns/sample-content.md +486 -0
- package/expertise/content/patterns/state-copy.md +439 -0
- package/expertise/design/PROGRESS.md +58 -0
- package/expertise/design/disciplines/dark-mode-theming.md +577 -0
- package/expertise/design/disciplines/design-systems.md +595 -0
- package/expertise/design/disciplines/index.md +25 -0
- package/expertise/design/disciplines/information-architecture.md +800 -0
- package/expertise/design/disciplines/interaction-design.md +788 -0
- package/expertise/design/disciplines/responsive-design.md +552 -0
- package/expertise/design/disciplines/usability-testing.md +516 -0
- package/expertise/design/disciplines/user-research.md +792 -0
- package/expertise/design/foundations/accessibility-design.md +796 -0
- package/expertise/design/foundations/color-theory.md +797 -0
- package/expertise/design/foundations/iconography.md +795 -0
- package/expertise/design/foundations/index.md +26 -0
- package/expertise/design/foundations/motion-and-animation.md +653 -0
- package/expertise/design/foundations/rtl-design.md +585 -0
- package/expertise/design/foundations/spacing-and-layout.md +607 -0
- package/expertise/design/foundations/typography.md +800 -0
- package/expertise/design/foundations/visual-hierarchy.md +761 -0
- package/expertise/design/index.md +32 -0
- package/expertise/design/patterns/authentication-flows.md +474 -0
- package/expertise/design/patterns/content-consumption.md +789 -0
- package/expertise/design/patterns/data-display.md +618 -0
- package/expertise/design/patterns/e-commerce.md +1494 -0
- package/expertise/design/patterns/feedback-and-states.md +642 -0
- package/expertise/design/patterns/forms-and-input.md +819 -0
- package/expertise/design/patterns/gamification.md +801 -0
- package/expertise/design/patterns/index.md +31 -0
- package/expertise/design/patterns/microinteractions.md +449 -0
- package/expertise/design/patterns/navigation.md +800 -0
- package/expertise/design/patterns/notifications.md +705 -0
- package/expertise/design/patterns/onboarding.md +700 -0
- package/expertise/design/patterns/search-and-filter.md +601 -0
- package/expertise/design/patterns/settings-and-preferences.md +768 -0
- package/expertise/design/patterns/social-and-community.md +748 -0
- package/expertise/design/platforms/desktop-native.md +612 -0
- package/expertise/design/platforms/index.md +25 -0
- package/expertise/design/platforms/mobile-android.md +825 -0
- package/expertise/design/platforms/mobile-cross-platform.md +983 -0
- package/expertise/design/platforms/mobile-ios.md +699 -0
- package/expertise/design/platforms/tablet.md +794 -0
- package/expertise/design/platforms/web-dashboard.md +790 -0
- package/expertise/design/platforms/web-responsive.md +550 -0
- package/expertise/design/psychology/behavioral-nudges.md +449 -0
- package/expertise/design/psychology/cognitive-load.md +1191 -0
- package/expertise/design/psychology/error-psychology.md +778 -0
- package/expertise/design/psychology/index.md +22 -0
- package/expertise/design/psychology/persuasive-design.md +736 -0
- package/expertise/design/psychology/user-mental-models.md +623 -0
- package/expertise/design/tooling/open-pencil.md +266 -0
- package/expertise/frontend/angular.md +1073 -0
- package/expertise/frontend/desktop-electron.md +546 -0
- package/expertise/frontend/flutter.md +782 -0
- package/expertise/frontend/index.md +27 -0
- package/expertise/frontend/native-android.md +409 -0
- package/expertise/frontend/native-ios.md +490 -0
- package/expertise/frontend/react-native.md +1160 -0
- package/expertise/frontend/react.md +808 -0
- package/expertise/frontend/vue.md +1089 -0
- package/expertise/humanize/domain-rules-code.md +79 -0
- package/expertise/humanize/domain-rules-content.md +67 -0
- package/expertise/humanize/domain-rules-technical-docs.md +56 -0
- package/expertise/humanize/index.md +35 -0
- package/expertise/humanize/self-audit-checklist.md +87 -0
- package/expertise/humanize/sentence-patterns.md +218 -0
- package/expertise/humanize/vocabulary-blacklist.md +105 -0
- package/expertise/i18n/PROGRESS.md +65 -0
- package/expertise/i18n/advanced/accessibility-and-i18n.md +28 -0
- package/expertise/i18n/advanced/bidirectional-text-algorithm.md +38 -0
- package/expertise/i18n/advanced/complex-scripts.md +30 -0
- package/expertise/i18n/advanced/performance-and-i18n.md +27 -0
- package/expertise/i18n/advanced/testing-i18n.md +28 -0
- package/expertise/i18n/content/content-adaptation.md +23 -0
- package/expertise/i18n/content/locale-specific-formatting.md +23 -0
- package/expertise/i18n/content/machine-translation-integration.md +28 -0
- package/expertise/i18n/content/translation-management.md +29 -0
- package/expertise/i18n/foundations/date-time-calendars.md +67 -0
- package/expertise/i18n/foundations/i18n-architecture.md +272 -0
- package/expertise/i18n/foundations/locale-and-language-tags.md +79 -0
- package/expertise/i18n/foundations/numbers-currency-units.md +61 -0
- package/expertise/i18n/foundations/pluralization-and-gender.md +109 -0
- package/expertise/i18n/foundations/string-externalization.md +236 -0
- package/expertise/i18n/foundations/text-direction-bidi.md +241 -0
- package/expertise/i18n/foundations/unicode-and-encoding.md +86 -0
- package/expertise/i18n/index.md +38 -0
- package/expertise/i18n/platform/backend-i18n.md +31 -0
- package/expertise/i18n/platform/flutter-i18n.md +148 -0
- package/expertise/i18n/platform/native-android-i18n.md +36 -0
- package/expertise/i18n/platform/native-ios-i18n.md +36 -0
- package/expertise/i18n/platform/react-i18n.md +103 -0
- package/expertise/i18n/platform/web-css-i18n.md +81 -0
- package/expertise/i18n/rtl/arabic-specific.md +175 -0
- package/expertise/i18n/rtl/hebrew-specific.md +149 -0
- package/expertise/i18n/rtl/rtl-animations-and-transitions.md +111 -0
- package/expertise/i18n/rtl/rtl-forms-and-input.md +161 -0
- package/expertise/i18n/rtl/rtl-fundamentals.md +211 -0
- package/expertise/i18n/rtl/rtl-icons-and-images.md +181 -0
- package/expertise/i18n/rtl/rtl-layout-mirroring.md +252 -0
- package/expertise/i18n/rtl/rtl-navigation-and-gestures.md +107 -0
- package/expertise/i18n/rtl/rtl-testing-and-qa.md +147 -0
- package/expertise/i18n/rtl/rtl-typography.md +160 -0
- package/expertise/index.md +113 -0
- package/expertise/index.yaml +216 -0
- package/expertise/infrastructure/cloud-aws.md +597 -0
- package/expertise/infrastructure/cloud-gcp.md +599 -0
- package/expertise/infrastructure/cybersecurity.md +816 -0
- package/expertise/infrastructure/database-mongodb.md +447 -0
- package/expertise/infrastructure/database-postgres.md +400 -0
- package/expertise/infrastructure/devops-cicd.md +787 -0
- package/expertise/infrastructure/index.md +27 -0
- package/expertise/performance/PROGRESS.md +50 -0
- package/expertise/performance/backend/api-latency.md +1204 -0
- package/expertise/performance/backend/background-jobs.md +506 -0
- package/expertise/performance/backend/connection-pooling.md +1209 -0
- package/expertise/performance/backend/database-query-optimization.md +515 -0
- package/expertise/performance/backend/index.md +23 -0
- package/expertise/performance/backend/rate-limiting-and-throttling.md +971 -0
- package/expertise/performance/foundations/algorithmic-complexity.md +954 -0
- package/expertise/performance/foundations/caching-strategies.md +489 -0
- package/expertise/performance/foundations/concurrency-and-parallelism.md +847 -0
- package/expertise/performance/foundations/index.md +24 -0
- package/expertise/performance/foundations/measuring-and-profiling.md +440 -0
- package/expertise/performance/foundations/memory-management.md +964 -0
- package/expertise/performance/foundations/performance-budgets.md +1314 -0
- package/expertise/performance/index.md +31 -0
- package/expertise/performance/infrastructure/auto-scaling.md +1059 -0
- package/expertise/performance/infrastructure/cdn-and-edge.md +1081 -0
- package/expertise/performance/infrastructure/index.md +22 -0
- package/expertise/performance/infrastructure/load-balancing.md +1081 -0
- package/expertise/performance/infrastructure/observability.md +1079 -0
- package/expertise/performance/mobile/index.md +23 -0
- package/expertise/performance/mobile/mobile-animations.md +544 -0
- package/expertise/performance/mobile/mobile-memory-battery.md +416 -0
- package/expertise/performance/mobile/mobile-network.md +452 -0
- package/expertise/performance/mobile/mobile-rendering.md +599 -0
- package/expertise/performance/mobile/mobile-startup-time.md +505 -0
- package/expertise/performance/platform-specific/flutter-performance.md +647 -0
- package/expertise/performance/platform-specific/index.md +22 -0
- package/expertise/performance/platform-specific/node-performance.md +1307 -0
- package/expertise/performance/platform-specific/postgres-performance.md +1366 -0
- package/expertise/performance/platform-specific/react-performance.md +1403 -0
- package/expertise/performance/web/bundle-optimization.md +1239 -0
- package/expertise/performance/web/image-and-media.md +636 -0
- package/expertise/performance/web/index.md +24 -0
- package/expertise/performance/web/network-optimization.md +1133 -0
- package/expertise/performance/web/rendering-performance.md +1098 -0
- package/expertise/performance/web/ssr-and-hydration.md +918 -0
- package/expertise/performance/web/web-vitals.md +1374 -0
- package/expertise/quality/accessibility.md +985 -0
- package/expertise/quality/evidence-based-verification.md +499 -0
- package/expertise/quality/index.md +24 -0
- package/expertise/quality/ml-model-audit.md +614 -0
- package/expertise/quality/performance.md +600 -0
- package/expertise/quality/testing-api.md +891 -0
- package/expertise/quality/testing-mobile.md +496 -0
- package/expertise/quality/testing-web.md +849 -0
- package/expertise/security/PROGRESS.md +54 -0
- package/expertise/security/agentic-identity.md +540 -0
- package/expertise/security/compliance-frameworks.md +601 -0
- package/expertise/security/data/data-encryption.md +364 -0
- package/expertise/security/data/data-privacy-gdpr.md +692 -0
- package/expertise/security/data/database-security.md +1171 -0
- package/expertise/security/data/index.md +22 -0
- package/expertise/security/data/pii-handling.md +531 -0
- package/expertise/security/foundations/authentication.md +1041 -0
- package/expertise/security/foundations/authorization.md +603 -0
- package/expertise/security/foundations/cryptography.md +1001 -0
- package/expertise/security/foundations/index.md +25 -0
- package/expertise/security/foundations/owasp-top-10.md +1354 -0
- package/expertise/security/foundations/secrets-management.md +1217 -0
- package/expertise/security/foundations/secure-sdlc.md +700 -0
- package/expertise/security/foundations/supply-chain-security.md +698 -0
- package/expertise/security/index.md +31 -0
- package/expertise/security/infrastructure/cloud-security-aws.md +1296 -0
- package/expertise/security/infrastructure/cloud-security-gcp.md +1376 -0
- package/expertise/security/infrastructure/container-security.md +721 -0
- package/expertise/security/infrastructure/incident-response.md +1295 -0
- package/expertise/security/infrastructure/index.md +24 -0
- package/expertise/security/infrastructure/logging-and-monitoring.md +1618 -0
- package/expertise/security/infrastructure/network-security.md +1337 -0
- package/expertise/security/mobile/index.md +23 -0
- package/expertise/security/mobile/mobile-android-security.md +1218 -0
- package/expertise/security/mobile/mobile-binary-protection.md +1229 -0
- package/expertise/security/mobile/mobile-data-storage.md +1265 -0
- package/expertise/security/mobile/mobile-ios-security.md +1401 -0
- package/expertise/security/mobile/mobile-network-security.md +1520 -0
- package/expertise/security/smart-contract-security.md +594 -0
- package/expertise/security/testing/index.md +22 -0
- package/expertise/security/testing/penetration-testing.md +1258 -0
- package/expertise/security/testing/security-code-review.md +1765 -0
- package/expertise/security/testing/threat-modeling.md +1074 -0
- package/expertise/security/testing/vulnerability-scanning.md +1062 -0
- package/expertise/security/web/api-security.md +586 -0
- package/expertise/security/web/cors-and-headers.md +433 -0
- package/expertise/security/web/csrf.md +562 -0
- package/expertise/security/web/file-upload.md +1477 -0
- package/expertise/security/web/index.md +25 -0
- package/expertise/security/web/injection.md +1375 -0
- package/expertise/security/web/session-management.md +1101 -0
- package/expertise/security/web/xss.md +1158 -0
- package/exports/README.md +17 -0
- package/exports/hosts/claude/.claude/agents/clarifier.md +42 -0
- package/exports/hosts/claude/.claude/agents/content-author.md +63 -0
- package/exports/hosts/claude/.claude/agents/designer.md +55 -0
- package/exports/hosts/claude/.claude/agents/executor.md +55 -0
- package/exports/hosts/claude/.claude/agents/learner.md +51 -0
- package/exports/hosts/claude/.claude/agents/planner.md +53 -0
- package/exports/hosts/claude/.claude/agents/researcher.md +43 -0
- package/exports/hosts/claude/.claude/agents/reviewer.md +54 -0
- package/exports/hosts/claude/.claude/agents/specifier.md +47 -0
- package/exports/hosts/claude/.claude/agents/verifier.md +71 -0
- package/exports/hosts/claude/.claude/commands/author.md +42 -0
- package/exports/hosts/claude/.claude/commands/clarify.md +38 -0
- package/exports/hosts/claude/.claude/commands/design-review.md +46 -0
- package/exports/hosts/claude/.claude/commands/design.md +44 -0
- package/exports/hosts/claude/.claude/commands/discover.md +37 -0
- package/exports/hosts/claude/.claude/commands/execute.md +48 -0
- package/exports/hosts/claude/.claude/commands/learn.md +38 -0
- package/exports/hosts/claude/.claude/commands/plan-review.md +42 -0
- package/exports/hosts/claude/.claude/commands/plan.md +39 -0
- package/exports/hosts/claude/.claude/commands/prepare-next.md +37 -0
- package/exports/hosts/claude/.claude/commands/review.md +40 -0
- package/exports/hosts/claude/.claude/commands/run-audit.md +41 -0
- package/exports/hosts/claude/.claude/commands/spec-challenge.md +41 -0
- package/exports/hosts/claude/.claude/commands/specify.md +38 -0
- package/exports/hosts/claude/.claude/commands/verify.md +37 -0
- package/exports/hosts/claude/.claude/settings.json +34 -0
- package/exports/hosts/claude/CLAUDE.md +19 -0
- package/exports/hosts/claude/export.manifest.json +38 -0
- package/exports/hosts/claude/host-package.json +67 -0
- package/exports/hosts/codex/AGENTS.md +19 -0
- package/exports/hosts/codex/export.manifest.json +38 -0
- package/exports/hosts/codex/host-package.json +41 -0
- package/exports/hosts/cursor/.cursor/hooks.json +16 -0
- package/exports/hosts/cursor/.cursor/rules/wazir-core.mdc +19 -0
- package/exports/hosts/cursor/export.manifest.json +38 -0
- package/exports/hosts/cursor/host-package.json +42 -0
- package/exports/hosts/gemini/GEMINI.md +19 -0
- package/exports/hosts/gemini/export.manifest.json +38 -0
- package/exports/hosts/gemini/host-package.json +41 -0
- package/hooks/README.md +18 -0
- package/hooks/definitions/loop_cap_guard.yaml +21 -0
- package/hooks/definitions/post_tool_capture.yaml +24 -0
- package/hooks/definitions/pre_compact_summary.yaml +19 -0
- package/hooks/definitions/pre_tool_capture_route.yaml +19 -0
- package/hooks/definitions/protected_path_write_guard.yaml +19 -0
- package/hooks/definitions/session_start.yaml +19 -0
- package/hooks/definitions/stop_handoff_harvest.yaml +20 -0
- package/hooks/loop-cap-guard +17 -0
- package/hooks/post-tool-lint +36 -0
- package/hooks/protected-path-write-guard +17 -0
- package/hooks/session-start +41 -0
- package/llms-full.txt +2355 -0
- package/llms.txt +43 -0
- package/package.json +79 -0
- package/roles/README.md +20 -0
- package/roles/clarifier.md +42 -0
- package/roles/content-author.md +63 -0
- package/roles/designer.md +55 -0
- package/roles/executor.md +55 -0
- package/roles/learner.md +51 -0
- package/roles/planner.md +53 -0
- package/roles/researcher.md +43 -0
- package/roles/reviewer.md +54 -0
- package/roles/specifier.md +47 -0
- package/roles/verifier.md +71 -0
- package/schemas/README.md +24 -0
- package/schemas/accepted-learning.schema.json +20 -0
- package/schemas/author-artifact.schema.json +156 -0
- package/schemas/clarification.schema.json +19 -0
- package/schemas/design-artifact.schema.json +80 -0
- package/schemas/docs-claim.schema.json +18 -0
- package/schemas/export-manifest.schema.json +20 -0
- package/schemas/hook.schema.json +67 -0
- package/schemas/host-export-package.schema.json +18 -0
- package/schemas/implementation-plan.schema.json +19 -0
- package/schemas/proposed-learning.schema.json +19 -0
- package/schemas/research.schema.json +18 -0
- package/schemas/review.schema.json +29 -0
- package/schemas/run-manifest.schema.json +18 -0
- package/schemas/spec-challenge.schema.json +18 -0
- package/schemas/spec.schema.json +20 -0
- package/schemas/usage.schema.json +102 -0
- package/schemas/verification-proof.schema.json +29 -0
- package/schemas/wazir-manifest.schema.json +173 -0
- package/skills/README.md +40 -0
- package/skills/brainstorming/SKILL.md +77 -0
- package/skills/debugging/SKILL.md +50 -0
- package/skills/design/SKILL.md +61 -0
- package/skills/dispatching-parallel-agents/SKILL.md +128 -0
- package/skills/executing-plans/SKILL.md +70 -0
- package/skills/finishing-a-development-branch/SKILL.md +169 -0
- package/skills/humanize/SKILL.md +123 -0
- package/skills/init-pipeline/SKILL.md +124 -0
- package/skills/prepare-next/SKILL.md +20 -0
- package/skills/receiving-code-review/SKILL.md +123 -0
- package/skills/requesting-code-review/SKILL.md +105 -0
- package/skills/requesting-code-review/code-reviewer.md +108 -0
- package/skills/run-audit/SKILL.md +197 -0
- package/skills/scan-project/SKILL.md +41 -0
- package/skills/self-audit/SKILL.md +153 -0
- package/skills/subagent-driven-development/SKILL.md +154 -0
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/skills/subagent-driven-development/implementer-prompt.md +102 -0
- package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/skills/tdd/SKILL.md +23 -0
- package/skills/using-git-worktrees/SKILL.md +163 -0
- package/skills/using-skills/SKILL.md +95 -0
- package/skills/verification/SKILL.md +22 -0
- package/skills/wazir/SKILL.md +463 -0
- package/skills/writing-plans/SKILL.md +30 -0
- package/skills/writing-skills/SKILL.md +157 -0
- package/skills/writing-skills/anthropic-best-practices.md +122 -0
- package/skills/writing-skills/persuasion-principles.md +50 -0
- package/templates/README.md +20 -0
- package/templates/artifacts/README.md +10 -0
- package/templates/artifacts/accepted-learning.md +19 -0
- package/templates/artifacts/accepted-learning.template.json +12 -0
- package/templates/artifacts/author.md +74 -0
- package/templates/artifacts/author.template.json +19 -0
- package/templates/artifacts/clarification.md +21 -0
- package/templates/artifacts/clarification.template.json +12 -0
- package/templates/artifacts/execute-notes.md +19 -0
- package/templates/artifacts/implementation-plan.md +21 -0
- package/templates/artifacts/implementation-plan.template.json +11 -0
- package/templates/artifacts/learning-proposal.md +19 -0
- package/templates/artifacts/next-run-handoff.md +21 -0
- package/templates/artifacts/plan-review.md +19 -0
- package/templates/artifacts/proposed-learning.template.json +12 -0
- package/templates/artifacts/research.md +21 -0
- package/templates/artifacts/research.template.json +12 -0
- package/templates/artifacts/review-findings.md +19 -0
- package/templates/artifacts/review.template.json +11 -0
- package/templates/artifacts/run-manifest.template.json +8 -0
- package/templates/artifacts/spec-challenge.md +19 -0
- package/templates/artifacts/spec-challenge.template.json +11 -0
- package/templates/artifacts/spec.md +21 -0
- package/templates/artifacts/spec.template.json +12 -0
- package/templates/artifacts/verification-proof.md +19 -0
- package/templates/artifacts/verification-proof.template.json +11 -0
- package/templates/examples/accepted-learning.example.json +14 -0
- package/templates/examples/author.example.json +152 -0
- package/templates/examples/clarification.example.json +15 -0
- package/templates/examples/docs-claim.example.json +8 -0
- package/templates/examples/export-manifest.example.json +7 -0
- package/templates/examples/host-export-package.example.json +11 -0
- package/templates/examples/implementation-plan.example.json +17 -0
- package/templates/examples/proposed-learning.example.json +13 -0
- package/templates/examples/research.example.json +15 -0
- package/templates/examples/research.example.md +6 -0
- package/templates/examples/review.example.json +17 -0
- package/templates/examples/run-manifest.example.json +9 -0
- package/templates/examples/spec-challenge.example.json +14 -0
- package/templates/examples/spec.example.json +21 -0
- package/templates/examples/verification-proof.example.json +21 -0
- package/templates/examples/wazir-manifest.example.yaml +65 -0
- package/templates/task-definition-schema.md +99 -0
- package/tooling/README.md +20 -0
- package/tooling/src/adapters/context-mode.js +50 -0
- package/tooling/src/capture/command.js +376 -0
- package/tooling/src/capture/store.js +99 -0
- package/tooling/src/capture/usage.js +270 -0
- package/tooling/src/checks/branches.js +50 -0
- package/tooling/src/checks/brand-truth.js +110 -0
- package/tooling/src/checks/changelog.js +231 -0
- package/tooling/src/checks/command-registry.js +36 -0
- package/tooling/src/checks/commits.js +102 -0
- package/tooling/src/checks/docs-drift.js +103 -0
- package/tooling/src/checks/docs-truth.js +201 -0
- package/tooling/src/checks/runtime-surface.js +156 -0
- package/tooling/src/cli.js +116 -0
- package/tooling/src/command-options.js +56 -0
- package/tooling/src/commands/validate.js +320 -0
- package/tooling/src/doctor/command.js +91 -0
- package/tooling/src/export/command.js +77 -0
- package/tooling/src/export/compiler.js +498 -0
- package/tooling/src/guards/loop-cap-guard.js +52 -0
- package/tooling/src/guards/protected-path-write-guard.js +67 -0
- package/tooling/src/index/command.js +152 -0
- package/tooling/src/index/storage.js +1061 -0
- package/tooling/src/index/summarizers.js +261 -0
- package/tooling/src/loaders.js +18 -0
- package/tooling/src/project-root.js +22 -0
- package/tooling/src/recall/command.js +225 -0
- package/tooling/src/schema-validator.js +30 -0
- package/tooling/src/state-root.js +40 -0
- package/tooling/src/status/command.js +71 -0
- package/wazir.manifest.yaml +135 -0
- package/workflows/README.md +19 -0
- package/workflows/author.md +42 -0
- package/workflows/clarify.md +38 -0
- package/workflows/design-review.md +46 -0
- package/workflows/design.md +44 -0
- package/workflows/discover.md +37 -0
- package/workflows/execute.md +48 -0
- package/workflows/learn.md +38 -0
- package/workflows/plan-review.md +42 -0
- package/workflows/plan.md +39 -0
- package/workflows/prepare-next.md +37 -0
- package/workflows/review.md +40 -0
- package/workflows/run-audit.md +41 -0
- package/workflows/spec-challenge.md +41 -0
- package/workflows/specify.md +38 -0
- package/workflows/verify.md +37 -0
|
@@ -0,0 +1,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)*
|