skilldrop-cli 0.2.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 (226) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +413 -0
  3. package/bin/skilldrop.js +338 -0
  4. package/model-routing.json +147 -0
  5. package/package.json +36 -0
  6. package/packs.json +90 -0
  7. package/skills/accessibility-audit/SKILL.md +74 -0
  8. package/skills/accessibility-audit/examples/login-form.md +76 -0
  9. package/skills/accessibility-audit/manifest.json +11 -0
  10. package/skills/accessibility-audit/reference.md +69 -0
  11. package/skills/adr-generator/SKILL.md +49 -0
  12. package/skills/adr-generator/manifest.json +11 -0
  13. package/skills/adr-generator/templates/madr.md +56 -0
  14. package/skills/adr-generator/templates/nygard.md +19 -0
  15. package/skills/ai-usage-report/SKILL.md +111 -0
  16. package/skills/ai-usage-report/examples/weekly-engineering-team.md +133 -0
  17. package/skills/ai-usage-report/manifest.json +11 -0
  18. package/skills/ai-usage-report/scripts/build_report.py +436 -0
  19. package/skills/ai-usage-report/templates/report-per-user.md +42 -0
  20. package/skills/ai-usage-report/templates/report-team-rollup.md +49 -0
  21. package/skills/ai-usage-report/templates/usage-event-schema.md +76 -0
  22. package/skills/api-contract-draft/SKILL.md +69 -0
  23. package/skills/api-contract-draft/manifest.json +11 -0
  24. package/skills/api-contract-draft/reference.md +73 -0
  25. package/skills/api-contract-draft/templates/openapi-skeleton.yaml +148 -0
  26. package/skills/architecture-diagrams/SKILL.md +66 -0
  27. package/skills/architecture-diagrams/examples/aws-three-tier.md +44 -0
  28. package/skills/architecture-diagrams/examples/c4-container-saas.md +51 -0
  29. package/skills/architecture-diagrams/examples/microservices-sequence.md +49 -0
  30. package/skills/architecture-diagrams/manifest.json +28 -0
  31. package/skills/architecture-diagrams/templates/c4-container.puml +31 -0
  32. package/skills/architecture-diagrams/templates/mermaid-aws.md +52 -0
  33. package/skills/architecture-diagrams/templates/mermaid-flowchart.md +37 -0
  34. package/skills/architecture-diagrams/templates/mermaid-sequence.md +39 -0
  35. package/skills/audience-profile/SKILL.md +73 -0
  36. package/skills/audience-profile/manifest.json +11 -0
  37. package/skills/audience-profile/reference.md +175 -0
  38. package/skills/brief-intake/SKILL.md +78 -0
  39. package/skills/brief-intake/manifest.json +11 -0
  40. package/skills/brief-intake/templates/brief-adr.md +41 -0
  41. package/skills/brief-intake/templates/brief-decision-log.md +35 -0
  42. package/skills/brief-intake/templates/brief-deck.md +43 -0
  43. package/skills/brief-intake/templates/brief-design-doc.md +48 -0
  44. package/skills/brief-intake/templates/brief-exec-summary.md +47 -0
  45. package/skills/brief-intake/templates/brief-generic.md +45 -0
  46. package/skills/brief-intake/templates/brief-runbook.md +44 -0
  47. package/skills/brief-intake/templates/brief-tech-comparison.md +38 -0
  48. package/skills/bug-triage/SKILL.md +67 -0
  49. package/skills/bug-triage/manifest.json +11 -0
  50. package/skills/bug-triage/templates/bug-ticket.md +86 -0
  51. package/skills/business-case/SKILL.md +64 -0
  52. package/skills/business-case/manifest.json +11 -0
  53. package/skills/business-case/templates/business-case.md +60 -0
  54. package/skills/capacity-cost-model/SKILL.md +64 -0
  55. package/skills/capacity-cost-model/manifest.json +11 -0
  56. package/skills/capacity-cost-model/reference.md +54 -0
  57. package/skills/capacity-cost-model/templates/cost-model.md +68 -0
  58. package/skills/council-review/SKILL.md +106 -0
  59. package/skills/council-review/examples/redis-cache-decision.md +75 -0
  60. package/skills/council-review/manifest.json +11 -0
  61. package/skills/council-review/reference.md +76 -0
  62. package/skills/council-review/seats/architect.md +29 -0
  63. package/skills/council-review/seats/bench.md +39 -0
  64. package/skills/council-review/seats/operator.md +27 -0
  65. package/skills/council-review/seats/pragmatist.md +29 -0
  66. package/skills/council-review/seats/security-engineer.md +29 -0
  67. package/skills/council-review/seats/user-advocate.md +27 -0
  68. package/skills/council-review/templates/council-review.md +59 -0
  69. package/skills/data-contract/SKILL.md +67 -0
  70. package/skills/data-contract/manifest.json +11 -0
  71. package/skills/data-contract/reference.md +46 -0
  72. package/skills/data-contract/templates/data-contract.md +69 -0
  73. package/skills/db-schema-design/SKILL.md +68 -0
  74. package/skills/db-schema-design/manifest.json +11 -0
  75. package/skills/db-schema-design/reference.md +56 -0
  76. package/skills/db-schema-design/templates/schema-design.md +75 -0
  77. package/skills/decision-log/SKILL.md +67 -0
  78. package/skills/decision-log/manifest.json +11 -0
  79. package/skills/deck-builder/SKILL.md +114 -0
  80. package/skills/deck-builder/examples/exec-board-update.md +108 -0
  81. package/skills/deck-builder/manifest.json +17 -0
  82. package/skills/deck-builder/reference.md +92 -0
  83. package/skills/deck-builder/requirements.txt +1 -0
  84. package/skills/deck-builder/scripts/build_deck.py +309 -0
  85. package/skills/deck-builder/templates/deck-spec.json +97 -0
  86. package/skills/deck-builder/templates/palettes.json +59 -0
  87. package/skills/design-doc/SKILL.md +49 -0
  88. package/skills/design-doc/manifest.json +11 -0
  89. package/skills/design-doc/templates/design-doc.md +98 -0
  90. package/skills/devils-advocate/SKILL.md +142 -0
  91. package/skills/devils-advocate/lenses/adversarial-review.md +88 -0
  92. package/skills/devils-advocate/lenses/edge-cases.md +95 -0
  93. package/skills/devils-advocate/lenses/future-proofing.md +75 -0
  94. package/skills/devils-advocate/lenses/test-coverage.md +90 -0
  95. package/skills/devils-advocate/manifest.json +11 -0
  96. package/skills/devils-advocate/templates/challenge.md +118 -0
  97. package/skills/doc-critique/SKILL.md +119 -0
  98. package/skills/doc-critique/manifest.json +11 -0
  99. package/skills/doc-critique/rubrics/adr.md +36 -0
  100. package/skills/doc-critique/rubrics/decision-log.md +39 -0
  101. package/skills/doc-critique/rubrics/deck.md +45 -0
  102. package/skills/doc-critique/rubrics/design-doc.md +42 -0
  103. package/skills/doc-critique/rubrics/exec-summary.md +41 -0
  104. package/skills/doc-critique/rubrics/generic.md +40 -0
  105. package/skills/doc-critique/rubrics/runbook.md +42 -0
  106. package/skills/doc-critique/rubrics/tech-comparison.md +40 -0
  107. package/skills/doc-critique/templates/critique.md +49 -0
  108. package/skills/exec-summary/SKILL.md +45 -0
  109. package/skills/exec-summary/manifest.json +11 -0
  110. package/skills/exec-summary/templates/exec-summary.md +48 -0
  111. package/skills/feature-implement-loop/SKILL.md +83 -0
  112. package/skills/feature-implement-loop/manifest.json +11 -0
  113. package/skills/figma-diagrams/SKILL.md +85 -0
  114. package/skills/figma-diagrams/manifest.json +35 -0
  115. package/skills/figma-diagrams/reference.md +91 -0
  116. package/skills/figma-diagrams/requirements.txt +1 -0
  117. package/skills/figma-diagrams/scripts/_figma_client.py +71 -0
  118. package/skills/figma-diagrams/scripts/frame_to_mermaid.py +102 -0
  119. package/skills/figma-diagrams/scripts/inspect_file.py +46 -0
  120. package/skills/figma-diagrams/scripts/list_comments.py +35 -0
  121. package/skills/figma-diagrams/scripts/post_comment.py +52 -0
  122. package/skills/figma-diagrams/templates/figjam-import.json +20 -0
  123. package/skills/guide-builder/SKILL.md +76 -0
  124. package/skills/guide-builder/examples/local-setup-guide.md +127 -0
  125. package/skills/guide-builder/manifest.json +11 -0
  126. package/skills/guide-builder/templates/api-reference.md +120 -0
  127. package/skills/guide-builder/templates/design-walkthrough.md +72 -0
  128. package/skills/guide-builder/templates/setup-guide.md +109 -0
  129. package/skills/incident-comms/SKILL.md +68 -0
  130. package/skills/incident-comms/manifest.json +11 -0
  131. package/skills/incident-comms/reference.md +43 -0
  132. package/skills/incident-comms/templates/messages.md +82 -0
  133. package/skills/llm-eval-harness/SKILL.md +73 -0
  134. package/skills/llm-eval-harness/manifest.json +11 -0
  135. package/skills/llm-eval-harness/reference.md +58 -0
  136. package/skills/llm-eval-harness/templates/eval-plan.md +63 -0
  137. package/skills/llm-eval-harness/templates/golden-case.jsonl +5 -0
  138. package/skills/migration-plan/SKILL.md +68 -0
  139. package/skills/migration-plan/manifest.json +11 -0
  140. package/skills/migration-plan/templates/migration-plan.md +68 -0
  141. package/skills/nfr-spec/SKILL.md +63 -0
  142. package/skills/nfr-spec/manifest.json +11 -0
  143. package/skills/nfr-spec/reference.md +74 -0
  144. package/skills/nfr-spec/templates/nfr-spec.md +56 -0
  145. package/skills/observability-plan/SKILL.md +70 -0
  146. package/skills/observability-plan/manifest.json +11 -0
  147. package/skills/observability-plan/reference.md +67 -0
  148. package/skills/observability-plan/templates/observability-plan.md +62 -0
  149. package/skills/okr-cascade/SKILL.md +59 -0
  150. package/skills/okr-cascade/evals/eval_queries.json +12 -0
  151. package/skills/okr-cascade/evals/evals.json +28 -0
  152. package/skills/okr-cascade/manifest.json +11 -0
  153. package/skills/okr-cascade/templates/okr-cascade.md +46 -0
  154. package/skills/postmortem-generator/SKILL.md +65 -0
  155. package/skills/postmortem-generator/manifest.json +11 -0
  156. package/skills/postmortem-generator/templates/postmortem.md +67 -0
  157. package/skills/prd-draft/SKILL.md +62 -0
  158. package/skills/prd-draft/manifest.json +11 -0
  159. package/skills/prd-draft/templates/prd.md +66 -0
  160. package/skills/prfaq/SKILL.md +75 -0
  161. package/skills/prfaq/evals/eval_queries.json +13 -0
  162. package/skills/prfaq/evals/evals.json +32 -0
  163. package/skills/prfaq/manifest.json +11 -0
  164. package/skills/prfaq/templates/prfaq.md +60 -0
  165. package/skills/release-notes/SKILL.md +61 -0
  166. package/skills/release-notes/manifest.json +11 -0
  167. package/skills/release-notes/templates/release-notes.md +83 -0
  168. package/skills/requirements-interview/SKILL.md +61 -0
  169. package/skills/requirements-interview/manifest.json +11 -0
  170. package/skills/requirements-interview/templates/interview-kit.md +63 -0
  171. package/skills/reverse-architecture/SKILL.md +103 -0
  172. package/skills/reverse-architecture/manifest.json +11 -0
  173. package/skills/reverse-architecture/reference.md +150 -0
  174. package/skills/reverse-architecture/templates/description.md +52 -0
  175. package/skills/reverse-architecture/templates/extraction.md +55 -0
  176. package/skills/runbook-generator/SKILL.md +42 -0
  177. package/skills/runbook-generator/manifest.json +11 -0
  178. package/skills/runbook-generator/templates/runbook.md +109 -0
  179. package/skills/slide-outliner/SKILL.md +58 -0
  180. package/skills/slide-outliner/manifest.json +11 -0
  181. package/skills/slide-outliner/templates/deck-outline.md +131 -0
  182. package/skills/sonar-onboard/SKILL.md +170 -0
  183. package/skills/sonar-onboard/manifest.json +11 -0
  184. package/skills/sonar-onboard/reference.md +151 -0
  185. package/skills/sonar-onboard/templates/github-actions-sonar-server.yml.tmpl +50 -0
  186. package/skills/sonar-onboard/templates/github-actions-sonarcloud.yml.tmpl +53 -0
  187. package/skills/sonar-onboard/templates/readme-snippet.md +38 -0
  188. package/skills/sonar-onboard/templates/sonar-project.properties.tmpl +31 -0
  189. package/skills/sonar-review/SKILL.md +220 -0
  190. package/skills/sonar-review/lenses/bugs.md +48 -0
  191. package/skills/sonar-review/lenses/code-smells.md +64 -0
  192. package/skills/sonar-review/lenses/coverage-and-duplication.md +74 -0
  193. package/skills/sonar-review/lenses/security-hotspots.md +56 -0
  194. package/skills/sonar-review/lenses/vulnerabilities.md +52 -0
  195. package/skills/sonar-review/manifest.json +37 -0
  196. package/skills/sonar-review/reference.md +167 -0
  197. package/skills/sonar-review/templates/report.md +84 -0
  198. package/skills/strategy-analysis/SKILL.md +63 -0
  199. package/skills/strategy-analysis/evals/eval_queries.json +13 -0
  200. package/skills/strategy-analysis/evals/evals.json +36 -0
  201. package/skills/strategy-analysis/manifest.json +11 -0
  202. package/skills/success-metrics/SKILL.md +63 -0
  203. package/skills/success-metrics/evals/eval_queries.json +11 -0
  204. package/skills/success-metrics/evals/evals.json +27 -0
  205. package/skills/success-metrics/manifest.json +11 -0
  206. package/skills/success-metrics/templates/metrics-plan.md +55 -0
  207. package/skills/tech-comparison-matrix/SKILL.md +56 -0
  208. package/skills/tech-comparison-matrix/manifest.json +11 -0
  209. package/skills/tech-comparison-matrix/templates/matrix.md +45 -0
  210. package/skills/test-plan-generator/SKILL.md +59 -0
  211. package/skills/test-plan-generator/manifest.json +11 -0
  212. package/skills/test-plan-generator/templates/test-plan.md +83 -0
  213. package/skills/threat-model/SKILL.md +65 -0
  214. package/skills/threat-model/examples/document-upload.md +56 -0
  215. package/skills/threat-model/manifest.json +11 -0
  216. package/skills/threat-model/reference.md +69 -0
  217. package/skills/user-journey-map/SKILL.md +64 -0
  218. package/skills/user-journey-map/evals/eval_queries.json +12 -0
  219. package/skills/user-journey-map/evals/evals.json +30 -0
  220. package/skills/user-journey-map/examples/b2b-saas-onboarding.md +69 -0
  221. package/skills/user-journey-map/manifest.json +11 -0
  222. package/skills/user-journey-map/templates/journey-map.md +47 -0
  223. package/skills/user-story-splitter/SKILL.md +88 -0
  224. package/skills/user-story-splitter/examples/notifications-epic.md +123 -0
  225. package/skills/user-story-splitter/manifest.json +11 -0
  226. package/skills/user-story-splitter/templates/story.md +40 -0
