@shaykec/bridge 0.4.24 → 0.4.26

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 (320) hide show
  1. package/journeys/ai-engineer.yaml +34 -0
  2. package/journeys/backend-developer.yaml +36 -0
  3. package/journeys/business-analyst.yaml +37 -0
  4. package/journeys/devops-engineer.yaml +37 -0
  5. package/journeys/engineering-manager.yaml +44 -0
  6. package/journeys/frontend-developer.yaml +41 -0
  7. package/journeys/fullstack-developer.yaml +49 -0
  8. package/journeys/mobile-developer.yaml +42 -0
  9. package/journeys/product-manager.yaml +35 -0
  10. package/journeys/qa-engineer.yaml +37 -0
  11. package/journeys/ux-designer.yaml +43 -0
  12. package/modules/README.md +52 -0
  13. package/modules/accessibility-fundamentals/content.md +126 -0
  14. package/modules/accessibility-fundamentals/exercises.md +88 -0
  15. package/modules/accessibility-fundamentals/module.yaml +43 -0
  16. package/modules/accessibility-fundamentals/quick-ref.md +71 -0
  17. package/modules/accessibility-fundamentals/quiz.md +100 -0
  18. package/modules/accessibility-fundamentals/resources.md +29 -0
  19. package/modules/accessibility-fundamentals/walkthrough.md +80 -0
  20. package/modules/adr-writing/content.md +121 -0
  21. package/modules/adr-writing/exercises.md +81 -0
  22. package/modules/adr-writing/module.yaml +41 -0
  23. package/modules/adr-writing/quick-ref.md +57 -0
  24. package/modules/adr-writing/quiz.md +73 -0
  25. package/modules/adr-writing/resources.md +29 -0
  26. package/modules/adr-writing/walkthrough.md +64 -0
  27. package/modules/ai-agents/content.md +120 -0
  28. package/modules/ai-agents/exercises.md +82 -0
  29. package/modules/ai-agents/module.yaml +42 -0
  30. package/modules/ai-agents/quick-ref.md +60 -0
  31. package/modules/ai-agents/quiz.md +103 -0
  32. package/modules/ai-agents/resources.md +30 -0
  33. package/modules/ai-agents/walkthrough.md +85 -0
  34. package/modules/ai-assisted-research/content.md +136 -0
  35. package/modules/ai-assisted-research/exercises.md +80 -0
  36. package/modules/ai-assisted-research/module.yaml +42 -0
  37. package/modules/ai-assisted-research/quick-ref.md +67 -0
  38. package/modules/ai-assisted-research/quiz.md +73 -0
  39. package/modules/ai-assisted-research/resources.md +33 -0
  40. package/modules/ai-assisted-research/walkthrough.md +85 -0
  41. package/modules/ai-pair-programming/content.md +105 -0
  42. package/modules/ai-pair-programming/exercises.md +98 -0
  43. package/modules/ai-pair-programming/module.yaml +39 -0
  44. package/modules/ai-pair-programming/quick-ref.md +58 -0
  45. package/modules/ai-pair-programming/quiz.md +73 -0
  46. package/modules/ai-pair-programming/resources.md +34 -0
  47. package/modules/ai-pair-programming/walkthrough.md +117 -0
  48. package/modules/ai-test-generation/content.md +125 -0
  49. package/modules/ai-test-generation/exercises.md +98 -0
  50. package/modules/ai-test-generation/module.yaml +39 -0
  51. package/modules/ai-test-generation/quick-ref.md +65 -0
  52. package/modules/ai-test-generation/quiz.md +74 -0
  53. package/modules/ai-test-generation/resources.md +41 -0
  54. package/modules/ai-test-generation/walkthrough.md +100 -0
  55. package/modules/api-design/content.md +189 -0
  56. package/modules/api-design/exercises.md +84 -0
  57. package/modules/api-design/game.yaml +113 -0
  58. package/modules/api-design/module.yaml +45 -0
  59. package/modules/api-design/quick-ref.md +73 -0
  60. package/modules/api-design/quiz.md +100 -0
  61. package/modules/api-design/resources.md +55 -0
  62. package/modules/api-design/walkthrough.md +88 -0
  63. package/modules/clean-code/content.md +136 -0
  64. package/modules/clean-code/exercises.md +137 -0
  65. package/modules/clean-code/game.yaml +172 -0
  66. package/modules/clean-code/module.yaml +44 -0
  67. package/modules/clean-code/quick-ref.md +44 -0
  68. package/modules/clean-code/quiz.md +105 -0
  69. package/modules/clean-code/resources.md +40 -0
  70. package/modules/clean-code/walkthrough.md +78 -0
  71. package/modules/clean-code/workshop.yaml +149 -0
  72. package/modules/code-review/content.md +130 -0
  73. package/modules/code-review/exercises.md +95 -0
  74. package/modules/code-review/game.yaml +83 -0
  75. package/modules/code-review/module.yaml +42 -0
  76. package/modules/code-review/quick-ref.md +77 -0
  77. package/modules/code-review/quiz.md +105 -0
  78. package/modules/code-review/resources.md +40 -0
  79. package/modules/code-review/walkthrough.md +106 -0
  80. package/modules/daily-workflow/content.md +81 -0
  81. package/modules/daily-workflow/exercises.md +50 -0
  82. package/modules/daily-workflow/module.yaml +33 -0
  83. package/modules/daily-workflow/quick-ref.md +37 -0
  84. package/modules/daily-workflow/quiz.md +65 -0
  85. package/modules/daily-workflow/resources.md +38 -0
  86. package/modules/daily-workflow/walkthrough.md +83 -0
  87. package/modules/debugging-systematically/content.md +139 -0
  88. package/modules/debugging-systematically/exercises.md +91 -0
  89. package/modules/debugging-systematically/module.yaml +46 -0
  90. package/modules/debugging-systematically/quick-ref.md +59 -0
  91. package/modules/debugging-systematically/quiz.md +105 -0
  92. package/modules/debugging-systematically/resources.md +42 -0
  93. package/modules/debugging-systematically/walkthrough.md +84 -0
  94. package/modules/debugging-systematically/workshop.yaml +127 -0
  95. package/modules/demo-test/content.md +68 -0
  96. package/modules/demo-test/exercises.md +28 -0
  97. package/modules/demo-test/game.yaml +171 -0
  98. package/modules/demo-test/module.yaml +41 -0
  99. package/modules/demo-test/quick-ref.md +54 -0
  100. package/modules/demo-test/quiz.md +74 -0
  101. package/modules/demo-test/resources.md +21 -0
  102. package/modules/demo-test/walkthrough.md +122 -0
  103. package/modules/demo-test/workshop.yaml +31 -0
  104. package/modules/design-critique/content.md +93 -0
  105. package/modules/design-critique/exercises.md +71 -0
  106. package/modules/design-critique/module.yaml +41 -0
  107. package/modules/design-critique/quick-ref.md +63 -0
  108. package/modules/design-critique/quiz.md +73 -0
  109. package/modules/design-critique/resources.md +27 -0
  110. package/modules/design-critique/walkthrough.md +68 -0
  111. package/modules/design-patterns/content.md +335 -0
  112. package/modules/design-patterns/exercises.md +82 -0
  113. package/modules/design-patterns/game.yaml +55 -0
  114. package/modules/design-patterns/module.yaml +45 -0
  115. package/modules/design-patterns/quick-ref.md +44 -0
  116. package/modules/design-patterns/quiz.md +101 -0
  117. package/modules/design-patterns/resources.md +40 -0
  118. package/modules/design-patterns/walkthrough.md +64 -0
  119. package/modules/exploratory-testing/content.md +133 -0
  120. package/modules/exploratory-testing/exercises.md +88 -0
  121. package/modules/exploratory-testing/module.yaml +41 -0
  122. package/modules/exploratory-testing/quick-ref.md +68 -0
  123. package/modules/exploratory-testing/quiz.md +75 -0
  124. package/modules/exploratory-testing/resources.md +39 -0
  125. package/modules/exploratory-testing/walkthrough.md +87 -0
  126. package/modules/git/content.md +128 -0
  127. package/modules/git/exercises.md +53 -0
  128. package/modules/git/game.yaml +190 -0
  129. package/modules/git/module.yaml +44 -0
  130. package/modules/git/quick-ref.md +67 -0
  131. package/modules/git/quiz.md +89 -0
  132. package/modules/git/resources.md +49 -0
  133. package/modules/git/walkthrough.md +92 -0
  134. package/modules/git/workshop.yaml +145 -0
  135. package/modules/hiring-interviews/content.md +130 -0
  136. package/modules/hiring-interviews/exercises.md +88 -0
  137. package/modules/hiring-interviews/module.yaml +41 -0
  138. package/modules/hiring-interviews/quick-ref.md +68 -0
  139. package/modules/hiring-interviews/quiz.md +73 -0
  140. package/modules/hiring-interviews/resources.md +36 -0
  141. package/modules/hiring-interviews/walkthrough.md +75 -0
  142. package/modules/hooks/content.md +97 -0
  143. package/modules/hooks/exercises.md +69 -0
  144. package/modules/hooks/module.yaml +39 -0
  145. package/modules/hooks/quick-ref.md +93 -0
  146. package/modules/hooks/quiz.md +81 -0
  147. package/modules/hooks/resources.md +34 -0
  148. package/modules/hooks/walkthrough.md +105 -0
  149. package/modules/hooks/workshop.yaml +64 -0
  150. package/modules/incident-response/content.md +124 -0
  151. package/modules/incident-response/exercises.md +82 -0
  152. package/modules/incident-response/game.yaml +132 -0
  153. package/modules/incident-response/module.yaml +45 -0
  154. package/modules/incident-response/quick-ref.md +53 -0
  155. package/modules/incident-response/quiz.md +103 -0
  156. package/modules/incident-response/resources.md +40 -0
  157. package/modules/incident-response/walkthrough.md +82 -0
  158. package/modules/llm-fundamentals/content.md +114 -0
  159. package/modules/llm-fundamentals/exercises.md +83 -0
  160. package/modules/llm-fundamentals/module.yaml +42 -0
  161. package/modules/llm-fundamentals/quick-ref.md +64 -0
  162. package/modules/llm-fundamentals/quiz.md +103 -0
  163. package/modules/llm-fundamentals/resources.md +30 -0
  164. package/modules/llm-fundamentals/walkthrough.md +91 -0
  165. package/modules/one-on-ones/content.md +133 -0
  166. package/modules/one-on-ones/exercises.md +81 -0
  167. package/modules/one-on-ones/module.yaml +44 -0
  168. package/modules/one-on-ones/quick-ref.md +67 -0
  169. package/modules/one-on-ones/quiz.md +73 -0
  170. package/modules/one-on-ones/resources.md +37 -0
  171. package/modules/one-on-ones/walkthrough.md +69 -0
  172. package/modules/package.json +9 -0
  173. package/modules/prioritization-frameworks/content.md +130 -0
  174. package/modules/prioritization-frameworks/exercises.md +93 -0
  175. package/modules/prioritization-frameworks/module.yaml +41 -0
  176. package/modules/prioritization-frameworks/quick-ref.md +77 -0
  177. package/modules/prioritization-frameworks/quiz.md +73 -0
  178. package/modules/prioritization-frameworks/resources.md +32 -0
  179. package/modules/prioritization-frameworks/walkthrough.md +69 -0
  180. package/modules/prompt-engineering/content.md +123 -0
  181. package/modules/prompt-engineering/exercises.md +82 -0
  182. package/modules/prompt-engineering/game.yaml +101 -0
  183. package/modules/prompt-engineering/module.yaml +45 -0
  184. package/modules/prompt-engineering/quick-ref.md +65 -0
  185. package/modules/prompt-engineering/quiz.md +105 -0
  186. package/modules/prompt-engineering/resources.md +36 -0
  187. package/modules/prompt-engineering/walkthrough.md +81 -0
  188. package/modules/rag-fundamentals/content.md +111 -0
  189. package/modules/rag-fundamentals/exercises.md +80 -0
  190. package/modules/rag-fundamentals/module.yaml +45 -0
  191. package/modules/rag-fundamentals/quick-ref.md +58 -0
  192. package/modules/rag-fundamentals/quiz.md +75 -0
  193. package/modules/rag-fundamentals/resources.md +34 -0
  194. package/modules/rag-fundamentals/walkthrough.md +75 -0
  195. package/modules/react-fundamentals/content.md +140 -0
  196. package/modules/react-fundamentals/exercises.md +81 -0
  197. package/modules/react-fundamentals/game.yaml +145 -0
  198. package/modules/react-fundamentals/module.yaml +45 -0
  199. package/modules/react-fundamentals/quick-ref.md +62 -0
  200. package/modules/react-fundamentals/quiz.md +106 -0
  201. package/modules/react-fundamentals/resources.md +42 -0
  202. package/modules/react-fundamentals/walkthrough.md +89 -0
  203. package/modules/react-fundamentals/workshop.yaml +112 -0
  204. package/modules/react-native-fundamentals/content.md +141 -0
  205. package/modules/react-native-fundamentals/exercises.md +79 -0
  206. package/modules/react-native-fundamentals/module.yaml +42 -0
  207. package/modules/react-native-fundamentals/quick-ref.md +60 -0
  208. package/modules/react-native-fundamentals/quiz.md +61 -0
  209. package/modules/react-native-fundamentals/resources.md +24 -0
  210. package/modules/react-native-fundamentals/walkthrough.md +84 -0
  211. package/modules/registry.yaml +1650 -0
  212. package/modules/risk-management/content.md +162 -0
  213. package/modules/risk-management/exercises.md +86 -0
  214. package/modules/risk-management/module.yaml +41 -0
  215. package/modules/risk-management/quick-ref.md +82 -0
  216. package/modules/risk-management/quiz.md +73 -0
  217. package/modules/risk-management/resources.md +40 -0
  218. package/modules/risk-management/walkthrough.md +67 -0
  219. package/modules/running-effective-standups/content.md +119 -0
  220. package/modules/running-effective-standups/exercises.md +79 -0
  221. package/modules/running-effective-standups/module.yaml +40 -0
  222. package/modules/running-effective-standups/quick-ref.md +61 -0
  223. package/modules/running-effective-standups/quiz.md +73 -0
  224. package/modules/running-effective-standups/resources.md +36 -0
  225. package/modules/running-effective-standups/walkthrough.md +76 -0
  226. package/modules/solid-principles/content.md +154 -0
  227. package/modules/solid-principles/exercises.md +107 -0
  228. package/modules/solid-principles/module.yaml +42 -0
  229. package/modules/solid-principles/quick-ref.md +50 -0
  230. package/modules/solid-principles/quiz.md +102 -0
  231. package/modules/solid-principles/resources.md +39 -0
  232. package/modules/solid-principles/walkthrough.md +84 -0
  233. package/modules/sprint-planning/content.md +142 -0
  234. package/modules/sprint-planning/exercises.md +79 -0
  235. package/modules/sprint-planning/game.yaml +84 -0
  236. package/modules/sprint-planning/module.yaml +44 -0
  237. package/modules/sprint-planning/quick-ref.md +76 -0
  238. package/modules/sprint-planning/quiz.md +102 -0
  239. package/modules/sprint-planning/resources.md +39 -0
  240. package/modules/sprint-planning/walkthrough.md +75 -0
  241. package/modules/sql-fundamentals/content.md +160 -0
  242. package/modules/sql-fundamentals/exercises.md +87 -0
  243. package/modules/sql-fundamentals/game.yaml +105 -0
  244. package/modules/sql-fundamentals/module.yaml +45 -0
  245. package/modules/sql-fundamentals/quick-ref.md +53 -0
  246. package/modules/sql-fundamentals/quiz.md +103 -0
  247. package/modules/sql-fundamentals/resources.md +42 -0
  248. package/modules/sql-fundamentals/walkthrough.md +92 -0
  249. package/modules/sql-fundamentals/workshop.yaml +109 -0
  250. package/modules/stakeholder-communication/content.md +186 -0
  251. package/modules/stakeholder-communication/exercises.md +87 -0
  252. package/modules/stakeholder-communication/module.yaml +38 -0
  253. package/modules/stakeholder-communication/quick-ref.md +89 -0
  254. package/modules/stakeholder-communication/quiz.md +73 -0
  255. package/modules/stakeholder-communication/resources.md +41 -0
  256. package/modules/stakeholder-communication/walkthrough.md +74 -0
  257. package/modules/system-design/content.md +149 -0
  258. package/modules/system-design/exercises.md +83 -0
  259. package/modules/system-design/game.yaml +95 -0
  260. package/modules/system-design/module.yaml +46 -0
  261. package/modules/system-design/quick-ref.md +59 -0
  262. package/modules/system-design/quiz.md +102 -0
  263. package/modules/system-design/resources.md +46 -0
  264. package/modules/system-design/walkthrough.md +90 -0
  265. package/modules/team-topologies/content.md +166 -0
  266. package/modules/team-topologies/exercises.md +85 -0
  267. package/modules/team-topologies/module.yaml +41 -0
  268. package/modules/team-topologies/quick-ref.md +61 -0
  269. package/modules/team-topologies/quiz.md +101 -0
  270. package/modules/team-topologies/resources.md +37 -0
  271. package/modules/team-topologies/walkthrough.md +76 -0
  272. package/modules/technical-debt/content.md +111 -0
  273. package/modules/technical-debt/exercises.md +92 -0
  274. package/modules/technical-debt/module.yaml +39 -0
  275. package/modules/technical-debt/quick-ref.md +60 -0
  276. package/modules/technical-debt/quiz.md +73 -0
  277. package/modules/technical-debt/resources.md +25 -0
  278. package/modules/technical-debt/walkthrough.md +94 -0
  279. package/modules/technical-mentoring/content.md +128 -0
  280. package/modules/technical-mentoring/exercises.md +84 -0
  281. package/modules/technical-mentoring/module.yaml +41 -0
  282. package/modules/technical-mentoring/quick-ref.md +74 -0
  283. package/modules/technical-mentoring/quiz.md +73 -0
  284. package/modules/technical-mentoring/resources.md +33 -0
  285. package/modules/technical-mentoring/walkthrough.md +65 -0
  286. package/modules/test-strategy/content.md +136 -0
  287. package/modules/test-strategy/exercises.md +84 -0
  288. package/modules/test-strategy/game.yaml +99 -0
  289. package/modules/test-strategy/module.yaml +45 -0
  290. package/modules/test-strategy/quick-ref.md +66 -0
  291. package/modules/test-strategy/quiz.md +99 -0
  292. package/modules/test-strategy/resources.md +60 -0
  293. package/modules/test-strategy/walkthrough.md +97 -0
  294. package/modules/test-strategy/workshop.yaml +96 -0
  295. package/modules/typescript-fundamentals/content.md +127 -0
  296. package/modules/typescript-fundamentals/exercises.md +79 -0
  297. package/modules/typescript-fundamentals/game.yaml +111 -0
  298. package/modules/typescript-fundamentals/module.yaml +45 -0
  299. package/modules/typescript-fundamentals/quick-ref.md +55 -0
  300. package/modules/typescript-fundamentals/quiz.md +104 -0
  301. package/modules/typescript-fundamentals/resources.md +42 -0
  302. package/modules/typescript-fundamentals/walkthrough.md +71 -0
  303. package/modules/typescript-fundamentals/workshop.yaml +146 -0
  304. package/modules/user-story-mapping/content.md +123 -0
  305. package/modules/user-story-mapping/exercises.md +87 -0
  306. package/modules/user-story-mapping/module.yaml +41 -0
  307. package/modules/user-story-mapping/quick-ref.md +64 -0
  308. package/modules/user-story-mapping/quiz.md +73 -0
  309. package/modules/user-story-mapping/resources.md +29 -0
  310. package/modules/user-story-mapping/walkthrough.md +86 -0
  311. package/modules/writing-prds/content.md +133 -0
  312. package/modules/writing-prds/exercises.md +93 -0
  313. package/modules/writing-prds/game.yaml +83 -0
  314. package/modules/writing-prds/module.yaml +44 -0
  315. package/modules/writing-prds/quick-ref.md +77 -0
  316. package/modules/writing-prds/quiz.md +103 -0
  317. package/modules/writing-prds/resources.md +30 -0
  318. package/modules/writing-prds/walkthrough.md +87 -0
  319. package/package.json +5 -3
  320. package/src/server.js +17 -7
