@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,797 @@
1
+ # The Twelve-Factor App — Architecture Expertise Module
2
+
3
+ > The Twelve-Factor App methodology is a set of principles for building modern, cloud-ready SaaS applications that are portable, scalable, and maintainable. Developed at Heroku circa 2011, it remains the foundation for cloud-native application design.
4
+
5
+ > **Category:** Foundation
6
+ > **Complexity:** Moderate
7
+ > **Applies when:** Building SaaS applications that will be deployed to cloud infrastructure, especially when using containers or PaaS platforms
8
+
9
+ ---
10
+
11
+ ## What This Is (and What It Isn't)
12
+
13
+ ### Origin
14
+
15
+ In 2011, Heroku co-founder Adam Wiggins published The Twelve-Factor App (12factor.net) as a companion piece to the Cedar stack launch — the first Heroku runtime that supported multiple languages, worker processes, log streaming, and everything that completed the vision of a true PaaS. Wiggins and his colleagues had personally observed hundreds of thousands of deployments and distilled the patterns that made apps work well — and the anti-patterns that caused operational pain.
16
+
17
+ The twelve factors are explicitly a set of contracts an application makes with its runtime environment. Each factor describes one dimension of that contract: how the app manages its code, its dependencies, its configuration, its I/O, its processes. The methodology is deliberately environment-agnostic — it predates Docker, Kubernetes, and the word "cloud-native," yet describes exactly what those systems require.
18
+
19
+ In November 2024, Heroku (then under Salesforce) open-sourced the methodology under a CC-BY-4.0 license, moving it to a GitHub repository (github.com/twelve-factor/twelve-factor) with AWS and Google as maintainers. This was an acknowledgment that the ecosystem had moved far beyond 2011 and that the document needed community governance to evolve — particularly around Kubernetes, GitOps, workload identity, and observability.
20
+
21
+ ### What a "Factor" Means
22
+
23
+ A factor is not a feature request to your framework. It is a design constraint the application accepts so that the platform — PaaS, container scheduler, orchestrator — can operate it reliably without application-specific knowledge. The platform does not know what your app does; it only knows that your app obeys the contract. That is what makes portability possible.
24
+
25
+ ### What It Is NOT
26
+
27
+ - **Not a microservices methodology.** The factors apply equally to a monolith and a 500-service mesh. Factor VIII (concurrency via process model) supports decomposition but does not mandate it.
28
+ - **Not a containerization guide.** Docker and Kubernetes are implementations that happen to enforce most factors. The factors themselves predate containers.
29
+ - **Not a security framework.** Security is largely absent from the original twelve. Kevin Hoffman's "Beyond the Twelve-Factor App" (O'Reilly, 2016) adds it as factor XIII (Security). The 2024 community refresh proposes adding an "Identity" factor explicitly.
30
+ - **Not a microservices mandate.** Teams frequently mistake "stateless processes" (Factor VI) and "concurrency via process model" (Factor VIII) as requirements to break up the application. They are not.
31
+ - **Not applicable as a religion.** The correct posture is: apply each factor when its benefit justifies its cost, skip or adapt when it conflicts with your constraints. Factors are levers, not commandments.
32
+
33
+ ### Beyond Twelve-Factor: Kevin Hoffman's 15 Factors
34
+
35
+ Kevin Hoffman's 2016 O'Reilly book walks through all twelve original factors and proposes three additions, making fifteen:
36
+
37
+ | # | Additional Factor | What It Adds |
38
+ |---|---|---|
39
+ | XIII | **Telemetry** | APM, health checks, business KPI streams. The three pillars of observability (logs, metrics, traces) — not just logs (Factor XI). |
40
+ | XIV | **Security** | Authentication and authorization built into the design. RBAC or ABAC on every endpoint. Secrets treated as first-class concerns, not afterthoughts. |
41
+ | XV | **API First** | Every app is designed as a backing service with a public contract before implementation begins. Enables parallel team development and treats every component as composable infrastructure. |
42
+
43
+ The 2024 community refresh has further proposed an **Identity** factor covering workload identity (SPIFFE/SPIRE, cloud IAM), recognizing that service-to-service authentication is now a first-class operational concern that environment variables alone cannot address.
44
+
45
+ ### Common Misconceptions
46
+
47
+ 1. "Factor III means all config must be env vars." The factor says config must not be in code. It does not prohibit config files — it prohibits config files committed to the repository.
48
+ 2. "We follow 12-factor because we use Docker." Container use is necessary but not sufficient. A Dockerized app that reads a hardcoded database URL from source code violates Factor III regardless of how it is packaged.
49
+ 3. "12-factor is only for big apps." The factors that pay off immediately regardless of scale are I (codebase), II (dependencies), III (config), and XI (logs). A two-person startup benefits from those four from day one.
50
+
51
+ ---
52
+
53
+ ## When to Use It
54
+
55
+ Apply the Twelve-Factor methodology — or use it as your baseline checklist — in these situations:
56
+
57
+ **Cloud SaaS applications.** Any application deployed to a PaaS (Heroku, Railway, Render, Fly.io) or a container orchestrator (Kubernetes, ECS, Cloud Run) will find that the platform was designed around these factors. Fighting them creates operational debt.
58
+
59
+ **CI/CD pipelines.** Factor V (Build/Release/Run separation) is the foundation of every modern deployment pipeline. Immutable build artifacts, versioned releases, and separate run-stage configuration are directly embodied in GitHub Actions → Docker registry → Helm chart workflows.
60
+
61
+ **Multi-environment deployments.** Any application that needs to run identically in dev, staging, and production — with only configuration differing — is a textbook 12-factor scenario. Factors III and X together define the entire multi-environment strategy.
62
+
63
+ **Teams practicing DevOps.** The factors create clean interfaces between the developer (who owns the app contract) and the operator (who owns the platform). Factor XI (logs as streams) and Factor XII (admin processes as one-off commands) are particularly valuable for on-call teams.
64
+
65
+ **Container-based deployments.** Kubernetes natively implements most factors: ConfigMaps and Secrets (Factor III), Deployments with immutable image tags (Factor V), Deployments vs StatefulSets (Factor VI), Services (Factor VII), HPA (Factor VIII), graceful termination with SIGTERM (Factor IX), Jobs and CronJobs (Factor XII).
66
+
67
+ **Real-world implicit adoption.** As of 2025, the majority of modern cloud-native teams follow most of these factors without knowing they are following a named methodology. Platform choices (Railway, Fly.io, GCP Cloud Run, AWS App Runner) enforce factors I, III, V, VI, VII, VIII, IX, and XI automatically. Teams "add" 12-factor by becoming conscious of the factors their platform does not enforce — typically II (dependency isolation), X (dev/prod parity), and XII (admin processes).
68
+
69
+ ---
70
+
71
+ ## When NOT to Use It
72
+
73
+ These are as important as the positive cases. Applying factors where they add friction without benefit is a form of over-engineering.
74
+
75
+ ### Desktop, Embedded, and CLI Applications
76
+
77
+ Factor VII (port binding) is meaningless for a CLI tool. Factor VIII (concurrency via process model) does not apply to a single-user desktop application. Factor XI (logs as streams to stdout) is appropriate but not unique to 12-factor. Apply factors II and IX selectively; skip the rest.
78
+
79
+ ### Factor III: Config in Environment — The Pragmatic Limit
80
+
81
+ The strictest reading of Factor III — every configuration value as an individual environment variable — breaks down at scale:
82
+
83
+ - **Large structured config** (e.g., a routing table with 200 entries, a JSON policy document, a multi-level feature flag tree) is not ergonomic as flat env vars. Structured config files (YAML, TOML, JSON) loaded from a secrets manager volume or a mounted ConfigMap are better solutions that satisfy the spirit (config not in code) while using the right data structure.
84
+ - **Secrets.** Storing secrets in environment variables is increasingly discouraged. Most logging and observability platforms capture environment variable dumps on crash, leaking secrets. Modern practice uses secrets managers (HashiCorp Vault, AWS Secrets Manager, GCP Secret Manager, Doppler) that inject secrets at runtime via files or short-lived env vars with audit trails. The 2024 community refresh explicitly addresses this.
85
+ - **Dynamic config.** Factor III was written for static per-deploy configuration. Per-request, per-tenant, or per-feature-flag configuration — where config varies not between deploys but between requests — requires a different system entirely (a feature flag service, a remote config platform).
86
+
87
+ ### Factor VI: Stateless Processes — Conflicts with Stateful Protocols
88
+
89
+ Factor VI (stateless processes, shared-nothing architecture) directly conflicts with:
90
+
91
+ - **WebSocket servers** that maintain per-connection state in process memory. Long-lived connections tied to a specific process instance cannot be freely routed across a stateless fleet without a broker (Redis pub/sub, etc.) or sticky sessions — which Factor VI explicitly forbids.
92
+ - **Stateful streaming pipelines.** Systems like Kafka Streams or Flink maintain per-partition state that lives with the process. This is intentional and well-understood. The "state belongs in a backing service" prescription works only if the backing service has the right performance characteristics.
93
+ - **In-process caches.** Many high-performance applications use in-process LRU caches for latency reasons that a remote Redis cannot match. This is a deliberate trade-off, not an anti-pattern.
94
+
95
+ ### Factor VIII: Concurrency — Doesn't Map to Serverless
96
+
97
+ Factor VIII describes concurrency through a process model: you scale by running more processes of a given type. In serverless (AWS Lambda, Google Cloud Functions, Azure Functions), concurrency is managed entirely by the platform — you cannot reason about "process types" and "process counts." The factor's framing becomes misleading. See the serverless section below.
98
+
99
+ ### Small, Simple Applications
100
+
101
+ For a two-developer internal tool with a single deployment environment, implementing all twelve factors creates setup cost (Docker Compose for dev/prod parity, structured log aggregation, graceful shutdown handlers) that may not be justified. The correct approach: start with factors I, II, III, and XI (the cheapest to adopt and highest ROI), and grow into the rest as the application and team grow.
102
+
103
+ ---
104
+
105
+ ## How It Works
106
+
107
+ ### I. Codebase — One codebase tracked in version control, many deploys
108
+
109
+ **The contract:** There is exactly one codebase per application. Multiple deploys (dev, staging, production, feature environments) are different deployments of the same codebase, differentiated only by configuration.
110
+
111
+ **What this rules out:**
112
+ - Multiple git repositories that are manually synchronized to deploy different environments ("we use branch `prod` for production")
113
+ - Copying files between directories as a deployment mechanism
114
+ - Shared code living only on the production server
115
+
116
+ **Monorepo tensions.** Modern monorepos (a single repository hosting many services) require clarification: each deployable service is still a single logical codebase obeying Factor I. The monorepo is a development convenience; each service within it should have a defined root, its own dependency manifest, and its own deployment pipeline. Factor I is violated if two services share identical source files that are deployed separately — that shared code should be a library (Factor II).
117
+
118
+ **Multi-app monorepos.** Turborepo, Nx, and similar tools handle this by treating each `apps/*` directory as a first-class application with its own build, release, and run pipeline, satisfying Factor I while sharing infrastructure code in `packages/*`.
119
+
120
+ ---
121
+
122
+ ### II. Dependencies — Explicitly declare and isolate dependencies
123
+
124
+ **The contract:** All dependencies are declared in a manifest and isolated so that no implicit dependencies from the surrounding system can leak in.
125
+
126
+ **Language implementations:**
127
+ - JavaScript/TypeScript: `package.json` + `package-lock.json` or `yarn.lock` or `pnpm-lock.yaml`
128
+ - Python: `requirements.txt` or `pyproject.toml` + `uv.lock` or `poetry.lock`
129
+ - Go: `go.mod` + `go.sum`
130
+ - Ruby: `Gemfile` + `Gemfile.lock`
131
+ - Rust: `Cargo.toml` + `Cargo.lock`
132
+
133
+ **System-level dependencies.** Factor II extends to system libraries (ImageMagick, ffmpeg, wkhtmltopdf). The correct isolation mechanism is Docker: the `Dockerfile` captures all system-level dependencies in a reproducible layer. A build that depends on a globally installed tool present on the CI runner but not declared anywhere is a Factor II violation — the bug waiting to happen when the CI runner is updated.
134
+
135
+ **Dependency pinning vs. ranges.** For applications (as opposed to libraries), pin exact versions in lockfiles. Unpinned ranges (`^1.2.0`) are appropriate in library `package.json` to avoid peer dependency conflicts, but the application's lockfile must be committed and trusted as the source of truth. This is the difference between "it works on my machine" and "it works."
136
+
137
+ **Docker layer caching.** A `Dockerfile` that copies the dependency manifest first, installs dependencies, then copies source code allows the dependency layer to be cached between builds when only source code changes — a performance optimization that also enforces Factor II by making dependency installation explicit and reproducible.
138
+
139
+ ---
140
+
141
+ ### III. Config — Store config in the environment
142
+
143
+ **The contract:** Configuration that varies between deploys (database URLs, API keys, feature flags, port numbers, S3 bucket names) must not be in the codebase. It must come from the environment at runtime.
144
+
145
+ **The test:** Can this codebase be open-sourced right now, without exposing any credentials? If yes, config is correctly externalized. If no, a secret or environment-specific value is hardcoded somewhere.
146
+
147
+ **Environment variables — the canonical mechanism.** Env vars are language-agnostic, OS-supported, and universally understood by platforms. In local development, `.env` files loaded by libraries like `dotenv` (Node.js), `python-dotenv`, or `godotenv` populate the environment without committing values to the repository. `.env.example` (committed) documents the required variables; `.env` (gitignored) contains the actual values.
148
+
149
+ **The env-var-vs-config-file debate.** The original factor says "store config in the environment," not "use only env vars." The spirit is: config must not be in the codebase. Modern practice has evolved to allow:
150
+ - **Secrets managers** (Vault, AWS Secrets Manager, GCP Secret Manager, Doppler) that inject secrets at runtime as env vars or as files mounted into the container via the CSI secrets store driver
151
+ - **Structured config files** sourced from environment-specific locations (S3 bucket path, Kubernetes ConfigMap volume mount) for large, structured config that is ergonomically wrong as flat env vars
152
+ - **GitOps config repos** where environment-specific configuration lives in a separate repository (never the application repo), committed as YAML and applied by an operator like Flux or Argo CD
153
+
154
+ **What is never acceptable:** hardcoded production URLs, API keys in source code, environment-specific branches (`if NODE_ENV === 'production'`), config files committed to the app repository that differ per environment.
155
+
156
+ **Secrets in env vars — the security concern.** Storing secrets as environment variables has a well-documented risk: crash reporters, APM agents, and debug endpoints often dump environment variables. Modern best practice is to pull secrets from a secrets manager at startup (or use the CSI driver to mount them as files), optionally re-expose them as env vars for the application's benefit, and ensure the secrets manager provides an audit trail for access. The factor's intent is satisfied; the implementation has evolved beyond naive env vars.
157
+
158
+ ---
159
+
160
+ ### IV. Backing Services — Treat backing services as attached resources
161
+
162
+ **The contract:** Databases, caches, message queues, email services, and any other external dependency are "attached resources" accessed via a URL or credentials stored in config. The app makes no distinction between a local and a third-party service.
163
+
164
+ **Resource handles.** A PostgreSQL database is always accessed via `DATABASE_URL`. Whether that URL points to a local Docker container, an RDS instance in staging, or a managed PlanetScale instance in production is purely a configuration concern (Factor III). The application code is identical in all cases.
165
+
166
+ **Swapping services.** If your application can swap its MySQL database for a PostgreSQL database by changing a connection string in config (with appropriate schema adjustments), it is treating backing services correctly. If the swap requires code changes, the service is tightly coupled — a violation. This contract enables local development with lightweight equivalents (SQLite instead of PostgreSQL for pure data-model testing, a local Redis container instead of ElastiCache) and production migration between providers without application changes.
167
+
168
+ **Service discovery.** In Kubernetes, services are accessed via DNS names that resolve within the cluster (`postgres-service.namespace.svc.cluster.local`). These DNS names are injected as environment variables by convention, satisfying both Factor III and Factor IV simultaneously.
169
+
170
+ **Third-party services as first-class resources.** Stripe, SendGrid, Twilio, S3 — these are backing services just like your database. They are accessed via URLs and API keys in config. If Stripe goes down, you swap to Braintree by changing a config value and deploying. The application code is not aware of which payment processor it is using — it uses the abstraction.
171
+
172
+ ---
173
+
174
+ ### V. Build, Release, Run — Strictly separate build and run stages
175
+
176
+ **The contract:** The pipeline from code to running process has three distinct, non-overlapping stages:
177
+
178
+ 1. **Build:** Convert source code into an executable artifact (compiled binary, Docker image, bundled JavaScript). The build pulls dependencies, compiles, bundles. The artifact is immutable and environment-agnostic.
179
+ 2. **Release:** Combine the build artifact with environment-specific configuration. The release is versioned and immutable. Every release has a unique ID (typically the git SHA or a timestamp).
180
+ 3. **Run:** Execute the release in the target environment. The run stage should be simple — launch a process from the artifact with the configuration attached.
181
+
182
+ **What this rules out:**
183
+ - Deploying by SSH-ing into a production server and running `git pull && npm install && pm2 restart`
184
+ - Modifying files on a running container
185
+ - Building the application differently for different environments (environment-specific Dockerfiles that compile different code)
186
+
187
+ **Immutable releases.** A release, once created, never changes. If a bug is found, a new release is created from a patched build. This enables reliable rollbacks: rolling back means pointing the run stage at a previous release artifact, not undoing changes to a mutable server.
188
+
189
+ **CI/CD pipeline implementation.** The build stage maps to CI (GitHub Actions, CircleCI, GitLab CI) producing a Docker image tagged with the git SHA. The release stage maps to combining that image tag with environment-specific Helm values or environment variables. The run stage maps to Kubernetes rolling out a new Deployment with the updated image. No code runs on the production server; the server only executes pre-built artifacts.
190
+
191
+ **Docker image tagging strategies.** Tag images with the git commit SHA (immutable, traceable) not `latest` (mutable, dangerous). A release is `myapp:abc1234` not `myapp:latest`. This makes every release uniquely identifiable and rollbacks trivially reproducible.
192
+
193
+ ---
194
+
195
+ ### VI. Processes — Execute the app as one or more stateless processes
196
+
197
+ **The contract:** Processes are stateless and share nothing. Any state that must persist lives in a stateful backing service (database, Redis, S3, etc.).
198
+
199
+ **What "stateless" means in practice:**
200
+ - No in-process session storage. Sessions are stored in Redis or a database, not in the process's memory.
201
+ - No local file system storage for data that must outlive the process. Uploaded files go to S3 or equivalent object storage, not the local disk.
202
+ - No in-process coordination between instances. If you run 10 instances of a web process, any instance must be able to handle any request. There is no routing logic that must send a user back to the same instance.
203
+
204
+ **Sticky sessions.** Factor VI explicitly forbids sticky sessions (routing a user's requests to the same process instance based on a session cookie). Sticky sessions prevent horizontal scaling and make deployments dangerous (draining a sticky instance forces all its active users to re-authenticate). The alternative is storing session data in Redis with a short TTL — any instance can read any session.
205
+
206
+ **Shared-nothing architecture.** The shared-nothing constraint is what enables horizontal scaling: adding more process instances is purely additive, with no coordination overhead. This is the precondition for Factor VIII.
207
+
208
+ **Conflict with WebSockets.** WebSocket connections maintain long-lived state (the open connection itself, plus any in-process subscription or room membership). A strictly stateless process model requires a message broker (Redis pub/sub, a WebSocket-aware load balancer, or a socket broker like Socket.io's adapter layer) to route events to the correct connection across instances. This is achievable but requires explicit architectural work. Ignoring it and using sticky sessions instead is a pragmatic choice with known trade-offs.
209
+
210
+ **Conflict with in-process caches.** High-performance applications sometimes use in-process LRU caches (warm caches that would be cold in a remote Redis). This is a deliberate violation of Factor VI for performance reasons. Acceptable, but must be explicitly documented as a trade-off, and the application must remain correct (not just slower) when the cache is cold — which it will be after every deployment or restart.
211
+
212
+ ---
213
+
214
+ ### VII. Port Binding — Export services via port binding
215
+
216
+ **The contract:** The application is self-contained. It does not rely on an external application server (Apache, Nginx, IIS) to be injected at runtime. It exports its service by binding to a port and listening for incoming connections.
217
+
218
+ **Self-contained web server.** A Node.js app starts its own HTTP server on `process.env.PORT`. A Go app starts its own `net/http` listener. A Python FastAPI app starts uvicorn programmatically. The platform routes traffic to the port; the app owns the port binding.
219
+
220
+ **HTTP and HTTPS.** In production, TLS termination typically happens at a load balancer or ingress controller (not in the application process). The application binds to HTTP on the assigned port; TLS is handled upstream. This is correct Factor VII behavior — the application is responsible for port binding, not for TLS termination infrastructure.
221
+
222
+ **gRPC.** gRPC services bind to a port and export their service contract via protobuf definitions. This is Factor VII compliant. The port number comes from environment configuration (Factor III).
223
+
224
+ **One app can be a backing service to another.** Because every app exports a service via port binding, any app can be treated as a backing service by another app — just point to its URL. This is the architectural bridge between Factor IV and Factor VII: apps are symmetrical in their relationship to each other and to the platform.
225
+
226
+ ---
227
+
228
+ ### VIII. Concurrency — Scale out via the process model
229
+
230
+ **The contract:** The application is architected so that it scales by running more processes (horizontal scaling), not by running bigger processes (vertical scaling). Different workloads are handled by different process types.
231
+
232
+ **Process types.** An application typically defines multiple process types:
233
+ - `web`: handles HTTP requests
234
+ - `worker`: processes background jobs from a queue
235
+ - `scheduler`: runs periodic tasks (cron-like)
236
+ - `consumer`: processes events from a message stream (Kafka, SQS)
237
+
238
+ In a `Procfile` (Heroku convention):
239
+ ```
240
+ web: node server.js
241
+ worker: node worker.js
242
+ scheduler: node scheduler.js
243
+ ```
244
+
245
+ In Kubernetes, each process type becomes a separate Deployment with its own replica count, resource limits, and autoscaling policy.
246
+
247
+ **Horizontal scaling.** To handle more HTTP traffic, scale the `web` process type from 2 replicas to 10. To process a backlog of background jobs, scale the `worker` process type. Process types scale independently based on their specific load characteristics.
248
+
249
+ **Conflict with serverless.** In serverless (Lambda, Cloud Functions), the platform manages concurrency entirely. You do not decide how many function instances run — the platform scales them automatically. Factor VIII's process model framing does not map cleanly. Serverless functions are effectively stateless (Factor VI) and disposable (Factor IX) by platform design, but the "scale by running more of this process type" mental model becomes "configure concurrency limits and let the platform handle the rest." The factor's intent (scale-out over scale-up) is preserved; the mechanism is different.
250
+
251
+ ---
252
+
253
+ ### IX. Disposability — Maximize robustness with fast startup and graceful shutdown
254
+
255
+ **The contract:** Processes can be started or stopped at any moment. The application handles this gracefully: it starts fast, it shuts down cleanly, and it survives sudden death.
256
+
257
+ **Fast startup.** The application should be ready to serve traffic within seconds of launch. Long startup times (>5 seconds) make rolling deployments slow, delay autoscaling responses, and increase the blast radius of restarts. Optimization targets: lazy-load expensive resources, don't block the main process on database schema validation at startup, use connection pool warming asynchronously.
258
+
259
+ **Graceful shutdown on SIGTERM.** When the platform wants to stop a process (deployment, autoscaling down, spot instance reclamation), it sends SIGTERM. The application should:
260
+ 1. Stop accepting new requests (close the HTTP listener)
261
+ 2. Finish processing in-flight requests (drain)
262
+ 3. Release resources (database connections, file handles)
263
+ 4. Exit with code 0
264
+
265
+ A typical Node.js graceful shutdown:
266
+ ```javascript
267
+ process.on('SIGTERM', async () => {
268
+ server.close(async () => {
269
+ await db.pool.end();
270
+ process.exit(0);
271
+ });
272
+ });
273
+ ```
274
+
275
+ **SIGKILL is the hard limit.** If the process does not exit within the platform's grace period (default 30 seconds in Kubernetes), it receives SIGKILL — an unclean termination. Design for SIGTERM; ensure SIGKILL does not cause data corruption (use database transactions, idempotent job processing).
276
+
277
+ **Worker disposability.** Background workers must use job locking or return-to-queue semantics. If a worker receives SIGTERM mid-job, the job must be re-queued or left in a state that allows another worker to pick it up. This requires idempotent job handlers.
278
+
279
+ **Kubernetes Pod Disruption Budgets.** In Kubernetes, PodDisruptionBudgets (PDBs) define the minimum number of available replicas during voluntary disruptions (rolling deployments, node drains). Combined with graceful shutdown handlers, PDBs ensure high availability during deployments without sticky sessions or instance affinity.
280
+
281
+ ---
282
+
283
+ ### X. Dev/Prod Parity — Keep development, staging, and production as similar as possible
284
+
285
+ **The contract:** Minimize the three gaps between environments:
286
+
287
+ 1. **Time gap:** Code should be deployable to production hours after it is written, not weeks later. Continuous delivery closes the time gap.
288
+ 2. **Personnel gap:** Developers who write code should also be involved in deploying and operating it. DevOps culture closes the personnel gap.
289
+ 3. **Tools gap:** Dev and production should use the same backing services — the same database engine, the same cache, the same message broker. "We use SQLite in dev and PostgreSQL in production" is a time bomb.
290
+
291
+ **Docker Compose for local development.** The fastest way to close the tools gap is `docker-compose.yml` that starts the same PostgreSQL, Redis, and other backing services locally that production uses. Developers work against the real database engine, not a SQLite approximation.
292
+
293
+ **Feature flags, not environment branches.** Environment-specific code paths (`if (process.env.NODE_ENV === 'development') { ... }`) are a tools-gap violation. The correct approach is feature flags that are uniformly evaluated in all environments, with flag values differing per environment via config (Factor III).
294
+
295
+ **The cost objection.** A common objection to Factor X is that production-equivalent environments (with RDS Multi-AZ, ElastiCache clusters, MSK brokers) are expensive to replicate in staging. The correct response is: local dev uses Docker Compose for free; staging uses single-node equivalents (one RDS instance, one Redis node, one Kafka broker) that are cheap but use the same engines and schemas. Perfect parity is not required — engine parity and schema parity are.
296
+
297
+ **Database engine parity.** MySQL vs PostgreSQL differences in behavior (JSON type handling, default NULL sorting, FULL OUTER JOIN support, regex syntax) regularly cause bugs that only appear in production. Engine parity eliminates this class of bug entirely.
298
+
299
+ ---
300
+
301
+ ### XI. Logs — Treat logs as event streams
302
+
303
+ **The contract:** The application never manages log routing, aggregation, or storage. It writes to stdout (and stderr for errors) as a continuous event stream. The execution environment captures and routes those streams.
304
+
305
+ **Why stdout.** Writing to stdout is:
306
+ - Universal (every language, every framework supports it)
307
+ - Decoupled from log destinations (the application does not know or care where logs go)
308
+ - Testable (you can inspect stdout in tests without mocking a log file)
309
+ - Compatible with every log aggregation platform
310
+
311
+ **Structured logging.** Plain-text logs are hard to query. JSON-structured logs — where every log line is a JSON object with consistent fields — are trivially indexed, filtered, and aggregated. Required fields: `timestamp` (ISO 8601), `level` (debug/info/warn/error), `message`, `service`, `trace_id`. Additional contextual fields per log event. Example:
312
+ ```json
313
+ {"timestamp":"2026-03-08T14:22:01Z","level":"info","message":"Payment processed","service":"billing","trace_id":"abc123","user_id":"u456","amount_cents":9900}
314
+ ```
315
+
316
+ **Correlation IDs.** In a distributed system, a single user request triggers calls to multiple services. A `trace_id` (or `correlation_id`) propagated via HTTP headers (W3C Trace Context standard) and included in every log line allows reconstructing the full request path across services in any log aggregation system.
317
+
318
+ **Log aggregation platforms.** In production, logs written to stdout are captured by the container runtime or node-level log agent and forwarded to: Datadog, Grafana Loki, AWS CloudWatch, GCP Cloud Logging, Elastic Stack (ELK), Splunk. The application is oblivious to which one is used.
319
+
320
+ **The observability gap.** Factor XI covers only logs — one of the three pillars of observability. Metrics (Prometheus, Datadog metrics, CloudWatch metrics) and distributed traces (OpenTelemetry, Jaeger, Zipkin) are absent from the original methodology. Kevin Hoffman's "Telemetry" factor (XIII) fills this gap. Modern production systems require all three pillars.
321
+
322
+ **Log buffering caution.** Some log libraries buffer output before flushing to stdout, which can cause log loss on SIGKILL. Ensure log output is flushed synchronously on graceful shutdown, and configure libraries to use line-buffered (not block-buffered) output.
323
+
324
+ ---
325
+
326
+ ### XII. Admin Processes — Run admin/management tasks as one-off processes
327
+
328
+ **The contract:** Administrative tasks (database migrations, seed scripts, cache warming, one-off data repairs, REPL console access) run as one-off processes in the same execution environment as the regular long-running processes, using the same codebase and the same configuration.
329
+
330
+ **What this rules out:**
331
+ - SSH-ing into a production server to run a migration script
332
+ - Maintaining a separate "admin server" with different code
333
+ - Running migrations as part of the application startup sequence (a common anti-pattern that causes race conditions during rolling deployments)
334
+
335
+ **Database migrations.** Migrations should run as a one-off process before the new application version is deployed. In Kubernetes, this is a Job or an init container that runs `migrate` and exits before the new Deployment pods start. If the migration is backwards-compatible (additive schema changes), it can run concurrently with the old version. If it is not, a maintenance window or blue/green deployment is required.
336
+
337
+ **Kubernetes Jobs.** `kubectl create job --from=cronjob/migration` or a dedicated migration Job in a Helm chart is the canonical Kubernetes implementation. The Job runs with the same Docker image and ConfigMap/Secrets as the Deployment — satisfying the "same codebase and config" requirement.
338
+
339
+ **REPL access.** Production console access (equivalent to `rails console` or Django shell) should be available via `kubectl exec` into a running pod, or via a short-lived Job that launches an interactive session. This provides the same runtime environment (same code version, same database connection, same config) that the running application has.
340
+
341
+ **Migration race conditions.** The most common Factor XII violation is running `db.migrate()` inside `app.start()`. In a rolling deployment, new pods start while old pods are still running. If the migration is destructive (dropping a column the old version reads), old pods fail. If the migration is long-running, new pods start serving traffic before the schema is ready. Run migrations as a separate, sequential Job before rolling out the new Deployment.
342
+
343
+ ---
344
+
345
+ ## Trade-Offs Matrix
346
+
347
+ | You Get | You Pay |
348
+ |---|---|
349
+ | **Portability** — app runs identically on any PaaS or container platform | **Platform knowledge** — teams must understand environment variables, process management, and container primitives |
350
+ | **Horizontal scalability** — add processes to scale, no code changes | **Stateless refactoring cost** — converting a stateful app to stateless processes requires rearchitecting session handling and file storage |
351
+ | **Deployment reliability** — immutable releases, reliable rollbacks | **CI/CD pipeline investment** — build/release/run separation requires a real pipeline, not `git pull && restart` |
352
+ | **Dev/prod parity** — bugs surface in dev, not production | **Local infrastructure overhead** — Docker Compose, local Postgres/Redis; more than a SQLite file |
353
+ | **Operational simplicity** — platform operates the app without app-specific knowledge | **Upfront design discipline** — teams must resist shortcuts (hardcoded URLs, local disk storage) that violate factors |
354
+ | **Testability** — stateless processes with injected config are easier to test in isolation | **Dependency management rigor** — lockfiles must be maintained; no "it works on my machine" escapes |
355
+ | **Log observability** — structured JSON to stdout integrates with any aggregation platform | **Log tooling investment** — a log aggregation platform is required to make stdout logs useful at scale |
356
+ | **Graceful deployments** — SIGTERM handling enables zero-downtime rolling deployments | **Graceful shutdown implementation** — each application must explicitly handle SIGTERM; frameworks don't always do it by default |
357
+ | **Config auditability** — all config in environment, reviewable in platform console or GitOps repo | **Secret management complexity** — env vars alone are insufficient; a secrets manager adds operational overhead |
358
+ | **Admin task reproducibility** — one-off processes use the same environment as production | **Migration orchestration** — separate migration Jobs require coordination with deployment rollout |
359
+
360
+ ---
361
+
362
+ ## Evolution Path
363
+
364
+ Migrating an existing application to twelve-factor compliance is most effective when done in phases, prioritized by ROI and least disruption.
365
+
366
+ ### Phase 1: Config and Logs (Week 1–2, Highest ROI)
367
+
368
+ **Factor III — Config in environment.** Audit the codebase for hardcoded URLs, credentials, and environment-specific values. Move every one to environment variables. Create `.env.example` with all required variables (no values). Add `.env` to `.gitignore`. Immediate benefit: no credentials in source control; can now safely open-source or share the repository.
369
+
370
+ **Factor XI — Logs as streams.** Replace all file-based logging with stdout/stderr. Add structured JSON formatting. Add a `trace_id` field. Immediate benefit: logs are now visible in container runtimes and platform consoles without SSH access.
371
+
372
+ ### Phase 2: Processes and Dependencies (Week 2–4)
373
+
374
+ **Factor VI — Stateless processes.** Audit for in-process state: local file uploads, in-memory session storage, sticky-session requirements. Move file uploads to S3. Move sessions to Redis. This is the highest-effort phase for legacy apps.
375
+
376
+ **Factor II — Explicit dependencies.** Audit for implicit system-level dependencies. Add them to the Dockerfile. Commit lockfiles. Pin versions. Immediate benefit: reproducible builds across CI, local dev, and production.
377
+
378
+ ### Phase 3: Build/Release/Run and Dev/Prod Parity (Week 3–6)
379
+
380
+ **Factor V — Build, release, run.** Build a CI pipeline that produces immutable Docker images tagged with git SHAs. Stop deploying by SSH or `git pull`. Immediate benefit: reliable rollbacks; no "works on CI fails in prod" from environment drift.
381
+
382
+ **Factor X — Dev/prod parity.** Create `docker-compose.yml` with the same database and cache engines used in production. Delete SQLite references. Immediate benefit: entire class of "it works in dev" database-engine-specific bugs eliminated.
383
+
384
+ ### Phase 4: Admin Processes and Disposability (Week 5–8)
385
+
386
+ **Factor XII — Admin processes.** Extract migration execution from app startup into a separate CI/CD step or Kubernetes Job. Add `db:migrate` as an explicit pipeline step before deployment.
387
+
388
+ **Factor IX — Disposability.** Implement SIGTERM handlers. Add health check endpoints. Measure startup time and optimize if >5 seconds. Add Kubernetes liveness and readiness probes.
389
+
390
+ ### Phase 5: Backing Services and Concurrency (Ongoing)
391
+
392
+ **Factor IV — Backing services.** Audit for tightly coupled service dependencies. Replace direct library imports for external services with URL-configurable clients.
393
+
394
+ **Factor VIII — Concurrency.** Define process types explicitly. Separate web and worker processes. Configure independent autoscaling per process type.
395
+
396
+ ### Priority Summary
397
+
398
+ | Priority | Factor | Effort | ROI |
399
+ |---|---|---|---|
400
+ | 1 | III — Config | Low | Highest (security + portability) |
401
+ | 2 | XI — Logs | Low | High (observability) |
402
+ | 3 | VI — Processes | High | High (scalability) |
403
+ | 4 | II — Dependencies | Medium | High (reproducibility) |
404
+ | 5 | V — Build/Release/Run | Medium | High (deployment reliability) |
405
+ | 6 | X — Dev/Prod Parity | Medium | Medium (bug prevention) |
406
+ | 7 | XII — Admin Processes | Low | Medium (operational safety) |
407
+ | 8 | IX — Disposability | Medium | Medium (availability) |
408
+ | 9 | IV — Backing Services | Low-Medium | Medium (portability) |
409
+ | 10 | I — Codebase | Low | Medium (clarity) |
410
+ | 11 | VIII — Concurrency | Medium | Lower (if already using PaaS) |
411
+ | 12 | VII — Port Binding | Low | Lower (usually implicit) |
412
+
413
+ ---
414
+
415
+ ## Failure Modes
416
+
417
+ These are the most common, highest-impact violations, with real-world consequences.
418
+
419
+ ### Hardcoded Configuration (Factor III Violation)
420
+
421
+ **Pattern:** `const DB_URL = 'postgres://prod-db.internal:5432/myapp'` in source code.
422
+
423
+ **Consequence:** The application cannot be deployed to any environment other than the one the URL points to. The URL (and possibly credentials) is now in git history forever, even after it is removed. Rotating database credentials requires a code change and deployment.
424
+
425
+ **Real incident class:** Database credential exposure via public GitHub repository. This is the leading cause of cloud account compromise. Trufflehog, GitLeaks, and GitHub's secret scanning exist specifically because this failure mode is endemic.
426
+
427
+ ### Local Disk State (Factor VI Violation)
428
+
429
+ **Pattern:** User uploads stored to `/tmp/uploads/` or `./public/uploads/` on the application server.
430
+
431
+ **Consequence:** Works with a single instance. Fails silently when scaled to two instances — users who uploaded files on instance A cannot access them from instance B. Files are permanently lost on deployment or instance restart.
432
+
433
+ **Real incident class:** E-commerce platform scales out for Black Friday traffic. Users find uploaded product images missing on half of all page loads. The bug was present since launch but only manifested at >1 instance.
434
+
435
+ ### Migration at Startup Race Condition (Factor XII Violation)
436
+
437
+ **Pattern:** `await runMigrations(); await startServer();` in `app.js`.
438
+
439
+ **Consequence:** During a rolling deployment, new pods start running migrations while old pods are still serving traffic. If a migration drops a column the old code reads, old pods begin failing. If a migration takes 10 minutes (adding an index to a large table), no new pod can start serving traffic for 10 minutes — during which the old version continues running against a partially migrated schema.
440
+
441
+ **Real incident class:** A 30-second migration becomes a 45-minute outage because it was running inside app startup under load, holding table locks that blocked all queries to the affected table.
442
+
443
+ ### Log Buffering Causing Log Loss (Factor XI Violation)
444
+
445
+ **Pattern:** Log library configured with block buffering (default in some languages when stdout is not a TTY — notably Python's `print()` and Go's `log` package in certain configurations).
446
+
447
+ **Consequence:** When the process is SIGKILL'd (timeout during graceful shutdown, OOM kill, spot instance reclamation), buffered log lines are lost. The last 30 seconds of logs before a crash are missing — exactly the window needed for debugging.
448
+
449
+ **Fix:** Set `PYTHONUNBUFFERED=1` in Python. Use `sync: true` or equivalent in Node.js winston. Explicitly flush log buffers in the SIGTERM handler.
450
+
451
+ ### Environment-Specific Code Branches (Factor X Violation)
452
+
453
+ **Pattern:**
454
+ ```javascript
455
+ if (process.env.NODE_ENV === 'production') {
456
+ usePostgres();
457
+ } else {
458
+ useSQLite();
459
+ }
460
+ ```
461
+
462
+ **Consequence:** The code that runs in production is not the code tested in development. Any bug that only manifests on PostgreSQL (type coercion differences, locking behavior, full-text search semantics) will not be caught before production.
463
+
464
+ ### Implicit System Dependencies (Factor II Violation)
465
+
466
+ **Pattern:** Application calls `ffmpeg` via shell without declaring it as a dependency. Works on developer machines where ffmpeg is globally installed. CI passes because the CI runner has ffmpeg. Production Docker image does not have ffmpeg. Feature fails silently (or loudly) in production.
467
+
468
+ **Consequence:** Production incident caused by an undeclared dependency. The `Dockerfile` was the only place this needed to be documented, and it wasn't.
469
+
470
+ ---
471
+
472
+ ## Technology Landscape
473
+
474
+ ### PaaS Platforms That Implement 12-Factor
475
+
476
+ | Platform | Notes |
477
+ |---|---|
478
+ | **Heroku** | The original. Enforces most factors by design. Procfile for process types. Config vars for Factor III. Log drains for Factor XI. |
479
+ | **Railway** | Modern Heroku alternative. Automatic build detection. Native env var management. GitHub-connected deployments. |
480
+ | **Render** | PaaS with managed databases as attached resources. Background workers as separate services. |
481
+ | **Fly.io** | Container-based PaaS. Machines API gives more control. Native secrets management (fly secrets). Multi-region deployments. |
482
+ | **Google Cloud Run** | Serverless containers. Enforces statelessness (Factor VI), fast startup (Factor IX), port binding (Factor VII). |
483
+ | **AWS App Runner** | Fully managed container service. Similar model to Cloud Run. |
484
+ | **GCP App Engine** | Original "managed PaaS" for Google. Standard and Flexible environments. |
485
+
486
+ ### Container Orchestration
487
+
488
+ | Platform | 12-Factor Mapping |
489
+ |---|---|
490
+ | **Kubernetes** | ConfigMaps + Secrets (III), Deployments with image tags (V), Deployments vs StatefulSets (VI), Services (VII), HPA (VIII), graceful termination + PDBs (IX), Jobs (XII) |
491
+ | **Docker Swarm** | Simpler Kubernetes alternative. Secrets management. Service scaling. |
492
+ | **Nomad** | HashiCorp's workload orchestrator. Supports containers, VMs, and raw executables. |
493
+
494
+ ### Config and Secrets Management
495
+
496
+ | Tool | Role |
497
+ |---|---|
498
+ | **HashiCorp Vault** | Enterprise secrets management. Dynamic credentials, PKI, encryption as a service. |
499
+ | **Doppler** | Developer-focused secrets manager. Syncs to env vars, Kubernetes secrets, CI/CD. |
500
+ | **AWS Secrets Manager** | Native AWS. Automatic rotation for RDS credentials. IAM-controlled access. |
501
+ | **AWS SSM Parameter Store** | Cheaper alternative to Secrets Manager for non-secret config. |
502
+ | **GCP Secret Manager** | Native GCP. IAM-controlled. Supports versioning and rotation. |
503
+ | **Kubernetes Secrets** | Native K8s. Base64-encoded (not encrypted at rest by default — use KMS envelope encryption). |
504
+ | **CSI Secrets Store Driver** | Mounts secrets from Vault/AWS/GCP as files in pods. Avoids env var exposure. |
505
+
506
+ ### Log Aggregation
507
+
508
+ | Tool | Notes |
509
+ |---|---|
510
+ | **Datadog** | Full observability platform. Logs, metrics, traces, APM in one. |
511
+ | **Grafana Loki** | Log aggregation designed for Kubernetes. Prometheus-compatible. |
512
+ | **Elastic Stack (ELK)** | Elasticsearch, Logstash, Kibana. Self-hosted or Elastic Cloud. |
513
+ | **Splunk** | Enterprise log management. Powerful query language (SPL). |
514
+ | **AWS CloudWatch** | Native AWS. CloudWatch Logs Insights for queries. |
515
+ | **GCP Cloud Logging** | Native GCP. Integrated with GCP Trace and Error Reporting. |
516
+
517
+ ### CI/CD Pipelines (Factor V)
518
+
519
+ | Tool | Notes |
520
+ |---|---|
521
+ | **GitHub Actions** | Native GitHub CI/CD. Docker build and push to GHCR or ECR. |
522
+ | **GitLab CI** | Integrated with GitLab. Excellent Docker-in-Docker support. |
523
+ | **CircleCI** | Cloud CI with orbs for common build patterns. |
524
+ | **Tekton** | Kubernetes-native CI/CD pipeline framework. |
525
+ | **Argo CD** | GitOps continuous delivery for Kubernetes. |
526
+
527
+ ---
528
+
529
+ ## Decision Tree
530
+
531
+ ```
532
+ Is this a cloud-deployed SaaS application?
533
+ ├── YES → Apply all 12 factors as your baseline
534
+ │ ├── Using Kubernetes?
535
+ │ │ ├── YES → Platform enforces III (ConfigMaps/Secrets), V (image tags),
536
+ │ │ │ VI (Deployments), VII (Services), VIII (HPA), IX (SIGTERM/PDB),
537
+ │ │ │ XII (Jobs). Focus manual effort on II, X, XI.
538
+ │ │ └── NO (using PaaS like Railway/Render/Fly.io)
539
+ │ │ └── Platform enforces I, III, V, VI, VII, VIII, IX, XI.
540
+ │ │ Focus manual effort on II, X, XII.
541
+ │ ├── Is it serverless (Lambda, Cloud Functions)?
542
+ │ │ ├── Factor VI (stateless): platform enforces it — no action needed
543
+ │ │ ├── Factor VIII (concurrency): reinterpret as concurrency limits, not process types
544
+ │ │ ├── Factor IX (disposability): fast startup is critical; graceful shutdown is managed by platform
545
+ │ │ ├── Factor VII (port binding): replaced by event source binding — not applicable
546
+ │ │ └── All other factors apply normally
547
+ │ └── Team size < 3 developers?
548
+ │ └── Prioritize I, II, III, XI first (1-2 days of work, high ROI)
549
+ │ Add V, X, IX as team and traffic grow
550
+ │ Add VI, VIII when scaling past single instance
551
+
552
+ ├── NO — Desktop / embedded / CLI application
553
+ │ ├── Factor II (dependencies): YES — reproducible dependency management always matters
554
+ │ ├── Factor IX (disposability): YES — fast startup and clean exit are good practice
555
+ │ └── All other factors: NOT APPLICABLE
556
+
557
+ └── NO — Internal batch processing / data pipeline
558
+ ├── Factors II, III, V, IX, XI, XII: YES — apply these
559
+ ├── Factor VI (stateless): PARTIAL — checkpointing is acceptable; avoid shared-write state
560
+ ├── Factors VII, VIII: PARTIAL — depends on whether the pipeline has a web interface
561
+ └── Factor X (dev/prod parity): YES — same data format and engine versions matter
562
+ ```
563
+
564
+ ---
565
+
566
+ ## Implementation Sketch
567
+
568
+ ### Factor III — .env.example (committed to repository)
569
+
570
+ ```bash
571
+ # .env.example — copy to .env and fill in values for local development
572
+ # NEVER commit .env to the repository
573
+
574
+ # Application
575
+ PORT=3000
576
+ NODE_ENV=development
577
+ LOG_LEVEL=info
578
+
579
+ # Database (Factor IV — backing service as attached resource)
580
+ DATABASE_URL=postgres://localhost:5432/myapp_dev
581
+
582
+ # Cache (Factor IV)
583
+ REDIS_URL=redis://localhost:6379
584
+
585
+ # Object storage (Factor IV)
586
+ S3_BUCKET=myapp-uploads-local
587
+ S3_REGION=us-east-1
588
+ AWS_ACCESS_KEY_ID=
589
+ AWS_SECRET_ACCESS_KEY=
590
+
591
+ # External services (Factor IV)
592
+ STRIPE_SECRET_KEY=
593
+ STRIPE_WEBHOOK_SECRET=
594
+ SENDGRID_API_KEY=
595
+ ```
596
+
597
+ ### Factor V — Dockerfile (Build and Release stages)
598
+
599
+ ```dockerfile
600
+ # ---- BUILD STAGE ----
601
+ FROM node:22-alpine AS build
602
+ WORKDIR /app
603
+
604
+ # Factor II: install dependencies first (layer cache optimization)
605
+ COPY package.json package-lock.json ./
606
+ RUN npm ci --only=production
607
+
608
+ # Copy source and build
609
+ COPY . .
610
+ RUN npm run build
611
+
612
+ # ---- RELEASE/RUN STAGE ----
613
+ # Minimal production image — no build tools, no dev dependencies
614
+ FROM node:22-alpine AS release
615
+ WORKDIR /app
616
+
617
+ # Copy only the built artifact and production deps
618
+ COPY --from=build /app/dist ./dist
619
+ COPY --from=build /app/node_modules ./node_modules
620
+ COPY package.json ./
621
+
622
+ # Factor VII: expose port (actual binding happens via PORT env var at runtime)
623
+ EXPOSE 3000
624
+
625
+ # Factor III: config comes entirely from environment — no .env file here
626
+ # Factor XI: application writes to stdout; no log file configuration needed
627
+ CMD ["node", "dist/server.js"]
628
+ ```
629
+
630
+ ### Factor IV + X — docker-compose.yml (backing services for local dev)
631
+
632
+ ```yaml
633
+ # docker-compose.yml — local development environment
634
+ # Uses the SAME database and cache engines as production (Factor X)
635
+ version: '3.9'
636
+
637
+ services:
638
+ app:
639
+ build: .
640
+ ports:
641
+ - "3000:3000"
642
+ environment:
643
+ # Factor III: config via environment
644
+ - DATABASE_URL=postgres://postgres:password@db:5432/myapp_dev
645
+ - REDIS_URL=redis://cache:6379
646
+ - NODE_ENV=development
647
+ - LOG_LEVEL=debug
648
+ env_file:
649
+ - .env # local overrides (gitignored)
650
+ depends_on:
651
+ db:
652
+ condition: service_healthy
653
+ cache:
654
+ condition: service_started
655
+
656
+ # Factor IV: PostgreSQL as an attached resource
657
+ # Same engine as production (Factor X) — no SQLite
658
+ db:
659
+ image: postgres:16-alpine
660
+ environment:
661
+ POSTGRES_DB: myapp_dev
662
+ POSTGRES_USER: postgres
663
+ POSTGRES_PASSWORD: password
664
+ volumes:
665
+ - postgres_data:/var/lib/postgresql/data
666
+ healthcheck:
667
+ test: ["CMD-SHELL", "pg_isready -U postgres"]
668
+ interval: 5s
669
+ timeout: 5s
670
+ retries: 5
671
+
672
+ # Factor IV: Redis as an attached resource
673
+ cache:
674
+ image: redis:7-alpine
675
+
676
+ volumes:
677
+ postgres_data:
678
+ ```
679
+
680
+ ### Factor IX — Graceful Shutdown Handler (Node.js)
681
+
682
+ ```javascript
683
+ // src/lifecycle.js
684
+ import { logger } from './logger.js';
685
+
686
+ export function registerGracefulShutdown(server, db) {
687
+ let isShuttingDown = false;
688
+
689
+ async function shutdown(signal) {
690
+ if (isShuttingDown) return;
691
+ isShuttingDown = true;
692
+
693
+ logger.info({ signal }, 'Received shutdown signal — beginning graceful drain');
694
+
695
+ // Step 1: Stop accepting new connections
696
+ server.close(async (err) => {
697
+ if (err) {
698
+ logger.error({ err }, 'Error closing HTTP server');
699
+ process.exit(1);
700
+ }
701
+
702
+ // Step 2: Release backing service connections
703
+ try {
704
+ await db.pool.end();
705
+ logger.info('Database pool closed');
706
+ } catch (err) {
707
+ logger.error({ err }, 'Error closing database pool');
708
+ }
709
+
710
+ logger.info('Graceful shutdown complete');
711
+ process.exit(0);
712
+ });
713
+
714
+ // Step 3: Hard limit — if drain takes >25s, force exit before SIGKILL (30s)
715
+ setTimeout(() => {
716
+ logger.error('Graceful shutdown timeout — forcing exit');
717
+ process.exit(1);
718
+ }, 25_000);
719
+ }
720
+
721
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
722
+ process.on('SIGINT', () => shutdown('SIGINT'));
723
+ }
724
+ ```
725
+
726
+ ### Factor XI — Structured JSON Log Format
727
+
728
+ ```javascript
729
+ // src/logger.js — structured logging to stdout
730
+ import pino from 'pino';
731
+
732
+ export const logger = pino({
733
+ level: process.env.LOG_LEVEL ?? 'info',
734
+ // Factor XI: write to stdout only
735
+ // Formatting happens in the log aggregation platform, not here
736
+ formatters: {
737
+ level: (label) => ({ level: label }),
738
+ },
739
+ base: {
740
+ service: process.env.SERVICE_NAME ?? 'myapp',
741
+ version: process.env.APP_VERSION ?? 'unknown',
742
+ },
743
+ timestamp: pino.stdTimeFunctions.isoTime,
744
+ });
745
+
746
+ // Usage:
747
+ // logger.info({ trace_id, user_id, duration_ms }, 'Request completed');
748
+ // logger.error({ err, trace_id }, 'Payment processing failed');
749
+ ```
750
+
751
+ Sample structured log output:
752
+ ```json
753
+ {"timestamp":"2026-03-08T14:22:01.442Z","level":"info","service":"billing","version":"abc1234","trace_id":"f47ac10b","user_id":"u_789","amount_cents":9900,"message":"Payment processed"}
754
+ {"timestamp":"2026-03-08T14:22:01.891Z","level":"error","service":"billing","version":"abc1234","trace_id":"f47ac10b","err":{"type":"StripeError","message":"Card declined","code":"card_declined"},"message":"Payment processing failed"}
755
+ ```
756
+
757
+ ---
758
+
759
+ ## Serverless Applicability Summary
760
+
761
+ | Factor | Serverless Applicability | Notes |
762
+ |---|---|---|
763
+ | I — Codebase | Full | One function package per service |
764
+ | II — Dependencies | Full | `package.json`, bundling (esbuild/webpack) for cold start optimization |
765
+ | III — Config | Full | Environment variables via Lambda console, SSM, Secrets Manager |
766
+ | IV — Backing Services | Full | RDS, DynamoDB, SQS accessed via URL/ARN in config |
767
+ | V — Build, Release, Run | Full | SAM/CDK/Serverless Framework handles build and release |
768
+ | VI — Stateless Processes | Automatic | Platform enforces it — functions are inherently stateless |
769
+ | VII — Port Binding | Not Applicable | Replaced by event source binding (API Gateway, SQS trigger, S3 event) |
770
+ | VIII — Concurrency | Reinterpreted | Configure reserved concurrency and provisioned concurrency per function |
771
+ | IX — Disposability | Partial | Fast startup is critical (cold start cost). Graceful shutdown: `SIGTERM` support added to Lambda in 2023 via Lambda Extensions |
772
+ | X — Dev/Prod Parity | Partial | SAM local, LocalStack reduce gap. Full parity is harder than with containers |
773
+ | XI — Logs | Full | CloudWatch Logs captures stdout automatically |
774
+ | XII — Admin Processes | Full | Lambda invocations or Step Functions for one-off admin tasks |
775
+
776
+ ---
777
+
778
+ *Researched: 2026-03-08*
779
+
780
+ *Sources:*
781
+ - *[The Twelve-Factor App](https://12factor.net/) — original methodology by Adam Wiggins*
782
+ - *[Twelve-Factor App Methodology is now Open Source](https://12factor.net/blog/open-source-announcement) — November 2024 open-source announcement*
783
+ - *[Heroku Open Sources the Twelve-Factor App Definition](https://www.heroku.com/blog/heroku-open-sources-twelve-factor-app-definition/) — Heroku blog*
784
+ - *[The 12-Factor App — 15 Years Later. Does it Still Hold Up in 2026?](https://lukasniessen.medium.com/the-12-factor-app-15-years-later-does-it-still-hold-up-in-2026-c8af494e8465) — Lukas Niessen, Medium, Feb 2026*
785
+ - *[12 Factor applications: 13 years later](https://www.tibobeijen.nl/2024/04/24/12-factor-13-years-later/) — Tibo Beijen, April 2024*
786
+ - *[Beyond the Twelve-Factor App](https://www.oreilly.com/library/view/beyond-the-twelve-factor/9781492042631/) — Kevin Hoffman, O'Reilly*
787
+ - *[Should the Twelve-Factor App now be Fifteen-Factor?](https://www.dynatrace.com/news/blog/twelve-factor-app-now-fifteen-factor/) — Dynatrace*
788
+ - *[Beyond the 12 factors: 15-factor cloud-native Java applications](https://developer.ibm.com/articles/15-factor-applications/) — IBM Developer*
789
+ - *[Applying the Twelve-Factor App Methodology to Serverless Applications](https://aws.amazon.com/blogs/compute/applying-the-twelve-factor-app-methodology-to-serverless-applications/) — AWS Compute Blog*
790
+ - *[12 Factor App meets Kubernetes: Benefits for cloud-native apps](https://www.redhat.com/architect/12-factor-app-containers) — Red Hat*
791
+ - *[Twelve-Factor App Config is Obsolete](https://www.lekko.com/blogs/twelve-factor-app-config-is-obsolete) — Lekko*
792
+ - *[Twelve-Factor App Config in the environment is bad advice](https://allenap.me/posts/12-factor-app-config-in-the-environment-is-bad-advice) — Gavin Panella*
793
+ - *[Open Source Drives the Twelve-Factor Modernization Project](https://thenewstack.io/open-source-drives-the-twelve-factor-modernization-project/) — The New Stack*
794
+ - *[A dozen reasons why Cloud Run complies with the Twelve-Factor App methodology](https://cloud.google.com/blog/products/serverless/a-dozen-reasons-why-cloud-run-complies-with-the-twelve-factor-app-methodology) — Google Cloud Blog*
795
+ - *[GitHub: twelve-factor/twelve-factor](https://github.com/twelve-factor/twelve-factor) — community-maintained repository*
796
+
797
+ *Cross-reference: stateless-design, serverless, microservices, monolith, horizontal-vs-vertical*