skilldrop-cli 0.16.11 → 0.16.13

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 (112) hide show
  1. package/bin/skilldrop.js +36 -11
  2. package/catalogue.json +8 -6
  3. package/contracts/catalogue.schema.json +15 -1
  4. package/model-routing.json +1 -17
  5. package/package.json +1 -1
  6. package/packs/ai-engineering/skills/ai-readiness-assessment/SKILL.md +1 -1
  7. package/packs/ai-engineering/skills/ai-readiness-assessment/manifest.json +2 -3
  8. package/packs/ai-engineering/skills/llm-eval-harness/SKILL.md +1 -1
  9. package/packs/ai-engineering/skills/llm-eval-harness/manifest.json +2 -2
  10. package/packs/api-builder/pack.json +1 -1
  11. package/packs/api-builder/skills/eval-harness-generator/SKILL.md +1 -1
  12. package/packs/api-builder/skills/eval-harness-generator/manifest.json +2 -2
  13. package/packs/api-builder/skills/tool-use-schema-writer/SKILL.md +3 -3
  14. package/packs/api-builder/skills/tool-use-schema-writer/evals/evals.json +1 -1
  15. package/packs/api-builder/skills/tool-use-schema-writer/manifest.json +2 -2
  16. package/packs/core/skills/brief-intake/SKILL.md +2 -2
  17. package/packs/core/skills/brief-intake/manifest.json +3 -3
  18. package/packs/core/skills/brief-intake/templates/brief-tech-comparison.md +1 -1
  19. package/packs/core/skills/council-review/SKILL.md +2 -2
  20. package/packs/core/skills/council-review/manifest.json +2 -2
  21. package/packs/core/skills/council-review/reference.md +0 -1
  22. package/packs/core/skills/doc-critique/SKILL.md +1 -1
  23. package/packs/core/skills/doc-critique/manifest.json +2 -2
  24. package/packs/core/skills/doc-critique/rubrics/tech-comparison.md +1 -1
  25. package/packs/data-analytics/pack.json +8 -14
  26. package/packs/data-analytics/skills/dashboard-spec/SKILL.md +2 -2
  27. package/packs/data-analytics/skills/dashboard-spec/examples/support-staffing.md +1 -1
  28. package/packs/data-analytics/skills/dashboard-spec/manifest.json +1 -10
  29. package/packs/data-analytics/skills/dashboard-spec/templates/dashboard-spec.md +1 -1
  30. package/packs/data-analytics/skills/sql-review/SKILL.md +2 -2
  31. package/packs/data-analytics/skills/sql-review/manifest.json +1 -11
  32. package/packs/dev-team/skills/migration-plan/SKILL.md +1 -1
  33. package/packs/dev-team/skills/migration-plan/manifest.json +2 -2
  34. package/packs/product-manager/skills/business-case/SKILL.md +2 -2
  35. package/packs/product-manager/skills/business-case/manifest.json +3 -3
  36. package/packs/product-manager/skills/strategy-analysis/SKILL.md +3 -3
  37. package/packs/product-manager/skills/strategy-analysis/evals/evals.json +1 -1
  38. package/packs/product-manager/skills/strategy-analysis/manifest.json +2 -3
  39. package/packs/research/skills/hypothesis-comparison/SKILL.md +3 -3
  40. package/packs/research/skills/hypothesis-comparison/manifest.json +2 -3
  41. package/packs/research/skills/research-plan/SKILL.md +0 -1
  42. package/packs/research/skills/research-plan/manifest.json +2 -3
  43. package/packs/skill-engineering/skills/skill-author/SKILL.md +1 -1
  44. package/packs/skill-engineering/skills/skill-author/manifest.json +1 -2
  45. package/packs/skill-engineering/skills/skill-review/SKILL.md +1 -1
  46. package/packs/skill-engineering/skills/skill-review/manifest.json +1 -2
  47. package/packs/solution-architect/skills/api-contract-draft/SKILL.md +1 -1
  48. package/packs/solution-architect/skills/api-contract-draft/manifest.json +2 -2
  49. package/packs/data-analytics/skills/metric-definition/SKILL.md +0 -92
  50. package/packs/data-analytics/skills/metric-definition/evals/eval_queries.json +0 -34
  51. package/packs/data-analytics/skills/metric-definition/evals/evals.json +0 -79
  52. package/packs/data-analytics/skills/metric-definition/evals/files/2/tables.md +0 -42
  53. package/packs/data-analytics/skills/metric-definition/evals/files/2/thread.md +0 -40
  54. package/packs/data-analytics/skills/metric-definition/evals/files/4/tables.md +0 -32
  55. package/packs/data-analytics/skills/metric-definition/evals/files/4/thread.md +0 -31
  56. package/packs/data-analytics/skills/metric-definition/examples/refund-rate.md +0 -104
  57. package/packs/data-analytics/skills/metric-definition/manifest.json +0 -41
  58. package/packs/data-analytics/skills/metric-definition/reference.md +0 -67
  59. package/packs/data-analytics/skills/metric-definition/templates/metric-spec.md +0 -70
  60. package/packs/dev-team/skills/contribution-wizard/SKILL.md +0 -142
  61. package/packs/dev-team/skills/contribution-wizard/evals/eval_queries.json +0 -30
  62. package/packs/dev-team/skills/contribution-wizard/evals/evals.json +0 -78
  63. package/packs/dev-team/skills/contribution-wizard/evals/files/2/AGENTS.md +0 -9
  64. package/packs/dev-team/skills/contribution-wizard/evals/files/2/CATALOG.md +0 -18
  65. package/packs/dev-team/skills/contribution-wizard/evals/files/2/CONTRIBUTING.md +0 -45
  66. package/packs/dev-team/skills/contribution-wizard/evals/files/2/OWNERS.md +0 -7
  67. package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/detention-claim-letter/INSTRUCTIONS.md +0 -20
  68. package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/detention-claim-letter/skill.yaml +0 -11
  69. package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/detention-claim-letter/tests/cases.yaml +0 -25
  70. package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/rate-con-extractor/INSTRUCTIONS.md +0 -20
  71. package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/rate-con-extractor/skill.yaml +0 -8
  72. package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/rate-con-extractor/tests/cases.yaml +0 -32
  73. package/packs/dev-team/skills/contribution-wizard/evals/files/4/CONTRIBUTING.md +0 -63
  74. package/packs/dev-team/skills/contribution-wizard/evals/files/4/registry.json +0 -15
  75. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/PROMPT.md +0 -10
  76. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/01-expected.md +0 -2
  77. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/01-input.md +0 -3
  78. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/02-expected.md +0 -1
  79. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/02-input.md +0 -2
  80. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/03-expected.md +0 -1
  81. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/03-input.md +0 -2
  82. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/meta.json +0 -7
  83. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/PROMPT.md +0 -11
  84. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/01-expected.md +0 -4
  85. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/01-input.md +0 -4
  86. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/02-expected.md +0 -6
  87. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/02-input.md +0 -2
  88. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/03-expected.md +0 -1
  89. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/03-input.md +0 -1
  90. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/skill.toml +0 -6
  91. package/packs/dev-team/skills/contribution-wizard/manifest.json +0 -11
  92. package/packs/solution-architect/skills/db-schema-design/SKILL.md +0 -76
  93. package/packs/solution-architect/skills/db-schema-design/evals/eval_queries.json +0 -34
  94. package/packs/solution-architect/skills/db-schema-design/evals/evals.json +0 -75
  95. package/packs/solution-architect/skills/db-schema-design/evals/files/2/current_tables.sql +0 -29
  96. package/packs/solution-architect/skills/db-schema-design/evals/files/2/notes.md +0 -53
  97. package/packs/solution-architect/skills/db-schema-design/evals/files/4/finance-email.md +0 -18
  98. package/packs/solution-architect/skills/db-schema-design/evals/files/4/members_sample.csv +0 -5
  99. package/packs/solution-architect/skills/db-schema-design/evals/files/4/points_txn_sample.csv +0 -17
  100. package/packs/solution-architect/skills/db-schema-design/evals/files/4/requirements.md +0 -28
  101. package/packs/solution-architect/skills/db-schema-design/manifest.json +0 -11
  102. package/packs/solution-architect/skills/db-schema-design/reference.md +0 -56
  103. package/packs/solution-architect/skills/db-schema-design/templates/schema-design.md +0 -75
  104. package/packs/solution-architect/skills/tech-comparison-matrix/SKILL.md +0 -64
  105. package/packs/solution-architect/skills/tech-comparison-matrix/evals/eval_queries.json +0 -30
  106. package/packs/solution-architect/skills/tech-comparison-matrix/evals/evals.json +0 -76
  107. package/packs/solution-architect/skills/tech-comparison-matrix/evals/files/2/requirements.md +0 -20
  108. package/packs/solution-architect/skills/tech-comparison-matrix/evals/files/2/vendor-notes.md +0 -29
  109. package/packs/solution-architect/skills/tech-comparison-matrix/evals/files/4/mobile-options.md +0 -45
  110. package/packs/solution-architect/skills/tech-comparison-matrix/examples/queue-selection.md +0 -41
  111. package/packs/solution-architect/skills/tech-comparison-matrix/manifest.json +0 -11
  112. package/packs/solution-architect/skills/tech-comparison-matrix/templates/matrix.md +0 -45
