@wazir-dev/cli 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (629) hide show
  1. package/AGENTS.md +111 -0
  2. package/CHANGELOG.md +14 -0
  3. package/CONTRIBUTING.md +101 -0
  4. package/LICENSE +21 -0
  5. package/README.md +314 -0
  6. package/assets/composition-engine.mmd +34 -0
  7. package/assets/demo-script.sh +17 -0
  8. package/assets/logo-dark.svg +14 -0
  9. package/assets/logo.svg +14 -0
  10. package/assets/pipeline.mmd +39 -0
  11. package/assets/record-demo.sh +51 -0
  12. package/docs/README.md +51 -0
  13. package/docs/adapters/context-mode.md +60 -0
  14. package/docs/concepts/architecture.md +87 -0
  15. package/docs/concepts/artifact-model.md +60 -0
  16. package/docs/concepts/composition-engine.md +36 -0
  17. package/docs/concepts/indexing-and-recall.md +160 -0
  18. package/docs/concepts/observability.md +41 -0
  19. package/docs/concepts/roles-and-workflows.md +59 -0
  20. package/docs/concepts/terminology-policy.md +27 -0
  21. package/docs/getting-started/01-installation.md +78 -0
  22. package/docs/getting-started/02-first-run.md +102 -0
  23. package/docs/getting-started/03-adding-to-project.md +15 -0
  24. package/docs/getting-started/04-host-setup.md +15 -0
  25. package/docs/guides/ci-integration.md +15 -0
  26. package/docs/guides/creating-skills.md +15 -0
  27. package/docs/guides/expertise-module-authoring.md +15 -0
  28. package/docs/guides/hook-development.md +15 -0
  29. package/docs/guides/memory-and-learnings.md +34 -0
  30. package/docs/guides/multi-host-export.md +15 -0
  31. package/docs/guides/troubleshooting.md +101 -0
  32. package/docs/guides/writing-custom-roles.md +15 -0
  33. package/docs/plans/2026-03-15-cli-pipeline-integration-design.md +592 -0
  34. package/docs/plans/2026-03-15-cli-pipeline-integration-plan.md +598 -0
  35. package/docs/plans/2026-03-15-docs-enforcement-plan.md +238 -0
  36. package/docs/readmes/INDEX.md +99 -0
  37. package/docs/readmes/features/expertise/README.md +171 -0
  38. package/docs/readmes/features/exports/README.md +222 -0
  39. package/docs/readmes/features/hooks/README.md +103 -0
  40. package/docs/readmes/features/hooks/loop-cap-guard.md +133 -0
  41. package/docs/readmes/features/hooks/post-tool-capture.md +121 -0
  42. package/docs/readmes/features/hooks/post-tool-lint.md +130 -0
  43. package/docs/readmes/features/hooks/pre-compact-summary.md +122 -0
  44. package/docs/readmes/features/hooks/pre-tool-capture-route.md +100 -0
  45. package/docs/readmes/features/hooks/protected-path-write-guard.md +128 -0
  46. package/docs/readmes/features/hooks/session-start.md +119 -0
  47. package/docs/readmes/features/hooks/stop-handoff-harvest.md +125 -0
  48. package/docs/readmes/features/roles/README.md +157 -0
  49. package/docs/readmes/features/roles/clarifier.md +152 -0
  50. package/docs/readmes/features/roles/content-author.md +190 -0
  51. package/docs/readmes/features/roles/designer.md +193 -0
  52. package/docs/readmes/features/roles/executor.md +184 -0
  53. package/docs/readmes/features/roles/learner.md +210 -0
  54. package/docs/readmes/features/roles/planner.md +182 -0
  55. package/docs/readmes/features/roles/researcher.md +164 -0
  56. package/docs/readmes/features/roles/reviewer.md +184 -0
  57. package/docs/readmes/features/roles/specifier.md +162 -0
  58. package/docs/readmes/features/roles/verifier.md +215 -0
  59. package/docs/readmes/features/schemas/README.md +178 -0
  60. package/docs/readmes/features/skills/README.md +63 -0
  61. package/docs/readmes/features/skills/brainstorming.md +96 -0
  62. package/docs/readmes/features/skills/debugging.md +148 -0
  63. package/docs/readmes/features/skills/design.md +120 -0
  64. package/docs/readmes/features/skills/prepare-next.md +109 -0
  65. package/docs/readmes/features/skills/run-audit.md +159 -0
  66. package/docs/readmes/features/skills/scan-project.md +109 -0
  67. package/docs/readmes/features/skills/self-audit.md +176 -0
  68. package/docs/readmes/features/skills/tdd.md +137 -0
  69. package/docs/readmes/features/skills/using-skills.md +92 -0
  70. package/docs/readmes/features/skills/verification.md +120 -0
  71. package/docs/readmes/features/skills/writing-plans.md +104 -0
  72. package/docs/readmes/features/tooling/README.md +320 -0
  73. package/docs/readmes/features/workflows/README.md +186 -0
  74. package/docs/readmes/features/workflows/author.md +181 -0
  75. package/docs/readmes/features/workflows/clarify.md +154 -0
  76. package/docs/readmes/features/workflows/design-review.md +171 -0
  77. package/docs/readmes/features/workflows/design.md +169 -0
  78. package/docs/readmes/features/workflows/discover.md +162 -0
  79. package/docs/readmes/features/workflows/execute.md +173 -0
  80. package/docs/readmes/features/workflows/learn.md +167 -0
  81. package/docs/readmes/features/workflows/plan-review.md +165 -0
  82. package/docs/readmes/features/workflows/plan.md +170 -0
  83. package/docs/readmes/features/workflows/prepare-next.md +167 -0
  84. package/docs/readmes/features/workflows/review.md +169 -0
  85. package/docs/readmes/features/workflows/run-audit.md +191 -0
  86. package/docs/readmes/features/workflows/spec-challenge.md +159 -0
  87. package/docs/readmes/features/workflows/specify.md +160 -0
  88. package/docs/readmes/features/workflows/verify.md +177 -0
  89. package/docs/readmes/packages/README.md +50 -0
  90. package/docs/readmes/packages/ajv.md +117 -0
  91. package/docs/readmes/packages/context-mode.md +118 -0
  92. package/docs/readmes/packages/gray-matter.md +116 -0
  93. package/docs/readmes/packages/node-test.md +137 -0
  94. package/docs/readmes/packages/yaml.md +112 -0
  95. package/docs/reference/configuration-reference.md +159 -0
  96. package/docs/reference/expertise-index.md +52 -0
  97. package/docs/reference/git-flow.md +43 -0
  98. package/docs/reference/hooks.md +87 -0
  99. package/docs/reference/host-exports.md +50 -0
  100. package/docs/reference/launch-checklist.md +172 -0
  101. package/docs/reference/marketplace-listings.md +76 -0
  102. package/docs/reference/release-process.md +34 -0
  103. package/docs/reference/roles-reference.md +77 -0
  104. package/docs/reference/skills.md +33 -0
  105. package/docs/reference/templates.md +29 -0
  106. package/docs/reference/tooling-cli.md +94 -0
  107. package/docs/truth-claims.yaml +222 -0
  108. package/expertise/PROGRESS.md +63 -0
  109. package/expertise/README.md +18 -0
  110. package/expertise/antipatterns/PROGRESS.md +56 -0
  111. package/expertise/antipatterns/backend/api-design-antipatterns.md +1271 -0
  112. package/expertise/antipatterns/backend/auth-antipatterns.md +1195 -0
  113. package/expertise/antipatterns/backend/caching-antipatterns.md +622 -0
  114. package/expertise/antipatterns/backend/database-antipatterns.md +1038 -0
  115. package/expertise/antipatterns/backend/index.md +24 -0
  116. package/expertise/antipatterns/backend/microservices-antipatterns.md +850 -0
  117. package/expertise/antipatterns/code/architecture-antipatterns.md +919 -0
  118. package/expertise/antipatterns/code/async-antipatterns.md +622 -0
  119. package/expertise/antipatterns/code/code-smells.md +1186 -0
  120. package/expertise/antipatterns/code/dependency-antipatterns.md +1209 -0
  121. package/expertise/antipatterns/code/error-handling-antipatterns.md +1360 -0
  122. package/expertise/antipatterns/code/index.md +27 -0
  123. package/expertise/antipatterns/code/naming-and-abstraction.md +1118 -0
  124. package/expertise/antipatterns/code/state-management-antipatterns.md +1076 -0
  125. package/expertise/antipatterns/code/testing-antipatterns.md +1053 -0
  126. package/expertise/antipatterns/design/accessibility-antipatterns.md +1136 -0
  127. package/expertise/antipatterns/design/dark-patterns.md +1121 -0
  128. package/expertise/antipatterns/design/index.md +22 -0
  129. package/expertise/antipatterns/design/ui-antipatterns.md +1202 -0
  130. package/expertise/antipatterns/design/ux-antipatterns.md +680 -0
  131. package/expertise/antipatterns/frontend/css-layout-antipatterns.md +691 -0
  132. package/expertise/antipatterns/frontend/flutter-antipatterns.md +1827 -0
  133. package/expertise/antipatterns/frontend/index.md +23 -0
  134. package/expertise/antipatterns/frontend/mobile-antipatterns.md +573 -0
  135. package/expertise/antipatterns/frontend/react-antipatterns.md +1128 -0
  136. package/expertise/antipatterns/frontend/spa-antipatterns.md +1235 -0
  137. package/expertise/antipatterns/index.md +31 -0
  138. package/expertise/antipatterns/performance/index.md +20 -0
  139. package/expertise/antipatterns/performance/performance-antipatterns.md +1013 -0
  140. package/expertise/antipatterns/performance/premature-optimization.md +623 -0
  141. package/expertise/antipatterns/performance/scaling-antipatterns.md +785 -0
  142. package/expertise/antipatterns/process/ai-coding-antipatterns.md +853 -0
  143. package/expertise/antipatterns/process/code-review-antipatterns.md +656 -0
  144. package/expertise/antipatterns/process/deployment-antipatterns.md +920 -0
  145. package/expertise/antipatterns/process/index.md +23 -0
  146. package/expertise/antipatterns/process/technical-debt-antipatterns.md +647 -0
  147. package/expertise/antipatterns/security/index.md +20 -0
  148. package/expertise/antipatterns/security/secrets-antipatterns.md +849 -0
  149. package/expertise/antipatterns/security/security-theater.md +843 -0
  150. package/expertise/antipatterns/security/vulnerability-patterns.md +801 -0
  151. package/expertise/architecture/PROGRESS.md +70 -0
  152. package/expertise/architecture/data/caching-architecture.md +671 -0
  153. package/expertise/architecture/data/data-consistency.md +574 -0
  154. package/expertise/architecture/data/data-modeling.md +536 -0
  155. package/expertise/architecture/data/event-streams-and-queues.md +634 -0
  156. package/expertise/architecture/data/index.md +25 -0
  157. package/expertise/architecture/data/search-architecture.md +663 -0
  158. package/expertise/architecture/data/sql-vs-nosql.md +708 -0
  159. package/expertise/architecture/decisions/architecture-decision-records.md +640 -0
  160. package/expertise/architecture/decisions/build-vs-buy.md +616 -0
  161. package/expertise/architecture/decisions/index.md +23 -0
  162. package/expertise/architecture/decisions/monolith-to-microservices.md +790 -0
  163. package/expertise/architecture/decisions/technology-selection.md +616 -0
  164. package/expertise/architecture/distributed/cap-theorem-and-tradeoffs.md +800 -0
  165. package/expertise/architecture/distributed/circuit-breaker-bulkhead.md +741 -0
  166. package/expertise/architecture/distributed/consensus-and-coordination.md +796 -0
  167. package/expertise/architecture/distributed/distributed-systems-fundamentals.md +564 -0
  168. package/expertise/architecture/distributed/idempotency-and-retry.md +796 -0
  169. package/expertise/architecture/distributed/index.md +25 -0
  170. package/expertise/architecture/distributed/saga-pattern.md +797 -0
  171. package/expertise/architecture/foundations/architectural-thinking.md +460 -0
  172. package/expertise/architecture/foundations/coupling-and-cohesion.md +770 -0
  173. package/expertise/architecture/foundations/design-principles-solid.md +649 -0
  174. package/expertise/architecture/foundations/domain-driven-design.md +719 -0
  175. package/expertise/architecture/foundations/index.md +25 -0
  176. package/expertise/architecture/foundations/separation-of-concerns.md +472 -0
  177. package/expertise/architecture/foundations/twelve-factor-app.md +797 -0
  178. package/expertise/architecture/index.md +34 -0
  179. package/expertise/architecture/integration/api-design-graphql.md +638 -0
  180. package/expertise/architecture/integration/api-design-grpc.md +804 -0
  181. package/expertise/architecture/integration/api-design-rest.md +892 -0
  182. package/expertise/architecture/integration/index.md +25 -0
  183. package/expertise/architecture/integration/third-party-integration.md +795 -0
  184. package/expertise/architecture/integration/webhooks-and-callbacks.md +1152 -0
  185. package/expertise/architecture/integration/websockets-realtime.md +791 -0
  186. package/expertise/architecture/mobile-architecture/index.md +22 -0
  187. package/expertise/architecture/mobile-architecture/mobile-app-architecture.md +780 -0
  188. package/expertise/architecture/mobile-architecture/mobile-backend-for-frontend.md +670 -0
  189. package/expertise/architecture/mobile-architecture/offline-first.md +719 -0
  190. package/expertise/architecture/mobile-architecture/push-and-sync.md +782 -0
  191. package/expertise/architecture/patterns/cqrs-event-sourcing.md +717 -0
  192. package/expertise/architecture/patterns/event-driven.md +797 -0
  193. package/expertise/architecture/patterns/hexagonal-clean-architecture.md +870 -0
  194. package/expertise/architecture/patterns/index.md +27 -0
  195. package/expertise/architecture/patterns/layered-architecture.md +736 -0
  196. package/expertise/architecture/patterns/microservices.md +753 -0
  197. package/expertise/architecture/patterns/modular-monolith.md +692 -0
  198. package/expertise/architecture/patterns/monolith.md +626 -0
  199. package/expertise/architecture/patterns/plugin-architecture.md +735 -0
  200. package/expertise/architecture/patterns/serverless.md +780 -0
  201. package/expertise/architecture/scaling/database-scaling.md +615 -0
  202. package/expertise/architecture/scaling/feature-flags-and-rollouts.md +757 -0
  203. package/expertise/architecture/scaling/horizontal-vs-vertical.md +606 -0
  204. package/expertise/architecture/scaling/index.md +24 -0
  205. package/expertise/architecture/scaling/multi-tenancy.md +800 -0
  206. package/expertise/architecture/scaling/stateless-design.md +787 -0
  207. package/expertise/backend/embedded-firmware.md +625 -0
  208. package/expertise/backend/go.md +853 -0
  209. package/expertise/backend/index.md +24 -0
  210. package/expertise/backend/java-spring.md +448 -0
  211. package/expertise/backend/node-typescript.md +625 -0
  212. package/expertise/backend/python-fastapi.md +724 -0
  213. package/expertise/backend/rust.md +458 -0
  214. package/expertise/backend/solidity.md +711 -0
  215. package/expertise/composition-map.yaml +443 -0
  216. package/expertise/content/foundations/content-modeling.md +395 -0
  217. package/expertise/content/foundations/editorial-standards.md +449 -0
  218. package/expertise/content/foundations/index.md +24 -0
  219. package/expertise/content/foundations/microcopy.md +455 -0
  220. package/expertise/content/foundations/terminology-governance.md +509 -0
  221. package/expertise/content/index.md +34 -0
  222. package/expertise/content/patterns/accessibility-copy.md +518 -0
  223. package/expertise/content/patterns/index.md +24 -0
  224. package/expertise/content/patterns/notification-content.md +433 -0
  225. package/expertise/content/patterns/sample-content.md +486 -0
  226. package/expertise/content/patterns/state-copy.md +439 -0
  227. package/expertise/design/PROGRESS.md +58 -0
  228. package/expertise/design/disciplines/dark-mode-theming.md +577 -0
  229. package/expertise/design/disciplines/design-systems.md +595 -0
  230. package/expertise/design/disciplines/index.md +25 -0
  231. package/expertise/design/disciplines/information-architecture.md +800 -0
  232. package/expertise/design/disciplines/interaction-design.md +788 -0
  233. package/expertise/design/disciplines/responsive-design.md +552 -0
  234. package/expertise/design/disciplines/usability-testing.md +516 -0
  235. package/expertise/design/disciplines/user-research.md +792 -0
  236. package/expertise/design/foundations/accessibility-design.md +796 -0
  237. package/expertise/design/foundations/color-theory.md +797 -0
  238. package/expertise/design/foundations/iconography.md +795 -0
  239. package/expertise/design/foundations/index.md +26 -0
  240. package/expertise/design/foundations/motion-and-animation.md +653 -0
  241. package/expertise/design/foundations/rtl-design.md +585 -0
  242. package/expertise/design/foundations/spacing-and-layout.md +607 -0
  243. package/expertise/design/foundations/typography.md +800 -0
  244. package/expertise/design/foundations/visual-hierarchy.md +761 -0
  245. package/expertise/design/index.md +32 -0
  246. package/expertise/design/patterns/authentication-flows.md +474 -0
  247. package/expertise/design/patterns/content-consumption.md +789 -0
  248. package/expertise/design/patterns/data-display.md +618 -0
  249. package/expertise/design/patterns/e-commerce.md +1494 -0
  250. package/expertise/design/patterns/feedback-and-states.md +642 -0
  251. package/expertise/design/patterns/forms-and-input.md +819 -0
  252. package/expertise/design/patterns/gamification.md +801 -0
  253. package/expertise/design/patterns/index.md +31 -0
  254. package/expertise/design/patterns/microinteractions.md +449 -0
  255. package/expertise/design/patterns/navigation.md +800 -0
  256. package/expertise/design/patterns/notifications.md +705 -0
  257. package/expertise/design/patterns/onboarding.md +700 -0
  258. package/expertise/design/patterns/search-and-filter.md +601 -0
  259. package/expertise/design/patterns/settings-and-preferences.md +768 -0
  260. package/expertise/design/patterns/social-and-community.md +748 -0
  261. package/expertise/design/platforms/desktop-native.md +612 -0
  262. package/expertise/design/platforms/index.md +25 -0
  263. package/expertise/design/platforms/mobile-android.md +825 -0
  264. package/expertise/design/platforms/mobile-cross-platform.md +983 -0
  265. package/expertise/design/platforms/mobile-ios.md +699 -0
  266. package/expertise/design/platforms/tablet.md +794 -0
  267. package/expertise/design/platforms/web-dashboard.md +790 -0
  268. package/expertise/design/platforms/web-responsive.md +550 -0
  269. package/expertise/design/psychology/behavioral-nudges.md +449 -0
  270. package/expertise/design/psychology/cognitive-load.md +1191 -0
  271. package/expertise/design/psychology/error-psychology.md +778 -0
  272. package/expertise/design/psychology/index.md +22 -0
  273. package/expertise/design/psychology/persuasive-design.md +736 -0
  274. package/expertise/design/psychology/user-mental-models.md +623 -0
  275. package/expertise/design/tooling/open-pencil.md +266 -0
  276. package/expertise/frontend/angular.md +1073 -0
  277. package/expertise/frontend/desktop-electron.md +546 -0
  278. package/expertise/frontend/flutter.md +782 -0
  279. package/expertise/frontend/index.md +27 -0
  280. package/expertise/frontend/native-android.md +409 -0
  281. package/expertise/frontend/native-ios.md +490 -0
  282. package/expertise/frontend/react-native.md +1160 -0
  283. package/expertise/frontend/react.md +808 -0
  284. package/expertise/frontend/vue.md +1089 -0
  285. package/expertise/humanize/domain-rules-code.md +79 -0
  286. package/expertise/humanize/domain-rules-content.md +67 -0
  287. package/expertise/humanize/domain-rules-technical-docs.md +56 -0
  288. package/expertise/humanize/index.md +35 -0
  289. package/expertise/humanize/self-audit-checklist.md +87 -0
  290. package/expertise/humanize/sentence-patterns.md +218 -0
  291. package/expertise/humanize/vocabulary-blacklist.md +105 -0
  292. package/expertise/i18n/PROGRESS.md +65 -0
  293. package/expertise/i18n/advanced/accessibility-and-i18n.md +28 -0
  294. package/expertise/i18n/advanced/bidirectional-text-algorithm.md +38 -0
  295. package/expertise/i18n/advanced/complex-scripts.md +30 -0
  296. package/expertise/i18n/advanced/performance-and-i18n.md +27 -0
  297. package/expertise/i18n/advanced/testing-i18n.md +28 -0
  298. package/expertise/i18n/content/content-adaptation.md +23 -0
  299. package/expertise/i18n/content/locale-specific-formatting.md +23 -0
  300. package/expertise/i18n/content/machine-translation-integration.md +28 -0
  301. package/expertise/i18n/content/translation-management.md +29 -0
  302. package/expertise/i18n/foundations/date-time-calendars.md +67 -0
  303. package/expertise/i18n/foundations/i18n-architecture.md +272 -0
  304. package/expertise/i18n/foundations/locale-and-language-tags.md +79 -0
  305. package/expertise/i18n/foundations/numbers-currency-units.md +61 -0
  306. package/expertise/i18n/foundations/pluralization-and-gender.md +109 -0
  307. package/expertise/i18n/foundations/string-externalization.md +236 -0
  308. package/expertise/i18n/foundations/text-direction-bidi.md +241 -0
  309. package/expertise/i18n/foundations/unicode-and-encoding.md +86 -0
  310. package/expertise/i18n/index.md +38 -0
  311. package/expertise/i18n/platform/backend-i18n.md +31 -0
  312. package/expertise/i18n/platform/flutter-i18n.md +148 -0
  313. package/expertise/i18n/platform/native-android-i18n.md +36 -0
  314. package/expertise/i18n/platform/native-ios-i18n.md +36 -0
  315. package/expertise/i18n/platform/react-i18n.md +103 -0
  316. package/expertise/i18n/platform/web-css-i18n.md +81 -0
  317. package/expertise/i18n/rtl/arabic-specific.md +175 -0
  318. package/expertise/i18n/rtl/hebrew-specific.md +149 -0
  319. package/expertise/i18n/rtl/rtl-animations-and-transitions.md +111 -0
  320. package/expertise/i18n/rtl/rtl-forms-and-input.md +161 -0
  321. package/expertise/i18n/rtl/rtl-fundamentals.md +211 -0
  322. package/expertise/i18n/rtl/rtl-icons-and-images.md +181 -0
  323. package/expertise/i18n/rtl/rtl-layout-mirroring.md +252 -0
  324. package/expertise/i18n/rtl/rtl-navigation-and-gestures.md +107 -0
  325. package/expertise/i18n/rtl/rtl-testing-and-qa.md +147 -0
  326. package/expertise/i18n/rtl/rtl-typography.md +160 -0
  327. package/expertise/index.md +113 -0
  328. package/expertise/index.yaml +216 -0
  329. package/expertise/infrastructure/cloud-aws.md +597 -0
  330. package/expertise/infrastructure/cloud-gcp.md +599 -0
  331. package/expertise/infrastructure/cybersecurity.md +816 -0
  332. package/expertise/infrastructure/database-mongodb.md +447 -0
  333. package/expertise/infrastructure/database-postgres.md +400 -0
  334. package/expertise/infrastructure/devops-cicd.md +787 -0
  335. package/expertise/infrastructure/index.md +27 -0
  336. package/expertise/performance/PROGRESS.md +50 -0
  337. package/expertise/performance/backend/api-latency.md +1204 -0
  338. package/expertise/performance/backend/background-jobs.md +506 -0
  339. package/expertise/performance/backend/connection-pooling.md +1209 -0
  340. package/expertise/performance/backend/database-query-optimization.md +515 -0
  341. package/expertise/performance/backend/index.md +23 -0
  342. package/expertise/performance/backend/rate-limiting-and-throttling.md +971 -0
  343. package/expertise/performance/foundations/algorithmic-complexity.md +954 -0
  344. package/expertise/performance/foundations/caching-strategies.md +489 -0
  345. package/expertise/performance/foundations/concurrency-and-parallelism.md +847 -0
  346. package/expertise/performance/foundations/index.md +24 -0
  347. package/expertise/performance/foundations/measuring-and-profiling.md +440 -0
  348. package/expertise/performance/foundations/memory-management.md +964 -0
  349. package/expertise/performance/foundations/performance-budgets.md +1314 -0
  350. package/expertise/performance/index.md +31 -0
  351. package/expertise/performance/infrastructure/auto-scaling.md +1059 -0
  352. package/expertise/performance/infrastructure/cdn-and-edge.md +1081 -0
  353. package/expertise/performance/infrastructure/index.md +22 -0
  354. package/expertise/performance/infrastructure/load-balancing.md +1081 -0
  355. package/expertise/performance/infrastructure/observability.md +1079 -0
  356. package/expertise/performance/mobile/index.md +23 -0
  357. package/expertise/performance/mobile/mobile-animations.md +544 -0
  358. package/expertise/performance/mobile/mobile-memory-battery.md +416 -0
  359. package/expertise/performance/mobile/mobile-network.md +452 -0
  360. package/expertise/performance/mobile/mobile-rendering.md +599 -0
  361. package/expertise/performance/mobile/mobile-startup-time.md +505 -0
  362. package/expertise/performance/platform-specific/flutter-performance.md +647 -0
  363. package/expertise/performance/platform-specific/index.md +22 -0
  364. package/expertise/performance/platform-specific/node-performance.md +1307 -0
  365. package/expertise/performance/platform-specific/postgres-performance.md +1366 -0
  366. package/expertise/performance/platform-specific/react-performance.md +1403 -0
  367. package/expertise/performance/web/bundle-optimization.md +1239 -0
  368. package/expertise/performance/web/image-and-media.md +636 -0
  369. package/expertise/performance/web/index.md +24 -0
  370. package/expertise/performance/web/network-optimization.md +1133 -0
  371. package/expertise/performance/web/rendering-performance.md +1098 -0
  372. package/expertise/performance/web/ssr-and-hydration.md +918 -0
  373. package/expertise/performance/web/web-vitals.md +1374 -0
  374. package/expertise/quality/accessibility.md +985 -0
  375. package/expertise/quality/evidence-based-verification.md +499 -0
  376. package/expertise/quality/index.md +24 -0
  377. package/expertise/quality/ml-model-audit.md +614 -0
  378. package/expertise/quality/performance.md +600 -0
  379. package/expertise/quality/testing-api.md +891 -0
  380. package/expertise/quality/testing-mobile.md +496 -0
  381. package/expertise/quality/testing-web.md +849 -0
  382. package/expertise/security/PROGRESS.md +54 -0
  383. package/expertise/security/agentic-identity.md +540 -0
  384. package/expertise/security/compliance-frameworks.md +601 -0
  385. package/expertise/security/data/data-encryption.md +364 -0
  386. package/expertise/security/data/data-privacy-gdpr.md +692 -0
  387. package/expertise/security/data/database-security.md +1171 -0
  388. package/expertise/security/data/index.md +22 -0
  389. package/expertise/security/data/pii-handling.md +531 -0
  390. package/expertise/security/foundations/authentication.md +1041 -0
  391. package/expertise/security/foundations/authorization.md +603 -0
  392. package/expertise/security/foundations/cryptography.md +1001 -0
  393. package/expertise/security/foundations/index.md +25 -0
  394. package/expertise/security/foundations/owasp-top-10.md +1354 -0
  395. package/expertise/security/foundations/secrets-management.md +1217 -0
  396. package/expertise/security/foundations/secure-sdlc.md +700 -0
  397. package/expertise/security/foundations/supply-chain-security.md +698 -0
  398. package/expertise/security/index.md +31 -0
  399. package/expertise/security/infrastructure/cloud-security-aws.md +1296 -0
  400. package/expertise/security/infrastructure/cloud-security-gcp.md +1376 -0
  401. package/expertise/security/infrastructure/container-security.md +721 -0
  402. package/expertise/security/infrastructure/incident-response.md +1295 -0
  403. package/expertise/security/infrastructure/index.md +24 -0
  404. package/expertise/security/infrastructure/logging-and-monitoring.md +1618 -0
  405. package/expertise/security/infrastructure/network-security.md +1337 -0
  406. package/expertise/security/mobile/index.md +23 -0
  407. package/expertise/security/mobile/mobile-android-security.md +1218 -0
  408. package/expertise/security/mobile/mobile-binary-protection.md +1229 -0
  409. package/expertise/security/mobile/mobile-data-storage.md +1265 -0
  410. package/expertise/security/mobile/mobile-ios-security.md +1401 -0
  411. package/expertise/security/mobile/mobile-network-security.md +1520 -0
  412. package/expertise/security/smart-contract-security.md +594 -0
  413. package/expertise/security/testing/index.md +22 -0
  414. package/expertise/security/testing/penetration-testing.md +1258 -0
  415. package/expertise/security/testing/security-code-review.md +1765 -0
  416. package/expertise/security/testing/threat-modeling.md +1074 -0
  417. package/expertise/security/testing/vulnerability-scanning.md +1062 -0
  418. package/expertise/security/web/api-security.md +586 -0
  419. package/expertise/security/web/cors-and-headers.md +433 -0
  420. package/expertise/security/web/csrf.md +562 -0
  421. package/expertise/security/web/file-upload.md +1477 -0
  422. package/expertise/security/web/index.md +25 -0
  423. package/expertise/security/web/injection.md +1375 -0
  424. package/expertise/security/web/session-management.md +1101 -0
  425. package/expertise/security/web/xss.md +1158 -0
  426. package/exports/README.md +17 -0
  427. package/exports/hosts/claude/.claude/agents/clarifier.md +42 -0
  428. package/exports/hosts/claude/.claude/agents/content-author.md +63 -0
  429. package/exports/hosts/claude/.claude/agents/designer.md +55 -0
  430. package/exports/hosts/claude/.claude/agents/executor.md +55 -0
  431. package/exports/hosts/claude/.claude/agents/learner.md +51 -0
  432. package/exports/hosts/claude/.claude/agents/planner.md +53 -0
  433. package/exports/hosts/claude/.claude/agents/researcher.md +43 -0
  434. package/exports/hosts/claude/.claude/agents/reviewer.md +54 -0
  435. package/exports/hosts/claude/.claude/agents/specifier.md +47 -0
  436. package/exports/hosts/claude/.claude/agents/verifier.md +71 -0
  437. package/exports/hosts/claude/.claude/commands/author.md +42 -0
  438. package/exports/hosts/claude/.claude/commands/clarify.md +38 -0
  439. package/exports/hosts/claude/.claude/commands/design-review.md +46 -0
  440. package/exports/hosts/claude/.claude/commands/design.md +44 -0
  441. package/exports/hosts/claude/.claude/commands/discover.md +37 -0
  442. package/exports/hosts/claude/.claude/commands/execute.md +48 -0
  443. package/exports/hosts/claude/.claude/commands/learn.md +38 -0
  444. package/exports/hosts/claude/.claude/commands/plan-review.md +42 -0
  445. package/exports/hosts/claude/.claude/commands/plan.md +39 -0
  446. package/exports/hosts/claude/.claude/commands/prepare-next.md +37 -0
  447. package/exports/hosts/claude/.claude/commands/review.md +40 -0
  448. package/exports/hosts/claude/.claude/commands/run-audit.md +41 -0
  449. package/exports/hosts/claude/.claude/commands/spec-challenge.md +41 -0
  450. package/exports/hosts/claude/.claude/commands/specify.md +38 -0
  451. package/exports/hosts/claude/.claude/commands/verify.md +37 -0
  452. package/exports/hosts/claude/.claude/settings.json +34 -0
  453. package/exports/hosts/claude/CLAUDE.md +19 -0
  454. package/exports/hosts/claude/export.manifest.json +38 -0
  455. package/exports/hosts/claude/host-package.json +67 -0
  456. package/exports/hosts/codex/AGENTS.md +19 -0
  457. package/exports/hosts/codex/export.manifest.json +38 -0
  458. package/exports/hosts/codex/host-package.json +41 -0
  459. package/exports/hosts/cursor/.cursor/hooks.json +16 -0
  460. package/exports/hosts/cursor/.cursor/rules/wazir-core.mdc +19 -0
  461. package/exports/hosts/cursor/export.manifest.json +38 -0
  462. package/exports/hosts/cursor/host-package.json +42 -0
  463. package/exports/hosts/gemini/GEMINI.md +19 -0
  464. package/exports/hosts/gemini/export.manifest.json +38 -0
  465. package/exports/hosts/gemini/host-package.json +41 -0
  466. package/hooks/README.md +18 -0
  467. package/hooks/definitions/loop_cap_guard.yaml +21 -0
  468. package/hooks/definitions/post_tool_capture.yaml +24 -0
  469. package/hooks/definitions/pre_compact_summary.yaml +19 -0
  470. package/hooks/definitions/pre_tool_capture_route.yaml +19 -0
  471. package/hooks/definitions/protected_path_write_guard.yaml +19 -0
  472. package/hooks/definitions/session_start.yaml +19 -0
  473. package/hooks/definitions/stop_handoff_harvest.yaml +20 -0
  474. package/hooks/loop-cap-guard +17 -0
  475. package/hooks/post-tool-lint +36 -0
  476. package/hooks/protected-path-write-guard +17 -0
  477. package/hooks/session-start +41 -0
  478. package/llms-full.txt +2355 -0
  479. package/llms.txt +43 -0
  480. package/package.json +79 -0
  481. package/roles/README.md +20 -0
  482. package/roles/clarifier.md +42 -0
  483. package/roles/content-author.md +63 -0
  484. package/roles/designer.md +55 -0
  485. package/roles/executor.md +55 -0
  486. package/roles/learner.md +51 -0
  487. package/roles/planner.md +53 -0
  488. package/roles/researcher.md +43 -0
  489. package/roles/reviewer.md +54 -0
  490. package/roles/specifier.md +47 -0
  491. package/roles/verifier.md +71 -0
  492. package/schemas/README.md +24 -0
  493. package/schemas/accepted-learning.schema.json +20 -0
  494. package/schemas/author-artifact.schema.json +156 -0
  495. package/schemas/clarification.schema.json +19 -0
  496. package/schemas/design-artifact.schema.json +80 -0
  497. package/schemas/docs-claim.schema.json +18 -0
  498. package/schemas/export-manifest.schema.json +20 -0
  499. package/schemas/hook.schema.json +67 -0
  500. package/schemas/host-export-package.schema.json +18 -0
  501. package/schemas/implementation-plan.schema.json +19 -0
  502. package/schemas/proposed-learning.schema.json +19 -0
  503. package/schemas/research.schema.json +18 -0
  504. package/schemas/review.schema.json +29 -0
  505. package/schemas/run-manifest.schema.json +18 -0
  506. package/schemas/spec-challenge.schema.json +18 -0
  507. package/schemas/spec.schema.json +20 -0
  508. package/schemas/usage.schema.json +102 -0
  509. package/schemas/verification-proof.schema.json +29 -0
  510. package/schemas/wazir-manifest.schema.json +173 -0
  511. package/skills/README.md +40 -0
  512. package/skills/brainstorming/SKILL.md +77 -0
  513. package/skills/debugging/SKILL.md +50 -0
  514. package/skills/design/SKILL.md +61 -0
  515. package/skills/dispatching-parallel-agents/SKILL.md +128 -0
  516. package/skills/executing-plans/SKILL.md +70 -0
  517. package/skills/finishing-a-development-branch/SKILL.md +169 -0
  518. package/skills/humanize/SKILL.md +123 -0
  519. package/skills/init-pipeline/SKILL.md +124 -0
  520. package/skills/prepare-next/SKILL.md +20 -0
  521. package/skills/receiving-code-review/SKILL.md +123 -0
  522. package/skills/requesting-code-review/SKILL.md +105 -0
  523. package/skills/requesting-code-review/code-reviewer.md +108 -0
  524. package/skills/run-audit/SKILL.md +197 -0
  525. package/skills/scan-project/SKILL.md +41 -0
  526. package/skills/self-audit/SKILL.md +153 -0
  527. package/skills/subagent-driven-development/SKILL.md +154 -0
  528. package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
  529. package/skills/subagent-driven-development/implementer-prompt.md +102 -0
  530. package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  531. package/skills/tdd/SKILL.md +23 -0
  532. package/skills/using-git-worktrees/SKILL.md +163 -0
  533. package/skills/using-skills/SKILL.md +95 -0
  534. package/skills/verification/SKILL.md +22 -0
  535. package/skills/wazir/SKILL.md +463 -0
  536. package/skills/writing-plans/SKILL.md +30 -0
  537. package/skills/writing-skills/SKILL.md +157 -0
  538. package/skills/writing-skills/anthropic-best-practices.md +122 -0
  539. package/skills/writing-skills/persuasion-principles.md +50 -0
  540. package/templates/README.md +20 -0
  541. package/templates/artifacts/README.md +10 -0
  542. package/templates/artifacts/accepted-learning.md +19 -0
  543. package/templates/artifacts/accepted-learning.template.json +12 -0
  544. package/templates/artifacts/author.md +74 -0
  545. package/templates/artifacts/author.template.json +19 -0
  546. package/templates/artifacts/clarification.md +21 -0
  547. package/templates/artifacts/clarification.template.json +12 -0
  548. package/templates/artifacts/execute-notes.md +19 -0
  549. package/templates/artifacts/implementation-plan.md +21 -0
  550. package/templates/artifacts/implementation-plan.template.json +11 -0
  551. package/templates/artifacts/learning-proposal.md +19 -0
  552. package/templates/artifacts/next-run-handoff.md +21 -0
  553. package/templates/artifacts/plan-review.md +19 -0
  554. package/templates/artifacts/proposed-learning.template.json +12 -0
  555. package/templates/artifacts/research.md +21 -0
  556. package/templates/artifacts/research.template.json +12 -0
  557. package/templates/artifacts/review-findings.md +19 -0
  558. package/templates/artifacts/review.template.json +11 -0
  559. package/templates/artifacts/run-manifest.template.json +8 -0
  560. package/templates/artifacts/spec-challenge.md +19 -0
  561. package/templates/artifacts/spec-challenge.template.json +11 -0
  562. package/templates/artifacts/spec.md +21 -0
  563. package/templates/artifacts/spec.template.json +12 -0
  564. package/templates/artifacts/verification-proof.md +19 -0
  565. package/templates/artifacts/verification-proof.template.json +11 -0
  566. package/templates/examples/accepted-learning.example.json +14 -0
  567. package/templates/examples/author.example.json +152 -0
  568. package/templates/examples/clarification.example.json +15 -0
  569. package/templates/examples/docs-claim.example.json +8 -0
  570. package/templates/examples/export-manifest.example.json +7 -0
  571. package/templates/examples/host-export-package.example.json +11 -0
  572. package/templates/examples/implementation-plan.example.json +17 -0
  573. package/templates/examples/proposed-learning.example.json +13 -0
  574. package/templates/examples/research.example.json +15 -0
  575. package/templates/examples/research.example.md +6 -0
  576. package/templates/examples/review.example.json +17 -0
  577. package/templates/examples/run-manifest.example.json +9 -0
  578. package/templates/examples/spec-challenge.example.json +14 -0
  579. package/templates/examples/spec.example.json +21 -0
  580. package/templates/examples/verification-proof.example.json +21 -0
  581. package/templates/examples/wazir-manifest.example.yaml +65 -0
  582. package/templates/task-definition-schema.md +99 -0
  583. package/tooling/README.md +20 -0
  584. package/tooling/src/adapters/context-mode.js +50 -0
  585. package/tooling/src/capture/command.js +376 -0
  586. package/tooling/src/capture/store.js +99 -0
  587. package/tooling/src/capture/usage.js +270 -0
  588. package/tooling/src/checks/branches.js +50 -0
  589. package/tooling/src/checks/brand-truth.js +110 -0
  590. package/tooling/src/checks/changelog.js +231 -0
  591. package/tooling/src/checks/command-registry.js +36 -0
  592. package/tooling/src/checks/commits.js +102 -0
  593. package/tooling/src/checks/docs-drift.js +103 -0
  594. package/tooling/src/checks/docs-truth.js +201 -0
  595. package/tooling/src/checks/runtime-surface.js +156 -0
  596. package/tooling/src/cli.js +116 -0
  597. package/tooling/src/command-options.js +56 -0
  598. package/tooling/src/commands/validate.js +320 -0
  599. package/tooling/src/doctor/command.js +91 -0
  600. package/tooling/src/export/command.js +77 -0
  601. package/tooling/src/export/compiler.js +498 -0
  602. package/tooling/src/guards/loop-cap-guard.js +52 -0
  603. package/tooling/src/guards/protected-path-write-guard.js +67 -0
  604. package/tooling/src/index/command.js +152 -0
  605. package/tooling/src/index/storage.js +1061 -0
  606. package/tooling/src/index/summarizers.js +261 -0
  607. package/tooling/src/loaders.js +18 -0
  608. package/tooling/src/project-root.js +22 -0
  609. package/tooling/src/recall/command.js +225 -0
  610. package/tooling/src/schema-validator.js +30 -0
  611. package/tooling/src/state-root.js +40 -0
  612. package/tooling/src/status/command.js +71 -0
  613. package/wazir.manifest.yaml +135 -0
  614. package/workflows/README.md +19 -0
  615. package/workflows/author.md +42 -0
  616. package/workflows/clarify.md +38 -0
  617. package/workflows/design-review.md +46 -0
  618. package/workflows/design.md +44 -0
  619. package/workflows/discover.md +37 -0
  620. package/workflows/execute.md +48 -0
  621. package/workflows/learn.md +38 -0
  622. package/workflows/plan-review.md +42 -0
  623. package/workflows/plan.md +39 -0
  624. package/workflows/prepare-next.md +37 -0
  625. package/workflows/review.md +40 -0
  626. package/workflows/run-audit.md +41 -0
  627. package/workflows/spec-challenge.md +41 -0
  628. package/workflows/specify.md +38 -0
  629. package/workflows/verify.md +37 -0