@@ -0,0 +1,38 @@
1
+ slug: stakeholder-communication
2
+ title: "Stakeholder Communication — Status Updates That Actually Help"
3
+ version: 1.0.0
4
+ description: "Write effective status updates, communicate delays, and manage stakeholder expectations with clarity and impact."
5
+ category: project-management
6
+ tags: [stakeholder-communication, status-updates, reporting, project-management, leadership]
7
+ difficulty: beginner
8
+
9
+ xp:
10
+ read: 10
11
+ walkthrough: 30
12
+ exercise: 20
13
+ quiz: 15
14
+ quiz-perfect-bonus: 10
15
+
16
+ time:
17
+ quick: 5
18
+ read: 15
19
+ guided: 40
20
+
21
+ prerequisites: []
22
+ related: [risk-management, sprint-planning, one-on-ones]
23
+
24
+ triggers:
25
+ - "How do I write a good status update?"
26
+ - "How do I communicate project delays?"
27
+ - "How do I manage stakeholder expectations?"
28
+ - "What should I include in a project status report?"
29
+
30
+ visuals:
31
+ diagrams: [diagram-flow, diagram-mermaid]
32
+ quiz-types: [quiz-drag-order, quiz-timed-choice]
33
+ slides: true
34
+
35
+ sources:
36
+ - url: "https://www.amazon.com/Crucial-Conversations-Tools-Talking-Staked/dp/1469266822"
37
+ label: "Crucial Conversations by Patterson et al."
38
+ type: book
@@ -0,0 +1,89 @@
1
+ # Stakeholder Communication Quick Reference
2
+
3
+ ## Pyramid Principle
4
+
5
+ **Lead with the conclusion.** First line = takeaway. Then support.
6
+
7
+ ## RAG Status
8
+
9
+ | G | Green — On track |
10
+ |---|-------------------|
11
+ | A | Amber — At risk; working on it |
12
+ | R | Red — Off track; needs intervention |
13
+
14
+ ## Status Update Structure
15
+
16
+ 1. **What happened** — Completed, shipped
17
+ 2. **What's next** — Planned
18
+ 3. **Blockers** — What's in the way
19
+ 4. **Risks** — What might go wrong + mitigation
20
+
21
+ ## Audience Quick Guide
22
+
23
+ | Audience | Want |
24
+ |----------|------|
25
+ | Executives | Outcomes, timeline, risks, decisions |
26
+ | Engineers | Blockers, dependencies, scope |
27
+ | Product | Priorities, trade-offs |
28
+ | Customers | When, what's new |
29
+
30
+ ## Stakeholder Grid
31
+
32
+ | | Low Interest | High Interest |
33
+ |---|--------------|----------------|
34
+ | **High Power** | Keep satisfied | Manage closely |
35
+ | **Low Power** | Monitor | Keep informed |
36
+
37
+ ## Bad News Template
38
+
39
+ 1. State the fact
40
+ 2. Explain cause
41
+ 3. What you're doing
42
+ 4. What you need
43
+ 5. Next update when
44
+
45
+ ## Status Template (Short)
46
+
47
+ ```
48
+ RAG: [G/A/R] | TL;DR: [One sentence]
49
+
50
+ Completed: [Bullets]
51
+ Next: [Bullets]
52
+ Blockers: [Blocker + owner]
53
+ Risks: [Risk + mitigation]
54
+ ```
55
+
56
+ ## Cadence Examples
57
+
58
+ | Who | Cadence | Format |
59
+ |-----|---------|--------|
60
+ | Core team | Daily | Standup, Slack |
61
+ | Leads | Weekly | Written + call |
62
+ | Execs | Bi-weekly | Written (pyramid) |
63
+
64
+ ## Written vs Verbal
65
+
66
+ | Written | Verbal |
67
+ |---------|--------|
68
+ | Status, decisions, specs | Alignment, sensitive topics |
69
+ | Async, record | Real-time, Q&A |
70
+
71
+ ## Mermaid: Stakeholder Grid
72
+
73
+ ```mermaid
74
+ quadrantChart
75
+ x-axis Low Interest --> High Interest
76
+ y-axis Low Power --> High Power
77
+ quadrant-1 Manage closely
78
+ quadrant-2 Keep informed
79
+ quadrant-3 Monitor
80
+ quadrant-4 Keep satisfied
81
+ ```
82
+
83
+ ## Avoiding Overload
84
+
85
+ - 1 page max (exec)
86
+ - Bullets over paragraphs
87
+ - Link to details
88
+ - Consistent format
89
+ - RAG + key points first
@@ -0,0 +1,73 @@
1
+ # Stakeholder Communication — Quiz
2
+
3
+ ## Question 1
4
+
5
+ The pyramid principle suggests you should:
6
+
7
+ A) Bury the conclusion at the end
8
+ B) Lead with the conclusion, then support it
9
+ C) Use only bullet points
10
+ D) Never mention risks
11
+
12
+ <!-- ANSWER: B -->
13
+ <!-- EXPLANATION: The pyramid principle means putting the most important point first. Busy stakeholders often skim; if they read only the first line, they should get the takeaway. Support with details below. -->
14
+
15
+ ## Question 2
16
+
17
+ In RAG status, Amber typically means:
18
+
19
+ A) Everything is perfect
20
+ B) At risk; issues exist; we're working on them
21
+ C) Project is cancelled
22
+ D) No update this week
23
+
24
+ <!-- ANSWER: B -->
25
+ <!-- EXPLANATION: Amber = at risk. There are issues, but the team is addressing them. It needs attention but isn't yet Red (off track). Amber is common and appropriate when managing risks. -->
26
+
27
+ ## Question 3
28
+
29
+ When communicating bad news (e.g., a delay), you should:
30
+
31
+ A) Wait until you have a full solution
32
+ B) Communicate early, state the fact, explain cause, share plan
33
+ C) Send it only to your manager
34
+ D) Use vague language to soften the blow
35
+
36
+ <!-- ANSWER: B -->
37
+ <!-- EXPLANATION: Bad news does not improve with age. Communicate early. Be clear: state the fact, explain why, say what you're doing, and what you need. Early communication creates more options and preserves trust. -->
38
+
39
+ ## Question 4
40
+
41
+ In a power/interest stakeholder grid, a high-power, high-interest stakeholder should be:
42
+
43
+ A) Monitored only
44
+ B) Kept satisfied with minimal contact
45
+ C) Managed closely—regular, rich updates
46
+ D) Excluded from updates
47
+
48
+ <!-- ANSWER: C -->
49
+ <!-- EXPLANATION: High power + high interest = manage closely. They have influence and care. They need regular, substantive updates and involvement in decisions. Keep them informed and engaged. -->
50
+
51
+ ## Question 5
52
+
53
+ An effective status update structure includes:
54
+
55
+ A) Only what was completed
56
+ B) What happened, what's next, blockers, risks
57
+ C) Jira ticket IDs and technical details only
58
+ D) A maximum of one sentence
59
+
60
+ <!-- ANSWER: B -->
61
+ <!-- EXPLANATION: A good status answers four questions: What happened? What's next? What are the blockers? What are the risks? This structure gives stakeholders a complete picture without overwhelming them. -->
62
+
63
+ ## Question 6
64
+
65
+ To avoid information overload in status updates, you should:
66
+
67
+ A) Include every detail in the main email
68
+ B) Use one page max for exec summaries, bullets over paragraphs, link to details
69
+ C) Send daily 10-page reports
70
+ D) Never use written updates
71
+
72
+ <!-- ANSWER: B -->
73
+ <!-- EXPLANATION: Respect your reader's time. One page max for exec summaries. Prefer bullets over paragraphs. Link to detailed docs or tickets rather than inlining everything. Consistent format helps people scan quickly. -->
@@ -0,0 +1,41 @@
1
+ # Stakeholder Communication — Resources
2
+
3
+ ## Books
4
+
5
+ - **Crucial Conversations: Tools for Talking When Stakes Are High** by Patterson, Grenny, McMillan, and Switzler — Masterclass on difficult conversations, including delivering bad news and managing expectations.
6
+ - **The Pyramid Principle** by Barbara Minto — The classic on structuring communication: lead with the conclusion.
7
+ - **Never Split the Difference** by Chris Voss — Negotiation and communication from an FBI negotiator; useful for high-stakes stakeholder conversations.
8
+ - **Thanks for the Feedback** by Douglas Stone and Sheila Heen — Receiving and giving feedback; applies to status and reviews.
9
+
10
+ ## Articles and Readings
11
+
12
+ - [The Pyramid Principle in Practice](https://www.mckinsey.com/~/media/mckinsey/industries/public%20and%20social%20sector/our%20insights/the%20pyramid%20principle%20and%20the%20art%20of%20communicating%20on%20purpose/the-pyramid-principle-in-practice.pdf) — McKinsey. Applying the pyramid principle to business communication.
13
+ - [How to Write a Project Status Update](https://www.atlassian.com/blog/inside-atlassian/how-to-write-project-status-updates) — Atlassian. Templates and best practices.
14
+ - [RAG Status Reporting](https://www.apm.org.uk/resources/find-a-resource/earned-value-management-rag-status-reporting/) — APM. Red/Amber/Green in project management.
15
+ - [Stakeholder Analysis and Mapping](https://www.mindtools.com/pages/article/newPPM_08.htm) — Mind Tools. Power/interest grid and analysis.
16
+ - [Communicating Bad News to Stakeholders](https://www.pmi.org/learning/library/communicating-bad-news-stakeholders-7097) — PMI. Delivering difficult updates.
17
+
18
+ ## Tools
19
+
20
+ - [Notion](https://www.notion.so/) — Status pages, project wikis, shared updates.
21
+ - [Confluence](https://www.atlassian.com/software/confluence) — Status reports, meeting notes, stakeholder pages.
22
+ - [Jira](https://www.atlassian.com/software/jira) — Status via dashboards, filters, and release reports.
23
+ - [Linear](https://linear.app/) — Cycle updates, project status.
24
+ - [Slack](https://slack.com/) — Async updates, channels per project or stakeholder group.
25
+ - [Loom](https://www.loom.com/) — Short video updates for async stakeholder communication.
26
+
27
+ ## Templates
28
+
29
+ - [Project Status Report Template](https://www.smartsheet.com/content/project-status-report-templates) — Smartsheet. Free status report templates.
30
+ - [Stakeholder Map Template](https://miro.com/templates/stakeholder-map/) — Miro. Power/interest grid for collaboration.
31
+ - [RAG Status Dashboard](https://www.atlassian.com/software/jira/status) — Jira. Built-in RAG and status tracking.
32
+
33
+ ## Podcasts
34
+
35
+ - [Manager Tools](https://www.manager-tools.com/) — Communication, feedback, and managing up.
36
+ - [The Look & Sound of Leadership](https://www.manager-tools.com/podcasts/look-sound-leadership) — Executive communication.
37
+
38
+ ## Videos
39
+
40
+ - [Barbara Minto on the Pyramid Principle](https://www.youtube.com/results?search_query=pyramid+principle+barbara+minto) — Search for Minto's presentations.
41
+ - [Crucial Conversations Summary](https://www.youtube.com/results?search_query=crucial+conversations+summary) — Summaries of the book's key ideas.
@@ -0,0 +1,74 @@
1
+ # Stakeholder Communication Walkthrough — Learn by Doing
2
+
3
+ ## Before We Begin
4
+
5
+ **Diagnostic:** Who are you writing for? Think of one person who gets your project updates. What do they *need* from you—and what would they skip? How does your audience change the message?
6
+
7
+ **Checkpoint:** You can name at least two different audiences for the same project and one way your update would differ for each.
8
+
9
+ ---
10
+
11
+ ## Step 1: Draft a Status Update
12
+
13
+ **Task:** Pick a project (real or hypothetical). Write a 6–8 line status update using the structure: What happened, What's next, Blockers, Risks. Apply the pyramid principle—lead with the conclusion (RAG + one-sentence TL;DR).
14
+
15
+ **Question:** If your reader only saw the first line, would they get the right takeaway? What would they miss?
16
+
17
+ **Checkpoint:** Update has RAG, TL;DR, and all four sections. First line is the conclusion.
18
+
19
+ ---
20
+
21
+ ## Step 2: Map Stakeholders
22
+
23
+ <!-- hint:buttons type="single" prompt="Who belongs in the 'manage closely' quadrant?" options="High power + high interest,High power + low interest,Low power + high interest,Low power + low interest" -->
24
+ <!-- hint:list style="cards" -->
25
+
26
+ **Task:** List 5 stakeholders for your project. Plot each on a power/interest grid. For the "manage closely" quadrant, write one sentence: what do they need from your updates?
27
+
28
+ **Question:** How would your update change if you were writing for the "manage closely" vs "keep informed" quadrant? What would you add or remove?
29
+
30
+ **Checkpoint:** 5 stakeholders plotted; "manage closely" needs are stated.
31
+
32
+ ---
33
+
34
+ ## Step 3: Communicate a Delay
35
+
36
+ **Task:** Imagine your release is slipping by 1 week due to a third-party API delay. Write a 4–5 sentence message to an executive. Include: the fact, the cause, what you're doing, and what you need (if anything).
37
+
38
+ **Question:** What might you be tempted to soften or hide? Why is stating it clearly better?
39
+
40
+ **Checkpoint:** Message is direct, includes cause and plan, and has a clear ask or next step.
41
+
42
+ ---
43
+
44
+ ## Step 4: Tailor for Two Audiences
45
+
46
+ **Task:** Take one status update. Create two versions: (1) For an executive—3–4 bullets, pyramid style. (2) For an engineering lead—more detail on technical blockers and dependencies.
47
+
48
+ **Question:** What's different? What would be wrong with sending the exec version to the eng lead, or vice versa?
49
+
50
+ **Checkpoint:** Both versions exist; exec version is shorter and outcome-focused; eng version has technical detail.
51
+
52
+ ---
53
+
54
+ ## Step 5: Apply RAG Thoughtfully
55
+
56
+ <!-- hint:card type="tip" title="RAG status: Red = needs attention, Amber = watch, Green = on track" -->
57
+
58
+ **Task:** You have: (A) One minor bug in edge case. (B) Key developer out for a week. (C) Scope creep request from stakeholder. Assign RAG to each and justify. Write one sentence for each on how you'd communicate it.
59
+
60
+ **Question:** When is Amber more appropriate than Red? When might Green be misleading?
61
+
62
+ **Checkpoint:** RAG assigned with rationale; communication approach stated for each.
63
+
64
+ ---
65
+
66
+ ## Step 6: Design a Cadence
67
+
68
+ <!-- hint:celebrate -->
69
+
70
+ **Task:** For your project, define update cadence for: core team, product/eng leads, and executives. Specify: frequency, format (written/call), and what each gets.
71
+
72
+ **Question:** What happens if executives get daily updates? What happens if they get monthly? Where's the right balance?
73
+
74
+ **Checkpoint:** Cadence defined for 3 levels; format and content appropriate to each.
@@ -0,0 +1,149 @@
1
+ # System Design — From Requirements to Architecture
2
+
3
+ ## The System Design Interview Framework
4
+
5
+ A structured approach to designing scalable systems:
6
+
7
+ 1. **Requirements** — Clarify functional (what) and non-functional (scale, latency, availability)
8
+ 2. **Estimation** — Back-of-envelope (DAU, QPS, storage) to bound the problem
9
+ 3. **High-level design** — Sketch boxes and arrows (API, services, data flow)
10
+ 4. **Deep dive** — Choose 2–3 components to detail (DB schema, caching, bottlenecks)
11
+ 5. **Bottlenecks** — Identify single points of failure, scale limits, mitigation
12
+
13
+ ```mermaid
14
+ flowchart LR
15
+ A[Requirements] --> B[Estimation]
16
+ B --> C[High-Level Design]
17
+ C --> D[Deep Dive]
18
+ D --> E[Bottlenecks]
19
+ ```
20
+
21
+ ## CAP Theorem
22
+
23
+ In a distributed system, you can only guarantee **two of three**:
24
+
25
+ | Property | Meaning |
26
+ |----------|---------|
27
+ | **Consistency** | Every read returns the latest write |
28
+ | **Availability** | Every request receives a response |
29
+ | **Partition tolerance** | System works despite network failures |
30
+
31
+ In practice: network partitions happen. You choose **CP** (e.g., banking) or **AP** (e.g., social feeds).
32
+
33
+ ## Architecture: Typical Web App
34
+
35
+ ```mermaid
36
+ flowchart TB
37
+ subgraph Client
38
+ C[Client / Browser]
39
+ end
40
+ subgraph Edge
41
+ CDN[CDN / Static Assets]
42
+ end
43
+ subgraph App
44
+ LB[Load Balancer]
45
+ A1[App Server 1]
46
+ A2[App Server 2]
47
+ A3[App Server N]
48
+ end
49
+ subgraph Data
50
+ Cache[Cache Redis/Memcached]
51
+ DB[(Primary DB)]
52
+ Replica[(Replica)]
53
+ MQ[Message Queue]
54
+ end
55
+ C --> CDN
56
+ C --> LB
57
+ LB --> A1 & A2 & A3
58
+ A1 & A2 & A3 --> Cache
59
+ A1 & A2 & A3 --> DB
60
+ DB --> Replica
61
+ A1 & A2 & A3 --> MQ
62
+ ```
63
+
64
+ ## Load Balancing
65
+
66
+ Distribute traffic across servers: **Round-robin**, **least connections**, **consistent hashing** (for stateful affinity).
67
+
68
+ ```bash
69
+ # Example: nginx upstream (round-robin)
70
+ upstream app_servers {
71
+ server 10.0.0.1:3000;
72
+ server 10.0.0.2:3000;
73
+ server 10.0.0.3:3000;
74
+ }
75
+ ```
76
+
77
+ ## Caching Strategies
78
+
79
+ | Layer | Use Case | Example |
80
+ |-------|----------|---------|
81
+ | **CDN** | Static assets, edge caching | CloudFront, Cloudflare |
82
+ | **App cache** | Hot data, session | Redis, Memcached |
83
+ | **DB cache** | Query result cache | Redis, query cache |
84
+
85
+ **Cache-aside:** App checks cache first; on miss, fetches from DB and populates cache. **Write-through:** Write to DB and cache together.
86
+
87
+ ## Database Choices
88
+
89
+ | Type | When to Use |
90
+ |------|-------------|
91
+ | **SQL** | ACID, relational, complex joins |
92
+ | **NoSQL (document)** | Flexible schema, high write throughput |
93
+ | **NoSQL (key-value)** | Simple lookups, session storage |
94
+ | **NoSQL (columnar)** | Analytics, time-series |
95
+
96
+ **Sharding:** Partition data by key (e.g., user_id) across DB instances. **Replication:** Read replicas for read scaling; primary for writes.
97
+
98
+ ## Message Queues
99
+
100
+ Decouple producers and consumers: **RabbitMQ**, **Kafka**, **SQS**. Use for async processing, event sourcing, buffering spikes.
101
+
102
+ ## Microservices vs Monolith
103
+
104
+ | Monolith | Microservices |
105
+ |----------|---------------|
106
+ | Single deployable unit | Independently deployable services |
107
+ | Simpler ops, shared DB | Per-service DB, network boundaries |
108
+ | Good for small teams | Scales org and team size |
109
+
110
+ Start with a monolith; extract services when boundaries are clear.
111
+
112
+ ## Rate Limiting
113
+
114
+ Protect APIs: **token bucket**, **sliding window**, **fixed window**. Return `429 Too Many Requests` with `Retry-After` header.
115
+
116
+ ## Consistent Hashing
117
+
118
+ Minimize rebalancing when nodes are added/removed. Keys map to a ring; each node owns a range. Used in CDN, caching, sharding.
119
+
120
+ ## Microservices Layout
121
+
122
+ ```mermaid
123
+ flowchart LR
124
+ subgraph Gateway
125
+ API[API Gateway]
126
+ end
127
+ subgraph Services
128
+ S1[Auth Service]
129
+ S2[User Service]
130
+ S3[Order Service]
131
+ S4[Payment Service]
132
+ end
133
+ subgraph Shared
134
+ MQ[Message Bus]
135
+ E[Event Store]
136
+ end
137
+ API --> S1 & S2 & S3 & S4
138
+ S2 & S3 & S4 --> MQ
139
+ MQ --> E
140
+ S1 -.-> S2
141
+ S3 --> S4
142
+ ```
143
+
144
+ ## Key Takeaways
145
+
146
+ - **Requirements first** — Don't over-engineer for scale you don't need
147
+ - **Bottlenecks** — Identify SPOFs and plan for failure
148
+ - **Cache wisely** — Invalidation is hard; design for it
149
+ - **Async where it helps** — Message queues for decoupling and buffering
@@ -0,0 +1,83 @@
1
+ # System Design Exercises
2
+
3
+ ## Exercise 1: Design a News Feed
4
+
5
+ **Task:** Design a news feed (e.g., Twitter-like) for 10M users. Document: (1) functional and non-functional requirements, (2) data model (users, posts, follows), (3) high-level architecture with cache and DB, (4) how you'd generate "feed for user X" (fan-out on write vs read).
6
+
7
+ **Validation:**
8
+ - [ ] Requirements are clear and bounded
9
+ - [ ] Data model supports follows and posts
10
+ - [ ] Architecture includes load balancer, app tier, cache, DB
11
+ - [ ] Tradeoffs between fan-out on write vs read are explained
12
+
13
+ **Hints:**
14
+ 1. Fan-out on write: precompute feeds when a post is created; fast reads, slower writes
15
+ 2. Fan-out on read: fetch from followed users at read time; simpler writes, heavier reads
16
+ 3. Hybrid: fan-out for normal users, on-read for celebrities
17
+
18
+ ---
19
+
20
+ ## Exercise 2: Add Caching to an API
21
+
22
+ **Task:** You have a REST API: `GET /users/:id` returns user profile. Add a cache layer. Define: (1) cache key format, (2) TTL, (3) invalidation strategy when user updates profile, (4) what to do on cache miss.
23
+
24
+ **Validation:**
25
+ - [ ] Cache key is deterministic and unique per user
26
+ - [ ] TTL chosen with reasoning (e.g., 5 min vs 1 hour)
27
+ - [ ] Invalidation on write is specified (invalidate key, or write-through)
28
+ - [ ] Cache-aside flow on miss is correct
29
+
30
+ **Hints:**
31
+ 1. Key: `user:{id}` or `user:profile:{id}`
32
+ 2. Invalidation: delete key on PUT/PATCH, or use write-through
33
+ 3. Cache stampede: consider locking or probabilistic early refresh
34
+
35
+ ---
36
+
37
+ ## Exercise 3: Shard a Database
38
+
39
+ **Task:** You have a `orders` table with 1B rows. Design a sharding strategy. Specify: (1) shard key, (2) number of shards, (3) how to route a query for "orders by user_id", (4) how to handle "orders by date range" (cross-shard query).
40
+
41
+ **Validation:**
42
+ - [ ] Shard key chosen (user_id typical for orders)
43
+ - [ ] Routing is deterministic (e.g., hash(user_id) % N)
44
+ - [ ] Cross-shard query strategy described (query each shard, merge; or use a separate analytics DB)
45
+
46
+ **Hints:**
47
+ 1. user_id as shard key: all orders for a user on same shard
48
+ 2. date range: either scatter-gather or maintain a read replica for analytics
49
+ 3. Consistent hashing helps when adding/removing shards
50
+
51
+ ---
52
+
53
+ ## Exercise 4: Message Queue for Async Jobs
54
+
55
+ **Task:** Design a "send email" flow: user signs up → send welcome email. Use a message queue. Draw the flow: API → queue → worker. What happens if the worker fails mid-processing? How do you ensure at-least-once delivery?
56
+
57
+ **Validation:**
58
+ - [ ] Flow is API → enqueue → worker consumes
59
+ - [ ] Failure handling: retry, dead-letter queue
60
+ - [ ] At-least-once: acknowledge only after successful send; redeliver on timeout
61
+ - [ ] Idempotency considered (don't send duplicate emails)
62
+
63
+ **Hints:**
64
+ 1. Worker acks after email sent; if crash before ack, message redelivered
65
+ 2. Idempotency: store sent_email_ids or use idempotency key
66
+ 3. Dead-letter queue for messages that fail repeatedly
67
+
68
+ ---
69
+
70
+ ## Exercise 5: Rate Limiting Design
71
+
72
+ **Task:** Implement a simple rate limiter: max 100 requests per minute per API key. Describe the data structure and algorithm. What would you use in Redis? Write pseudocode for "is request allowed?".
73
+
74
+ **Validation:**
75
+ - [ ] Algorithm chosen (fixed window, sliding window, or token bucket)
76
+ - [ ] Data structure supports per-key counters
77
+ - [ ] Redis INCR + EXPIRE or similar is correctly described
78
+ - [ ] Edge cases: what if the clock is at minute boundary?
79
+
80
+ **Hints:**
81
+ 1. Fixed window: `KEY = "ratelimit:{api_key}:{minute}"`, INCR, EXPIRE 60
82
+ 2. Sliding window: sorted set, remove expired, count, add current
83
+ 3. Token bucket: more complex but smoother limiting
@@ -0,0 +1,95 @@
1
+ games:
2
+ - type: scenario
3
+ title: "Scale the System"
4
+ startHealth: 5
5
+ steps:
6
+ - id: start
7
+ situation: "You're designing a URL shortener (like bit.ly). It launches and goes viral — traffic spikes 100x in a week. You need a database to store short codes and long URLs. Which do you choose?"
8
+ choices:
9
+ - text: "PostgreSQL — ACID guarantees, easy schema, good for relational data."
10
+ consequence: "PostgreSQL is solid but can become a write bottleneck. For a shortener, you might need horizontal scaling soon."
11
+ health: 0
12
+ next: database
13
+ - text: "Redis — blazing fast, simple key-value. Short code → long URL fits perfectly."
14
+ consequence: "Redis is great for cache, but persisting to disk and handling durability is trickier. You'd typically use Redis for cache, not primary storage alone."
15
+ health: -1
16
+ next: database
17
+ - text: "PostgreSQL for durability + Redis for hot cache — best of both."
18
+ consequence: "Smart. Durable storage plus fast reads. You can scale reads with Redis and keep writes in PostgreSQL."
19
+ health: 1
20
+ next: database
21
+ - id: database
22
+ situation: "Traffic keeps growing. Redis cache expires, and suddenly 10,000 requests hit the database at once for the same popular link. Cache stampede! How do you handle it?"
23
+ choices:
24
+ - text: "Let them all hit the database — it can handle it."
25
+ consequence: "A stampede can overwhelm the DB. You need to prevent thundering herd."
26
+ health: -2
27
+ next: stampede
28
+ - text: "Use probabilistic early expiration — some requests extend TTL, others repopulate cache."
29
+ consequence: "Probabilistic early expiration (e.g. 'recompute before expire') spreads load. Good pattern."
30
+ health: 1
31
+ next: stampede
32
+ - text: "Implement request coalescing — only one request fetches; others wait for it."
33
+ consequence: "Request coalescing (or 'single-flight') ensures only one recompute. Others block and get the result. Also valid."
34
+ health: 1
35
+ next: stampede
36
+ - id: stampede
37
+ situation: "Cache stampede is under control. But global users complain about latency — requests from Asia take 200ms to reach your US datacenter. What next?"
38
+ choices:
39
+ - text: "Add more database replicas in the same region."
40
+ consequence: "Replicas help DB load but don't fix network latency. Users far from the server still wait."
41
+ health: -1
42
+ next: cdn
43
+ - text: "Put a CDN in front — cache short URLs at edge locations worldwide."
44
+ consequence: "CDN caches at the edge. Most requests never hit your origin. Latency drops dramatically."
45
+ health: 1
46
+ next: cdn
47
+ - text: "Move the entire system to a region closer to most users."
48
+ consequence: "Single-region migration is disruptive. CDN gives global edge without moving everything."
49
+ health: 0
50
+ next: cdn
51
+ - id: cdn
52
+ situation: "CDN is live. But one influencer posts a link — suddenly one short code gets 80% of all traffic. Hot key! The cache node for that key is overwhelmed. How do you deal with it?"
53
+ choices:
54
+ - text: "Shard the cache by short code — spread hot keys across nodes."
55
+ consequence: "Sharding by short code can still put a hot key on one node. Hot keys need different handling."
56
+ health: -1
57
+ next: hot_key
58
+ - text: "Replicate the hot key to multiple cache nodes, or use consistent hashing with virtual nodes."
59
+ consequence: "Replicating hot data or using more granular hashing spreads the load. Good approach."
60
+ health: 1
61
+ next: hot_key
62
+ - text: "Ignore it — CDN should absorb most of it."
63
+ consequence: "CDN helps, but if the key is so hot it overwhelms a single CDN node, you need a strategy."
64
+ health: -1
65
+ next: hot_key
66
+ - id: hot_key
67
+ situation: "Hot key is mitigated. Leadership says: prepare for 10x growth in 6 months. What do you prioritize?"
68
+ choices:
69
+ - text: "Rewrite everything in a faster language."
70
+ consequence: "Premature optimization. Architecture and bottlenecks matter more than language for most scale problems."
71
+ health: -2
72
+ next: growth
73
+ - text: "Add read replicas, consider write partitioning (e.g. by short code range), and capacity plan."
74
+ consequence: "Solid. Scale reads, plan for write partitioning if needed, and model capacity. Pragmatic."
75
+ health: 1
76
+ next: growth
77
+ - text: "Build a real-time analytics dashboard first."
78
+ consequence: "Analytics are nice but not critical for handling 10x. Core scalability comes first."
79
+ health: -1
80
+ next: growth
81
+ - id: growth
82
+ situation: "You've scaled the shortener: PostgreSQL + Redis cache, CDN, hot-key handling, and growth plan. A new requirement: track click analytics (timestamp, geo, device) for each short code. How do you add it?"
83
+ choices:
84
+ - text: "Add analytics columns to the main URLs table."
85
+ consequence: "Mixing transactional and analytical data slows both. High-volume analytics bloat the core table."
86
+ health: -2
87
+ next: end
88
+ - text: "Write analytics to a separate high-throughput store (e.g. Kafka + data lake, or append-only store)."
89
+ consequence: "Right. Separate the analytics pipeline from the core URL lookup. Event stream or append-only keeps the shortener fast."
90
+ health: 1
91
+ next: end
92
+ - text: "Store analytics in Redis and batch-flush to PostgreSQL."
93
+ consequence: "Redis can buffer, but analytics volume may overwhelm. A dedicated pipeline (Kafka, etc.) is more robust for high volume."
94
+ health: 0
95
+ next: end