@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,919 @@
|
|
|
1
|
+
# Architecture Anti-Patterns
|
|
2
|
+
> A field guide to structural decisions that degrade systems over time. Each entry documents the pattern's
|
|
3
|
+
> seductive appeal, the damage it causes, and the concrete steps to reverse it. At least a third of these
|
|
4
|
+
> entries reference production incidents, public post-mortems, or documented losses at named organizations.
|
|
5
|
+
> Use this module during architecture reviews, tech-debt triage, and new-system design.
|
|
6
|
+
> **Domain:** Code
|
|
7
|
+
> **Anti-patterns covered:** 18
|
|
8
|
+
> **Highest severity:** Critical
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Table of Contents
|
|
13
|
+
|
|
14
|
+
1. [AP-01: Big Ball of Mud](#ap-01-big-ball-of-mud)
|
|
15
|
+
2. [AP-02: Golden Hammer](#ap-02-golden-hammer)
|
|
16
|
+
3. [AP-03: Architecture Astronaut](#ap-03-architecture-astronaut)
|
|
17
|
+
4. [AP-04: Distributed Monolith](#ap-04-distributed-monolith)
|
|
18
|
+
5. [AP-05: Lava Flow](#ap-05-lava-flow)
|
|
19
|
+
6. [AP-06: Vendor Lock-in](#ap-06-vendor-lock-in)
|
|
20
|
+
7. [AP-07: Inner Platform Effect](#ap-07-inner-platform-effect)
|
|
21
|
+
8. [AP-08: Accidental Complexity](#ap-08-accidental-complexity)
|
|
22
|
+
9. [AP-09: Circular Dependencies](#ap-09-circular-dependencies)
|
|
23
|
+
10. [AP-10: God Service](#ap-10-god-service)
|
|
24
|
+
11. [AP-11: Sinkhole Anti-pattern](#ap-11-sinkhole-anti-pattern)
|
|
25
|
+
12. [AP-12: Stovepipe System](#ap-12-stovepipe-system)
|
|
26
|
+
13. [AP-13: Swiss Army Knife](#ap-13-swiss-army-knife)
|
|
27
|
+
14. [AP-14: Reinventing the Wheel](#ap-14-reinventing-the-wheel)
|
|
28
|
+
15. [AP-15: Not Invented Here Syndrome](#ap-15-not-invented-here-syndrome)
|
|
29
|
+
16. [AP-16: Boat Anchor](#ap-16-boat-anchor)
|
|
30
|
+
17. [AP-17: Dead End Architecture](#ap-17-dead-end-architecture)
|
|
31
|
+
18. [AP-18: Ambiguous Viewpoint](#ap-18-ambiguous-viewpoint)
|
|
32
|
+
19. [Root Cause Analysis](#root-cause-analysis)
|
|
33
|
+
20. [Self-Check Questions](#self-check-questions)
|
|
34
|
+
21. [Code Smell Quick Reference](#code-smell-quick-reference)
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Anti-Pattern Entries
|
|
39
|
+
|
|
40
|
+
### AP-01: Big Ball of Mud
|
|
41
|
+
|
|
42
|
+
**Also known as:** Shantytown, Spaghetti Architecture, Organic Growth
|
|
43
|
+
**Frequency:** Very Common
|
|
44
|
+
**Severity:** Critical
|
|
45
|
+
**Detection difficulty:** Easy
|
|
46
|
+
|
|
47
|
+
**What it looks like:**
|
|
48
|
+
A system with no discernible architecture. Modules reference each other arbitrarily. Business logic is
|
|
49
|
+
scattered across controllers, database triggers, stored procedures, and utility classes. There are no
|
|
50
|
+
enforced layer boundaries. Package diagrams look like a fully connected graph. New developers need months
|
|
51
|
+
of tribal knowledge transfer before making safe changes.
|
|
52
|
+
|
|
53
|
+
**Why developers do it:**
|
|
54
|
+
Shipping pressure. The first prototype works, and nobody allocates time to refactor before the next
|
|
55
|
+
feature. Each shortcut is individually rational: "We'll clean it up later." Foote and Yoder documented
|
|
56
|
+
this in their seminal 1997 paper -- the Big Ball of Mud is the dominant architecture in real-world
|
|
57
|
+
systems precisely because it requires zero upfront investment.
|
|
58
|
+
|
|
59
|
+
**What goes wrong:**
|
|
60
|
+
- Change amplification: a single business rule change touches 15+ files across unrelated modules.
|
|
61
|
+
- Twitter's original Ruby on Rails monolith buckled under 1,444% user growth (2008-2009). The "Fail Whale"
|
|
62
|
+
error page became a cultural icon. Outages were so frequent that the company undertook a multi-year
|
|
63
|
+
migration to JVM-based services, eventually achieving a 50x throughput improvement (from ~300 to
|
|
64
|
+
~15,000 requests/sec per host).
|
|
65
|
+
- Healthcare.gov crashed within two hours of its October 2013 launch. Only six people completed
|
|
66
|
+
enrollment on day one. Over 50 contractors had built subsystems that could not communicate, with
|
|
67
|
+
insufficient integration architecture. The recovery took months and cost hundreds of millions.
|
|
68
|
+
- Research data-mining expeditions have found that 30-50% of code in complex legacy systems is not
|
|
69
|
+
understood or documented by anyone currently working on the project.
|
|
70
|
+
|
|
71
|
+
**The fix:**
|
|
72
|
+
1. Identify bounded contexts using domain-driven design (DDD).
|
|
73
|
+
2. Draw module boundaries and enforce them with build tooling (e.g., ArchUnit, dependency-cruiser).
|
|
74
|
+
3. Strangle-fig pattern: route traffic through a facade, replacing internals module by module.
|
|
75
|
+
4. Establish an Architecture Decision Record (ADR) process so boundaries persist.
|
|
76
|
+
5. Budget 20% of each sprint for structural improvement, not just feature work.
|
|
77
|
+
|
|
78
|
+
**Detection rule:**
|
|
79
|
+
Flag when any single module has incoming dependencies from more than 30% of all other modules, or when
|
|
80
|
+
the average fan-out per module exceeds 10.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
### AP-02: Golden Hammer
|
|
85
|
+
|
|
86
|
+
**Also known as:** Law of the Instrument, Maslow's Hammer, Silver Bullet Syndrome
|
|
87
|
+
**Frequency:** Very Common
|
|
88
|
+
**Severity:** High
|
|
89
|
+
**Detection difficulty:** Moderate
|
|
90
|
+
|
|
91
|
+
**What it looks like:**
|
|
92
|
+
One technology, framework, or pattern is applied to every problem in the organization. All data goes into
|
|
93
|
+
a relational database regardless of access patterns. All communication is synchronous REST regardless of
|
|
94
|
+
latency requirements. All logic lives in stored procedures, or conversely, zero logic lives in the
|
|
95
|
+
database. The tech stack is chosen based on team familiarity rather than problem fit.
|
|
96
|
+
|
|
97
|
+
**Why developers do it:**
|
|
98
|
+
Two drivers: (1) deep expertise in a tool creates cognitive bias toward applying it everywhere, and
|
|
99
|
+
(2) sunk-cost justification -- a company spent $2M licensing an enterprise platform and now must use it
|
|
100
|
+
for everything to "get the ROI." As Abraham Maslow put it: "If all you have is a hammer, everything
|
|
101
|
+
looks like a nail."
|
|
102
|
+
|
|
103
|
+
**What goes wrong:**
|
|
104
|
+
- Enterprise systems that move all business logic into stored procedures create performance bottlenecks,
|
|
105
|
+
prevent horizontal scaling, and make the database a single point of failure. One documented enterprise
|
|
106
|
+
system used stored procedures for business logic, data validation, and workflow orchestration,
|
|
107
|
+
resulting in a brittle, unmaintainable codebase tied to a single database vendor.
|
|
108
|
+
- Organizations that force MongoDB into relational use cases (or PostgreSQL into document-store use
|
|
109
|
+
cases) spend months fighting impedance mismatches that a purpose-built tool would avoid.
|
|
110
|
+
- The XML-for-everything era of the early 2000s produced configuration systems so verbose that the
|
|
111
|
+
config files were harder to maintain than the code they configured (e.g., early J2EE deployment
|
|
112
|
+
descriptors).
|
|
113
|
+
|
|
114
|
+
**The fix:**
|
|
115
|
+
1. Maintain a technology radar with explicit "use for" and "do not use for" guidance.
|
|
116
|
+
2. Require architecture decision records (ADRs) that document alternatives considered.
|
|
117
|
+
3. Run proof-of-concept spikes with at least two candidate technologies for non-trivial problems.
|
|
118
|
+
4. Rotate team members across stacks to broaden collective expertise.
|
|
119
|
+
|
|
120
|
+
**Detection rule:**
|
|
121
|
+
Flag when more than 80% of services share the same data store type despite having different access
|
|
122
|
+
patterns (graph, time-series, document, relational, key-value).
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
### AP-03: Architecture Astronaut
|
|
127
|
+
|
|
128
|
+
**Also known as:** Ivory Tower Architect, Over-Abstraction, Speculative Generality
|
|
129
|
+
**Frequency:** Common
|
|
130
|
+
**Severity:** High
|
|
131
|
+
**Detection difficulty:** Hard
|
|
132
|
+
|
|
133
|
+
**What it looks like:**
|
|
134
|
+
Layers of abstraction that solve theoretical future problems nobody has today. A "messaging framework"
|
|
135
|
+
that wraps a queue that wraps another queue. A plugin system for an application with one plugin. An
|
|
136
|
+
internal DSL that takes longer to learn than the underlying language. Interface hierarchies six levels
|
|
137
|
+
deep where a single concrete class would suffice. The architecture diagram is impressive; the working
|
|
138
|
+
software is late.
|
|
139
|
+
|
|
140
|
+
**Why developers do it:**
|
|
141
|
+
Joel Spolsky named this in 2001: architects "go too far up, abstraction-wise, and run out of oxygen."
|
|
142
|
+
They see patterns across problems and build for the generalized case. It feels like good engineering.
|
|
143
|
+
Resume-driven development also plays a role -- building a distributed event-sourcing system is more
|
|
144
|
+
exciting to talk about than a three-table CRUD app.
|
|
145
|
+
|
|
146
|
+
**What goes wrong:**
|
|
147
|
+
- Spolsky's original critique targeted architects who "don't solve an actual problem -- they solve
|
|
148
|
+
something that appears to be the template of a lot of problems." John Carmack echoed this,
|
|
149
|
+
identifying "a class of programmers who only want to talk about things from the highest level."
|
|
150
|
+
- The Segway is a hardware analogy: over-engineered with dual redundant motors, dual batteries, and
|
|
151
|
+
custom components for every subsystem. The result was a $5,000 device that sold 5,000 units in its
|
|
152
|
+
first two years instead of the projected millions. Technical perfection did not equal product-market
|
|
153
|
+
fit.
|
|
154
|
+
- Teams that build internal platforms with DSLs often find that only the original author can maintain
|
|
155
|
+
them. When that person leaves, the abstraction becomes a liability.
|
|
156
|
+
|
|
157
|
+
**The fix:**
|
|
158
|
+
1. Apply YAGNI (You Aren't Gonna Need It) ruthlessly. Build for today's requirements.
|
|
159
|
+
2. Limit abstraction depth: if a call chain passes through more than 3 layers of indirection before
|
|
160
|
+
doing real work, compress it.
|
|
161
|
+
3. Require every abstraction to justify itself with at least two current (not future) consumers.
|
|
162
|
+
4. Time-box design phases. If the architecture diagram takes more than 2 days, start building and
|
|
163
|
+
let the design emerge.
|
|
164
|
+
|
|
165
|
+
**Detection rule:**
|
|
166
|
+
Flag interfaces or abstract classes with exactly one implementation (outside of DI boundaries). Flag
|
|
167
|
+
call chains deeper than 5 that perform no transformation at each intermediate step.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
### AP-04: Distributed Monolith
|
|
172
|
+
|
|
173
|
+
**Also known as:** Microliths, Coupled Microservices, Distributed Ball of Mud
|
|
174
|
+
**Frequency:** Common
|
|
175
|
+
**Severity:** Critical
|
|
176
|
+
**Detection difficulty:** Hard
|
|
177
|
+
|
|
178
|
+
**What it looks like:**
|
|
179
|
+
The system has been decomposed into separately deployed services, but the services cannot be deployed,
|
|
180
|
+
tested, or released independently. A change to Service A requires coordinated changes to Services B, C,
|
|
181
|
+
and D. Shared databases, synchronous call chains, and shared libraries with business logic bind the
|
|
182
|
+
services together. You have all the operational complexity of microservices with none of the benefits.
|
|
183
|
+
|
|
184
|
+
**Why developers do it:**
|
|
185
|
+
Microservices became the default architecture heuristic circa 2015. Teams split monoliths along
|
|
186
|
+
technical boundaries (UI service, API service, data service) instead of business boundaries. Shared
|
|
187
|
+
database schemas were kept "for convenience." Synchronous HTTP chains replaced in-process function
|
|
188
|
+
calls without rethinking coupling.
|
|
189
|
+
|
|
190
|
+
**What goes wrong:**
|
|
191
|
+
- Deployment coupling: changing a shared database column requires synchronized releases across all
|
|
192
|
+
dependent services, often with downtime windows.
|
|
193
|
+
- Cascading failures: a downstream service timeout propagates up the synchronous chain, taking out
|
|
194
|
+
the entire request path. Without circuit breakers, a single slow service can brown-out the system.
|
|
195
|
+
- Etsy documented the pain of a distributed monolith during their migration, adopting a gradual
|
|
196
|
+
strangler strategy starting with non-critical services to avoid big-bang rewrites.
|
|
197
|
+
- Spotify, running 810+ microservices across 90 teams, found that the biggest complexity was not
|
|
198
|
+
within individual services but in how they interact. They shifted testing strategy from unit-heavy
|
|
199
|
+
to integration-heavy ("Testing Honeycomb") to catch coupling issues early.
|
|
200
|
+
|
|
201
|
+
**The fix:**
|
|
202
|
+
1. Draw service boundaries around business capabilities (DDD bounded contexts), not technical layers.
|
|
203
|
+
2. Each service owns its data store -- no shared databases.
|
|
204
|
+
3. Prefer asynchronous messaging (events) over synchronous HTTP for inter-service communication.
|
|
205
|
+
4. Enforce the "independent deployability" test: can you deploy any service without touching others?
|
|
206
|
+
5. Use consumer-driven contract testing (Pact) to catch integration drift without end-to-end tests.
|
|
207
|
+
|
|
208
|
+
**Detection rule:**
|
|
209
|
+
Flag services that share a database schema. Flag services that require coordinated deployment (release
|
|
210
|
+
trains). Measure deployment coupling: if >20% of deploys require multi-service changes, investigate.
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
### AP-05: Lava Flow
|
|
215
|
+
|
|
216
|
+
**Also known as:** Dead Code, Fossilized Code, 36-Month Sediment
|
|
217
|
+
**Frequency:** Very Common
|
|
218
|
+
**Severity:** High
|
|
219
|
+
**Detection difficulty:** Moderate
|
|
220
|
+
|
|
221
|
+
**What it looks like:**
|
|
222
|
+
Production code that nobody understands, nobody owns, and nobody dares remove. Entire classes marked
|
|
223
|
+
`@Deprecated` years ago still receive traffic. Feature flags from 2019 are still toggled on. Migration
|
|
224
|
+
scripts from three database versions ago sit in the deployment pipeline. The code "works" so everyone
|
|
225
|
+
builds around it, layering new logic on top of an unexamined foundation.
|
|
226
|
+
|
|
227
|
+
**Why developers do it:**
|
|
228
|
+
Fear. "What if something depends on it?" In research-originated systems, experimental code gets promoted
|
|
229
|
+
to production without cleanup. In product teams, aggressive deadlines mean proofs-of-concept get shipped
|
|
230
|
+
directly. Developer turnover means institutional knowledge about what code is active evaporates.
|
|
231
|
+
|
|
232
|
+
**What goes wrong:**
|
|
233
|
+
- Knight Capital, August 1, 2012: deprecated "Power Peg" trading code had been left in production for
|
|
234
|
+
years. During a deployment, one of eight servers did not receive the updated code (the deployment
|
|
235
|
+
script failed silently on SSH connection error). The old server activated the dead Power Peg code,
|
|
236
|
+
which sent millions of unintended orders in 45 minutes. Loss: $440 million. Knight was acquired by
|
|
237
|
+
a rival within a year.
|
|
238
|
+
- Research teams examining legacy systems regularly find 30-50% of the codebase is dead or orphaned,
|
|
239
|
+
yet it still increases compile times, confuses developers, and creates false positives in security
|
|
240
|
+
scans.
|
|
241
|
+
- One documented migration project found an 11,000-line file in a 10-year-old internal application
|
|
242
|
+
that no one could explain or safely refactor.
|
|
243
|
+
|
|
244
|
+
**The fix:**
|
|
245
|
+
1. Run code coverage in production (not just tests) to identify truly unreachable code paths.
|
|
246
|
+
2. Use feature-flag cleanup sprints: any flag older than 90 days gets a ticket to remove it.
|
|
247
|
+
3. Implement a "code ownership" model: every file has an owning team. Unowned files get triaged
|
|
248
|
+
quarterly.
|
|
249
|
+
4. Delete deprecated code aggressively. Version control is your safety net -- you can always recover it.
|
|
250
|
+
5. Add deployment verification that ensures all target servers received the same artifact.
|
|
251
|
+
|
|
252
|
+
**Detection rule:**
|
|
253
|
+
Flag code with zero production execution over a 90-day window. Flag `@Deprecated` annotations older
|
|
254
|
+
than 6 months. Flag feature flags with no expiry date.
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
### AP-06: Vendor Lock-in
|
|
259
|
+
|
|
260
|
+
**Also known as:** Platform Dependency, Cloud Handcuffs, Proprietary Trap
|
|
261
|
+
**Frequency:** Common
|
|
262
|
+
**Severity:** High
|
|
263
|
+
**Detection difficulty:** Hard
|
|
264
|
+
|
|
265
|
+
**What it looks like:**
|
|
266
|
+
Core business logic is tightly coupled to a specific vendor's proprietary APIs, data formats, or
|
|
267
|
+
infrastructure. Database queries use vendor-specific SQL extensions. Business workflows are built inside
|
|
268
|
+
a SaaS platform's automation engine. Data is stored in a proprietary format with no export path.
|
|
269
|
+
Switching vendors would require a rewrite, not a migration.
|
|
270
|
+
|
|
271
|
+
**Why developers do it:**
|
|
272
|
+
Vendor-specific features ship faster than abstractions. AWS Lambda + DynamoDB + Step Functions
|
|
273
|
+
produces a working system in weeks. Building vendor-neutral equivalents takes months. Vendor
|
|
274
|
+
sales teams actively encourage deep integration. Cloud credits and startup programs subsidize
|
|
275
|
+
the initial coupling.
|
|
276
|
+
|
|
277
|
+
**What goes wrong:**
|
|
278
|
+
- A documented healthcare organization built its patient management system on AWS-specific services
|
|
279
|
+
over three years. When AWS increased pricing by 40%, they discovered migration would require a
|
|
280
|
+
complete application rewrite, $2M+ in data migration costs for 50TB of patient data, an 18-month
|
|
281
|
+
timeline, and staff retraining. Total estimated switching cost: $8.5 million.
|
|
282
|
+
- A company migrating 300 applications to cloud found that migrating just five applications blew
|
|
283
|
+
the entire year's migration budget due to unanticipated storage and egress costs.
|
|
284
|
+
- Vendor lock-in is cited as a top barrier to cloud adoption in enterprise surveys, particularly
|
|
285
|
+
because the lack of cross-cloud standardization means skills, tooling, and data formats are
|
|
286
|
+
non-transferable.
|
|
287
|
+
|
|
288
|
+
**The fix:**
|
|
289
|
+
1. Use the "hexagonal architecture" (ports and adapters) pattern: business logic never imports
|
|
290
|
+
vendor-specific packages.
|
|
291
|
+
2. Wrap vendor APIs behind thin adapter layers with integration tests against both the real API
|
|
292
|
+
and a local stub.
|
|
293
|
+
3. Store data in open formats (Parquet, JSON, PostgreSQL-compatible SQL) regardless of the
|
|
294
|
+
underlying engine.
|
|
295
|
+
4. Calculate switching cost annually. If it exceeds 6 months of revenue, treat it as a risk item.
|
|
296
|
+
5. Negotiate data portability and API stability guarantees in vendor contracts.
|
|
297
|
+
|
|
298
|
+
**Detection rule:**
|
|
299
|
+
Flag import statements from vendor-specific SDKs in business logic layers (not infrastructure layers).
|
|
300
|
+
Count vendor-specific API calls: if >50% have no abstraction layer, flag for review.
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
### AP-07: Inner Platform Effect
|
|
305
|
+
|
|
306
|
+
**Also known as:** Second System Effect (related), Greenspun's Tenth Rule, Meta-System
|
|
307
|
+
**Frequency:** Occasional
|
|
308
|
+
**Severity:** Critical
|
|
309
|
+
**Detection difficulty:** Very Hard
|
|
310
|
+
|
|
311
|
+
**What it looks like:**
|
|
312
|
+
A system so configurable that it becomes a poorly implemented replica of the platform it runs on.
|
|
313
|
+
The database stores "entity, key, value" triples instead of typed tables -- effectively reimplementing
|
|
314
|
+
a database inside a database. A rules engine becomes a Turing-complete scripting language that only
|
|
315
|
+
programmers can configure. A workflow tool grows conditional branching, variable assignment, and
|
|
316
|
+
error handling until it is an inferior programming language.
|
|
317
|
+
|
|
318
|
+
**Why developers do it:**
|
|
319
|
+
The initial goal is flexibility: "business users should be able to configure everything without code
|
|
320
|
+
changes." Each configuration option feels like a reasonable request. Over years, the configuration
|
|
321
|
+
language accretes loops, conditionals, and data transformations until it has accidentally become a
|
|
322
|
+
programming language -- but without type checking, debugging tools, version control, or testing
|
|
323
|
+
frameworks.
|
|
324
|
+
|
|
325
|
+
**What goes wrong:**
|
|
326
|
+
- Enterprise rules engines frequently exhibit the Inner Platform Effect. The configuration becomes so
|
|
327
|
+
complex that only developers can modify it, defeating the original "no-code" goal, but now they must
|
|
328
|
+
work in an inferior environment with no IDE support.
|
|
329
|
+
- Entity-Attribute-Value (EAV) database schemas trade the query optimizer's knowledge of data types
|
|
330
|
+
for "flexibility." Result: queries that should take milliseconds require full table scans, JOIN
|
|
331
|
+
explosions, and application-layer type casting. Healthcare systems using EAV for clinical data
|
|
332
|
+
routinely hit performance walls at scale.
|
|
333
|
+
- Firefox's extension system grew so complex that add-on developers effectively built full
|
|
334
|
+
applications (FTP clients, file browsers) inside the browser, duplicating OS functionality on a
|
|
335
|
+
more restricted platform.
|
|
336
|
+
|
|
337
|
+
**The fix:**
|
|
338
|
+
1. Define a "configuration complexity budget." If a config option requires conditional logic, it
|
|
339
|
+
belongs in code, not configuration.
|
|
340
|
+
2. Use feature flags for on/off decisions, not for behavioral specification.
|
|
341
|
+
3. If business users need to express logic, provide a constrained DSL with explicit bounds, not a
|
|
342
|
+
Turing-complete language.
|
|
343
|
+
4. Audit configuration files quarterly: if the average config file exceeds 200 lines, the system
|
|
344
|
+
has likely crossed the inner-platform threshold.
|
|
345
|
+
|
|
346
|
+
**Detection rule:**
|
|
347
|
+
Flag configuration files that contain conditional statements, loops, or function definitions. Flag
|
|
348
|
+
EAV-pattern tables (entity_id, attribute_name, attribute_value) in schemas.
|
|
349
|
+
|
|
350
|
+
---
|
|
351
|
+
|
|
352
|
+
### AP-08: Accidental Complexity
|
|
353
|
+
|
|
354
|
+
**Also known as:** Incidental Complexity, Self-Inflicted Complexity
|
|
355
|
+
**Frequency:** Very Common
|
|
356
|
+
**Severity:** High
|
|
357
|
+
**Detection difficulty:** Very Hard
|
|
358
|
+
|
|
359
|
+
**What it looks like:**
|
|
360
|
+
The system is harder to understand and modify than the problem domain requires. Fred Brooks
|
|
361
|
+
distinguished "essential complexity" (inherent in the problem) from "accidental complexity"
|
|
362
|
+
(introduced by our tools and design choices). Accidental complexity manifests as: unnecessary
|
|
363
|
+
abstraction layers, framework boilerplate that dwarfs business logic, build systems that take
|
|
364
|
+
20 minutes because of over-modularization, six YAML files to deploy a single endpoint.
|
|
365
|
+
|
|
366
|
+
**Why developers do it:**
|
|
367
|
+
Accidental complexity accretes through individually rational decisions: adopting a framework "everyone
|
|
368
|
+
uses," adding a caching layer "for performance" before measuring, splitting a service "because
|
|
369
|
+
microservices are best practice." Each choice adds cognitive overhead. Brooks argued in "No Silver
|
|
370
|
+
Bullet" (1986) that most of the effort in modern software engineering has shifted from essential to
|
|
371
|
+
accidental complexity.
|
|
372
|
+
|
|
373
|
+
**What goes wrong:**
|
|
374
|
+
- Healthcare.gov's 2013 failure was partly accidental complexity: 50+ contractors each building
|
|
375
|
+
subsystems with different frameworks, integration patterns, and deployment models. The
|
|
376
|
+
integration architecture itself became harder to manage than any individual business rule.
|
|
377
|
+
- Teams that adopt Kubernetes for a three-service system spend more time on infrastructure YAML
|
|
378
|
+
than on business logic. The complexity of the deployment platform exceeds the complexity of the
|
|
379
|
+
application.
|
|
380
|
+
- Over-modularized codebases where a single business operation spans 12 npm packages, each with
|
|
381
|
+
its own build pipeline, versioning scheme, and changelog.
|
|
382
|
+
|
|
383
|
+
**The fix:**
|
|
384
|
+
1. Measure complexity: track lines of infrastructure code vs. business logic code. If infra > 50%,
|
|
385
|
+
investigate.
|
|
386
|
+
2. Apply the "boring technology" principle (Dan McKinley): choose well-understood tools with known
|
|
387
|
+
failure modes over novel tools with unknown failure modes.
|
|
388
|
+
3. Regularly ask: "If we were building this from scratch today, would we make this choice?" If no,
|
|
389
|
+
file a simplification ticket.
|
|
390
|
+
4. Run "complexity retrospectives" where the team identifies the three most confusing parts of the
|
|
391
|
+
system and proposes simplifications.
|
|
392
|
+
|
|
393
|
+
**Detection rule:**
|
|
394
|
+
Flag projects where configuration/infrastructure files outnumber source files. Flag build times that
|
|
395
|
+
exceed 5 minutes for projects under 50k LOC. Flag dependency trees deeper than 5 levels.
|
|
396
|
+
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
### AP-09: Circular Dependencies
|
|
400
|
+
|
|
401
|
+
**Also known as:** Mutual Dependency, Dependency Cycle, Tangled Modules
|
|
402
|
+
**Frequency:** Common
|
|
403
|
+
**Severity:** High
|
|
404
|
+
**Detection difficulty:** Easy
|
|
405
|
+
|
|
406
|
+
**What it looks like:**
|
|
407
|
+
Module A depends on Module B, which depends on Module C, which depends on Module A. The cycle makes
|
|
408
|
+
it impossible to build, test, or deploy any module in isolation. Changes in any module can ripple
|
|
409
|
+
unpredictably through the cycle. Build systems may fail or produce non-deterministic results.
|
|
410
|
+
|
|
411
|
+
**Why developers do it:**
|
|
412
|
+
Organic growth. A utility module adds a convenience method that needs a type from a business module.
|
|
413
|
+
A shared library grows bidirectional references for "ease of use." In package-per-feature architectures,
|
|
414
|
+
features that interact naturally develop cross-references. Without build-time cycle detection, the
|
|
415
|
+
cycles go unnoticed until they block a refactoring effort.
|
|
416
|
+
|
|
417
|
+
**What goes wrong:**
|
|
418
|
+
- The npm left-pad incident (March 2016) exposed the fragility of deep dependency chains. When
|
|
419
|
+
developer Azer Koculu unpublished 250+ packages from npm after a dispute with Kik Messenger,
|
|
420
|
+
thousands of projects -- including Babel and React -- broke. Facebook, PayPal, Netflix, and
|
|
421
|
+
Spotify were affected. npm subsequently blocked unpublishing packages that other projects depend on.
|
|
422
|
+
While not a circular dependency per se, it demonstrated how dependency graphs become fragile attack
|
|
423
|
+
surfaces.
|
|
424
|
+
- Circular dependencies in C++ codebases cause compilation order issues that non-deterministically
|
|
425
|
+
break builds. Teams waste hours on "it builds on my machine" investigations.
|
|
426
|
+
- Java module systems (JPMS) and Go explicitly forbid circular imports at the language level because
|
|
427
|
+
the designers recognized the architectural damage they cause.
|
|
428
|
+
|
|
429
|
+
**The fix:**
|
|
430
|
+
1. Enable cycle detection in your build tool (eslint-plugin-import, ArchUnit, Go compiler).
|
|
431
|
+
2. Break cycles with dependency inversion: extract a shared interface into a third module that both
|
|
432
|
+
original modules depend on.
|
|
433
|
+
3. Use the Acyclic Dependencies Principle (ADP): the dependency graph of packages must be a
|
|
434
|
+
directed acyclic graph.
|
|
435
|
+
4. Run dependency graph visualization (e.g., Madge, JDepend) in CI and fail the build on new cycles.
|
|
436
|
+
|
|
437
|
+
**Detection rule:**
|
|
438
|
+
Run `madge --circular` (JS/TS), `ArchUnit` cycle checks (Java), or `go vet` (Go) in CI. Zero
|
|
439
|
+
tolerance for new cycles.
|
|
440
|
+
|
|
441
|
+
---
|
|
442
|
+
|
|
443
|
+
### AP-10: God Service
|
|
444
|
+
|
|
445
|
+
**Also known as:** God Object, Blob, Monster Service, Mega-Service
|
|
446
|
+
**Frequency:** Common
|
|
447
|
+
**Severity:** Critical
|
|
448
|
+
**Detection difficulty:** Moderate
|
|
449
|
+
|
|
450
|
+
**What it looks like:**
|
|
451
|
+
A single service or class that handles order creation, payment processing, inventory management,
|
|
452
|
+
notification dispatch, user authentication, and report generation. It has 50+ endpoints, 200+ database
|
|
453
|
+
tables, and a deployment that takes 45 minutes. Every team needs to touch it for every feature. Merge
|
|
454
|
+
conflicts are a daily occurrence.
|
|
455
|
+
|
|
456
|
+
**Why developers do it:**
|
|
457
|
+
It starts as a clean service with a single responsibility. Over time, related features gravitate toward
|
|
458
|
+
it because "it already has the data." Adding an endpoint to an existing service is faster than creating
|
|
459
|
+
a new service with its own deployment pipeline, monitoring, and on-call rotation. The service accretes
|
|
460
|
+
responsibilities like a snowball.
|
|
461
|
+
|
|
462
|
+
**What goes wrong:**
|
|
463
|
+
- God Services are effectively microservice-era monoliths. They cannot be scaled independently --
|
|
464
|
+
a spike in notification traffic forces scaling the entire service, including the payment processing
|
|
465
|
+
components that do not need additional capacity.
|
|
466
|
+
- Testing becomes intractable: the service's test suite takes hours, so developers skip tests.
|
|
467
|
+
Confidence drops, bugs increase, and the team enters a vicious cycle.
|
|
468
|
+
- In e-commerce platforms, a God "OrderService" that handles the full order lifecycle (creation,
|
|
469
|
+
payment, fulfillment, returns, analytics) becomes the bottleneck for every product team. Feature
|
|
470
|
+
velocity drops as teams queue changes behind each other.
|
|
471
|
+
|
|
472
|
+
**The fix:**
|
|
473
|
+
1. Apply the Single Responsibility Principle at the service level: each service should have one
|
|
474
|
+
reason to change.
|
|
475
|
+
2. Use the "strangler fig" to extract cohesive subdomains into new services.
|
|
476
|
+
3. Measure service size: lines of code, number of endpoints, number of owning teams. If any metric
|
|
477
|
+
is 3x the median service, investigate splitting.
|
|
478
|
+
4. Limit service ownership to one team. If multiple teams need to change a service, it is too large.
|
|
479
|
+
|
|
480
|
+
**Detection rule:**
|
|
481
|
+
Flag services with >30 API endpoints. Flag services with >100 database tables. Flag services modified
|
|
482
|
+
by >2 teams in a single sprint.
|
|
483
|
+
|
|
484
|
+
---
|
|
485
|
+
|
|
486
|
+
### AP-11: Sinkhole Anti-pattern
|
|
487
|
+
|
|
488
|
+
**Also known as:** Pass-Through Layers, Ceremonial Architecture, Layer Tax
|
|
489
|
+
**Frequency:** Common
|
|
490
|
+
**Severity:** Medium
|
|
491
|
+
**Detection difficulty:** Moderate
|
|
492
|
+
|
|
493
|
+
**What it looks like:**
|
|
494
|
+
Requests pass through multiple architectural layers (controller -> service -> repository -> DAO ->
|
|
495
|
+
database) with no transformation, validation, or business logic at each layer. The service layer
|
|
496
|
+
simply calls the repository. The repository simply calls the DAO. Each layer adds latency, boilerplate,
|
|
497
|
+
and a place for bugs to hide -- without contributing value.
|
|
498
|
+
|
|
499
|
+
**Why developers do it:**
|
|
500
|
+
Layered architecture is taught as best practice. Templates and scaffolding tools generate all layers by
|
|
501
|
+
default. Developers add layers "for future flexibility" -- the service layer is empty now but "might
|
|
502
|
+
need business logic later." Removing a layer feels like architectural regression.
|
|
503
|
+
|
|
504
|
+
**What goes wrong:**
|
|
505
|
+
- The 80/20 rule applies: if more than 20% of your requests are simple pass-through with no logic
|
|
506
|
+
in intermediate layers, you have a sinkhole problem. When the ratio inverts (80% pass-through),
|
|
507
|
+
the architecture is pure ceremony.
|
|
508
|
+
- Each pass-through layer adds ~0.1-0.5ms of latency. Across 5 layers and 50 service calls per
|
|
509
|
+
page load, this adds 25-125ms of pure waste.
|
|
510
|
+
- Developers lose trust in the layer structure. If the service layer is usually empty, they start
|
|
511
|
+
putting business logic in controllers or repositories "because it doesn't matter where it goes."
|
|
512
|
+
The architecture degrades into a Big Ball of Mud.
|
|
513
|
+
|
|
514
|
+
**The fix:**
|
|
515
|
+
1. Audit layer utilization: for each layer, count what percentage of methods perform actual
|
|
516
|
+
transformation or validation vs. pure delegation.
|
|
517
|
+
2. Make layers optional (open layered architecture) for simple CRUD paths while maintaining them
|
|
518
|
+
for complex business logic paths.
|
|
519
|
+
3. Remove empty layers. YAGNI applies to architecture, not just code. Add them back when there is
|
|
520
|
+
a concrete need.
|
|
521
|
+
4. Use vertical slices (feature-based organization) instead of horizontal layers for simple domains.
|
|
522
|
+
|
|
523
|
+
**Detection rule:**
|
|
524
|
+
Flag service-layer methods that contain only a single delegation call to the layer below with no
|
|
525
|
+
additional logic. Alert when >50% of methods in a layer are pure pass-through.
|
|
526
|
+
|
|
527
|
+
---
|
|
528
|
+
|
|
529
|
+
### AP-12: Stovepipe System
|
|
530
|
+
|
|
531
|
+
**Also known as:** Silo Architecture, Island Automation, Integration Spaghetti
|
|
532
|
+
**Frequency:** Common
|
|
533
|
+
**Severity:** High
|
|
534
|
+
**Detection difficulty:** Moderate
|
|
535
|
+
|
|
536
|
+
**What it looks like:**
|
|
537
|
+
Multiple subsystems within an organization that each solve overlapping problems but cannot share data
|
|
538
|
+
or functionality. The sales team has a CRM. Marketing has a CDP. Support has a ticketing system. Each
|
|
539
|
+
has a different model for "customer." Each was integrated point-to-point with ad hoc ETL scripts. There
|
|
540
|
+
are 15 different "sources of truth" for customer email addresses.
|
|
541
|
+
|
|
542
|
+
**Why developers do it:**
|
|
543
|
+
Organizational structure drives architecture (Conway's Law). Each department buys or builds its own
|
|
544
|
+
system under its own budget, timeline, and technical leadership. Integration is an afterthought.
|
|
545
|
+
When integration is attempted, it is done point-to-point because "we just need to sync these two
|
|
546
|
+
systems" -- repeated 20 times.
|
|
547
|
+
|
|
548
|
+
**What goes wrong:**
|
|
549
|
+
- Point-to-point integrations scale as O(n^2): 5 systems = 10 connections, 10 systems = 45
|
|
550
|
+
connections, 20 systems = 190 connections. Each connection is a maintenance liability.
|
|
551
|
+
- Data inconsistency becomes the norm. A customer updates their address in the CRM, but the change
|
|
552
|
+
does not propagate to the billing system for 48 hours, causing failed deliveries.
|
|
553
|
+
- Government systems are notorious stovepipes. The Healthcare.gov failure was partly a stovepipe
|
|
554
|
+
problem: eligibility verification, plan comparison, and enrollment were built by different
|
|
555
|
+
contractors with no shared integration architecture.
|
|
556
|
+
|
|
557
|
+
**The fix:**
|
|
558
|
+
1. Introduce an event bus or integration platform as a single backbone for inter-system communication.
|
|
559
|
+
2. Define canonical data models for shared entities (customer, order, product).
|
|
560
|
+
3. Use the "anti-corruption layer" pattern when integrating with legacy stovepipes.
|
|
561
|
+
4. Budget integration architecture as a first-class concern, not an afterthought.
|
|
562
|
+
|
|
563
|
+
**Detection rule:**
|
|
564
|
+
Count point-to-point integrations between systems. If the count exceeds N*(N-1)/4 (half the theoretical
|
|
565
|
+
maximum), flag for consolidation into an event backbone.
|
|
566
|
+
|
|
567
|
+
---
|
|
568
|
+
|
|
569
|
+
### AP-13: Swiss Army Knife
|
|
570
|
+
|
|
571
|
+
**Also known as:** Kitchen Sink Interface, Fat Interface, God Interface, Bloated API
|
|
572
|
+
**Frequency:** Common
|
|
573
|
+
**Severity:** Medium
|
|
574
|
+
**Detection difficulty:** Easy
|
|
575
|
+
|
|
576
|
+
**What it looks like:**
|
|
577
|
+
An interface or API with an excessive number of methods attempting to serve every possible consumer.
|
|
578
|
+
A `UserService` with 85 methods covering CRUD, search, analytics, export, notification preferences,
|
|
579
|
+
A/B test assignment, and audit logging. A REST API where every resource has 30 query parameters.
|
|
580
|
+
A library whose `README.md` is longer than most applications.
|
|
581
|
+
|
|
582
|
+
**Why developers do it:**
|
|
583
|
+
The designer tries to anticipate every possible use case. Each additional method is cheap in isolation.
|
|
584
|
+
The interface grows incrementally -- nobody notices it has 60 methods until a new team member tries
|
|
585
|
+
to implement it and finds the contract incomprehensible.
|
|
586
|
+
|
|
587
|
+
**What goes wrong:**
|
|
588
|
+
- Violates the Interface Segregation Principle (ISP): clients are forced to depend on methods they
|
|
589
|
+
do not use. A mobile client that only needs `getUser()` must import an interface that includes
|
|
590
|
+
`generateAuditReport()`.
|
|
591
|
+
- Large interfaces resist change: modifying any method risks breaking all implementors. Versioning
|
|
592
|
+
becomes a nightmare.
|
|
593
|
+
- Testing cost explodes: mock implementations must stub 60 methods even when the test only
|
|
594
|
+
exercises one.
|
|
595
|
+
|
|
596
|
+
**The fix:**
|
|
597
|
+
1. Apply ISP: split large interfaces into role-specific interfaces (e.g., `UserReader`,
|
|
598
|
+
`UserWriter`, `UserSearcher`).
|
|
599
|
+
2. Use the CQRS pattern to separate read and write interfaces.
|
|
600
|
+
3. For REST APIs, use resource-oriented design with focused endpoints rather than parameter-heavy
|
|
601
|
+
catch-all endpoints.
|
|
602
|
+
4. Limit interface size: if an interface has more than 7 methods, evaluate whether it has a single
|
|
603
|
+
cohesive responsibility.
|
|
604
|
+
|
|
605
|
+
**Detection rule:**
|
|
606
|
+
Flag interfaces with >10 methods. Flag API endpoints with >8 query parameters. Flag classes that
|
|
607
|
+
implement an interface but throw `NotImplementedException` for >20% of methods.
|
|
608
|
+
|
|
609
|
+
---
|
|
610
|
+
|
|
611
|
+
### AP-14: Reinventing the Wheel
|
|
612
|
+
|
|
613
|
+
**Also known as:** Custom Everything, Bespoke Syndrome, DIY Framework
|
|
614
|
+
**Frequency:** Common
|
|
615
|
+
**Severity:** Medium
|
|
616
|
+
**Detection difficulty:** Moderate
|
|
617
|
+
|
|
618
|
+
**What it looks like:**
|
|
619
|
+
The team writes a custom ORM, a custom logging framework, a custom HTTP client, a custom test runner --
|
|
620
|
+
all solving problems with mature, well-tested open-source solutions. The custom code lacks documentation,
|
|
621
|
+
has no community, and is maintained by one person. Within the same enterprise, multiple teams have each
|
|
622
|
+
built their own CSV parser, date utility library, or message queue wrapper.
|
|
623
|
+
|
|
624
|
+
**Why developers do it:**
|
|
625
|
+
"Existing solutions don't exactly fit our needs." This is sometimes true, but often the gap between an
|
|
626
|
+
existing solution and the custom need is 5%, while the custom solution requires 100% of the maintenance
|
|
627
|
+
burden. Engineers also enjoy building foundational tools -- it is more intellectually stimulating than
|
|
628
|
+
wiring up a library.
|
|
629
|
+
|
|
630
|
+
**What goes wrong:**
|
|
631
|
+
- A documented enterprise had multiple internal solutions for the same problem: two CSV parsers,
|
|
632
|
+
three message queue wrappers, four date utility libraries. Each had different bugs, different
|
|
633
|
+
APIs, and different levels of maintenance.
|
|
634
|
+
- Custom ORMs are a recurring example: teams build "just a thin wrapper" that grows into a
|
|
635
|
+
full-featured but poorly tested query builder without migration support, connection pooling,
|
|
636
|
+
or the decade of edge-case fixes that mature ORMs contain.
|
|
637
|
+
- Maintenance cost compounds: the custom logging framework needs to support structured logging,
|
|
638
|
+
then log rotation, then log shipping. Each feature is a multi-week project that a library
|
|
639
|
+
provides for free.
|
|
640
|
+
|
|
641
|
+
**The fix:**
|
|
642
|
+
1. Default to well-maintained open-source libraries. Require an ADR with a cost-benefit analysis
|
|
643
|
+
to justify building custom.
|
|
644
|
+
2. If customization is needed, extend existing libraries via plugins/middleware rather than forking
|
|
645
|
+
or replacing.
|
|
646
|
+
3. Audit internal codebases for duplicate utility implementations. Consolidate to one.
|
|
647
|
+
4. Only build custom when the problem is truly novel or the existing solutions have fundamental
|
|
648
|
+
architectural mismatches (not feature gaps).
|
|
649
|
+
|
|
650
|
+
**Detection rule:**
|
|
651
|
+
Flag internal packages that overlap with top-100 npm/PyPI/Maven packages in functionality. Flag
|
|
652
|
+
utility modules with <80% test coverage.
|
|
653
|
+
|
|
654
|
+
---
|
|
655
|
+
|
|
656
|
+
### AP-15: Not Invented Here Syndrome
|
|
657
|
+
|
|
658
|
+
**Also known as:** NIH Syndrome, Build Bias, Ego-Driven Development
|
|
659
|
+
**Frequency:** Common
|
|
660
|
+
**Severity:** High
|
|
661
|
+
**Detection difficulty:** Hard
|
|
662
|
+
|
|
663
|
+
**What it looks like:**
|
|
664
|
+
Systematic rejection of external solutions in favor of internal builds, driven by organizational
|
|
665
|
+
pride rather than technical merit. The team builds a custom CI/CD system instead of using GitHub
|
|
666
|
+
Actions. The company writes an internal chat application instead of buying Slack. The engineering
|
|
667
|
+
org rewrites a battle-tested open-source library because "we can do it better."
|
|
668
|
+
|
|
669
|
+
**Why developers do it:**
|
|
670
|
+
Distrust of external code ("we don't control the roadmap"). Ego ("our engineers are better").
|
|
671
|
+
Misaligned incentives (building internal tools is promotable; integrating a vendor is not). In
|
|
672
|
+
large organizations, teams are unaware that other internal teams have already solved the same problem.
|
|
673
|
+
|
|
674
|
+
**What goes wrong:**
|
|
675
|
+
- Microsoft reportedly had four different internal systems for telemetry collection and analysis,
|
|
676
|
+
dozens of IL code analyzer clones, and hundreds of custom collection implementations -- massive
|
|
677
|
+
duplication of effort across the organization.
|
|
678
|
+
- One documented company built two separate chat systems: one for customer communication and one
|
|
679
|
+
for internal communication, when a single platform with role-based access would have sufficed.
|
|
680
|
+
- Kodak rejected Chester Carlson's xerography invention and Edwin Land's Polaroid process due to
|
|
681
|
+
NIH bias, missing two of the most transformative imaging technologies of the 20th century.
|
|
682
|
+
- NIH delays time-to-market. While the team spends 6 months building a custom solution, competitors
|
|
683
|
+
ship with off-the-shelf components and iterate on features instead of infrastructure.
|
|
684
|
+
|
|
685
|
+
**The fix:**
|
|
686
|
+
1. Implement a "build vs. buy" checklist that is required for any new component. Include total cost
|
|
687
|
+
of ownership over 3 years, not just initial build cost.
|
|
688
|
+
2. Create visibility into internal tools: maintain an internal tool registry so teams can discover
|
|
689
|
+
existing solutions before building new ones.
|
|
690
|
+
3. Reward integration and reuse in performance reviews, not just novel creation.
|
|
691
|
+
4. Set a "maintenance tax" estimate: any custom-built component must budget 20% of its initial build
|
|
692
|
+
cost annually for maintenance.
|
|
693
|
+
|
|
694
|
+
**Detection rule:**
|
|
695
|
+
Flag new internal projects that overlap in functionality with widely-adopted open-source tools. Flag
|
|
696
|
+
internal tool registries where >3 entries solve the same problem.
|
|
697
|
+
|
|
698
|
+
---
|
|
699
|
+
|
|
700
|
+
### AP-16: Boat Anchor
|
|
701
|
+
|
|
702
|
+
**Also known as:** Dead Weight, Just-in-Case Code, Speculative Code, YAGNI Violation
|
|
703
|
+
**Frequency:** Very Common
|
|
704
|
+
**Severity:** Medium
|
|
705
|
+
**Detection difficulty:** Easy
|
|
706
|
+
|
|
707
|
+
**What it looks like:**
|
|
708
|
+
Code, libraries, services, or infrastructure components that are no longer used but remain in the
|
|
709
|
+
codebase "just in case." A database table that hasn't been written to in two years. A microservice
|
|
710
|
+
with zero traffic. A library dependency imported in `package.json` but never referenced. Commented-out
|
|
711
|
+
code blocks with notes like "// might need this later."
|
|
712
|
+
|
|
713
|
+
**Why developers do it:**
|
|
714
|
+
Loss aversion: deleting code feels risky even when version control makes recovery trivial. Sunk-cost
|
|
715
|
+
fallacy: "we spent three sprints building this; we can't just throw it away." Uncertainty: "the PM
|
|
716
|
+
said we might bring this feature back." Cargo culting: the dependency was in the project template and
|
|
717
|
+
nobody questioned it.
|
|
718
|
+
|
|
719
|
+
**What goes wrong:**
|
|
720
|
+
- Developers waste time reading, debugging, and trying to understand boat-anchor code during
|
|
721
|
+
incident response. During a production outage, an engineer might spend 30 minutes tracing
|
|
722
|
+
through dead code paths before realizing they are irrelevant.
|
|
723
|
+
- Unused dependencies introduce security vulnerabilities. A library you never call still appears
|
|
724
|
+
in your dependency tree and may have known CVEs.
|
|
725
|
+
- Build times increase. Compilation includes boat-anchor modules. Test suites run boat-anchor tests.
|
|
726
|
+
Docker images bloat with unused libraries.
|
|
727
|
+
- The Knight Capital disaster ($440M loss) was fundamentally a boat anchor problem: dead Power Peg
|
|
728
|
+
code sat in production for years until a deployment error reactivated it.
|
|
729
|
+
|
|
730
|
+
**The fix:**
|
|
731
|
+
1. Run dependency analysis tools (`depcheck` for npm, `vulture` for Python, `unused` for Go) in CI.
|
|
732
|
+
2. Delete commented-out code on sight. Git preserves history.
|
|
733
|
+
3. Track service traffic: any service or endpoint with zero requests over 30 days gets a
|
|
734
|
+
decommission ticket.
|
|
735
|
+
4. Enforce the YAGNI principle: don't write code for features that aren't in the current iteration.
|
|
736
|
+
|
|
737
|
+
**Detection rule:**
|
|
738
|
+
Flag unused imports and dependencies in CI. Flag services with zero traffic over 30 days. Flag
|
|
739
|
+
commented-out code blocks longer than 5 lines.
|
|
740
|
+
|
|
741
|
+
---
|
|
742
|
+
|
|
743
|
+
### AP-17: Dead End Architecture
|
|
744
|
+
|
|
745
|
+
**Also known as:** Technology Dead End, Evolutionary Dead End, Upgrade Trap
|
|
746
|
+
**Frequency:** Occasional
|
|
747
|
+
**Severity:** Critical
|
|
748
|
+
**Detection difficulty:** Hard
|
|
749
|
+
|
|
750
|
+
**What it looks like:**
|
|
751
|
+
The system depends on a technology that has been abandoned by its maintainer and has no migration path.
|
|
752
|
+
A framework that stopped receiving security patches. A database that was acquired and discontinued. A
|
|
753
|
+
proprietary API that the vendor sunset. The system works today but cannot evolve: no security updates,
|
|
754
|
+
no compatibility with modern tooling, no community to answer questions.
|
|
755
|
+
|
|
756
|
+
**Why developers do it:**
|
|
757
|
+
The technology was a reasonable choice at selection time. Market dynamics are unpredictable: vendors
|
|
758
|
+
get acquired, open-source maintainers burn out, corporate priorities shift. Teams often ignore
|
|
759
|
+
end-of-life announcements because migration is expensive and the system "still works."
|
|
760
|
+
|
|
761
|
+
**What goes wrong:**
|
|
762
|
+
- Systems running on Python 2 after its January 2020 EOL faced an accelerating list of unpatched
|
|
763
|
+
vulnerabilities with no upstream fixes.
|
|
764
|
+
- Adobe Flash-dependent web applications became non-functional overnight when browsers removed
|
|
765
|
+
Flash support in January 2021, despite years of deprecation warnings.
|
|
766
|
+
- AngularJS (1.x) reached end of life in January 2022. Organizations that did not migrate to
|
|
767
|
+
Angular 2+ were left with no security patches and a shrinking talent pool.
|
|
768
|
+
- Java EE's transfer from Oracle to the Eclipse Foundation (as Jakarta EE) forced a package rename
|
|
769
|
+
from `javax.*` to `jakarta.*`, breaking every import in every application.
|
|
770
|
+
|
|
771
|
+
**The fix:**
|
|
772
|
+
1. Maintain a technology lifecycle registry: track the support status and EOL dates for every major
|
|
773
|
+
dependency.
|
|
774
|
+
2. Budget "technology currency" work: allocate 10-15% of capacity to keep dependencies within
|
|
775
|
+
one major version of current.
|
|
776
|
+
3. Prefer technologies with multiple implementations (SQL databases, HTTP servers) over single-vendor
|
|
777
|
+
lock-in.
|
|
778
|
+
4. Monitor community health metrics: commit frequency, contributor count, issue response time.
|
|
779
|
+
|
|
780
|
+
**Detection rule:**
|
|
781
|
+
Flag dependencies more than 2 major versions behind current. Flag dependencies with no commits in
|
|
782
|
+
12 months. Flag frameworks on published EOL lists.
|
|
783
|
+
|
|
784
|
+
---
|
|
785
|
+
|
|
786
|
+
### AP-18: Ambiguous Viewpoint
|
|
787
|
+
|
|
788
|
+
**Also known as:** Inconsistent Architecture Documentation, Missing Context, Viewpoint Confusion
|
|
789
|
+
**Frequency:** Common
|
|
790
|
+
**Severity:** Medium
|
|
791
|
+
**Detection difficulty:** Moderate
|
|
792
|
+
|
|
793
|
+
**What it looks like:**
|
|
794
|
+
Architecture diagrams and documents that mix deployment topology, logical module structure, runtime data
|
|
795
|
+
flow, and organizational ownership into a single undifferentiated view. A box labeled "API Gateway" might
|
|
796
|
+
represent a deployment artifact, a logical component, or a team boundary depending on who is looking at
|
|
797
|
+
it. Different stakeholders interpret the same diagram differently and make contradictory decisions.
|
|
798
|
+
|
|
799
|
+
**Why developers do it:**
|
|
800
|
+
Creating multiple views (4+1, C4 model) takes time. A single "big picture" diagram feels sufficient.
|
|
801
|
+
Teams lack training in architecture documentation methods. Architecture documentation is treated as a
|
|
802
|
+
one-time activity rather than a living artifact.
|
|
803
|
+
|
|
804
|
+
**What goes wrong:**
|
|
805
|
+
- Developers interpret a logical diagram as a deployment guide and create one-to-one service-to-server
|
|
806
|
+
mappings when logical components were meant to be co-located.
|
|
807
|
+
- Security teams audit a logical view and miss network-level attack surfaces that only appear in the
|
|
808
|
+
deployment view.
|
|
809
|
+
- Operations teams provision infrastructure based on an outdated architecture diagram that has not been
|
|
810
|
+
updated in 18 months.
|
|
811
|
+
- The lack of a shared, unambiguous architecture language contributes to the "50 contractors, no
|
|
812
|
+
integration" pattern seen in Healthcare.gov.
|
|
813
|
+
|
|
814
|
+
**The fix:**
|
|
815
|
+
1. Adopt the C4 model (Context, Container, Component, Code) with distinct diagrams at each level.
|
|
816
|
+
2. Label every diagram with its viewpoint: logical, deployment, runtime, development.
|
|
817
|
+
3. Store architecture diagrams as code (Structurizr, Mermaid) in the repository so they are versioned
|
|
818
|
+
alongside the system.
|
|
819
|
+
4. Review and update architecture documentation every quarter, or with every significant change.
|
|
820
|
+
|
|
821
|
+
**Detection rule:**
|
|
822
|
+
Flag architecture diagrams that contain both deployment details (server names, IP addresses) and
|
|
823
|
+
logical abstractions (bounded contexts, domain concepts) in the same view. Flag documentation older
|
|
824
|
+
than 6 months with no updates.
|
|
825
|
+
|
|
826
|
+
---
|
|
827
|
+
|
|
828
|
+
## Root Cause Analysis
|
|
829
|
+
|
|
830
|
+
| Root Cause | Anti-Patterns Produced | Frequency | Mitigation Strategy |
|
|
831
|
+
|---|---|---|---|
|
|
832
|
+
| Shipping pressure / deadline-driven decisions | Big Ball of Mud, Lava Flow, Boat Anchor | Very High | Budget 20% for structural health; bake quality into the definition of done |
|
|
833
|
+
| Tool/framework familiarity bias | Golden Hammer, Reinventing the Wheel | High | Technology radar; mandatory ADRs for technology choices |
|
|
834
|
+
| Resume-driven development | Architecture Astronaut, Accidental Complexity | High | Align incentives with business outcomes, not technology novelty |
|
|
835
|
+
| Conway's Law (org structure = system structure) | Stovepipe System, God Service | High | Inverse Conway Maneuver; organize teams around business capabilities |
|
|
836
|
+
| Fear of deletion | Lava Flow, Boat Anchor | Very High | Production code coverage; YAGNI culture; trust version control |
|
|
837
|
+
| Sunk-cost fallacy | Vendor Lock-in, NIH Syndrome, Boat Anchor | High | Regular build-vs-buy reviews; annual switching cost assessments |
|
|
838
|
+
| Premature optimization for flexibility | Inner Platform Effect, Architecture Astronaut, Swiss Army Knife | Moderate | YAGNI; require 2+ current consumers for every abstraction |
|
|
839
|
+
| Microservices cargo culting | Distributed Monolith, God Service, Circular Dependencies | High | Independent deployability test; DDD bounded contexts |
|
|
840
|
+
| Absent or outdated documentation | Ambiguous Viewpoint, Stovepipe System | High | Architecture-as-code; quarterly documentation reviews |
|
|
841
|
+
| Developer turnover / knowledge loss | Lava Flow, Big Ball of Mud, Dead End Architecture | High | Code ownership model; onboarding documentation; pair programming |
|
|
842
|
+
|
|
843
|
+
---
|
|
844
|
+
|
|
845
|
+
## Self-Check Questions
|
|
846
|
+
|
|
847
|
+
Use these during architecture reviews, sprint planning, or tech-debt triage.
|
|
848
|
+
|
|
849
|
+
1. **Can you deploy any single service without coordinating with another team?**
|
|
850
|
+
If no, you may have a Distributed Monolith (AP-04) or Circular Dependencies (AP-09).
|
|
851
|
+
|
|
852
|
+
2. **What percentage of your codebase has been executed in production in the last 90 days?**
|
|
853
|
+
If less than 70%, investigate Lava Flow (AP-05) and Boat Anchor (AP-16).
|
|
854
|
+
|
|
855
|
+
3. **How many technologies in your stack are more than 2 major versions behind current?**
|
|
856
|
+
More than 3 suggests Dead End Architecture (AP-17).
|
|
857
|
+
|
|
858
|
+
4. **If your primary cloud vendor doubled prices tomorrow, how long would migration take?**
|
|
859
|
+
More than 12 months indicates Vendor Lock-in (AP-06).
|
|
860
|
+
|
|
861
|
+
5. **How many abstraction layers does a simple GET request pass through?**
|
|
862
|
+
More than 4 with no logic at intermediate layers suggests Sinkhole (AP-11).
|
|
863
|
+
|
|
864
|
+
6. **Does any single service have more than 30 API endpoints?**
|
|
865
|
+
Yes indicates God Service (AP-10).
|
|
866
|
+
|
|
867
|
+
7. **Can a new developer understand the module boundary diagram in under 15 minutes?**
|
|
868
|
+
No suggests Big Ball of Mud (AP-01) or Ambiguous Viewpoint (AP-18).
|
|
869
|
+
|
|
870
|
+
8. **How many configuration options does your system have? Can any of them express conditional logic?**
|
|
871
|
+
Conditional configuration suggests Inner Platform Effect (AP-07).
|
|
872
|
+
|
|
873
|
+
9. **Do you have internal libraries that overlap with top-100 open-source packages?**
|
|
874
|
+
Yes indicates Reinventing the Wheel (AP-14) or NIH Syndrome (AP-15).
|
|
875
|
+
|
|
876
|
+
10. **Is more than 50% of your codebase infrastructure/config rather than business logic?**
|
|
877
|
+
Yes indicates Accidental Complexity (AP-08).
|
|
878
|
+
|
|
879
|
+
11. **How many point-to-point integrations exist between internal systems?**
|
|
880
|
+
If approaching N*(N-1)/2, you have a Stovepipe System (AP-12).
|
|
881
|
+
|
|
882
|
+
12. **When was the last time you deleted a feature flag, deprecated class, or unused service?**
|
|
883
|
+
More than 6 months ago suggests Lava Flow (AP-05) and Boat Anchor (AP-16).
|
|
884
|
+
|
|
885
|
+
13. **Is there an interface in your codebase with more than 10 methods?**
|
|
886
|
+
Yes suggests Swiss Army Knife (AP-13).
|
|
887
|
+
|
|
888
|
+
14. **Has the same technology been chosen for the last 5 new components without evaluating alternatives?**
|
|
889
|
+
Yes suggests Golden Hammer (AP-02).
|
|
890
|
+
|
|
891
|
+
15. **Do architecture diagrams distinguish between logical, deployment, and runtime views?**
|
|
892
|
+
If all views are on one diagram, you have Ambiguous Viewpoint (AP-18).
|
|
893
|
+
|
|
894
|
+
---
|
|
895
|
+
|
|
896
|
+
## Code Smell Quick Reference
|
|
897
|
+
|
|
898
|
+
| Smell | Anti-Pattern(s) | Automated Check | Threshold |
|
|
899
|
+
|---|---|---|---|
|
|
900
|
+
| Module with >30% inbound deps from all modules | Big Ball of Mud | dependency-cruiser, ArchUnit | Fan-in > 30% of total modules |
|
|
901
|
+
| Same DB schema accessed by multiple services | Distributed Monolith | Schema ownership audit | >1 service per schema |
|
|
902
|
+
| `@Deprecated` annotation older than 6 months | Lava Flow | Custom lint rule | 0 tolerance past 6 months |
|
|
903
|
+
| Vendor SDK imports in business logic layer | Vendor Lock-in | Import path lint | 0 vendor imports in domain/ |
|
|
904
|
+
| Config file with conditionals or loops | Inner Platform Effect | Config file parser check | 0 control flow in config |
|
|
905
|
+
| Interface with >10 methods | Swiss Army Knife | PMD, ESLint custom rule | Max 10 methods |
|
|
906
|
+
| Interface with exactly 1 implementation | Architecture Astronaut | ArchUnit, custom rule | Flag for justification |
|
|
907
|
+
| Unused imports/dependencies | Boat Anchor | depcheck, vulture | 0 unused deps |
|
|
908
|
+
| Circular package dependencies | Circular Dependencies | madge --circular, JDepend | 0 cycles |
|
|
909
|
+
| Service with >30 endpoints | God Service | OpenAPI spec analysis | Max 30 endpoints |
|
|
910
|
+
| Service with 0 traffic for 30 days | Boat Anchor | APM/observability metrics | Decommission ticket |
|
|
911
|
+
| Service method that only delegates to next layer | Sinkhole | Custom static analysis | >50% pass-through = flag |
|
|
912
|
+
| >3 internal tools solving the same problem | NIH Syndrome / Reinventing the Wheel | Internal tool registry audit | Max 1 per problem space |
|
|
913
|
+
| Dependency >2 major versions behind | Dead End Architecture | Dependabot, Renovate | Max 2 major versions behind |
|
|
914
|
+
| Build time >5 min for <50k LOC | Accidental Complexity | CI metrics | 5 min threshold |
|
|
915
|
+
| Architecture diagram mixing viewpoints | Ambiguous Viewpoint | Manual review checklist | 1 viewpoint per diagram |
|
|
916
|
+
|
|
917
|
+
---
|
|
918
|
+
|
|
919
|
+
*Researched: 2026-03-08 | Sources: Joel Spolsky "Don't Let Architecture Astronauts Scare You" (joelonsoftware.com), Foote & Yoder "Big Ball of Mud" (laputan.org), Fred Brooks "No Silver Bullet" (1986), Knight Capital SEC Filing and post-mortem analysis (henricodolfing.com), Healthcare.gov post-mortem (Harvard d3, henricodolfing.com), Twitter Fail Whale migration post-mortem (infoq.com, venturebeat.com, theregister.com), npm left-pad incident (wikipedia.org, theregister.com), Spotify microservices lessons (engineering.atspotify.com, infoq.com), Gremlin distributed monolith analysis (gremlin.com), AntiPatterns.com (antipatterns.com), The Daily WTF inner platform effect (thedailywtf.com), Cloudflare vendor lock-in analysis (cloudflare.com), Sourcegraph dependency hell (sourcegraph.com), ExceptionNotFound anti-pattern series (exceptionnotfound.net), Mike Hadlow "Lava Layer Anti-Pattern" (mikehadlow.blogspot.com), Wikipedia entries for referenced anti-patterns*
|