@@ -1,7 +1,7 @@
1
1
  {
2
- "description": "For analysts and the people who rely on their numbers: define a metric once so everyone gets the same figure, review SQL for the bugs that quietly inflate it, and spec dashboards around a decision instead of every chart that was easy to make.",
2
+ "description": "For analysts and the people who rely on their numbers: review SQL for the bugs that quietly inflate a figure, and spec dashboards around a decision instead of every chart that was easy to make.",
3
3
  "display_name": "Data and analytics",
4
- "keywords": ["metrics", "sql", "dashboard", "semantic-layer", "dbt", "bi", "analytics"],
4
+ "keywords": ["metrics", "sql", "dashboard", "dbt", "bi", "analytics"],
5
5
  "links": {
6
6
  "documentation": "https://sananthanarayan.github.io/skilldrop/packs/data-analytics/"
7
7
  },
@@ -23,35 +23,29 @@
23
23
  "when": "A number matters (a board metric, a finance figure, a team KPI) and people either disagree about it or are about to build a dashboard on it.",
24
24
  "you_bring": [
25
25
  "the metric name and the question it answers",
26
- "the tables it comes from, and any SQL or dashboard already computing it",
26
+ "the SQL or dashboard already computing it, and the tables it reads",
27
27
  "who reads it and what they decide",
28
28
  "the database engine (Postgres, BigQuery, Snowflake, …)"
29
29
  ],
30
30
  "steps": [
31
- {
32
- "skill": "metric-definition",
33
- "you_do": "Give it the metric, the sources, and any existing SQL.",
34
- "you_get": "One written definition: exact formula, grain, window and timezone, exclusions with predicates, allowed dimensions, edge cases, owner, reference SQL and sanity checks.",
35
- "decide": "Confirm the open decisions (timezone, exclusions, lock period) with the metric's owner."
36
- },
37
31
  {
38
32
  "skill": "sql-review",
39
- "you_do": "Run it on the definition's reference SQL, or on any query that already reports the number.",
33
+ "you_do": "Run it on the query that reports the number, with the engine and what one output row should represent.",
40
34
  "you_get": "A verdict and line-by-line findings, each with the wrong result and corrected SQL, plus the full corrected query and verification queries.",
41
- "decide": "Certify the metric, or fix the SQL and review again."
35
+ "decide": "Trust the number, or fix the SQL and review again. If the findings turn on what the number should mean (timezone, exclusions), settle that with the metric's owner first."
42
36
  },
43
37
  {
44
38
  "skill": "dashboard-spec",
45
39
  "you_do": "Give it the audience, the decision and the list of requested charts.",
46
- "you_get": "A one-page spec: questions in priority order, one chart per question built on your defined metrics, filters, freshness SLA, layout, and a cut list."
40
+ "you_get": "A one-page spec: questions in priority order, one chart per question with its metric named and any undefined one flagged as a build blocker, filters, freshness SLA, layout, and a cut list."
47
41
  },
48
42
  {
49
43
  "skill": "doc-critique",
50
- "you_do": "Run it on the metric spec or dashboard spec before sharing it with the BI team.",
44
+ "you_do": "Run it on the dashboard spec before sharing it with the BI team.",
51
45
  "you_get": "A verdict and severity-tagged findings with a fix for each.",
52
46
  "decide": "Hand the spec to the builder, or revise it."
53
47
  }
54
48
  ],
55
- "you_end_with": "A certified metric definition with reviewed reference SQL, and a dashboard spec a BI developer can build without guessing."
49
+ "you_end_with": "Reviewed SQL whose number you can defend, and a dashboard spec a BI developer can build without guessing."
56
50
  }
