hive-skills 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +235 -0
  3. package/assets/LICENSE +32 -0
  4. package/assets/THIRD_PARTY_NOTICES.md +72 -0
  5. package/assets/manifest.json +1290 -0
  6. package/assets/skills/authored/code-review/composable/BUNDLE.md +192 -0
  7. package/assets/skills/authored/code-review/composable/INDEX.md +13 -0
  8. package/assets/skills/authored/code-review/composable/VERSION +1 -0
  9. package/assets/skills/authored/code-review/composable/mini/01-review-method.md +34 -0
  10. package/assets/skills/authored/code-review/composable/mini/02-security-review.md +20 -0
  11. package/assets/skills/authored/code-review/composable/mini/03-correctness-bugs.md +19 -0
  12. package/assets/skills/authored/code-review/composable/mini/04-concurrency.md +16 -0
  13. package/assets/skills/authored/code-review/composable/mini/05-error-handling.md +12 -0
  14. package/assets/skills/authored/code-review/composable/mini/06-performance.md +11 -0
  15. package/assets/skills/authored/code-review/composable/mini/07-api-design.md +20 -0
  16. package/assets/skills/authored/code-review/composable/mini/08-missing-tests.md +25 -0
  17. package/assets/skills/authored/code-review/composable/mini/09-refactoring-and-communication.md +32 -0
  18. package/assets/skills/authored/data-analysis/composable/BUNDLE.md +186 -0
  19. package/assets/skills/authored/data-analysis/composable/INDEX.md +13 -0
  20. package/assets/skills/authored/data-analysis/composable/VERSION +1 -0
  21. package/assets/skills/authored/data-analysis/composable/mini/01-data-quality-profiling.md +26 -0
  22. package/assets/skills/authored/data-analysis/composable/mini/02-aggregation-pitfalls.md +21 -0
  23. package/assets/skills/authored/data-analysis/composable/mini/03-time-series.md +19 -0
  24. package/assets/skills/authored/data-analysis/composable/mini/04-segmentation.md +23 -0
  25. package/assets/skills/authored/data-analysis/composable/mini/05-discount-pricing.md +17 -0
  26. package/assets/skills/authored/data-analysis/composable/mini/06-insight-generation.md +25 -0
  27. package/assets/skills/authored/data-analysis/composable/mini/07-executive-writing.md +26 -0
  28. package/assets/skills/authored/data-analysis/composable/mini/08-recommendations.md +20 -0
  29. package/assets/skills/authored/data-analysis/composable/mini/09-reproducibility-assumptions.md +20 -0
  30. package/assets/skills/authored/financial-analysis/composable/BUNDLE.md +1293 -0
  31. package/assets/skills/authored/financial-analysis/composable/INDEX.md +17 -0
  32. package/assets/skills/authored/financial-analysis/composable/VERSION +1 -0
  33. package/assets/skills/authored/financial-analysis/composable/mini/00-core.md +69 -0
  34. package/assets/skills/authored/financial-analysis/composable/mini/01-profitability-efficiency-ratios.md +173 -0
  35. package/assets/skills/authored/financial-analysis/composable/mini/02-liquidity-leverage-ratios.md +120 -0
  36. package/assets/skills/authored/financial-analysis/composable/mini/03-valuation-ratios-interpretation.md +107 -0
  37. package/assets/skills/authored/financial-analysis/composable/mini/04-dcf-projection-wacc.md +122 -0
  38. package/assets/skills/authored/financial-analysis/composable/mini/05-dcf-terminal-value-sensitivity.md +75 -0
  39. package/assets/skills/authored/financial-analysis/composable/mini/06-comparables-precedents.md +78 -0
  40. package/assets/skills/authored/financial-analysis/composable/mini/07-budget-variance-analysis.md +47 -0
  41. package/assets/skills/authored/financial-analysis/composable/mini/08-driver-based-forecasting-scenarios.md +111 -0
  42. package/assets/skills/authored/financial-analysis/composable/mini/09-rolling-forecasts-accuracy.md +114 -0
  43. package/assets/skills/authored/financial-analysis/composable/mini/10-reporting-exec-summary.md +58 -0
  44. package/assets/skills/authored/financial-analysis/composable/mini/11-industry-adaptations.md +130 -0
  45. package/assets/skills/authored/financial-analysis/composable/mini/12-toolkit-scripts-io.md +102 -0
  46. package/assets/skills/authored/python-api/composable/BUNDLE.md +389 -0
  47. package/assets/skills/authored/python-api/composable/INDEX.md +13 -0
  48. package/assets/skills/authored/python-api/composable/VERSION +1 -0
  49. package/assets/skills/authored/python-api/composable/mini/01-project-structure.md +44 -0
  50. package/assets/skills/authored/python-api/composable/mini/02-routing-and-app.md +38 -0
  51. package/assets/skills/authored/python-api/composable/mini/03-pydantic-models.md +45 -0
  52. package/assets/skills/authored/python-api/composable/mini/04-validation-and-errors.md +59 -0
  53. package/assets/skills/authored/python-api/composable/mini/05-dependencies-and-auth.md +60 -0
  54. package/assets/skills/authored/python-api/composable/mini/06-pagination-filtering.md +44 -0
  55. package/assets/skills/authored/python-api/composable/mini/07-async-performance.md +30 -0
  56. package/assets/skills/authored/python-api/composable/mini/08-testing.md +45 -0
  57. package/assets/skills/authored/python-api/composable/mini/09-middleware-observability.md +29 -0
  58. package/assets/skills/authored/tech-writing/composable/BUNDLE.md +220 -0
  59. package/assets/skills/authored/tech-writing/composable/INDEX.md +12 -0
  60. package/assets/skills/authored/tech-writing/composable/VERSION +1 -0
  61. package/assets/skills/authored/tech-writing/composable/mini/01-audience-analysis.md +26 -0
  62. package/assets/skills/authored/tech-writing/composable/mini/02-document-types.md +27 -0
  63. package/assets/skills/authored/tech-writing/composable/mini/03-readme-quickstart-changelog.md +22 -0
  64. package/assets/skills/authored/tech-writing/composable/mini/04-information-architecture.md +21 -0
  65. package/assets/skills/authored/tech-writing/composable/mini/05-style-clarity.md +29 -0
  66. package/assets/skills/authored/tech-writing/composable/mini/06-breaking-changes-migrations.md +33 -0
  67. package/assets/skills/authored/tech-writing/composable/mini/07-troubleshooting-security.md +30 -0
  68. package/assets/skills/authored/tech-writing/composable/mini/08-faq-voice-tone.md +32 -0
  69. package/assets/skills/converted/claude-api/composable/BUNDLE.md +14996 -0
  70. package/assets/skills/converted/claude-api/composable/INDEX.md +98 -0
  71. package/assets/skills/converted/claude-api/composable/VERSION +1 -0
  72. package/assets/skills/converted/claude-api/composable/mini/00-core.md +235 -0
  73. package/assets/skills/converted/claude-api/composable/mini/01-model-api-quick-reference.md +258 -0
  74. package/assets/skills/converted/claude-api/composable/mini/02-common-pitfalls.md +42 -0
  75. package/assets/skills/converted/claude-api/composable/mini/10-models.md +135 -0
  76. package/assets/skills/converted/claude-api/composable/mini/11-platform-availability.md +96 -0
  77. package/assets/skills/converted/claude-api/composable/mini/12-claude-platform-on-aws.md +59 -0
  78. package/assets/skills/converted/claude-api/composable/mini/13-live-sources.md +143 -0
  79. package/assets/skills/converted/claude-api/composable/mini/14-error-codes.md +256 -0
  80. package/assets/skills/converted/claude-api/composable/mini/15-prompt-caching.md +223 -0
  81. package/assets/skills/converted/claude-api/composable/mini/16-token-counting.md +56 -0
  82. package/assets/skills/converted/claude-api/composable/mini/17-tool-use-concepts.md +444 -0
  83. package/assets/skills/converted/claude-api/composable/mini/18-agent-design.md +101 -0
  84. package/assets/skills/converted/claude-api/composable/mini/19-anthropic-cli.md +246 -0
  85. package/assets/skills/converted/claude-api/composable/mini/20-model-migration.md +1301 -0
  86. package/assets/skills/converted/claude-api/composable/mini/30-managed-agents-overview.md +71 -0
  87. package/assets/skills/converted/claude-api/composable/mini/31-managed-agents-core.md +278 -0
  88. package/assets/skills/converted/claude-api/composable/mini/32-managed-agents-environments.md +219 -0
  89. package/assets/skills/converted/claude-api/composable/mini/33-managed-agents-tools.md +366 -0
  90. package/assets/skills/converted/claude-api/composable/mini/34-managed-agents-events.md +252 -0
  91. package/assets/skills/converted/claude-api/composable/mini/35-managed-agents-outcomes.md +106 -0
  92. package/assets/skills/converted/claude-api/composable/mini/36-managed-agents-multiagent.md +101 -0
  93. package/assets/skills/converted/claude-api/composable/mini/37-managed-agents-webhooks.md +123 -0
  94. package/assets/skills/converted/claude-api/composable/mini/38-managed-agents-memory.md +197 -0
  95. package/assets/skills/converted/claude-api/composable/mini/39-managed-agents-scheduled-deployments.md +146 -0
  96. package/assets/skills/converted/claude-api/composable/mini/40-managed-agents-client-patterns.md +211 -0
  97. package/assets/skills/converted/claude-api/composable/mini/41-managed-agents-onboarding.md +82 -0
  98. package/assets/skills/converted/claude-api/composable/mini/42-managed-agents-api-reference.md +441 -0
  99. package/assets/skills/converted/claude-api/composable/mini/43-managed-agents-self-hosted-sandboxes.md +174 -0
  100. package/assets/skills/converted/claude-api/composable/mini/50-python-readme.md +564 -0
  101. package/assets/skills/converted/claude-api/composable/mini/51-python-tool-use.md +590 -0
  102. package/assets/skills/converted/claude-api/composable/mini/52-python-streaming-batches-files.md +549 -0
  103. package/assets/skills/converted/claude-api/composable/mini/53-python-managed-agents.md +335 -0
  104. package/assets/skills/converted/claude-api/composable/mini/55-typescript-readme.md +404 -0
  105. package/assets/skills/converted/claude-api/composable/mini/56-typescript-tool-use.md +548 -0
  106. package/assets/skills/converted/claude-api/composable/mini/57-typescript-streaming-batches-files.md +384 -0
  107. package/assets/skills/converted/claude-api/composable/mini/58-typescript-managed-agents.md +358 -0
  108. package/assets/skills/converted/claude-api/composable/mini/60-csharp-readme.md +361 -0
  109. package/assets/skills/converted/claude-api/composable/mini/61-csharp-tool-use.md +163 -0
  110. package/assets/skills/converted/claude-api/composable/mini/62-csharp-streaming-batches-files.md +64 -0
  111. package/assets/skills/converted/claude-api/composable/mini/65-go-readme.md +185 -0
  112. package/assets/skills/converted/claude-api/composable/mini/66-go-tool-use.md +219 -0
  113. package/assets/skills/converted/claude-api/composable/mini/67-go-streaming-files.md +63 -0
  114. package/assets/skills/converted/claude-api/composable/mini/68-go-managed-agents.md +564 -0
  115. package/assets/skills/converted/claude-api/composable/mini/70-java-readme.md +237 -0
  116. package/assets/skills/converted/claude-api/composable/mini/71-java-tool-use.md +227 -0
  117. package/assets/skills/converted/claude-api/composable/mini/72-java-streaming-files.md +49 -0
  118. package/assets/skills/converted/claude-api/composable/mini/73-java-managed-agents.md +443 -0
  119. package/assets/skills/converted/claude-api/composable/mini/75-php-readme.md +173 -0
  120. package/assets/skills/converted/claude-api/composable/mini/76-php-tool-use.md +252 -0
  121. package/assets/skills/converted/claude-api/composable/mini/77-php-streaming-batches-files.md +53 -0
  122. package/assets/skills/converted/claude-api/composable/mini/78-php-managed-agents.md +443 -0
  123. package/assets/skills/converted/claude-api/composable/mini/80-ruby-readme.md +133 -0
  124. package/assets/skills/converted/claude-api/composable/mini/81-ruby-tool-use-streaming.md +56 -0
  125. package/assets/skills/converted/claude-api/composable/mini/82-ruby-managed-agents.md +394 -0
  126. package/assets/skills/converted/claude-api/composable/mini/85-curl-examples.md +255 -0
  127. package/assets/skills/converted/claude-api/composable/mini/86-curl-managed-agents.md +340 -0
  128. package/assets/skills/converted/claude-api/composable/presets/csharp.md +1151 -0
  129. package/assets/skills/converted/claude-api/composable/presets/curl.md +1154 -0
  130. package/assets/skills/converted/claude-api/composable/presets/go.md +1598 -0
  131. package/assets/skills/converted/claude-api/composable/presets/java.md +1523 -0
  132. package/assets/skills/converted/claude-api/composable/presets/php.md +1488 -0
  133. package/assets/skills/converted/claude-api/composable/presets/python.md +2605 -0
  134. package/assets/skills/converted/claude-api/composable/presets/ruby.md +1146 -0
  135. package/assets/skills/converted/claude-api/composable/presets/shared.md +6478 -0
  136. package/assets/skills/converted/claude-api/composable/presets/typescript.md +2261 -0
  137. package/assets/skills/converted/docx/composable/BUNDLE.md +617 -0
  138. package/assets/skills/converted/docx/composable/INDEX.md +12 -0
  139. package/assets/skills/converted/docx/composable/VERSION +1 -0
  140. package/assets/skills/converted/docx/composable/mini/00-core.md +26 -0
  141. package/assets/skills/converted/docx/composable/mini/01-reading-converting.md +36 -0
  142. package/assets/skills/converted/docx/composable/mini/02-creating-setup-layout.md +85 -0
  143. package/assets/skills/converted/docx/composable/mini/03-creating-elements.md +257 -0
  144. package/assets/skills/converted/docx/composable/mini/04-editing-existing.md +57 -0
  145. package/assets/skills/converted/docx/composable/mini/05-xml-reference.md +128 -0
  146. package/assets/skills/converted/internal-comms/composable/BUNDLE.md +220 -0
  147. package/assets/skills/converted/internal-comms/composable/INDEX.md +11 -0
  148. package/assets/skills/converted/internal-comms/composable/VERSION +1 -0
  149. package/assets/skills/converted/internal-comms/composable/mini/00-core.md +30 -0
  150. package/assets/skills/converted/internal-comms/composable/mini/01-3p-updates.md +49 -0
  151. package/assets/skills/converted/internal-comms/composable/mini/02-company-newsletter.md +67 -0
  152. package/assets/skills/converted/internal-comms/composable/mini/03-faq-answers.md +32 -0
  153. package/assets/skills/converted/internal-comms/composable/mini/04-general-comms.md +18 -0
  154. package/assets/skills/converted/mcp-builder/composable/BUNDLE.md +2460 -0
  155. package/assets/skills/converted/mcp-builder/composable/INDEX.md +23 -0
  156. package/assets/skills/converted/mcp-builder/composable/VERSION +1 -0
  157. package/assets/skills/converted/mcp-builder/composable/mini/00-core.md +43 -0
  158. package/assets/skills/converted/mcp-builder/composable/mini/01-workflow-research-planning.md +54 -0
  159. package/assets/skills/converted/mcp-builder/composable/mini/02-implementation-process.md +78 -0
  160. package/assets/skills/converted/mcp-builder/composable/mini/03-naming-conventions.md +33 -0
  161. package/assets/skills/converted/mcp-builder/composable/mini/04-response-formats.md +21 -0
  162. package/assets/skills/converted/mcp-builder/composable/mini/05-pagination.md +24 -0
  163. package/assets/skills/converted/mcp-builder/composable/mini/06-transport.md +47 -0
  164. package/assets/skills/converted/mcp-builder/composable/mini/07-annotations.md +20 -0
  165. package/assets/skills/converted/mcp-builder/composable/mini/08-security.md +35 -0
  166. package/assets/skills/converted/mcp-builder/composable/mini/09-error-handling.md +32 -0
  167. package/assets/skills/converted/mcp-builder/composable/mini/10-testing-and-documentation.md +21 -0
  168. package/assets/skills/converted/mcp-builder/composable/mini/11-python-implementation.md +432 -0
  169. package/assets/skills/converted/mcp-builder/composable/mini/12-python-advanced-and-checklist.md +233 -0
  170. package/assets/skills/converted/mcp-builder/composable/mini/13-node-implementation.md +717 -0
  171. package/assets/skills/converted/mcp-builder/composable/mini/14-node-advanced-and-checklist.md +200 -0
  172. package/assets/skills/converted/mcp-builder/composable/mini/15-evaluation-design.md +200 -0
  173. package/assets/skills/converted/mcp-builder/composable/mini/16-evaluation-running.md +198 -0
  174. package/assets/skills/converted/mcp-builder/composable/presets/node-server.md +1381 -0
  175. package/assets/skills/converted/mcp-builder/composable/presets/python-server.md +1129 -0
  176. package/assets/skills/converted/pdf/composable/BUNDLE.md +1284 -0
  177. package/assets/skills/converted/pdf/composable/INDEX.md +14 -0
  178. package/assets/skills/converted/pdf/composable/VERSION +1 -0
  179. package/assets/skills/converted/pdf/composable/mini/00-core.md +46 -0
  180. package/assets/skills/converted/pdf/composable/mini/01-creation.md +176 -0
  181. package/assets/skills/converted/pdf/composable/mini/02-extraction.md +178 -0
  182. package/assets/skills/converted/pdf/composable/mini/03-merge-split-manipulate.md +240 -0
  183. package/assets/skills/converted/pdf/composable/mini/04-images-ocr.md +168 -0
  184. package/assets/skills/converted/pdf/composable/mini/05-encryption.md +51 -0
  185. package/assets/skills/converted/pdf/composable/mini/06-forms.md +300 -0
  186. package/assets/skills/converted/pdf/composable/mini/07-libraries-reference.md +89 -0
  187. package/assets/skills/converted/pptx/composable/BUNDLE.md +911 -0
  188. package/assets/skills/converted/pptx/composable/INDEX.md +12 -0
  189. package/assets/skills/converted/pptx/composable/VERSION +1 -0
  190. package/assets/skills/converted/pptx/composable/mini/00-core.md +37 -0
  191. package/assets/skills/converted/pptx/composable/mini/01-reading.md +37 -0
  192. package/assets/skills/converted/pptx/composable/mini/02-creating-from-scratch.md +422 -0
  193. package/assets/skills/converted/pptx/composable/mini/03-editing-templates.md +207 -0
  194. package/assets/skills/converted/pptx/composable/mini/04-design.md +89 -0
  195. package/assets/skills/converted/pptx/composable/mini/05-qa-and-rendering.md +91 -0
  196. package/assets/skills/converted/pptx/composable/presets/creating.md +659 -0
  197. package/assets/skills/converted/pptx/composable/presets/editing.md +485 -0
  198. package/assets/skills/converted/skill-creator/composable/BUNDLE.md +1681 -0
  199. package/assets/skills/converted/skill-creator/composable/INDEX.md +21 -0
  200. package/assets/skills/converted/skill-creator/composable/VERSION +1 -0
  201. package/assets/skills/converted/skill-creator/composable/mini/00-core.md +59 -0
  202. package/assets/skills/converted/skill-creator/composable/mini/01-creating-a-skill.md +27 -0
  203. package/assets/skills/converted/skill-creator/composable/mini/02-skill-writing-guide.md +71 -0
  204. package/assets/skills/converted/skill-creator/composable/mini/03-test-cases.md +21 -0
  205. package/assets/skills/converted/skill-creator/composable/mini/04-running-and-evaluating.md +128 -0
  206. package/assets/skills/converted/skill-creator/composable/mini/05-improving-the-skill.md +30 -0
  207. package/assets/skills/converted/skill-creator/composable/mini/06-blind-comparison.md +5 -0
  208. package/assets/skills/converted/skill-creator/composable/mini/07-description-optimization.md +74 -0
  209. package/assets/skills/converted/skill-creator/composable/mini/08-packaging.md +11 -0
  210. package/assets/skills/converted/skill-creator/composable/mini/09-environment-specific.md +38 -0
  211. package/assets/skills/converted/skill-creator/composable/mini/10-scripts-and-references.md +34 -0
  212. package/assets/skills/converted/skill-creator/composable/mini/11-json-schemas.md +414 -0
  213. package/assets/skills/converted/skill-creator/composable/mini/12-agent-grader.md +225 -0
  214. package/assets/skills/converted/skill-creator/composable/mini/13-agent-comparator.md +204 -0
  215. package/assets/skills/converted/skill-creator/composable/mini/14-agent-analyzer.md +276 -0
  216. package/assets/skills/converted/skill-creator/composable/presets/authoring.md +198 -0
  217. package/assets/skills/converted/skill-creator/composable/presets/evaluating.md +1334 -0
  218. package/assets/skills/converted/skill-creator/composable/presets/optimizing.md +160 -0
  219. package/assets/skills/converted/skill-creator/composable/presets.json +5 -0
  220. package/assets/skills/meta/ccs-skill-creator/composable/BUNDLE.md +465 -0
  221. package/assets/skills/meta/ccs-skill-creator/composable/INDEX.md +8 -0
  222. package/assets/skills/meta/ccs-skill-creator/composable/VERSION +1 -0
  223. package/assets/skills/meta/ccs-skill-creator/composable/mini/00-core.md +46 -0
  224. package/assets/skills/meta/ccs-skill-creator/composable/mini/01-create-new-skill.md +167 -0
  225. package/assets/skills/meta/ccs-skill-creator/composable/mini/02-convert-existing-skill.md +120 -0
  226. package/assets/skills/meta/ccs-skill-creator/composable/mini/03-review-and-maintain.md +112 -0
  227. package/assets/skills/sources/anthropic/PROVENANCE.md +3 -0
  228. package/assets/skills/sources/anthropic/claude-api/LICENSE.txt +202 -0
  229. package/assets/skills/sources/anthropic/docx/LICENSE.txt +30 -0
  230. package/assets/skills/sources/anthropic/internal-comms/LICENSE.txt +202 -0
  231. package/assets/skills/sources/anthropic/mcp-builder/LICENSE.txt +202 -0
  232. package/assets/skills/sources/anthropic/pdf/LICENSE.txt +30 -0
  233. package/assets/skills/sources/anthropic/pptx/LICENSE.txt +30 -0
  234. package/assets/skills/sources/anthropic/skill-creator/LICENSE.txt +202 -0
  235. package/assets/skills/sources/financial-analyst/PROVENANCE.md +1 -0
  236. package/assets/tools/hive.py +728 -0
  237. package/dist/cli.js +7494 -0
  238. package/package.json +40 -0
