skilldrop-cli 0.16.12 → 0.16.14
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.
- package/bin/skilldrop.js +36 -11
- package/catalogue.json +8 -6
- package/contracts/catalogue.schema.json +15 -1
- package/model-routing.json +1 -17
- package/package.json +1 -1
- package/packs/ai-engineering/skills/ai-readiness-assessment/SKILL.md +1 -1
- package/packs/ai-engineering/skills/ai-readiness-assessment/manifest.json +2 -3
- package/packs/ai-engineering/skills/llm-eval-harness/SKILL.md +1 -1
- package/packs/ai-engineering/skills/llm-eval-harness/manifest.json +2 -2
- package/packs/api-builder/pack.json +1 -1
- package/packs/api-builder/skills/eval-harness-generator/SKILL.md +1 -1
- package/packs/api-builder/skills/eval-harness-generator/manifest.json +2 -2
- package/packs/api-builder/skills/tool-use-schema-writer/SKILL.md +3 -3
- package/packs/api-builder/skills/tool-use-schema-writer/evals/evals.json +1 -1
- package/packs/api-builder/skills/tool-use-schema-writer/manifest.json +2 -2
- package/packs/core/skills/brief-intake/SKILL.md +2 -2
- package/packs/core/skills/brief-intake/manifest.json +3 -3
- package/packs/core/skills/brief-intake/templates/brief-tech-comparison.md +1 -1
- package/packs/core/skills/council-review/SKILL.md +2 -2
- package/packs/core/skills/council-review/manifest.json +2 -2
- package/packs/core/skills/council-review/reference.md +0 -1
- package/packs/core/skills/doc-critique/SKILL.md +1 -1
- package/packs/core/skills/doc-critique/manifest.json +2 -2
- package/packs/core/skills/doc-critique/rubrics/tech-comparison.md +1 -1
- package/packs/data-analytics/pack.json +8 -14
- package/packs/data-analytics/skills/dashboard-spec/SKILL.md +2 -2
- package/packs/data-analytics/skills/dashboard-spec/examples/support-staffing.md +1 -1
- package/packs/data-analytics/skills/dashboard-spec/manifest.json +1 -10
- package/packs/data-analytics/skills/dashboard-spec/templates/dashboard-spec.md +1 -1
- package/packs/data-analytics/skills/sql-review/SKILL.md +2 -2
- package/packs/data-analytics/skills/sql-review/manifest.json +1 -11
- package/packs/dev-team/skills/migration-plan/SKILL.md +1 -1
- package/packs/dev-team/skills/migration-plan/manifest.json +2 -2
- package/packs/product-manager/skills/business-case/SKILL.md +2 -2
- package/packs/product-manager/skills/business-case/manifest.json +3 -3
- package/packs/product-manager/skills/strategy-analysis/SKILL.md +3 -3
- package/packs/product-manager/skills/strategy-analysis/evals/evals.json +1 -1
- package/packs/product-manager/skills/strategy-analysis/manifest.json +2 -3
- package/packs/research/pack.json +2 -2
- package/packs/research/skills/hypothesis-comparison/SKILL.md +3 -3
- package/packs/research/skills/hypothesis-comparison/manifest.json +2 -3
- package/packs/research/skills/research-plan/SKILL.md +0 -1
- package/packs/research/skills/research-plan/manifest.json +2 -3
- package/packs/research/skills/source-synthesis/SKILL.md +103 -100
- package/packs/research/skills/source-synthesis/evals/evals.json +28 -0
- package/packs/research/skills/source-synthesis/evals/files/6/client-survey-summary.md +15 -0
- package/packs/research/skills/source-synthesis/evals/files/6/fenwick-lane-call-notes.txt +10 -0
- package/packs/research/skills/source-synthesis/evals/files/6/finance-email.txt +21 -0
- package/packs/research/skills/source-synthesis/evals/files/6/practice-ledger-article.md +13 -0
- package/packs/research/skills/source-synthesis/evals/files/6/wcapa-benchmarking-extract.md +12 -0
- package/packs/research/skills/source-synthesis/manifest.json +3 -3
- package/packs/skill-engineering/skills/skill-author/SKILL.md +1 -1
- package/packs/skill-engineering/skills/skill-author/manifest.json +1 -2
- package/packs/skill-engineering/skills/skill-review/SKILL.md +1 -1
- package/packs/skill-engineering/skills/skill-review/manifest.json +1 -2
- package/packs/solution-architect/skills/api-contract-draft/SKILL.md +1 -1
- package/packs/solution-architect/skills/api-contract-draft/manifest.json +2 -2
- package/packs/data-analytics/skills/metric-definition/SKILL.md +0 -92
- package/packs/data-analytics/skills/metric-definition/evals/eval_queries.json +0 -34
- package/packs/data-analytics/skills/metric-definition/evals/evals.json +0 -79
- package/packs/data-analytics/skills/metric-definition/evals/files/2/tables.md +0 -42
- package/packs/data-analytics/skills/metric-definition/evals/files/2/thread.md +0 -40
- package/packs/data-analytics/skills/metric-definition/evals/files/4/tables.md +0 -32
- package/packs/data-analytics/skills/metric-definition/evals/files/4/thread.md +0 -31
- package/packs/data-analytics/skills/metric-definition/examples/refund-rate.md +0 -104
- package/packs/data-analytics/skills/metric-definition/manifest.json +0 -41
- package/packs/data-analytics/skills/metric-definition/reference.md +0 -67
- package/packs/data-analytics/skills/metric-definition/templates/metric-spec.md +0 -70
- package/packs/dev-team/skills/contribution-wizard/SKILL.md +0 -142
- package/packs/dev-team/skills/contribution-wizard/evals/eval_queries.json +0 -30
- package/packs/dev-team/skills/contribution-wizard/evals/evals.json +0 -78
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/AGENTS.md +0 -9
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/CATALOG.md +0 -18
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/CONTRIBUTING.md +0 -45
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/OWNERS.md +0 -7
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/detention-claim-letter/INSTRUCTIONS.md +0 -20
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/detention-claim-letter/skill.yaml +0 -11
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/detention-claim-letter/tests/cases.yaml +0 -25
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/rate-con-extractor/INSTRUCTIONS.md +0 -20
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/rate-con-extractor/skill.yaml +0 -8
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/rate-con-extractor/tests/cases.yaml +0 -32
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/CONTRIBUTING.md +0 -63
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/registry.json +0 -15
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/PROMPT.md +0 -10
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/01-expected.md +0 -2
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/01-input.md +0 -3
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/02-expected.md +0 -1
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/02-input.md +0 -2
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/03-expected.md +0 -1
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/03-input.md +0 -2
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/meta.json +0 -7
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/PROMPT.md +0 -11
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/01-expected.md +0 -4
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/01-input.md +0 -4
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/02-expected.md +0 -6
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/02-input.md +0 -2
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/03-expected.md +0 -1
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/03-input.md +0 -1
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/skill.toml +0 -6
- package/packs/dev-team/skills/contribution-wizard/manifest.json +0 -11
- package/packs/solution-architect/skills/db-schema-design/SKILL.md +0 -76
- package/packs/solution-architect/skills/db-schema-design/evals/eval_queries.json +0 -34
- package/packs/solution-architect/skills/db-schema-design/evals/evals.json +0 -75
- package/packs/solution-architect/skills/db-schema-design/evals/files/2/current_tables.sql +0 -29
- package/packs/solution-architect/skills/db-schema-design/evals/files/2/notes.md +0 -53
- package/packs/solution-architect/skills/db-schema-design/evals/files/4/finance-email.md +0 -18
- package/packs/solution-architect/skills/db-schema-design/evals/files/4/members_sample.csv +0 -5
- package/packs/solution-architect/skills/db-schema-design/evals/files/4/points_txn_sample.csv +0 -17
- package/packs/solution-architect/skills/db-schema-design/evals/files/4/requirements.md +0 -28
- package/packs/solution-architect/skills/db-schema-design/manifest.json +0 -11
- package/packs/solution-architect/skills/db-schema-design/reference.md +0 -56
- package/packs/solution-architect/skills/db-schema-design/templates/schema-design.md +0 -75
- package/packs/solution-architect/skills/tech-comparison-matrix/SKILL.md +0 -64
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/eval_queries.json +0 -30
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/evals.json +0 -76
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/files/2/requirements.md +0 -20
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/files/2/vendor-notes.md +0 -29
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/files/4/mobile-options.md +0 -45
- package/packs/solution-architect/skills/tech-comparison-matrix/examples/queue-selection.md +0 -41
- package/packs/solution-architect/skills/tech-comparison-matrix/manifest.json +0 -11
- package/packs/solution-architect/skills/tech-comparison-matrix/templates/matrix.md +0 -45
|
@@ -1,115 +1,112 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: source-synthesis
|
|
3
|
-
description:
|
|
3
|
+
description: Answer a question from a set of sources the user supplied — papers, reports, articles, interview notes, emails — saying only what the material supports, labelling anything that comes from elsewhere where it appears, counting a source that repeats another once, and giving a labelled estimate when the user needs a figure the sources don't settle. Written in the length and format the user asked for; a full cited literature review only when that is the ask. Use when the user hands over several sources and asks to "synthesise these", "what do these papers say", "pull together what we know", "literature review", or "where do the sources agree and disagree".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# source-synthesis
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
**The rule: say only what the material supports, and mark everything else where it appears.**
|
|
9
|
+
The user handed over sources because they want to know what *those* say. A plausible fact from
|
|
10
|
+
memory, a rule you happen to know about, a price range that sounds right: each one
|
|
11
|
+
reads exactly like a finding, and the user can't tell it apart. The agent's habit is to fill
|
|
12
|
+
gaps helpfully. This skill's job is to keep the line between "the sources say" and "I'm adding"
|
|
13
|
+
visible in every sentence.
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
Two things follow from the rule:
|
|
16
|
+
|
|
17
|
+
- **A source that repeats another is one source.** An article quoting a survey's figure, an
|
|
18
|
+
email forwarding a report, three people retelling the same story: trace each figure to where
|
|
19
|
+
it started and count that origin once. Agreement between echoes is not agreement.
|
|
20
|
+
- **Hearsay and half-memories are reported as what they are.** "A neighbour said it was about half
|
|
21
|
+
price" is something someone said, not a data point, and an undated clipping is undated.
|
|
18
22
|
|
|
19
23
|
## How to respond
|
|
20
24
|
|
|
21
|
-
**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
`BLOCKED: need the sources' text, not titles or links`. A missing question becomes
|
|
88
|
-
`[assumption] The question is: …`, inferred from the sources and stated at the top.
|
|
89
|
-
|
|
90
|
-
## Useful references in this skill
|
|
91
|
-
|
|
92
|
-
- [`reference.md`](reference.md) — citation format, evidence-strength criteria, how to handle disagreement, independence, and common distortions
|
|
93
|
-
- [`templates/synthesis.md`](templates/synthesis.md) — the synthesis skeleton
|
|
94
|
-
- [`scripts/citations.py`](scripts/citations.py) — checks that every citation resolves and every claim is cited (stdlib only)
|
|
95
|
-
- [`examples/four-day-week.md`](examples/four-day-week.md) — worked example: four sources on a four-day-week pilot, the synthesis, and the checker's real output on a first draft and the fixed draft
|
|
25
|
+
1. **Answer the question first, in the user's terms.** The opening lines say what the material
|
|
26
|
+
supports on the question they asked, organised around the decision in front of them (the
|
|
27
|
+
options on the table, the yes/no, the number they need). Not source by source.
|
|
28
|
+
|
|
29
|
+
2. **Fit the size and format they asked for.** "Half a page", "a few bullets for the meeting",
|
|
30
|
+
"two pages for the board pack", a chat answer: that is the format. Name sources in plain
|
|
31
|
+
words where a claim comes from them ("the pilot report", "the team lead's interview",
|
|
32
|
+
"the manager survey"), so a reader can check it. Use bracketed citations with locations, a source
|
|
33
|
+
register or strength ratings only when the user asked for a literature review or an
|
|
34
|
+
evidence summary with citations (see **A cited literature review** below).
|
|
35
|
+
|
|
36
|
+
3. **Check the sources before you trust them.**
|
|
37
|
+
- Add up every total, percentage and per-unit figure a source gives from its own parts, and
|
|
38
|
+
say plainly when one doesn't match ("the report says 60 staff took part; its team table adds
|
|
39
|
+
to 54").
|
|
40
|
+
- Where sources disagree on a number, show both, and give the reason they might differ when
|
|
41
|
+
the sources show one: a different population, period, size or definition. Say which one
|
|
42
|
+
fits the user's situation better and why. Don't average them.
|
|
43
|
+
- Keep each source's hedges. "Associated with" stays "associated with"; "about a third"
|
|
44
|
+
stays approximate, and a change that happened alongside another change is not put down to
|
|
45
|
+
either one.
|
|
46
|
+
|
|
47
|
+
4. **When they need a figure the sources don't settle, estimate it and label it.** A cost, a
|
|
48
|
+
break-even point, a likely uptake: work it out from what the sources give, show the
|
|
49
|
+
sum, and give the range the uncertain inputs produce. If an input has to come from outside
|
|
50
|
+
the material, write it into the sentence as yours ("assuming 21 working days a month,
|
|
51
|
+
which none of the sources gives"), never as a finding. End with the one or
|
|
52
|
+
two facts that would settle it. "The sources can't say" on its own is not an answer.
|
|
53
|
+
|
|
54
|
+
5. **Say what the material doesn't cover, once, briefly.** The gaps that matter for the
|
|
55
|
+
decision, as plain statements at the end: ✅ *"None of the sources measures effects beyond
|
|
56
|
+
six months."* Not a list of everything a perfect study
|
|
57
|
+
would have measured.
|
|
58
|
+
|
|
59
|
+
6. **Deliver from what you have.** If you have the sources' text and the question, write the
|
|
60
|
+
answer, stating in one line any assumption about what they want. Ask first only when there
|
|
61
|
+
is nothing to work from: titles or links you can't open, or no sources at all. Then ask for
|
|
62
|
+
the text in one or two plain sentences. Don't summarise a paper from its title or from
|
|
63
|
+
memory.
|
|
64
|
+
|
|
65
|
+
7. **Keep the machinery out of the reply.** No skill names, no paths or scripts, no "checks
|
|
66
|
+
passed", no notes about how the run was set up. The reply carries the answer. A file is
|
|
67
|
+
saved only when the user asked for one, and it is the answer itself, nothing beside it.
|
|
68
|
+
|
|
69
|
+
## A cited literature review
|
|
70
|
+
|
|
71
|
+
When the user asks for a literature review, an evidence summary with citations, or findings
|
|
72
|
+
"every claim cited", produce the full form: a source register, findings grouped by theme with
|
|
73
|
+
`[S1:p4]` citations to a location, agreement and disagreement named source by source, an
|
|
74
|
+
evidence-strength rating with its criteria, and the gaps. Citation format, strength criteria
|
|
75
|
+
and how to handle disagreement are in [`reference.md`](reference.md); the skeleton is
|
|
76
|
+
[`templates/synthesis.md`](templates/synthesis.md); a worked example is
|
|
77
|
+
[`examples/four-day-week.md`](examples/four-day-week.md).
|
|
78
|
+
|
|
79
|
+
Before you hand it over, run the citation checker on the saved draft and fix what it reports:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# Claude Code
|
|
83
|
+
python3 "${CLAUDE_SKILL_DIR}/scripts/citations.py" synthesis.md
|
|
84
|
+
# Other IDEs (from the skill folder)
|
|
85
|
+
python3 scripts/citations.py synthesis.md
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
It reports citations that don't resolve, claims with no citation, citations with no location
|
|
89
|
+
and sources never cited. It is your check, not part of the deliverable: don't save its report
|
|
90
|
+
for the user or mention that it passed.
|
|
96
91
|
|
|
97
92
|
## Quality bar
|
|
98
93
|
|
|
99
|
-
- **
|
|
100
|
-
|
|
101
|
-
- **
|
|
102
|
-
- **
|
|
103
|
-
- **
|
|
104
|
-
- **
|
|
105
|
-
|
|
94
|
+
- **Nothing reads as coming from the sources that doesn't.** Every outside input is marked as
|
|
95
|
+
outside in the sentence where it appears; no gap is filled from memory.
|
|
96
|
+
- **Echoes are counted once.** A figure repeated by a second source is traced to its origin.
|
|
97
|
+
- **The sources' own sums are checked,** and any that don't add up are named.
|
|
98
|
+
- **The answer opens the reply and fits the requested size and format.**
|
|
99
|
+
- **A needed figure gets a worked, labelled estimate** with its range and what would settle it,
|
|
100
|
+
not a refusal.
|
|
101
|
+
- **Findings are no stronger than their sources.** Hedges, approximations and confounds
|
|
102
|
+
survive; hearsay stays hearsay.
|
|
106
103
|
|
|
107
104
|
## When to use this skill
|
|
108
105
|
|
|
106
|
+
- ✅ "Here's everything I've collected — what do we actually know?"
|
|
109
107
|
- ✅ "Synthesise these six papers / reports / articles on X"
|
|
110
|
-
- ✅ Turning
|
|
108
|
+
- ✅ Turning interview notes or transcripts into what they show, with the disagreements kept
|
|
111
109
|
- ✅ A literature review or evidence summary for a decision
|
|
112
|
-
- ✅ Checking where a set of analyst reports agree and where they don't
|
|
113
110
|
|
|
114
111
|
## When NOT to use this skill
|
|
115
112
|
|
|
@@ -122,10 +119,16 @@ a brief for another skill rather than findings, use `brief-intake`.
|
|
|
122
119
|
|
|
123
120
|
## Anti-patterns to avoid
|
|
124
121
|
|
|
125
|
-
- ❌ **
|
|
126
|
-
|
|
127
|
-
- ❌ **
|
|
122
|
+
- ❌ **The helpful outside fact.** A regulation's threshold, a typical salary, an industry
|
|
123
|
+
norm, written as if a source said it. Label it in the sentence, or leave it out.
|
|
124
|
+
- ❌ **Counting echoes.** "Two sources agree on 63%" when the second one is quoting the first.
|
|
125
|
+
- ❌ **Stopping at "the sources can't say".** The user asked a practical question; show the
|
|
126
|
+
sum with labelled assumptions and what would settle it.
|
|
127
|
+
- ❌ **A research report for a meeting note.** Source registers, strength tables and
|
|
128
|
+
bracketed citations on a request for five bullets.
|
|
129
|
+
- ❌ **Source-by-source summaries.** "S1 says…, S2 says…" is a list, not an answer. Organise by
|
|
130
|
+
the decision.
|
|
131
|
+
- ❌ **Taking a source's total on trust.** Add it up.
|
|
128
132
|
- ❌ **Promoting hedges.** "May be associated with" becomes "drives" by the second paragraph.
|
|
129
|
-
- ❌ **
|
|
130
|
-
|
|
131
|
-
- ❌ **Citing a title you haven't read.** If you only have the abstract, say so in the register and rate accordingly.
|
|
133
|
+
- ❌ **Machinery in the reply.** "Citations all pass", file names of working drafts, the
|
|
134
|
+
skill's own vocabulary.
|
|
@@ -74,6 +74,34 @@
|
|
|
74
74
|
"It gives the up-front gap as about £10,100 (£14,200 against about £4,100)",
|
|
75
75
|
"It does not add energy prices, grant scheme rules or typical heat pump costs from outside the notes, unless clearly labelled as not coming from the notes"
|
|
76
76
|
]
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"id": 6,
|
|
80
|
+
"held_out": "2026-10-17",
|
|
81
|
+
"prompt": "I'm the practice manager at Brackenmoor Veterinary Practice. We have three vets. The partners decide on Thursday whether to start opening on Saturday mornings, and they've asked me one question: would a Saturday morning clinic cover its own staffing cost in its first year? I've put five things in this folder: client-survey-summary.md, wcapa-benchmarking-extract.md, practice-ledger-article.md, fenwick-lane-call-notes.txt and finance-email.txt. Go by what these say. The partners want a straight answer and a number they can argue about, not a literature review, so keep it to one page at most. I'm in theatre all day and can't answer questions, so just write it up.",
|
|
82
|
+
"assertions": [
|
|
83
|
+
"It answers the question directly: on the evidence in the files, a Saturday clinic probably would not cover its staffing cost across the first year, because the 14-a-session benchmark clears the break-even but the closer comparison (Fenwick Lane, 4 vets) ran at 8 to 9 a session for six months and only reached about 12 by month ten",
|
|
84
|
+
"It works out a break-even of roughly 11 to 12 appointments a session from the finance email (£640 to £680 a session divided by £58 contribution per appointment), or an equivalent comparison of contribution against cost",
|
|
85
|
+
"It treats the Practice Ledger's 14-a-session figure as a repeat of the WCAPA report, not as a second source confirming it",
|
|
86
|
+
"It points out that the WCAPA figure and Fenwick Lane's figures disagree and gives a reason to weigh them differently, such as the WCAPA practices being larger (median 7 vets, with larger practices reporting higher numbers) than Brackenmoor",
|
|
87
|
+
"It flags that the finance email's £680 a session does not match its own line items, which add up to £640, rather than silently using one of the two",
|
|
88
|
+
"Any first-year figure the files do not give directly is labelled as an estimate, and it says what would settle the question, such as finding out whether Saturday bookings would be new visits or moved from weekdays, which neither the survey nor Fenwick Lane measured",
|
|
89
|
+
"It does not invent figures that are not in the files, such as a share of Saturday visits moved from weekdays, a ratio of survey intent to actual bookings, or Saturday pay rates, and it fits on about one page without stopping to ask questions"
|
|
90
|
+
]
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": 7,
|
|
94
|
+
"held_out": "2026-10-17",
|
|
95
|
+
"prompt": "I'm secretary of the Hollins Green Amateur Dramatic Society, which is a fancy name for twenty-odd of us who put on a panto every January. The committee wants to know if we should move it from St Aldric's church hall to the primary school hall, because someone thinks we'd sell more tickets. I'm not a numbers person and this is all I've got, scribbled down:\n\n1. Bev from the Oakhurst Players told me at the summer fete they moved to their school hall and \"sold out every night\". I think she said 180 seats? Might have been 150.\n\n2. A clipping from the Linden Vale Gazette, no date on it, Mum cut it out ages ago: \"Linden Vale Players' panto raises £2,300 for hall roof fund ... an audience of nearly 600 across four nights.\"\n\n3. Chatted to Mr Pruett, the school caretaker. He said the hall seats 220 \"with the stage in\" but the fire officer's limit might be lower, he wasn't sure. Hire is £45 an hour. Or was it £45 a session? I didn't write it down properly.\n\n4. Our own panto last January at St Aldric's: three nights, roughly 110 a night I think, tickets £8. I'm fairly sure we turned people away on the Saturday.\n\nCould you give me a few bullet points I can read out at Tuesday's committee meeting? Five or six at most, please, nothing long.",
|
|
96
|
+
"assertions": [
|
|
97
|
+
"It does not give a firm yes: it says the notes cannot show whether moving would sell more tickets, and that the best evidence for extra demand is the society's own report of turning people away on the Saturday",
|
|
98
|
+
"It names the things to check before deciding, including the school hall's actual permitted capacity (220 or the possibly lower fire limit) and whether the £45 is per hour or per session",
|
|
99
|
+
"It treats Bev's \"sold out every night\" and the 150-or-180 seat figure as second-hand and uncertain, not as established fact",
|
|
100
|
+
"It does not use the undated Linden Vale clipping as evidence that moving venue raises sales, since the clipping says nothing about a venue change or when it happened",
|
|
101
|
+
"Any figure it gives for extra tickets, takings or hire cost is clearly labelled as a rough estimate and, for hire cost, shows that it depends on whether the £45 is per hour or per session",
|
|
102
|
+
"It does not invent facts that are not in the notes, such as fire regulations, typical panto audiences, or details about the Oakhurst or Linden Vale groups beyond what is written",
|
|
103
|
+
"It stays within six bullet points, short enough to read out, and delivers them without stopping to ask questions first"
|
|
104
|
+
]
|
|
77
105
|
}
|
|
78
106
|
]
|
|
79
107
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Brackenmoor Veterinary Practice: client survey on opening hours
|
|
2
|
+
|
|
3
|
+
Run by reception, March 2026. Emailed to 2,950 active clients; 412 replied (14%).
|
|
4
|
+
|
|
5
|
+
**Question: "If we offered appointments on Saturday mornings (9am to 1pm), would you use them?"**
|
|
6
|
+
|
|
7
|
+
| Answer | Share of replies |
|
|
8
|
+
|---|---|
|
|
9
|
+
| Definitely | 38% |
|
|
10
|
+
| Probably | 27% |
|
|
11
|
+
| Unlikely or no | 35% |
|
|
12
|
+
|
|
13
|
+
Free-text comments mostly mentioned work hours ("I can never get there before 6") and vaccination boosters.
|
|
14
|
+
|
|
15
|
+
Note from reception: we did not ask whether people would use a Saturday slot instead of a weekday visit or as well as one, or how often they would come. The survey went to clients with an email address on file, so older clients are probably under-represented.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
Call with Tom Ashdown, practice manager, Fenwick Lane Vets (4 vets, edge of town, about 20 min from us)
|
|
2
|
+
My notes, 9 Oct 2026
|
|
3
|
+
|
|
4
|
+
- They started Saturday mornings 9-1 about eleven months ago.
|
|
5
|
+
- First six months were slow: "eight or nine appointments a session, some weeks fewer".
|
|
6
|
+
- Picked up after that. By month ten they were at about twelve a session. Now month eleven, similar.
|
|
7
|
+
- Staffing cost per Saturday about £740. That includes paying a locum vet at a premium, because their own vets would not cover weekends at first.
|
|
8
|
+
- He thinks it will pay for itself in year two but "not this year, honestly".
|
|
9
|
+
- Most Saturday bookings are vaccinations and minor stuff, not surgery.
|
|
10
|
+
- He said he hasn't looked at whether Saturday clients are new or people who'd have come in on a weekday anyway.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
From: Dana Whitcombe (Finance Lead, Brackenmoor Veterinary Practice)
|
|
2
|
+
To: Practice Manager
|
|
3
|
+
Subject: Re: Saturday numbers
|
|
4
|
+
Date: 13 Oct 2026
|
|
5
|
+
|
|
6
|
+
Hi,
|
|
7
|
+
|
|
8
|
+
Quick numbers for the Saturday question.
|
|
9
|
+
|
|
10
|
+
Average contribution per appointment, after drugs and consumables, comes out at £58 on last year's figures. That's across all appointment types.
|
|
11
|
+
|
|
12
|
+
Saturday staffing at our own rates, if we cover it ourselves with no locum:
|
|
13
|
+
- Vet: £360
|
|
14
|
+
- Nurse: £170
|
|
15
|
+
- Receptionist: £110
|
|
16
|
+
|
|
17
|
+
So £680 a session.
|
|
18
|
+
|
|
19
|
+
Call it 50 Saturdays a year once you take out the bank holiday weekends.
|
|
20
|
+
|
|
21
|
+
Dana
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# The Practice Ledger, May 2026
|
|
2
|
+
|
|
3
|
+
## Is it time to open on Saturdays?
|
|
4
|
+
|
|
5
|
+
*By our staff writer*
|
|
6
|
+
|
|
7
|
+
Clients' working lives have changed, and more practices are asking whether a Saturday morning clinic would pay its way.
|
|
8
|
+
|
|
9
|
+
Practices that open on Saturday mornings see an average of 14 appointments per session in their first year, according to the WCAPA 2025 Benchmarking Report. That is encouraging news for any practice weighing up the move.
|
|
10
|
+
|
|
11
|
+
Saturday opening is quickly becoming something clients expect rather than a bonus, and practices that hold back risk losing younger pet owners to competitors who open at weekends.
|
|
12
|
+
|
|
13
|
+
For practices thinking about it, the advice is to start with a trial and to talk to the team early about rotas.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Westbourne Companion Animal Practice Association (WCAPA)
|
|
2
|
+
## Benchmarking Report 2025, extract: Section 4, Extended hours
|
|
3
|
+
|
|
4
|
+
Sample: 41 member practices that returned the extended-hours questionnaire. Median practice size 7 full-time-equivalent vets (range 3 to 16).
|
|
5
|
+
|
|
6
|
+
Of these, 17 practices introduced Saturday morning opening between 2022 and 2024.
|
|
7
|
+
|
|
8
|
+
Practices that open on Saturday mornings see an average of 14 appointments per session in their first year. The range across practices was 6 to 23 appointments per session. Larger practices and those in town centres reported the higher figures.
|
|
9
|
+
|
|
10
|
+
Average staffing cost per Saturday morning session, as reported by practices: £610.
|
|
11
|
+
|
|
12
|
+
Figures are self-reported by practices and have not been audited.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "source-synthesis",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Answer a question from a set of sources the user supplied — papers, reports, articles, interview notes, emails — saying only what the material supports, labelling anything that comes from elsewhere where it appears, counting a source that repeats another once, and giving a labelled estimate when the user needs a figure the sources don't settle. Written in the length and format the user asked for; a full cited literature review only when that is the ask. Use when the user hands over several sources and asks to \"synthesise these\", \"what do these papers say\", \"pull together what we know\", \"literature review\", or \"where do the sources agree and disagree\".",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
7
7
|
"npm": [],
|
|
@@ -37,6 +37,6 @@
|
|
|
37
37
|
"permissions": {"network": [], "commands": [], "files": "named-paths"},
|
|
38
38
|
"model": {
|
|
39
39
|
"tier": "standard",
|
|
40
|
-
"rationale": "Bounded synthesis over supplied text
|
|
40
|
+
"rationale": "Bounded synthesis over supplied text. The hard part is keeping outside knowledge out and checking the sources' own sums, which a mid-tier model does when told to."
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -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:
|
|
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.
|
|
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:
|
|
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.
|
|
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 —
|
|
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.
|
|
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", "
|
|
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.
|