@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,736 @@
1
+ # Layered Architecture — Architecture Expertise Module
2
+
3
+ > Layered architecture organizes code into horizontal stacks where each layer has a specific responsibility and can only communicate with adjacent layers. It is the default starting point for most applications — simple to understand, widely taught, sufficient for the majority of CRUD-heavy systems.
4
+
5
+ > **Category:** Pattern
6
+ > **Complexity:** Simple
7
+ > **Applies when:** Most applications as the default starting architecture, especially CRUD-heavy systems
8
+
9
+ ---
10
+
11
+ ## What This Is (and What It Isn't)
12
+
13
+ ### The Classic Model
14
+
15
+ Layered architecture divides an application into horizontal tiers, each responsible for a distinct concern. The canonical 4-layer model found in most enterprise and web applications is:
16
+
17
+ ```
18
+ ┌─────────────────────────────────────┐
19
+ │ Presentation Layer │ HTTP handlers, controllers, views, UI
20
+ ├─────────────────────────────────────┤
21
+ │ Business Logic Layer │ Services, use cases, domain rules
22
+ ├─────────────────────────────────────┤
23
+ │ Data Access Layer │ Repositories, ORMs, query builders
24
+ ├─────────────────────────────────────┤
25
+ │ Database Layer │ SQL/NoSQL engine, schema
26
+ └─────────────────────────────────────┘
27
+ ```
28
+
29
+ A simpler 3-layer variant collapses data access into the persistence tier:
30
+
31
+ ```
32
+ Presentation → Business Logic → Data (persistence + database)
33
+ ```
34
+
35
+ ### N-Tier vs N-Layer: A Critical Distinction
36
+
37
+ These terms are often used interchangeably but mean different things:
38
+
39
+ - **N-layer** (logical): Code organization within a single deployable. A monolith can be perfectly well organized into 3 logical layers.
40
+ - **N-tier** (physical): Separate deployment units that communicate over a network. The presentation tier runs on one server, the application tier on another, the database on a third.
41
+
42
+ Physical separation introduces network latency, distributed system complexity, and independent scaling capability. Logical layering gives you separation of concerns with none of the distribution overhead. Most applications start with logical layers inside a monolith, then extract tiers as scaling demands emerge.
43
+
44
+ ### MVC, MVP, MVVM Are Not Alternatives
45
+
46
+ MVC (Model-View-Controller), MVP (Model-View-Presenter), and MVVM (Model-View-ViewModel) are patterns that operate *within* the presentation layer. They describe how the UI, user input, and data binding are organized — not how the whole application is structured. An application that uses MVC still has a service layer below its controllers and a repository layer below that. MVC is a sub-pattern of layered architecture, not a competitor to it.
47
+
48
+ ### Strict vs Relaxed (Open) Layering
49
+
50
+ **Strict layering**: A layer may only call the layer directly below it. The presentation layer cannot skip the business layer and call the repository directly. This enforces clean separation but creates "pass-through" boilerplate when a layer has no real work to do.
51
+
52
+ **Relaxed (open) layering**: A layer may skip layers and call any layer below it. This reduces sinkhole boilerplate at the cost of eroding the separation of concerns over time. In practice, most real-world codebases drift toward relaxed layering unintentionally.
53
+
54
+ ### What Layered Architecture Is NOT
55
+
56
+ Layered architecture must not be confused with hexagonal (ports and adapters) or clean architecture. The critical difference is **dependency direction**:
57
+
58
+ - In **layered architecture**, dependencies flow downward. The business layer imports from the data access layer. The domain is coupled to persistence.
59
+ - In **hexagonal/clean architecture**, dependencies point *inward*. The domain core has zero knowledge of databases, HTTP, or any infrastructure. Infrastructure adapts to the domain, not the reverse.
60
+
61
+ This means in a layered architecture, swapping out the database requires changes throughout the business layer — the layers are fundamentally coupled through their import chains. In hexagonal, you swap the adapter; the domain is untouched.
62
+
63
+ ---
64
+
65
+ ## When to Use It
66
+
67
+ Layered architecture is the correct *default* choice for the vast majority of new projects. The following conditions make it a strong fit:
68
+
69
+ **Project characteristics:**
70
+ - CRUD-heavy applications where most operations are "validate input, transform, write to DB, return response"
71
+ - Business logic that is mostly validation, simple calculations, and data transformation — not complex domain workflows
72
+ - Applications with straightforward, linear request flows (HTTP request in → business rule → DB query → HTTP response out)
73
+ - Systems where the database schema closely matches the domain model and that coupling is acceptable
74
+
75
+ **Team characteristics:**
76
+ - Small to medium teams (1–15 developers) who need low coordination overhead
77
+ - Teams already familiar with the pattern (onboarding time is near zero — every developer knows how to find a "service" and a "repository")
78
+ - Projects where delivery speed is more important than architectural purity
79
+ - When there is no clear domain expert and DDD would be premature
80
+
81
+ **Organizational characteristics:**
82
+ - Early-stage products where requirements will change frequently and architectural investment has low ROI
83
+ - Enterprise applications with stable, simple workflows (user management, reporting, configuration)
84
+ - Internal tools, admin panels, dashboards, and data entry systems
85
+
86
+ **Framework alignment:**
87
+ Every major web framework scaffolds layered architecture as its default structure. Choosing layered means going with the grain of the tools:
88
+
89
+ | Framework | Default Structure |
90
+ |-----------|------------------|
91
+ | Ruby on Rails | MVC: controllers → models (fat model = service+domain) |
92
+ | Django | Views → models (MTV pattern is layered) |
93
+ | Spring Boot (Java) | Controller → Service → Repository |
94
+ | ASP.NET MVC (.NET) | Controller → Service → Repository |
95
+ | Laravel (PHP) | Controller → Service/Model → Eloquent |
96
+ | NestJS (Node) | Controller → Service → Repository/TypeORM |
97
+ | Express.js (Node) | Router → Middleware → Service → DB |
98
+
99
+ When a framework provides a layered scaffold, fighting the default structure imposes a learning penalty on every new hire and increases friction with library documentation.
100
+
101
+ ---
102
+
103
+ ## When NOT to Use It
104
+
105
+ This section is equally important as "When to Use It." Most architectural debt in production systems originates from continuing to use layered architecture past the point where it stops delivering value.
106
+
107
+ ### The Sinkhole Anti-Pattern
108
+
109
+ The most common failure indicator. A sinkhole occurs when requests pass through every layer without any layer adding meaningful work:
110
+
111
+ ```
112
+ Controller.getUser(id)
113
+ → UserService.getUser(id) // just calls repository
114
+ → UserRepository.findById(id) // just calls ORM
115
+ → ORM.find(User, id) // executes SELECT
116
+ ```
117
+
118
+ Every layer adds a method call and a file to navigate, but no layer contributes logic. The business layer is a thin wrapper around the data layer.
119
+
120
+ **The 80-20 diagnostic rule** (from Mark Richards, "Software Architecture Patterns"): If 80% of your request paths are sinkholes — passing through every layer with no real processing — layered architecture is the wrong choice for your problem domain. A 20% sinkhole rate is acceptable; an 80% rate is a signal to restructure. At that point, you are paying the cost of layering (indirection, boilerplate, navigation overhead) without receiving its benefit (isolation of complex logic per layer).
121
+
122
+ ### The God Service Anti-Pattern
123
+
124
+ Layered architecture concentrates all business logic into the "service" layer. As features accumulate, a `UserService` that started at 200 lines grows to 2,000, then 5,000, then 10,000 lines. It handles registration, authentication, profile updates, password resets, admin operations, billing integrations, audit logging, and notification dispatch — all because "it involves a user."
125
+
126
+ This is not a failure of individual developers; it is a structural consequence of having a single "business logic layer" with no further organizing principle. The service layer is a God Object waiting to happen in any sufficiently complex application.
127
+
128
+ **Signs the service layer has become a God Object:**
129
+ - Service class files exceed 500 lines
130
+ - Service methods take 5+ parameters
131
+ - Service tests require mocking 6+ dependencies
132
+ - Two unrelated features must both import the same service
133
+ - A "simple" change to one feature breaks tests in unrelated features
134
+
135
+ ### When Infrastructure Drives the Domain
136
+
137
+ In layered architecture, the domain model is typically generated from or mirrors the database schema. Entities are ORM models. When this is the case, adding a new business rule requires changing the DB schema, running a migration, and updating every layer simultaneously. The database becomes the architectural authority — the domain is just a reflection of table structure.
138
+
139
+ This is acceptable when the domain is simple and stable. It becomes a serious problem when:
140
+ - Business rules are complex and volatile
141
+ - The domain model needs to represent concepts that do not map cleanly to relational tables
142
+ - Multiple bounded contexts share the same persistence layer and schema changes cascade
143
+
144
+ ### When You Need to Test Business Logic Independently
145
+
146
+ In layered architecture, the business layer imports from the data access layer. A unit test of a service method typically requires either:
147
+ 1. A real database running (integration test, slow, fragile)
148
+ 2. Mocking the repository (fast, but the mock interface leaks DB concerns into tests)
149
+
150
+ If fast, isolated unit tests of business rules are a priority — especially in complex domains — layered architecture structurally makes this harder. Hexagonal/clean architecture solves this by inverting the dependency: the domain defines an interface (port), and tests inject a fake implementation (adapter) with no ORM involved.
151
+
152
+ ### When Team Size Crosses a Threshold
153
+
154
+ Above 15–20 developers, shared horizontal layers become coordination bottlenecks. All feature work converges into the same `services/` directory. Merge conflicts in service files become a daily occurrence. No team can own a "layer" — every team touches every layer for every feature. At this scale, vertical slices or modular monoliths — organized by feature or bounded context rather than technical layer — become necessary to restore team autonomy.
155
+
156
+ ### Do Not Use Layered Architecture When:
157
+ - The domain has rich, complex rules that benefit from object-oriented domain modeling (use DDD + hexagonal instead)
158
+ - You expect frequent infrastructure replacement (swap DB engine, switch ORM, add event streaming) — the coupling through layers makes this expensive
159
+ - The team has explicit hexagonal/clean architecture experience and the project will be long-lived
160
+ - The request flow is predominantly event-driven or message-based rather than synchronous request/response
161
+
162
+ ---
163
+
164
+ ## How It Works
165
+
166
+ ### Layer Responsibilities in Detail
167
+
168
+ **Presentation Layer**
169
+
170
+ The presentation layer is the entry point for all external interaction. Its responsibilities are narrow:
171
+
172
+ - Receive and parse HTTP requests (routing, path/query parameter extraction)
173
+ - Input validation (shape and format only — not business rules; "is this a valid email address format?" belongs here; "is this email already registered?" does not)
174
+ - Authentication verification (is the JWT valid? is the session active?)
175
+ - Authorization checks (does this principal have permission to call this endpoint? — coarse-grained only)
176
+ - Serialization of responses (convert domain objects to JSON/XML DTOs)
177
+ - Error mapping (translate domain exceptions to HTTP status codes and error payloads)
178
+
179
+ The presentation layer must contain **zero business logic**. A controller that calls `if user.role == 'admin' and user.accountBalance > 1000` has violated the layer boundary.
180
+
181
+ **Business Logic Layer (Service Layer)**
182
+
183
+ The service layer orchestrates the application's actual work:
184
+
185
+ - Coordinate multiple data access operations into a single workflow
186
+ - Enforce business rules ("a user cannot place an order while their account is suspended")
187
+ - Perform transformations and calculations that are meaningful to the domain
188
+ - Raise domain events
189
+ - Manage transaction boundaries (start, commit, rollback)
190
+ - Call external service integrations (email dispatch, payment gateway)
191
+
192
+ The service layer depends on the data access layer. It should not know whether the data is stored in PostgreSQL, MongoDB, or an in-memory cache. In practice, when using an ORM, this separation is often compromised because ORM entities carry database concerns directly into service code.
193
+
194
+ **Data Access Layer (Repository / Persistence Layer)**
195
+
196
+ The data access layer isolates the mechanics of storage:
197
+
198
+ - Execute queries (SQL, ORM, document queries)
199
+ - Map between domain objects and persistence representations
200
+ - Manage connection pooling and ORM sessions
201
+ - Implement caching strategies (query-level caching, second-level cache)
202
+ - Handle database-specific concerns (pagination, sorting, full-text search)
203
+
204
+ Repositories are the standard abstraction. Each repository provides a collection-like interface (`findById`, `findAll`, `save`, `delete`) that hides how data is physically fetched. When repositories are done well, swapping the underlying database means reimplementing the repository — the service layer is untouched.
205
+
206
+ **Database Layer**
207
+
208
+ The actual storage engine. SQL (PostgreSQL, MySQL, SQLite), NoSQL (MongoDB, DynamoDB, Redis), or file-based. This is not "your code" — it is infrastructure. The data access layer shields the rest of the application from the specifics of this layer.
209
+
210
+ ### Cross-Cutting Concerns
211
+
212
+ Some concerns span all layers. The canonical approach:
213
+
214
+ | Concern | Where It Lives |
215
+ |---------|---------------|
216
+ | Request logging | Middleware (before presentation layer) |
217
+ | Authentication | Middleware or presentation layer |
218
+ | Authorization (fine-grained) | Business logic layer |
219
+ | Transaction management | Business logic layer or AOP/decorators |
220
+ | Error handling (application-level) | Middleware or global exception handler |
221
+ | Observability / metrics | Middleware + AOP instrumentation |
222
+ | Input sanitization | Presentation layer |
223
+ | Audit logging | Business logic layer (closest to intent) |
224
+
225
+ ### Communication Patterns
226
+
227
+ **Synchronous downward calls**: The standard pattern. A controller calls a service method. The service calls a repository method. The repository executes a query. Results flow back up the stack synchronously.
228
+
229
+ **DTOs (Data Transfer Objects) between layers**: Each layer boundary should use its own data shape. The presentation layer receives an HTTP payload and maps it to a "request DTO" or "command object" before passing to the service. The service returns a "result DTO" that the controller serializes to JSON. The domain/entity object should not be directly serialized in the response — doing so leaks internal structure and creates implicit contracts with API consumers.
230
+
231
+ ```
232
+ HTTP Request Body → RequestDTO (presentation) → ServiceCommand → DomainEntity → ResponseDTO → HTTP Response Body
233
+ ```
234
+
235
+ **Dependency Injection**: Layers depend on abstractions, not concrete implementations. The service layer declares a dependency on `IUserRepository` (an interface). The DI container injects `PostgresUserRepository` (the concrete class) at runtime. This enables testing with mock repositories and, in principle, swapping implementations.
236
+
237
+ ### Strict vs Relaxed Layering in Practice
238
+
239
+ Teams often start with strict layering intentions and drift toward relaxed layering under delivery pressure. A pragmatic policy: allow relaxed layering only for infrastructure utilities (logging, config) that are genuinely cross-cutting. Enforce strict layering for the core data flow (presentation → business → persistence). Code review should flag any direct repository call from a controller.
240
+
241
+ ---
242
+
243
+ ## Trade-Offs Matrix
244
+
245
+ | You Get | You Pay |
246
+ |---------|---------|
247
+ | **Familiarity** — every developer knows the pattern; zero ramp-up time | **Service layer bloat** — all business logic collapses into a single layer that grows without bound |
248
+ | **Simplicity** — folder structure is predictable; new features follow an obvious path | **Sinkhole anti-pattern risk** — pass-through layers add indirection with no logical value |
249
+ | **Clear separation of HTTP from persistence** — controllers don't write SQL | **Domain logic tangled with infrastructure** — ORM entities bleed into business rules |
250
+ | **Works well for CRUD** — validation → transform → store maps naturally to the layer structure | **Hard to unit-test business logic** — service tests require mocking DB or spinning up test DB |
251
+ | **Framework alignment** — scaffolds, tutorials, and documentation all use this structure | **God Service risk** — no structural mechanism prevents a single service class from accumulating all logic |
252
+ | **Parallel team development** — frontend, backend, and DBA teams can work independently on their layer | **Horizontal coupling** — a feature change touches presentation, service, and data layers simultaneously |
253
+ | **Incremental delivery** — each layer can be built and tested independently during initial development | **Change ripple effect** — a new field on a DB table often requires changes in 4 files across 3 layers |
254
+ | **Audit and compliance-friendly** — clear layer for security checks and logging | **Poor domain expressiveness** — the "business logic layer" is often just CRUD orchestration, not real domain modeling |
255
+ | **Well-understood scaling path** — physical tier separation (3-tier deployment) is documented and supported by cloud providers | **Scaling is coarse-grained** — you cannot scale "the order processing feature"; you scale the entire business layer |
256
+
257
+ ---
258
+
259
+ ## Evolution Path
260
+
261
+ ### Phase 0 — Start Here: Layered Monolith
262
+
263
+ Every new project should start as a layered monolith unless there is a compelling reason not to. The pattern is simple, well-understood, and cheap to build. Premature architectural sophistication is a form of over-engineering.
264
+
265
+ ```
266
+ my-app/
267
+ controllers/ (presentation)
268
+ services/ (business logic)
269
+ repositories/ (data access)
270
+ models/ (entities / ORM models)
271
+ config/
272
+ tests/
273
+ ```
274
+
275
+ ### Phase 1 — Pain Signal: Service Layer Becoming a God Object
276
+
277
+ When service classes exceed 500 lines, multiple teams are editing the same service file, or a "simple" feature requires touching 6 services, the flat service layer has outgrown the architecture.
278
+
279
+ **First response**: Extract domain classes. Move business rules out of service methods and into rich domain objects. `UserService.canPlaceOrder(user, cart)` becomes `user.canPlaceOrder(cart)`. The service orchestrates; the domain object enforces rules.
280
+
281
+ ### Phase 2 — Pain Signal: Infrastructure Coupling Blocking Change
282
+
283
+ When swapping the database, adding a message queue, or integrating a new external API requires changes throughout the service layer, the layered coupling has become expensive.
284
+
285
+ **Response**: Introduce port interfaces. Define `IOrderRepository` in the business layer. Move the concrete implementation (`PostgresOrderRepository`) to an infrastructure layer. This is the step that converts layered architecture into hexagonal architecture.
286
+
287
+ ```
288
+ Hexagonal transition:
289
+ domain/ (pure business logic, no imports from infra)
290
+ application/ (use cases, port interfaces defined here)
291
+ adapters/
292
+ http/ (was: presentation layer)
293
+ persistence/ (was: data access layer)
294
+ messaging/ (new: event-driven integrations)
295
+ ```
296
+
297
+ The migration is incremental: refactor one service/repository pair at a time. Do not attempt a big-bang rewrite.
298
+
299
+ ### Phase 3 — Pain Signal: Teams Blocked by Shared Layers
300
+
301
+ When 20+ developers are all committing to the same `services/` directory and merge conflicts are daily, horizontal layers have become coordination bottlenecks.
302
+
303
+ **Response**: Introduce module boundaries. Group code by bounded context or feature domain, then apply layers within each module.
304
+
305
+ ```
306
+ Modular monolith:
307
+ modules/
308
+ orders/
309
+ controllers/, services/, repositories/
310
+ billing/
311
+ controllers/, services/, repositories/
312
+ users/
313
+ controllers/, services/, repositories/
314
+ ```
315
+
316
+ Inter-module communication goes through explicit interfaces, not direct service imports. Each module can eventually become a microservice if needed — the module boundary is the extraction seam.
317
+
318
+ ### Alternative Evolution: Vertical Slices
319
+
320
+ Instead of deepening the horizontal layers, some teams pivot to vertical slice architecture (popularized by Jimmy Bogard for .NET, applicable broadly). Each feature is a self-contained slice:
321
+
322
+ ```
323
+ features/
324
+ CreateOrder/
325
+ CreateOrderRequest.ts
326
+ CreateOrderHandler.ts
327
+ CreateOrderValidator.ts
328
+ CreateOrderQuery.ts (if it also needs DB access)
329
+ GetOrderHistory/
330
+ ...
331
+ ```
332
+
333
+ Vertical slices eliminate the "which layer does this go in?" question. They reduce merge conflicts because two features rarely touch the same files. They come at the cost of code sharing — common patterns must be explicitly extracted to a `shared/` module to avoid duplication.
334
+
335
+ ### Migration Heuristics
336
+
337
+ | Condition | Action |
338
+ |-----------|--------|
339
+ | Service class > 500 lines | Extract domain objects; push rules into the domain |
340
+ | > 20 devs sharing same service directory | Introduce module boundaries (modular monolith) |
341
+ | Infrastructure swap required | Introduce port interfaces → hexagonal |
342
+ | 80%+ sinkhole request paths | Consider vertical slices |
343
+ | Sinkhole < 20% of paths | Open the layers (allow skipping) to reduce boilerplate |
344
+ | Microservices being considered | First go modular monolith; only then extract services |
345
+
346
+ ---
347
+
348
+ ## Failure Modes
349
+
350
+ ### 1. The Sinkhole Anti-Pattern (Pervasiveness: High)
351
+
352
+ **What it looks like**: A three-layer pass-through where every layer simply calls the next one with no transformation. A `getUser` request goes through `UserController → UserService → UserRepository` and each method is a one-liner wrapping the next.
353
+
354
+ **Why it happens**: Developers feel obligated to respect the layer structure even when a given operation has no logic to put in the business layer. Rather than skipping the layer, they create an empty wrapper method.
355
+
356
+ **Damage**: Navigation overhead multiplied across thousands of files. A simple change requires editing three files in three directories with no architectural benefit.
357
+
358
+ **Fix**: Allow open layering for pure read operations. If a controller genuinely needs to return a list of reference data with no business rules applied, it can call the repository directly. Reserve the service layer for operations that actually have business logic.
359
+
360
+ ---
361
+
362
+ ### 2. God Service Anti-Pattern (Pervasiveness: Very High)
363
+
364
+ **What it looks like**: `UserService` with 5,000 lines handling registration, login, password reset, profile management, admin operations, session management, billing hooks, and notification triggers.
365
+
366
+ **Why it happens**: The service layer provides no organizing principle beyond "things that involve this entity." Every feature that touches a `User` record lands in `UserService` because there is nowhere else for it to go.
367
+
368
+ **Real-world scale**: In a mid-sized e-commerce monolith, a single `OrderService` accumulated 8,400 lines over three years. Adding the "split order into partial shipments" feature required 4 hours just to understand the existing code before writing a single line. The service had 23 injected dependencies.
369
+
370
+ **Fix**: Introduce sub-services per use case (`OrderCreationService`, `OrderFulfillmentService`, `OrderCancellationService`), or refactor to domain objects where the entity itself carries the rules. At scale, apply module boundaries.
371
+
372
+ ---
373
+
374
+ ### 3. Fat Controller (Pervasiveness: Medium)
375
+
376
+ **What it looks like**: Business logic accumulates in the controller/handler layer because "it's easier not to create a new service method." A 300-line controller method that validates business rules, fetches multiple entities, performs calculations, and builds complex response payloads.
377
+
378
+ **Why it happens**: Developer time pressure. A service method call requires creating the service, injecting it, writing the method signature, and writing a test. A controller method is already open in the editor.
379
+
380
+ **Damage**: Business logic is untestable without spinning up the HTTP stack. Logic cannot be reused from other entry points (async jobs, CLI commands, other controllers).
381
+
382
+ **Fix**: Code review policy: controllers must not contain `if` statements that implement business rules. Flag any controller method exceeding 30 lines.
383
+
384
+ ---
385
+
386
+ ### 4. Domain Model == Database Schema (Pervasiveness: High)
387
+
388
+ **What it looks like**: The "domain model" is a set of ORM entity classes that mirror database tables 1:1. A `User` entity has fields for every column in the `users` table. Business methods do not exist on the entity — they live in services.
389
+
390
+ **Why it happens**: ORMs make it easy to generate entity classes from schemas. When the data model is the domain model, there is no distinction between the two.
391
+
392
+ **Damage**: Adding a business rule requires changing the DB schema. Schema migrations become the gating factor on feature delivery. Domain concepts that span multiple tables have no home. Business logic cannot be reasoned about independently of storage structure.
393
+
394
+ **Fix**: When the domain becomes complex enough that this coupling is painful, introduce a separate domain layer where objects express business concepts, and a mapping layer that translates between domain objects and ORM entities.
395
+
396
+ ---
397
+
398
+ ### 5. Scattered Logic Across All Layers (Pervasiveness: Medium)
399
+
400
+ **What it looks like**: The same validation rule exists in the controller, the service, and the repository. Business decisions are made in SQL queries (`WHERE status = 'active' AND NOT suspended`) that duplicate rules in the service layer. Authorization logic appears in three different places.
401
+
402
+ **Why it happens**: No ownership of "where does this rule live?" Different developers made different choices. Copy-paste spread a rule before a canonical home was established.
403
+
404
+ **Damage**: Changing the rule requires finding all occurrences. Missing one occurrence creates inconsistent behavior. A change to the DB query does not update the service-layer check.
405
+
406
+ **Fix**: Explicit policy: business rules live in the service layer. Presentation layer validates shape only. DB queries are parameterized by the service; they do not embed business rules as SQL predicates.
407
+
408
+ ---
409
+
410
+ ### 6. Layered Architecture Used Past Its Useful Life (Pervasiveness: High)
411
+
412
+ **What it looks like**: A 5-year-old application with 200K lines of code, still organized as a flat `controllers/ services/ repositories/` structure. Every developer knows it is painful but the migration cost seems prohibitive.
413
+
414
+ **Real-world incident**: A fintech company's core banking monolith used a single flat layered structure for 6 years. Adding a "simple" new field to the customer entity required changes in 14 service files, 3 controller files, and 6 test files due to horizontal coupling. A field addition had a median lead time of 3 weeks. The architecture had not evolved past the initial structure despite the codebase growing 40x.
415
+
416
+ **Fix**: Do not attempt a big-bang rewrite. Apply the Strangler Fig pattern: identify bounded contexts, introduce module packages, move code into modules incrementally, enforce module interface contracts, then optionally extract services.
417
+
418
+ ---
419
+
420
+ ## Technology Landscape
421
+
422
+ ### Frameworks That Scaffold Layered Architecture
423
+
424
+ | Framework | Language | Layer Convention |
425
+ |-----------|----------|-----------------|
426
+ | Spring Boot | Java | `@Controller` → `@Service` → `@Repository` |
427
+ | ASP.NET MVC | C# | Controller → Service → Repository (DbContext) |
428
+ | Ruby on Rails | Ruby | Controller → Model (fat model or service objects) |
429
+ | Django | Python | View/Serializer → Model (or Service layer by convention) |
430
+ | Laravel | PHP | Controller → Service/Action → Model (Eloquent) |
431
+ | NestJS | TypeScript | Controller → Service → Repository/TypeORM Entity |
432
+ | Express.js | JavaScript | Router → Middleware → Service → DB Client |
433
+ | Gin / Echo | Go | Handler → Service → Repository → SQL |
434
+ | Phoenix | Elixir | Controller → Context (business logic) → Ecto Schema |
435
+ | Symfony | PHP | Controller → Service → Repository (Doctrine) |
436
+
437
+ Spring Boot, ASP.NET, and Laravel provide the most opinionated layered scaffolding with first-class DI containers that make the pattern easy to implement cleanly.
438
+
439
+ ### ORM Tools (Data Access Layer)
440
+
441
+ | Tool | Ecosystem | Notes |
442
+ |------|-----------|-------|
443
+ | Hibernate / JPA | Java | Industry standard; powerful but leaks DB concerns |
444
+ | Entity Framework | .NET | Code-first migrations; tight ORM/domain coupling by default |
445
+ | ActiveRecord | Ruby/Rails | Fat model pattern; service layer often added separately |
446
+ | Sequelize / TypeORM / Prisma | Node.js | Prisma generates type-safe queries; TypeORM supports DDD patterns |
447
+ | SQLAlchemy | Python | Supports both data mapper and active record patterns |
448
+ | Doctrine | PHP | Data Mapper pattern; better domain separation than ActiveRecord |
449
+ | GORM | Go | Simple active record; clean repository wrappers common |
450
+
451
+ ### Architectural Comparisons
452
+
453
+ **Layered vs Hexagonal/Clean Architecture**
454
+
455
+ The key migration trigger: when the business layer needs to import from the persistence layer, you have layered architecture. When the persistence layer implements an interface defined by the business layer, you have hexagonal. The dependency inversion principle is the dividing line.
456
+
457
+ | Aspect | Layered | Hexagonal/Clean |
458
+ |--------|---------|-----------------|
459
+ | Dependency direction | Top-down (presentation → business → persistence) | Inward (infrastructure → application → domain) |
460
+ | DB coupling | Domain depends on DB layer | DB implements domain port |
461
+ | Test isolation | Requires mocking DB | Domain tested without DB |
462
+ | Learning curve | Low | Medium-High |
463
+ | CRUD suitability | Excellent | Overengineered for simple CRUD |
464
+ | Complex domain suitability | Poor (God Service risk) | Excellent |
465
+ | Framework alignment | Matches most frameworks | Requires deliberate structure |
466
+
467
+ **Layered vs Vertical Slices**
468
+
469
+ | Aspect | Layered (Horizontal) | Vertical Slices |
470
+ |--------|---------------------|-----------------|
471
+ | Code organization | By technical role | By feature/use case |
472
+ | Merge conflict risk | High (shared service files) | Low (feature-isolated) |
473
+ | Code sharing | Easy (shared service layer) | Explicit (shared/ module required) |
474
+ | Team autonomy | Low (shared layers) | High (own your slice) |
475
+ | Onboarding | Trivial (universal pattern) | Moderate (feature-finding) |
476
+ | CRUD suitability | Good | Good |
477
+ | Complex feature suitability | Poor (God Service) | Good |
478
+
479
+ ---
480
+
481
+ ## Decision Tree
482
+
483
+ ```
484
+ New project?
485
+ ├── Small team (1-10 devs) + mostly CRUD?
486
+ │ └── YES → Layered architecture is the correct default.
487
+ │ Use controllers/services/repositories.
488
+
489
+ ├── Complex domain with rich business rules?
490
+ │ └── YES → Consider hexagonal/clean from the start.
491
+ │ Layered will become painful within 12-18 months.
492
+
493
+ └── Large team (20+ devs) needing feature ownership?
494
+ └── YES → Vertical slices or modular monolith.
495
+ Horizontal layers will become coordination bottlenecks.
496
+
497
+ Existing layered project?
498
+ ├── Service classes > 2,000 lines?
499
+ │ └── YES → Introduce domain objects; extract sub-services.
500
+ │ Consider migration to hexagonal.
501
+
502
+ ├── 80%+ of requests are pass-through sinkholes?
503
+ │ └── YES → Open the layers (allow skipping) OR
504
+ │ pivot to vertical slice architecture.
505
+
506
+ ├── Need to test business rules without DB?
507
+ │ └── YES → Introduce port interfaces → hexagonal migration path.
508
+
509
+ ├── DB swap or major infrastructure change needed?
510
+ │ └── YES → Introduce repository interfaces; decouple domain from ORM entities.
511
+
512
+ ├── Team > 20 devs, merge conflicts daily?
513
+ │ └── YES → Introduce module boundaries → modular monolith.
514
+ │ Do NOT jump straight to microservices.
515
+
516
+ └── Everything working, team happy, feature velocity acceptable?
517
+ └── Stay with layered architecture. It is working.
518
+ Architecture evolution should be driven by real pain, not theory.
519
+ ```
520
+
521
+ ---
522
+
523
+ ## Implementation Sketch
524
+
525
+ ### Folder Structure
526
+
527
+ ```
528
+ src/
529
+ ├── controllers/ # Presentation layer
530
+ │ ├── userController.ts
531
+ │ └── orderController.ts
532
+ ├── services/ # Business logic layer
533
+ │ ├── userService.ts
534
+ │ └── orderService.ts
535
+ ├── repositories/ # Data access layer
536
+ │ ├── userRepository.ts
537
+ │ └── orderRepository.ts
538
+ ├── models/ # ORM entities / domain models
539
+ │ ├── User.ts
540
+ │ └── Order.ts
541
+ ├── dto/ # Data Transfer Objects (per-layer contracts)
542
+ │ ├── createUserDto.ts
543
+ │ └── userResponseDto.ts
544
+ ├── middleware/ # Cross-cutting concerns
545
+ │ ├── authMiddleware.ts
546
+ │ └── errorHandler.ts
547
+ └── config/
548
+ └── database.ts
549
+ ```
550
+
551
+ ### Request Flow (TypeScript / NestJS-style)
552
+
553
+ **1. Controller (presentation layer)**
554
+
555
+ ```typescript
556
+ // controllers/userController.ts
557
+ @Controller('/users')
558
+ export class UserController {
559
+ constructor(private readonly userService: UserService) {}
560
+
561
+ @Post()
562
+ async createUser(@Body() dto: CreateUserDto): Promise<UserResponseDto> {
563
+ // Validate shape only (email format, required fields)
564
+ // No business rules here
565
+ const user = await this.userService.createUser(dto);
566
+ return UserResponseDto.from(user);
567
+ }
568
+
569
+ @Get(':id')
570
+ async getUser(@Param('id') id: string): Promise<UserResponseDto> {
571
+ const user = await this.userService.getById(id);
572
+ if (!user) throw new NotFoundException();
573
+ return UserResponseDto.from(user);
574
+ }
575
+ }
576
+ ```
577
+
578
+ **2. Service (business logic layer)**
579
+
580
+ ```typescript
581
+ // services/userService.ts
582
+ @Injectable()
583
+ export class UserService {
584
+ constructor(
585
+ private readonly userRepository: UserRepository,
586
+ private readonly emailService: EmailService,
587
+ ) {}
588
+
589
+ async createUser(dto: CreateUserDto): Promise<User> {
590
+ // Business rule: email must be unique
591
+ const existing = await this.userRepository.findByEmail(dto.email);
592
+ if (existing) throw new ConflictException('Email already registered');
593
+
594
+ // Business rule: password complexity enforced here, not in controller
595
+ if (!isStrongPassword(dto.password)) {
596
+ throw new BadRequestException('Password does not meet requirements');
597
+ }
598
+
599
+ const user = new User({
600
+ email: dto.email,
601
+ passwordHash: await hashPassword(dto.password),
602
+ createdAt: new Date(),
603
+ });
604
+
605
+ const saved = await this.userRepository.save(user);
606
+ await this.emailService.sendWelcome(saved.email);
607
+ return saved;
608
+ }
609
+
610
+ async getById(id: string): Promise<User | null> {
611
+ return this.userRepository.findById(id);
612
+ }
613
+ }
614
+ ```
615
+
616
+ **3. Repository (data access layer)**
617
+
618
+ ```typescript
619
+ // repositories/userRepository.ts
620
+ @Injectable()
621
+ export class UserRepository {
622
+ constructor(
623
+ @InjectRepository(UserEntity)
624
+ private readonly orm: Repository<UserEntity>,
625
+ ) {}
626
+
627
+ async findById(id: string): Promise<User | null> {
628
+ const entity = await this.orm.findOne({ where: { id } });
629
+ return entity ? UserMapper.toDomain(entity) : null;
630
+ }
631
+
632
+ async findByEmail(email: string): Promise<User | null> {
633
+ const entity = await this.orm.findOne({ where: { email } });
634
+ return entity ? UserMapper.toDomain(entity) : null;
635
+ }
636
+
637
+ async save(user: User): Promise<User> {
638
+ const entity = UserMapper.toEntity(user);
639
+ const saved = await this.orm.save(entity);
640
+ return UserMapper.toDomain(saved);
641
+ }
642
+ }
643
+ ```
644
+
645
+ **4. DTO definitions**
646
+
647
+ ```typescript
648
+ // dto/createUserDto.ts
649
+ export class CreateUserDto {
650
+ @IsEmail()
651
+ email: string;
652
+
653
+ @IsString()
654
+ @MinLength(8)
655
+ password: string;
656
+
657
+ @IsString()
658
+ @IsNotEmpty()
659
+ displayName: string;
660
+ }
661
+
662
+ // dto/userResponseDto.ts
663
+ export class UserResponseDto {
664
+ id: string;
665
+ email: string;
666
+ displayName: string;
667
+ createdAt: string;
668
+
669
+ static from(user: User): UserResponseDto {
670
+ return {
671
+ id: user.id,
672
+ email: user.email,
673
+ displayName: user.displayName,
674
+ createdAt: user.createdAt.toISOString(),
675
+ // NOTE: passwordHash is NOT included — DTO prevents leaking internals
676
+ };
677
+ }
678
+ }
679
+ ```
680
+
681
+ **5. Dependency injection configuration**
682
+
683
+ ```typescript
684
+ // app.module.ts (NestJS) or equivalent DI config
685
+ @Module({
686
+ imports: [TypeOrmModule.forFeature([UserEntity])],
687
+ controllers: [UserController],
688
+ providers: [
689
+ UserService,
690
+ UserRepository,
691
+ EmailService,
692
+ ],
693
+ })
694
+ export class UserModule {}
695
+ ```
696
+
697
+ ### What This Buys You
698
+
699
+ - Controllers have no business logic — they are HTTP adapters only
700
+ - Service methods are independently testable (inject a mock `UserRepository`)
701
+ - DTOs prevent accidental leakage of internal fields in API responses
702
+ - Repository isolates the ORM — swapping TypeORM for Prisma means rewriting only `UserRepository`
703
+ - DI makes dependencies explicit and swappable without modifying calling code
704
+
705
+ ### What to Watch For
706
+
707
+ - When `UserService` exceeds 300 lines, it is time to split by use case
708
+ - If the controller starts calling `userRepository` directly, the architecture has broken down
709
+ - When `UserResponseDto` starts including deeply nested objects from multiple entities, the query belongs in a dedicated read model or query service
710
+ - The moment you write `UserService` constructor with 8 `@Inject()` parameters, a refactor is overdue
711
+
712
+ ---
713
+
714
+ ## Cross-References
715
+
716
+ - **hexagonal-clean-architecture** — The natural evolution when domain complexity or testability requirements outgrow layered architecture. Introduces dependency inversion at the persistence boundary.
717
+ - **modular-monolith** — Applies module boundaries on top of layered architecture. Organizes layers by business domain rather than a single flat namespace. The recommended intermediate step before microservices.
718
+ - **separation-of-concerns** — The foundational principle that layered architecture implements. Understanding SoC explains why layer violations are costly.
719
+ - **monolith** — Layered architecture is the most common structure for a monolith. Understanding monolith trade-offs informs when to stay layered vs. when to decompose.
720
+ - **domain-driven-design** — DDD becomes relevant when the service layer is accumulating complex rules. DDD provides the vocabulary (aggregates, value objects, domain events) for structuring a richer domain layer.
721
+
722
+ ---
723
+
724
+ *Researched: 2026-03-08 | Sources:*
725
+ - *[Understanding the Layered Architecture Pattern — DEV Community](https://dev.to/yasmine_ddec94f4d4/understanding-the-layered-architecture-pattern-a-comprehensive-guide-1e2j)*
726
+ - *[Software Architecture Patterns: Layered Architecture — O'Reilly](https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/ch01.html)*
727
+ - *[The Pros and Cons of a Layered Architecture Pattern — TechTarget](https://www.techtarget.com/searchapparchitecture/tip/The-pros-and-cons-of-a-layered-architecture-pattern)*
728
+ - *[N-Tier Architecture Style — Microsoft Azure Architecture Center](https://learn.microsoft.com/en-us/azure/architecture/guide/architecture-styles/n-tier)*
729
+ - *[Architecture Sinkhole Anti-Pattern — Candost's Blog](https://candost.blog/notes/45a/)*
730
+ - *[Vertical Slice Architecture — Jimmy Bogard](https://www.jimmybogard.com/vertical-slice-architecture/)*
731
+ - *[N-Layered vs Clean vs Vertical Slice Architecture — Anton Dev Tips](https://antondevtips.com/blog/n-layered-vs-clean-vs-vertical-slice-architecture)*
732
+ - *[Understanding Hexagonal, Clean, Onion, and Traditional Layered Architectures — Medium](https://romanglushach.medium.com/understanding-hexagonal-clean-onion-and-traditional-layered-architectures-a-deep-dive-c0f93b8a1b96)*
733
+ - *[What Is Three-Tier Architecture — IBM](https://www.ibm.com/think/topics/three-tier-architecture)*
734
+ - *[Layered Architecture and Service Based Development — Why Not Use It — Medium](https://medium.com/@johnnywiller10/layered-architecture-and-service-based-development-why-no-9378b146b0ef)*
735
+ - *[Exploring The Model-View-Controller (MVC) Architecture — Preprints.org](https://www.preprints.org/manuscript/202404.1860)*
736
+ - *[Layered Monolith — microservices.io](https://microservices.io/articles/draftZZZ/monolith-patterns/layered-monolith.html)*