@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,616 @@
|
|
|
1
|
+
# Technology Selection — Architecture Expertise Module
|
|
2
|
+
|
|
3
|
+
> Technology selection is the process of choosing languages, frameworks, databases, and tools for a project. The best heuristic: "Choose boring technology" (Dan McKinley). Every team has a limited budget of innovation tokens — spend them on your product, not your infrastructure. The wrong technology choice costs months; the right choice is often the most established one.
|
|
4
|
+
|
|
5
|
+
> **Category:** Decision
|
|
6
|
+
> **Complexity:** Moderate
|
|
7
|
+
> **Applies when:** Starting new projects, adding new components, evaluating framework migrations, or choosing between technology alternatives
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## What This Is (and What It Isn't)
|
|
12
|
+
|
|
13
|
+
### Definition
|
|
14
|
+
|
|
15
|
+
Technology selection is the structured evaluation of languages, frameworks, databases, infrastructure platforms, and tools for a software project. It encompasses both the initial choices that shape a project's foundation and the ongoing decisions about introducing new technologies into an existing system.
|
|
16
|
+
|
|
17
|
+
The discipline exists because technology decisions are among the most expensive to reverse. Choosing the wrong database costs 6-18 months of migration effort. Choosing the wrong language locks in hiring constraints for years. Choosing the wrong framework means rewriting when you should be shipping features.
|
|
18
|
+
|
|
19
|
+
### The Innovation Tokens Model (Dan McKinley)
|
|
20
|
+
|
|
21
|
+
Dan McKinley's "Choose Boring Technology" essay introduced the concept that every company gets roughly three innovation tokens. These tokens represent the organization's finite capacity to absorb the risk and operational cost of unfamiliar technology. The supply is fixed — you cannot earn more by being smart or ambitious.
|
|
22
|
+
|
|
23
|
+
Spending an innovation token means:
|
|
24
|
+
- **Learning curve**: The team must learn the technology's idioms, failure modes, and operational characteristics from scratch.
|
|
25
|
+
- **Unknown unknowns**: Boring technology has well-documented failure modes. New technology has failure modes that nobody has encountered yet. You will be the one to discover them, in production, at 2am.
|
|
26
|
+
- **Ecosystem gaps**: New technology has fewer libraries, fewer Stack Overflow answers, fewer blog posts about solving specific problems. Your team will write code that the ecosystem would have provided for a mature technology.
|
|
27
|
+
- **Hiring friction**: Fewer developers know the technology. The ones who do command a premium. When they leave, replacing them is harder.
|
|
28
|
+
|
|
29
|
+
The question is never "is this technology better?" The question is: "Is this technology so much better at solving our specific problem that it justifies spending one of our three innovation tokens?"
|
|
30
|
+
|
|
31
|
+
If you use Kubernetes when Heroku would suffice, you spent a token. If you use MongoDB when PostgreSQL would work, you spent a token. If you write your backend in Rust when Go or Python would do, you spent a token. Three tokens go fast.
|
|
32
|
+
|
|
33
|
+
### The ThoughtWorks Technology Radar
|
|
34
|
+
|
|
35
|
+
ThoughtWorks publishes a Technology Radar twice yearly — a snapshot of technologies categorized into four rings:
|
|
36
|
+
|
|
37
|
+
- **Adopt**: Technologies with broad industry experience that ThoughtWorks recommends for broad use.
|
|
38
|
+
- **Trial**: Technologies worth pursuing in a project that can handle the risk. Not yet fully proven across a wide range of use cases.
|
|
39
|
+
- **Assess**: Technologies worth exploring with the aim of understanding how they will affect your organization.
|
|
40
|
+
- **Hold**: Technologies to approach with caution. Proceed only if you have a compelling, specific reason.
|
|
41
|
+
|
|
42
|
+
The Radar is valuable not as a prescription but as a calibration tool. If a technology you are considering is in "Hold," that is a strong signal to reconsider. If it is in "Adopt," that reduces (but does not eliminate) the risk of choosing it.
|
|
43
|
+
|
|
44
|
+
### What Technology Selection Is NOT
|
|
45
|
+
|
|
46
|
+
- **Not picking the coolest new thing.** The goal is not to use the most interesting technology. The goal is to ship a reliable product with a maintainable system. Interesting technology is interesting precisely because it is unproven.
|
|
47
|
+
- **Not a one-time decision.** Technology selection is ongoing. Every new dependency, library, or tool is a technology decision. The discipline applies to adding a new npm package as much as choosing a primary language.
|
|
48
|
+
- **Not solely a technical decision.** Technology selection is a business decision with technical inputs. Hiring pool, team expertise, vendor stability, licensing terms, and total cost of ownership are business factors that outweigh raw technical capability in most cases.
|
|
49
|
+
- **Not consensus-driven.** Technology decisions should be made by the smallest group of people with the most relevant context, documented in an ADR, and communicated broadly. Design-by-committee produces compromises that satisfy no one.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## When to Evaluate Carefully
|
|
54
|
+
|
|
55
|
+
Not every technology decision warrants a formal evaluation. Reserve structured evaluation for decisions that are expensive to reverse.
|
|
56
|
+
|
|
57
|
+
### High-Stakes Decisions (Formal Evaluation Required)
|
|
58
|
+
|
|
59
|
+
**Primary programming language for a new project.**
|
|
60
|
+
This locks in the hiring pool, the ecosystem of libraries, the deployment model, and the debugging tools for years. A language choice made in week one is still shaping the team in year five. Evaluate formally with a weighted scoring matrix.
|
|
61
|
+
|
|
62
|
+
**Primary database.**
|
|
63
|
+
PostgreSQL vs. MySQL vs. MongoDB vs. DynamoDB. This determines your data model, your query capabilities, your scaling model, your backup and recovery procedures, and your operational expertise requirements. Migration between databases is one of the most expensive operations in software engineering — often requiring months of dual-write, shadow-read verification, and cutover planning.
|
|
64
|
+
|
|
65
|
+
**Framework migration.**
|
|
66
|
+
Moving from Express to NestJS, from Django to FastAPI, from Angular to React. Framework migrations touch every file in the codebase. They take months and often stall halfway, leaving the team maintaining two frameworks simultaneously. Evaluate whether the pain of the current framework genuinely justifies the cost of migration.
|
|
67
|
+
|
|
68
|
+
**Adding a new data store category.**
|
|
69
|
+
Introducing Redis, Elasticsearch, Kafka, or a graph database alongside your primary database. Each new data store adds operational burden: monitoring, backup, scaling, failure modes, version upgrades. The question is whether the capability gap is real or whether your primary database can handle the use case (PostgreSQL's full-text search is often sufficient; PostgreSQL's LISTEN/NOTIFY can replace a simple message queue).
|
|
70
|
+
|
|
71
|
+
**Cloud provider or hosting platform.**
|
|
72
|
+
AWS vs. GCP vs. Azure vs. self-hosted. This is a multi-year commitment with significant lock-in through managed services, IAM policies, networking configurations, and team expertise. Switching cloud providers is a 6-18 month project for most organizations.
|
|
73
|
+
|
|
74
|
+
**New programming language in an existing system.**
|
|
75
|
+
Introducing Python for ML alongside a Go backend, or adding Rust for a performance-critical component. Each new language requires its own build pipeline, its own dependency management, its own testing infrastructure, and developers who can maintain it. The polyglot tax is real.
|
|
76
|
+
|
|
77
|
+
### Real-World Reference Points
|
|
78
|
+
|
|
79
|
+
**Etsy's deliberate conservatism.** Etsy famously ran on a PHP monolith and resisted the microservices trend for years. Their engineering blog documented how they evaluated whether to adopt new technologies by asking: "What is the cost of operating this in production for the next five years, and who will be on-call for it?" This lens killed most proposals for new technology.
|
|
80
|
+
|
|
81
|
+
**Shopify staying on Ruby on Rails.** Despite Rails being dismissed as "not scalable" by much of the industry, Shopify chose to invest in scaling Rails rather than rewriting. They built custom tooling (Packwerk for module boundaries, Vitess for MySQL sharding) rather than switching to a "more scalable" language. The result: hundreds of billions in GMV processed through a Rails monolith, with investments focused on the product rather than on learning a new stack.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## When NOT to Over-Evaluate
|
|
86
|
+
|
|
87
|
+
The opposite failure mode is equally dangerous: analysis paralysis. Teams can spend weeks or months evaluating technology options when the default would have been fine.
|
|
88
|
+
|
|
89
|
+
### Signs You Are Over-Evaluating
|
|
90
|
+
|
|
91
|
+
**Comparing more than three options.**
|
|
92
|
+
If you are evaluating 8 JavaScript frameworks, you have already lost. The differences between the top three candidates are marginal. Pick one, build something, and move on. The time spent on a 15-framework comparison matrix would have been better spent shipping features.
|
|
93
|
+
|
|
94
|
+
**Evaluating for more than two weeks.**
|
|
95
|
+
A technology evaluation that takes longer than two weeks is almost certainly over-engineered. Most decisions can be made in 3-5 days with a focused proof-of-concept. If you cannot differentiate between candidates in two weeks, the candidates are interchangeable — pick the one with the largest community and move on.
|
|
96
|
+
|
|
97
|
+
**The decision is easily reversible.**
|
|
98
|
+
Choosing a CSS framework, a date-parsing library, a logging format, or a testing framework. These decisions can be changed without rewriting the system. Spend 30 minutes, pick one, and move on.
|
|
99
|
+
|
|
100
|
+
**Technology FOMO is driving the evaluation.**
|
|
101
|
+
"We should evaluate Rust" for a CRUD API that does 50 requests per second. "We should look at Deno" when Node.js is working fine. "Maybe we should switch to Bun" because it benchmarks faster on a microbenchmark that is irrelevant to your workload. If the current technology is not causing measurable problems, there is nothing to evaluate.
|
|
102
|
+
|
|
103
|
+
**The team is avoiding shipping by evaluating.**
|
|
104
|
+
This is the most insidious form. Evaluation feels productive — you are reading documentation, building prototypes, writing comparison documents. But if the evaluation is a substitute for making a decision and building the actual product, it is procrastination dressed as diligence.
|
|
105
|
+
|
|
106
|
+
### Real-World Examples of Over-Evaluation
|
|
107
|
+
|
|
108
|
+
**The startup that spent 6 weeks choosing a frontend framework.** A three-person team spent six weeks comparing React, Vue, Svelte, Angular, and Solid. They built toy prototypes in each, wrote a 40-page comparison document, and held four meetings to debate. They chose React — the same framework two of the three developers already knew. Six weeks of runway burned. The comparison document was never referenced again.
|
|
109
|
+
|
|
110
|
+
**The "we should use Rust" conversation.** A team building an internal CRUD tool — forms, lists, basic search — spent three weeks exploring whether to write the backend in Rust for "performance." The tool would have at most 200 concurrent users. They eventually chose Node.js with Express, which they already knew. The Rust evaluation produced a half-finished prototype that demonstrated the team could not be productive in Rust. Total cost: three weeks of a senior developer's time, plus the opportunity cost of features not shipped.
|
|
111
|
+
|
|
112
|
+
**Database evaluation for a known workload.** A team with a relational data model, ACID transaction requirements, and existing PostgreSQL expertise spent a month evaluating MongoDB, CockroachDB, and PlanetScale. They chose PostgreSQL. The evaluation confirmed what the team's experience already predicted. The month would have been better spent building the schema and writing queries.
|
|
113
|
+
|
|
114
|
+
### The Default Stack Heuristic
|
|
115
|
+
|
|
116
|
+
When you catch yourself over-evaluating, apply the default stack heuristic: if the most common, boring choice would work for your use case, choose it and move on. PostgreSQL is the default database. React or Next.js is the default frontend. Python, Node.js, or Go is the default backend (pick the one the team knows). AWS or a PaaS is the default infrastructure. Redis is the default cache. These defaults are not optimal for every situation, but they are sufficient for most situations, and "sufficient and shipping" beats "optimal and still evaluating."
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## How It Works
|
|
121
|
+
|
|
122
|
+
### Evaluation Criteria
|
|
123
|
+
|
|
124
|
+
When a decision warrants formal evaluation, assess candidates against these criteria, weighted by your specific context:
|
|
125
|
+
|
|
126
|
+
**1. Team Expertise (Weight: High)**
|
|
127
|
+
The single most important factor. A technology the team knows well will always outperform a "better" technology the team is learning. A team of Django experts will ship faster, debug faster, and operate more reliably with Django than with a theoretically superior framework they have never used. The learning curve is not a one-time cost — it compounds through every debugging session, every production incident, and every code review for months.
|
|
128
|
+
|
|
129
|
+
**2. Ecosystem Maturity (Weight: High)**
|
|
130
|
+
How old is the technology? How many production deployments exist? How many companies are running it at scale? Ecosystem maturity correlates with:
|
|
131
|
+
- Documented failure modes (you will find Stack Overflow answers for your errors)
|
|
132
|
+
- Battle-tested libraries (authentication, payments, email — already built and maintained)
|
|
133
|
+
- Known performance characteristics (benchmarks under real-world conditions, not synthetic tests)
|
|
134
|
+
- Established operational patterns (how to deploy, monitor, backup, upgrade)
|
|
135
|
+
|
|
136
|
+
A technology that has been in production for 10 years has had its sharp edges filed down by thousands of teams. A technology that launched last year has sharp edges that no one has found yet.
|
|
137
|
+
|
|
138
|
+
**3. Community Size and Activity (Weight: Medium-High)**
|
|
139
|
+
Measured by: GitHub stars (directional), npm/PyPI weekly downloads (quantitative), Stack Overflow question volume (practical), number of active contributors, frequency of releases, corporate backing. A large, active community means:
|
|
140
|
+
- Problems get solved quickly (someone else has already encountered your issue)
|
|
141
|
+
- Libraries stay maintained (abandoned libraries are a major source of tech debt)
|
|
142
|
+
- Hiring is easier (more developers know the technology)
|
|
143
|
+
- Knowledge resources are abundant (tutorials, courses, blog posts, conference talks)
|
|
144
|
+
|
|
145
|
+
**4. Hiring Pool (Weight: Medium-High)**
|
|
146
|
+
Can you hire developers who know this technology in your market and at your salary band? This is a business constraint that technical evaluations routinely ignore. A technology might be technically superior but irrelevant if you cannot hire for it. Check job posting volumes on LinkedIn, Indeed, and specialized job boards. Check salary data on levels.fyi or Glassdoor. If hiring for a technology requires a 30% salary premium, that is a real cost that should be factored into the evaluation.
|
|
147
|
+
|
|
148
|
+
**5. Long-Term Maintenance (Weight: Medium)**
|
|
149
|
+
Who maintains the technology? A solo maintainer on a critical open-source dependency is a supply-chain risk (the left-pad incident, the colors.js incident, the xz backdoor). Corporate-backed open source (React by Meta, Angular by Google, Spring by VMware) has more predictable maintenance but comes with the risk of corporate abandonment (Google's graveyard of killed products is long). Evaluate: release frequency, number of maintainers, corporate sponsorship, governance model, license stability.
|
|
150
|
+
|
|
151
|
+
**6. Performance Requirements (Weight: Context-Dependent)**
|
|
152
|
+
Performance matters only when it is a binding constraint. For a CRUD API serving 100 requests per second, the difference between Node.js (50,000 req/sec capacity) and Rust (500,000 req/sec capacity) is irrelevant — both are 100x over the requirement. Performance becomes a selection criterion only when:
|
|
153
|
+
- The workload is compute-intensive (video encoding, ML inference, real-time data processing)
|
|
154
|
+
- Latency requirements are below 10ms at p99
|
|
155
|
+
- Throughput requirements exceed what a single process in a general-purpose language can handle
|
|
156
|
+
- Memory constraints are tight (embedded systems, edge computing)
|
|
157
|
+
|
|
158
|
+
For the vast majority of web applications, any mainstream language and framework has sufficient performance.
|
|
159
|
+
|
|
160
|
+
**7. Licensing (Weight: Low but Critical)**
|
|
161
|
+
Most open-source licenses (MIT, Apache 2.0, BSD) are business-friendly. Watch for:
|
|
162
|
+
- **AGPL**: Requires you to open-source your entire application if you modify and deploy the AGPL-licensed code (relevant for SaaS).
|
|
163
|
+
- **SSPL (Server Side Public License)**: MongoDB's license, designed to prevent cloud providers from offering it as a service. May have implications for your deployment model.
|
|
164
|
+
- **BSL (Business Source License)**: Used by HashiCorp (Terraform, Vault). Restricts competitive use. Converts to open source after a time period.
|
|
165
|
+
- **License changes**: Redis, Elasticsearch, and MongoDB all changed licenses after achieving market dominance. Evaluate the risk of future license changes for critical dependencies.
|
|
166
|
+
|
|
167
|
+
**8. Integration with Existing System (Weight: Context-Dependent)**
|
|
168
|
+
If you are adding a technology to an existing system, how well does it integrate? Does it support your existing authentication system? Can it use your existing CI/CD pipeline? Does it work with your monitoring and logging infrastructure? Integration friction is a hidden cost that compounds over time.
|
|
169
|
+
|
|
170
|
+
### Structured Evaluation: Weighted Scoring Matrix
|
|
171
|
+
|
|
172
|
+
For high-stakes decisions, use a weighted scoring matrix to make the evaluation explicit and comparable:
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
Technology Evaluation: [Decision Title]
|
|
176
|
+
Date: YYYY-MM-DD
|
|
177
|
+
Evaluator(s): [Names]
|
|
178
|
+
Context: [Why this decision is being made now]
|
|
179
|
+
|
|
180
|
+
Criteria Weight Option A Option B Option C
|
|
181
|
+
Score W×S Score W×S Score W×S
|
|
182
|
+
─────────────────────────────────────────────────────────────────────────
|
|
183
|
+
Team expertise 25% 8 2.00 5 1.25 3 0.75
|
|
184
|
+
Ecosystem maturity 20% 9 1.80 7 1.40 6 1.20
|
|
185
|
+
Community / hiring pool 15% 8 1.20 7 1.05 4 0.60
|
|
186
|
+
Long-term maintenance 10% 8 0.80 7 0.70 7 0.70
|
|
187
|
+
Performance fit 10% 6 0.60 7 0.70 9 0.90
|
|
188
|
+
Integration w/ existing 10% 9 0.90 6 0.60 4 0.40
|
|
189
|
+
Learning curve 5% 8 0.40 6 0.30 3 0.15
|
|
190
|
+
Licensing 5% 9 0.45 9 0.45 9 0.45
|
|
191
|
+
─────────────────────────────────────────────────────────────────────────
|
|
192
|
+
TOTAL 100% 8.15 6.45 5.15
|
|
193
|
+
|
|
194
|
+
Scores: 1-3 = Poor fit, 4-6 = Adequate, 7-8 = Good fit, 9-10 = Excellent fit
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
The matrix does not make the decision — it makes the reasoning visible. If the scores are close (within 1 point), the candidates are effectively equivalent. Pick the one with the highest team expertise score and move on.
|
|
198
|
+
|
|
199
|
+
### Proof-of-Concept: Build the Hard Parts First
|
|
200
|
+
|
|
201
|
+
When evaluating a technology, build a proof-of-concept that tests the hardest part of your use case — not the easiest. Every framework's tutorial makes the easy parts look good. The question is how the technology handles the parts that are specific to your problem.
|
|
202
|
+
|
|
203
|
+
**Bad PoC**: Build a to-do list in the new framework. This tests nothing — every framework can render a list and handle form submission.
|
|
204
|
+
|
|
205
|
+
**Good PoC**: Build the authentication flow with your SSO provider, the complex query that joins 5 tables with pagination, the WebSocket connection that handles 1,000 concurrent users, the file upload that processes 500MB files. Build the part that will be hardest in production.
|
|
206
|
+
|
|
207
|
+
**PoC time-box**: 3-5 days maximum. If you cannot build a meaningful proof-of-concept in a week, either the technology has too steep a learning curve for your team or your PoC scope is too large.
|
|
208
|
+
|
|
209
|
+
### The Dan McKinley Test
|
|
210
|
+
|
|
211
|
+
Before finalizing any technology decision, ask:
|
|
212
|
+
|
|
213
|
+
1. How many of our three innovation tokens does this spend? (If the answer is zero — the technology is boring and well-understood — proceed. If the answer is one or more, justify the spend against what other innovation you need.)
|
|
214
|
+
2. What is the failure mode we have never seen? (Boring technology has documented failure modes. New technology has undiscovered failure modes. How much production risk are we accepting?)
|
|
215
|
+
3. Could we accomplish this with a technology we already operate? (If yes, the new technology must provide a dramatic — not marginal — improvement to justify the operational overhead.)
|
|
216
|
+
4. Who will be on-call for this at 2am? (If the answer is "the one person who proposed it," the technology is a bus-factor risk, not a team capability.)
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## Trade-Offs Matrix
|
|
221
|
+
|
|
222
|
+
| Approach | You Get | You Pay |
|
|
223
|
+
|---|---|---|
|
|
224
|
+
| Cutting-edge technology | Latest features, potential performance gains, developer excitement | Unknown failure modes, sparse documentation, small hiring pool, ecosystem gaps, risk of abandonment |
|
|
225
|
+
| Boring / established technology | Documented failure modes, large ecosystem, easy hiring, abundant resources | May lack latest features, perceived as "uncool," possible performance ceiling for extreme workloads |
|
|
226
|
+
| Specialized technology (e.g., TimescaleDB for time-series) | Optimized for specific workload, purpose-built performance | Another system to operate, smaller community, harder to hire, may not generalize |
|
|
227
|
+
| General-purpose technology (e.g., PostgreSQL for everything) | One system to operate, deep team expertise, broad applicability | May not be optimal for any specific workload, requires creative solutions for edge cases |
|
|
228
|
+
| Popular technology (React, Node.js) | Largest hiring pool, most libraries, most tutorials, most Stack Overflow answers | May not be best technical fit, hype-driven adoption can mask weaknesses |
|
|
229
|
+
| Best-fit technology (Elixir for real-time, Rust for systems) | Optimal for specific use case, developer satisfaction for that domain | Smaller hiring pool, less ecosystem breadth, higher onboarding cost |
|
|
230
|
+
| Single-vendor platform (Firebase, Supabase) | Fast initial development, integrated tooling, managed operations | Vendor lock-in, pricing risk, feature constraints, migration difficulty |
|
|
231
|
+
| Multi-vendor / open-source stack | No lock-in, maximum flexibility, cost control | Integration burden, operational overhead, more decisions to make |
|
|
232
|
+
| Monoglot stack (one language everywhere) | Shared expertise, code reuse, single build pipeline, easy hiring | Suboptimal for some workloads, "when you have a hammer" risk |
|
|
233
|
+
| Polyglot stack (best language per component) | Optimal tooling per workload | Multiple build pipelines, fragmented expertise, harder hiring, operational overhead |
|
|
234
|
+
| Managed services (RDS, ElastiCache, SQS) | Reduced operational burden, built-in scaling, automated backups | Higher cost, less control, vendor lock-in, potential latency overhead |
|
|
235
|
+
| Self-managed infrastructure | Full control, cost optimization at scale, no vendor constraints | Operational burden, requires dedicated infrastructure expertise, on-call overhead |
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Evolution Path
|
|
240
|
+
|
|
241
|
+
Technology choices are not permanent. When a technology is not working, the question is how to migrate without a catastrophic rewrite.
|
|
242
|
+
|
|
243
|
+
### When to Migrate
|
|
244
|
+
|
|
245
|
+
Migration is justified only when the current technology is a measurable bottleneck:
|
|
246
|
+
- **Performance ceiling**: The technology cannot handle the current workload, and tuning has been exhausted (not "we think it might not scale someday").
|
|
247
|
+
- **Hiring failure**: You have had open positions for 6+ months because you cannot find developers for the current stack.
|
|
248
|
+
- **Security end-of-life**: The technology is no longer receiving security patches (Python 2 after January 2020, older Node.js LTS versions).
|
|
249
|
+
- **Ecosystem abandonment**: Core libraries are unmaintained, the community has moved on, and you are maintaining forks of critical dependencies.
|
|
250
|
+
- **Licensing change**: The vendor changed the license in a way that is incompatible with your business model (the HashiCorp BSL change, the Redis SSPL change).
|
|
251
|
+
|
|
252
|
+
Migration is NOT justified by:
|
|
253
|
+
- "The new framework has nicer syntax"
|
|
254
|
+
- "Developers are bored with the current stack"
|
|
255
|
+
- "Conference talks are all about the new technology"
|
|
256
|
+
- "A competitor switched"
|
|
257
|
+
|
|
258
|
+
### Incremental Migration Patterns
|
|
259
|
+
|
|
260
|
+
**Strangler Fig Pattern.**
|
|
261
|
+
Named by Martin Fowler after strangler fig trees that grow around existing trees. New functionality is built in the new technology. A routing layer (API gateway, reverse proxy, or application-level router) directs requests to either the old or new system. Over time, more and more functionality is handled by the new system until the old system can be decommissioned. This is the safest migration pattern.
|
|
262
|
+
|
|
263
|
+
Allianz, one of the world's largest insurers, used the Strangler Fig pattern with Kafka as an event backbone to gradually migrate from legacy mainframes to cloud-based microservices — processing real-time claims data without disrupting existing operations.
|
|
264
|
+
|
|
265
|
+
**Branch by Abstraction.**
|
|
266
|
+
Introduce an abstraction layer (interface/adapter) between your application code and the technology you want to replace. Implement the interface for both the old and new technology. Use feature flags to route traffic between implementations. Validate the new implementation under production load before cutting over. Remove the old implementation.
|
|
267
|
+
|
|
268
|
+
**Parallel Run.**
|
|
269
|
+
Run both the old and new systems simultaneously. Send all traffic to both. Compare outputs. Investigate discrepancies. Only cut over when the new system produces identical results for a sustained period (typically 2-4 weeks). GitHub used this pattern when migrating from MySQL to a new database infrastructure.
|
|
270
|
+
|
|
271
|
+
**Blue-Green Migration.**
|
|
272
|
+
Deploy the new system alongside the old system. Switch all traffic at once. Keep the old system running as a fallback. Roll back instantly if problems are detected. This is appropriate for stateless services but risky for stateful systems (databases) where data diverges the moment you switch.
|
|
273
|
+
|
|
274
|
+
### The Migration Anti-Pattern: Big-Bang Rewrite
|
|
275
|
+
|
|
276
|
+
The big-bang rewrite — stop all feature development, rewrite the system from scratch in the new technology, switch over on launch day — fails more often than it succeeds. Joel Spolsky called it "the single worst strategic mistake that any software company can make." The second system carries all the complexity of the first without the years of accumulated bug fixes, edge-case handling, and domain knowledge embedded in the original code. Netscape's rewrite (which took three years and nearly killed the company) is the canonical cautionary tale.
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## Failure Modes
|
|
281
|
+
|
|
282
|
+
### Resume-Driven Development
|
|
283
|
+
|
|
284
|
+
**Pattern**: A developer or tech lead chooses a technology because they want it on their resume, not because it is the best fit for the project. The decision is rationalized with technical arguments, but the true motivation is career advancement.
|
|
285
|
+
|
|
286
|
+
**Symptoms**: The technology is dramatically more complex than the problem requires. The proposer is the only person who can work with it. The proposal emphasizes the technology's general capabilities rather than its fit for the specific problem. The proposal lacks a comparison with simpler alternatives.
|
|
287
|
+
|
|
288
|
+
**Impact**: The team inherits a technology they do not understand, cannot maintain, and cannot hire for. When the proposer leaves (and resume-driven developers tend to leave once the technology is on their resume), the team is stuck with an alien system.
|
|
289
|
+
|
|
290
|
+
**Prevention**: Require every technology proposal to include a comparison with the boring default. Require the proposer to demonstrate that the problem cannot be solved with existing technology. Ask: "If the person proposing this leaves tomorrow, can the rest of the team maintain it?"
|
|
291
|
+
|
|
292
|
+
### Shiny Object Syndrome
|
|
293
|
+
|
|
294
|
+
**Pattern**: The team chases new technologies because they are new, not because they solve a specific problem. Every conference talk and Hacker News post triggers a reevaluation of the stack.
|
|
295
|
+
|
|
296
|
+
**Symptoms**: The team has started multiple migrations but finished none. The codebase contains three different ORMs, two state management libraries, and four CSS approaches. Developers spend more time reading about new tools than building with existing ones. Without a framework to evaluate new technologies, shiny-object-driven decisions result in tool bloat, technical debt, and high software development costs. Teams sink time into prototypes that never ship.
|
|
297
|
+
|
|
298
|
+
**Impact**: Every new tool means another learning curve, more bugs, and reduced productivity — some studies suggest by as much as 40%. Context-switching between technologies within a single codebase destroys flow state and makes onboarding brutally slow.
|
|
299
|
+
|
|
300
|
+
**Prevention**: Establish a technology review process: any new technology must be proposed in writing with a problem statement, an evaluation against the boring alternative, and a proof-of-concept. The bar for introduction is high; the default answer is "no."
|
|
301
|
+
|
|
302
|
+
### Ignoring Team Expertise
|
|
303
|
+
|
|
304
|
+
**Pattern**: Choosing the "objectively best" technology while ignoring the team's actual skills. A team of Python developers is asked to build in Go because Go has better concurrency primitives. A team of React developers is switched to Svelte because Svelte has smaller bundle sizes.
|
|
305
|
+
|
|
306
|
+
**Symptoms**: Velocity drops by 50-70% during the learning period. Code reviews become arguments about idioms. Production incidents increase because the team does not understand the technology's failure modes. Senior developers feel demoted to junior-level productivity.
|
|
307
|
+
|
|
308
|
+
**Impact**: Months of reduced output. Increased turnover as developers who do not want to learn the new technology leave. The team never achieves the productivity they had with their previous stack because expertise takes years to build.
|
|
309
|
+
|
|
310
|
+
**Prevention**: Weight team expertise as the single highest factor in technology evaluation. A technology the team knows well, running at 80% of theoretical optimal, outperforms a "better" technology running at 30% of its potential because the team is still learning.
|
|
311
|
+
|
|
312
|
+
### Underweighting Ecosystem Maturity
|
|
313
|
+
|
|
314
|
+
**Pattern**: Choosing a technology based on benchmarks, features, or architecture elegance while ignoring the practical ecosystem: libraries, tools, documentation, and community knowledge.
|
|
315
|
+
|
|
316
|
+
**Symptoms**: The team spends weeks building authentication from scratch because the framework does not have a mature auth library. Common tasks (PDF generation, email sending, payment processing) require custom integration code. Error messages return zero Google results. The team becomes unpaid beta testers for the technology's ecosystem.
|
|
317
|
+
|
|
318
|
+
**Impact**: Development velocity is 2-3x slower than it would be with a mature ecosystem. The team writes and maintains infrastructure code that would be a library call in a more established technology.
|
|
319
|
+
|
|
320
|
+
**Prevention**: Before choosing any technology, inventory the libraries you will need for your specific use case. Verify that each one exists, is maintained, and has production users. If more than two critical libraries are missing or immature, the technology is not ready for your use case regardless of its other merits.
|
|
321
|
+
|
|
322
|
+
### Choosing Technology You Cannot Hire For
|
|
323
|
+
|
|
324
|
+
**Pattern**: Selecting a niche technology (Haskell, Elixir, Clojure, Nim) for a team that will need to grow. The technology may be technically excellent, but the hiring pool is a fraction of mainstream alternatives.
|
|
325
|
+
|
|
326
|
+
**Symptoms**: Job postings stay open for months. Candidates demand 30-50% salary premiums. The team cannot grow to meet business demands. Onboarding new hires takes 3-6 months instead of 2-4 weeks. The bus factor is dangerously low.
|
|
327
|
+
|
|
328
|
+
**Impact**: The technology becomes a growth bottleneck. The business cannot scale the team to meet demand. When key developers leave, institutional knowledge leaves with them and cannot be replaced.
|
|
329
|
+
|
|
330
|
+
**Prevention**: Before choosing a technology, check the hiring market in your geography and salary band. Search LinkedIn, Indeed, and specialized job boards. If the available talent pool is less than 10% of a mainstream alternative, factor this constraint explicitly into the decision. Niche technologies are appropriate only when the team is stable, small, and not expected to grow rapidly.
|
|
331
|
+
|
|
332
|
+
### Premature Optimization of the Stack
|
|
333
|
+
|
|
334
|
+
**Pattern**: Choosing technologies optimized for a scale the product has not reached and may never reach. Using Kafka when a simple database-backed job queue would suffice. Using Kubernetes when a PaaS would work. Using a distributed database when a single PostgreSQL instance has 100x headroom.
|
|
335
|
+
|
|
336
|
+
**Symptoms**: Infrastructure complexity vastly exceeds product complexity. The team spends more time operating infrastructure than building features. The system has 12 moving parts but serves 500 users.
|
|
337
|
+
|
|
338
|
+
**Impact**: Every engineering hour spent on infrastructure is an hour not spent on the product. Startups that over-engineer their infrastructure often run out of money before finding product-market fit — not because the technology failed, but because they optimized for a future that never arrived.
|
|
339
|
+
|
|
340
|
+
**Prevention**: Start with the simplest infrastructure that works. Upgrade when you have quantitative evidence that the current infrastructure is a bottleneck — not when you theorize that it might become one.
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Technology Landscape: Recommended Defaults
|
|
345
|
+
|
|
346
|
+
These are conservative, boring defaults for each technology category. They are not optimal for every situation, but they are sufficient for most situations and minimize innovation token expenditure.
|
|
347
|
+
|
|
348
|
+
### Programming Language
|
|
349
|
+
|
|
350
|
+
| Use Case | Default | Rationale |
|
|
351
|
+
|---|---|---|
|
|
352
|
+
| Web backend (general) | **TypeScript (Node.js)** or **Python** | Largest hiring pools, mature ecosystems, fast development velocity |
|
|
353
|
+
| Web backend (performance-sensitive) | **Go** | Simple concurrency model, fast compilation, single binary deployment, growing hiring pool |
|
|
354
|
+
| Web frontend | **TypeScript** | Industry standard, type safety reduces bugs, largest frontend ecosystem |
|
|
355
|
+
| Data / ML / AI | **Python** | Dominant ecosystem (NumPy, pandas, scikit-learn, PyTorch, TensorFlow), largest talent pool |
|
|
356
|
+
| Systems / infrastructure | **Go** or **Rust** | Go for services and CLIs; Rust when memory safety and zero-cost abstractions are required |
|
|
357
|
+
| Mobile (cross-platform) | **TypeScript (React Native)** or **Dart (Flutter)** | Largest cross-platform communities, single codebase for iOS and Android |
|
|
358
|
+
| Mobile (native) | **Swift (iOS)** / **Kotlin (Android)** | Platform-native performance and API access |
|
|
359
|
+
|
|
360
|
+
### Web Framework
|
|
361
|
+
|
|
362
|
+
| Use Case | Default | Rationale |
|
|
363
|
+
|---|---|---|
|
|
364
|
+
| Full-stack web app | **Next.js** | React-based, server-side rendering, API routes, massive community, Vercel deployment |
|
|
365
|
+
| API backend (Node.js) | **NestJS** or **Express** | NestJS for structure at scale, Express for simplicity |
|
|
366
|
+
| API backend (Python) | **Django** or **FastAPI** | Django for full-featured apps, FastAPI for pure APIs |
|
|
367
|
+
| API backend (Go) | **Standard library + Chi** or **Echo** | Go's stdlib is sufficient; Chi/Echo add routing convenience |
|
|
368
|
+
| API backend (Ruby) | **Ruby on Rails** | Convention over configuration, mature ecosystem, rapid development |
|
|
369
|
+
|
|
370
|
+
### Database
|
|
371
|
+
|
|
372
|
+
| Use Case | Default | Rationale |
|
|
373
|
+
|---|---|---|
|
|
374
|
+
| General-purpose relational | **PostgreSQL** | Most capable open-source RDBMS, JSON support, full-text search, extensions ecosystem, 30+ years of battle-testing |
|
|
375
|
+
| Simple relational (small scale) | **SQLite** | Zero-config, embedded, sufficient for apps with < 100 concurrent writers. Increasingly viable for production (Litestream, Turso) |
|
|
376
|
+
| Document store (if truly needed) | **MongoDB** | Largest NoSQL community, Atlas managed service. But ask first: does PostgreSQL's JSONB column solve the problem? |
|
|
377
|
+
| Key-value / cache | **Redis** | Industry standard, versatile (cache, session store, queue, pub/sub), well-understood operationally |
|
|
378
|
+
| Search | **PostgreSQL full-text search** first, then **Elasticsearch/OpenSearch** | PostgreSQL's built-in search handles most use cases. Elasticsearch only when you need faceted search, fuzzy matching at scale, or complex relevance tuning |
|
|
379
|
+
| Time-series | **TimescaleDB** (PostgreSQL extension) | Keeps you in the PostgreSQL ecosystem, avoids a separate data store |
|
|
380
|
+
| Analytics / OLAP | **ClickHouse** or **DuckDB** | ClickHouse for distributed analytics at scale (ThoughtWorks Radar: Adopt). DuckDB for embedded analytics |
|
|
381
|
+
|
|
382
|
+
### Queue / Message Broker
|
|
383
|
+
|
|
384
|
+
| Use Case | Default | Rationale |
|
|
385
|
+
|---|---|---|
|
|
386
|
+
| Background jobs | **Database-backed queue** (Sidekiq, Celery, BullMQ) | No additional infrastructure. Sufficient for most workloads |
|
|
387
|
+
| Event streaming (at scale) | **Apache Kafka** | Industry standard for high-throughput event streaming. Only introduce when database-backed queues are a proven bottleneck |
|
|
388
|
+
| Simple pub/sub | **Redis Pub/Sub** or **PostgreSQL LISTEN/NOTIFY** | Use what you already operate |
|
|
389
|
+
|
|
390
|
+
### Hosting / Infrastructure
|
|
391
|
+
|
|
392
|
+
| Use Case | Default | Rationale |
|
|
393
|
+
|---|---|---|
|
|
394
|
+
| Small team (< 10 engineers) | **PaaS**: Vercel, Railway, Render, Fly.io | Eliminates infrastructure operations. Ship code, not YAML |
|
|
395
|
+
| Medium team (10-50 engineers) | **AWS (ECS Fargate)** or **GCP (Cloud Run)** | Managed containers without Kubernetes complexity |
|
|
396
|
+
| Large team (50+ engineers) | **AWS (EKS)** or **GCP (GKE)** | Kubernetes justified when you have dedicated platform engineering capacity |
|
|
397
|
+
| Static sites / JAMstack | **Vercel** or **Cloudflare Pages** | Edge deployment, zero-config, generous free tiers |
|
|
398
|
+
|
|
399
|
+
### Monitoring / Observability
|
|
400
|
+
|
|
401
|
+
| Use Case | Default | Rationale |
|
|
402
|
+
|---|---|---|
|
|
403
|
+
| Error tracking | **Sentry** | Industry standard, excellent integrations, actionable alerts |
|
|
404
|
+
| APM / metrics | **Datadog** or **Grafana Cloud** | Datadog for all-in-one; Grafana for open-source flexibility |
|
|
405
|
+
| Logging | **Structured JSON to stdout** + collector | Framework-agnostic, works with any log aggregation platform |
|
|
406
|
+
| Uptime monitoring | **Better Uptime** or **Checkly** | Simple, focused, inexpensive |
|
|
407
|
+
|
|
408
|
+
---
|
|
409
|
+
|
|
410
|
+
## Decision Tree
|
|
411
|
+
|
|
412
|
+
```
|
|
413
|
+
Is this a new project / greenfield?
|
|
414
|
+
YES:
|
|
415
|
+
Does the team have strong expertise in a specific stack?
|
|
416
|
+
YES → Use that stack. Team expertise trumps all other factors.
|
|
417
|
+
NO → Use the recommended defaults from the Technology Landscape
|
|
418
|
+
section above. Do not evaluate alternatives unless you have
|
|
419
|
+
a specific, documented requirement that the defaults cannot meet.
|
|
420
|
+
|
|
421
|
+
NO (adding technology to existing system):
|
|
422
|
+
Can the existing technology handle this use case?
|
|
423
|
+
YES → Use the existing technology. Do not add complexity.
|
|
424
|
+
PostgreSQL can probably do what you think you need
|
|
425
|
+
Elasticsearch for. Redis can probably do what you think
|
|
426
|
+
you need Kafka for.
|
|
427
|
+
NO (genuinely cannot):
|
|
428
|
+
Is this a high-stakes decision (database, language, framework)?
|
|
429
|
+
YES → Run formal evaluation (weighted scoring matrix, PoC).
|
|
430
|
+
Time-box to 2 weeks maximum.
|
|
431
|
+
NO → Pick the most popular option in the category.
|
|
432
|
+
Install it. Move on.
|
|
433
|
+
|
|
434
|
+
How many innovation tokens does this spend?
|
|
435
|
+
ZERO (boring, well-understood technology):
|
|
436
|
+
→ Proceed. This is the ideal outcome.
|
|
437
|
+
ONE (new-to-team but industry-established):
|
|
438
|
+
→ Proceed if the justification is strong and documented.
|
|
439
|
+
TWO (new-to-team AND relatively new to industry):
|
|
440
|
+
→ Reconsider. This is high risk. Can you solve this problem
|
|
441
|
+
with a zero-token technology?
|
|
442
|
+
THREE (new everything):
|
|
443
|
+
→ Stop. You are about to spend your entire innovation budget
|
|
444
|
+
on infrastructure. Revisit your approach.
|
|
445
|
+
|
|
446
|
+
Is the team over-evaluating?
|
|
447
|
+
More than 3 options being compared → Narrow to 2.
|
|
448
|
+
Evaluation running > 2 weeks → Make a decision today.
|
|
449
|
+
No measurable problem with current tech → Stop evaluating.
|
|
450
|
+
The evaluation is more exciting than the product work → Stop evaluating.
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
## Implementation Sketch
|
|
456
|
+
|
|
457
|
+
### Technology Evaluation Template
|
|
458
|
+
|
|
459
|
+
Use this template when a formal evaluation is warranted:
|
|
460
|
+
|
|
461
|
+
```markdown
|
|
462
|
+
# Technology Evaluation: [Title]
|
|
463
|
+
|
|
464
|
+
## Context
|
|
465
|
+
- **Date**: YYYY-MM-DD
|
|
466
|
+
- **Decision maker(s)**: [Names and roles]
|
|
467
|
+
- **Deadline for decision**: [Date — max 2 weeks from start]
|
|
468
|
+
|
|
469
|
+
## Problem Statement
|
|
470
|
+
[What specific problem are we solving? What is the measurable impact
|
|
471
|
+
of the current situation? Why can't the existing technology handle this?]
|
|
472
|
+
|
|
473
|
+
## Constraints
|
|
474
|
+
- Team expertise: [What does the team know today?]
|
|
475
|
+
- Timeline: [When must this be in production?]
|
|
476
|
+
- Budget: [Licensing costs, infrastructure costs, training costs]
|
|
477
|
+
- Hiring: [Will we need to hire for this technology?]
|
|
478
|
+
- Integration: [What must this work with?]
|
|
479
|
+
|
|
480
|
+
## Options Considered
|
|
481
|
+
### Option A: [Name] (the boring default)
|
|
482
|
+
- Description: [What is it]
|
|
483
|
+
- Pros: [Specific to our context]
|
|
484
|
+
- Cons: [Specific to our context]
|
|
485
|
+
- Innovation tokens spent: [0-3]
|
|
486
|
+
- PoC result: [What did the proof-of-concept reveal?]
|
|
487
|
+
|
|
488
|
+
### Option B: [Name]
|
|
489
|
+
- Description:
|
|
490
|
+
- Pros:
|
|
491
|
+
- Cons:
|
|
492
|
+
- Innovation tokens spent:
|
|
493
|
+
- PoC result:
|
|
494
|
+
|
|
495
|
+
### Option C: [Name] (only if genuinely different from A and B)
|
|
496
|
+
- Description:
|
|
497
|
+
- Pros:
|
|
498
|
+
- Cons:
|
|
499
|
+
- Innovation tokens spent:
|
|
500
|
+
- PoC result:
|
|
501
|
+
|
|
502
|
+
## Weighted Scoring Matrix
|
|
503
|
+
[Insert scoring matrix from the How It Works section]
|
|
504
|
+
|
|
505
|
+
## Recommendation
|
|
506
|
+
[Which option and why. One paragraph maximum.]
|
|
507
|
+
|
|
508
|
+
## Risks and Mitigation
|
|
509
|
+
[What could go wrong with the chosen option? How will we detect and
|
|
510
|
+
respond to problems? What is the rollback plan?]
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
### ADR Template for Technology Choice
|
|
514
|
+
|
|
515
|
+
Every significant technology decision should be recorded as an Architecture Decision Record:
|
|
516
|
+
|
|
517
|
+
```markdown
|
|
518
|
+
# ADR-NNN: [Technology Choice Title]
|
|
519
|
+
|
|
520
|
+
## Status
|
|
521
|
+
[Proposed | Accepted | Deprecated | Superseded by ADR-NNN]
|
|
522
|
+
|
|
523
|
+
## Date
|
|
524
|
+
YYYY-MM-DD
|
|
525
|
+
|
|
526
|
+
## Context
|
|
527
|
+
[What is the situation that is forcing this decision? What problem are
|
|
528
|
+
we solving? What constraints exist?]
|
|
529
|
+
|
|
530
|
+
## Decision
|
|
531
|
+
We will use [technology] for [purpose].
|
|
532
|
+
|
|
533
|
+
## Rationale
|
|
534
|
+
- Team expertise: [How well the team knows this technology]
|
|
535
|
+
- Ecosystem maturity: [How established the technology is]
|
|
536
|
+
- Innovation tokens: [How many this spends, and what we're saving them for]
|
|
537
|
+
- Alternatives considered: [What we evaluated and why we rejected it]
|
|
538
|
+
|
|
539
|
+
## Consequences
|
|
540
|
+
|
|
541
|
+
### Positive
|
|
542
|
+
- [What becomes easier or better]
|
|
543
|
+
|
|
544
|
+
### Negative
|
|
545
|
+
- [What becomes harder or worse — be honest]
|
|
546
|
+
|
|
547
|
+
### Neutral
|
|
548
|
+
- [What changes but is neither better nor worse]
|
|
549
|
+
|
|
550
|
+
## Review Date
|
|
551
|
+
[When will we revisit this decision? Typically 6-12 months.]
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
### Pre-Decision Checklist
|
|
555
|
+
|
|
556
|
+
Before finalizing any technology choice, verify:
|
|
557
|
+
|
|
558
|
+
```
|
|
559
|
+
[ ] Problem statement is documented — we know WHY we need this
|
|
560
|
+
[ ] Current technology cannot solve the problem (verified, not assumed)
|
|
561
|
+
[ ] Team expertise has been assessed honestly
|
|
562
|
+
[ ] Proof-of-concept tested the HARD parts, not the easy parts
|
|
563
|
+
[ ] Innovation token count is acceptable (ideally 0)
|
|
564
|
+
[ ] Hiring impact has been evaluated
|
|
565
|
+
[ ] Licensing has been reviewed (AGPL, SSPL, BSL risks)
|
|
566
|
+
[ ] Operational burden has been estimated (who maintains this at 2am?)
|
|
567
|
+
[ ] Rollback plan exists (what if this choice is wrong?)
|
|
568
|
+
[ ] ADR has been written and shared with the team
|
|
569
|
+
[ ] The boring alternative has been seriously considered
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
---
|
|
573
|
+
|
|
574
|
+
## Cross-References
|
|
575
|
+
|
|
576
|
+
Related expertise modules to read alongside this one:
|
|
577
|
+
|
|
578
|
+
- **`architecture-decision-records.md`**: The process and format for documenting technology decisions. Every technology choice should produce an ADR. Read this to understand the documentation discipline that makes technology decisions traceable and reversible.
|
|
579
|
+
- **`build-vs-buy.md`**: A closely related decision framework. Build-vs-buy evaluates whether to create custom software or use an existing product. Technology selection evaluates which tools to build with. The two decisions often occur together and share evaluation criteria.
|
|
580
|
+
- **`twelve-factor-app.md`**: The operational principles that make any technology choice cloud-native. Applying twelve-factor principles (environment-based config, stateless processes, disposable containers) reduces the cost of switching technologies later by ensuring your application is not tightly coupled to specific infrastructure.
|
|
581
|
+
- **`monolith.md`**: The default architecture for new projects. Technology selection and architecture selection are intertwined — choosing a monolith narrows the technology decision to a single language and framework, which simplifies the evaluation considerably.
|
|
582
|
+
|
|
583
|
+
---
|
|
584
|
+
|
|
585
|
+
## Summary Judgement
|
|
586
|
+
|
|
587
|
+
Technology selection is not a technical problem. It is a resource allocation problem. Every team has finite capacity to absorb new technology — finite learning time, finite operational expertise, finite hiring bandwidth. The innovation tokens model captures this: you get roughly three, and you should spend them on what makes your product unique, not on your infrastructure.
|
|
588
|
+
|
|
589
|
+
The bias should always be toward boring. PostgreSQL, not the new distributed database. React, not the framework launched last month. AWS or a PaaS, not the boutique cloud provider. The boring choice has thousands of teams' worth of operational knowledge baked into its documentation, its Stack Overflow answers, and its library ecosystem. The exciting choice has a README and a promise.
|
|
590
|
+
|
|
591
|
+
When you do spend an innovation token, spend it deliberately: document the decision in an ADR, build a proof-of-concept that tests the hard parts, verify the hiring pool, and establish a rollback plan. Make the bet explicit so the team can evaluate it honestly.
|
|
592
|
+
|
|
593
|
+
The best technology decision is the one that lets you stop thinking about technology and start thinking about your product.
|
|
594
|
+
|
|
595
|
+
---
|
|
596
|
+
|
|
597
|
+
*Researched: 2026-03-08*
|
|
598
|
+
|
|
599
|
+
*Sources:*
|
|
600
|
+
- *[Choose Boring Technology — Dan McKinley](https://mcfunley.com/choose-boring-technology)*
|
|
601
|
+
- *[Boring Technology Club](https://boringtechnology.club/)*
|
|
602
|
+
- *[Choose Boring Technology Culture — charity.wtf](https://charity.wtf/2023/05/01/choose-boring-technology-culture/)*
|
|
603
|
+
- *[Summary: Choose Boring Technology — Anna Geller](https://www.annageller.com/p/summary-choose-boring-technology)*
|
|
604
|
+
- *[ThoughtWorks Technology Radar](https://www.thoughtworks.com/radar)*
|
|
605
|
+
- *[ThoughtWorks Technology Radar Vol. 33 (November 2025)](https://www.thoughtworks.com/content/dam/thoughtworks/documents/radar/2025/11/tr_technology_radar_vol_33_en.pdf)*
|
|
606
|
+
- *[Avoiding Shiny Object Syndrome When Building Software — LeadDev](https://leaddev.com/tech/avoiding-shiny-object-syndrome-when-building-software)*
|
|
607
|
+
- *[Shiny Object Syndrome Is Wasting Your Team's Time — The CTO Club](https://thectoclub.com/software-development/shiny-object-syndrome-is-wasting-your-teams-time-and-energy/)*
|
|
608
|
+
- *[A Six-Point Framework for Technology Selection — Crosslake](https://crosslaketech.com/a-six-point-framework-for-selecting-the-right-technology/)*
|
|
609
|
+
- *[7 Key Criteria for Technology Selection — HyperSense](https://hypersense-software.com/blog/2023/06/20/7-key-criteria-for-choosing-right-technology-for-your-project/)*
|
|
610
|
+
- *[10 Criteria to Evaluate When Choosing Technology — Vera Solutions](https://verasolutions.org/blog-10-criteria-to-evaluate-when-choosing-a-new-technology/)*
|
|
611
|
+
- *[Choosing Your Tech Stack as a Startup — Addjam](https://addjam.com/blog/2025-02-14/choosing-tech-stack-startup-guide/)*
|
|
612
|
+
- *[How to Pick a Tech Stack Without Regretting It — Softkit](https://www.softkit.dev/blog/pick-tech-stack-startup-2025-guide/)*
|
|
613
|
+
- *[Strangler Fig Pattern — Martin Fowler](https://martinfowler.com/bliki/StranglerFigApplication.html)*
|
|
614
|
+
- *[Strangler Fig Pattern — Azure Architecture Center](https://learn.microsoft.com/en-us/azure/architecture/patterns/strangler-fig)*
|
|
615
|
+
- *[Embracing Strangler Fig for Legacy Modernization — ThoughtWorks](https://www.thoughtworks.com/en-us/insights/articles/embracing-strangler-fig-pattern-legacy-modernization-part-one)*
|
|
616
|
+
- *[Real Stories: Case Studies in Technology Selection — Tony Byrne / LinkedIn](https://www.linkedin.com/pulse/real-stories-case-studies-technology-selection-tony-byrne/)*
|