@@ -0,0 +1,46 @@
1
+ # data-contract reference — quality dimensions, evolution matrix, field semantics
2
+
3
+ ## Data-quality dimension catalog
4
+
5
+ Each dimension on the contract gets: a **threshold**, a **check** (how/when measured), and a **breach action**. Pick the dimensions that matter for this asset; mark the rest n/a with a reason.
6
+
7
+ | Dimension | What it guarantees | Threshold example | Check | Breach action examples |
8
+ |---|---|---|---|---|
9
+ | **Freshness** | data is recent enough to trust | partition D lands by 06:00 D+1 | scheduler SLA / landing-time monitor | page owner; mark stale on the dashboard |
10
+ | **Completeness** | nothing silently missing | row count within ±10% of trailing-7d median; all partitions present | post-load count check | quarantine partition; block downstream |
11
+ | **Validity** | values satisfy field constraints | ≥99.9% rows pass per-field rules | constraint suite per load | reject load; alert; route bad rows to DLQ |
12
+ | **Uniqueness** | the key is actually unique | `event_id` 100% unique | dup-count query | breach = contract violation, not silent dedup |
13
+ | **Consistency** | cross-field/cross-table invariants hold | `ends_at` ≥ `starts_at`; FK resolves | invariant assertions | alert; hold publish |
14
+ | **Distribution / drift** | columns consumers model don't shift unannounced | null-rate, cardinality, mean within historical band | drift monitor vs baseline | alert consumers; investigate before publish |
15
+ | **Timeliness of correction** | how fast a known-bad load is fixed | corrected within {N}h of detection | incident clock | comms to consumers (→ `incident-comms`) |
16
+
17
+ A dimension with no breach action is decoration. The breach action is the part consumers actually rely on.
18
+
19
+ ## Schema-evolution safe/breaking matrix (for DATA consumers)
20
+
21
+ "Breaking" here means: a downstream query, pipeline, or trained model could silently produce wrong results or fail. Data consumers are more fragile than API clients — `SELECT *`, positional reads, and models that learned a column's distribution all break in ways HTTP clients don't.
22
+
23
+ | Change | Safe? | Notes |
24
+ |---|---|---|
25
+ | Add optional/nullable column **with** default or documented null-meaning | usually safe | still breaks strict `SELECT *` schema checks — notify |
26
+ | Add `NOT NULL` column without default | **breaking** | every existing writer fails |
27
+ | Remove or rename a column | **breaking** | rename = remove + add; positional/`*` consumers break |
28
+ | Change type (even "widening") | **breaking** | int→float shifts joins, aggregations, model features |
29
+ | **Change the meaning** behind a stable name+type | **breaking — the silent killer** | gross→net, UTC→local, cents→dollars: no validator catches it; only the contract can |
30
+ | Narrow an enum (remove an allowed value) | **breaking** | consumers branching on it lose a case |
31
+ | Widen an enum (add an allowed value) | maybe breaking | breaks consumers with exhaustive switches; declare enum open/closed |
32
+ | Tighten a constraint (e.g. now `NOT NULL`) | **breaking** | historical rows / lenient writers violate it |
33
+ | Loosen a constraint | usually safe | but consumers assuming the old guarantee may break |
34
+ | Change partitioning / sort | **breaking for performance** | consumer queries may table-scan or time out |
35
+
36
+ **Every breaking change requires:** version bump → deprecation window (name it, e.g. 30 days or until all registered consumers ack) → notification to the registered consumer list → both versions available during the window where feasible. This mirrors `migration-plan`'s expand/contract — apply it to the schema.
37
+
38
+ ## Field-semantics rules (the cents-vs-dollars firewall)
39
+
40
+ Every field on the contract states:
41
+ - **Unit** for any quantity — currency + minor/major units, time unit, byte/bit, percentage-as-0-1-vs-0-100. The single most common silent data bug is a unit assumption.
42
+ - **Allowed values** for any categorical — the full enum, open or closed.
43
+ - **Null semantics** — is `null` "unknown", "not applicable", or "zero"? These are three different facts; pick one and write it.
44
+ - **Timezone** for any timestamp — UTC unless stated; name the zone, never leave it implicit.
45
+ - **Meaning** — one line a new consumer reads instead of guessing. "`status`: lifecycle state of the order, see allowed values" beats inferring from the name.
46
+ - **Identity** — which field(s) uniquely identify a row, and whether IDs are stable across reloads.
@@ -0,0 +1,69 @@
1
+ # Data-contract template
2
+
3
+ A dataset is a product. This is its label, its warranty, and its change policy.
4
+
5
+ ```markdown
6
+ # Data contract: {asset name}
7
+
8
+ **Asset:** {warehouse table | Kafka topic | file feed | view} — `{fully.qualified.name}`
9
+ **Owner:** {team/role} · **Contact / on-call:** {channel}
10
+ **Producer:** {pipeline/service} · **Update mechanism:** {batch | streaming | CDC}
11
+ **Version:** {v1} · **Status:** {proposed | active | deprecated}
12
+
13
+ ## Consumers (defines what "breaking" means)
14
+
15
+ | Consumer | Team | Usage | Notify on change |
16
+ |---|---|---|---|
17
+ | {dashboard/model/pipeline} | {team} | {what they read it for} | {channel} |
18
+
19
+ ⚠ {Flag any unknown/unregistered consumers — a change can't be safely made until known.}
20
+
21
+ ## Schema (types + semantics)
22
+
23
+ | Field | Type | Req? | Null means | Unit / allowed values | Meaning |
24
+ |---|---|---|---|---|---|
25
+ | `event_id` | string | required | — | opaque UUID | unique row identity, stable across reloads |
26
+ | `amount` | int64 | required | — | minor units (cents), {currency} | net charged after discounts |
27
+ | `country` | string | optional | unknown | ISO-3166-1 alpha-2, open enum | billing country |
28
+ | `occurred_at` | timestamp | required | — | UTC, ISO-8601 | when the event happened (not when ingested) |
29
+
30
+ **Identity:** {field(s) that uniquely identify a row}
31
+ **Grain:** {one row per … }
32
+
33
+ ## Quality SLAs
34
+
35
+ | Dimension | Threshold | Check | Breach action | Met today? |
36
+ |---|---|---|---|---|
37
+ | Freshness | partition D by 06:00 D+1 | landing monitor | page owner | ✅ / aspirational |
38
+ | Completeness | rows within ±10% of 7d median | post-load count | quarantine partition | … |
39
+ | Validity | ≥99.9% pass field rules | constraint suite | reject load, alert | … |
40
+ | Uniqueness | `event_id` 100% unique | dup query | contract breach | … |
41
+ | Distribution | null-rate/cardinality in band | drift monitor | alert consumers | … |
42
+
43
+ {Mark each "Met today?" honestly: ✅ currently met, or "aspirational — pipeline does not yet meet this".}
44
+
45
+ ## Schema-evolution policy
46
+
47
+ - Safe (notify only): {additive nullable columns with documented null-meaning}
48
+ - Breaking (version bump + deprecation window + consumer ack): removals, renames, type changes, **meaning changes under a stable name**, enum narrowing, constraint tightening, partition changes.
49
+ - Deprecation window: {e.g. 30 days, or until all registered consumers ack}; both versions live during the window where feasible.
50
+ - Meaning-change clause: a field's documented meaning is part of the contract; changing it (e.g. gross→net) is breaking even if name and type are unchanged.
51
+
52
+ ## Delivery
53
+
54
+ - **Location / format:** {path or topic} · {Parquet | Avro | JSON}
55
+ - **Partitioning:** {scheme}
56
+ - **Cadence:** {hourly | daily 06:00 | continuous}
57
+ - **Streaming only:** delivery {at-least-once → dedupe on identity}; ordering {per-key | none}; retention {N days}
58
+ - **Register as a consumer:** {how — so breaking-change notices reach you}
59
+
60
+ ## Classification & retention
61
+
62
+ | Field(s) | Classification | Retention | Residency |
63
+ |---|---|---|---|
64
+ | {field} | {PII / sensitive / public} | {period} | {constraint or none} |
65
+
66
+ ## Open questions
67
+
68
+ - {unknowns blocking sign-off — e.g. undiscovered consumers, an SLA not yet measurable}
69
+ ```
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: db-schema-design
3
+ description: Design a database schema from access patterns — paradigm chosen deliberately (relational/document/key-value/wide-column/graph), keys and partitioning driven by the actual queries, indexes mapped to predicates, money/time types right, and every read path verified to have a supporting access path. Use when the user is designing a data model, schema, or tables for a feature, choosing a database, or asks how to structure/store data.
4
+ ---
5
+
6
+ # db-schema-design
7
+
8
+ Designs the storage layer **from the queries backward** — because a schema is right or wrong only relative to how it's read and written, and the most expensive schema mistakes are the access paths nobody designed for. Distinct from `data-contract` (the guarantee on a *published* dataset) and `api-contract-draft` (the sync interface): this is the table/collection/key design underneath. Hands evolution off to `migration-plan` and the published-dataset guarantee to `data-contract`.
9
+
10
+ ## How to respond
11
+
12
+ 1. **Collect the access patterns before drawing a single table.** The deliverable starts as a list: each read and write the feature needs, with **frequency**, **latency sensitivity**, **selectivity** (one row / a range / a scan), and **consistency need** (read-your-writes? eventual ok?). Ask at most 2 questions, spent on the highest-frequency query and the largest-growth entity. A schema designed from the entity diagram instead of the queries is how you get a clean model that can't serve its hottest path.
13
+
14
+ 2. **Choose the paradigm deliberately, with a reason** (selection matrix in [`reference.md`](reference.md)). Relational is the correct default for most transactional features and needs no defense; reaching *past* it does. ✅ *"Document store — the entity is read and written whole, no cross-entity queries, and the shape varies per type"* — ❌ *"NoSQL because scale"* (scale is a property of access patterns and data size, not a vibe). For NoSQL especially, the access patterns *are* the schema — you cannot add a query later for free the way SQL lets you.
15
+
16
+ 3. **Design keys from the queries.**
17
+ - **Relational:** surrogate key (e.g. `bigint`/ULID) as PK by default; natural keys get a unique constraint, not the clustered PK. Avoid random UUIDv4 as a clustered/primary key — it scatters writes and splits pages; use a time-ordered ID (ULID/UUIDv7) when you need a UUID and ordered inserts.
18
+ - **NoSQL:** partition key + sort key derived directly from the access patterns, chosen to spread load (no hot partition) and to co-locate what's read together. State the query each key shape serves.
19
+
20
+ 4. **Normalize to 3NF, then denormalize only for a named read pattern — and name the sync obligation.** 3NF is the default because it makes writes correct and anomalies impossible. Every denormalization is a deliberate trade for a specific hot read, and it incurs a duplicate-keeping-in-sync debt that must be stated: ✅ *"Cache `order_count` on `customer` for the dashboard's top query; kept in sync by the order-write transaction / a trigger"* — ❌ a denormalized field with no answer to "what updates the copy?".
21
+
22
+ 5. **Index for the actual predicates, joins, and sorts — not speculatively.** Every index pays a write cost and storage; an unused index is pure overhead. Rules (full set in [`reference.md`](reference.md)): index the columns in `WHERE`/`JOIN`/`ORDER BY` of real queries; **composite index column order is equality-first, then range, then sort**; consider a covering index for a hot read; don't index low-selectivity columns alone. Map each index to the query it serves — an index with no query is a guess.
23
+
24
+ 6. **Get the types and constraints right at the schema, not in app code.** Money as integer minor units or `decimal`, **never float** (echoes `data-contract`); timestamps with explicit timezone (store UTC); enums as a constrained type or lookup table, not free strings; `NOT NULL` + defaults + `CHECK` + foreign keys express invariants the database enforces for every writer, including the ones you'll add later. Right-size types (don't `text` a 2-char country code).
25
+
26
+ 7. **State the scale and multitenancy decisions.** Name the table that grows unbounded and its plan (partition by time, archive cold data); the partition/shard strategy if any (and why it's not premature); and the **multitenancy isolation model** (shared-table + `tenant_id` with row-level security / schema-per-tenant / db-per-tenant) with its trade — this is an early decision that's brutal to reverse, so it's explicit, not defaulted.
27
+
28
+ 8. **Verify every access pattern has a supporting path, and emit with [`templates/schema-design.md`](templates/schema-design.md)** in one message: access-pattern table, paradigm + rationale, the schema (tables/collections with columns, types, keys, constraints), relationships/cardinality, indexes mapped to queries, scale + multitenancy decisions, and the **verification table** — each access pattern → the key or index that serves it, with any that fall to a full scan flagged. Evolution → `migration-plan`; published-to-consumers → `data-contract`.
29
+
30
+ ## Useful references in this skill
31
+
32
+ - [`reference.md`](reference.md) — paradigm-selection matrix, key-design rules, the normalization/denormalization ladder, indexing rules, multitenancy options, and the schema anti-pattern catalog
33
+ - [`templates/schema-design.md`](templates/schema-design.md) — the design skeleton with access-pattern, schema, index, and verification tables
34
+
35
+ ## Quality bar
36
+
37
+ - **Access patterns are listed before the schema**, with frequency and selectivity. A schema with no query list was designed blind.
38
+ - **The paradigm choice has a reason tied to access patterns** — and relational-by-default needs none while every move past it does.
39
+ - **Keys are justified by queries**, and no random UUIDv4 sits as a clustered PK without a noted reason.
40
+ - **Every index maps to a real query**; every denormalization names what keeps the copy in sync.
41
+ - **Money is never float, timestamps carry timezone, invariants are DB constraints** — not left to application discipline.
42
+ - **Multitenancy and the unbounded-growth table have explicit plans.** The expensive-to-reverse decisions are made on purpose.
43
+ - **The verification table shows each access pattern's supporting path**, with full scans flagged rather than hidden.
44
+
45
+ ## When to use this skill
46
+
47
+ - ✅ Designing tables/collections/keys for a new feature or service
48
+ - ✅ Choosing a database paradigm for a known set of access patterns
49
+ - ✅ "How should I structure / store this data?" with real queries in mind
50
+ - ✅ Reworking a schema whose hot query has no supporting index
51
+
52
+ ## When NOT to use this skill
53
+
54
+ - ❌ Governing a dataset other teams consume (quality SLAs, evolution policy) — that's `data-contract`
55
+ - ❌ The sync API/event shape over the data — that's `api-contract-draft`
56
+ - ❌ Executing a schema change on a live system (expand/backfill/contract) — that's `migration-plan`
57
+ - ❌ Picking a specific managed product (Aurora vs Cloud SQL) — that's `tech-comparison-matrix`; this designs the model, not the vendor
58
+
59
+ ## Anti-patterns to avoid
60
+
61
+ - ❌ **Entity-first, query-never.** A beautiful normalized ER diagram whose top query needs four joins and a full scan. Design from the access patterns.
62
+ - ❌ **"NoSQL for scale" with no access-pattern argument.** NoSQL trades ad-hoc query flexibility for scale on *known* patterns; choosing it blind buys the downside without the upside.
63
+ - ❌ **UUIDv4 as the clustered primary key.** Random keys scatter inserts and fragment the index; use a time-ordered ID when you need a UUID.
64
+ - ❌ **EAV / the god table.** Entity-attribute-value "flexible" schemas and 80-column catch-all tables are queryability and integrity sold for a flexibility you'll regret.
65
+ - ❌ **JSON-blob-as-schema-avoidance.** Dumping everything in a `jsonb` column to skip design, then writing queries that dig into it with no index — schema design deferred, not avoided, and now unindexable.
66
+ - ❌ **Speculative indexing.** Indexing every column "to be safe" taxes every write and bloats storage; index the queries you have.
67
+ - ❌ **Float money / naked timestamps / stringly-typed enums.** The same three regrets as `data-contract`, baked in at the storage layer where they're hardest to fix.
68
+ - ❌ **Deferring the multitenancy decision.** Shared-table-vs-isolated is near-impossible to change after data lands; an unmade decision is the riskiest one.
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "db-schema-design",
3
+ "version": "0.1.0",
4
+ "description": "Design a database schema from access patterns — paradigm chosen deliberately (relational/document/key-value/wide-column/graph), keys and partitioning driven by the actual queries, indexes mapped to predicates, money/time types right, and every read path verified to have a supporting access path. Use when the user is designing a data model, schema, or tables for a feature, choosing a database, or asks how to structure/store data.",
5
+ "entrypoint": "SKILL.md",
6
+ "deps": { "npm": [], "pip": [] },
7
+ "env": { "required": [], "optional": [] },
8
+ "related": ["api-contract-draft", "data-contract", "migration-plan", "tech-comparison-matrix"],
9
+ "tags": ["database", "schema-design", "data-model", "indexing", "sql", "nosql"],
10
+ "model": { "tier": "standard", "rationale": "Design synthesis from access patterns against a fixed paradigm/indexing/anti-pattern reference. Paradigm and denormalization judgment is bounded; escalate via ambiguous-input on contested scale/consistency tradeoffs." }
11
+ }
@@ -0,0 +1,56 @@
1
+ # db-schema-design reference — paradigm matrix, keys, indexing, multitenancy, anti-patterns
2
+
3
+ ## Paradigm-selection matrix (relational is the default; justify moving past it)
4
+
5
+ | Paradigm | Fits when | Access-pattern signal | Cost of choosing it |
6
+ |---|---|---|---|
7
+ | **Relational** (Postgres, MySQL) | transactional data, ad-hoc queries, joins, strong consistency | "we'll query this many ways, some not yet known"; integrity matters | vertical-scale ceiling (far off for most); needs sharding eventually at very high write volume |
8
+ | **Document** (Mongo, DynamoDB doc, Firestore) | entity read/written whole, varying shape per item, few cross-entity queries | "always fetch the whole order with its lines by order id" | ad-hoc cross-document queries are slow/absent; you design for the queries you know |
9
+ | **Key-value** (Redis, DynamoDB KV) | get/put by a single key, caching, sessions, very high throughput | "look up by exact id, nothing else" | no querying beyond the key; not a system of record alone |
10
+ | **Wide-column** (Cassandra, Bigtable) | massive write volume, time-series-ish, known query keys, linear scale | "billions of rows, query by partition+time, no joins" | one table per query pattern; data duplicated across tables; eventual consistency |
11
+ | **Graph** (Neo4j) | relationship traversal is the query (friends-of-friends, paths, recommendations) | "find all X connected to Y within N hops" | overkill for tabular data; operational maturity cost |
12
+ | **Time-series** (Timescale, Influx) | append-heavy metrics/events keyed by time, downsampling, retention | "ingest events, query ranges, roll up by window" | narrow purpose; pair with a relational store for the rest |
13
+
14
+ Polyglot is legitimate (Postgres for the system of record + Redis cache + a search index) — but each store needs its own access-pattern justification, and you now own the consistency between them.
15
+
16
+ ## Key design
17
+
18
+ - **Surrogate vs natural (relational):** surrogate PK (`bigint` identity, or ULID/UUIDv7) by default — stable, opaque, join-friendly. Natural keys (email, SKU) get a `UNIQUE` constraint, not the role of clustered PK (they change, and they leak into URLs/logs).
19
+ - **Avoid random UUIDv4 as a clustered/primary key:** random order scatters inserts across the B-tree, causing page splits and write amplification. Use **UUIDv7/ULID** (time-ordered) when you need a UUID with ordered inserts, or a `bigint` sequence.
20
+ - **NoSQL partition + sort key:** derive from access patterns. Partition key must spread load — a low-cardinality or monotonically-increasing partition key creates a **hot partition**. Sort key co-locates and orders what's read together (e.g. PK=`customer_id`, SK=`order#<ts>` to list a customer's orders by time). One access pattern that doesn't fit the key shape = a new table or a secondary index, decided now.
21
+ - **Composite/natural uniqueness:** enforce real-world uniqueness (one active subscription per customer) with a partial/unique index, not app-code checks that race.
22
+
23
+ ## Normalization / denormalization ladder
24
+
25
+ 1. **Start at 3NF.** Each fact in one place; no update anomalies. This is the correct default for a system of record.
26
+ 2. **Denormalize only for a named hot read**, and only after the normalized form is shown to be the bottleneck (or obviously will be). Examples: a counter cache (`order_count`), a duplicated display field to avoid a join on the top query, a materialized view.
27
+ 3. **Every denormalization states its sync mechanism** — transaction, trigger, application code, or scheduled rebuild — and accepts the staleness window. A duplicated value with no sync owner *will* drift.
28
+ 4. **NoSQL is denormalized by design** — you duplicate across items/tables to serve each access pattern; the "sync obligation" becomes a write-path responsibility (write to all copies, or accept eventual reconciliation).
29
+
30
+ ## Indexing rules
31
+
32
+ - Index the columns that appear in `WHERE`, `JOIN`, and `ORDER BY` of **actual** queries.
33
+ - **Composite column order: equality predicates first, then the range predicate, then the sort column.** `WHERE tenant_id = ? AND created_at > ? ORDER BY created_at` → index `(tenant_id, created_at)`.
34
+ - A **covering index** (includes the selected columns) turns a hot read into an index-only scan — worth it for a top query, costly to maintain for a rare one.
35
+ - **Don't index low-selectivity columns alone** (a boolean, a 3-value status) — the scan is cheaper than the index hop; combine with a selective column instead, or use a partial index (`WHERE status = 'active'`).
36
+ - Every index taxes **every write** and consumes storage. The right count is "one per real query shape," not zero and not all-columns.
37
+ - Foreign-key columns are usually worth indexing (joins + cascade performance).
38
+
39
+ ## Multitenancy isolation (decide early — expensive to reverse)
40
+
41
+ | Model | Isolation | Cost / blast radius | Fits |
42
+ |---|---|---|---|
43
+ | Shared table + `tenant_id` (+ row-level security) | logical, enforced by RLS/query | cheapest; a query bug = cross-tenant leak (see `threat-model`) | many small tenants, SaaS default |
44
+ | Schema-per-tenant | stronger; separate tables per tenant | migrations × N schemas; noisy-neighbor still shared | tens–hundreds of mid tenants |
45
+ | Database-per-tenant | strongest; separate DBs | highest ops cost; per-tenant backup/restore is a feature | few large/regulated/enterprise tenants |
46
+
47
+ State the choice and its trade. If shared-table, the `tenant_id` predicate is non-negotiable on every query and belongs in RLS, not developer discipline.
48
+
49
+ ## Schema anti-pattern catalog
50
+
51
+ - **EAV (entity-attribute-value)** — rows of `(entity, attribute, value)` to be "flexible." Kills types, constraints, and queryability. Use real columns, or a typed `jsonb` column with documented shape and expression indexes — not a generic triple store.
52
+ - **The god table** — 60+ columns, half null for any given row, modeling several entities at once. Split by entity.
53
+ - **JSON-blob-as-schema-avoidance** — `jsonb` for everything to skip modeling, then unindexed queries digging into it. JSON is for genuinely variable/sparse sub-structure, with expression indexes on what you query.
54
+ - **Premature sharding** — operational complexity for scale you don't have. Vertical + read replicas + partitioning usually buy years first.
55
+ - **Index-everything / index-nothing** — both are failures; index the real query shapes.
56
+ - **Soft-delete everywhere without thought** — `is_deleted` flags leak into every query and every unique constraint; decide per table, and use partial indexes (`WHERE NOT is_deleted`).
@@ -0,0 +1,75 @@
1
+ # Schema-design template
2
+
3
+ Access patterns first, schema second, verification last — every query must end the document with a supporting path.
4
+
5
+ ```markdown
6
+ # Schema design: {feature / domain}
7
+
8
+ **Paradigm:** {relational | document | key-value | wide-column | graph | time-series}
9
+ **Rationale:** {tied to the access patterns below — relational needs none; anything else justifies}
10
+ **Engine (if decided):** {Postgres 16 | DynamoDB | …} `[assumption if not confirmed]`
11
+
12
+ ## Access patterns (the spec the schema is judged against)
13
+
14
+ | # | Query / write | R/W | Frequency | Selectivity | Latency | Consistency |
15
+ |---|---|---|---|---|---|---|
16
+ | Q1 | get order with lines by order id | R | very high | 1 row + children | <50ms | read-your-writes |
17
+ | Q2 | list a customer's orders, newest first | R | high | range | <200ms | eventual ok |
18
+ | W1 | create order + lines | W | high | — | — | atomic |
19
+
20
+ ## Schema
21
+
22
+ ### {table / collection: orders}
23
+
24
+ | Column | Type | Null | Key/constraint | Notes |
25
+ |---|---|---|---|---|
26
+ | id | bigint / ULID | no | PK | surrogate; time-ordered |
27
+ | customer_id | bigint | no | FK → customers(id), indexed | |
28
+ | total_minor | bigint | no | CHECK (>= 0) | minor units, currency below — never float |
29
+ | currency | char(3) | no | CHECK (ISO-4217) | |
30
+ | status | text | no | CHECK in (pending,paid,shipped,cancelled) | enum, not free string |
31
+ | created_at | timestamptz | no | default now() | UTC |
32
+
33
+ {Repeat per table/collection. For NoSQL: state PK (partition) + SK (sort) and the access pattern each serves.}
34
+
35
+ ## Relationships
36
+
37
+ - customers 1 —< orders 1 —< order_lines (cascade: delete order → delete its lines)
38
+ - {cardinality + cascade/restrict per relationship}
39
+
40
+ ## Indexes (each maps to a query)
41
+
42
+ | Index | Columns (order matters) | Serves | Type |
43
+ |---|---|---|---|
44
+ | idx_orders_customer_created | (customer_id, created_at) | Q2 (equality then sort) | btree |
45
+ | pk_orders | (id) | Q1 | primary key (clustered/index-organized only on engines that support it — Postgres heaps don't) |
46
+
47
+ {Note any covering/partial index and why. No index without a query.}
48
+
49
+ ## Denormalizations (if any)
50
+
51
+ | Field | On | For query | Kept in sync by |
52
+ |---|---|---|---|
53
+ | order_count | customers | dashboard top read | order-write transaction |
54
+
55
+ ## Scale & multitenancy
56
+
57
+ - **Unbounded-growth table:** {orders} — plan: {partition by created_at month; archive > 24mo to cold storage}.
58
+ - **Partition/shard:** {none yet — vertical + read replica suffices to ~Nx; revisit at {trigger}} or {strategy + why not premature}.
59
+ - **Multitenancy:** {shared-table + tenant_id + RLS | schema-per-tenant | db-per-tenant} — trade: {…}. `tenant_id` predicate enforced by {RLS policy}.
60
+
61
+ ## Verification — every access pattern has a path
62
+
63
+ | # | Supported by | Full scan? |
64
+ |---|---|---|
65
+ | Q1 | pk_orders + FK index on lines | no |
66
+ | Q2 | idx_orders_customer_created | no |
67
+ | W1 | insert; FK indexes present | no |
68
+
69
+ ⚠ {Any pattern with no supporting index/key — flag it and resolve before build.}
70
+
71
+ ## Evolution
72
+
73
+ - Migrations / rollout of changes → `migration-plan`.
74
+ - If this data is published to other teams → wrap it in a `data-contract`.
75
+ ```
@@ -0,0 +1,67 @@
1
+ ---
2
+ name: decision-log
3
+ description: Extract decisions, action items, owners, and due dates from meeting notes, Slack threads, design-review transcripts, or any unstructured discussion. Produces a clean structured log the user can paste into a doc, tracker, or ADR queue. Use when the user has notes/threads/transcripts and asks for a "decision log", "action items", "what did we agree", or "follow-ups".
4
+ ---
5
+
6
+ # decision-log
7
+
8
+ You help the user turn messy meeting notes or threads into a structured log of what was decided, who owns the follow-up, and what's still open.
9
+
10
+ ## How to respond
11
+
12
+ 1. **Ingest the source.** The user will paste notes, give a file path, or share a transcript. If the source is huge (e.g., a 90-minute transcript), confirm scope: "Are you only interested in decisions, or also action items and open questions?"
13
+
14
+ 2. **Extract four categories:**
15
+
16
+ - **Decisions made.** Things the group agreed on — even if informal. Look for phrases like "we'll go with…", "let's do…", "agreed", "fine by me", "ship it". Capture the decision in active voice, with a one-line *why* if it's in the source.
17
+ - **Action items.** Things someone agreed to *do*. Need an owner (a name), an action (a verb phrase), and ideally a due date. If the date is fuzzy ("by next week"), convert to an absolute date and flag it.
18
+ - **Open questions.** Things explicitly *not* resolved. Include who needs to answer if it's stated.
19
+ - **Risks raised.** Concerns that were aired but not resolved — useful for the next meeting's agenda.
20
+
21
+ 3. **Convert fuzzy dates to absolute dates.** "Friday" → `YYYY-MM-DD`. "End of week" → `YYYY-MM-DD (EOW)`. "Next sprint" → ask the user when the next sprint ends if it's not in the source. Mark dates as `(implied)` when you've inferred them so the user can verify.
22
+
23
+ 4. **Attribute every action item to a named person.** "Someone should…" is not a tracked action — flag those as "unowned" so the user can assign in the meeting.
24
+
25
+ 5. **Output as four tables**, in this order:
26
+
27
+ ```markdown
28
+ ## Decisions
29
+ | # | Decision | Why | Source |
30
+ |---|---|---|---|
31
+
32
+ ## Action items
33
+ | # | Owner | Action | Due | Source |
34
+ |---|---|---|---|---|
35
+
36
+ ## Open questions
37
+ | # | Question | Owner (to answer) | Source |
38
+ |---|---|---|---|
39
+
40
+ ## Risks raised (not yet acted on)
41
+ | # | Risk | Raised by | Source |
42
+ |---|---|---|---|
43
+ ```
44
+
45
+ The `Source` column quotes ~5–10 words from the original notes so the user can verify nothing was hallucinated.
46
+
47
+ 6. **Surface gaps.** End with a "🚩 Gaps" callout listing:
48
+ - Action items without an owner
49
+ - Action items without a date
50
+ - Decisions whose rationale isn't captured in the source
51
+ - Anything where you weren't sure whether it was a decision or a discussion
52
+
53
+ ## Quality bar
54
+
55
+ - **Don't invent ownership.** If the source says "we should email the legal team", don't pick a name. Flag as unowned.
56
+ - **Don't promote opinions to decisions.** "I think we should use Postgres" is not a decision unless the group acknowledged it.
57
+ - **Quote, don't paraphrase, the source column.** A 5–10 word verbatim snippet is the audit trail.
58
+ - **Active voice in the action column.** ✅ "Send PR for ADR-0007 to legal" — ❌ "ADR-0007 to be sent to legal".
59
+ - **Convert relative dates.** Today's date is needed — ask if unclear.
60
+
61
+ ## Anti-patterns to avoid
62
+
63
+ - ❌ Mixing decisions and action items in one table. They're different.
64
+ - ❌ Capturing every utterance — pick the load-bearing ones.
65
+ - ❌ "AOB" or generic catch-all entries — be specific or drop.
66
+ - ❌ Hallucinating attendees, dates, or rationale that isn't in the source.
67
+ - ❌ Skipping the Gaps section because it looks like negative feedback — gaps are the most useful part for the meeting's follow-up email.
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "decision-log",
3
+ "version": "0.1.0",
4
+ "description": "Extract decisions, action items, owners, and due dates from meeting notes, Slack threads, design-review transcripts, or any unstructured discussion. Produces a clean structured log the user can paste into a doc, tracker, or ADR queue. Use when the user has notes/threads/transcripts and asks for a \"decision log\", \"action items\", \"what did we agree\", or \"follow-ups\".",
5
+ "entrypoint": "SKILL.md",
6
+ "deps": { "npm": [], "pip": [] },
7
+ "env": { "required": [], "optional": [] },
8
+ "related": [],
9
+ "tags": ["meetings", "decisions", "action-items", "stakeholder-communication"],
10
+ "model": { "tier": "light", "rationale": "Extracts decisions/owners/dates from notes. Pattern extraction; escalates on long transcripts." }
11
+ }
@@ -0,0 +1,114 @@
1
+ ---
2
+ name: deck-builder
3
+ description: Generate a real PowerPoint (.pptx) file from content, target audience, and a color palette. Produces structurally-appropriate decks (slide count, density, layout choice) tuned for the audience — execs, technical reviewers, sales prospects, investors, internal teams. Use when the user wants an actual editable .pptx, not just an outline.
4
+ ---
5
+
6
+ # deck-builder
7
+
8
+ You help the user produce an **actual editable `.pptx` file**, not just an outline. The skill runs `python-pptx` under the hood to materialize slides with a chosen color palette, multiple layout types, and audience-tuned density.
9
+
10
+ This skill pairs with two others:
11
+ - **[`audience-profile`](../audience-profile/SKILL.md)** — decides how dense / how many / which sections the deck should have
12
+ - **[`slide-outliner`](../slide-outliner/SKILL.md)** — drafts the per-slide content before this skill turns it into a `.pptx`
13
+
14
+ For a single fast pipeline, use all three in order: profile → outline → build.
15
+
16
+ ## How to respond
17
+
18
+ 1. **Gather three inputs** before generating anything:
19
+
20
+ - **Content.** Either a finished outline (from `slide-outliner`), a long doc the user wants compressed into slides, or a list of points. If the content is thin ("here's the topic, you fill in"), pause and ask — *making slides up is the easiest way to make a bad deck*.
21
+ - **Audience.** One of: `exec`, `board`, `technical`, `sales`, `internal`, `investor`, `partner`, `customer`. If the user gives a free-form description ("VP of Eng + their staff at a partner"), map to the closest archetype and call out your choice. Use [`audience-profile`](../audience-profile/SKILL.md) for the structural rules.
22
+ - **Palette.** Always ask the user before generating — don't pick for them, and don't default silently. Present the choice like this:
23
+
24
+ > Pick a palette before I generate the deck:
25
+ > - `corporate-blue` — default for B2B / enterprise audiences
26
+ > - `monochrome` — restrained / when content is sensitive
27
+ > - `vibrant` — internal / sales / pitch decks
28
+ > - `dark-mode` — engineering audiences, live demos
29
+ > - `editorial` — long-form / read-ahead decks
30
+ > - `forest` — calm, nature-leaning
31
+ > - `sunset` — warm, narrative-leaning
32
+ > - Or give me hex values for `primary` / `secondary` / `accent` / `background` / `text`
33
+ > - Or paste your brand colors and I'll map them into the five roles
34
+
35
+ If the user gives brand colors as a partial set (e.g. just a primary), derive the missing roles using the rules in [`reference.md`](reference.md#color-palette-principles) and call out what you filled in.
36
+
37
+ 2. **Plan the slide list against the audience archetype.** For example:
38
+
39
+ | Audience | Slide count | Density | Required sections |
40
+ |---|---|---|---|
41
+ | `exec` | 6–10 | Low — 3 bullets max | Ask • TL;DR • Business impact • Risks • Ask (closing) |
42
+ | `board` | 8–12 | Low — big numbers | Cover • TL;DR • Strategic context • Financials • Risks • Ask |
43
+ | `technical` | 12–20 | High — detail welcome | Context • Goals • Proposal (3–5) • Alternatives • Risks • Rollout |
44
+ | `sales` | 8–12 | Story arc, visual | Hook • Pain • Solution • Proof • Pricing • Close |
45
+ | `internal` | 5–10 | Mixed | Context • Proposal • Discussion topics • Action items |
46
+ | `investor` | 10–15 | Polished, narrative | Problem • Market • Product • Traction • Team • Ask |
47
+
48
+ The full archetype spec is in [`audience-profile`](../audience-profile/SKILL.md).
49
+
50
+ 3. **Build a deck spec.** The spec is a JSON document with this shape — full schema in [`templates/deck-spec.json`](templates/deck-spec.json):
51
+
52
+ ```json
53
+ {
54
+ "title": "ProjectX Migration — Board Update",
55
+ "audience": "board",
56
+ "palette": { "primary": "#1A2A6C", "accent": "#FDBB2D", ... },
57
+ "slides": [
58
+ { "layout": "title", "title": "...", "subtitle": "..." },
59
+ { "layout": "section", "title": "..." },
60
+ { "layout": "content", "title": "...", "bullets": ["..."] },
61
+ { "layout": "big_number", "title": "...", "number": "$24M", "caption": "ARR at risk" },
62
+ { "layout": "two_column", "title": "...", "left": {...}, "right": {...} },
63
+ { "layout": "quote", "quote": "...", "attribution": "..." },
64
+ { "layout": "closing", "title": "Approval requested", "subtitle": "..." }
65
+ ]
66
+ }
67
+ ```
68
+
69
+ Available layouts: `title`, `section`, `content`, `two_column`, `big_number`, `quote`, `closing`. Most slides should be `content`; sprinkle in `big_number` and `quote` for emphasis.
70
+
71
+ 4. **Run the build script** to produce the actual `.pptx`:
72
+
73
+ ```bash
74
+ # Claude Code
75
+ python3 "${CLAUDE_SKILL_DIR}/scripts/build_deck.py" /tmp/deck-spec.json -o ./out/deck.pptx
76
+
77
+ # Other IDEs (from the skill folder)
78
+ cd path/to/deck-builder && python3 scripts/build_deck.py /tmp/deck-spec.json -o ./out/deck.pptx
79
+ ```
80
+
81
+ The script writes a real `.pptx` the user can open in PowerPoint, Keynote, or Google Slides and edit further. Tell the user where the file landed and what to do next.
82
+
83
+ 5. **Recommend post-generation refinement.** A generated deck is a strong first draft, not a finished artifact. Always suggest:
84
+
85
+ - Reviewing speaker notes (they were written by the agent — verify before presenting)
86
+ - Replacing any placeholder images with real visuals
87
+ - Doing one "audience pass" — read every slide title in order, does the *narrative* make sense to that specific audience?
88
+
89
+ ## Useful references
90
+
91
+ - [`reference.md`](reference.md) — Color palette principles + layout-vs-content matching guide
92
+ - [`templates/deck-spec.json`](templates/deck-spec.json) — Full JSON schema with every layout demonstrated
93
+ - [`templates/palettes.json`](templates/palettes.json) — Pre-built color palettes (corporate-blue, monochrome, vibrant, dark-mode, editorial, forest, sunset)
94
+ - [`examples/exec-board-update.md`](examples/exec-board-update.md) — Worked example: brief → spec → resulting deck
95
+ - [`scripts/build_deck.py`](scripts/build_deck.py) — The generator (don't edit unless extending layouts)
96
+
97
+ ## Quality bar
98
+
99
+ - **Title slide isn't blank** — it has a real title, subtitle, presenter, date.
100
+ - **Section dividers used sparingly** — at most one every 4–5 content slides.
101
+ - **Big numbers are real** — never invent statistics for emphasis. If the user gave you a number, use it; otherwise pick a different layout.
102
+ - **Bullet density matches audience** — for `exec`, *max 3 bullets per slide*, period. For `technical`, up to 6 if the content really needs it.
103
+ - **Speaker notes for every slide** — even one sentence. They're how the presenter remembers what's *between* the bullets.
104
+ - **Color palette is consistent** — don't mix in random colors that aren't in the palette.
105
+ - **No surprise pages** — first and last slides match in style; the deck reads as one document.
106
+
107
+ ## Anti-patterns to avoid
108
+
109
+ - ❌ Generating a deck without confirming the audience. The same content for execs vs engineers is a different deck.
110
+ - ❌ Writing fake numbers to fill a `big_number` slide.
111
+ - ❌ Defaulting to bullets when a `big_number`, `quote`, or `two_column` would land harder.
112
+ - ❌ Skipping speaker notes because the user "knows the topic" — they're for the reviewer/co-presenter too.
113
+ - ❌ Choosing low-contrast palettes (light grey text on white). If the palette has poor contrast, swap to a sensible default and explain.
114
+ - ❌ More than ~20 slides for any audience. If you can't make the point in 20, the deck isn't the right format.