@shaykec/bridge 0.4.25 → 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 (319) 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 +1 -1
@@ -0,0 +1,76 @@
1
+ # Sprint Planning Quick Reference
2
+
3
+ ## The Two Parts
4
+
5
+ | Part | Focus | Who |
6
+ |------|-------|-----|
7
+ | **What** | Sprint goal, selected items | Product Owner + Team |
8
+ | **How** | Tasks, approach | Development Team |
9
+
10
+ ## Sprint Goal Template
11
+
12
+ ```
13
+ Sprint [X]: [One-sentence outcome]
14
+ Success: [2–3 concrete outcomes]
15
+ Out of scope: [What we're NOT doing]
16
+ ```
17
+
18
+ ## Estimation Cheat Sheet
19
+
20
+ | Technique | When to Use |
21
+ |-----------|-------------|
22
+ | Story points | Backlog refinement, sprint planning |
23
+ | T-shirt sizing | Quick triage, non-technical stakeholders |
24
+ | Planning poker | New or complex stories, alignment needed |
25
+
26
+ **Fibonacci:** 1, 2, 3, 5, 8, 13, 21
27
+
28
+ ## Velocity vs Capacity
29
+
30
+ | Term | Formula / Meaning |
31
+ |------|-------------------|
32
+ | Capacity | Team size × Days × Hours × (1 − overhead) |
33
+ | Velocity | Avg points completed (last 2–3 sprints) |
34
+ | Forecast | Pull ~80–90% of velocity |
35
+
36
+ ## Definition of Ready (Example)
37
+
38
+ - [ ] Acceptance criteria defined
39
+ - [ ] Dependencies identified
40
+ - [ ] Sized by team
41
+ - [ ] Technically feasible
42
+
43
+ ## Anti-Patterns to Avoid
44
+
45
+ | Anti-Pattern | Better Practice |
46
+ |--------------|-----------------|
47
+ | Over-commit (100%+) | 80–90% of velocity |
48
+ | No sprint goal | One outcome-focused goal |
49
+ | Estimate in hours | Story points (complexity) |
50
+ | Skip "how" | Break into tasks |
51
+ | Stakeholder dictates scope | Team decides |
52
+
53
+ ## Remote Planning Tips
54
+
55
+ 1. **Async prep** — Send items 24–48h ahead
56
+ 2. **Shared boards** — Miro, FigJam, Jira, Linear
57
+ 3. **Timebox** — 15-min chunks
58
+ 4. **Document live** — Capture goal + decisions in shared doc
59
+ 5. **Cameras on** — For goal agreement, voting
60
+
61
+ ## Capacity Example
62
+
63
+ ```
64
+ 5 devs × 10 days × 6 hrs × 0.85 = 255 person-hours
65
+ Velocity: 45 pts → Forecast: 38–40 pts this sprint
66
+ ```
67
+
68
+ ## Mermaid: Sprint Planning Flow
69
+
70
+ ```mermaid
71
+ flowchart LR
72
+ A[Product Owner: goal + items] --> B[Team: capacity]
73
+ B --> C[Select items]
74
+ C --> D[Break into tasks]
75
+ D --> E[Sprint backlog]
76
+ ```
@@ -0,0 +1,102 @@
1
+ # Sprint Planning — Quiz
2
+
3
+ ## Question 1
4
+
5
+ In Scrum, what are the two parts of sprint planning?
6
+
7
+ A) Estimate and commit
8
+ B) What and how
9
+ C) Scope and schedule
10
+ D) Backlog and capacity
11
+
12
+ <!-- ANSWER: B -->
13
+ <!-- EXPLANATION: The Scrum Guide defines sprint planning as having two parts: (1) What can we achieve?—the Product Owner presents the goal and proposed items; (2) How will we build it?—the Development Team plans tasks and approach. -->
14
+
15
+ ## Question 2
16
+
17
+ What is the main purpose of a sprint goal?
18
+
19
+ A) To list all stories in the sprint
20
+ B) To create a single, cohesive objective that guides trade-offs
21
+ C) To satisfy stakeholders
22
+ D) To track velocity
23
+
24
+ <!-- ANSWER: B -->
25
+ <!-- EXPLANATION: The sprint goal is a unifying objective. When the team faces trade-offs mid-sprint, they ask: "Does this support the goal?" Instead of a list of features, it describes the outcome they're aiming for. -->
26
+
27
+ ## Question 3
28
+
29
+ Velocity and capacity differ in that:
30
+
31
+ A) Velocity is in hours, capacity is in points
32
+ B) Velocity is historical throughput; capacity is planned available time
33
+ C) Velocity is set by the Product Owner; capacity by the Scrum Master
34
+ D) They are the same thing
35
+
36
+ <!-- ANSWER: B -->
37
+ <!-- EXPLANATION: Velocity = how many points the team typically completes (measured after the sprint). Capacity = how much person-time is available (planned before the sprint). Capacity helps you sanity-check; velocity helps you forecast. -->
38
+
39
+ ## Question 4
40
+
41
+ Which estimation technique encourages discussion and surfaces assumptions?
42
+
43
+ A) T-shirt sizing
44
+ B) Hours
45
+ C) Planning poker
46
+ D) Random guessing
47
+
48
+ <!-- ANSWER: C -->
49
+ <!-- EXPLANATION: Planning poker involves private voting, reveal, and discussion of outliers. The conversation—"Why did you pick 8?"—surfaces hidden assumptions, dependencies, and knowledge gaps. The estimate is secondary to the alignment. -->
50
+
51
+ ## Question 5
52
+
53
+ A common anti-pattern in sprint planning is:
54
+
55
+ A) Writing a clear sprint goal
56
+ B) Estimating in story points
57
+ C) Over-committing to 100%+ of velocity
58
+ D) Using a Definition of Ready
59
+
60
+ <!-- ANSWER: C -->
61
+ <!-- EXPLANATION: Over-commitment leaves no buffer for unknowns, interrupts, or discovery. Teams often load the sprint to 100% or more of past velocity, then spill work or cut quality. A healthier approach is 80–90% to leave slack. -->
62
+
63
+ ## Question 6
64
+
65
+ In Scrum, the team commits to:
66
+
67
+ A) Delivering every story in the sprint backlog
68
+ B) The sprint goal
69
+ C) A fixed scope with no changes
70
+ D) Completing all tasks in the first week
71
+
72
+ <!-- ANSWER: B -->
73
+ <!-- EXPLANATION: The team commits to the sprint goal—the outcome they're aiming for. The product backlog items selected are a forecast, not a contract. Scope can be rebalanced as the team learns, as long as the goal remains valid. -->
74
+
75
+ ## Question 7
76
+
77
+ <!-- VISUAL: quiz-drag-order -->
78
+
79
+ Put these Scrum sprint ceremonies in the order they occur within a sprint:
80
+
81
+ A) Sprint Review
82
+ B) Sprint Retrospective
83
+ C) Sprint Planning
84
+ D) Daily Scrum (each day)
85
+
86
+ <!-- ANSWER: C,D,A,B -->
87
+ <!-- EXPLANATION: Sprint starts with planning. Daily Scrum runs each day. At the end, Sprint Review (inspect the increment) and Sprint Retrospective (improve the process) close the sprint. -->
88
+
89
+ ## Question 8
90
+
91
+ <!-- VISUAL: quiz-drag-order -->
92
+
93
+ Put these story refinement steps in the correct order:
94
+
95
+ A) Split or combine as needed
96
+ B) Ensure Definition of Ready is met
97
+ C) Clarify acceptance criteria
98
+ D) Estimate (planning poker or similar)
99
+ E) Discuss and ask questions
100
+
101
+ <!-- ANSWER: E,C,A,D,B -->
102
+ <!-- EXPLANATION: Refinement starts with discussion and questions to clarify. Define acceptance criteria, then split or combine stories. Estimate, and finally verify the Definition of Ready before adding to the sprint. -->
@@ -0,0 +1,39 @@
1
+ # Sprint Planning — Resources
2
+
3
+ ## Official Guides
4
+
5
+ - [Scrum Guide](https://scrumguides.org) — The definitive Scrum framework. Free; covers sprint planning, roles, and events.
6
+ - [Scrum Guide — Sprint Planning](https://scrumguides.org/scrum-guide.html#sprint-planning) — Direct link to the sprint planning section.
7
+
8
+ ## Articles and Readings
9
+
10
+ - [Sprint Planning](https://www.mountaingoatsoftware.com/agile/scrum/meetings/sprint-planning-meeting) — Mountain Goat Software. Practical guide to running the ceremony.
11
+ - [Velocity vs Capacity in Agile](https://www.mountaingoatsoftware.com/blog/velocity-vs-capacity) — Mike Cohn. Clarifies the difference and when to use each.
12
+ - [Story Points: Why They Work](https://www.mountaingoatsoftware.com/blog/story-points-why-they-work) — Mike Cohn. The case for relative estimation.
13
+ - [Planning Poker](https://www.mountaingoatsoftware.com/agile/planning-poker) — Mountain Goat Software. How to run planning poker effectively.
14
+ - [Definition of Ready](https://www.scrum.org/resources/blog/definition-ready-empiricism) — Scrum.org. Why DoR matters and how to define it.
15
+ - [Sprint Goal — Why It Matters](https://www.scrum.org/resources/blog/sprint-goal) — Scrum.org. The power of a single, cohesive goal.
16
+
17
+ ## Books
18
+
19
+ - **Scrum: The Art of Doing Twice the Work in Half the Time** by Jeff Sutherland — Origins of Scrum, including sprint planning.
20
+ - **Agile Estimating and Planning** by Mike Cohn — Deep dive on story points, velocity, and planning. The canonical reference.
21
+ - **Succeeding with Agile** by Mike Cohn — Broader agile adoption, including planning best practices.
22
+
23
+ ## Podcasts
24
+
25
+ - [Agile for Humans](https://ryanripley.com/agile-for-humans/) — Ryan Ripley. Episodes on sprint planning, estimation, and Scrum.
26
+ - [Scrum Master Toolbox](https://www.scrummastertoolbox.com/) — Daily tips and stories from practicing Scrum Masters.
27
+
28
+ ## Tools
29
+
30
+ - [Jira](https://www.atlassian.com/software/jira) — Sprint planning, backlog, velocity charts.
31
+ - [Linear](https://linear.app/) — Modern issue tracking with cycles (sprints) and capacity.
32
+ - [Notion](https://www.notion.so/) — Flexible boards for backlog and sprint planning.
33
+ - [Planning Poker Online](https://www.planningpoker.com/) — Free planning poker for distributed teams.
34
+ - [Miro](https://miro.com/) — Virtual whiteboards for remote sprint planning.
35
+
36
+ ## Videos
37
+
38
+ - [Sprint Planning in Under 10 Minutes](https://www.youtube.com/results?search_query=sprint+planning+scrum) — Search for "sprint planning scrum" for short explainers.
39
+ - [Mountain Goat Software — Agile Videos](https://www.mountaingoatsoftware.com/agile-videos) — Mike Cohn's video library on estimation and planning.
@@ -0,0 +1,75 @@
1
+ # Sprint Planning Walkthrough — Learn by Doing
2
+
3
+ ## Before We Begin
4
+
5
+ **Diagnostic:** What is a sprint, and why plan one? In one sentence: what should a team have at the end of sprint planning that they didn't have at the start?
6
+
7
+ **Checkpoint:** You can distinguish "a list of work" from "a committed plan with a shared goal"—and explain why the latter matters.
8
+
9
+ ---
10
+
11
+ ## Step 1: Draft a Sprint Goal
12
+
13
+ **Task:** Pick a product area (e.g., "password reset," "search," "notifications"). Write a one-sentence sprint goal that describes the *outcome* the team is aiming for, not the list of features.
14
+
15
+ **Question:** If someone asked "Why does this matter?" could you answer in terms of user or business value? Or are you describing output (features) instead of outcome?
16
+
17
+ **Checkpoint:** The goal is outcome-focused and could guide trade-off decisions mid-sprint.
18
+
19
+ ---
20
+
21
+ ## Step 2: Estimate Three Stories
22
+
23
+ <!-- hint:buttons type="single" prompt="Which estimation technique helps teams discuss complexity together?" options="Story points,T-shirt sizes,Hours,No estimate" -->
24
+
25
+ **Task:** Take three backlog items (real or hypothetical): "Add email validation to signup form," "Refactor payment module for testability," "Design and implement dark mode toggle." Estimate each using story points (1, 2, 3, 5, 8). Write one sentence justifying your estimate for each.
26
+
27
+ **Question:** What makes one story "bigger" than another? Is it effort, uncertainty, or both? How might two teammates disagree—and what would that discussion surface?
28
+
29
+ **Checkpoint:** Estimates are relative (the 5 is bigger than the 2) and justified.
30
+
31
+ ---
32
+
33
+ ## Step 3: Calculate Capacity and Forecast
34
+
35
+ **Task:** For a 5-person team, 2-week sprint, with 20% of time in meetings: calculate capacity in person-hours. If last sprint's velocity was 38 points, how many points would you forecast for this sprint? What if 2 people have 2 days of PTO each?
36
+
37
+ **Question:** Why might you pull *fewer* points than your velocity even when no one is out? What buffers do you want?
38
+
39
+ **Checkpoint:** Capacity math is correct; forecast is justified and conservative.
40
+
41
+ ---
42
+
43
+ ## Step 4: Apply Definition of Ready
44
+
45
+ <!-- hint:list style="checklist" -->
46
+
47
+ **Task:** Write a Definition of Ready (3–5 criteria) for your team. Then take one backlog item and score it: does it meet each criterion? If not, what's missing?
48
+
49
+ **Question:** What happens to sprint planning when half the items aren't ready? Who owns getting items ready—Product Owner, team, or shared?
50
+
51
+ **Checkpoint:** DoR criteria are testable; at least one gap is identified for the sample item.
52
+
53
+ ---
54
+
55
+ ## Step 5: Spot Anti-Patterns
56
+
57
+ <!-- hint:card type="warning" title="Sprint Planning Anti-Patterns" -->
58
+
59
+ **Task:** Read this scenario: "The stakeholder asked the team to add 5 more stories to 'fill the sprint.' The team added them. Sprint goal: 'Complete all backlog items.'" List 2–3 anti-patterns. Rewrite the sprint goal to be outcome-focused.
60
+
61
+ **Question:** Why do teams often accept pressure to over-commit? What would you say to the stakeholder to protect the team's ownership of the sprint?
62
+
63
+ **Checkpoint:** Anti-patterns are named; the goal is rewritten to focus on outcome.
64
+
65
+ ---
66
+
67
+ ## Step 6: Plan a Remote Sprint Planning Agenda
68
+
69
+ <!-- hint:celebrate -->
70
+
71
+ **Task:** Design a 2-hour remote sprint planning agenda. Include: async prep, Part 1 (what), Part 2 (how), timeboxes, and how decisions will be captured.
72
+
73
+ **Question:** What typically goes wrong in remote planning? How does your agenda address those risks?
74
+
75
+ **Checkpoint:** Agenda has clear sections, timeboxes, and an outcome (sprint goal + backlog) documented.
@@ -0,0 +1,160 @@
1
+ # SQL — Queries, Joins, and Data Modeling Essentials
2
+
3
+ ## SELECT Basics
4
+
5
+ Fetch data with `SELECT`, `FROM`, and optionally `WHERE`:
6
+
7
+ ```sql
8
+ SELECT * FROM users;
9
+ SELECT id, name, email FROM users WHERE status = 'active';
10
+ SELECT DISTINCT country FROM users;
11
+ ```
12
+
13
+ ## WHERE Clauses
14
+
15
+ Filter rows with conditions:
16
+
17
+ ```sql
18
+ SELECT * FROM orders WHERE amount > 100;
19
+ SELECT * FROM users WHERE created_at >= '2024-01-01' AND status = 'active';
20
+ SELECT * FROM products WHERE name LIKE 'Widget%'; -- starts with Widget
21
+ SELECT * FROM users WHERE email IN ('a@x.com', 'b@x.com');
22
+ SELECT * FROM users WHERE phone IS NOT NULL;
23
+ ```
24
+
25
+ ## JOINs
26
+
27
+ Combine rows from two or more tables based on a related column.
28
+
29
+ ### INNER JOIN
30
+
31
+ Only rows with matches in **both** tables:
32
+
33
+ ```sql
34
+ SELECT orders.id, orders.amount, users.name
35
+ FROM orders
36
+ INNER JOIN users ON orders.user_id = users.id;
37
+ ```
38
+
39
+ ### LEFT JOIN
40
+
41
+ All rows from left table; matching rows from right (NULL if no match):
42
+
43
+ ```sql
44
+ SELECT users.name, orders.id
45
+ FROM users
46
+ LEFT JOIN orders ON users.id = orders.user_id;
47
+ -- Users with no orders still appear; orders columns are NULL
48
+ ```
49
+
50
+ ### RIGHT JOIN
51
+
52
+ All rows from right table; matching from left. (Less common; often rephrased as LEFT JOIN.)
53
+
54
+ ### FULL OUTER JOIN
55
+
56
+ All rows from both tables; NULL where no match.
57
+
58
+ ## JOIN Quick Reference
59
+
60
+ | Join Type | Left Table | Right Table |
61
+ |-----------|------------|-------------|
62
+ | INNER | Only matches | Only matches |
63
+ | LEFT | All | Matches only |
64
+ | RIGHT | Matches only | All |
65
+ | FULL | All | All |
66
+
67
+ ## GROUP BY and Aggregation
68
+
69
+ Aggregate rows by a column:
70
+
71
+ ```sql
72
+ SELECT status, COUNT(*) as count FROM orders GROUP BY status;
73
+ SELECT user_id, SUM(amount) as total FROM orders GROUP BY user_id;
74
+ SELECT category, AVG(price) as avg_price FROM products GROUP BY category;
75
+ ```
76
+
77
+ **HAVING** filters after aggregation:
78
+
79
+ ```sql
80
+ SELECT user_id, SUM(amount) as total
81
+ FROM orders
82
+ GROUP BY user_id
83
+ HAVING SUM(amount) > 1000;
84
+ ```
85
+
86
+ ## ORDER BY
87
+
88
+ Sort results:
89
+
90
+ ```sql
91
+ SELECT * FROM products ORDER BY price DESC;
92
+ SELECT * FROM users ORDER BY name ASC, created_at DESC;
93
+ ```
94
+
95
+ ## Subqueries
96
+
97
+ Use a query inside another:
98
+
99
+ ```sql
100
+ SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);
101
+ SELECT name, (SELECT COUNT(*) FROM orders WHERE orders.user_id = users.id) as order_count
102
+ FROM users;
103
+ ```
104
+
105
+ ## Indexes
106
+
107
+ Speed up lookups. Create on columns used in WHERE, JOIN, ORDER BY:
108
+
109
+ ```sql
110
+ CREATE INDEX idx_users_email ON users(email);
111
+ CREATE INDEX idx_orders_user_id ON orders(user_id);
112
+ ```
113
+
114
+ ## Normalization
115
+
116
+ Reduce redundancy and update anomalies.
117
+
118
+ **1NF:** Atomic values; no repeating groups. Each cell has one value.
119
+
120
+ **2NF:** 1NF + no partial dependencies. All non-key attributes depend on the whole primary key.
121
+
122
+ **3NF:** 2NF + no transitive dependencies. Non-key attributes don't depend on other non-key attributes.
123
+
124
+ ## ER Diagram Example
125
+
126
+ ```mermaid
127
+ erDiagram
128
+ users ||--o{ orders : places
129
+ products ||--o{ order_items : "ordered in"
130
+ orders ||--o{ order_items : contains
131
+ users {
132
+ int id PK
133
+ string name
134
+ string email
135
+ }
136
+ orders {
137
+ int id PK
138
+ int user_id FK
139
+ date created_at
140
+ }
141
+ products {
142
+ int id PK
143
+ string name
144
+ decimal price
145
+ }
146
+ order_items {
147
+ int order_id FK
148
+ int product_id FK
149
+ int quantity
150
+ }
151
+ ```
152
+
153
+ ## Common Patterns
154
+
155
+ | Need | SQL |
156
+ |------|-----|
157
+ | Pagination | `LIMIT 10 OFFSET 20` |
158
+ | Unique values | `DISTINCT` or `GROUP BY` |
159
+ | Top N per group | Window functions or subquery |
160
+ | Exists check | `EXISTS (SELECT 1 FROM ...)` |
@@ -0,0 +1,87 @@
1
+ # SQL Exercises
2
+
3
+ ## Exercise 1: Basic Queries
4
+
5
+ **Task:** Given `products` (id, name, price, category), write queries to:
6
+ 1. Get all products in category 'Electronics'
7
+ 2. Get product names and prices, sorted by price descending
8
+ 3. Get the count of products per category
9
+
10
+ **Validation:**
11
+ - [ ] WHERE filters correctly
12
+ - [ ] ORDER BY produces correct sort
13
+ - [ ] GROUP BY with COUNT gives per-category counts
14
+
15
+ **Hints:**
16
+ 1. SELECT name, price FROM products WHERE category = 'Electronics'
17
+ 2. ORDER BY price DESC
18
+ 3. SELECT category, COUNT(*) FROM products GROUP BY category
19
+
20
+ ---
21
+
22
+ ## Exercise 2: INNER vs LEFT JOIN
23
+
24
+ **Task:** Tables: `customers` (id, name), `orders` (id, customer_id, total). Write:
25
+ 1. INNER JOIN: orders with customer names (exclude orders with invalid customer_id)
26
+ 2. LEFT JOIN from orders to customers: all orders with customer name, or NULL if customer missing
27
+
28
+ **Validation:**
29
+ - [ ] INNER returns only orders with valid customer
30
+ - [ ] LEFT returns all orders; NULL for orphaned orders
31
+ - [ ] Correct ON condition (orders.customer_id = customers.id)
32
+
33
+ **Hints:**
34
+ 1. JOIN customers ON orders.customer_id = customers.id
35
+ 2. LEFT JOIN keeps all rows from left (orders)
36
+ 3. Test with an order whose customer_id doesn't exist
37
+
38
+ ---
39
+
40
+ ## Exercise 3: Aggregation and HAVING
41
+
42
+ **Task:** From `orders` (id, customer_id, total, status), find:
43
+ 1. Total sales per customer
44
+ 2. Customers with total sales > 1000
45
+ 3. Count of orders per status
46
+
47
+ **Validation:**
48
+ - [ ] SUM(total) grouped by customer_id
49
+ - [ ] HAVING SUM(total) > 1000
50
+ - [ ] GROUP BY status with COUNT
51
+
52
+ **Hints:**
53
+ 1. GROUP BY customer_id, SUM(total)
54
+ 2. HAVING goes after GROUP BY
55
+ 3. GROUP BY status
56
+
57
+ ---
58
+
59
+ ## Exercise 4: Subquery
60
+
61
+ **Task:** Find all products (id, name, price) that have been ordered (table `order_items`: order_id, product_id, quantity). Use a subquery with IN or EXISTS.
62
+
63
+ **Validation:**
64
+ - [ ] Only products that appear in order_items
65
+ - [ ] Subquery correctly correlates or filters
66
+ - [ ] No duplicate products (DISTINCT if using IN)
67
+
68
+ **Hints:**
69
+ 1. SELECT * FROM products WHERE id IN (SELECT DISTINCT product_id FROM order_items)
70
+ 2. Or: WHERE EXISTS (SELECT 1 FROM order_items WHERE order_items.product_id = products.id)
71
+
72
+ ---
73
+
74
+ ## Exercise 5: Normalization
75
+
76
+ **Task:** This table has redundancy: `sales` (id, product_name, product_price, category, quantity, sale_date). Split into `products` and `sales` to satisfy 2NF. Define the new tables and relationship.
77
+
78
+ **Validation:**
79
+ - [ ] products: id, name, price, category
80
+ - [ ] sales: id, product_id (FK), quantity, sale_date
81
+ - [ ] No repeated product info in sales
82
+ - [ ] Can join to get product details for a sale
83
+
84
+ **Hints:**
85
+ 1. products holds product_name, product_price, category once
86
+ 2. sales references product_id
87
+ 3. JOIN sales ON products.id = sales.product_id for full info
@@ -0,0 +1,105 @@
1
+ games:
2
+ - type: command-sprint
3
+ title: "SQL Query Sprint"
4
+ challenges:
5
+ - prompt: "Get all users from the users table."
6
+ answer: "SELECT * FROM users;"
7
+ alternates: ["SELECT * FROM users", "select * from users;"]
8
+ timeLimit: 15
9
+ - prompt: "Get all users older than 25. Table has columns id, name, age."
10
+ answer: "SELECT * FROM users WHERE age > 25;"
11
+ alternates: ["SELECT * FROM users WHERE age>25", "select * from users where age > 25;"]
12
+ timeLimit: 18
13
+ - prompt: "Get users with names starting with 'J'. Use the LIKE operator."
14
+ answer: "SELECT * FROM users WHERE name LIKE 'J%';"
15
+ alternates: ["SELECT * FROM users WHERE name LIKE 'J%'", "select * from users where name like 'J%';"]
16
+ timeLimit: 20
17
+ - prompt: "Get the count of users in the users table."
18
+ answer: "SELECT COUNT(*) FROM users;"
19
+ alternates: ["SELECT COUNT(*) FROM users", "select count(*) from users;"]
20
+ timeLimit: 18
21
+ - prompt: "Get users ordered by name alphabetically (A to Z)."
22
+ answer: "SELECT * FROM users ORDER BY name ASC;"
23
+ alternates: ["SELECT * FROM users ORDER BY name", "select * from users order by name asc;"]
24
+ timeLimit: 20
25
+ - prompt: "Get user names and their order totals. Join users (id, name) with orders (user_id, total)."
26
+ answer: "SELECT users.name, orders.total FROM users INNER JOIN orders ON users.id = orders.user_id;"
27
+ alternates: ["SELECT users.name, orders.total FROM users JOIN orders ON users.id = orders.user_id"]
28
+ timeLimit: 22
29
+ - prompt: "Get all users and their order count. Include users with zero orders. Table orders has user_id."
30
+ answer: "SELECT users.name, COUNT(orders.id) FROM users LEFT JOIN orders ON users.id = orders.user_id GROUP BY users.id, users.name;"
31
+ alternates: ["SELECT users.name, COUNT(orders.id) FROM users LEFT JOIN orders ON users.id = orders.user_id GROUP BY users.id, users.name"]
32
+ timeLimit: 25
33
+ - prompt: "Get department names and the average salary per department. Table employees has dept_id, salary; departments has id, name."
34
+ answer: "SELECT departments.name, AVG(employees.salary) FROM departments INNER JOIN employees ON departments.id = employees.dept_id GROUP BY departments.id, departments.name;"
35
+ alternates: ["SELECT d.name, AVG(e.salary) FROM departments d INNER JOIN employees e ON d.id = e.dept_id GROUP BY d.id, d.name"]
36
+ timeLimit: 25
37
+ - prompt: "Get departments with more than 5 employees. Join departments and employees on dept_id."
38
+ answer: "SELECT departments.name FROM departments INNER JOIN employees ON departments.id = employees.dept_id GROUP BY departments.id, departments.name HAVING COUNT(*) > 5;"
39
+ alternates: ["SELECT d.name FROM departments d INNER JOIN employees e ON d.id = e.dept_id GROUP BY d.id, d.name HAVING COUNT(*) > 5"]
40
+ timeLimit: 25
41
+ - prompt: "Get products with price above the average product price. Use a subquery."
42
+ answer: "SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products);"
43
+ alternates: ["SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products)"]
44
+ timeLimit: 22
45
+
46
+ - type: bug-hunt
47
+ title: "Query Bug Finder"
48
+ snippets:
49
+ - code: |
50
+ SELECT department, name, COUNT(*)
51
+ FROM employees
52
+ GROUP BY department;
53
+ bugLine: 1
54
+ explanation: "The column 'name' is in SELECT but not in GROUP BY. Every non-aggregated column in SELECT must appear in the GROUP BY clause."
55
+ hint: "Every non-aggregate column in SELECT must appear in GROUP BY."
56
+ - code: |
57
+ SELECT users.name, orders.total
58
+ FROM users
59
+ LEFT JOIN orders ON users.id = orders.user_id
60
+ WHERE orders.total > 100;
61
+ bugLine: 4
62
+ explanation: "Using WHERE orders.total > 100 with a LEFT JOIN filters out users with no orders (NULL), turning it into an effective INNER JOIN. Use a subquery or move the filter to preserve LEFT JOIN semantics."
63
+ hint: "LEFT JOIN + WHERE on the right table excludes NULL rows. What happens to users with no orders?"
64
+ - code: |
65
+ SELECT * FROM users
66
+ WHERE age = 25
67
+ ODER BY name;
68
+ bugLine: 3
69
+ explanation: "Typo: ODER should be ORDER. The SQL keyword for sorting is ORDER BY."
70
+ hint: "Check the spelling of the sort keyword."
71
+ - code: |
72
+ SELECT category, SUM(price) AS total
73
+ FROM products
74
+ GROUP BY category
75
+ WHERE total > 1000;
76
+ bugLine: 4
77
+ explanation: "WHERE cannot reference aggregate aliases or aggregates. Use HAVING for aggregate conditions: HAVING SUM(price) > 1000."
78
+ hint: "WHERE runs before grouping. Aggregate conditions need HAVING."
79
+ - code: |
80
+ SELECT name, email
81
+ FROM users
82
+ JOIN orders ON id = orders.user_id;
83
+ bugLine: 3
84
+ explanation: "Ambiguous column: 'id' could refer to users.id or orders.id. Qualify with the table name: users.id."
85
+ hint: "When two tables have a column with the same name, you must specify which table."
86
+ - code: |
87
+ UPDATE users
88
+ SET status = 'inactive';
89
+ bugLine: 2
90
+ explanation: "Missing WHERE clause. This updates every row in the table. Always add a WHERE clause to limit which rows are updated."
91
+ hint: "An UPDATE without WHERE affects every row. Always verify the filter."
92
+ - code: |
93
+ SELECT name, MAX(salary)
94
+ FROM employees
95
+ GROUP BY department;
96
+ bugLine: 1
97
+ explanation: "SELECT includes 'name' which is not in GROUP BY. Either add name to GROUP BY or use an aggregate/subquery for name."
98
+ hint: "Non-aggregated columns in SELECT must appear in GROUP BY."
99
+ - code: |
100
+ SELECT users.name
101
+ FROM users
102
+ INNER JOIN orders ON id = orders.user_id;
103
+ bugLine: 3
104
+ explanation: "Ambiguous column reference: 'id' could mean users.id or orders.id. Qualify it as users.id."
105
+ hint: "Which table does 'id' belong to? Both might have it."
@@ -0,0 +1,45 @@
1
+ slug: sql-fundamentals
2
+ title: "SQL — Queries, Joins, and Data Modeling Essentials"
3
+ version: 1.0.0
4
+ description: "Master SQL queries, joins, aggregation, and database normalization."
5
+ category: data
6
+ tags: [sql, databases, queries, joins, data-modeling]
7
+ difficulty: beginner
8
+
9
+ xp:
10
+ read: 10
11
+ walkthrough: 30
12
+ exercise: 20
13
+ quiz: 15
14
+ quiz-perfect-bonus: 10
15
+ game: 20
16
+ game-perfect-bonus: 10
17
+
18
+ time:
19
+ quick: 5
20
+ read: 15
21
+ guided: 45
22
+
23
+ prerequisites: []
24
+ related: [system-design]
25
+
26
+ triggers:
27
+ - "How do SQL joins work?"
28
+ - "How do I write a SQL query?"
29
+ - "What's the difference between INNER and LEFT join?"
30
+ - "How do I design a database schema?"
31
+
32
+ visuals:
33
+ diagrams: [diagram-mermaid]
34
+ quiz-types: [quiz-drag-order, quiz-fill-blank]
35
+ game-types: [command-sprint, bug-hunt]
36
+ playground: bash
37
+ web-embeds: true
38
+
39
+ sources:
40
+ - url: "https://www.postgresql.org/docs/"
41
+ label: "PostgreSQL Docs"
42
+ type: docs
43
+ - url: "https://sqlbolt.com"
44
+ label: "SQLBolt"
45
+ type: docs