skilldrop-cli 0.16.13 → 0.16.15
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/package.json +1 -1
- package/packs/dev-team/loops/release/LOOP.md +2 -2
- package/packs/dev-team/loops/release/loop.json +1 -1
- package/packs/dev-team/skills/release-notes/SKILL.md +72 -45
- package/packs/dev-team/skills/release-notes/evals/evals.json +33 -5
- package/packs/dev-team/skills/release-notes/evals/files/6/git-log.txt +136 -0
- package/packs/dev-team/skills/release-notes/manifest.json +3 -3
- package/packs/research/pack.json +2 -2
- 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/dev-team/skills/release-notes/templates/release-notes.md +0 -83
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skilldrop-cli",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.15",
|
|
4
4
|
"description": "Portable AI-agent skills, measured against the agent without them. ADRs, PRDs, runbooks, decks and reviews, installable into Claude Code, Cursor, Kiro, and any IDE that takes custom instructions. One command per skill or per role-based pack.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Sanjay Ananthanarayan",
|
|
@@ -29,8 +29,8 @@ being folded into either neighbour.
|
|
|
29
29
|
checks rollback, detection, response, measured targets, data and privacy, comms and
|
|
30
30
|
exposure, each with evidence. `REVISE` returns to `plan`, and the report names which gap to
|
|
31
31
|
close and which skill closes it. A missing rollback is `BLOCKED` on its own.
|
|
32
|
-
3. **Announce only once it is ready.** `release-notes` drafts the
|
|
33
|
-
|
|
32
|
+
3. **Announce only once it is ready.** `release-notes` drafts the notes for each audience
|
|
33
|
+
you name from the git range, with nothing the log doesn't say. Writing them before G3 risks announcing a launch that
|
|
34
34
|
then does not happen.
|
|
35
35
|
4. **A human decides at G3.1.** The release owner decides whether to ship *now*, given
|
|
36
36
|
timing, freeze windows and on-call coverage. When that decision is contested, use
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$comment": "RFC-0031. Covers the step between build (ends at merge, G2.1) and operate (starts at instrument). Its gates are G3 and G3.1: the whole number places the loop in the lifecycle (discover G0 through operate G4), and a decimal is a second gate inside the same loop (RFC-0044).",
|
|
3
3
|
"name": "release",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.1",
|
|
5
5
|
"description": "Take merged code to live users through a planned, reversible rollout — plan the phases and the rollback, judge readiness on evidence, draft the release notes, then a human makes the go/no-go call. Use when the user has merged a change and asks how to roll it out, whether they are ready to launch, or for a go/no-go decision.",
|
|
6
6
|
"entrypoint": "LOOP.md",
|
|
7
7
|
"kind": "loop",
|
|
@@ -1,69 +1,96 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: release-notes
|
|
3
|
-
description:
|
|
3
|
+
description: Write release notes from a git log, a list of merged PRs or rough notes about what changed — for the audience and in the format the user names (a customer changelog page, an email, an in-app "what's new", store text, a CHANGELOG.md entry). Says nothing the input doesn't, writes a vague change only as far as it was described, puts breaking changes and anything the reader must do first, and keeps internal noise and working notes out of the text. Use when the user wants release notes, a changelog entry, "what's in this release", a deploy announcement, or to summarise changes since the last tag.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# release-notes
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
**The rule: nothing goes in the notes that the log or the user didn't say.** A release note is
|
|
9
|
+
read as a promise. The agent's habit is to make a vague commit sound finished: "tweaked onboarding"
|
|
10
|
+
becomes "onboarding is now simpler", a half-remembered fix gets a symptom, a reverted feature
|
|
11
|
+
gets announced because its commit is in the range. Each of those reads exactly like a real
|
|
12
|
+
change, and a customer will hold you to it. This skill's job is to write only what the input
|
|
13
|
+
supports, as far as it supports it.
|
|
9
14
|
|
|
10
15
|
## How to respond
|
|
11
16
|
|
|
12
|
-
**
|
|
13
|
-
|
|
14
|
-
-
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
17
|
+
1. **Find out what actually shipped.** Read the whole range or list before writing a line.
|
|
18
|
+
- A change that was reverted later in the same range did not ship. Leave it out.
|
|
19
|
+
- A later commit can narrow or contradict an earlier one ("partial fix", a figure revised,
|
|
20
|
+
a date moved). Write the final state, not the first claim.
|
|
21
|
+
- Where you have a repo and no list, take the range from the last tag to HEAD
|
|
22
|
+
(`git describe --tags --abbrev=0`, then `git log <tag>..HEAD --no-merges`). Read a commit's
|
|
23
|
+
body or diff only when its subject is too vague to tell what it does.
|
|
24
|
+
|
|
25
|
+
2. **Find what breaks or needs action, wherever it is said.** A breaking change is often not
|
|
26
|
+
marked: a removed option in a PR description, a renamed setting in a commit body, an old
|
|
27
|
+
endpoint "no longer accepted". Each one goes first, with the step the reader has to take,
|
|
28
|
+
written for how this audience gets the release. Customers of a hosted service upgrade
|
|
29
|
+
nothing; they need to know what stops working and what to do instead. A library's users
|
|
30
|
+
need the version and the migration.
|
|
31
|
+
|
|
32
|
+
3. **Write only as far as each change was described.** "Fixed a bug in exports" stays that
|
|
33
|
+
vague if that's all the input says. Don't add a symptom, a cause, a number, a date, a
|
|
34
|
+
version, a PR number or a count the input doesn't give. A change you can't tell the meaning
|
|
35
|
+
of stays out of the notes and goes in the short list in step 6.
|
|
36
|
+
|
|
37
|
+
4. **Write for this reader, in this format.** Use the channel, length and tone the user asked
|
|
38
|
+
for: a customer changelog page, an email, a pop-up of a few lines, store text with a
|
|
39
|
+
character limit, or the repo's own CHANGELOG style if there is one. Say what the reader can
|
|
40
|
+
now do or no longer suffers ✅ *"Exports with more than 10,000 rows no longer fail"*, not
|
|
41
|
+
what the code does ❌ *"fix NPE in ReportExporter.flush()"*. Use the product name only if
|
|
42
|
+
you were given it.
|
|
43
|
+
|
|
44
|
+
5. **Leave internal work out of anything a customer reads.** CI, refactors, tests, dependency
|
|
45
|
+
bumps, typo fixes and tooling are not news, not even as "various improvements". In an
|
|
46
|
+
internal changelog they may appear if the repo's existing style includes them.
|
|
47
|
+
|
|
48
|
+
6. **Hand back the notes, then at most a few lines for the user.** The notes are clean: no
|
|
49
|
+
commit range, commit count, hashes, "flagged by" notes, or review lists inside them unless
|
|
50
|
+
the user's format asks for hashes (an internal CHANGELOG often does). After the notes, list
|
|
51
|
+
once, briefly, what you left out and why: changes too vague to describe, claims the log
|
|
52
|
+
contradicts, anything the user should confirm before publishing.
|
|
53
|
+
|
|
54
|
+
7. **Deliver from what you have.** With a log, a list or notes, write the notes and state any
|
|
55
|
+
assumption about audience or format in one line. Ask first only when there is nothing to
|
|
56
|
+
work from.
|
|
38
57
|
|
|
39
58
|
## Quality bar
|
|
40
59
|
|
|
41
|
-
- **
|
|
42
|
-
|
|
43
|
-
- **
|
|
44
|
-
- **
|
|
45
|
-
|
|
46
|
-
- **
|
|
60
|
+
- **Nothing in the notes goes beyond the input.** No invented feature, behaviour, symptom,
|
|
61
|
+
figure, date, version, PR number or count.
|
|
62
|
+
- **Reverted and superseded changes don't appear;** the final state does.
|
|
63
|
+
- **Breaking changes and required actions come first,** found from the text as well as the
|
|
64
|
+
markers, with an action that fits how the audience gets the release.
|
|
65
|
+
- **Internal noise is absent from customer text.**
|
|
66
|
+
- **The format, length and tone are the ones the user asked for,** and the notes carry no
|
|
67
|
+
working notes.
|
|
68
|
+
- **Vague items are left out or kept vague, and named once to the user.**
|
|
47
69
|
|
|
48
70
|
## When to use this skill
|
|
49
71
|
|
|
50
72
|
- ✅ Cutting a release and writing "what's new" for users or customers
|
|
51
|
-
- ✅
|
|
52
|
-
- ✅ A deploy
|
|
53
|
-
- ✅ "
|
|
73
|
+
- ✅ A `CHANGELOG.md` entry between versions
|
|
74
|
+
- ✅ A deploy or release announcement for internal stakeholders
|
|
75
|
+
- ✅ "Summarise everything merged since the last tag"
|
|
54
76
|
|
|
55
77
|
## When NOT to use this skill
|
|
56
78
|
|
|
57
79
|
- ❌ A single PR description — that's one change; use `pr-description-writer`
|
|
58
80
|
- ❌ Reviewing the changes for quality or risk — that's `devils-advocate` / `sonar-review`
|
|
59
|
-
- ❌
|
|
60
|
-
- ❌
|
|
81
|
+
- ❌ A narrative about *why* the release matters strategically — feed the notes to `exec-summary`
|
|
82
|
+
- ❌ Writing commit messages going forward — this skill reads history, it doesn't write it
|
|
61
83
|
|
|
62
84
|
## Anti-patterns to avoid
|
|
63
85
|
|
|
64
|
-
- ❌ **
|
|
65
|
-
|
|
66
|
-
- ❌ **
|
|
67
|
-
- ❌ **
|
|
68
|
-
- ❌ **
|
|
69
|
-
- ❌ **
|
|
86
|
+
- ❌ **Finishing a vague change.** "Looked at the search thing" becomes "search is faster".
|
|
87
|
+
Keep it as vague as it was, or leave it out and say so.
|
|
88
|
+
- ❌ **Announcing reverted work.** A commit in the range is not a change that shipped.
|
|
89
|
+
- ❌ **Burying a quiet break.** No `!:` marker doesn't mean nothing broke; read the bodies.
|
|
90
|
+
- ❌ **"Various bug fixes and improvements."** Either a fix is worth a line or it's internal.
|
|
91
|
+
- ❌ **The working notes in the text.** Ranges, counts, hashes, "flagged by", a "Needs review"
|
|
92
|
+
table in a customer email.
|
|
93
|
+
- ❌ **A changelog where an email was asked for.** Headings and bullets in a two-paragraph
|
|
94
|
+
member update.
|
|
95
|
+
- ❌ **Marketing adjectives.** "Blazing-fast", "completely redesigned": state the measured
|
|
96
|
+
change the input gives, or nothing.
|
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
"id": 1,
|
|
6
6
|
"prompt": "Write release notes for v2.4.0 from this log (range v2.3.0..HEAD, 2026-08-12 to 2026-09-28):\n\na1b2c3d|feat: bulk CSV import for contacts (#412)\ne4f5a6b|fix: NPE in ReportExporter.flush() when >10k rows (#418)\nc7d8e9f|feat!: remove legacy /v1/contacts endpoint (#420)\n0a1b2c3|chore(deps): bump lodash 4.17.20 -> 4.17.21\n4d5e6f7|refactor: extract ExportService\n8a9b0c1|fix stuff\n2d3e4f5|perf: cache tenant settings, report export ~3x faster (#425)",
|
|
7
7
|
"assertions": [
|
|
8
|
-
"
|
|
9
|
-
"The removal of /v1/contacts
|
|
8
|
+
"Delivers the notes from the log without stopping to ask who they are for, stating any assumption about the audience in a line",
|
|
9
|
+
"The removal of /v1/contacts comes first, with the step API users must take",
|
|
10
10
|
"Customer notes contain no commit-speak — no ReportExporter.flush(), class names, ticket numbers, or author names",
|
|
11
|
-
"The lodash bump and the ExportService refactor
|
|
12
|
-
"
|
|
13
|
-
"The vague 'fix stuff' commit
|
|
11
|
+
"The lodash bump and the ExportService refactor do not appear in customer-facing notes, not even as 'various improvements'",
|
|
12
|
+
"The notes carry no working notes: no commit range, commit count, hashes or review lists in customer-facing text",
|
|
13
|
+
"The vague 'fix stuff' commit is not given an invented meaning in the notes, and is named to the user outside them",
|
|
14
14
|
"No marketing adjectives; the performance line states the measured change (~3x faster export) rather than 'blazing fast'",
|
|
15
15
|
"Does not invent features or fixes not present in the log"
|
|
16
16
|
]
|
|
@@ -72,6 +72,34 @@
|
|
|
72
72
|
"It does not invent crash counts, percentages, a release date for Android, or features that are not in the list",
|
|
73
73
|
"The store text itself is short: about 100 words or fewer per store"
|
|
74
74
|
]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": 6,
|
|
78
|
+
"held_out": "2026-10-17",
|
|
79
|
+
"prompt": "Our next Quillmoor release goes out tomorrow. Quillmoor is our invoicing app for freelancers and small studios, and some of our customers use our API. The git log since the last release is in `git-log.txt`. Write the customer-facing release notes for our public changelog page: Markdown, 200 words max. I want them ready to paste.",
|
|
80
|
+
"assertions": [
|
|
81
|
+
"The webhook payload change (`amount` now an integer in minor units, `client_name` renamed to `client.display_name`) is in the notes and comes before every other change, worded so a customer with a webhook integration can tell they must update their handler",
|
|
82
|
+
"The Swiss QR-bill feature is not presented as part of the release, since it was reverted in the same range",
|
|
83
|
+
"No internal-only work appears in the notes: no CI changes, dependency bumps, test fixtures, the auth/session refactor, feature-flag removal, release checklist, or typo fixes in comments or CONTRIBUTING",
|
|
84
|
+
"The 'misc fixes from Henrike's QA pass' and 'sync stuff' commits are either left out or mentioned no more specifically than general small fixes; no particular behaviour, such as a sync feature, is attributed to them",
|
|
85
|
+
"Does not invent anything absent from the log or request: no version number, release date, PR or ticket number, count of changes, or figure such as how much faster the invoice list is",
|
|
86
|
+
"Covers at least six of these seven customer-visible changes: duplicating an invoice, receipt photos from a phone's browser, the client-portal ZIP download, no more reminders for invoices marked paid offline, the VAT rounding fix, the due date column in CSV export, and the faster invoice list",
|
|
87
|
+
"The pasteable notes are 200 words or fewer and in Markdown, are delivered without first stopping to ask questions, and contain no working notes about what was left out or why"
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": 7,
|
|
92
|
+
"held_out": "2026-10-17",
|
|
93
|
+
"prompt": "I run the Bramblegate Tool Library, it's a volunteer thing where members borrow tools through our little app. My nephew does the app and he did a bunch of stuff this month. From memory:\n\n- you can reserve tools a week ahead now instead of 3 days? I think a week\n- the login code by text message, he fixed that, people were complaining it didn't arrive\n- something about late fees, he changed how they work, I need to check with him but basically you get a reminder before it's late now\n- everyone has to re-accept the borrowing agreement next time they log in because the committee updated it\n- new photos on the tool pages\n- also a lot of backend stuff I don't understand\n\nCan you write the text for the \"What's new\" pop-up members see when they open the app? It's a small box, so 75 words max.",
|
|
94
|
+
"assertions": [
|
|
95
|
+
"Re-accepting the updated borrowing agreement at next log-in comes first in the pop-up text and is stated as something the member will have to do",
|
|
96
|
+
"Does not invent details: no late-fee amounts, no number of days before the due date that the reminder arrives, no reservation window other than a week, no cause for the login problem, no date, and no change that is not in the notes",
|
|
97
|
+
"The late-fee item goes only as far as described, a reminder before an item is late, and does not claim fees were raised, lowered or removed",
|
|
98
|
+
"The 'backend stuff' is not in the pop-up text, and nothing specific is claimed about it",
|
|
99
|
+
"Mentions reserving further ahead, the fixed text-message login code, and the new tool photos",
|
|
100
|
+
"The pop-up text is 75 words or fewer and in plain language for library members, with no developer jargon such as 'backend', 'OTP' or 'SMS verification flow'",
|
|
101
|
+
"Delivers the pop-up text without first stopping to ask for confirmation; any suggestion to check details with the developer sits outside the pop-up text"
|
|
102
|
+
]
|
|
75
103
|
}
|
|
76
104
|
]
|
|
77
105
|
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
commit 0d1f6b8
|
|
2
|
+
Author: Jun Okafor
|
|
3
|
+
|
|
4
|
+
chore(release): scaffold release checklist
|
|
5
|
+
|
|
6
|
+
commit a4c91e0
|
|
7
|
+
Author: Odile Brandt
|
|
8
|
+
|
|
9
|
+
chore(ci): cache node_modules between workflow runs
|
|
10
|
+
|
|
11
|
+
commit 7d2b33f
|
|
12
|
+
Author: Tomasz Wereszka
|
|
13
|
+
|
|
14
|
+
Revert "feat(invoices): Swiss QR-bill block on PDF invoices"
|
|
15
|
+
|
|
16
|
+
This reverts commit 3e8f10b. The bank validator rejects our reference
|
|
17
|
+
field. Pulling it until we can test against real QR scanners.
|
|
18
|
+
|
|
19
|
+
commit e01f5c9
|
|
20
|
+
Author: Marisol Quintero
|
|
21
|
+
|
|
22
|
+
fix(reminders): stop sending payment reminders for invoices marked paid offline
|
|
23
|
+
|
|
24
|
+
Invoices marked "paid by bank transfer" by hand were still getting the
|
|
25
|
+
automatic reminder email sent to the client.
|
|
26
|
+
|
|
27
|
+
commit 5bb7a20
|
|
28
|
+
Author: Tomasz Wereszka
|
|
29
|
+
|
|
30
|
+
misc fixes from Henrike's QA pass
|
|
31
|
+
|
|
32
|
+
commit c33d9e4
|
|
33
|
+
Author: Jun Okafor
|
|
34
|
+
|
|
35
|
+
chore(deps): bump pdfkit from 0.13.0 to 0.15.1
|
|
36
|
+
|
|
37
|
+
commit 2f6a811
|
|
38
|
+
Author: Marisol Quintero
|
|
39
|
+
|
|
40
|
+
feat(expenses): attach receipt photos to expenses from your phone's browser
|
|
41
|
+
|
|
42
|
+
Camera upload on mobile web. JPG, PNG and HEIC, up to 10 MB each.
|
|
43
|
+
|
|
44
|
+
commit 88e0b4c
|
|
45
|
+
Author: Jun Okafor
|
|
46
|
+
|
|
47
|
+
refactor(webhooks): normalise payload serializer
|
|
48
|
+
|
|
49
|
+
Moves all webhook payloads onto the shared serializer. Side effect:
|
|
50
|
+
`amount` on invoice.created and invoice.paid is now an integer in minor
|
|
51
|
+
units (cents) instead of a decimal string, to match the REST API, and
|
|
52
|
+
`client_name` is renamed to `client.display_name`. Anyone parsing our
|
|
53
|
+
webhooks has to update their handler. There is no compatibility flag.
|
|
54
|
+
|
|
55
|
+
commit 41d7f02
|
|
56
|
+
Author: Tomasz Wereszka
|
|
57
|
+
|
|
58
|
+
test: add fixtures for multi-currency invoices
|
|
59
|
+
|
|
60
|
+
commit 3e8f10b
|
|
61
|
+
Author: Tomasz Wereszka
|
|
62
|
+
|
|
63
|
+
feat(invoices): Swiss QR-bill block on PDF invoices
|
|
64
|
+
|
|
65
|
+
Adds the QR payment slip to the bottom of PDF invoices for clients
|
|
66
|
+
with a Swiss address.
|
|
67
|
+
|
|
68
|
+
commit b9a2e6c
|
|
69
|
+
Author: Odile Brandt
|
|
70
|
+
|
|
71
|
+
sync stuff
|
|
72
|
+
|
|
73
|
+
commit 6c1d8a5
|
|
74
|
+
Author: Marisol Quintero
|
|
75
|
+
|
|
76
|
+
feat(invoices): duplicate an invoice from the invoice menu
|
|
77
|
+
|
|
78
|
+
Copies line items, client and tax settings. The new invoice gets the
|
|
79
|
+
next invoice number and today's date.
|
|
80
|
+
|
|
81
|
+
commit d57e3b1
|
|
82
|
+
Author: Jun Okafor
|
|
83
|
+
|
|
84
|
+
perf(dashboard): faster invoice list for accounts with lots of invoices
|
|
85
|
+
|
|
86
|
+
Paginate server-side instead of fetching every invoice up front.
|
|
87
|
+
|
|
88
|
+
commit 0ae4f9c
|
|
89
|
+
Author: Odile Brandt
|
|
90
|
+
|
|
91
|
+
docs: fix typo in CONTRIBUTING
|
|
92
|
+
|
|
93
|
+
commit f62c0d8
|
|
94
|
+
Author: Marisol Quintero
|
|
95
|
+
|
|
96
|
+
fix(tax): VAT total off by a cent on long invoices
|
|
97
|
+
|
|
98
|
+
Totals on invoices with many line items could be off by 0.01 because
|
|
99
|
+
we rounded each line instead of the total.
|
|
100
|
+
|
|
101
|
+
commit 19b7e44
|
|
102
|
+
Author: Jun Okafor
|
|
103
|
+
|
|
104
|
+
chore: remove unused feature flag new_sidebar_v1
|
|
105
|
+
|
|
106
|
+
commit ab30c6e
|
|
107
|
+
Author: Tomasz Wereszka
|
|
108
|
+
|
|
109
|
+
fix(export): CSV export now includes the due date column
|
|
110
|
+
|
|
111
|
+
commit 7e5d1f2
|
|
112
|
+
Author: Odile Brandt
|
|
113
|
+
|
|
114
|
+
ci: run e2e suite on Node 22
|
|
115
|
+
|
|
116
|
+
commit 2c94b8d
|
|
117
|
+
Author: Jun Okafor
|
|
118
|
+
|
|
119
|
+
refactor(auth): extract session middleware
|
|
120
|
+
|
|
121
|
+
commit 95f0a3c
|
|
122
|
+
Author: Marisol Quintero
|
|
123
|
+
|
|
124
|
+
feat(portal): clients can download all their paid invoices as one ZIP
|
|
125
|
+
|
|
126
|
+
New "Download all" button on the client portal's invoice page.
|
|
127
|
+
|
|
128
|
+
commit 4b6e7d9
|
|
129
|
+
Author: Odile Brandt
|
|
130
|
+
|
|
131
|
+
chore(deps-dev): bump eslint to 9.12
|
|
132
|
+
|
|
133
|
+
commit e8c2a05
|
|
134
|
+
Author: Tomasz Wereszka
|
|
135
|
+
|
|
136
|
+
chore: fix typos in code comments
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "release-notes",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Write release notes from a git log, a list of merged PRs or rough notes about what changed — for the audience and in the format the user names (a customer changelog page, an email, an in-app \"what's new\", store text, a CHANGELOG.md entry). Says nothing the input doesn't, writes a vague change only as far as it was described, puts breaking changes and anything the reader must do first, and keeps internal noise and working notes out of the text. Use when the user wants release notes, a changelog entry, \"what's in this release\", a deploy announcement, or to summarise changes since the last tag.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
7
7
|
"env": { "required": [], "optional": [] },
|
|
8
8
|
"related": ["devils-advocate", "exec-summary", "pr-description-writer", "sonar-review"],
|
|
9
9
|
"tags": ["release-notes", "changelog", "git", "release", "deploy", "communication"],
|
|
10
|
-
"model": { "tier": "standard", "rationale": "
|
|
10
|
+
"model": { "tier": "standard", "rationale": "Reads a range for what really shipped and rewrites it for one reader. The audience translation needs judgment; escalate via large-input on very long ranges." }
|
|
11
11
|
}
|
package/packs/research/pack.json
CHANGED
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
{
|
|
39
39
|
"skill": "source-synthesis",
|
|
40
40
|
"you_do": "Hand it the sources you collected, as text, with the plan's question.",
|
|
41
|
-
"you_get": "
|
|
41
|
+
"you_get": "What the sources support on the question, each claim traceable to its source, with disagreements and echoes made explicit, the sources' own sums checked, labelled estimates where a figure is needed, and the gaps. Ask for a cited literature review to get page-level citations and strength ratings."
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
44
|
"skill": "hypothesis-comparison",
|
|
@@ -47,6 +47,6 @@
|
|
|
47
47
|
"decide": "Act on the leading explanation, or run the next observation first."
|
|
48
48
|
}
|
|
49
49
|
],
|
|
50
|
-
"you_end_with": "A decision-led plan, a
|
|
50
|
+
"you_end_with": "A decision-led plan, a synthesis that keeps what the sources say apart from everything else, and, for why-questions, a ranked set of explanations with the next test to run."
|
|
51
51
|
}
|
|
52
52
|
}
|
|
@@ -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
|
}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
# Release-notes templates
|
|
2
|
-
|
|
3
|
-
Two artifacts, two readers. Customer notes sell nothing and explain everything; the internal changelog trades polish for traceability.
|
|
4
|
-
|
|
5
|
-
## Artifact 1 — customer-facing release notes
|
|
6
|
-
|
|
7
|
-
> Note the deliberate rename for a non-technical reader: the Keep-a-Changelog categories **Added → New** and **Changed → Improved** here; Fixed/Security keep their names. The internal changelog (Artifact 2) uses the canonical Keep-a-Changelog headings.
|
|
8
|
-
|
|
9
|
-
```markdown
|
|
10
|
-
# {Product} {version} — {YYYY-MM-DD}
|
|
11
|
-
|
|
12
|
-
> Covers {ref}..{ref} · {N} changes
|
|
13
|
-
|
|
14
|
-
## ⚠ Breaking changes
|
|
15
|
-
|
|
16
|
-
- **{What broke, in reader terms.}**
|
|
17
|
-
Action required: {the exact step — config to change, endpoint to migrate, deadline}.
|
|
18
|
-
(flagged by: {signal — `!:` marker / removed API / migration file})
|
|
19
|
-
|
|
20
|
-
## New
|
|
21
|
-
|
|
22
|
-
- {What the reader can now do. One sentence, benefit first.}
|
|
23
|
-
|
|
24
|
-
## Improved
|
|
25
|
-
|
|
26
|
-
- {What got better, measurably where possible: "export is ~3× faster on reports over 10k rows".}
|
|
27
|
-
|
|
28
|
-
## Fixed
|
|
29
|
-
|
|
30
|
-
- {The symptom the reader no longer suffers: "Fixed a crash when …", "Dates no longer shift by one day when …".}
|
|
31
|
-
|
|
32
|
-
## Security
|
|
33
|
-
|
|
34
|
-
- {Reader-relevant statement; severity and affected versions; no exploit detail.}
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Rules: no class/function/service names, no ticket IDs, no author names, no "various improvements". A section with nothing in it is deleted, not left empty — except Breaking changes, which when empty becomes the single line "No breaking changes."
|
|
38
|
-
|
|
39
|
-
## Artifact 2 — internal changelog (Keep a Changelog)
|
|
40
|
-
|
|
41
|
-
```markdown
|
|
42
|
-
## [{version}] - {YYYY-MM-DD}
|
|
43
|
-
|
|
44
|
-
Range: `{ref}..{ref}` · {N} commits · {N} PRs
|
|
45
|
-
|
|
46
|
-
### Added
|
|
47
|
-
- {change} ({#PR}, `{hash}`)
|
|
48
|
-
|
|
49
|
-
### Changed
|
|
50
|
-
- **BREAKING:** {change + migration step} ({#PR}, `{hash}`)
|
|
51
|
-
- {change} ({#PR}, `{hash}`)
|
|
52
|
-
|
|
53
|
-
### Fixed
|
|
54
|
-
- {change} ({#PR}, `{hash}`)
|
|
55
|
-
|
|
56
|
-
### Deprecated / Removed / Security
|
|
57
|
-
- {change} ({#PR}, `{hash}`)
|
|
58
|
-
|
|
59
|
-
### Internal
|
|
60
|
-
- {refactor / CI / deps / tests — one line each} (`{hash}`)
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## Needs review (always emitted, both modes)
|
|
64
|
-
|
|
65
|
-
```markdown
|
|
66
|
-
## Needs review — {N} commits not classified
|
|
67
|
-
|
|
68
|
-
| Hash | Subject | Why unclear |
|
|
69
|
-
|---|---|---|
|
|
70
|
-
| `{hash}` | {verbatim subject} | {vague / contradicts diff / can't tell if user-visible} |
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## Classification cheat-sheet
|
|
74
|
-
|
|
75
|
-
| Signal | Bucket |
|
|
76
|
-
|---|---|
|
|
77
|
-
| New endpoint, flag default-on, new UI surface | Added |
|
|
78
|
-
| Behavior or default changed for existing users | Changed (BREAKING if old behavior unobtainable) |
|
|
79
|
-
| `fix:`, bug ticket, regression revert | Fixed |
|
|
80
|
-
| `chore:`, `refactor:`, `test:`, `ci:`, deps, lockfiles | Internal |
|
|
81
|
-
| CVE, auth/authz, input validation, secrets | Security |
|
|
82
|
-
| `feat!:`, `BREAKING CHANGE:`, removed public API, schema migration, major version bump of a public SDK | Breaking — hoist to top |
|
|
83
|
-
| "wip", "fix stuff", "address comments", empty body + vague subject | Needs review |
|