@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,671 @@
1
+ # Caching Architecture — Architecture Expertise Module
2
+
3
+ > Caching stores frequently accessed data closer to the consumer to reduce latency and backend load. Phil Karlton's famous quote — "There are only two hard things in computer science: cache invalidation and naming things" — isn't a joke. Caching is easy to add, hard to maintain, and the source of some of the most subtle bugs in production systems.
4
+
5
+ > **Category:** Data
6
+ > **Complexity:** Moderate
7
+ > **Applies when:** Systems with read-heavy workloads, high-latency data sources, or expensive computations that can tolerate some staleness
8
+
9
+ ---
10
+
11
+ ## What This Is
12
+
13
+ ### Cache Levels
14
+
15
+ Caching operates at multiple levels. Understanding each level, its latency characteristics, and its failure modes is essential before choosing where to add a cache.
16
+
17
+ **L1 — In-Process / In-Memory Cache.** The cache lives in the application's own memory space. HashMap, Guava LoadingCache, Caffeine (Java), `node-cache` (Node.js), `lru-cache` (Python), or even a simple dictionary. Latency is nanoseconds. The cache dies with the process, is not shared across instances, and consumes heap memory. This is the fastest possible cache but the hardest to keep consistent across a fleet of application servers. Every instance has its own copy, and if Instance A invalidates a key, Instance B still serves stale data until its TTL expires or it is explicitly notified.
18
+
19
+ **L2 — Distributed Cache.** A dedicated caching tier shared across application instances. Redis, Memcached, Apache Ignite, Hazelcast. Latency is sub-millisecond to low single-digit milliseconds over a local network. The cache survives individual application restarts, provides a single source of cached truth, and supports advanced data structures (sorted sets, streams, pub/sub in Redis). The trade-off is network overhead, operational complexity, and a new single point of failure unless clustered properly.
20
+
21
+ **CDN — Edge Cache.** Content is cached at geographically distributed edge nodes close to end users. Cloudflare, Amazon CloudFront, Fastly, Akamai. Latency drops from hundreds of milliseconds (cross-continent origin fetch) to single-digit milliseconds (edge pop). CDNs excel at static assets (images, CSS, JS bundles), but modern CDNs can also cache API responses, HTML fragments, and GraphQL queries at the edge. The trade-off is cache invalidation complexity — purging content across 300+ edge locations is neither instant nor free.
22
+
23
+ **Browser Cache.** The user's browser caches resources according to HTTP `Cache-Control`, `ETag`, and `Expires` headers. Latency is essentially zero — the browser never makes a network request. This is the most effective cache for repeat visits but gives you the least control. Once a resource is cached in the browser, you cannot force invalidation without changing the URL (cache-busting via content hashes or query parameters).
24
+
25
+ ### Caching vs. Precomputation
26
+
27
+ These are frequently confused. **Caching** stores the result of a computation or data fetch so that subsequent requests avoid repeating the work. The cache is populated reactively (on first request) or proactively (on a schedule). **Precomputation** runs expensive calculations ahead of time and stores the results permanently in a primary data store — not a cache. Materialized views, denormalized tables, and pre-aggregated analytics are precomputation. The distinction matters because caches are ephemeral (they can be flushed without data loss), while precomputed data is authoritative.
28
+
29
+ ---
30
+
31
+ ## When to Use It
32
+
33
+ **Read-heavy workloads.** The canonical use case. If a system processes 100:1 read-to-write ratios (product catalogs, user profiles, configuration data, content feeds), caching the read path dramatically reduces database load. Facebook's Memcached deployment handles billions of read requests per second — their 2013 NSDI paper "Scaling Memcache at Facebook" showed that caching reduced database queries by orders of magnitude, with Memcached handling >99% of read requests before they reached MySQL.
34
+
35
+ **Latency-sensitive paths.** If an API endpoint must respond in <50ms but the underlying query takes 200ms, caching is the only realistic option short of precomputation. E-commerce checkout flows, real-time bidding systems, and game leaderboards all rely on caching to meet latency SLAs.
36
+
37
+ **Expensive computations.** Machine learning model inference results, complex aggregation queries, rendered HTML templates, and image transformations are all candidates for caching. If the computation cost is high and the inputs are repeated, cache the output. Netflix caches personalized recommendation results per user session rather than re-running ML models on every page load.
38
+
39
+ **External API responses.** Third-party APIs have rate limits, latency, and availability constraints outside your control. Caching external API responses (with appropriate TTLs) insulates your system from upstream failures and reduces cost.
40
+
41
+ **Session data and authentication tokens.** Redis is the de facto standard for session storage in distributed web applications. Storing sessions in-memory avoids database round trips on every authenticated request.
42
+
43
+ **Configuration and feature flags.** Application configuration rarely changes but is read on every request. Caching configuration with a short TTL (30-60 seconds) or event-based invalidation eliminates unnecessary database reads.
44
+
45
+ ---
46
+
47
+ ## When NOT to Use It
48
+
49
+ This section is intentionally long because the decision *not* to cache is harder and more important than the decision to cache. Every unnecessary cache adds a consistency problem, an operational burden, and a debugging surface.
50
+
51
+ **Write-heavy workloads with immediate consistency requirements.** If your system processes more writes than reads, caching adds overhead without benefit. Every write must invalidate or update the cache, which means you pay the cache maintenance cost on every operation but rarely benefit from cache hits. Twitter's 2020 USENIX study of 153 in-memory cache clusters revealed that many real-world workloads are far more write-heavy than the textbook assumption — and those workloads showed lower cache hit rates and higher operational cost.
52
+
53
+ **Data that must always be fresh.** Financial transactions, inventory counts during flash sales, real-time auction bids, medical records. If serving stale data has regulatory, financial, or safety consequences, caching introduces unacceptable risk. The question is not "can we invalidate fast enough?" but "what happens during the window between the write and the invalidation?" If the answer is "someone sees a wrong bank balance" or "we oversell inventory," caching is the wrong tool.
54
+
55
+ **Small datasets that fit in the database buffer pool.** Every modern database has its own caching layer. PostgreSQL's `shared_buffers`, MySQL's InnoDB buffer pool, and MongoDB's WiredTiger cache all keep frequently accessed data in memory. If your entire working set fits in the database's buffer pool, adding an external cache adds complexity without meaningful latency improvement. Profile first — you may discover the database is already serving from memory.
56
+
57
+ **When cache invalidation complexity outweighs the benefit.** If an entity has 15 different views that must be invalidated when it changes, and changes come from 6 different services, the invalidation logic becomes a distributed consistency problem more complex than the original latency problem. A real example: one e-commerce platform cached product prices in Redis, but prices depended on user segment, region, currency, active promotions, and cart contents. The cache key space exploded, the invalidation logic had bugs that took months to find, and the cache hit rate was under 15%. They removed the cache entirely and optimized the database query from 180ms to 12ms — cheaper, simpler, and correct.
58
+
59
+ **Single-instance applications with fast databases.** If your application runs on a single server with a local PostgreSQL instance, the network latency to the database is near zero. Adding Redis introduces a network hop, operational complexity, and a new failure mode — for minimal latency gain. Cache when the bottleneck is real, not hypothetical.
60
+
61
+ **Rapidly mutating data with low read reuse.** Chat messages, real-time sensor telemetry, and event logs are typically written once and read rarely (or read in aggregate, not individually). Caching individual entries wastes memory. Write-around is the correct strategy here — bypass the cache entirely on writes.
62
+
63
+ **When it masks the real problem.** Caching is sometimes used to paper over an unoptimized query, a missing index, or an N+1 problem. The cache makes the symptom disappear but the disease remains. When the cache is flushed (deployment, memory pressure, node failure), the unoptimized path is exposed under full production load, often causing cascading failures. Fix the underlying problem first; cache only after the query is already fast and you need it to be faster.
64
+
65
+ ---
66
+
67
+ ## How It Works
68
+
69
+ ### Caching Strategies
70
+
71
+ #### Cache-Aside (Lazy Loading)
72
+
73
+ The most common pattern. The application owns the caching logic.
74
+
75
+ ```
76
+ Read path:
77
+ 1. Application checks cache for key
78
+ 2. Cache HIT → return cached value
79
+ 3. Cache MISS → query database
80
+ 4. Write result to cache with TTL
81
+ 5. Return result to caller
82
+
83
+ Write path:
84
+ 1. Application writes to database
85
+ 2. Application invalidates (deletes) cache key
86
+ 3. Next read triggers cache population
87
+ ```
88
+
89
+ **Strengths:** Simple to implement. The application controls exactly what gets cached and when. Cache failures are non-fatal — the application falls back to the database. Only requested data is cached (no wasted memory on unrequested data).
90
+
91
+ **Weaknesses:** First request after a miss or invalidation always hits the database ("cold start penalty"). The application code is cluttered with caching logic. Race conditions can occur: if two requests miss simultaneously, both query the database and both write to cache — not harmful but wasteful.
92
+
93
+ **When to use:** General-purpose caching where simplicity and resilience are priorities. This is the default choice unless you have a specific reason to use another pattern.
94
+
95
+ #### Read-Through
96
+
97
+ The cache itself is responsible for loading data from the database on a miss. The application only talks to the cache, never directly to the database for reads.
98
+
99
+ ```
100
+ Read path:
101
+ 1. Application requests key from cache
102
+ 2. Cache HIT → return cached value
103
+ 3. Cache MISS → cache queries database internally
104
+ 4. Cache stores result and returns to application
105
+ ```
106
+
107
+ **Strengths:** Application code is cleaner — no cache miss handling logic. The cache layer can implement optimizations (batching, coalescing) transparently.
108
+
109
+ **Weaknesses:** Requires a cache provider that supports read-through (Redis does not natively; NCache, Oracle Coherence, and Hazelcast do). First-request latency is still cold. The cache becomes a thicker abstraction that is harder to debug.
110
+
111
+ **When to use:** Enterprise middleware scenarios where you want a unified data access layer. Often combined with write-through.
112
+
113
+ #### Write-Through
114
+
115
+ Every write goes through the cache to the database. The cache and database are always in sync.
116
+
117
+ ```
118
+ Write path:
119
+ 1. Application writes data to cache
120
+ 2. Cache synchronously writes to database
121
+ 3. Write acknowledged only after both succeed
122
+ ```
123
+
124
+ **Strengths:** Cache is always consistent with the database. Reads are always fast (the cache is pre-populated by writes). No stale data window.
125
+
126
+ **Weaknesses:** Write latency increases — every write must complete two operations synchronously. Data that is written but never read wastes cache memory. Not suitable for write-heavy workloads.
127
+
128
+ **When to use:** Systems where read-after-write consistency is critical and write volume is moderate. Often paired with read-through.
129
+
130
+ #### Write-Behind (Write-Back)
131
+
132
+ Writes go to the cache immediately, and the cache asynchronously flushes to the database in the background.
133
+
134
+ ```
135
+ Write path:
136
+ 1. Application writes data to cache
137
+ 2. Cache acknowledges immediately
138
+ 3. Cache asynchronously batches and writes to database
139
+ ```
140
+
141
+ **Strengths:** Write latency is minimal (only the cache write is synchronous). The cache can batch and coalesce writes, reducing database load. Excellent for write-heavy workloads where eventual consistency is acceptable.
142
+
143
+ **Weaknesses:** Risk of data loss — if the cache node crashes before flushing to the database, writes are lost. Debugging is harder because the database state lags behind the cache state. Introduces eventual consistency that must be accounted for in application logic.
144
+
145
+ **When to use:** High-throughput write scenarios where some data loss is tolerable (analytics events, view counters, activity logs). Never use for financial transactions or data subject to audit requirements.
146
+
147
+ #### Write-Around
148
+
149
+ Writes go directly to the database, bypassing the cache entirely.
150
+
151
+ ```
152
+ Write path:
153
+ 1. Application writes directly to database
154
+ 2. Cache is not updated
155
+
156
+ Read path:
157
+ 1. Standard cache-aside behavior
158
+ ```
159
+
160
+ **Strengths:** Write-heavy data that is rarely read does not pollute the cache. Cache memory is preserved for frequently read data.
161
+
162
+ **Weaknesses:** First read after a write always misses the cache, increasing read latency for recently written data.
163
+
164
+ **When to use:** Log data, audit trails, chat messages, IoT telemetry — anything written frequently and read infrequently.
165
+
166
+ ### TTL Policies
167
+
168
+ Time-to-live (TTL) is the bluntest but most reliable invalidation mechanism. Every cache entry expires after a fixed duration regardless of whether the underlying data has changed.
169
+
170
+ **Fixed TTL.** Set a constant expiration (e.g., 300 seconds). Simple and predictable. The maximum staleness is bounded by the TTL value.
171
+
172
+ **Sliding TTL.** The TTL resets on every read. Frequently accessed data stays cached longer. Rarely accessed data expires naturally. Useful for session data.
173
+
174
+ **Adaptive TTL.** The TTL is computed based on how frequently the underlying data changes. Rapidly changing data gets short TTLs; stable data gets long TTLs. More complex to implement but optimizes the trade-off between freshness and hit rate.
175
+
176
+ **TTL Jitter.** A critical production practice. Adding random jitter (e.g., `TTL = base_ttl + random(-60, 60)`) prevents synchronized expiration of keys set at the same time. Without jitter, a batch of cache entries set simultaneously will all expire simultaneously, causing a spike of database queries. AWS's official Redis caching whitepaper recommends this as a standard practice.
177
+
178
+ ### Eviction Policies
179
+
180
+ When the cache reaches its memory limit, it must evict entries to make room for new ones.
181
+
182
+ **LRU (Least Recently Used).** Evicts the entry that hasn't been accessed for the longest time. The most common default. Works well when recent access is a good predictor of future access. Redis uses an approximated LRU with sampling (checking a random sample of keys rather than maintaining a perfect LRU list).
183
+
184
+ **LFU (Least Frequently Used).** Evicts the entry with the fewest accesses. Better than LRU for workloads where some keys are consistently popular. Caffeine's W-TinyLFU algorithm combines frequency and recency, consistently outperforming pure LRU in benchmarks — achieving near-optimal hit rates.
185
+
186
+ **FIFO (First In, First Out).** Evicts the oldest entry regardless of access pattern. Simple but rarely optimal. Useful only when all entries have roughly equal access probability.
187
+
188
+ **Random.** Evicts a random entry. Surprisingly effective in some workloads and trivially simple to implement. Used as a baseline in cache research.
189
+
190
+ **TTL-based.** Entries are evicted when their TTL expires. Not technically an eviction policy (it is expiration), but in practice it works with eviction: expired entries are evicted first, and if more space is needed, the eviction policy (LRU/LFU) kicks in.
191
+
192
+ ### Cache Invalidation Strategies
193
+
194
+ Invalidation is the hard part. There are three fundamental approaches, and most production systems combine them.
195
+
196
+ **Event-based invalidation.** When data changes, an event (message, webhook, CDC stream) triggers cache deletion. This is the most precise approach — the cache is invalidated the moment the data changes, minimizing the staleness window. Implementation options include publishing to a message bus (Kafka, RabbitMQ, Redis Pub/Sub) on every write, using database change data capture (CDC) with tools like Debezium to detect writes and invalidate automatically, or application-level event hooks (e.g., ActiveRecord callbacks, Django signals).
197
+
198
+ **TTL-based invalidation.** Entries expire after a fixed time. The simplest approach but provides only probabilistic freshness. A 5-minute TTL means data can be up to 5 minutes stale. Acceptable for many use cases (product catalogs, user profile display names), unacceptable for others (inventory counts, pricing).
199
+
200
+ **Version-based invalidation.** Cache keys include a version number or content hash. When data changes, the version increments, and the old cache entry becomes unreachable (it eventually expires or is evicted). This is how CDNs handle static assets — `app.v3.js` and `app.v4.js` are different cache keys. No explicit invalidation is needed; new versions simply bypass old cache entries.
201
+
202
+ ### CDN Caching
203
+
204
+ **Edge caching.** CDNs cache content at points of presence (PoPs) worldwide. A user in Tokyo hits the Tokyo edge node instead of the origin server in Virginia. CDN caching is governed by HTTP headers: `Cache-Control: public, max-age=31536000` tells the CDN to cache for one year. `s-maxage` overrides `max-age` specifically for shared caches (CDNs), allowing different browser and CDN TTLs.
205
+
206
+ **Cache purging.** When content changes, you must purge the CDN cache. Options include purge by URL (surgical, recommended), purge by cache tag (Cloudflare, Fastly — tag related resources and purge by tag), purge everything (nuclear option, causes origin load spike). Cloudflare's Instant Purge propagates globally in under 150ms but is rate-limited per plan tier (Free: 5 requests/minute, Enterprise: 500/second).
207
+
208
+ **Stale-while-revalidate.** The `stale-while-revalidate` directive allows CDNs to serve stale content immediately while fetching a fresh copy in the background. Users always get fast responses. The cache is updated transparently. This pattern is excellent for content that changes occasionally but does not require instant consistency.
209
+
210
+ **Origin shielding.** An intermediate cache layer between edge nodes and the origin. Instead of 300 edge nodes each making origin requests on a miss, they request from a single shield node, which requests from the origin. This collapses origin traffic by orders of magnitude.
211
+
212
+ ### Cache Stampede / Thundering Herd Prevention
213
+
214
+ When a popular cache key expires, hundreds or thousands of concurrent requests simultaneously miss the cache and hit the database. This is a cache stampede (also called thundering herd or dog-pile effect). The database, which was protected by the cache, is suddenly exposed to full production load. Solutions:
215
+
216
+ **Distributed locking.** On a cache miss, the first request acquires a lock (e.g., `SET lock:key 1 EX 10 NX` in Redis). Other requests wait or return stale data. The lock holder fetches from the database, populates the cache, and releases the lock. The risk is that if the lock holder crashes, all waiters are blocked until the lock TTL expires.
217
+
218
+ **Probabilistic early expiration (XFetch).** Before the TTL actually expires, requests probabilistically decide to refresh the cache. The probability increases as the TTL approaches zero. The academic XFetch algorithm implements this: `current_time - (time_to_compute * beta * log(random())) > expiry_time`. Under normal traffic, the cache is refreshed before expiration, and no stampede occurs.
219
+
220
+ **Singleflight / Request coalescing.** Multiple concurrent requests for the same key are coalesced into a single database query. Go's `golang.org/x/sync/singleflight` package is the canonical implementation. The first request triggers the database fetch; all other concurrent requests wait and receive the same result. This is an application-level solution that requires no changes to the cache infrastructure.
221
+
222
+ **Background refresh.** A dedicated background process monitors cache TTLs and proactively refreshes entries before they expire. The application only reads from cache, never triggers database fetches on the hot path. This eliminates stampedes entirely but requires knowing which keys to refresh (not practical for large, dynamic key spaces).
223
+
224
+ **TTL jitter.** Adding randomness to TTL values (`base_ttl + random(-range, range)`) prevents multiple keys from expiring simultaneously. This does not prevent stampedes on a single key but prevents correlated stampedes across many keys.
225
+
226
+ ---
227
+
228
+ ## Trade-Offs Matrix
229
+
230
+ | Dimension | Without Caching | With Caching | Notes |
231
+ |---|---|---|---|
232
+ | Read latency | Database-bound (1-100ms+) | Cache-bound (0.1-5ms) | 10-100x improvement typical |
233
+ | Write complexity | Single write path | Write + invalidate/update cache | Every write path must account for cache |
234
+ | Data freshness | Always current | Potentially stale (bounded by TTL) | Staleness window is the fundamental trade-off |
235
+ | Operational overhead | Database ops only | Database + cache cluster ops | Redis/Memcached clusters require monitoring, failover, memory management |
236
+ | Memory cost | Database buffer pool only | Additional RAM for cache tier | Redis memory is more expensive than database disk |
237
+ | Debugging difficulty | Single source of truth | Multiple sources; "is it the cache?" | Stale cache is the #1 cause of "it works for some users but not others" |
238
+ | Availability | Database availability | Cache availability AND database availability | Cache failure must degrade gracefully, not catastrophically |
239
+ | Cold start behavior | Consistent performance | Slow until cache warms | Deployments, restarts, and cache flushes cause temporary performance degradation |
240
+ | Consistency model | Strong (single database) | Eventual (cache + database) | Distributed systems: cache and DB can diverge during failure windows |
241
+ | Code complexity | Straightforward data access | Cache logic woven through application | Cache-aside pollutes business logic; read/write-through centralizes it |
242
+ | Cost at scale | Database scaling costs | Cache tier costs + reduced database costs | Net cost depends on read/write ratio and cache hit rate |
243
+ | Testing surface | Database integration tests | Cache + database + invalidation tests | Must test cache miss, hit, stale, eviction, and stampede scenarios |
244
+
245
+ ---
246
+
247
+ ## Evolution Path
248
+
249
+ ### Stage 1: No Cache (Baseline)
250
+ All reads hit the database. This is correct for new applications and small datasets. Measure latency and throughput. Identify bottlenecks with profiling, not assumptions.
251
+
252
+ ### Stage 2: Database-Level Optimization
253
+ Before adding an external cache, exhaust database-level options: add indexes, optimize queries, fix N+1 problems, increase connection pool size, tune `shared_buffers` / InnoDB buffer pool. These improvements are permanent and have no consistency trade-offs.
254
+
255
+ ### Stage 3: Application-Level In-Memory Cache
256
+ Add in-process caching for the hottest, most stable data: configuration, feature flags, reference data (countries, currencies, categories). Use a proper cache library (Caffeine, `lru-cache`) with TTLs — not a raw HashMap that grows unbounded. Monitor heap usage.
257
+
258
+ ### Stage 4: Distributed Cache (Redis/Memcached)
259
+ When multiple application instances need shared cached state, introduce Redis or Memcached. Start with cache-aside for the highest-impact read paths. Set conservative TTLs. Implement cache-miss metrics from day one. Deploy Redis with Sentinel or Cluster mode for high availability.
260
+
261
+ ### Stage 5: Multi-Layer Caching
262
+ Combine L1 (in-process) and L2 (distributed) caching. The application checks local cache first, then Redis, then the database. Use short TTLs for L1 (5-30 seconds) and longer TTLs for L2 (1-10 minutes). Instagram uses this pattern — in-process Memcached with mcrouter for distributed routing.
263
+
264
+ ### Stage 6: CDN and Edge Caching
265
+ Move cacheable HTTP responses to the CDN edge. Static assets get long TTLs with content-hash URLs. API responses use `s-maxage` with `stale-while-revalidate`. Implement cache tags for surgical purging. Monitor cache hit ratios at the edge.
266
+
267
+ ### Stage 7: Specialized Caching Infrastructure
268
+ At extreme scale, introduce specialized solutions: dedicated hot-key tiers, cache sharding with consistent hashing, write-behind caching for high-throughput writes, predictive prefetching based on user behavior patterns. Facebook, Twitter, and Instagram all operate at this level with custom-built caching infrastructure (mcrouter, Pelikan, custom Memcached forks).
269
+
270
+ ---
271
+
272
+ ## Failure Modes
273
+
274
+ ### Stale Data Serving
275
+ **What happens:** Cache contains an outdated value. Reads return data that no longer reflects the database state.
276
+ **Why:** TTL hasn't expired yet after a database write. Event-based invalidation message was delayed or lost. Race condition: write occurred between cache miss and cache population.
277
+ **Impact:** Users see incorrect information. In e-commerce, stale prices or inventory counts can cause financial loss. One e-commerce platform served cached prices that didn't reflect a promotional discount for 8 minutes, resulting in customer complaints and manual refund processing.
278
+ **Mitigation:** Use event-based invalidation for critical data. Keep TTLs short for mutable data. Implement version checks on cache reads.
279
+
280
+ ### Cache Stampede (Thundering Herd)
281
+ **What happens:** A popular cache key expires, and hundreds of concurrent requests simultaneously query the database.
282
+ **Why:** High-traffic key with a fixed TTL. No stampede prevention mechanism in place.
283
+ **Impact:** Database CPU spikes to 100%. Query latency increases for all users, not just those hitting the expired key. In severe cases, the database becomes unresponsive, triggering cascading failures.
284
+ **Mitigation:** Implement distributed locking, probabilistic early expiration, or singleflight patterns. Add TTL jitter to prevent correlated expirations.
285
+
286
+ ### Hot Key Overload
287
+ **What happens:** A single cache key receives disproportionate traffic, overwhelming the cache node that owns it.
288
+ **Why:** Viral content, celebrity profiles, flash sale product pages. Consistent hashing assigns one key to one node — hot keys don't distribute.
289
+ **Impact:** The cache node's CPU and network bandwidth are saturated. Other keys on the same node experience increased latency. In extreme cases, the node crashes, rehashing its keys to other nodes and potentially cascading the failure.
290
+ **Mitigation:** Replicate hot keys to multiple nodes with randomized key suffixes (`product:123:replica:1`, `product:123:replica:2`). Use a local in-process cache as L1 for known hot keys. Monitor key access frequency and auto-detect hotspots.
291
+
292
+ ### Memory Pressure and OOM
293
+ **What happens:** The cache consumes all available memory. Eviction rates spike. In extreme cases, the cache process is killed by the OS OOM killer.
294
+ **Why:** No memory limit configured. Keys are cached without TTLs and accumulate. Eviction policy is too conservative. Memory fragmentation in long-running Redis instances.
295
+ **Impact:** Eviction storms cause cache hit rate to plummet. If Redis is killed by OOM, all clients experience errors until Redis restarts and the cache is cold.
296
+ **Mitigation:** Always set `maxmemory` and `maxmemory-policy` in Redis. Monitor memory usage and eviction rates. Set TTLs on all keys — never cache without expiration. Use `MEMORY DOCTOR` in Redis to detect fragmentation.
297
+
298
+ ### Cache Poisoning
299
+ **What happens:** Invalid, corrupted, or malicious data is stored in the cache and served to users.
300
+ **Why:** A bug in the application writes bad data to the cache. An attacker manipulates cache keys via unvalidated input. A serialization bug stores a partially constructed object.
301
+ **Impact:** All users reading the poisoned key receive bad data. If the key has a long TTL, the impact persists for the entire TTL duration. In 2023, a CDN cache poisoning vulnerability (CVE-2023-25690) allowed attackers to inject malicious responses into shared CDN caches, affecting all users served by that edge node.
302
+ **Mitigation:** Validate data before caching. Use cache key namespacing to prevent key collisions. Implement cache entry checksums for critical data. Set reasonable TTLs so poisoned entries expire.
303
+
304
+ ### Cold Start After Flush
305
+ **What happens:** After a cache flush (intentional or due to failure), all requests hit the database simultaneously.
306
+ **Why:** Deployment that flushes the cache. Redis node restart. `FLUSHALL` command executed accidentally or intentionally.
307
+ **Impact:** Database load spikes to pre-caching levels. If the database cannot handle the uncached load, it becomes unresponsive. This is effectively a self-inflicted DDoS.
308
+ **Mitigation:** Never flush the entire cache in production — use targeted invalidation. Implement cache warming scripts that pre-populate critical keys. Use blue-green deployments where the new cache is warmed before traffic switches. Design the database to handle uncached load (even if slowly) — the cache should be an optimization, not a load-bearing requirement.
309
+
310
+ ### Split-Brain in Cache Clusters
311
+ **What happens:** Network partition causes cache nodes to diverge. Different application instances read different values for the same key from different cache nodes.
312
+ **Why:** Network partition in a Redis Cluster or Memcached ring. Failover promotes a replica that is behind the primary.
313
+ **Impact:** Inconsistent behavior across the application fleet. Some users see updated data, others see stale data, with no clear pattern.
314
+ **Mitigation:** Use Redis Cluster with `WAIT` for critical writes. Accept that distributed caches provide eventual consistency, not strong consistency. Design the application to tolerate temporary inconsistency.
315
+
316
+ ---
317
+
318
+ ## Technology Landscape
319
+
320
+ ### Distributed Cache Servers
321
+
322
+ **Redis.** The dominant distributed cache. Single-threaded event loop (Redis 7+ has I/O threading for network operations). Supports strings, hashes, lists, sets, sorted sets, streams, HyperLogLog, and bitmaps. Persistence options (RDB snapshots, AOF log). Redis Cluster provides horizontal sharding with 16,384 hash slots. Redis Sentinel provides high availability with automatic failover. Lua scripting for atomic compound operations. Pub/Sub for event-based invalidation. Typical production hit rates: 95-99%. Memory overhead: ~60-80 bytes per key beyond the data itself.
323
+
324
+ **Memcached.** Simpler and older. Multi-threaded (better CPU utilization on multi-core machines). Supports only string key-value pairs (no data structures). No persistence, no replication, no clustering (clients implement consistent hashing). Lower memory overhead per key than Redis (~50 bytes). Still used at Facebook and Twitter scale because simplicity and raw throughput matter when you operate thousands of cache nodes. Facebook's mcrouter handles routing, replication, and failover on top of Memcached.
325
+
326
+ **When to choose Redis vs. Memcached:** Use Redis when you need data structures beyond simple strings, persistence, pub/sub, or Lua scripting. Use Memcached when you need pure key-value caching at maximum throughput with minimal operational complexity, or when you operate at a scale where Redis's single-threaded model becomes a bottleneck.
327
+
328
+ ### CDN Providers
329
+
330
+ **Cloudflare.** Global network with 300+ PoPs. Instant Purge (<150ms global propagation). Workers for edge compute. Cache Rules for fine-grained control. Free tier available. Cache Tags for group invalidation on Business+ plans.
331
+
332
+ **Amazon CloudFront.** Tight AWS integration. Lambda@Edge for edge compute. Origin shielding via Regional Edge Caches. Invalidation is eventually consistent (may take minutes). 1,000 free invalidation paths per month; additional paths cost $0.005 each.
333
+
334
+ **Fastly.** Instant Purge (~150ms). Surrogate keys (cache tags) on all plans. VCL (Varnish Configuration Language) for powerful cache customization. Compute@Edge for WebAssembly-based edge compute. Preferred by media companies for real-time purging needs.
335
+
336
+ ### Application-Level Cache Libraries
337
+
338
+ **Caffeine (Java).** High-performance in-process cache. W-TinyLFU eviction algorithm achieves near-optimal hit rates — consistently outperforms Guava Cache in benchmarks by 10-30% on read-heavy workloads. Async loading support. Size-based and time-based eviction. The recommended replacement for Guava Cache in new Java projects.
339
+
340
+ **Guava Cache / CacheBuilder (Java).** Google's older in-process cache. LRU eviction. Still widely used but Caffeine is strictly superior in performance. Guava Cache is in maintenance mode; Google recommends Caffeine for new code.
341
+
342
+ **node-cache / lru-cache (Node.js).** Simple in-process caches for Node.js. `lru-cache` is more configurable with size-based eviction, TTL, and `stale-while-revalidate` semantics. No clustering — each Node.js process has its own cache.
343
+
344
+ **Django Cache Framework (Python).** Pluggable backend supporting Memcached, Redis, file system, local memory, and database caching. Per-view caching with decorators. Template fragment caching. Cache middleware for full-page caching.
345
+
346
+ ### HTTP Caching Headers
347
+
348
+ **`Cache-Control`.** The primary directive. `public` (CDN can cache), `private` (browser only), `no-store` (never cache), `no-cache` (cache but revalidate), `max-age=N` (cache for N seconds), `s-maxage=N` (CDN-specific max-age), `stale-while-revalidate=N` (serve stale for N seconds while refreshing).
349
+
350
+ **`ETag`.** Entity tag — a hash or version identifier for the resource. The browser sends `If-None-Match: <etag>` on subsequent requests. If the resource hasn't changed, the server returns `304 Not Modified` (no body), saving bandwidth.
351
+
352
+ **`Vary`.** Tells caches that the response varies based on specific request headers (e.g., `Vary: Accept-Encoding, Accept-Language`). Critical for correct caching of content-negotiated responses. A missing `Vary` header can cause CDNs to serve gzipped content to clients that don't support it, or English content to French-speaking users.
353
+
354
+ ---
355
+
356
+ ## Decision Tree
357
+
358
+ ```
359
+ START: Is the data read more than 10x per write?
360
+ ├── NO → Caching likely adds more complexity than value
361
+ │ └── Consider database-level optimization instead
362
+
363
+ └── YES → Can the application tolerate stale data?
364
+ ├── NO (must always be fresh)
365
+ │ └── Is the data read latency a critical SLA?
366
+ │ ├── NO → Do not cache. Optimize the database query.
367
+ │ └── YES → Use write-through cache with synchronous invalidation
368
+ │ └── Accept the write latency penalty for read consistency
369
+
370
+ └── YES (some staleness is acceptable)
371
+ ├── What is the acceptable staleness window?
372
+ │ ├── Seconds → Short TTL (5-30s) + event-based invalidation
373
+ │ ├── Minutes → Medium TTL (1-10min) + TTL-based invalidation
374
+ │ └── Hours/Days → Long TTL (1h-24h) + version-based invalidation (CDN)
375
+
376
+ ├── Is the data shared across application instances?
377
+ │ ├── NO → In-process cache (L1) is sufficient
378
+ │ └── YES → Distributed cache (L2: Redis/Memcached) required
379
+ │ └── Consider L1 + L2 for lowest latency
380
+
381
+ ├── Is the data served to end users over HTTP?
382
+ │ ├── YES → Add CDN caching (L3: edge)
383
+ │ │ ├── Static assets → Long TTL + content-hash URLs
384
+ │ │ ├── API responses → s-maxage + stale-while-revalidate
385
+ │ │ └── HTML pages → Short s-maxage + cache tags for purging
386
+ │ └── NO → L1/L2 caching only
387
+
388
+ └── Is there a risk of cache stampede?
389
+ ├── NO (low traffic) → Simple cache-aside with TTL
390
+ └── YES (high traffic on specific keys)
391
+ ├── Implement singleflight / request coalescing
392
+ ├── Add probabilistic early expiration
393
+ └── Consider background refresh for critical keys
394
+ ```
395
+
396
+ ---
397
+
398
+ ## Implementation Sketch
399
+
400
+ ### Cache-Aside with Stampede Prevention (Python + Redis)
401
+
402
+ ```python
403
+ import redis
404
+ import json
405
+ import time
406
+ import random
407
+ import hashlib
408
+ import functools
409
+
410
+ class CacheAside:
411
+ """
412
+ Production cache-aside implementation with:
413
+ - TTL jitter to prevent correlated expirations
414
+ - Distributed locking for stampede prevention
415
+ - Stale serving during refresh
416
+ - Metrics for hit/miss/stale tracking
417
+ """
418
+
419
+ def __init__(self, redis_client: redis.Redis, default_ttl: int = 300,
420
+ jitter_range: int = 60, lock_ttl: int = 10):
421
+ self.redis = redis_client
422
+ self.default_ttl = default_ttl
423
+ self.jitter_range = jitter_range
424
+ self.lock_ttl = lock_ttl
425
+ # Metrics counters
426
+ self._hits = 0
427
+ self._misses = 0
428
+ self._stale_serves = 0
429
+
430
+ def _ttl_with_jitter(self, base_ttl: int) -> int:
431
+ """Add random jitter to prevent synchronized expirations."""
432
+ return base_ttl + random.randint(-self.jitter_range, self.jitter_range)
433
+
434
+ def get(self, key: str, fetch_fn, ttl: int = None):
435
+ """
436
+ Get value from cache with stampede prevention.
437
+
438
+ Args:
439
+ key: Cache key
440
+ fetch_fn: Callable that returns the value on cache miss
441
+ ttl: Optional TTL override (seconds)
442
+ """
443
+ ttl = ttl or self.default_ttl
444
+ cache_key = f"cache:{key}"
445
+ stale_key = f"stale:{key}"
446
+ lock_key = f"lock:{key}"
447
+
448
+ # Try primary cache
449
+ cached = self.redis.get(cache_key)
450
+ if cached is not None:
451
+ self._hits += 1
452
+ return json.loads(cached)
453
+
454
+ # Cache miss — try to acquire lock for database fetch
455
+ self._misses += 1
456
+ lock_acquired = self.redis.set(
457
+ lock_key, "1", ex=self.lock_ttl, nx=True
458
+ )
459
+
460
+ if not lock_acquired:
461
+ # Another request is already fetching — serve stale if available
462
+ stale = self.redis.get(stale_key)
463
+ if stale is not None:
464
+ self._stale_serves += 1
465
+ return json.loads(stale)
466
+ # No stale data — wait briefly and retry
467
+ time.sleep(0.1)
468
+ return self.get(key, fetch_fn, ttl)
469
+
470
+ try:
471
+ # We hold the lock — fetch from database
472
+ value = fetch_fn()
473
+ serialized = json.dumps(value)
474
+
475
+ # Pipeline: set primary cache + extended stale copy
476
+ pipe = self.redis.pipeline()
477
+ pipe.setex(cache_key, self._ttl_with_jitter(ttl), serialized)
478
+ pipe.setex(stale_key, ttl * 3, serialized) # Stale copy lives 3x longer
479
+ pipe.execute()
480
+
481
+ return value
482
+ finally:
483
+ self.redis.delete(lock_key)
484
+
485
+ def invalidate(self, key: str):
486
+ """Invalidate a cache entry. Stale copy is kept for stampede protection."""
487
+ self.redis.delete(f"cache:{key}")
488
+ # Note: stale:{key} is intentionally NOT deleted
489
+
490
+ @property
491
+ def stats(self):
492
+ total = self._hits + self._misses
493
+ return {
494
+ "hits": self._hits,
495
+ "misses": self._misses,
496
+ "stale_serves": self._stale_serves,
497
+ "hit_rate": self._hits / total if total > 0 else 0,
498
+ }
499
+
500
+
501
+ # Usage
502
+ cache = CacheAside(redis.Redis(host="localhost", port=6379, db=0))
503
+
504
+ def get_user_profile(user_id: int):
505
+ return cache.get(
506
+ key=f"user:{user_id}",
507
+ fetch_fn=lambda: db.query("SELECT * FROM users WHERE id = %s", user_id),
508
+ ttl=300, # 5 minutes + jitter
509
+ )
510
+
511
+ def update_user_profile(user_id: int, data: dict):
512
+ db.execute("UPDATE users SET ... WHERE id = %s", user_id)
513
+ cache.invalidate(f"user:{user_id}")
514
+ ```
515
+
516
+ ### HTTP Cache Headers (Express.js Middleware)
517
+
518
+ ```javascript
519
+ // Middleware for setting cache headers based on content type
520
+
521
+ function cacheControl(options = {}) {
522
+ return (req, res, next) => {
523
+ const {
524
+ staticAssetMaxAge = 31536000, // 1 year for hashed static assets
525
+ apiMaxAge = 0, // No browser caching for API
526
+ apiSMaxAge = 60, // CDN caches API for 60s
527
+ staleWhileRevalidate = 300, // Serve stale for 5min while refreshing
528
+ isPrivate = false, // true for user-specific responses
529
+ } = options;
530
+
531
+ // Static assets with content hash — cache forever
532
+ if (req.path.match(/\.[a-f0-9]{8,}\.(js|css|png|jpg|woff2)$/)) {
533
+ res.set('Cache-Control', `public, max-age=${staticAssetMaxAge}, immutable`);
534
+ return next();
535
+ }
536
+
537
+ // API responses
538
+ if (req.path.startsWith('/api/')) {
539
+ const visibility = isPrivate ? 'private' : 'public';
540
+ const parts = [
541
+ visibility,
542
+ `max-age=${apiMaxAge}`,
543
+ `s-maxage=${apiSMaxAge}`,
544
+ `stale-while-revalidate=${staleWhileRevalidate}`,
545
+ ];
546
+ res.set('Cache-Control', parts.join(', '));
547
+
548
+ // Add ETag based on response body
549
+ const originalJson = res.json.bind(res);
550
+ res.json = (body) => {
551
+ const etag = hashContent(JSON.stringify(body));
552
+ res.set('ETag', `"${etag}"`);
553
+
554
+ if (req.headers['if-none-match'] === `"${etag}"`) {
555
+ return res.status(304).end();
556
+ }
557
+ return originalJson(body);
558
+ };
559
+ }
560
+
561
+ // HTML pages — short CDN cache, no browser cache
562
+ if (req.accepts('html')) {
563
+ res.set('Cache-Control', 'public, max-age=0, s-maxage=60, stale-while-revalidate=300');
564
+ res.set('Vary', 'Accept-Encoding, Accept-Language');
565
+ }
566
+
567
+ next();
568
+ };
569
+ }
570
+
571
+ function hashContent(content) {
572
+ return require('crypto').createHash('md5')
573
+ .update(content).digest('hex').slice(0, 16);
574
+ }
575
+ ```
576
+
577
+ ### Cache Warming Script (Go)
578
+
579
+ ```go
580
+ // cache_warmer.go — Pre-populate cache for critical keys after deployment
581
+
582
+ package main
583
+
584
+ import (
585
+ "context"
586
+ "log"
587
+ "sync"
588
+ "time"
589
+
590
+ "github.com/redis/go-redis/v9"
591
+ "golang.org/x/sync/errgroup"
592
+ )
593
+
594
+ type CacheWarmer struct {
595
+ rdb *redis.Client
596
+ db *sql.DB
597
+ batchSize int
598
+ }
599
+
600
+ func (w *CacheWarmer) WarmTopProducts(ctx context.Context, limit int) error {
601
+ // Fetch the most-viewed product IDs from analytics
602
+ rows, err := w.db.QueryContext(ctx,
603
+ "SELECT product_id FROM product_views "+
604
+ "GROUP BY product_id ORDER BY COUNT(*) DESC LIMIT $1", limit)
605
+ if err != nil {
606
+ return err
607
+ }
608
+ defer rows.Close()
609
+
610
+ var productIDs []int64
611
+ for rows.Next() {
612
+ var id int64
613
+ rows.Scan(&id)
614
+ productIDs = append(productIDs, id)
615
+ }
616
+
617
+ // Warm cache in parallel batches
618
+ g, ctx := errgroup.WithContext(ctx)
619
+ g.SetLimit(10) // Max 10 concurrent database queries
620
+
621
+ for _, id := range productIDs {
622
+ id := id
623
+ g.Go(func() error {
624
+ product, err := w.fetchProduct(ctx, id)
625
+ if err != nil {
626
+ log.Printf("WARN: failed to warm product %d: %v", id, err)
627
+ return nil // Don't fail the whole batch
628
+ }
629
+ ttl := 5*time.Minute + time.Duration(rand.Intn(120))*time.Second
630
+ return w.rdb.Set(ctx, fmt.Sprintf("product:%d", id),
631
+ product, ttl).Err()
632
+ })
633
+ }
634
+
635
+ return g.Wait()
636
+ }
637
+ ```
638
+
639
+ ---
640
+
641
+ ## Real-World Case Studies
642
+
643
+ **Facebook — Scaling Memcache (2013).** Facebook's NSDI paper documented their Memcached deployment: thousands of servers, trillions of cached items, billions of requests per second. Key innovations included mcrouter (a Memcached protocol router handling routing, replication, and failover), lease-based invalidation (preventing stale sets after delete), regional pools (separating cache by data access pattern), and cold cluster warming (new clusters are warmed from existing clusters, not the database). The lesson: at hyperscale, the cache infrastructure becomes more complex than the database infrastructure.
644
+
645
+ **Twitter — 153 Cache Clusters (2020).** Twitter's USENIX OSDI paper analyzed their in-memory cache workloads and found that real-world cache workloads differ significantly from textbook assumptions. Many workloads were write-heavy. TTL distributions were highly variable. Some clusters had hit rates below 50%. The paper introduced Pelikan, a framework for building custom cache servers optimized for specific workload characteristics rather than using general-purpose solutions.
646
+
647
+ **Instagram — Multi-Layer Caching.** Instagram uses Memcached and Redis in combination. Memcached handles high-throughput read caching (user profiles, posts, comments). Redis handles more complex data structures (sorted sets for feeds, pub/sub for real-time features). mcrouter provides distributed routing and replication. When Instagram scaled to 14 million users with only 3 engineers, aggressive caching was a key enabler — the database handled only the writes that caching couldn't absorb.
648
+
649
+ ---
650
+
651
+ ## Cross-References
652
+
653
+ - **[data-consistency](../data/data-consistency.md)** — Caching fundamentally introduces eventual consistency; understand CAP trade-offs before adding a cache layer
654
+ - **[database-scaling](../scaling/database-scaling.md)** — Caching is one of several database scaling strategies; compare with read replicas, sharding, and connection pooling
655
+ - **[search-architecture](../data/search-architecture.md)** — Search indexes are a form of derived data with similar invalidation challenges to caches
656
+ - **[horizontal-vs-vertical](../scaling/horizontal-vs-vertical.md)** — Distributed caching is a horizontal scaling strategy; understand when vertical scaling (bigger database) is simpler
657
+
658
+ ---
659
+
660
+ ## Sources
661
+
662
+ - [Scaling Memcache at Facebook — USENIX NSDI 2013](https://www.usenix.org/conference/nsdi13/technical-sessions/presentation/nishtala)
663
+ - [A Large Scale Analysis of Hundreds of In-Memory Cache Clusters at Twitter — USENIX OSDI 2020](https://www.usenix.org/conference/osdi20/presentation/yang)
664
+ - [AWS Whitepaper: Database Caching Strategies Using Redis](https://docs.aws.amazon.com/whitepapers/latest/database-caching-strategies-using-redis/caching-patterns.html)
665
+ - [Redis Cache Optimization Strategies](https://redis.io/blog/guide-to-cache-optimization-strategies/)
666
+ - [Cloudflare Cache Documentation](https://developers.cloudflare.com/cache/)
667
+ - [Caffeine Cache Benchmarks](https://github.com/ben-manes/caffeine/wiki/Benchmarks)
668
+ - [Cache Stampede Prevention — OneUptime](https://oneuptime.com/blog/post/2026-01-30-cache-stampede-prevention/view)
669
+ - [Why Cache Invalidation is Hard — Ka Wai Cheung](https://medium.com/on-building-software/why-cache-invalidation-is-actually-hard-e8b5e9a83e45)
670
+ - [Cache-Aside Pattern — Azure Architecture Center](https://learn.microsoft.com/en-us/azure/architecture/patterns/cache-aside)
671
+ - [Thundering Herd Problem — Distributed Computing Musings](https://distributed-computing-musings.com/2025/08/thundering-herd-problem-preventing-the-stampede/)