57
51
  }
@@ -27,7 +27,7 @@ Writes the one-page brief a BI developer builds from, so the dashboard answers t
27
27
 
28
28
  ✅ *"Sorted horizontal bar, because the question is which queue is worst and a ranked bar answers that at a glance."* No pies for more than three parts, no dual axes, no 3D. Every number tile shows a comparison (against target, last period, or the same period last year). A bare number can't tell anyone whether to act.
29
29
 
30
- 5. **Name the metric behind each chart by its `metric-definition` name**, with the grain, the time window and the comparison. ✅ `first_response_hours_p90` · daily · last 8 weeks · vs target 4h. A metric with no written definition is flagged `undefined: needs a spec before build`. That's a build blocker, not a detail for the BI developer to settle by guessing.
30
+ 5. **Name the metric behind each chart by its defined name**, with the grain, the time window and the comparison. ✅ `first_response_hours_p90` · daily · last 8 weeks · vs target 4h. A metric with no written definition is flagged `undefined: needs a spec before build`. That's a build blocker, not a detail for the BI developer to settle by guessing.
31
31
 
32
32
  6. **Set the filters**, at most four global ones with their default values. Only offer a filter on a dimension each affected metric can be sliced by. A filter that fans out a metric (product category on order-level revenue) is left off with a note saying why.
33
33
 
@@ -66,7 +66,7 @@ Writes the one-page brief a BI developer builds from, so the dashboard answers t
66
66
 
67
67
  ## When NOT to use this skill
68
68
 
69
- - ❌ Defining how one metric is calculated (formula, filters, timezone) — that's `metric-definition`
69
+ - ❌ Defining how one metric is calculated (formula, filters, timezone) — that's the metric owner's call; this skill flags the gap, it doesn't fill it
70
70
  - ❌ Choosing which metric judges a feature, with targets and a decision rule — that's `success-metrics`
71
71
  - ❌ Service health dashboards, SLOs and alerting — that's `observability-plan`
72
72
  - ❌ A report on AI tool usage from telemetry logs — that's `ai-usage-report`
@@ -79,6 +79,6 @@ Left off as filters: channel and tag. A ticket can carry several tags, so a tag
79
79
 
80
80
  ## Open questions
81
81
 
82
- - [ ] Incoming tickets needs a `metric-definition` spec (created time, merged and spam tickets). Owner: support operations lead.
82
+ - [ ] Incoming tickets needs a written definition (created time, merged and spam tickets). Owner: support operations lead.
83
83
  - [ ] Tickets handled per agent-week needs a spec (what "handled" means, part-time agents). Owner: support operations lead.
84
84
  - [ ] Confirm the dashboard owner.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dashboard-spec",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Spec a dashboard before anyone builds it — the audience and the decision it serves, the questions in priority order, one chart per question with the chart type and why, the defined metric behind each chart, filters, refresh cadence and freshness SLA, and a list of what is deliberately left off, with vanity metrics cut. Use when the user says \"spec a dashboard\", \"what should go on our KPI dashboard\", \"the BI team needs requirements for a dashboard\", \"our dashboard has 40 charts and nobody uses it\", or \"design the exec dashboard\".",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -13,18 +13,9 @@
13
13
  },
14
14
  "related": [
15
15
  "ai-usage-report",
16
- "metric-definition",
17
16
  "observability-plan",
18
17
  "success-metrics"
19
18
  ],
20
- "handoff": [
21
- {
22
- "to": "metric-definition",
23
- "when": "a chart's metric has no written definition",
24
- "purpose": "Define the metric's formula, grain, window and exclusions so the BI developer doesn't guess.",
25
- "fallback": "If metric-definition is absent, mark the metric undefined in the chart table and list the definitional questions (numerator, denominator, timezone, exclusions) under open questions."
26
- }
27
- ],
28
19
  "tags": [
29
20
  "dashboard",
30
21
  "bi",
@@ -51,5 +51,5 @@ Left off as filters: <dimension> — <why, e.g. fans out order-level metrics>
51
51
 
52
52
  ## Open questions
53
53
 
54
- - [ ] <undefined metric> — needs a `metric-definition` spec, owner <role>
54
+ - [ ] <undefined metric> — needs a written definition (numerator, denominator, timezone, exclusions), owner <role>
55
55
  - [ ] <data gap or unconfirmed target>
@@ -67,8 +67,8 @@ Reviews a query the way a skeptical analyst would before trusting its output: fi
67
67
 
68
68
  ## When NOT to use this skill
69
69
 
70
- - ❌ Deciding what a metric should mean (formula, filters, owner) — that's `metric-definition`; this skill checks that SQL computes it correctly
71
- - ❌ Designing tables, keys and indexes from access patterns — that's `db-schema-design`
70
+ - ❌ Deciding what a metric should mean (formula, filters, owner) — that's the metric owner's call; this skill checks that SQL computes it correctly
71
+ - ❌ Designing tables, keys and indexes from access patterns — this reviews queries against a schema, not the schema
72
72
  - ❌ Agreeing a dataset's schema, quality SLAs and change policy with its consumers — that's `data-contract`
73
73
  - ❌ General application code review, including SQL built in application code for security — that's `pre-merge-review`
74
74
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sql-review",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Review a SQL query for correctness first and performance second — join fan-out inflating sums, NULL traps in filters and NOT IN, timezone and date-boundary errors, integer division, DISTINCT hiding a bad join, window-frame defaults, implicit casts, non-sargable predicates and missing partition filters — with each finding tied to a line, the wrong number it produces, and corrected SQL for the named dialect. Use when the user pastes a query and asks \"is this right\", \"review my SQL\", \"why is this number too high\", \"check this before it goes in the dashboard\", or \"make this query faster\".",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -13,18 +13,8 @@
13
13
  },