@@ -0,0 +1,649 @@
1
+ # Design Principles — SOLID — Architecture Expertise Module
2
+
3
+ > SOLID is a set of five object-oriented design principles (Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion) that guide code organization for maintainability. They are heuristics, not laws — mechanical application often produces over-engineered code.
4
+
5
+ > **Category:** Foundation
6
+ > **Complexity:** Moderate
7
+ > **Applies when:** Object-oriented codebases with growing complexity where maintainability and testability are priorities
8
+
9
+ ---
10
+
11
+ ## What This Is (and What It Isn't)
12
+
13
+ ### The Five Principles at a Glance
14
+
15
+ **S — Single Responsibility Principle (SRP)**
16
+ A class should have only one reason to change. "Reason to change" is the operative phrase — it means a single *actor* or *stakeholder* drives the class's evolution, not that the class does only one low-level task. A class that formats invoices AND sends emails AND persists to a database serves three actors (finance, notifications, infrastructure) and will be modified from three different directions.
17
+
18
+ What it enables: classes that are focused, easily named, straightforwardly testable, and changed without surprising side effects.
19
+
20
+ What it does NOT mean: every class must contain a single method, or that utility classes are banned, or that you should fracture cohesive logic into dozens of micro-classes.
21
+
22
+ ---
23
+
24
+ **O — Open/Closed Principle (OCP)**
25
+ Software entities should be open for extension but closed for modification. A stable abstraction (an interface or an abstract class) is "closed" — callers depend on it permanently. New behavior is added by implementing or extending, not by editing the stable contract.
26
+
27
+ What it enables: adding features (new payment providers, new export formats, new notification channels) without touching — and therefore risking — existing working code.
28
+
29
+ What it does NOT mean: you need an abstract factory for every concrete class, or that you should predict all future variations before writing the first line. Robert Martin's original formulation referred to the *Meyer* sense (inheritance) and was later broadened to the *polymorphic* sense (interfaces + composition). Neither version justifies speculative generalization.
30
+
31
+ ---
32
+
33
+ **L — Liskov Substitution Principle (LSP)**
34
+ Objects of a derived type must be substitutable for objects of their base type without altering program correctness. Formally: if `f(x)` is provable for all objects `x` of type `T`, then `f(y)` must hold for all `y` of subtype `S`. Practically: a subclass must honor the *behavioral contract* of its superclass — preconditions cannot be strengthened, postconditions cannot be weakened, invariants must be preserved.
35
+
36
+ What it enables: polymorphic code that actually works predictably. It is the principle that makes interfaces useful rather than merely structural.
37
+
38
+ What it does NOT mean: all inheritance hierarchies are wrong. It means hierarchies must reflect behavioral relationships, not just conceptual/IS-A relationships in the English-language sense.
39
+
40
+ ---
41
+
42
+ **I — Interface Segregation Principle (ISP)**
43
+ Clients should not be forced to depend on methods they do not use. Fat interfaces that serve many callers create artificial coupling — a change to an unused method forces recompilation (or re-testing) of all clients.
44
+
45
+ What it enables: role-based interfaces (sometimes called "role interfaces") where each caller sees only the slice of behavior it needs. This also makes mocking and testing radically simpler.
46
+
47
+ What it does NOT mean: every interface must be a single-method SAM (Single Abstract Method). The goal is cohesive, client-specific contracts. Ten methods that are always used together belong on one interface.
48
+
49
+ ---
50
+
51
+ **D — Dependency Inversion Principle (DIP)**
52
+ High-level modules should not depend on low-level modules. Both should depend on abstractions. Abstractions should not depend on details. Details (concrete implementations) should depend on abstractions.
53
+
54
+ What it enables: high-level business logic that can be tested without databases, HTTP clients, or file systems; swappable infrastructure implementations; IoC (Inversion of Control) containers that wire everything together.
55
+
56
+ What it does NOT mean: every function parameter must be an interface. Constructor injection of concrete collaborators is fine when those collaborators have no meaningful variation and no testing cost.
57
+
58
+ ---
59
+
60
+ ### SOLID Is NOT
61
+
62
+ - **Not a checklist.** Running down the list and asking "have I applied OCP here?" is a recipe for unnecessary complexity. Apply a principle when a *specific pain* points to it.
63
+ - **Not universally applicable.** SOLID is an OO design vocabulary. It has limited applicability to purely functional code, data-pipeline scripts, CLI tools, and throwaway prototypes.
64
+ - **Not a substitute for judgment.** The principles sometimes conflict: SRP pushes toward many small classes (more files, more navigation, more cognitive overhead); performance sometimes demands fusing concerns back together. Judgment resolves the conflict; dogma does not.
65
+ - **Not a quality metric.** A codebase that "follows all five principles" can still be a mess if the abstractions are wrong. A codebase that violates several can still be excellent.
66
+ - **Not static.** The principles describe a design direction, not a final state. Code that violates SRP today is acceptable if it has not yet grown large enough to hurt. Refactoring toward SOLID is iterative.
67
+
68
+ ---
69
+
70
+ ## When to Use It
71
+
72
+ Apply SOLID deliberately — as a targeted response to a recognized pain — in the following contexts:
73
+
74
+ **1. Object-oriented code with growing complexity**
75
+ When a codebase is clearly OO (Java, C#, TypeScript classes, Python classes with non-trivial inheritance) and has grown beyond ~5,000 lines actively maintained by more than one developer, the organizational principles of SOLID start to pay off. Below this threshold, the overhead of abstractions often exceeds the benefit.
76
+
77
+ **2. Long-lived codebases**
78
+ Software with a multi-year runway justifies the upfront cost of deliberate design. Django's middleware system is a textbook OCP application — new middleware is added by implementing a callable interface, existing middleware is never modified. Spring Framework's Dependency Injection container is the canonical DIP example: business beans declare their dependencies as interfaces; the container resolves them. Both systems have survived over a decade of extension without wholesale rewrites of core code.
79
+
80
+ **3. Large teams (5+ developers)**
81
+ With many contributors, God Classes become merge conflict hotspots. SRP enforces a natural module boundary that maps to team ownership. DIP prevents teams from hard-wiring their components to each other's concrete implementations.
82
+
83
+ **4. When specific code smells appear**
84
+
85
+ | Smell | Principle to Apply |
86
+ |---|---|
87
+ | Class has 10+ dependencies | SRP — it's doing too much |
88
+ | Adding a feature requires changing 6 files | OCP — plugin point missing |
89
+ | Subclass overrides method to throw `UnsupportedOperation` | LSP — wrong inheritance hierarchy |
90
+ | Tests need 8 mocks for a simple unit | ISP or DIP — interfaces too fat or dependencies concrete |
91
+ | Business logic tests require a real database | DIP — infrastructure detail leaked into domain |
92
+ | Class named `Manager`, `Handler`, `Processor`, `Utils` | SRP — unclear single responsibility |
93
+
94
+ **5. When testability is blocking quality**
95
+ If a class is genuinely difficult to unit test because it creates its own collaborators (files, databases, external services), DIP is the immediate fix. Inject the collaborator as an abstraction; swap in a test double. This is the single highest-ROI SOLID application.
96
+
97
+ ---
98
+
99
+ ## When NOT to Use It
100
+
101
+ This section is as important as the previous one. Misapplied SOLID is a major source of accidental complexity in the industry.
102
+
103
+ ### Small Projects and Short-Lived Code
104
+
105
+ A script that parses a log file and produces a report has no stakeholders, no team, no long-term evolution. Splitting it into `LogParser`, `ReportFormatter`, `ReportWriter`, and a `IReportDestination` interface is waste. The code is harder to read, harder to trace, and slower to modify. KISS wins here: if you can hold the whole program in your head, hold it in one file.
106
+
107
+ A startup MVP that might be thrown away in 90 days should not be engineered for the open/closed property. Write clear, direct code. If the product survives, refactor.
108
+
109
+ ### Functional and Data Pipeline Code
110
+
111
+ SOLID is an OO vocabulary. A data transformation pipeline — `read → validate → transform → write` — expressed as a chain of pure functions or dataclass pipelines has no natural place for "interfaces" or "dependency inversion" in the OO sense. Imposing class hierarchies on functional code creates unnecessary friction. Use composition of functions, not composition of objects.
112
+
113
+ ### When KISS and YAGNI Beat SOLID
114
+
115
+ YAGNI (You Aren't Gonna Need It) directly opposes premature OCP. "We might need multiple database backends" is not a reason to introduce a `DatabaseAdapter` interface when only PostgreSQL will ever be used. Every abstraction has a cost: indirection, discovery difficulty, naming burden, and the false sense that you've prepared for a future that never arrives.
116
+
117
+ **Real incident — interface proliferation for SRP compliance:**
118
+ A mid-sized engineering team spent three weeks extracting a working 400-line service class into 11 classes, each "with a single responsibility," plus 8 interfaces for dependency injection. The result: a change to the feature's behavior required touching 7 files instead of 1. The original class was not actually causing test failures or merge conflicts — it was refactored to satisfy a principle, not a pain. Net result: slower iteration, no measurable quality gain.
119
+
120
+ ### Over-Applying OCP: Abstract Factories for Single Implementations
121
+
122
+ OCP is frequently over-applied when developers create abstract factories, strategy interfaces, or plugin systems before there is more than one concrete implementation. The abstraction carries a real cost: callers cannot easily trace execution ("Go to definition" leads to an interface, not code), onboarding new developers requires understanding the layer, and the supposed "extension point" often never gets a second implementation.
123
+
124
+ Rule of thumb: wait for the *second* concrete implementation before introducing an interface for OCP purposes. The first tells you nothing about what varies; the second reveals the stable contract.
125
+
126
+ ### ISP Gone Wrong: Forty Micro-Interfaces
127
+
128
+ ISP taken to its logical extreme produces a one-method interface for every caller. A `UserService` that has methods `createUser`, `updateUser`, `deleteUser`, `findUserById`, `findUserByEmail`, and `listUsers` could theoretically be split into `IUserCreator`, `IUserUpdater`, `IUserDeleter`, `IUserFinder`, `IUserEmailFinder`, `IUserLister`. In practice:
129
+
130
+ - The split provides no real isolation benefit (all six are in the same class anyway)
131
+ - Naming becomes strained and loses meaning
132
+ - A developer reading a method signature taking `IUserFinder` must look elsewhere to understand what object they're holding
133
+ - Code review reveals the abstraction is never tested independently
134
+
135
+ The anti-pattern is common in Java and C# codebases where interface extraction is trivially IDE-automated. Automation doesn't mean the result is useful.
136
+
137
+ ### DIP Over-Applied: Everything Abstracted, Nothing Discoverable
138
+
139
+ Full DIP saturation — every class depends only on interfaces, every interface registered in an IoC container, no concrete type mentioned anywhere in business code — produces codebases that are nearly impossible to navigate. The dependency graph lives in the container configuration, not in the code. When something breaks, the call stack shows interface types, not implementations. Onboarding time increases substantially.
140
+
141
+ Ask: does this dependency ever need to be swapped for testing or production variation? If the answer is "no," inject the concrete type directly. Configuration classes, value objects, and pure domain entities rarely need to be abstracted.
142
+
143
+ ### Performance-Critical Code
144
+
145
+ SRP often advocates breaking computation into separate coordinating objects. In hot paths (tight loops, parsers, serializers), the cost of object allocation, virtual dispatch, and method call overhead is real. A well-named, moderately-sized class that fuses two responsibilities for performance reasons is better than dogmatic separation that degrades throughput by 30%.
146
+
147
+ ### Scripts, CLI Tools, and Infrastructure Code
148
+
149
+ Bash, Python scripts, Terraform modules, Ansible playbooks — these don't benefit from OO principles. Attempts to impose SOLID on Terraform module composition, for instance, create artificial layering that obscures what infrastructure actually exists.
150
+
151
+ ---
152
+
153
+ ## How It Works
154
+
155
+ ### SRP: Responsibility = Reason to Change
156
+
157
+ The common misreading of SRP is "does one thing." Robert Martin's precise formulation is: *a class should have only one reason to change*, where "reason" maps to an *actor* — a person or group whose needs drive modification.
158
+
159
+ Consider an `Employee` class that calculates pay, reports hours to HR, and saves itself to the database. Three actors: finance calculates pay, HR defines hour-reporting rules, DBA controls the schema. If finance changes the pay algorithm, the class is modified. If the DBA changes the schema, the same class is modified. The risk of one change accidentally breaking another concern is what SRP prevents.
160
+
161
+ **Actor-based cohesion** is the guiding test: ask "who will ask me to change this?" If the answer is more than one distinct stakeholder group, the class has too many responsibilities.
162
+
163
+ The practical smell is the God Class: a class named `OrderManager`, `UserService`, or `ApplicationController` that steadily accumulates methods as features are added. Indicators:
164
+ - The class has more than ~10-15 public methods
165
+ - Its import/dependency list spans unrelated domains (email + database + formatting)
166
+ - It cannot be named without using "and" or "manager"
167
+ - It is a merge conflict hotspot in git history
168
+
169
+ Refactoring path: identify the distinct "actors" driving the class → extract one class per actor → let the original class optionally become a thin facade if callers need a unified entry point.
170
+
171
+ ### OCP: Extension via Composition and Polymorphism
172
+
173
+ The key insight is that stable abstractions are *frozen*. Once you ship a public API or mark an interface as part of your contract, modifying it breaks callers. OCP says: design so that new behaviors are additive, not substitutive.
174
+
175
+ **Plugin points** are the mechanism: an interface defines the contract, the main system depends on the interface, and new behaviors are added by implementing the interface. Django's middleware stack is exactly this — a list of callables wrapping the request/response cycle, each added without modifying the framework. Spring's `ApplicationListener` and `BeanPostProcessor` extension points follow the same pattern.
176
+
177
+ The OCP also governs what NOT to do: do not add a `type` field to a class and then switch on it in methods. Each new type forces modification of every switch statement. Use polymorphism instead.
178
+
179
+ **Two versions of OCP:**
180
+ - *Meyer OCP* (1988): use inheritance; subclasses extend behavior
181
+ - *Polymorphic OCP* (1990s, Martin): use abstract interfaces; implementations are substitutable
182
+
183
+ The polymorphic version is more flexible and is what most practitioners mean today.
184
+
185
+ ### LSP: Behavioral Subtyping
186
+
187
+ LSP is the principle that makes polymorphism *trustworthy*. The formal rules:
188
+
189
+ 1. **Preconditions cannot be strengthened** in a subtype. If the base type accepts a null argument, the subtype must too.
190
+ 2. **Postconditions cannot be weakened** in a subtype. If the base type guarantees a non-null return, the subtype must guarantee the same.
191
+ 3. **Invariants must be preserved.** Properties that hold for the base type must hold for the subtype.
192
+ 4. **No new exceptions** that are not subtypes of exceptions thrown by the base type.
193
+ 5. **Covariance of return types** is allowed; contravariance of parameter types is allowed.
194
+
195
+ **The Rectangle/Square problem** is the canonical violation: mathematically, a square IS-A rectangle, so it seems natural to inherit. But `Rectangle` has the behavioral contract "setting width does not affect height." A `Square` cannot honor this — setting width *must* affect height to remain a square. Any code that uses `Rectangle` polymorphically and assumes independent dimensions will break when handed a `Square`. The mathematical IS-A relationship does not match the behavioral contract.
196
+
197
+ The fix: model both as `Shape` subtypes with an `area()` method, without the dependent-dimension contract. Behavioral contracts, not class diagrams, drive the hierarchy.
198
+
199
+ **Real-world violations:**
200
+ - Java's `Stack` extends `Vector`: `Stack` should not expose arbitrary-index insertion, but it inherits these methods from `Vector`, violating the stack invariant
201
+ - .NET `ReadOnlyCollection` implementing `ICollection<T>` with a mutating `Add` that throws `NotSupportedException` — callers of `ICollection<T>` cannot rely on `Add` being safe
202
+ - Payment gateway subclasses that throw exceptions for cases where the base class contract specifies a return value
203
+
204
+ ### ISP: Role Interfaces vs Fat Interfaces
205
+
206
+ The distinction between a *fat interface* and a *role interface* is the key:
207
+
208
+ - **Fat interface**: `IAnimal { void eat(); void sleep(); void fly(); void swim(); }` — all animals must implement all methods, most of which are irrelevant
209
+ - **Role interface**: `IFlyable { void fly(); }`, `ISwimmable { void swim(); }` — each client depends only on the capability it needs
210
+
211
+ The practical payoff is in testing: a class that depends on `IFlyable` can be tested with a mock that implements only `fly()`. A class that depends on a 20-method fat interface needs a mock (or a test double) with 20 stub methods, most of which do nothing.
212
+
213
+ ISP is also the principle behind Go's structural interfaces (implicit satisfaction) and Rust's traits. These language designs embody ISP architecturally.
214
+
215
+ **The boundary condition:** ISP says segregate by client need, not by method count. If a client genuinely uses 12 methods together, those 12 methods belong on one interface. The principle is about reducing unnecessary coupling, not minimizing interface size.
216
+
217
+ ### DIP: Depend on Abstractions
218
+
219
+ DIP has two parts:
220
+
221
+ 1. High-level modules define the abstractions they need (not the other way around)
222
+ 2. Low-level modules implement those abstractions
223
+
224
+ This means the *domain layer* owns its interfaces. `OrderService` defines `IOrderRepository`; the infrastructure layer provides `PostgresOrderRepository implements IOrderRepository`. The arrow of dependency points inward toward the domain — this is the foundational rule of Hexagonal/Clean Architecture.
225
+
226
+ **IoC containers** automate the wiring: instead of manually constructing `new OrderService(new PostgresOrderRepository(...))`, you register both in a container and let it resolve the dependency graph. Spring, .NET's built-in DI, tsyringe (TypeScript), and Python's `dependency-injector` library all work this way.
227
+
228
+ The risk: with full IoC, concrete implementations disappear from the code. The container configuration becomes a second codebase that must be maintained, understood, and debugged separately.
229
+
230
+ ### How the Principles Interact and Conflict
231
+
232
+ SOLID is not five independent rules; the principles reinforce each other:
233
+
234
+ - SRP produces small, focused classes → ISP is easier to apply to them
235
+ - ISP produces focused interfaces → DIP is more useful (smaller contracts to depend on)
236
+ - DIP separates construction from use → OCP is easier (swap implementations without touching callers)
237
+ - LSP constrains what inheritance can do → OCP's use of inheritance stays safe
238
+
239
+ **Conflicts:**
240
+
241
+ - **SRP vs cohesion**: pulling responsibilities apart sometimes severs data and behavior that belong together. A tightly coupled data+behavior pair split by SRP creates an anemic domain model with disconnected logic.
242
+ - **SRP vs performance**: fusing responsibilities is sometimes necessary for cache locality and throughput. The tight loop that does two things for performance reasons is not a SRP violation worth fixing.
243
+ - **OCP vs discoverability**: extension points behind interfaces reduce the ability to follow execution with static analysis or IDE navigation.
244
+ - **DIP vs simplicity**: full DI saturation makes simple programs feel like enterprise infrastructure. For programs with no meaningful collaborator variation, DIP adds noise without signal.
245
+
246
+ ---
247
+
248
+ ## Trade-Offs Matrix
249
+
250
+ | You Get | You Pay |
251
+ |---|---|
252
+ | Unit testability — inject mocks at any seam | Indirection — "Go to definition" leads to an interface |
253
+ | Changeability — add features without touching stable code | File count — more classes, more files, more navigation |
254
+ | Separation of concerns — business logic independent of infrastructure | Cognitive overhead — need to understand the full wiring before tracing any behavior |
255
+ | Reduced merge conflicts — smaller, focused files change less often | Boilerplate — interfaces + implementations + registrations for every dependency |
256
+ | Easier onboarding to a *specific module* | Harder onboarding to the *system as a whole* |
257
+ | Swappable implementations — test/production/staging differences handled cleanly | Container complexity — IoC configuration as a second source of truth |
258
+ | Explicit dependencies — constructor signatures document what a class needs | Verbose constructors — classes with 6+ injected dependencies are a smell themselves |
259
+ | Enforced boundaries — architectural rules can be checked statically (ArchUnit) | Premature generalization risk — abstractions for futures that never arrive |
260
+ | Reduced coupling — changes in infrastructure don't ripple into domain | Over-abstraction risk — dead interfaces with one implementation forever |
261
+
262
+ ---
263
+
264
+ ## Evolution Path
265
+
266
+ Do not apply all five principles from day one. This produces speculative complexity. Instead, follow the pain:
267
+
268
+ **Phase 1 — Start simple (0–3 months, <5K LOC)**
269
+ Write direct, concrete code. Name classes after what they do, not abstract roles. Accept that some classes will grow. Do not introduce interfaces that have no second implementation.
270
+
271
+ **Phase 2 — Identify pain points (first friction)**
272
+ Track which classes cause the most friction: untestable code, merge conflicts, "I changed one thing and something else broke." These are the targets.
273
+
274
+ **Phase 3 — Apply targeted principles**
275
+
276
+ - *God class causing merge conflicts?* → Apply SRP: identify actors, extract one class per actor.
277
+ - *Tests require a real database or HTTP client?* → Apply DIP: extract an interface for the infrastructure dependency, inject it.
278
+ - *Adding a new payment gateway / notification channel / export format requires editing 6 files?* → Apply OCP: identify the variation point, introduce an interface, register implementations.
279
+ - *Test setup requires constructing a 20-method mock for a 3-method need?* → Apply ISP: split the fat interface by client need.
280
+ - *Polymorphic code throwing unexpected exceptions at runtime?* → Audit LSP: verify subtype behavioral contracts.
281
+
282
+ **Phase 4 — Enforce boundaries (>50K LOC, >5 developers)**
283
+ At scale, individuals making local decisions can erode architecture. Introduce static enforcement:
284
+
285
+ - ArchUnit (Java) or NDepend (.NET): write rules like "classes in `domain.*` must not depend on classes in `infrastructure.*`"
286
+ - ESLint custom rules (TypeScript): forbid direct imports across layer boundaries
287
+ - CI gate: fail builds on architectural violations
288
+
289
+ **Refactoring order matters:**
290
+ SRP first (reduces class size and scope) → DIP second (makes the now-smaller classes testable) → OCP third (introduces extension points where variation is proven, not speculative) → ISP as you discover fat interfaces → LSP as you introduce inheritance.
291
+
292
+ ---
293
+
294
+ ## Failure Modes
295
+
296
+ ### Abstraction Hell
297
+ Every class has a corresponding interface that is never implemented by more than one concrete class. The codebase has 300 interfaces and 300 matching implementations. New developers spend their first week learning the wiring before they can trace a single request. Symptoms: `IFooService`, `FooServiceImpl`, `FooServiceFactory`, `AbstractFooService` all for the same concept.
298
+
299
+ ### Interface Explosion (ISP Over-Application)
300
+ Segregating by every conceivable caller produces interfaces with a single method and meaningless names (`IUserCreatable`, `IUserUpdatable`). The naming burden alone is a signal: if you cannot give the interface a meaningful noun-based name (like `Repository`, `EventPublisher`, `Clock`), it probably should not exist as a separate interface.
301
+
302
+ ### Premature Generalization (OCP Abuse)
303
+ Introducing abstract strategies and factory hierarchies before the second concrete implementation. Classic example: `AbstractReportGenerator` with `PdfReportGenerator` and `ExcelReportGenerator` written simultaneously — before the PDF version is even shipped. The "flexibility" was never exercised; the abstraction added 4 files and an indirection layer for zero benefit.
304
+
305
+ ### Dead Interfaces (One Implementation Forever)
306
+ An interface that has existed for 3 years with exactly one implementation. The interface adds indirection without enabling any of the benefits it was created for. In practice, many DIP-driven interfaces in enterprise codebases are never swapped. Ask in code review: "Will this abstraction ever have a second implementation?" If the answer is "no, but it makes it testable" — prefer a test double or test subclass over a permanent interface.
307
+
308
+ ### Testing the Framework, Not the Logic
309
+ With full DI container wiring, integration tests often end up verifying that the container wires things correctly, not that the business logic is correct. The tests become infrastructure tests masquerading as unit tests. SRP and DIP should make unit tests *simpler*, not more coupled to container configuration.
310
+
311
+ ### Anemic Domain Model (SRP + DIP Misapplication)
312
+ Extracting too much behavior out of domain objects (in the name of SRP) and inverting every dependency (in the name of DIP) can produce domain objects that are just data bags with no behavior, while all logic lives in sprawling service classes. This is the opposite of rich domain models and loses the encapsulation benefit that OO design offers.
313
+
314
+ ### Real Incident — The 40-Class Microservice
315
+ A team refactored a 600-line service into 40 classes, each passing SOLID review. Consequence: a single business feature change required touching 12 files, PRs became impossible to review in one sitting, and two bugs were introduced in the wiring logic. The team reverted to a 4-class design after a post-mortem. The lesson: the number of classes is not a quality metric. Focused cohesion is.
316
+
317
+ ---
318
+
319
+ ## Technology Landscape
320
+
321
+ ### Dependency Injection Containers
322
+
323
+ | Language | Container | Notes |
324
+ |---|---|---|
325
+ | Java | Spring Framework | Industry standard; XML, annotation, or Java config; full IoC |
326
+ | Java | Google Guice | Annotation-driven; lighter than Spring; popular for non-web code |
327
+ | C# / .NET | Microsoft.Extensions.DependencyInjection | Built into ASP.NET Core; minimal, fast |
328
+ | C# / .NET | Autofac | Richer feature set; convention-based registration |
329
+ | TypeScript | tsyringe (Microsoft) | Decorator-based; lightweight; popular with NestJS-adjacent code |
330
+ | TypeScript | InversifyJS | Full-featured; reflects decorators; closest to Spring in TS |
331
+ | TypeScript | NestJS built-in | Opinionated, module-scoped DI built into the framework |
332
+ | Python | dependency-injector | Declarative containers; Singleton/Factory/Resource providers |
333
+ | Python | injector | Guice-inspired; type annotation driven |
334
+ | Python | FastAPI built-in | `Depends()` mechanism; functional DI without a container |
335
+ | Go | wire (Google) | Compile-time DI via code generation; no runtime container |
336
+ | Rust | N/A | Ownership model makes classical DI less necessary; trait objects serve the role |
337
+
338
+ ### Static Analysis Tools for SOLID Violations
339
+
340
+ - **NDepend** (.NET): detects God classes, cyclic dependencies, afferent/efferent coupling, ISP violations via method usage analysis
341
+ - **ArchUnit** (Java/Kotlin): assertion library for architectural rules — "domain classes must not import infrastructure packages"
342
+ - **Checkstyle / PMD** (Java): class size, method count, coupling metrics
343
+ - **SonarQube**: cross-language; cognitive complexity, coupling metrics, duplicate code detection
344
+ - **ESLint with import plugin** (TypeScript/JS): enforce import boundary rules across layers
345
+ - **Pylint** (Python): method count, class coupling, complexity metrics
346
+ - **Resharper** (C#): real-time SOLID hints, extract interface refactoring
347
+
348
+ ### Framework Patterns That Embody SOLID
349
+
350
+ - **Django middleware** (OCP): callables in a list, each wrapping request/response, added without modifying the framework
351
+ - **Spring @Bean + @Autowired** (DIP): declare dependencies as interfaces; Spring resolves them
352
+ - **ASP.NET Core Middleware** (OCP + SRP): each middleware handles one concern, chained via `app.Use()`
353
+ - **Express.js middleware** (OCP + SRP): same pattern in Node.js
354
+ - **Java Servlet Filters** (OCP): pluggable processing without modifying the servlet
355
+ - **pytest fixtures** (DIP): test dependencies declared and injected by the test framework
356
+
357
+ ---
358
+
359
+ ## Decision Tree
360
+
361
+ Use this tree to decide whether — and which — SOLID principles to apply.
362
+
363
+ ```
364
+ Is this a script, data pipeline, or throwaway prototype?
365
+ YES → Apply SOLID sparingly or not at all. Favor KISS.
366
+ NO ↓
367
+
368
+ Is the codebase purely functional (no OO classes)?
369
+ YES → SOLID vocabulary doesn't directly apply. Consider functional equivalents (modules as SRP units, higher-order functions as OCP).
370
+ NO ↓
371
+
372
+ Team size < 5 AND expected project lifespan < 1 year?
373
+ YES → Apply SRP only if God classes are already causing friction. Skip OCP, ISP, DIP unless specific pain demands them.
374
+ NO ↓
375
+
376
+ Is there testing pain (tests require real infrastructure, test setup is complex)?
377
+ YES → Apply DIP immediately. Extract interfaces for infrastructure dependencies. Stop here; don't apply others speculatively.
378
+ NO ↓
379
+
380
+ Are there God classes (>10 dependencies, merge conflict hotspot, unnameable without "and")?
381
+ YES → Apply SRP. Identify actors, extract focused classes. Reassess after.
382
+ NO ↓
383
+
384
+ Is adding a new variant (payment type, export format, notification channel) requiring changes to existing code?
385
+ YES → Apply OCP. Introduce an interface at the variation point. Add implementations without modifying callers.
386
+ NO ↓
387
+
388
+ Are tests for a class requiring large mock objects (5+ stubbed methods that are never called)?
389
+ YES → Apply ISP. Split the fat interface by client need.
390
+ NO ↓
391
+
392
+ Is a polymorphic substitution producing unexpected runtime behavior or exceptions?
393
+ YES → Audit LSP. Verify subtype behavioral contracts. Restructure the hierarchy if needed.
394
+ NO ↓
395
+
396
+ Codebase > 50K LOC AND > 5 developers?
397
+ YES → Enforce SRP and DIP at minimum via static analysis (ArchUnit / NDepend / ESLint rules).
398
+ NO → Continue as-is. Revisit when pain points emerge.
399
+ ```
400
+
401
+ **Per-principle quick triggers:**
402
+
403
+ | Principle | Apply when | Do NOT apply when |
404
+ |---|---|---|
405
+ | SRP | Class is a merge conflict hotspot; has >10 dependencies; cannot be named without "and" | Class is small and stable; splitting would create only 1-method classes |
406
+ | OCP | Second concrete implementation of a variation exists or is imminently required | Only one implementation exists or will ever exist |
407
+ | LSP | Building an inheritance hierarchy; using polymorphic collections | No inheritance involved; composition is used throughout |
408
+ | ISP | Test setup requires mocking many unused methods; fat interface serves 3+ distinct callers | Interface has <5 methods used consistently by all callers |
409
+ | DIP | Infrastructure (DB, HTTP, filesystem) is leaking into domain logic; unit tests are hard | Dependency has no meaningful variation; concrete injection is simpler and testable enough |
410
+
411
+ ---
412
+
413
+ ## Implementation Sketch
414
+
415
+ ### SRP: Splitting a God Class
416
+
417
+ **Before** — `OrderService` serves three actors: billing, fulfillment, notifications:
418
+
419
+ ```python
420
+ class OrderService:
421
+ def calculate_total(self, order): ... # billing
422
+ def apply_discount(self, order, code): ... # billing
423
+ def ship_order(self, order): ... # fulfillment
424
+ def update_inventory(self, order): ... # fulfillment
425
+ def send_confirmation_email(self, order): ... # notifications
426
+ def send_shipping_notification(self, order): ... # notifications
427
+ def save_order(self, order): ... # persistence
428
+ def find_order(self, order_id): ... # persistence
429
+ ```
430
+
431
+ **After** — one class per actor:
432
+
433
+ ```python
434
+ class OrderPricingService:
435
+ def calculate_total(self, order): ...
436
+ def apply_discount(self, order, code): ...
437
+
438
+ class OrderFulfillmentService:
439
+ def ship_order(self, order): ...
440
+ def update_inventory(self, order): ...
441
+
442
+ class OrderNotificationService:
443
+ def send_confirmation(self, order): ...
444
+ def send_shipping_update(self, order): ...
445
+
446
+ class OrderRepository:
447
+ def save(self, order): ...
448
+ def find_by_id(self, order_id): ...
449
+ ```
450
+
451
+ Each class has one actor driving its changes. The `OrderRepository` change trigger is the DBA; `OrderPricingService` is finance; `OrderNotificationService` is the marketing/comms team.
452
+
453
+ ---
454
+
455
+ ### DIP: Dependency Injection Setup
456
+
457
+ **Before** — business logic creates its own infrastructure:
458
+
459
+ ```typescript
460
+ class OrderService {
461
+ private db = new PostgresDatabase(); // hard dependency
462
+ private emailer = new SendGridEmailClient(); // hard dependency
463
+
464
+ async placeOrder(order: Order): Promise<void> {
465
+ await this.db.save(order);
466
+ await this.emailer.send(order.customerEmail, 'Order confirmed');
467
+ }
468
+ }
469
+ ```
470
+
471
+ **After** — depend on abstractions, inject concrete implementations:
472
+
473
+ ```typescript
474
+ interface OrderRepository {
475
+ save(order: Order): Promise<void>;
476
+ }
477
+
478
+ interface EmailClient {
479
+ send(to: string, subject: string): Promise<void>;
480
+ }
481
+
482
+ class OrderService {
483
+ constructor(
484
+ private readonly repo: OrderRepository,
485
+ private readonly emailer: EmailClient,
486
+ ) {}
487
+
488
+ async placeOrder(order: Order): Promise<void> {
489
+ await this.repo.save(order);
490
+ await this.emailer.send(order.customerEmail, 'Order confirmed');
491
+ }
492
+ }
493
+
494
+ // Production wiring (tsyringe / NestJS / manual)
495
+ const service = new OrderService(
496
+ new PostgresOrderRepository(),
497
+ new SendGridEmailClient(),
498
+ );
499
+
500
+ // Test wiring — no database, no real emails
501
+ const service = new OrderService(
502
+ new InMemoryOrderRepository(),
503
+ new FakeEmailClient(),
504
+ );
505
+ ```
506
+
507
+ ---
508
+
509
+ ### ISP: Role Interface Instead of Fat Interface
510
+
511
+ **Before** — all notification clients must implement all methods:
512
+
513
+ ```java
514
+ interface NotificationService {
515
+ void sendEmail(String to, String body);
516
+ void sendSMS(String number, String body);
517
+ void sendPushNotification(String deviceId, String body);
518
+ void sendSlackMessage(String channel, String body);
519
+ }
520
+ // Implementors that only support email must stub the other three methods
521
+ ```
522
+
523
+ **After** — client-specific role interfaces:
524
+
525
+ ```java
526
+ interface EmailSender {
527
+ void sendEmail(String to, String body);
528
+ }
529
+
530
+ interface SmsSender {
531
+ void sendSMS(String number, String body);
532
+ }
533
+
534
+ interface PushSender {
535
+ void sendPushNotification(String deviceId, String body);
536
+ }
537
+
538
+ // OrderService only needs email — depends only on EmailSender
539
+ class OrderService {
540
+ OrderService(EmailSender emailer) { ... }
541
+ }
542
+
543
+ // A Twilio adapter implements both SMS and push, but not email
544
+ class TwilioAdapter implements SmsSender, PushSender { ... }
545
+ ```
546
+
547
+ ---
548
+
549
+ ### OCP: Plugin Point for Extension
550
+
551
+ **Before** — adding a new report format requires modifying `ReportExporter`:
552
+
553
+ ```python
554
+ class ReportExporter:
555
+ def export(self, data, format: str):
556
+ if format == 'pdf':
557
+ # PDF logic
558
+ elif format == 'csv':
559
+ # CSV logic
560
+ elif format == 'excel':
561
+ # Excel logic
562
+ # Every new format = modify this class
563
+ ```
564
+
565
+ **After** — closed for modification, open for extension:
566
+
567
+ ```python
568
+ from abc import ABC, abstractmethod
569
+
570
+ class ReportFormatter(ABC):
571
+ @abstractmethod
572
+ def format(self, data) -> bytes: ...
573
+
574
+ class PdfFormatter(ReportFormatter):
575
+ def format(self, data) -> bytes: ...
576
+
577
+ class CsvFormatter(ReportFormatter):
578
+ def format(self, data) -> bytes: ...
579
+
580
+ class ReportExporter:
581
+ def __init__(self, formatter: ReportFormatter):
582
+ self.formatter = formatter
583
+
584
+ def export(self, data) -> bytes:
585
+ return self.formatter.format(data)
586
+
587
+ # Adding Excel: write ExcelFormatter, register it. Touch nothing else.
588
+ class ExcelFormatter(ReportFormatter):
589
+ def format(self, data) -> bytes: ...
590
+ ```
591
+
592
+ ---
593
+
594
+ ### LSP: Fixing a Broken Hierarchy
595
+
596
+ **Violation** — `Square` cannot honor `Rectangle`'s behavioral contract:
597
+
598
+ ```python
599
+ class Rectangle:
600
+ def set_width(self, w): self.width = w
601
+ def set_height(self, h): self.height = h
602
+ def area(self): return self.width * self.height
603
+
604
+ class Square(Rectangle):
605
+ def set_width(self, w):
606
+ self.width = w
607
+ self.height = w # violates Rectangle's postcondition: height unchanged
608
+ def set_height(self, h):
609
+ self.width = h
610
+ self.height = h # same violation
611
+ ```
612
+
613
+ **Fix** — common abstraction without the conflicting contract:
614
+
615
+ ```python
616
+ from abc import ABC, abstractmethod
617
+
618
+ class Shape(ABC):
619
+ @abstractmethod
620
+ def area(self) -> float: ...
621
+
622
+ class Rectangle(Shape):
623
+ def __init__(self, width: float, height: float):
624
+ self.width = width
625
+ self.height = height
626
+ def area(self) -> float:
627
+ return self.width * self.height
628
+
629
+ class Square(Shape):
630
+ def __init__(self, side: float):
631
+ self.side = side
632
+ def area(self) -> float:
633
+ return self.side ** 2
634
+ ```
635
+
636
+ Both are substitutable anywhere `Shape` is expected. Neither violates the other's contract because the contract only requires `area()`.
637
+
638
+ ---
639
+
640
+ ## Cross-References
641
+
642
+ - **Separation of Concerns** (`separation-of-concerns`): SRP is the OO instantiation of SoC. The principles are complementary; SoC is the broader concept, SRP is the class-level application.
643
+ - **Coupling and Cohesion** (`coupling-and-cohesion`): SOLID's goal is low coupling (DIP, ISP) and high cohesion (SRP). Understanding coupling/cohesion metrics gives SOLID a measurable foundation.
644
+ - **Hexagonal / Clean Architecture** (`hexagonal-clean-architecture`): DIP is the mechanical foundation of Hexagonal Architecture. Ports are the interfaces (owned by the domain); adapters are the concrete implementations (infrastructure layer). Clean Architecture's dependency rule — "source code dependencies point inward" — is DIP applied at the architectural scale.
645
+ - **Domain-Driven Design** (`domain-driven-design`): DDD's rich domain model can conflict with SRP's impulse to extract behavior. DDD's Aggregate pattern, bounded contexts, and entities embody cohesion in ways that SRP must not fragment. Understand this tension before applying SRP to domain objects.
646
+
647
+ ---
648
+
649
+ *Researched: 2026-03-08 | Sources: [Baeldung SOLID Guide](https://www.baeldung.com/solid-principles) | [LogRocket SRP](https://blog.logrocket.com/single-responsibility-principle-srp/) | [LogRocket LSP](https://blog.logrocket.com/liskov-substitution-principle-lsp/) | [LogRocket ISP](https://blog.logrocket.com/interface-segregation-principle-isp/) | [LogRocket OCP](https://blog.logrocket.com/solid-open-closed-principle/) | [Baeldung — When to Avoid SOLID](https://www.baeldung.com/cs/solid-principles-avoid) | [Ted Kaminski — Deconstructing SOLID](https://www.tedinski.com/2019/04/02/solid-critique.html) | [ISP as Antipattern — naildrivin5](https://naildrivin5.com/blog/2019/11/21/interface-segreation-principle-is-unhelpful-but-inoffensive.html) | [SOLID as Antipattern — spinthemoose](https://blog.spinthemoose.com/2012/12/17/solid-as-an-antipattern/) | [John Ousterhout vs Robert Martin discussion](https://github.com/johnousterhout/aposd-vs-clean-code) | [Python Dependency Injector](https://python-dependency-injector.ets-labs.org/) | [tsyringe advantages](https://pandaquests.medium.com/advantages-of-tsyringe-to-ordinary-dependency-injection-f68f4e597329) | [Rectangle-Square LSP](https://medium.com/@alex24dutertre/square-rectangle-and-the-liskov-substitution-principle-ee1eb8433106) | [SOLID KISS YAGNI tradeoffs — idatamax](https://idatamax.com/blog/engineering-with-solid-dry-kiss-yagni-and-grasp)*