@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,647 @@
|
|
|
1
|
+
# Technical Debt Anti-Patterns
|
|
2
|
+
|
|
3
|
+
> Technical debt is a strategic tool when managed deliberately and a slow-motion catastrophe when ignored. These anti-patterns cover the ways teams mismanage, misunderstand, or simply deny the existence of technical debt -- turning a manageable liability into an existential threat to velocity, quality, and team morale. Each pattern has been observed repeatedly across startups and enterprises alike.
|
|
4
|
+
|
|
5
|
+
> **Domain:** Process
|
|
6
|
+
> **Anti-patterns covered:** 20
|
|
7
|
+
> **Highest severity:** Critical
|
|
8
|
+
|
|
9
|
+
## Anti-Patterns
|
|
10
|
+
|
|
11
|
+
### AP-01: Ignoring Debt Until Crisis
|
|
12
|
+
|
|
13
|
+
**Also known as:** Ostrich Strategy, Firefighting Mode, Boiling Frog
|
|
14
|
+
**Frequency:** Very Common
|
|
15
|
+
**Severity:** Critical
|
|
16
|
+
**Detection difficulty:** Easy (in retrospect)
|
|
17
|
+
|
|
18
|
+
**What it looks like:**
|
|
19
|
+
|
|
20
|
+
The team is aware of accumulating shortcuts, outdated libraries, and brittle test suites, but nobody raises the issue because features keep shipping. Then one day a deployment takes down production for 18 hours, or a security audit reveals a dependency with a known CVE that has been unpatched for two years.
|
|
21
|
+
|
|
22
|
+
**Why teams do it:**
|
|
23
|
+
|
|
24
|
+
Leadership equates visible feature delivery with progress. Debt is invisible to stakeholders, so there is no incentive to surface it. Engineers who raise concerns are labeled as pessimists or blockers. The quarterly roadmap has no line item for "fix what we already have."
|
|
25
|
+
|
|
26
|
+
**What goes wrong:**
|
|
27
|
+
|
|
28
|
+
The 2017 Equifax breach exploited an unpatched Apache Struts vulnerability (CVE-2017-5638) that had a fix available for months. The company knew about the dependency but deprioritized the update. The result: 147 million records exposed, $700M+ in settlements, and the CISO and CIO resigned. At smaller scale, teams experience sudden "velocity cliffs" where sprint throughput drops 40-60% as accumulated debt makes every change expensive.
|
|
29
|
+
|
|
30
|
+
**The fix:**
|
|
31
|
+
|
|
32
|
+
Establish a debt ceiling -- a maximum ratio of known debt items to total backlog. When the ceiling is breached, the team enters a mandatory debt sprint. Review debt quarterly with the same rigor as financial audits. Make debt visible on dashboards alongside feature metrics.
|
|
33
|
+
|
|
34
|
+
**Detection rule:**
|
|
35
|
+
|
|
36
|
+
Track the ratio of unplanned work (hotfixes, emergency patches, rollbacks) to planned work. If unplanned work exceeds 25% of sprint capacity for two consecutive sprints, debt is reaching crisis levels.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
### AP-02: Not Tracking Debt
|
|
41
|
+
|
|
42
|
+
**Also known as:** Invisible Debt, Undocumented Shortcuts, The Memory Tax
|
|
43
|
+
**Frequency:** Very Common
|
|
44
|
+
**Severity:** High
|
|
45
|
+
**Detection difficulty:** Hard
|
|
46
|
+
|
|
47
|
+
**What it looks like:**
|
|
48
|
+
|
|
49
|
+
Developers know about debt through tribal knowledge -- "oh yeah, don't touch that module, it's fragile" -- but there is no backlog item, no label, no tracking system. Debt exists only in the heads of people who were there when the shortcut was taken.
|
|
50
|
+
|
|
51
|
+
**Why teams do it:**
|
|
52
|
+
|
|
53
|
+
Creating a ticket feels like admitting failure. Teams fear that a visible debt backlog will alarm stakeholders or be used against them in performance reviews. There is also genuine uncertainty about what constitutes "debt" vs. "good enough."
|
|
54
|
+
|
|
55
|
+
**What goes wrong:**
|
|
56
|
+
|
|
57
|
+
When team members leave, their knowledge of debt locations leaves with them (see AP-09). New developers unknowingly build on top of fragile foundations. The same debt gets "discovered" and discussed repeatedly in standups without ever being formally captured, wasting time. Without tracking, there is no data to justify a refactoring sprint to management.
|
|
58
|
+
|
|
59
|
+
**The fix:**
|
|
60
|
+
|
|
61
|
+
Add a `tech-debt` label to your issue tracker. Require every PR that introduces intentional debt to include a corresponding debt ticket with a description of the shortcut, why it was taken, and what the proper solution would look like. Review the debt backlog monthly.
|
|
62
|
+
|
|
63
|
+
**Detection rule:**
|
|
64
|
+
|
|
65
|
+
If the team cannot produce a list of their top 10 known debt items within 15 minutes, debt tracking is absent. If more than 3 developers mention the same pain point informally but no ticket exists, it qualifies as untracked debt.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
### AP-03: Debt as Quality Excuse
|
|
70
|
+
|
|
71
|
+
**Also known as:** The Debt Shield, Quality Nihilism, "It's All Technical Debt"
|
|
72
|
+
**Frequency:** Common
|
|
73
|
+
**Severity:** High
|
|
74
|
+
**Detection difficulty:** Moderate
|
|
75
|
+
|
|
76
|
+
**What it looks like:**
|
|
77
|
+
|
|
78
|
+
Every quality problem is hand-waved as "technical debt." Flaky tests? Debt. Spaghetti architecture? Debt. No code review process? Debt. The term becomes a catch-all excuse that absolves the team of responsibility for maintaining standards on new code.
|
|
79
|
+
|
|
80
|
+
**Why teams do it:**
|
|
81
|
+
|
|
82
|
+
Framing current quality failures as inherited debt shifts blame to past decisions and past team members. It creates an illusion that the problem is structural and therefore unfixable without a major initiative -- which conveniently never gets prioritized.
|
|
83
|
+
|
|
84
|
+
**What goes wrong:**
|
|
85
|
+
|
|
86
|
+
The distinction between legacy debt and active negligence collapses. Teams stop enforcing quality gates on new code because "what's the point, the whole codebase is debt." This accelerates decay. Management loses trust in the team's quality claims because "technical debt" has been diluted to mean everything and nothing.
|
|
87
|
+
|
|
88
|
+
**The fix:**
|
|
89
|
+
|
|
90
|
+
Separate debt into categories: (1) legacy debt from past decisions, (2) deliberate debt taken consciously for speed, (3) active quality failures in new code. Only categories 1 and 2 are actual debt. Category 3 is a process failure that needs immediate correction, not future repayment.
|
|
91
|
+
|
|
92
|
+
**Detection rule:**
|
|
93
|
+
|
|
94
|
+
Review retrospective notes. If "technical debt" appears as a root cause for more than 50% of incidents without specific, actionable items attached, the term is being used as a shield.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
### AP-04: Rewrite from Scratch
|
|
99
|
+
|
|
100
|
+
**Also known as:** Second System Effect, Big Bang Rewrite, v2 Delusion
|
|
101
|
+
**Frequency:** Common
|
|
102
|
+
**Severity:** Critical
|
|
103
|
+
**Detection difficulty:** Easy
|
|
104
|
+
|
|
105
|
+
**What it looks like:**
|
|
106
|
+
|
|
107
|
+
The team concludes the existing codebase is unsalvageable and proposes a ground-up rewrite. A parallel project is launched. The new system is estimated at 6 months. Eighteen months later, it has achieved 60% feature parity, the old system still runs in production, and both codebases need maintenance.
|
|
108
|
+
|
|
109
|
+
**Why teams do it:**
|
|
110
|
+
|
|
111
|
+
Reading someone else's code is harder than writing your own. Existing systems carry years of accumulated edge cases, workarounds, and business rules that look like cruft but are actually load-bearing. The appeal of a clean slate is emotionally powerful. Joel Spolsky famously called this "the single worst strategic mistake that any software company can make."
|
|
112
|
+
|
|
113
|
+
**What goes wrong:**
|
|
114
|
+
|
|
115
|
+
Netscape's rewrite of their browser from scratch (1998-2000) gave Microsoft's Internet Explorer time to capture dominant market share. The rewrite took three years instead of one and Netscape never recovered. Development resources split between maintaining the old system and building the new one, degrading both. The new system often reintroduces bugs that the old system had already fixed through years of production hardening. The Second System Effect, described by Fred Brooks, leads teams to over-engineer the replacement.
|
|
116
|
+
|
|
117
|
+
**The fix:**
|
|
118
|
+
|
|
119
|
+
Adopt the Strangler Fig pattern: incrementally replace components of the old system behind stable interfaces. Martin Fowler's strangler pattern lets teams migrate one module at a time, validating each step in production. Reserve full rewrites only for systems where the technology platform is truly end-of-life (e.g., COBOL on unsupported hardware).
|
|
120
|
+
|
|
121
|
+
**Detection rule:**
|
|
122
|
+
|
|
123
|
+
Any rewrite proposal that lacks a concrete, phase-by-phase migration plan with rollback capability at each phase should be flagged. If the rewrite timeline exceeds 6 months, require executive review with explicit risk acknowledgment.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
### AP-05: Gold Plating
|
|
128
|
+
|
|
129
|
+
**Also known as:** Over-Engineering, Premature Abstraction, Resume-Driven Development
|
|
130
|
+
**Frequency:** Common
|
|
131
|
+
**Severity:** Moderate
|
|
132
|
+
**Detection difficulty:** Moderate
|
|
133
|
+
|
|
134
|
+
**What it looks like:**
|
|
135
|
+
|
|
136
|
+
A developer builds a configurable, plugin-based event processing pipeline with a custom DSL when the requirement was "send an email when an order ships." The solution handles 47 theoretical use cases but makes the actual use case harder to understand, debug, and modify.
|
|
137
|
+
|
|
138
|
+
**Why teams do it:**
|
|
139
|
+
|
|
140
|
+
Engineers are problem solvers who enjoy elegant abstractions. Building for imagined future requirements feels responsible ("we'll need this eventually"). Conference talks and blog posts celebrate clever architectures, creating social incentives to over-build. Some developers pad their resume by introducing technologies they want experience with, regardless of project needs.
|
|
141
|
+
|
|
142
|
+
**What goes wrong:**
|
|
143
|
+
|
|
144
|
+
Jeff Atwood (Coding Horror) documented how gold plating leads to wasted time, resources, and quality issues. The extra abstraction layers become their own source of debt -- they must be learned, maintained, and debugged. When requirements change (and they always do), the premature abstraction often does not fit the actual need, requiring rework of both the abstraction and the feature. YAGNI (You Aren't Gonna Need It) exists precisely because engineers are poor at predicting future requirements.
|
|
145
|
+
|
|
146
|
+
**The fix:**
|
|
147
|
+
|
|
148
|
+
Apply the Rule of Three: do not abstract until you have three concrete, real instances of duplication. Require that any architectural component beyond the immediate requirement has a specific, funded user story justifying it. Code review should flag speculative abstractions as aggressively as it flags bugs.
|
|
149
|
+
|
|
150
|
+
**Detection rule:**
|
|
151
|
+
|
|
152
|
+
Flag PRs where the ratio of framework/infrastructure code to business logic exceeds 3:1. Watch for abstractions with exactly one concrete implementation.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
### AP-06: Boy Scout Overreach
|
|
157
|
+
|
|
158
|
+
**Also known as:** Drive-By Refactoring, Scope Creep Cleanup, Yak Shaving
|
|
159
|
+
**Frequency:** Common
|
|
160
|
+
**Severity:** Moderate
|
|
161
|
+
**Detection difficulty:** Moderate
|
|
162
|
+
|
|
163
|
+
**What it looks like:**
|
|
164
|
+
|
|
165
|
+
A developer picks up a small bug fix. Following the Boy Scout Rule ("leave the campground cleaner than you found it"), they refactor the surrounding module, rename variables for clarity, restructure the class hierarchy, and update the test suite. The one-line bug fix becomes a 400-line PR that touches 15 files, is hard to review, and introduces a regression in an unrelated area.
|
|
166
|
+
|
|
167
|
+
**Why teams do it:**
|
|
168
|
+
|
|
169
|
+
The Boy Scout Rule is good advice taken too far. Engineers with high standards feel physical discomfort working in messy code and cannot resist cleaning it. Refactoring is more satisfying than fixing a single bug. There is no clear boundary defined for "how much cleanup is appropriate."
|
|
170
|
+
|
|
171
|
+
**What goes wrong:**
|
|
172
|
+
|
|
173
|
+
Large, mixed-purpose PRs are difficult to review, making it easy for regressions to slip through. When a bug is discovered later, `git bisect` points to the mega-PR, and untangling which change caused the issue is expensive. The original bug fix may be urgent, and bundling it with refactoring delays the fix.
|
|
174
|
+
|
|
175
|
+
**The fix:**
|
|
176
|
+
|
|
177
|
+
Separate cleanup from feature/fix work into distinct PRs. If you spot debt while working on a ticket, create a follow-up ticket for the cleanup rather than doing it inline. Limit Boy Scout improvements to cosmetic, zero-risk changes (whitespace, typos, clarifying comments) within the immediate scope of the current change.
|
|
178
|
+
|
|
179
|
+
**Detection rule:**
|
|
180
|
+
|
|
181
|
+
Flag PRs where the diff includes files outside the ticket's stated scope. Track the ratio of "lines changed for cleanup" vs. "lines changed for the stated objective" -- if cleanup exceeds 50%, the PR should be split.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
### AP-07: No Time for Debt
|
|
186
|
+
|
|
187
|
+
**Also known as:** Feature Factory, Sprint Hamster Wheel, Velocity Theater
|
|
188
|
+
**Frequency:** Very Common
|
|
189
|
+
**Severity:** Critical
|
|
190
|
+
**Detection difficulty:** Easy
|
|
191
|
+
|
|
192
|
+
**What it looks like:**
|
|
193
|
+
|
|
194
|
+
Every sprint is 100% packed with feature work. When engineers propose allocating time for debt reduction, they are told "we'll schedule a tech debt sprint next quarter." That quarter never arrives. The team optimizes for story points delivered while the codebase decays beneath them.
|
|
195
|
+
|
|
196
|
+
**Why teams do it:**
|
|
197
|
+
|
|
198
|
+
Product managers are incentivized by feature delivery, not code quality. Debt reduction is difficult to demonstrate to stakeholders in a sprint review. There is a genuine tension between short-term delivery pressure and long-term sustainability, and organizations default to short-term thinking.
|
|
199
|
+
|
|
200
|
+
**What goes wrong:**
|
|
201
|
+
|
|
202
|
+
Velocity gradually degrades but the cause is invisible. What once took 3 story points now takes 8, but the team adjusts their estimates upward without questioning why. Atlassian recommends reserving 15-25% of each sprint for debt reduction, treating it as seriously as feature development. Teams that skip this allocation see a compounding productivity tax that eventually makes feature delivery slower than if they had invested in debt reduction all along.
|
|
203
|
+
|
|
204
|
+
**The fix:**
|
|
205
|
+
|
|
206
|
+
Dedicate a fixed percentage (15-25%) of every sprint to debt work -- not as a negotiable item but as a standing allocation. Track and present "developer experience" metrics: build time, deploy time, time-to-first-meaningful-test. These make the cost of debt visible to non-technical stakeholders.
|
|
207
|
+
|
|
208
|
+
**Detection rule:**
|
|
209
|
+
|
|
210
|
+
Audit sprint backlogs over the past 6 sprints. If zero items are labeled as tech debt, refactoring, or maintenance, the team is running a feature factory. If planned debt work is consistently deprioritized or removed during sprint planning, the allocation is performative.
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
### AP-08: Not Prioritizing Debt
|
|
215
|
+
|
|
216
|
+
**Also known as:** Debt Graveyard, Backlog Black Hole, FIFO Debt
|
|
217
|
+
**Frequency:** Common
|
|
218
|
+
**Severity:** High
|
|
219
|
+
**Detection difficulty:** Moderate
|
|
220
|
+
|
|
221
|
+
**What it looks like:**
|
|
222
|
+
|
|
223
|
+
The team tracks debt (unlike AP-02), but all debt items sit in a flat, unprioritized backlog. When debt time is allocated, engineers pick whatever interests them rather than what would deliver the most impact. A developer spends three days renaming variables in a stable, rarely-touched module while the payment processing pipeline has a known race condition.
|
|
224
|
+
|
|
225
|
+
**Why teams do it:**
|
|
226
|
+
|
|
227
|
+
Prioritizing debt requires understanding both the business impact and the technical risk of each item, which demands cross-functional conversation that teams avoid. Letting engineers self-select feels empowering and avoids conflict. There is no established framework for comparing debt items.
|
|
228
|
+
|
|
229
|
+
**What goes wrong:**
|
|
230
|
+
|
|
231
|
+
High-risk, high-impact debt remains unaddressed while low-impact cosmetic issues get cleaned up. The debt backlog grows monotonically because easy items get picked off but hard items persist. Eventually, the unprioritized items become so numerous that the backlog is abandoned entirely.
|
|
232
|
+
|
|
233
|
+
**The fix:**
|
|
234
|
+
|
|
235
|
+
Score debt items on two axes: (1) blast radius (how much code/users/revenue is affected if this debt causes a failure), and (2) fix cost (how much effort to resolve). Prioritize high-blast-radius, low-fix-cost items first. Review and re-prioritize the debt backlog quarterly with both engineering and product leadership.
|
|
236
|
+
|
|
237
|
+
**Detection rule:**
|
|
238
|
+
|
|
239
|
+
Check the age distribution of debt tickets. If the oldest 20% of debt tickets have been open for more than 6 months with no activity, prioritization is broken. If debt work completed in the last quarter correlates with engineer preference rather than business impact, self-selection bias is present.
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
### AP-09: Departed Developer Debt
|
|
244
|
+
|
|
245
|
+
**Also known as:** Bus Factor Debt, Tribal Knowledge Loss, The Orphan Module
|
|
246
|
+
**Frequency:** Common
|
|
247
|
+
**Severity:** High
|
|
248
|
+
**Detection difficulty:** Hard
|
|
249
|
+
|
|
250
|
+
**What it looks like:**
|
|
251
|
+
|
|
252
|
+
A critical subsystem was built by a developer who has since left the company. Nobody else understands the design decisions, the implicit constraints, or the workarounds baked into the code. The code has no documentation, cryptic variable names, and a single integration test that may or may not pass.
|
|
253
|
+
|
|
254
|
+
**Why teams do it:**
|
|
255
|
+
|
|
256
|
+
Knowledge sharing is deprioritized during crunch periods. Code review becomes rubber-stamping when a single developer is the domain expert. The organization does not require documentation of architectural decisions, and by the time the developer's departure is announced, it is too late for a meaningful knowledge transfer.
|
|
257
|
+
|
|
258
|
+
**What goes wrong:**
|
|
259
|
+
|
|
260
|
+
The module becomes a "no-go zone" that nobody dares to modify. Features that require changes to this module are either blocked or implemented as fragile workarounds that layer on more debt. When a bug is found, debugging takes 5-10x longer because the team lacks mental models for the code's behavior. In the worst case, the module must be rewritten (see AP-04), compounding the loss.
|
|
261
|
+
|
|
262
|
+
**The fix:**
|
|
263
|
+
|
|
264
|
+
Enforce mandatory code review with at least two reviewers for any module with a bus factor of 1. Require Architecture Decision Records (ADRs) for non-obvious design choices. Rotate module ownership periodically so that no module has fewer than two knowledgeable maintainers. Conduct structured knowledge-transfer sessions during notice periods.
|
|
265
|
+
|
|
266
|
+
**Detection rule:**
|
|
267
|
+
|
|
268
|
+
Run `git log --format='%aN' -- <path> | sort | uniq -c | sort -rn` on each module. If more than 70% of commits come from a single author who is no longer on the team, the module is at high risk. Flag modules where the last commit by any current team member is older than 6 months.
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
### AP-10: Permanent Shortcuts
|
|
273
|
+
|
|
274
|
+
**Also known as:** TODO Graveyard, Temporary Permanent Solutions, The Hack That Shipped
|
|
275
|
+
**Frequency:** Very Common
|
|
276
|
+
**Severity:** High
|
|
277
|
+
**Detection difficulty:** Easy
|
|
278
|
+
|
|
279
|
+
**What it looks like:**
|
|
280
|
+
|
|
281
|
+
The codebase is littered with comments like `// TODO: fix this properly`, `// HACK: temporary workaround`, and `// FIXME: this will break if we ever have more than 100 users`. The timestamps on these comments, when traced through `git blame`, reveal they are 2-5 years old. The "temporary" solution is now load-bearing production infrastructure.
|
|
282
|
+
|
|
283
|
+
**Why teams do it:**
|
|
284
|
+
|
|
285
|
+
Under deadline pressure, a shortcut is taken with genuine intent to fix it later. But "later" never arrives because the shortcut works, the developer moves to the next task, and the ticket (if one was created) sinks in the backlog. Over time, the team forgets the shortcut is there until it causes a failure.
|
|
286
|
+
|
|
287
|
+
**What goes wrong:**
|
|
288
|
+
|
|
289
|
+
Temporary workarounds often have implicit assumptions (data volumes, user counts, concurrency levels) that silently break as the system scales. A "temporary" hardcoded connection pool of 10 works fine until traffic triples and the database starts rejecting connections at 3 AM. The cost of fixing a shortcut increases over time as other code builds on top of it.
|
|
290
|
+
|
|
291
|
+
**The fix:**
|
|
292
|
+
|
|
293
|
+
Require every TODO/HACK/FIXME comment to include a ticket reference (e.g., `// TODO(PROJ-1234): replace with proper auth`). Run a linter that flags TODOs without ticket references. Set expiration dates on intentional shortcuts: if the ticket is not resolved within two sprints, it auto-escalates.
|
|
294
|
+
|
|
295
|
+
**Detection rule:**
|
|
296
|
+
|
|
297
|
+
`grep -rn "TODO\|HACK\|FIXME\|WORKAROUND\|TEMPORARY" --include="*.{js,ts,py,java,go,rb}" | wc -l`. Track this count over time. If it increases monotonically, shortcuts are permanent. Cross-reference TODO comments with ticket status -- if more than 50% reference closed or nonexistent tickets, the process is broken.
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
### AP-11: No Documentation of WHY
|
|
302
|
+
|
|
303
|
+
**Also known as:** Missing Context, The What Without Why, Undocumented Decisions
|
|
304
|
+
**Frequency:** Very Common
|
|
305
|
+
**Severity:** Moderate
|
|
306
|
+
**Detection difficulty:** Hard
|
|
307
|
+
|
|
308
|
+
**What it looks like:**
|
|
309
|
+
|
|
310
|
+
The code documents WHAT it does (function signatures, class names, inline comments explaining mechanics) but never WHY a particular approach was chosen. There is no record of the constraints, trade-offs, or business rules that drove the implementation. A future developer sees a seemingly inefficient database query pattern and "optimizes" it, unknowingly breaking a subtle concurrency invariant that the original author designed around.
|
|
311
|
+
|
|
312
|
+
**Why teams do it:**
|
|
313
|
+
|
|
314
|
+
Developers assume that code should be self-documenting (and it should be, for the WHAT). But the WHY -- why this algorithm over that one, why this data model, why this error handling strategy -- is business context that cannot be expressed in code. Writing decision records feels like overhead when the decision seems obvious in the moment.
|
|
315
|
+
|
|
316
|
+
**What goes wrong:**
|
|
317
|
+
|
|
318
|
+
Every non-obvious design decision becomes a trap for future developers. Without context, "improving" the code means guessing at constraints that may or may not still apply. Teams waste hours in meetings debating decisions that were already made and forgotten. When the original author leaves (AP-09), the rationale is permanently lost.
|
|
319
|
+
|
|
320
|
+
**The fix:**
|
|
321
|
+
|
|
322
|
+
Adopt lightweight Architecture Decision Records (ADRs): a short markdown file per significant decision, recording the context, the options considered, the decision made, and the consequences accepted. Store ADRs alongside the code they describe. For inline decisions, use comments that explain WHY, not WHAT: `// We use eventual consistency here because the billing system cannot handle synchronous writes at peak load (see ADR-017)`.
|
|
323
|
+
|
|
324
|
+
**Detection rule:**
|
|
325
|
+
|
|
326
|
+
Sample 10 non-trivial modules. For each, ask a developer who did not write it: "Why was it built this way?" If the answer is "I don't know" or "I'd have to ask [person]" for more than 60% of modules, documentation of WHY is missing.
|
|
327
|
+
|
|
328
|
+
---
|
|
329
|
+
|
|
330
|
+
### AP-12: Test Rot
|
|
331
|
+
|
|
332
|
+
**Also known as:** Flaky Suite, Test Graveyard, Green Bar Illusion
|
|
333
|
+
**Frequency:** Common
|
|
334
|
+
**Severity:** Critical
|
|
335
|
+
**Detection difficulty:** Moderate
|
|
336
|
+
|
|
337
|
+
**What it looks like:**
|
|
338
|
+
|
|
339
|
+
The test suite technically passes, but 15% of tests are skipped (`@skip`, `xit`, `@pytest.mark.skip`), another 10% are flaky (pass on retry), and the remaining tests have not been updated to reflect current behavior. The green CI badge is meaningless -- it signals "nothing crashed" rather than "the system is correct."
|
|
340
|
+
|
|
341
|
+
**Why teams do it:**
|
|
342
|
+
|
|
343
|
+
Fixing a flaky test is unglamorous work that does not appear on any roadmap. When a test starts failing intermittently, the fastest way to unblock the pipeline is to mark it as skipped rather than investigate the root cause. Over time, the number of skipped tests grows, and the suite's coverage silently degrades. Google's Engineering Productivity team found that approximately 1.5% of all test runs at Google were flaky, and that this seemingly small number consumed enormous engineering resources.
|
|
344
|
+
|
|
345
|
+
**What goes wrong:**
|
|
346
|
+
|
|
347
|
+
Developers lose trust in the test suite and stop running tests locally. Bugs that would have been caught by now-skipped tests make it to production. The CI pipeline's pass rate is no longer correlated with code quality. New developers see skipped tests and internalize the norm that tests are optional. Research shows that flaky tests are demoralizing and can trigger a vicious cycle where developers skip writing tests because "they'll just become flaky anyway."
|
|
348
|
+
|
|
349
|
+
**The fix:**
|
|
350
|
+
|
|
351
|
+
Treat flaky tests as P1 bugs. Track the flake rate as a team metric (number of flaky test runs / total test runs). Set a policy: any test skipped for more than 2 weeks must be either fixed or deleted (a deleted test is honest; a skipped test is a lie). Quarantine flaky tests into a separate CI stage that does not block merges but is reviewed weekly.
|
|
352
|
+
|
|
353
|
+
**Detection rule:**
|
|
354
|
+
|
|
355
|
+
Count `@skip`, `@ignore`, `xit`, `xdescribe`, and `pytest.mark.skip` annotations. If skipped tests exceed 5% of the total suite, rot is present. Track CI retry rates -- if more than 3% of builds require retries to pass, flakiness is systemic.
|
|
356
|
+
|
|
357
|
+
---
|
|
358
|
+
|
|
359
|
+
### AP-13: Dependency Rot
|
|
360
|
+
|
|
361
|
+
**Also known as:** Library Neglect, Version Drift, The Unpatched Stack
|
|
362
|
+
**Frequency:** Very Common
|
|
363
|
+
**Severity:** Critical
|
|
364
|
+
**Detection difficulty:** Easy
|
|
365
|
+
|
|
366
|
+
**What it looks like:**
|
|
367
|
+
|
|
368
|
+
The project's dependency file (`package.json`, `requirements.txt`, `go.mod`, `pom.xml`) references libraries that are 2-5 major versions behind current. Running `npm audit` or `pip-audit` returns dozens of known vulnerabilities. The team says "we'll update when we upgrade" but the upgrade never happens.
|
|
369
|
+
|
|
370
|
+
**Why teams do it:**
|
|
371
|
+
|
|
372
|
+
Updating dependencies is boring, risky, and unrewarded. Major version bumps often include breaking changes that require code modifications. Without automated testing, there is no confidence that an update will not break something. The pain of outdated dependencies is gradual and invisible until a vulnerability is exploited. Research found that 96% of vulnerable open-source releases downloaded had a fixed version available, yet organizations still failed to update.
|
|
373
|
+
|
|
374
|
+
**What goes wrong:**
|
|
375
|
+
|
|
376
|
+
13% of Log4j downloads in 2024 were still vulnerable versions despite the Log4Shell vulnerability being one of the most publicized in history. Outdated dependencies accumulate transitively: managing just 10 direct dependencies can involve up to 170 transitive ones. Eventually, the version gap becomes so large that updating requires a coordinated, multi-week effort -- which is exactly the kind of project that gets deprioritized (see AP-07). Security vulnerabilities compound: 70% of vulnerable dependencies require minor or major version updates that potentially break source code.
|
|
377
|
+
|
|
378
|
+
**The fix:**
|
|
379
|
+
|
|
380
|
+
Enable automated dependency update tools (Dependabot, Renovate). Configure them to open PRs for patch and minor updates automatically. Run `npm audit` / `pip-audit` / `trivy` in CI and fail the build on high/critical vulnerabilities. Schedule quarterly "dependency update" days where major version bumps are tackled as a team.
|
|
381
|
+
|
|
382
|
+
**Detection rule:**
|
|
383
|
+
|
|
384
|
+
Run `npm outdated`, `pip list --outdated`, or equivalent. If more than 30% of dependencies are more than one major version behind, dependency rot is present. If any dependency has a known critical CVE with an available fix, that is an immediate red flag.
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
### AP-14: Documentation Debt
|
|
389
|
+
|
|
390
|
+
**Also known as:** The Undocumented System, Oral Tradition, README Lies
|
|
391
|
+
**Frequency:** Very Common
|
|
392
|
+
**Severity:** Moderate
|
|
393
|
+
**Detection difficulty:** Easy
|
|
394
|
+
|
|
395
|
+
**What it looks like:**
|
|
396
|
+
|
|
397
|
+
The README describes a setup process that no longer works. API documentation references endpoints that were removed two releases ago. The architecture diagram shows three services, but the system now has seven. New developers spend their first two weeks asking questions that should be answered by documentation.
|
|
398
|
+
|
|
399
|
+
**Why teams do it:**
|
|
400
|
+
|
|
401
|
+
Documentation is not tested by CI, so it drifts silently from reality. Developers update code but not docs because docs are in a separate system (Confluence, Notion, wiki) with a different workflow. Writing documentation is perceived as low-status work. Agile teams sometimes misinterpret "working software over comprehensive documentation" as "no documentation."
|
|
402
|
+
|
|
403
|
+
**What goes wrong:**
|
|
404
|
+
|
|
405
|
+
Onboarding time increases from days to weeks. Support tickets increase as users encounter undocumented behavior. Developers make incorrect assumptions based on outdated docs, introducing bugs. Knowledge becomes concentrated in senior team members (AP-09), creating bottlenecks and bus factor risks.
|
|
406
|
+
|
|
407
|
+
**The fix:**
|
|
408
|
+
|
|
409
|
+
Colocate documentation with code (README files, inline doc comments, ADRs in the repo). Include documentation updates as part of the definition of done for any PR that changes public APIs or system behavior. Use documentation testing tools (e.g., `doctest` in Python, API schema validation) to catch drift automatically.
|
|
410
|
+
|
|
411
|
+
**Detection rule:**
|
|
412
|
+
|
|
413
|
+
Compare the timestamp of the last documentation update to the last code change in the same module. If documentation is more than 3 months older than the code, drift is likely. Track onboarding time for new developers -- if it exceeds 2 weeks to first meaningful contribution, documentation debt is a likely factor.
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
### AP-15: Infrastructure Debt
|
|
418
|
+
|
|
419
|
+
**Also known as:** Snowflake Servers, Configuration Drift, The Untouchable Pipeline
|
|
420
|
+
**Frequency:** Common
|
|
421
|
+
**Severity:** High
|
|
422
|
+
**Detection difficulty:** Moderate
|
|
423
|
+
|
|
424
|
+
**What it looks like:**
|
|
425
|
+
|
|
426
|
+
Production infrastructure was set up manually years ago and has never been codified. Server configurations differ between environments ("works on staging but not prod"). The CI/CD pipeline is a fragile chain of shell scripts that nobody understands. Deploying to production requires following a 47-step runbook maintained in a shared Google Doc.
|
|
427
|
+
|
|
428
|
+
**Why teams do it:**
|
|
429
|
+
|
|
430
|
+
Infrastructure was "someone else's problem" until DevOps became mainstream. Early-stage companies provision infrastructure manually because it is faster for the first setup. As the team grows, nobody has time to go back and codify what exists. Infrastructure changes are high-risk and low-reward from a feature perspective.
|
|
431
|
+
|
|
432
|
+
**What goes wrong:**
|
|
433
|
+
|
|
434
|
+
Configuration drift causes "works on my machine" failures at scale. Disaster recovery is untested and unreliable because the infrastructure cannot be reproduced from code. Scaling requires manual intervention, limiting the team's ability to respond to traffic spikes. Half of Kubernetes deployments have been characterized as technical debt due to configurations that were copied without understanding, leading to security misconfigurations and resource waste.
|
|
435
|
+
|
|
436
|
+
**The fix:**
|
|
437
|
+
|
|
438
|
+
Adopt Infrastructure as Code (Terraform, Pulumi, CloudFormation). Start with the most painful manual process and codify it first. Use immutable infrastructure patterns (containers, AMIs) to eliminate configuration drift. Treat infrastructure code with the same rigor as application code: version control, code review, testing, CI/CD.
|
|
439
|
+
|
|
440
|
+
**Detection rule:**
|
|
441
|
+
|
|
442
|
+
Count the number of manual steps in the deployment runbook. If any deployment requires SSH access to a production server, infrastructure debt is present. If staging and production environments cannot be provisioned from the same code, configuration drift exists.
|
|
443
|
+
|
|
444
|
+
---
|
|
445
|
+
|
|
446
|
+
### AP-16: Migration Debt (Half-Finished)
|
|
447
|
+
|
|
448
|
+
**Also known as:** Lava Layer, Parallel Universe, The Bridge to Nowhere
|
|
449
|
+
**Frequency:** Common
|
|
450
|
+
**Severity:** Critical
|
|
451
|
+
**Detection difficulty:** Easy
|
|
452
|
+
|
|
453
|
+
**What it looks like:**
|
|
454
|
+
|
|
455
|
+
The team started migrating from REST to GraphQL, or from MongoDB to PostgreSQL, or from monolith to microservices. The migration reached 60% completion, then the champion left, priorities shifted, or funding was cut. Now the system uses both patterns simultaneously, and every new feature requires understanding and maintaining two paradigms.
|
|
456
|
+
|
|
457
|
+
**Why teams do it:**
|
|
458
|
+
|
|
459
|
+
Migrations are started with enthusiasm but completing the last 30% requires digging into "the nooks and crannies" -- obscure edge cases, rarely-used features, and legacy integrations that resist change. This tail work is unglamorous and hard to estimate. Will Larson observed that "if you leave one migration partially finished, folks will be exceedingly suspicious of participating in the next."
|
|
460
|
+
|
|
461
|
+
**What goes wrong:**
|
|
462
|
+
|
|
463
|
+
Mike Hadlow described the "Lava Layer anti-pattern" where successive half-finished migrations create geological strata of different architectural styles, each adding complexity. Developers must maintain mental models for multiple paradigms. New hires face a steeper learning curve. The dual-system state doubles the surface area for bugs. Eventually, someone proposes a third migration to unify the first two, adding another layer.
|
|
464
|
+
|
|
465
|
+
**The fix:**
|
|
466
|
+
|
|
467
|
+
Treat migrations as first-class projects with dedicated ownership, budget, and completion criteria. Use the "Derisk, Enable, Finish" playbook: prove the approach on the hardest case first, build tooling to make migration easy, then drive to 100%. Never start a new migration until the previous one is complete. Assign a migration owner who is accountable for completion.
|
|
468
|
+
|
|
469
|
+
**Detection rule:**
|
|
470
|
+
|
|
471
|
+
Search the codebase for coexisting patterns that should be mutually exclusive (e.g., both `fetch()` and `axios`, both REST clients and GraphQL clients for the same service, both ORM patterns for different databases). If more than 2 architectural paradigms coexist for the same concern, migration debt is present.
|
|
472
|
+
|
|
473
|
+
---
|
|
474
|
+
|
|
475
|
+
### AP-17: Framework Version Debt
|
|
476
|
+
|
|
477
|
+
**Also known as:** Major Version Avoidance, The LTS Trap, Upgrade Procrastination
|
|
478
|
+
**Frequency:** Very Common
|
|
479
|
+
**Severity:** High
|
|
480
|
+
**Detection difficulty:** Easy
|
|
481
|
+
|
|
482
|
+
**What it looks like:**
|
|
483
|
+
|
|
484
|
+
The application runs on a framework version that is 2-3 major versions behind current. The team postpones upgrades because each major version introduces breaking changes. Meanwhile, the framework community moves on: new plugins, tutorials, Stack Overflow answers, and security patches all target the current version. The team is stuck on an island.
|
|
485
|
+
|
|
486
|
+
**Why teams do it:**
|
|
487
|
+
|
|
488
|
+
Major version upgrades are high-effort, high-risk, and produce zero visible features. The current version "works fine." Testing coverage is insufficient to provide confidence in an upgrade. The longer the team waits, the larger the gap becomes, and the more daunting the upgrade appears -- a vicious cycle.
|
|
489
|
+
|
|
490
|
+
**What goes wrong:**
|
|
491
|
+
|
|
492
|
+
The team cannot use new framework features that would simplify development. Security patches stop being backported to old versions. Hiring becomes harder because candidates do not want to work with obsolete technology. When the upgrade finally becomes unavoidable (e.g., a critical security fix), the accumulated breaking changes make it a multi-week or multi-month project.
|
|
493
|
+
|
|
494
|
+
**The fix:**
|
|
495
|
+
|
|
496
|
+
Upgrade one major version at a time, on a regular cadence (e.g., within 6 months of a new major release). Automate upgrade testing with a comprehensive test suite. Follow the framework's official migration guides immediately on release -- do not wait until you "need" the new version. Budget framework upgrades as ongoing maintenance, not special projects.
|
|
497
|
+
|
|
498
|
+
**Detection rule:**
|
|
499
|
+
|
|
500
|
+
Compare the project's framework version to the latest stable release. If the gap is more than one major version, framework version debt is accumulating. Check the framework's support lifecycle -- if the project is on an EOL (end-of-life) version, this is urgent.
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
### AP-18: Copy-Paste Debt
|
|
505
|
+
|
|
506
|
+
**Also known as:** Clone-and-Own, Duplicated Logic, Shotgun Surgery Waiting to Happen
|
|
507
|
+
**Frequency:** Very Common
|
|
508
|
+
**Severity:** High
|
|
509
|
+
**Detection difficulty:** Moderate
|
|
510
|
+
|
|
511
|
+
**What it looks like:**
|
|
512
|
+
|
|
513
|
+
The same business logic (validation rules, pricing calculations, permission checks) exists in 3-7 places across the codebase, each copy slightly different due to independent modifications over time. A bug fix applied in one location is not applied in the others because nobody knows all the copies exist.
|
|
514
|
+
|
|
515
|
+
**Why teams do it:**
|
|
516
|
+
|
|
517
|
+
Copying working code feels faster and safer than extracting a shared abstraction. Developers unfamiliar with the codebase do not know a shared implementation already exists. In microservices architectures, teams duplicate logic across services rather than creating shared libraries because cross-service dependencies are politically difficult.
|
|
518
|
+
|
|
519
|
+
**What goes wrong:**
|
|
520
|
+
|
|
521
|
+
In one documented case, a system had multiple email validation implementations -- some allowed certain address formats that others rejected, causing data inconsistency as records moved between subsystems. Authorization logic copy-pasted across components meant that every role change required modifications across the entire program. Studies show that codebases with high duplication rates have proportionally higher defect rates because fixes are applied inconsistently.
|
|
522
|
+
|
|
523
|
+
**The fix:**
|
|
524
|
+
|
|
525
|
+
Run clone detection tools (jscpd, PMD CPD, Simian) as part of CI. When duplication is detected, extract shared logic into a well-tested utility module or shared library. For microservices, create internal packages or contract-tested shared libraries. Apply the Rule of Three: tolerate two copies, extract on the third.
|
|
526
|
+
|
|
527
|
+
**Detection rule:**
|
|
528
|
+
|
|
529
|
+
Run clone detection in CI. Flag any block of 10+ lines that appears in 3 or more locations. Track the "duplication ratio" (duplicated lines / total lines) -- healthy codebases stay below 5%.
|
|
530
|
+
|
|
531
|
+
---
|
|
532
|
+
|
|
533
|
+
### AP-19: Dead Code Accumulation
|
|
534
|
+
|
|
535
|
+
**Also known as:** Boat Anchor, Phantom Features, Digital Hoarding
|
|
536
|
+
**Frequency:** Common
|
|
537
|
+
**Severity:** Moderate
|
|
538
|
+
**Detection difficulty:** Moderate
|
|
539
|
+
|
|
540
|
+
**What it looks like:**
|
|
541
|
+
|
|
542
|
+
The codebase contains feature flags that were never cleaned up, API endpoints that no client calls, classes that no code instantiates, and configuration options that no deployment uses. Developers are afraid to delete anything because "it might be used somewhere" or "someone might need it later."
|
|
543
|
+
|
|
544
|
+
**Why teams do it:**
|
|
545
|
+
|
|
546
|
+
Deleting code feels riskier than leaving it. Without comprehensive tests or runtime monitoring, it is genuinely difficult to prove that code is unused. Feature flags are added for gradual rollouts but never removed after the rollout is complete. In one documented case, engineers were reluctant to remove error-handling code for error codes that were never actually generated because they feared it would introduce new bugs.
|
|
547
|
+
|
|
548
|
+
**What goes wrong:**
|
|
549
|
+
|
|
550
|
+
Dead code inflates the codebase, increasing cognitive load for developers who must mentally filter out irrelevant code. It increases build times, test times, and artifact sizes. Dead code can mask real issues -- unused exception handlers, for instance, give a false sense of error coverage. During refactoring, dead code creates false dependencies that complicate the work.
|
|
551
|
+
|
|
552
|
+
**The fix:**
|
|
553
|
+
|
|
554
|
+
Use static analysis tools (tree-shaking for JS, `vulture` for Python, `deadcode` for Go) to identify unreachable code. Monitor runtime code coverage in production (not just tests) to find code that is reachable in theory but never executed in practice. Establish a policy: feature flags must be cleaned up within 2 sprints of full rollout. When in doubt, delete the code -- version control means it is never truly gone.
|
|
555
|
+
|
|
556
|
+
**Detection rule:**
|
|
557
|
+
|
|
558
|
+
Run dead code detection tools quarterly. Track the ratio of unreachable code to total code. If more than 10% of the codebase is unreachable by static analysis, dead code accumulation is a problem. Count stale feature flags -- if any flag has been in a permanent ON or OFF state for more than 3 months, it is dead code.
|
|
559
|
+
|
|
560
|
+
---
|
|
561
|
+
|
|
562
|
+
### AP-20: No Debt Metrics
|
|
563
|
+
|
|
564
|
+
**Also known as:** Gut Feel Management, The Unmeasured Codebase, Flying Blind
|
|
565
|
+
**Frequency:** Common
|
|
566
|
+
**Severity:** High
|
|
567
|
+
**Detection difficulty:** Moderate
|
|
568
|
+
|
|
569
|
+
**What it looks like:**
|
|
570
|
+
|
|
571
|
+
The team has no quantitative measurement of their technical debt. They cannot answer questions like "how much debt do we have?", "is it getting better or worse?", or "what is the business cost of this debt?" Decisions about debt investment are made based on anecdotes, emotion, and whoever argues most persuasively in meetings.
|
|
572
|
+
|
|
573
|
+
**Why teams do it:**
|
|
574
|
+
|
|
575
|
+
Measuring debt is genuinely hard. Unlike financial debt, technical debt has no standard unit of measurement. Tools like SonarQube provide a "technical debt ratio" but teams do not configure or monitor them. There is skepticism about whether any metric can truly capture the complexity of code quality.
|
|
576
|
+
|
|
577
|
+
**What goes wrong:**
|
|
578
|
+
|
|
579
|
+
Without metrics, teams cannot make data-driven arguments for debt investment. "We need to spend a sprint on debt reduction" is met with "prove it" -- and without metrics, the team cannot. This creates a doom loop: no metrics means no evidence, no evidence means no investment, no investment means debt grows, and growing debt means lower velocity, but without metrics the cause of the velocity drop cannot be attributed to debt.
|
|
580
|
+
|
|
581
|
+
**The fix:**
|
|
582
|
+
|
|
583
|
+
Adopt a small set of actionable metrics. The Technical Debt Ratio (remediation cost / development cost) provides a single percentage. Complement it with: (1) code churn hotspots (files changed most frequently are where debt hurts most), (2) cyclomatic/cognitive complexity trends, (3) dependency freshness scores, and (4) CI pipeline duration trends. Tools like SonarQube, CodeScene, CodeClimate, and NDepend automate collection. Present metrics monthly alongside velocity and incident reports.
|
|
584
|
+
|
|
585
|
+
**Detection rule:**
|
|
586
|
+
|
|
587
|
+
Ask the tech lead: "What is your current technical debt ratio?" If the answer is not a number, metrics are absent. Check whether any code quality tool is integrated into CI. If not, measurement infrastructure is missing entirely.
|
|
588
|
+
|
|
589
|
+
---
|
|
590
|
+
|
|
591
|
+
## Root Cause Analysis
|
|
592
|
+
|
|
593
|
+
| Root Cause | Anti-Patterns It Drives | Systemic Fix |
|
|
594
|
+
|---|---|---|
|
|
595
|
+
| Short-term delivery pressure | AP-01, AP-07, AP-10, AP-12 | Executive sponsorship for 15-25% maintenance allocation |
|
|
596
|
+
| Invisible cost of debt | AP-01, AP-02, AP-20 | Dashboards showing debt metrics alongside feature metrics |
|
|
597
|
+
| No ownership model | AP-09, AP-15, AP-16 | Module ownership registry with mandatory backup owners |
|
|
598
|
+
| Missing quality gates | AP-03, AP-10, AP-12, AP-18 | Automated CI checks for debt indicators (TODOs, skipped tests, duplication) |
|
|
599
|
+
| Emotional attachment to clean slate | AP-04, AP-05 | Mandatory Strangler Fig evaluation before any rewrite proposal |
|
|
600
|
+
| Knowledge concentration | AP-09, AP-11, AP-14 | Code review rotation, ADRs, documentation-as-code |
|
|
601
|
+
| Absent measurement | AP-02, AP-08, AP-20 | SonarQube/CodeScene integration with trending dashboards |
|
|
602
|
+
| Fear of breaking changes | AP-13, AP-17, AP-19 | Comprehensive test coverage enabling confident refactoring |
|
|
603
|
+
| Scope discipline failure | AP-05, AP-06, AP-16 | Clear PR scope rules, migration completion budgets |
|
|
604
|
+
| Cultural normalization of debt | AP-03, AP-07, AP-10 | Regular debt retrospectives, debt as a standing agenda item |
|
|
605
|
+
|
|
606
|
+
## Self-Check Questions
|
|
607
|
+
|
|
608
|
+
Use these during sprint planning, retrospectives, or architecture reviews:
|
|
609
|
+
|
|
610
|
+
1. Can we produce a prioritized list of our top 10 known technical debt items right now, with estimated business impact?
|
|
611
|
+
2. What percentage of our last 6 sprints was allocated to debt reduction, and what was actually delivered?
|
|
612
|
+
3. How many TODO/HACK/FIXME comments exist in the codebase today vs. 6 months ago? Is the trend up or down?
|
|
613
|
+
4. If our most tenured developer left tomorrow, which modules would become no-go zones?
|
|
614
|
+
5. How many of our dependencies have known critical vulnerabilities with available fixes right now?
|
|
615
|
+
6. What is our test suite's skip rate and flake rate? Has it improved or degraded over the past quarter?
|
|
616
|
+
7. When was the last time our README or onboarding documentation was validated by a new team member?
|
|
617
|
+
8. Are there any migrations (database, framework, architecture) that were started but never completed?
|
|
618
|
+
9. Can a new developer set up the development environment using only written documentation, without asking anyone?
|
|
619
|
+
10. How long does our CI pipeline take today vs. 6 months ago? What is driving the increase?
|
|
620
|
+
11. What is our framework/language version gap relative to the latest stable release?
|
|
621
|
+
12. Do we have any infrastructure that cannot be reproduced from code (snowflake servers, manual configurations)?
|
|
622
|
+
13. When was the last time we deleted code, and do we have a process for identifying dead code?
|
|
623
|
+
14. Do our code quality metrics (complexity, duplication, coverage) have visible trend lines that the team reviews?
|
|
624
|
+
15. If a critical production incident occurred in our oldest module, how confident are we in diagnosing and fixing it within 4 hours?
|
|
625
|
+
|
|
626
|
+
## Code Smell Quick Reference
|
|
627
|
+
|
|
628
|
+
| Smell | Typical Indicator | Related Anti-Pattern | Automated Tool |
|
|
629
|
+
|---|---|---|---|
|
|
630
|
+
| Stale TODOs | `TODO` comments older than 90 days | AP-10: Permanent Shortcuts | Custom linter with `git blame` date check |
|
|
631
|
+
| Skipped tests | `@skip`, `xit`, `xdescribe` count > 5% | AP-12: Test Rot | Test framework reporting, CI metrics |
|
|
632
|
+
| Outdated dependencies | `npm outdated` shows 30%+ major version gaps | AP-13: Dependency Rot | Dependabot, Renovate, `pip-audit` |
|
|
633
|
+
| High duplication | Clone detection shows > 5% duplicated lines | AP-18: Copy-Paste Debt | jscpd, PMD CPD, SonarQube |
|
|
634
|
+
| Dead code | Static analysis flags unreachable functions | AP-19: Dead Code Accumulation | `vulture` (Python), tree-shaking (JS), `deadcode` (Go) |
|
|
635
|
+
| God modules | Files with > 500 LOC or > 20 public methods | AP-05 overlap, codebase complexity | SonarQube, CodeClimate |
|
|
636
|
+
| Bus factor 1 | `git log` shows > 70% single-author modules | AP-09: Departed Developer Debt | `git-fame`, CodeScene knowledge maps |
|
|
637
|
+
| No ADRs | Zero `adr-*.md` or `doc/decisions/` files | AP-11: No Documentation of WHY | File existence check in CI |
|
|
638
|
+
| Coexisting paradigms | Both REST and GraphQL clients for same service | AP-16: Migration Debt | Custom grep rules in CI |
|
|
639
|
+
| Rising build times | CI duration trend increasing > 20% quarter-over-quarter | AP-15, AP-19 | CI platform analytics (GitHub Actions, CircleCI) |
|
|
640
|
+
| No quality dashboard | No SonarQube/CodeScene/CodeClimate integration | AP-20: No Debt Metrics | Check for tool configuration in repo |
|
|
641
|
+
| Snowflake infra | Manual SSH steps in deployment runbook | AP-15: Infrastructure Debt | Audit deployment documentation |
|
|
642
|
+
| Version lock-in | Framework version > 1 major behind latest | AP-17: Framework Version Debt | Version comparison scripts |
|
|
643
|
+
| Feature flag rot | Flags in permanent ON/OFF state > 90 days | AP-19: Dead Code Accumulation | Feature flag management platform reports |
|
|
644
|
+
|
|
645
|
+
---
|
|
646
|
+
|
|
647
|
+
*Researched: 2026-03-08 | Sources: Wikipedia (Technical Debt), Atlassian (Managing Technical Debt), SIG (Technical Debt Examples), Brainhub (15 Technical Debt Examples), Joel Spolsky / Joel on Software (Things You Should Never Do), Martin Fowler (Strangler Fig Pattern, Refactoring), Fred Brooks (The Mythical Man-Month, Second System Effect), Jeff Atwood / Coding Horror (Gold Plating), Will Larson / Irrational Exuberance (Migrations), Mike Hadlow (Lava Layer Anti-Pattern), Google Engineering Productivity (Flaky Tests Research), DevIQ (Copy-Paste Programming), SonarSource (Measuring Technical Debt), CodeScene, Help Net Security (DevSecOps Supply Chain Risk), SourceMaking (Software Development Anti-Patterns), vFunction (Technical Debt Measurement), freecodecamp.org (Anti-Patterns in Code)*
|