14
14
  "related": [
15
15
  "data-contract",
16
- "db-schema-design",
17
- "metric-definition",
18
16
  "pre-merge-review"
19
17
  ],
20
- "handoff": [
21
- {
22
- "to": "metric-definition",
23
- "when": "the review finds the query's filters or formula disagree with what the business means, and no written definition exists",
24
- "purpose": "Agree the metric's formula, grain, window and exclusions before fixing the SQL to match.",
25
- "fallback": "If metric-definition is absent, list the definitional questions (numerator, denominator, timezone, exclusions) in the review's assumptions and mark the affected findings as pending a decision."
26
- }
27
- ],
28
18
  "tags": [
29
19
  "sql",
30
20
  "analytics",
@@ -53,7 +53,7 @@ Plans the road from current state to target state so that at every moment the sy
53
53
  ## When NOT to use this skill
54
54
 
55
55
  - ❌ A change deployable in one reversible step — normal deploy, no plan needed
56
- - ❌ Choosing the target ("should we move to DynamoDB?") — that's `tech-comparison-matrix`; this skill starts after the decision
56
+ - ❌ Choosing the target ("should we move to DynamoDB?") — this skill starts after the decision
57
57
  - ❌ The test depth itself — emit gates here, hand verification design to `test-plan-generator`
58
58
  - ❌ Organizational/process migrations with no system state — different problem
59
59
 
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "migration-plan",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Generate a phased migration or rollout plan (schema change, API version, datastore swap, platform move, auth-provider switch) — expand→migrate→contract by default, every phase reversible or its point of no return named, observable gates between phases, idempotent backfill with parity checks. Use when the user needs a migration plan, cutover plan, rollout strategy, or asks \"how do we get from X to Y without downtime\".",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },
7
7
  "env": { "required": [], "optional": [] },
8
- "related": ["council-review", "tech-comparison-matrix", "test-plan-generator"],
8
+ "related": ["council-review", "test-plan-generator"],
9
9
  "tags": ["migration", "rollout", "cutover", "backfill", "zero-downtime", "deployment"],
10
10
  "model": { "tier": "standard", "rationale": "Phased plan synthesis with a strong template. Ordering judgment is bounded by the expand/migrate/contract pattern; escalate via ambiguous-input on contested, high-stakes cutovers." }
11
11
  }
@@ -5,7 +5,7 @@ description: Build a business case for a build/buy/defer investment decision —
5
5
 
6
6
  # business-case
7
7
 
8
- Produces the document a sponsor can approve, challenge, or kill on its merits — because every benefit shows its arithmetic, every option includes the one nobody advocates for (doing nothing), and the case names the single assumption that flips the recommendation. Decides *whether to invest*; `tech-comparison-matrix` picks between technologies after, `prd-draft` captures requirements after, `exec-summary` compresses this doc for a board.
8
+ Produces the document a sponsor can approve, challenge, or kill on its merits — because every benefit shows its arithmetic, every option includes the one nobody advocates for (doing nothing), and the case names the single assumption that flips the recommendation. Decides *whether to invest*; picking between technologies comes after, `prd-draft` captures requirements after, `exec-summary` compresses this doc for a board.
9
9
 
10
10
  ## How to respond
11
11
 
@@ -49,7 +49,7 @@ Produces the document a sponsor can approve, challenge, or kill on its merits
49
49
  ## When NOT to use this skill
50
50
 
51
51
  - ❌ The investment decision is already made — go to `prd-draft`
52
- - ❌ Choosing between technologies for an approved initiative — `tech-comparison-matrix`
52
+ - ❌ Choosing between technologies for an approved initiative — the investment is already decided; compare the options directly
53
53
  - ❌ Compressing an existing case for execs — `exec-summary`
54
54
  - ❌ Trivial cost ("should we buy a $400/yr tool") — the case costs more than the decision; just decide
55
55
 
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "business-case",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Build a business case for a build/buy/defer investment decision — do-nothing always included as the baseline, benefits quantified as re-runnable calculations with confidence tags, full costs (build + run + opportunity), ranges instead of false precision, and the flip-assumption named. Use when the user needs to justify an investment, write a business case, compare build vs buy vs defer, or get budget/sponsor approval for an initiative.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },
7
7
  "env": { "required": [], "optional": [] },
8
- "related": ["exec-summary", "prd-draft", "tech-comparison-matrix"],
8
+ "related": ["exec-summary", "prd-draft"],
9
9
  "tags": ["business-case", "investment", "build-vs-buy", "roi", "cost-benefit", "decision"],
10
- "model": { "tier": "heavy", "rationale": "Weighted multi-option judgment with a committal recommendation — same failure mode as tech-comparison-matrix: cheaper models mis-weight costs, inflate benefits, and miss the flip-assumption. Never downgrade." }
10
+ "model": { "tier": "heavy", "rationale": "Weighted multi-option judgment with a committal recommendation: cheaper models mis-weight costs, inflate benefits, and miss the flip-assumption. Never downgrade." }
11
11
  }
@@ -5,7 +5,7 @@ description: Run a strategy framework — SWOT/TOWS, Porter's Five Forces, or PE
5
5
 
6
6
  # strategy-analysis
7
7
 