@@ -0,0 +1,186 @@
1
+ <!-- GENERATED by tools/hive.py compile. Do not hand-edit. -->
2
+ # data-analysis: Compiled Skill Bundle (v1.0.0)
3
+
4
+ All composable mini-skills for `data-analysis` concatenated in index order, frontmatter stripped. Regenerate with `tools/hive.py compile <skill-dir>`. Do not edit by hand.
5
+
6
+ ---
7
+ <!-- module: 01-data-quality-profiling.md -->
8
+
9
+ # Data Quality Profiling & Cleaning Decisions
10
+
11
+ Never compute a headline number before profiling the data. Rushing to a total on dirty data produces confident, wrong answers.
12
+
13
+ **Profiling checklist for every dataset:**
14
+ - **Shape and grain.** How many rows, and what does one row represent? "One row = one order line" vs "one row = one order" changes every aggregation. State the grain explicitly.
15
+ - **Row count vs. expected.** Does the count match what the business expects for the period? A month with 3x normal rows signals duplication or a double-loaded file.
16
+ - **Nulls per column.** Count and locate missing values. Revenue 8% null is a different problem from 0.1% null.
17
+ - **Ranges and distributions.** Min/max/quartiles for numerics. Negative prices, zero quantities, future dates, or a max 1000x the median flag problems.
18
+ - **Uniqueness.** Are IDs that should be unique actually unique? Duplicate order IDs are the classic silent inflator.
19
+ - **Categoricals.** How many distinct values? Look for the same thing spelled differently ("US", "USA", "United States"), stray whitespace, and case differences.
20
+
21
+ **Cleaning decisions must be explicit and defensible.** For each issue decide and record: drop, impute, cap, or keep-and-flag, and why.
22
+ - Missing revenue on 0.1% of rows: dropping is usually fine; note it.
23
+ - Missing region on 15% of rows: dropping biases the geography analysis. Keep as "Unknown" and report its size.
24
+ - One $2,000,000 transaction when the median is $200: investigate before deciding. It may be real (an enterprise deal) or an error (cents entered as dollars). **Never silently delete it.**
25
+
26
+ **Rule: every cleaning choice changes the answer, so every cleaning choice must be stated.** An analysis whose data decisions are hidden cannot be trusted or reproduced.
27
+
28
+ **Worked example.** You receive 50,000 sales rows. Profiling shows 51,200 order IDs but only 50,000 distinct (1,200 duplicates that would inflate any revenue sum). Region is null on 12% of rows. Two orders are dated in 2027. Actions: dedupe on order ID (document the key), keep null region as "Unknown (12%)", quarantine the future-dated rows pending a source check. Record all three decisions before computing a single total.
29
+
30
+ ---
31
+ <!-- module: 02-aggregation-pitfalls.md -->
32
+
33
+ # Aggregation Correctness Pitfalls
34
+
35
+ Most analytical errors are not math errors: they are aggregation errors on messy data.
36
+
37
+ - **Duplicates inflate sums and counts.** Before `SUM(revenue)`, confirm the grain and deduplicate on the true key. A joined table that fans out (one order joined to many line items) multiplies the order's revenue by its line count. Check: does `SUM` at this grain match `SUM` at the source grain?
38
+ - **Averages hide distributions and are wrecked by outliers.** The mean is the wrong summary for skewed data: revenue, session length, and deal size are almost always right-skewed. Report the **median** alongside the mean; if mean ≫ median, say so and lead with median. "Average order value $850" can be one whale plus a hundred $40 orders.
39
+ - **Beware averaging averages.** The average of per-customer average order values is *not* the overall average order value. Aggregate from the base rows, or use a properly weighted average.
40
+ - **Missing values distort denominators.** `AVG` skips nulls; `COUNT(*)` includes them; `COUNT(col)` does not. Decide whether a null means zero (impute 0) or unknown (exclude); they give different results. "Signups / visits" is wrong if some visits are null.
41
+ - **Simpson's paradox.** A trend in the aggregate can reverse within every segment. If overall conversion rose but fell in each channel, a mix shift is responsible: always sanity-check aggregate movements against segment movements.
42
+ - **Count distinct vs. count.** "1,000 orders" and "1,000 customers" differ when customers repeat. Use `COUNT(DISTINCT customer_id)` for customers.
43
+
44
+ **Worked example.** A table joins `orders` to `payments`; some orders have 2 payment rows. `SUM(order_total)` now double-counts those orders. Fix: aggregate `order_total` at the order grain first, then join to payments. Note that `SUM(DISTINCT order_total)` is *not* a fix: two genuinely equal order totals would be wrongly collapsed. Deduplicate rows on the real key, don't dedupe values.
45
+
46
+ The habit that prevents most of these: before every aggregate, state the grain out loud, confirm the key is unique at that grain, and check whether the metric is skewed enough that the mean will mislead.
47
+
48
+ ---
49
+ <!-- module: 03-time-series.md -->
50
+
51
+ # Time-Series Analysis
52
+
53
+ - **Growth rates.** Period-over-period growth = (current − prior) / prior. Always state the base and pair a percentage with absolute numbers. A "200% increase" from 1 to 3 is trivially small in absolute terms.
54
+ - **Partial periods are the number-one time-series trap.** If the current month is only 40% elapsed, its total is not comparable to full prior months and will look like a crash. Either exclude the partial period, run-rate it with a clear caveat, or compare like-for-like (month-to-date vs. same-day-of-month prior). Always label partial periods.
55
+ - **Seasonality.** Compare year-over-year, not just month-over-month, when the business is seasonal. December vs. November tells you little if December always spikes; December vs. last December does.
56
+ - **Choose the right growth summary.** For multi-period growth use CAGR, defined as (end/start)^(1/periods) − 1, not the average of per-period growth rates, which overstates. Averaging +50% then −50% gives 0%, but the true result is −25%.
57
+ - **Smoothing.** Use trailing moving averages (e.g., 7-day) to reveal trend through noise, but note that smoothing lags turning points.
58
+ - **Watch the denominator over time.** A rising total can come from more customers, not more per customer: decompose growth into volume × rate whenever possible.
59
+
60
+ **Worked example.** Revenue "dropped 60% this month." The month is 12 days in. Run-rate: $400k in 12 days → ~$1.0M projected vs. $950k last month (actually up). Report the run-rate *with* the caveat that it's a projection; never present the raw partial total as if it were final. Reporting the −60% would trigger a false alarm.
61
+
62
+ **Second example.** A dashboard shows month-over-month revenue down every December-to-January. That is seasonality, not decline: the correct comparison is January vs. prior January. Presenting the MoM drop as a trend would be misleading.
63
+
64
+ The discipline: for any time comparison, verify the two periods are truly comparable (same length, same completeness, same season) before computing or reporting a change.
65
+
66
+ ---
67
+ <!-- module: 04-segmentation.md -->
68
+
69
+ # Segmentation
70
+
71
+ Segmentation turns a flat number into an insight by asking "for whom / where / which?"
72
+
73
+ - Segment by the dimensions that drive decisions: customer type, region, product, channel, cohort, plan tier.
74
+ - **Always show segment size alongside segment metric.** A segment with 300% growth on 4 customers is noise; the same growth on 4,000 customers is a strategy. Report both the rate and the base count/volume.
75
+ - **Beware small segments.** Percentages on small n are volatile: set a minimum sample threshold and flag or suppress segments below it.
76
+ - Look for **concentration**: often a small fraction of customers or products drives most revenue (Pareto). Compute the share of the top decile; concentration risk is itself a finding.
77
+ - **Cohorts** (grouping by join/acquisition period) separate "are new users better?" from "is the whole base aging?", which is critical for retention and LTV questions.
78
+ - **Contribution to change.** When a total moves, decompose *which segments* caused it. "Revenue up $200k" is far more useful as "Enterprise +$260k, SMB −$60k."
79
+
80
+ **Worked example.** Overall revenue is flat month-over-month, seemingly a non-event. Segmenting reveals Enterprise +$260k and SMB −$260k. The flat aggregate hid a major mix shift and an SMB problem worth acting on. The segmentation *is* the insight; the aggregate concealed it.
81
+
82
+ **Second example.** A "region with 300% growth" turns out to have 3 customers, up from 1. Flag it as too small to act on rather than headline it. Meanwhile a mature region growing 8% on 5,000 customers is the real story. Size context flips which finding matters.
83
+
84
+ **Concentration example.** If the top 10% of customers drive 70% of revenue, that concentration is a finding in itself: it signals both an upsell base and a churn risk if a few accounts leave. Report the concentration ratio explicitly.
85
+
86
+ The discipline: never report a segment percentage without its denominator, and always test whether a flat or moving aggregate is masking offsetting segment movements.
87
+
88
+ ---
89
+ <!-- module: 05-discount-pricing.md -->
90
+
91
+ # Discount, Pricing & Margin Analysis
92
+
93
+ - **Discount depth vs. discount penetration are different metrics.** Depth = average discount % on discounted orders. Penetration = share of orders that get any discount. Report both. A low average discount can hide that 80% of orders receive *some* discount: high penetration, low depth is a different problem from low penetration, high depth.
94
+ - **Evaluate discounts on margin, not revenue.** A 20% discount on a 30%-margin product does not cut profit by 20%: it can erase most of the margin. A $100 item at 30% margin earns $30; a 20% discount drops price to $80, and if cost stays $70, margin falls to $10 (a 67% margin cut from a 20% discount). Always tie discounting back to unit economics.
95
+ - **Use net/effective price.** Compute realized price after all discounts, credits, and refunds (not list price) as the basis for any pricing conclusion. Watch for discount stacking (multiple discounts compounding).
96
+ - **Confounding with volume.** "Discounted orders are bigger" may mean discounts drive volume, or that big orders negotiate discounts. Correlation is not causation; state which direction the data can and cannot support.
97
+ - **Elasticity claims need controlled comparison**, not a raw before/after that ignores seasonality and product mix. Be explicit about what a discount analysis can and cannot prove.
98
+
99
+ **Worked example.** SMB orders show a 20% average discount and revenue looks healthy, so discounting seems fine. But margin analysis shows SMB products average 30% margin, so the 20% discount cuts unit profit roughly in half. Penetration is 80%: nearly every SMB order is discounted. The finding is not "discounts are moderate" but "discounting is quietly destroying SMB margin," which points to a specific action (cap discount depth or reduce penetration).
100
+
101
+ The discipline: never conclude a discount is "small" or "fine" from the revenue view alone. Always translate it to margin impact and check both depth and penetration before making a pricing recommendation.
102
+
103
+ ---
104
+ <!-- module: 06-insight-generation.md -->
105
+
106
+ # Generating Insight Beyond Aggregates
107
+
108
+ A table of totals is not analysis. Insight answers "so what?" Push every number one level further.
109
+
110
+ Four moves that turn a number into a finding:
111
+ - **Compare**: vs. prior period, vs. target, vs. benchmark, vs. other segments. A number alone ("revenue was $2M") means nothing without a reference point. Is $2M good? Only a comparison tells you.
112
+ - **Decompose**: break a change into its drivers: price × volume, new × existing customers, which segments moved. "Revenue up $200k" becomes "driven entirely by Enterprise upsell; SMB actually shrank."
113
+ - **Explain**: offer the most likely cause and note what would confirm or refute it. Distinguish observation from hypothesis.
114
+ - **Quantify impact**: translate to money, users, or risk, and to the decision at stake. "This costs ~$120k/quarter in margin" lands; "discounts are high" doesn't.
115
+
116
+ Then **surface the surprising**: the outlier, the reversal, the concentration, the thing that contradicts the assumption. That is where the value lives. A finding that confirms what everyone already believed rarely changes a decision.
117
+
118
+ **Test for every finding:** ask "so what should we do differently?" If a number implies no decision, it may be context, not a finding: demote it to background.
119
+
120
+ **Worked example.** Draft says: "Q3 revenue was $2.0M. North America was $1.2M. Enterprise was $1.4M." That is three facts, no insight. Pushed further: "Q3 revenue grew 12% ($1.8M → $2.0M), but *all* net growth came from Enterprise (+$260k); SMB declined $60k for the second straight quarter (the first sign the SMB motion is stalling and worth investigating before Q4 planning)." Same underlying numbers, but now there is a comparison, a decomposition, a likely story, and a decision implication.
121
+
122
+ **Second example.** "Average order value is $850" is a bare aggregate. Insight: "AOV is $850, but the median is $210 (a handful of enterprise deals pull the mean up 4x). For SMB-focused decisions, use the median; the $850 figure will mislead capacity and pricing planning." The move here is recognizing the distribution and stating the consequence for a decision.
123
+
124
+ The discipline: never ship a bare number. Attach a comparison and a "so what" to every figure that reaches the reader.
125
+
126
+ ---
127
+ <!-- module: 07-executive-writing.md -->
128
+
129
+ # Writing for Executive Audiences
130
+
131
+ Executives read for decisions, not for your method. Structure and language should serve a busy reader who will act on three sentences.
132
+
133
+ - **Lead with the answer (BLUF: bottom line up front).** The headline finding and its implication come first; supporting detail follows. Never make a reader wade through methodology to reach the conclusion. If they read only the first line, they should get the point.
134
+ - **Quantify and contextualize.** "Revenue grew 12% ($1.8M → $2.0M), driven mostly by Enterprise," not "revenue grew." Every claim carries a number and a reference point.
135
+ - **Three-to-five findings, ranked by impact.** A report with 20 equal bullets has no priorities. Lead with what matters most; cut or appendix the rest.
136
+ - **Round appropriately.** Say "$2.0M," not "$2,013,847.22." Spurious precision signals poor judgment and slows the reader. Match precision to the decision.
137
+ - **Translate to the business.** Tie every metric to revenue, cost, risk, or growth. Replace jargon and raw metric names with plain business language: "customers who stopped using us" beats "MAU churn delta."
138
+ - **Visual discipline.** One chart, one message; label it with the takeaway ("Enterprise now 70% of revenue"), not just "Figure 3." If a chart needs a paragraph to interpret, it's the wrong chart.
139
+
140
+ **Worked example (before/after opening):**
141
+ - Before: "We queried the transactions table for Q3, deduplicated on order ID, excluded refunds, and after grouping by segment we observed the following distribution of revenue..."
142
+ - After: "**Q3 revenue hit $2.0M (+12%), but growth is now entirely Enterprise: SMB shrank for the second quarter.** Details below." The method belongs in an appendix or a footnote, not the lead.
143
+
144
+ **Second example (precision and translation):**
145
+ - Before: "Net revenue retention was 1.1372 for the enterprise cohort."
146
+ - After: "Enterprise customers grew ~14% in spend without any new logos: existing accounts are expanding, which de-risks the Q4 number."
147
+
148
+ The discipline: write the one sentence you'd want the CEO to repeat in a meeting, put it first, and make everything else support it.
149
+
150
+ ---
151
+ <!-- module: 08-recommendations.md -->
152
+
153
+ # Recommendations & Framing
154
+
155
+ A recommendation is where analysis becomes value, and where analysts most often overreach or under-deliver.
156
+
157
+ - **Recommendations must follow from the data shown**, not appear from nowhere. Each should trace to a specific finding in the report. If a reader can't point to the number behind a recommendation, it's an opinion, not analysis.
158
+ - **Be specific and actionable.** "Cap SMB discounts at 15%, projected to recover ~$120k in annual margin," not "improve discounting." A good recommendation names the action, the target, and the expected impact.
159
+ - **Acknowledge uncertainty and tradeoffs.** State your confidence and what could change the conclusion. Overclaiming from correlation destroys credibility faster than admitting a limit. "This assumes discount elasticity is low, which we haven't tested" is a strength, not a weakness.
160
+ - **Prioritize by impact and effort.** Rank recommendations; don't hand over a flat list of ten. Lead with high-impact, low-effort moves.
161
+ - **Separate what the data says from what you infer.** "Discounted orders are 2x larger (observed)" is a fact; "so discounts likely drive larger orders (hypothesis, needs a controlled test)" is an inference. Label each. Conflating them is how correlation gets sold as causation.
162
+
163
+ **Worked example.** Finding: SMB discount penetration is 80% at 20% average depth, and SMB margin is ~30%, so discounting roughly halves SMB unit profit. Recommendation: "Pilot a 15% discount cap on SMB for one quarter in two regions; projected to recover ~$120k annualized margin if volume holds. Risk: if SMB volume is discount-elastic, we may lose orders; the pilot's control regions will measure this. Confidence: medium; we have the margin math but not the elasticity." Notice it traces to the finding, quantifies impact, names the risk, states confidence, and proposes a test rather than a blanket rollout.
164
+
165
+ **Counter-example to avoid:** "Discounts are hurting us, so stop discounting." No target, no quantified impact, ignores that discounts may drive volume, and overclaims causation. It would likely be wrong and would erode trust in the whole report.
166
+
167
+ The discipline: for every recommendation, be able to say which finding it rests on, what it's worth, how confident you are, and what would prove it wrong.
168
+
169
+ ---
170
+ <!-- module: 09-reproducibility-assumptions.md -->
171
+
172
+ # Reproducibility & Stating Assumptions
173
+
174
+ An analysis nobody can reproduce or trust is worthless, however clever the method.
175
+
176
+ - **State every assumption**: date range, filters applied, how nulls/outliers/duplicates were handled, currency, timezone, and the definition of each metric ("active" = ?). Assumptions left unstated silently make numbers non-comparable across reports and people.
177
+ - **Define metrics precisely.** "Revenue": gross or net of refunds? Booked or recognized? Including tax or not? Two analysts with different definitions produce different totals and both look correct. Pin the definition down and write it near the number.
178
+ - **Make it re-runnable.** Deterministic steps, a fixed seed for any sampling, and the data source plus snapshot date recorded. Someone else running your steps on the same data must get the same numbers. If a rerun tomorrow gives a different answer, say why (live data) and pin a snapshot.
179
+ - **Show denominators and sample sizes** so a reader can judge reliability. "12% conversion" means little without knowing it's 12 of 100 vs. 12,000 of 100,000.
180
+ - **Sanity-check before publishing.** Do totals reconcile to a known source (e.g., does your revenue sum match finance's)? Do the parts sum to the whole? Does the number pass a smell test against prior periods? Reconciliation catches the duplicated-join and wrong-filter errors that pass silently otherwise.
181
+
182
+ **Worked example.** A report states "Q3 revenue: $2.0M." Reproducible version: "Q3 revenue (net of refunds, recognized, USD): $2.03M. Source: `transactions` snapshot 2026-10-02, deduplicated on order_id (1,200 dupes removed), refunds excluded (−$140k), 12% of rows had null region and are grouped as 'Unknown'. Reconciles to finance's GL within 0.5%." A reader can now trust it, reproduce it, and compare it to next quarter on the same basis.
183
+
184
+ **Why it matters.** The difference between trustworthy reporting and a plausible-looking guess is not cleverness: it's that the trustworthy one states its assumptions, defines its metrics, reconciles to a known truth, and can be re-run to the same result. When two reports disagree, the one that documented its basis wins the argument.
185
+
186
+ The discipline: before publishing, write down the date range, filters, null/outlier/duplicate handling, and metric definitions, then reconcile the headline number against an independent source.
@@ -0,0 +1,13 @@
1
+ # Tabular Data Analysis & Reporting: Composable Index
2
+
3
+ Loading policy: read this menu, then load 00-core (if present) plus the minis relevant to your task. If most of this skill is relevant, load BUNDLE.md (or a matching presets/*.md) in one read instead.
4
+
5
+ - **01-data-quality-profiling.md** - Profile data and make explicit cleaning decisions. *Load when* first receiving any dataset, before computing anything.
6
+ - **02-aggregation-pitfalls.md** - Duplicates, mean vs median, missing-value denominators, Simpson's paradox. *Load when* summing, averaging, counting, or joining.
7
+ - **03-time-series.md** - Growth rates, partial periods, seasonality, CAGR, smoothing. *Load when* analyzing anything over time.
8
+ - **04-segmentation.md** - Slicing by dimension, segment size, cohorts, concentration. *Load when* breaking a metric down by group.
9
+ - **05-discount-pricing.md** - Depth vs penetration, margin impact, net price, confounders. *Load when* analyzing discounts, pricing, or margin.
10
+ - **06-insight-generation.md** - Moving from totals to "so what": compare, decompose, explain, quantify. *Load when* a draft is just a table of numbers.
11
+ - **07-executive-writing.md** - BLUF, ranking findings, rounding, business translation. *Load when* writing up results for leadership.
12
+ - **08-recommendations.md** - Framing actionable, data-traceable recommendations with uncertainty. *Load when* proposing actions.
13
+ - **09-reproducibility-assumptions.md** - Stating assumptions, defining metrics, reconciling. *Load when* finalizing any analysis.
@@ -0,0 +1,26 @@
1
+ ---
2
+ pairs-with:
3
+ - 02-aggregation-pitfalls.md
4
+ - 09-reproducibility-assumptions.md
5
+ ---
6
+
7
+ # Data Quality Profiling & Cleaning Decisions
8
+
9
+ Never compute a headline number before profiling the data. Rushing to a total on dirty data produces confident, wrong answers.
10
+
11
+ **Profiling checklist for every dataset:**
12
+ - **Shape and grain.** How many rows, and what does one row represent? "One row = one order line" vs "one row = one order" changes every aggregation. State the grain explicitly.
13
+ - **Row count vs. expected.** Does the count match what the business expects for the period? A month with 3x normal rows signals duplication or a double-loaded file.
14
+ - **Nulls per column.** Count and locate missing values. Revenue 8% null is a different problem from 0.1% null.
15
+ - **Ranges and distributions.** Min/max/quartiles for numerics. Negative prices, zero quantities, future dates, or a max 1000x the median flag problems.
16
+ - **Uniqueness.** Are IDs that should be unique actually unique? Duplicate order IDs are the classic silent inflator.
17
+ - **Categoricals.** How many distinct values? Look for the same thing spelled differently ("US", "USA", "United States"), stray whitespace, and case differences.
18
+
19
+ **Cleaning decisions must be explicit and defensible.** For each issue decide and record: drop, impute, cap, or keep-and-flag, and why.
20
+ - Missing revenue on 0.1% of rows: dropping is usually fine; note it.
21
+ - Missing region on 15% of rows: dropping biases the geography analysis. Keep as "Unknown" and report its size.
22
+ - One $2,000,000 transaction when the median is $200: investigate before deciding. It may be real (an enterprise deal) or an error (cents entered as dollars). **Never silently delete it.**
23
+
24
+ **Rule: every cleaning choice changes the answer, so every cleaning choice must be stated.** An analysis whose data decisions are hidden cannot be trusted or reproduced.
25
+
26
+ **Worked example.** You receive 50,000 sales rows. Profiling shows 51,200 order IDs but only 50,000 distinct (1,200 duplicates that would inflate any revenue sum). Region is null on 12% of rows. Two orders are dated in 2027. Actions: dedupe on order ID (document the key), keep null region as "Unknown (12%)", quarantine the future-dated rows pending a source check. Record all three decisions before computing a single total.
@@ -0,0 +1,21 @@
1
+ ---
2
+ requires:
3
+ - 01-data-quality-profiling.md
4
+ pairs-with:
5
+ - 04-segmentation.md
6
+ ---
7
+
8
+ # Aggregation Correctness Pitfalls
9
+
10
+ Most analytical errors are not math errors: they are aggregation errors on messy data.
11
+
12
+ - **Duplicates inflate sums and counts.** Before `SUM(revenue)`, confirm the grain and deduplicate on the true key. A joined table that fans out (one order joined to many line items) multiplies the order's revenue by its line count. Check: does `SUM` at this grain match `SUM` at the source grain?
13
+ - **Averages hide distributions and are wrecked by outliers.** The mean is the wrong summary for skewed data: revenue, session length, and deal size are almost always right-skewed. Report the **median** alongside the mean; if mean ≫ median, say so and lead with median. "Average order value $850" can be one whale plus a hundred $40 orders.
14
+ - **Beware averaging averages.** The average of per-customer average order values is *not* the overall average order value. Aggregate from the base rows, or use a properly weighted average.
15
+ - **Missing values distort denominators.** `AVG` skips nulls; `COUNT(*)` includes them; `COUNT(col)` does not. Decide whether a null means zero (impute 0) or unknown (exclude); they give different results. "Signups / visits" is wrong if some visits are null.
16
+ - **Simpson's paradox.** A trend in the aggregate can reverse within every segment. If overall conversion rose but fell in each channel, a mix shift is responsible: always sanity-check aggregate movements against segment movements.
17
+ - **Count distinct vs. count.** "1,000 orders" and "1,000 customers" differ when customers repeat. Use `COUNT(DISTINCT customer_id)` for customers.
18
+
19
+ **Worked example.** A table joins `orders` to `payments`; some orders have 2 payment rows. `SUM(order_total)` now double-counts those orders. Fix: aggregate `order_total` at the order grain first, then join to payments. Note that `SUM(DISTINCT order_total)` is *not* a fix: two genuinely equal order totals would be wrongly collapsed. Deduplicate rows on the real key, don't dedupe values.
20
+
21
+ The habit that prevents most of these: before every aggregate, state the grain out loud, confirm the key is unique at that grain, and check whether the metric is skewed enough that the mean will mislead.
@@ -0,0 +1,19 @@
1
+ ---
2
+ pairs-with:
3
+ - 02-aggregation-pitfalls.md
4
+ ---
5
+
6
+ # Time-Series Analysis
7
+
8
+ - **Growth rates.** Period-over-period growth = (current − prior) / prior. Always state the base and pair a percentage with absolute numbers. A "200% increase" from 1 to 3 is trivially small in absolute terms.
9
+ - **Partial periods are the number-one time-series trap.** If the current month is only 40% elapsed, its total is not comparable to full prior months and will look like a crash. Either exclude the partial period, run-rate it with a clear caveat, or compare like-for-like (month-to-date vs. same-day-of-month prior). Always label partial periods.
10
+ - **Seasonality.** Compare year-over-year, not just month-over-month, when the business is seasonal. December vs. November tells you little if December always spikes; December vs. last December does.
11
+ - **Choose the right growth summary.** For multi-period growth use CAGR, defined as (end/start)^(1/periods) − 1, not the average of per-period growth rates, which overstates. Averaging +50% then −50% gives 0%, but the true result is −25%.
12
+ - **Smoothing.** Use trailing moving averages (e.g., 7-day) to reveal trend through noise, but note that smoothing lags turning points.
13
+ - **Watch the denominator over time.** A rising total can come from more customers, not more per customer: decompose growth into volume × rate whenever possible.
14
+
15
+ **Worked example.** Revenue "dropped 60% this month." The month is 12 days in. Run-rate: $400k in 12 days → ~$1.0M projected vs. $950k last month (actually up). Report the run-rate *with* the caveat that it's a projection; never present the raw partial total as if it were final. Reporting the −60% would trigger a false alarm.
16
+
17
+ **Second example.** A dashboard shows month-over-month revenue down every December-to-January. That is seasonality, not decline: the correct comparison is January vs. prior January. Presenting the MoM drop as a trend would be misleading.
18
+
19
+ The discipline: for any time comparison, verify the two periods are truly comparable (same length, same completeness, same season) before computing or reporting a change.
@@ -0,0 +1,23 @@
1
+ ---
2
+ pairs-with:
3
+ - 06-insight-generation.md
4
+ ---
5
+
6
+ # Segmentation
7
+
8
+ Segmentation turns a flat number into an insight by asking "for whom / where / which?"
9
+
10
+ - Segment by the dimensions that drive decisions: customer type, region, product, channel, cohort, plan tier.
11
+ - **Always show segment size alongside segment metric.** A segment with 300% growth on 4 customers is noise; the same growth on 4,000 customers is a strategy. Report both the rate and the base count/volume.
12
+ - **Beware small segments.** Percentages on small n are volatile: set a minimum sample threshold and flag or suppress segments below it.
13
+ - Look for **concentration**: often a small fraction of customers or products drives most revenue (Pareto). Compute the share of the top decile; concentration risk is itself a finding.
14
+ - **Cohorts** (grouping by join/acquisition period) separate "are new users better?" from "is the whole base aging?", which is critical for retention and LTV questions.
15
+ - **Contribution to change.** When a total moves, decompose *which segments* caused it. "Revenue up $200k" is far more useful as "Enterprise +$260k, SMB −$60k."
16
+
17
+ **Worked example.** Overall revenue is flat month-over-month, seemingly a non-event. Segmenting reveals Enterprise +$260k and SMB −$260k. The flat aggregate hid a major mix shift and an SMB problem worth acting on. The segmentation *is* the insight; the aggregate concealed it.
18
+
19
+ **Second example.** A "region with 300% growth" turns out to have 3 customers, up from 1. Flag it as too small to act on rather than headline it. Meanwhile a mature region growing 8% on 5,000 customers is the real story. Size context flips which finding matters.
20
+
21
+ **Concentration example.** If the top 10% of customers drive 70% of revenue, that concentration is a finding in itself: it signals both an upsell base and a churn risk if a few accounts leave. Report the concentration ratio explicitly.
22
+
23
+ The discipline: never report a segment percentage without its denominator, and always test whether a flat or moving aggregate is masking offsetting segment movements.
@@ -0,0 +1,17 @@
1
+ ---
2
+ pairs-with:
3
+ - 06-insight-generation.md
4
+ - 08-recommendations.md
5
+ ---
6
+
7
+ # Discount, Pricing & Margin Analysis
8
+
9
+ - **Discount depth vs. discount penetration are different metrics.** Depth = average discount % on discounted orders. Penetration = share of orders that get any discount. Report both. A low average discount can hide that 80% of orders receive *some* discount: high penetration, low depth is a different problem from low penetration, high depth.
10
+ - **Evaluate discounts on margin, not revenue.** A 20% discount on a 30%-margin product does not cut profit by 20%: it can erase most of the margin. A $100 item at 30% margin earns $30; a 20% discount drops price to $80, and if cost stays $70, margin falls to $10 (a 67% margin cut from a 20% discount). Always tie discounting back to unit economics.
11
+ - **Use net/effective price.** Compute realized price after all discounts, credits, and refunds (not list price) as the basis for any pricing conclusion. Watch for discount stacking (multiple discounts compounding).
12
+ - **Confounding with volume.** "Discounted orders are bigger" may mean discounts drive volume, or that big orders negotiate discounts. Correlation is not causation; state which direction the data can and cannot support.
13
+ - **Elasticity claims need controlled comparison**, not a raw before/after that ignores seasonality and product mix. Be explicit about what a discount analysis can and cannot prove.
14
+
15
+ **Worked example.** SMB orders show a 20% average discount and revenue looks healthy, so discounting seems fine. But margin analysis shows SMB products average 30% margin, so the 20% discount cuts unit profit roughly in half. Penetration is 80%: nearly every SMB order is discounted. The finding is not "discounts are moderate" but "discounting is quietly destroying SMB margin," which points to a specific action (cap discount depth or reduce penetration).
16
+
17
+ The discipline: never conclude a discount is "small" or "fine" from the revenue view alone. Always translate it to margin impact and check both depth and penetration before making a pricing recommendation.
@@ -0,0 +1,25 @@
1
+ ---
2
+ pairs-with:
3
+ - 07-executive-writing.md
4
+ - 08-recommendations.md
5
+ ---
6
+
7
+ # Generating Insight Beyond Aggregates
8
+
9
+ A table of totals is not analysis. Insight answers "so what?" Push every number one level further.
10
+
11
+ Four moves that turn a number into a finding:
12
+ - **Compare**: vs. prior period, vs. target, vs. benchmark, vs. other segments. A number alone ("revenue was $2M") means nothing without a reference point. Is $2M good? Only a comparison tells you.
13
+ - **Decompose**: break a change into its drivers: price × volume, new × existing customers, which segments moved. "Revenue up $200k" becomes "driven entirely by Enterprise upsell; SMB actually shrank."
14
+ - **Explain**: offer the most likely cause and note what would confirm or refute it. Distinguish observation from hypothesis.
15
+ - **Quantify impact**: translate to money, users, or risk, and to the decision at stake. "This costs ~$120k/quarter in margin" lands; "discounts are high" doesn't.
16
+
17
+ Then **surface the surprising**: the outlier, the reversal, the concentration, the thing that contradicts the assumption. That is where the value lives. A finding that confirms what everyone already believed rarely changes a decision.
18
+
19
+ **Test for every finding:** ask "so what should we do differently?" If a number implies no decision, it may be context, not a finding: demote it to background.
20
+
21
+ **Worked example.** Draft says: "Q3 revenue was $2.0M. North America was $1.2M. Enterprise was $1.4M." That is three facts, no insight. Pushed further: "Q3 revenue grew 12% ($1.8M → $2.0M), but *all* net growth came from Enterprise (+$260k); SMB declined $60k for the second straight quarter (the first sign the SMB motion is stalling and worth investigating before Q4 planning)." Same underlying numbers, but now there is a comparison, a decomposition, a likely story, and a decision implication.
22
+
23
+ **Second example.** "Average order value is $850" is a bare aggregate. Insight: "AOV is $850, but the median is $210 (a handful of enterprise deals pull the mean up 4x). For SMB-focused decisions, use the median; the $850 figure will mislead capacity and pricing planning." The move here is recognizing the distribution and stating the consequence for a decision.
24
+
25
+ The discipline: never ship a bare number. Attach a comparison and a "so what" to every figure that reaches the reader.
@@ -0,0 +1,26 @@
1
+ ---
2
+ pairs-with:
3
+ - 08-recommendations.md
4
+ - tech-writing/05-style-clarity.md
5
+ ---
6
+
7
+ # Writing for Executive Audiences
8
+
9
+ Executives read for decisions, not for your method. Structure and language should serve a busy reader who will act on three sentences.
10
+
11
+ - **Lead with the answer (BLUF: bottom line up front).** The headline finding and its implication come first; supporting detail follows. Never make a reader wade through methodology to reach the conclusion. If they read only the first line, they should get the point.
12
+ - **Quantify and contextualize.** "Revenue grew 12% ($1.8M → $2.0M), driven mostly by Enterprise," not "revenue grew." Every claim carries a number and a reference point.
13
+ - **Three-to-five findings, ranked by impact.** A report with 20 equal bullets has no priorities. Lead with what matters most; cut or appendix the rest.
14
+ - **Round appropriately.** Say "$2.0M," not "$2,013,847.22." Spurious precision signals poor judgment and slows the reader. Match precision to the decision.
15
+ - **Translate to the business.** Tie every metric to revenue, cost, risk, or growth. Replace jargon and raw metric names with plain business language: "customers who stopped using us" beats "MAU churn delta."
16
+ - **Visual discipline.** One chart, one message; label it with the takeaway ("Enterprise now 70% of revenue"), not just "Figure 3." If a chart needs a paragraph to interpret, it's the wrong chart.
17
+
18
+ **Worked example (before/after opening):**
19
+ - Before: "We queried the transactions table for Q3, deduplicated on order ID, excluded refunds, and after grouping by segment we observed the following distribution of revenue..."
20
+ - After: "**Q3 revenue hit $2.0M (+12%), but growth is now entirely Enterprise: SMB shrank for the second quarter.** Details below." The method belongs in an appendix or a footnote, not the lead.
21
+
22
+ **Second example (precision and translation):**
23
+ - Before: "Net revenue retention was 1.1372 for the enterprise cohort."
24
+ - After: "Enterprise customers grew ~14% in spend without any new logos: existing accounts are expanding, which de-risks the Q4 number."
25
+
26
+ The discipline: write the one sentence you'd want the CEO to repeat in a meeting, put it first, and make everything else support it.
@@ -0,0 +1,20 @@
1
+ ---
2
+ pairs-with:
3
+ - 06-insight-generation.md
4
+ ---
5
+
6
+ # Recommendations & Framing
7
+
8
+ A recommendation is where analysis becomes value, and where analysts most often overreach or under-deliver.
9
+
10
+ - **Recommendations must follow from the data shown**, not appear from nowhere. Each should trace to a specific finding in the report. If a reader can't point to the number behind a recommendation, it's an opinion, not analysis.
11
+ - **Be specific and actionable.** "Cap SMB discounts at 15%, projected to recover ~$120k in annual margin," not "improve discounting." A good recommendation names the action, the target, and the expected impact.
12
+ - **Acknowledge uncertainty and tradeoffs.** State your confidence and what could change the conclusion. Overclaiming from correlation destroys credibility faster than admitting a limit. "This assumes discount elasticity is low, which we haven't tested" is a strength, not a weakness.
13
+ - **Prioritize by impact and effort.** Rank recommendations; don't hand over a flat list of ten. Lead with high-impact, low-effort moves.
14
+ - **Separate what the data says from what you infer.** "Discounted orders are 2x larger (observed)" is a fact; "so discounts likely drive larger orders (hypothesis, needs a controlled test)" is an inference. Label each. Conflating them is how correlation gets sold as causation.
15
+
16
+ **Worked example.** Finding: SMB discount penetration is 80% at 20% average depth, and SMB margin is ~30%, so discounting roughly halves SMB unit profit. Recommendation: "Pilot a 15% discount cap on SMB for one quarter in two regions; projected to recover ~$120k annualized margin if volume holds. Risk: if SMB volume is discount-elastic, we may lose orders; the pilot's control regions will measure this. Confidence: medium; we have the margin math but not the elasticity." Notice it traces to the finding, quantifies impact, names the risk, states confidence, and proposes a test rather than a blanket rollout.
17
+
18
+ **Counter-example to avoid:** "Discounts are hurting us, so stop discounting." No target, no quantified impact, ignores that discounts may drive volume, and overclaims causation. It would likely be wrong and would erode trust in the whole report.
19
+
20
+ The discipline: for every recommendation, be able to say which finding it rests on, what it's worth, how confident you are, and what would prove it wrong.
@@ -0,0 +1,20 @@
1
+ ---
2
+ pairs-with:
3
+ - 01-data-quality-profiling.md
4
+ ---
5
+
6
+ # Reproducibility & Stating Assumptions
7
+
8
+ An analysis nobody can reproduce or trust is worthless, however clever the method.
9
+
10
+ - **State every assumption**: date range, filters applied, how nulls/outliers/duplicates were handled, currency, timezone, and the definition of each metric ("active" = ?). Assumptions left unstated silently make numbers non-comparable across reports and people.
11
+ - **Define metrics precisely.** "Revenue": gross or net of refunds? Booked or recognized? Including tax or not? Two analysts with different definitions produce different totals and both look correct. Pin the definition down and write it near the number.
12
+ - **Make it re-runnable.** Deterministic steps, a fixed seed for any sampling, and the data source plus snapshot date recorded. Someone else running your steps on the same data must get the same numbers. If a rerun tomorrow gives a different answer, say why (live data) and pin a snapshot.
13
+ - **Show denominators and sample sizes** so a reader can judge reliability. "12% conversion" means little without knowing it's 12 of 100 vs. 12,000 of 100,000.
14
+ - **Sanity-check before publishing.** Do totals reconcile to a known source (e.g., does your revenue sum match finance's)? Do the parts sum to the whole? Does the number pass a smell test against prior periods? Reconciliation catches the duplicated-join and wrong-filter errors that pass silently otherwise.
15
+
16
+ **Worked example.** A report states "Q3 revenue: $2.0M." Reproducible version: "Q3 revenue (net of refunds, recognized, USD): $2.03M. Source: `transactions` snapshot 2026-10-02, deduplicated on order_id (1,200 dupes removed), refunds excluded (−$140k), 12% of rows had null region and are grouped as 'Unknown'. Reconciles to finance's GL within 0.5%." A reader can now trust it, reproduce it, and compare it to next quarter on the same basis.
17
+
18
+ **Why it matters.** The difference between trustworthy reporting and a plausible-looking guess is not cleverness: it's that the trustworthy one states its assumptions, defines its metrics, reconciles to a known truth, and can be re-run to the same result. When two reports disagree, the one that documented its basis wins the argument.
19
+
20
+ The discipline: before publishing, write down the date range, filters, null/outlier/duplicate handling, and metric definitions, then reconcile the headline number against an independent source.