8
- Runs the classic strategy frameworks the way a good strategist does and a bad deck doesn't: the framework is chosen to fit the question, every cell carries evidence and an implication, and the output ends in ranked, committal so-whats — not a filled-in grid. The grid is the working, never the deliverable. Sibling of `tech-comparison-matrix` (tech selection between named options) and `business-case` (a costed invest/defer decision); this skill is for the strategic question *before* options are named.
8
+ Runs the classic strategy frameworks the way a good strategist does and a bad deck doesn't: the framework is chosen to fit the question, every cell carries evidence and an implication, and the output ends in ranked, committal so-whats — not a filled-in grid. The grid is the working, never the deliverable. Sibling of `business-case` (a costed invest/defer decision); this skill is for the strategic question *before* options are named.
9
9
 
10
10
  ## How to respond
11
11
 
@@ -36,7 +36,7 @@ Runs the classic strategy frameworks the way a good strategist does and a bad de
36
36
 
37
37
  4. **Rank the implications and commit.** End with **Implications, ranked** — 3–5 entries ordered by impact on the named decision, each an action-shaped sentence with an owner-shaped subject: ✅ *"Price the enterprise tier before Q3: supplier power is rising (🟥) and the S×O attack window closes when the incumbent's contract cycle renews"*. Then a one-paragraph **verdict** answering the user's actual question, taking a side, and naming what evidence would change it.
38
38
 
39
- 5. **Emit in one message**: evidence base (tag summary), the framework grid(s), ranked implications, verdict. Flag every `[assumption]` that appears in a top-3 implication — those are the validation targets. Hand off: options now named and comparable → `tech-comparison-matrix`; investment decision to cost → `business-case`; product direction to test → `prfaq`.
39
+ 5. **Emit in one message**: evidence base (tag summary), the framework grid(s), ranked implications, verdict. Flag every `[assumption]` that appears in a top-3 implication — those are the validation targets. Hand off: investment decision to cost → `business-case`; product direction to test → `prfaq`.
40
40
 
41
41
  ## Quality bar
42
42
 
@@ -56,7 +56,7 @@ Runs the classic strategy frameworks the way a good strategist does and a bad de
56
56
 
57
57
  ## When NOT to use this skill
58
58
 
59
- - ❌ Choosing between named technologies or vendors — `tech-comparison-matrix`
59
+ - ❌ Choosing between named technologies or vendors — the strategic question is already answered; compare the options directly
60
60
  - ❌ A costed build/buy/defer decision — `business-case`
61
61
  - ❌ Testing a specific product concept — `prfaq`
62
62
  - ❌ Quarterly goal-setting — `okr-cascade`
@@ -11,7 +11,7 @@
11
11
  "Implications section is ranked (3-5 entries) and each is action-shaped, tied to the two-quarter focus decision",
12
12
  "A verdict paragraph takes a side and names what evidence would change it",
13
13
  "Assumptions appearing in top-ranked implications are flagged as validation targets",
14
- "A hand-off to tech-comparison-matrix, business-case, or prfaq is offered where apt"
14
+ "A hand-off to business-case or prfaq is offered where apt"
15
15
  ]
16
16
  },
17
17
  {
@@ -1,13 +1,12 @@
1
1
  {
2
2
  "name": "strategy-analysis",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Run a strategy framework — SWOT/TOWS, Porter's Five Forces, or PESTLE — on a product, company, or market question, choosing the right framework for the question and forcing every cell to carry evidence and a so-what. Use when the user asks for a SWOT, a competitive/market analysis, \"should we enter this market\", \"what's our position against X\", or a macro-environment scan.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },
7
7
  "env": { "required": [], "optional": [] },
8
- "related": ["business-case", "okr-cascade", "prfaq", "tech-comparison-matrix"],
8
+ "related": ["business-case", "okr-cascade", "prfaq"],
9
9
  "handoff": [
10
- { "to": "tech-comparison-matrix", "when": "the options are named and need comparing on stated criteria", "purpose": "Score the named options against weighted criteria.", "fallback": "If tech-comparison-matrix is absent, build a plain criteria-by-option table inline and state the weights." },
11
10
  { "to": "business-case", "when": "the direction is chosen and needs costing before approval", "purpose": "Cost the chosen option against a do-nothing baseline.", "fallback": "If business-case is absent, state option 0 and the three cost layers (build, run, opportunity) inline." }
12
11
  ],
13
12
  "tags": ["strategy", "swot", "tows", "five-forces", "pestle", "competitive-analysis", "market-analysis"],
@@ -12,8 +12,8 @@ and keep the hypothesis with the **least evidence against it**. Evidence that fi
12
12
  hypothesis feels persuasive and proves nothing, so the matrix makes that visible. The output
13
13
  is a ranked matrix, the evidence the ranking rests on, and the next observation to make.
14
14
 
15
- This skill explains a past or current observation. To choose between options going forward,
16
- use `tech-comparison-matrix` (technology) or `strategy-analysis` (market position). To gather
15
+ This skill explains a past or current observation. It does not choose between options going
16
+ forward; for market position, use `strategy-analysis`. To gather
17
17
  the evidence in the first place, plan it with `research-plan` and summarise sources with
18
18
  `source-synthesis`.
19
19
 
@@ -121,7 +121,7 @@ generated per step 2 and tagged `[assumption]`. If the user supplied no evidence
121
121
 
122
122
  ## When NOT to use this skill
123
123
 
124
- - ❌ Choosing between technologies, vendors or approaches for the future — `tech-comparison-matrix`
124
+ - ❌ Choosing between technologies, vendors or approaches for the future — this ranks explanations, not options
125
125
  - ❌ Market or competitive position, SWOT, Five Forces — `strategy-analysis`
126
126
  - ❌ Planning what evidence to collect before you have any — `research-plan`
127
127
  - ❌ Summarising what a set of sources says — `source-synthesis`
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hypothesis-comparison",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Compare rival explanations for an observation with analysis of competing hypotheses (ACH) — list the hypotheses and the evidence, build a consistency matrix (consistent / inconsistent / neutral), rank hypotheses by how little evidence contradicts them rather than how much supports them, name the diagnostic evidence and the linchpins, and say which next observation would tell the leaders apart. Use when the user asks \"why did X happen\", \"which explanation fits the evidence\", \"what's really causing this\", wants to stop arguing over a favourite theory, or says \"compare these hypotheses\", \"competing explanations\", \"ACH\".",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -16,8 +16,7 @@
16
16
  "postmortem-generator",
17
17
  "research-plan",
18
18
  "source-synthesis",
19
- "strategy-analysis",
20
- "tech-comparison-matrix"
19
+ "strategy-analysis"
21
20
  ],
22
21
  "handoff": [
23
22
  {
@@ -106,7 +106,6 @@ budgets become tagged assumptions (default: two weeks, 15 hours).
106
106
  - ❌ Ranking rival explanations for something that already happened — `hypothesis-comparison`
107
107
  - ❌ Writing the interview scripts for stakeholders — `requirements-interview`
108
108
  - ❌ A strategy framework such as SWOT or Five Forces on a market — `strategy-analysis`
109
- - ❌ Comparing named technologies or vendors — `tech-comparison-matrix`
110
109
  - ❌ Turning a messy thread into a brief for another skill — `brief-intake`
111
110
 
112
111
  ## Anti-patterns to avoid
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "research-plan",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Turn a vague research question into a research plan — the decision the research serves, the precise question and sub-questions, what finding would change the decision, a method per sub-question (desk research, interviews, data pull, experiment), source types with inclusion and exclusion criteria, ready-to-run search strings, a stopping rule for when you have enough, and the deliverable. Starts by asking what decision the research is for. Use when the user says \"I need to research X\", \"help me scope this research\", \"how should I investigate…\", \"what should I look into before deciding…\", or wants a research or discovery plan.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -16,8 +16,7 @@
16
16
  "hypothesis-comparison",
17
17
  "requirements-interview",
18
18
  "source-synthesis",
19
- "strategy-analysis",
20
- "tech-comparison-matrix"
19
+ "strategy-analysis"
21
20
  ],
22
21
  "handoff": [
23
22
  {
@@ -123,7 +123,7 @@ derived from the task wording, no siblings checked, every tool targeted.
123
123
 
124
124
  ## When NOT to use this skill
125
125
 
126
- - ❌ Adding a skill to the skilldrop catalogue itself, with its manifest, pack and `validate.py` rules: use `contribution-wizard`
126
+ - ❌ Adding a skill to the skilldrop catalogue itself, with its manifest, pack and `validate.py` rules: follow that repo's `AGENTS.md` and run `python3 validate.py`
127
127
  - ❌ Auditing a skill that already exists: use `skill-review`
128
128
  - ❌ Adding evals to an existing skill without changing it: use `eval-harness-generator`
129
129
  - ❌ Repo-wide always-on rules for agents (commands, conventions, forbidden actions): use `agents-md-generator`
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skill-author",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Write a new portable Agent Skill (a SKILL.md folder) from a described task, for Claude Code, Codex, Copilot, Cursor, Kiro or Antigravity in any repo — a description that leads with the artifact and ends with trigger phrases, decisive steps, a quality bar, when and when-not sections naming near-miss siblings, anti-patterns, a non-interactive rule, reference files and scripts that work in every tool, acceptance evals and trigger queries, and the install path for each tool. Use when the user says \"turn this into a skill\", \"write a SKILL.md for…\", \"make an agent skill that…\", or wants a repeatable task packaged so their coding agent does it the same way every time.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -13,7 +13,6 @@
13
13
  },
14
14
  "related": [
15
15
  "agents-md-generator",
16
- "contribution-wizard",
17
16
  "eval-harness-generator",
18
17
  "skill-review"
19
18
  ],
@@ -115,7 +115,7 @@ against the skills named in the folder itself.
115
115
  ## When NOT to use this skill
116
116
 
117
117
  - ❌ Writing a new skill from a task description: use `skill-author`
118
- - ❌ Adding a skill to the skilldrop catalogue itself, which has its own manifest and `validate.py` rules: use `contribution-wizard`
118
+ - ❌ Adding a skill to the skilldrop catalogue itself, which has its own manifest and `validate.py` rules: follow that repo's `AGENTS.md` and run `python3 validate.py`
119
119
  - ❌ Generating more eval cases for a skill whose only gap is coverage: use `eval-harness-generator`
120
120
  - ❌ Reviewing a repo's always-on AGENTS.md policy file: use `agents-md-generator`
121
121
  - ❌ Threat-modelling the agent deployment that runs skills (its tools, data and egress): use `agent-threat-model`
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skill-review",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Audit an existing Agent Skill folder (SKILL.md plus its scripts, references and evals) for Claude Code, Codex, Copilot, Cursor, Kiro or Antigravity, and return a READY / FIX FIRST / REWRITE verdict with severity-tagged findings across five areas — whether a router would pick it and whether it collides with a sibling, portability, safety (mapped to the OWASP Agentic Skills Top 10), structure, and eval coverage — backed by a stdlib lint script for the mechanical checks. Use when the user says \"review this skill\", \"is my SKILL.md any good\", \"why doesn't my skill trigger\", \"is this skill safe to install\", or wants a skill checked before sharing or publishing it.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -14,7 +14,6 @@
14
14
  "related": [
15
15
  "agent-threat-model",
16
16
  "agents-md-generator",
17
- "contribution-wizard",
18
17
  "doc-critique",
19
18
  "eval-harness-generator",
20
19
  "skill-author"
@@ -55,7 +55,7 @@ Produces the contract *before* the code — a valid OpenAPI 3.1 document two tea
55
55
  ## When NOT to use this skill
56
56
 
57
57
  - ❌ Documenting an API that already exists — that's `guide-builder` (reference archetype)
58
- - ❌ Choosing REST vs GraphQL vs gRPC — that's `tech-comparison-matrix`; this skill starts after
58
+ - ❌ Choosing REST vs GraphQL vs gRPC — this skill starts after that choice is made
59
59
  - ❌ Reviewing a contract someone else drafted — `doc-critique` or `council-review`
60
60
  - ❌ Generating server/client code from the spec — hand the frozen contract to the codegen tool
61
61
 
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "api-contract-draft",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Draft an OpenAPI 3.1 contract from a feature brief or story — resource-oriented paths, a full error catalog (RFC 9457), pagination/idempotency/versioning decided not deferred, examples on every operation, plus a decisions log so review argues choices instead of YAML. Use when the user wants to design an API, draft an OpenAPI/Swagger spec, define request/response shapes, or agree a contract between frontend/backend or two teams before code.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },
7
7
  "env": { "required": [], "optional": [] },
8
- "related": ["council-review", "doc-critique", "guide-builder", "tech-comparison-matrix", "user-story-splitter"],
8
+ "related": ["council-review", "doc-critique", "guide-builder", "user-story-splitter"],
9
9
  "tags": ["api-design", "openapi", "contract-first", "rest", "swagger", "asyncapi"],
10
10
  "model": { "tier": "standard", "rationale": "Schema synthesis against fixed conventions. The resource modeling needs judgment; the conventions bound it. Escalate via ambiguous-input on contested multi-team contracts." }
11
11
  }
@@ -1,92 +0,0 @@
1
- ---
2
- name: metric-definition
3
- description: Write a metric spec precise enough for a semantic layer or dbt metric to implement and for two analysts to get the same number — name, business question, exact numerator and denominator, grain, time window and timezone, filters and exclusions (test accounts, refunds), allowed dimensions, edge cases (NULLs, late data, currency), owner, reference SQL, and the sanity checks that catch it going wrong. Use when the user says "define this metric", "how exactly do we calculate X", "finance and product get different numbers for X", "write the metric spec for our semantic layer", or "what counts as an active user".
4
- ---
5
-
6
- # metric-definition
7
-
8
- Turns a metric name that people already argue about ("active customers", "net revenue", "refund rate") into one written definition that produces one number. Most metric disputes are not about the data: they're two queries with different filters, windows or timezones answering under the same name. This skill pins every one of those choices down, writes the reference SQL, and adds the checks that catch the number drifting. It defines **how a metric is computed**. Choosing **which metric** judges a feature is `success-metrics`; that skill picks the primary, guardrails and decision rule, and this one makes any of those metrics exact.
9
-
10
- ## How to respond
11
-
12
- **Four rules come before the steps and outrank them:**
13
-
14
- - **Answer what was asked, first.** Open with the answer, the decision or the artifact, in plain words. Scores, matrices, frameworks and tags come after it, and anything that doesn't change the answer is cut.
15
- - **Use only what you were given.** Don't add facts, names, numbers, incidents, history, steps or sections the input doesn't contain. What you need and don't have is left out of the artifact and listed once at the end under "To confirm".
16
- - **Deliver from what you have.** When the request gives you something to work on, state your assumptions in a line and produce the result. When it gives you nothing to work on, ask for it in one or two plain sentences and say what you will do once you have it.
17
- - **Write for someone who has never heard of this skill.** No skill names, no paths or scripts from this folder, no internal terms, and nothing about how the run was set up. A next step is one plain sentence at the end that describes the work.
18
- - **For this skill:** Give one definition. Check the SQL against the warehouse the user named: each function against the column's type, and a calendar period against a rolling one. A parameter the user has to fill in is listed under "To confirm", not left in the query.
19
-
20
- 1. **Pin the question and the sources, asking once.** Ask at most 2 questions in one message: *"What decision does this number inform, and who reads it?"* and *"Which tables or models hold the data, and is there SQL or a dashboard already computing something under this name?"* Existing SQL is the best input you can get: it shows the definition people actually use today, including its bugs. If the user gave both, don't ask.
21
-
22
- **Non-interactive runs** (subagent, CI, headless): derive the business question and sources from the input and tag each `[assumption]`. Choices the input doesn't settle (timezone, exclusions, late-data policy) get a stated default tagged `[assumption]` and are listed under open decisions. No metric name and no business question in the input → emit `BLOCKED: need the metric name and the question it answers`.
23
-
24
- 2. **Name it so one name means one formula.** `snake_case`, noun phrase, qualified where variants exist: ✅ `net_revenue_usd`, `gross_revenue_usd` — ❌ `revenue` covering both. If two teams compute it differently and both versions are legitimate, they get two names, not one name with a footnote. State the business question in one sentence: ✅ *"What share of last month's orders were refunded, by region?"* — ❌ *"Track refunds."*
25
-
26
- 3. **Write the exact formula.** Numerator and denominator, each in words and as an aggregation over named columns: ✅ *"Numerator: count of distinct `order_id` with at least one non-reversed refund. Denominator: count of distinct `order_id` created in the window."* Name the metric type (count, sum, distinct count, ratio, average, percentile, cumulative), the unit and the display format (%, USD, decimals). A ratio is always **ratio of sums**, never an average of per-row or per-day ratios. See [`reference.md`](reference.md) for the types and their traps.
27
-
28
- 4. **Fix the grain and the time.** Write down:
29
- - **Entity**: what one unit is (order, customer, account, session).
30
- - **Time column**: which timestamp decides membership in a period (created, paid, shipped, event or load time) and why.
31
- - **Window**: calendar month, ISO week (Monday start), rolling 28 days, trailing 7 complete days.
32
- - **Timezone**: the reporting zone, with the IANA name, e.g. `America/New_York`, not "EST".
33
- - **Partial periods**: whether the current period is shown, and how it's marked.
34
- - **Additivity**: whether the metric can be summed across days, regions or segments. Distinct counts and ratios can't (four weekly active-user counts don't add up to monthly active users), so say how it rolls up: recompute from the base, don't sum.
35
-
36
- 5. **List every filter and exclusion with its predicate and reason.** Always ask about the usual suspects: test and internal accounts, refunds and cancellations, fraud, deleted or merged records, free or zero-value transactions, and staff discounts. ✅ *"Exclude test accounts: `NOT EXISTS (SELECT 1 FROM test_accounts t WHERE t.customer_id = o.customer_id)`. Reason: QA places real orders in production."* An exclusion without a predicate gets implemented three different ways.
37
-
38
- 6. **Name the dimensions it can be sliced by, and the ones it can't.** For each allowed dimension, give the source column, the join path and whether the join is one-to-one. A dimension that fans out (product category on order-level revenue, when an order has many categories) is either disallowed or comes with an allocation rule. Say which.
39
-
40
- 7. **Settle the edge cases explicitly.** NULLs in each column the formula uses (counted, excluded or defaulted), zero denominators (show NULL, not 0), late-arriving data (how many days a closed period may still change, and when it locks), currency (rate source and which date's rate), DST days, duplicates and replays, backfills, and timezone changes. Each gets a one-line rule, not a "be careful".
41
-
42
- 8. **Assign an owner and a change policy.** The owner is a role and a team (✅ *"Finance analytics lead"*), not "data team". Status: `draft` or `certified`. Changing the formula is a new version with a change log entry and a dated cutover, never a silent edit, because a silent edit breaks every trend line that crosses the change date.
43
-
44
- 9. **Write the reference SQL** in the user's dialect: one CTE per step (base population, exclusions, numerator, denominator), half-open time windows (`>= start AND < end`), boundaries converted to the reporting timezone, and `NULLIF` on the denominator. The reference SQL is the tie-breaker when the prose and an implementation disagree. Recommend the user runs `sql-review` on it before it's certified.
45
-
46
- 10. **Add the sanity checks** that would catch the metric being wrong, each runnable: reconciliation with a system of record (the finance ledger, the billing system), hard bounds (a rate stays within 0 to 1), additivity (regions sum to the total, for additive metrics only), join row counts (the base population's count doesn't change after dimension joins), a period-over-period alert threshold, and a hand-computed fixture of 5–10 rows with the expected answer.
47
-
48
- 11. **Emit with [`templates/metric-spec.md`](templates/metric-spec.md)** in one message, ending with **open decisions**: each choice made by default, with the person who should confirm it.
49
-
50
- ## Useful references in this skill
51
-
52
- - [`reference.md`](reference.md) — metric types and their traps, additivity rules, the exclusion and edge-case checklist, the sanity-check catalogue, and how the spec's fields map to a semantic layer (dbt MetricFlow and similar)
53
- - [`templates/metric-spec.md`](templates/metric-spec.md) — the spec skeleton
54
- - [`examples/refund-rate.md`](examples/refund-rate.md) — worked example: an order refund rate disputed between finance and support, defined end to end
55
-
56
- ## Quality bar
57
-
58
- - **One name, one formula.** The numerator and denominator are written as aggregations over named columns, so two analysts would write the same SQL.
59
- - **Grain, time column, window and timezone are all explicit**, with an IANA timezone name and a half-open window.
60
- - **Every exclusion has a predicate and a reason.** No "exclude test data" without the SQL for it.
61
- - **Additivity is stated**, with the roll-up rule for non-additive metrics.
62
- - **Every allowed dimension has a join path and its cardinality**, and fan-out dimensions are disallowed or carry an allocation rule.
63
- - **Edge cases get one-line rules**, including late data with a lock date and zero denominators.
64
- - **The reference SQL runs as written** in the named dialect and matches the prose.
65
- - **At least three runnable sanity checks**, including one reconciliation with a system of record where one exists.
66
- - **Nothing is invented.** Table names, columns and business rules not given are marked `[assumption]` and listed in open decisions.
67
-
68
- ## When to use this skill
69
-
70
- - ✅ Two teams report different numbers under the same metric name
71
- - ✅ Putting a metric into a semantic layer, dbt metrics or a BI tool's model, and it needs one definition
72
- - ✅ "What counts as an active user / a churned customer / net revenue?"
73
- - ✅ Certifying a metric before it goes on an exec dashboard or into a board pack
74
-
75
- ## When NOT to use this skill
76
-
77
- - ❌ Choosing which metric judges a feature, with targets, guardrails and a decision rule — that's `success-metrics`
78
- - ❌ Checking that an existing query computes its number correctly — that's `sql-review`
79
- - ❌ Deciding which charts and metrics go on a dashboard — that's `dashboard-spec`
80
- - ❌ Agreeing a dataset's schema, freshness and quality guarantees with its consumers — that's `data-contract`
81
- - ❌ Service health indicators, SLOs and error budgets — that's `observability-plan`
82
-
83
- ## Anti-patterns to avoid
84
-
85
- - ❌ **The footnoted metric.** One name, three formulas, and a footnote on each dashboard. Split it into named variants.
86
- - ❌ **Average of ratios.** `AVG(daily_refund_rate)` weights a quiet Sunday like Black Friday. Divide the sums.
87
- - ❌ **"Monthly" with no timezone.** The UTC month and the New York month differ by hours of orders at each boundary, and the number won't match finance's.
88
- - ❌ **Summing distinct counts.** Adding weekly active users to get monthly active users counts every returning user four times.
89
- - ❌ **Exclusions in prose only.** "Excludes test accounts" with no predicate gets implemented three different ways.
90
- - ❌ **Silent redefinition.** Changing the formula in place, so last quarter's trend line now compares two different metrics.
91
- - ❌ **No owner.** A metric "owned by the data team" is owned by nobody when finance and product disagree about it.
92
- - ❌ **Specs with no checks.** A definition that nobody tests drifts the first time an upstream table changes.
@@ -1,34 +0,0 @@
1
- [
2
- {
3
- "query": "Define exactly how we calculate monthly active users so every dashboard agrees",
4
- "should_trigger": true
5
- },
6
- {
7
- "query": "Finance and product get different churn numbers. Write one definition with the SQL",
8
- "should_trigger": true
9
- },
10
- {
11
- "query": "Write the metric spec for net revenue for our dbt semantic layer",
12
- "should_trigger": true
13
- },
14
- {
15
- "query": "What should count as an active customer? Test accounts, refunds, timezone, all of it",
16
- "should_trigger": true
17
- },
18
- {
19
- "query": "How will we know the new onboarding flow worked? Pick the KPIs and targets",
20
- "should_trigger": false
21
- },
22
- {
23
- "query": "Write a data contract for the events table other teams consume",
24
- "should_trigger": false
25
- },
26
- {
27
- "query": "Set SLOs and error budgets for the checkout API",
28
- "should_trigger": false
29
- },
30
- {
31
- "query": "Spec the executive sales dashboard before the BI team builds it",
32
- "should_trigger": false
33
- }
34
- ]