skilldrop-cli 0.16.8 → 0.16.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/package.json +1 -1
  2. package/packs/ai-engineering/skills/ai-usage-policy/evals/evals.json +30 -0
  3. package/packs/ai-engineering/skills/ai-usage-policy/evals/files/4/ciso-brief.md +15 -0
  4. package/packs/ai-engineering/skills/ai-usage-policy/evals/files/4/incident-summary.md +22 -0
  5. package/packs/ai-engineering/skills/ai-usage-policy/evals/files/4/legal-notes.md +14 -0
  6. package/packs/ai-engineering/skills/ai-usage-policy/evals/files/4/tool-inventory.csv +5 -0
  7. package/packs/api-builder/skills/tool-use-schema-writer/evals/evals.json +30 -0
  8. package/packs/api-builder/skills/tool-use-schema-writer/evals/files/4/refunds.openapi.yaml +63 -0
  9. package/packs/career/skills/job-fit-analysis/SKILL.md +22 -8
  10. package/packs/career/skills/job-fit-analysis/manifest.json +1 -1
  11. package/packs/data-analytics/skills/metric-definition/evals/evals.json +30 -0
  12. package/packs/data-analytics/skills/metric-definition/evals/files/4/tables.md +32 -0
  13. package/packs/data-analytics/skills/metric-definition/evals/files/4/thread.md +31 -0
  14. package/packs/dev-team/skills/contribution-wizard/evals/evals.json +30 -0
  15. package/packs/dev-team/skills/contribution-wizard/evals/files/4/CONTRIBUTING.md +63 -0
  16. package/packs/dev-team/skills/contribution-wizard/evals/files/4/registry.json +15 -0
  17. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/PROMPT.md +10 -0
  18. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/01-expected.md +2 -0
  19. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/01-input.md +3 -0
  20. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/02-expected.md +1 -0
  21. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/02-input.md +2 -0
  22. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/03-expected.md +1 -0
  23. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/03-input.md +2 -0
  24. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/meta.json +7 -0
  25. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/PROMPT.md +11 -0
  26. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/01-expected.md +4 -0
  27. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/01-input.md +4 -0
  28. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/02-expected.md +6 -0
  29. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/02-input.md +2 -0
  30. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/03-expected.md +1 -0
  31. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/03-input.md +1 -0
  32. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/skill.toml +6 -0
  33. package/packs/dev-team/skills/devils-advocate/evals/evals.json +29 -0
  34. package/packs/dev-team/skills/devils-advocate/evals/files/4/lateFees.test.ts +46 -0
  35. package/packs/dev-team/skills/devils-advocate/evals/files/4/lateFees.ts +46 -0
  36. package/packs/dev-team/skills/release-notes/evals/evals.json +29 -0
  37. package/packs/dev-team/skills/release-notes/evals/files/4/git-log.txt +26 -0
  38. package/packs/research/skills/source-synthesis/evals/evals.json +30 -0
  39. package/packs/research/skills/source-synthesis/evals/files/4/behaviour-logs.md +31 -0
  40. package/packs/research/skills/source-synthesis/evals/files/4/parent-survey.md +25 -0
  41. package/packs/research/skills/source-synthesis/evals/files/4/pilot-report.md +27 -0
  42. package/packs/research/skills/source-synthesis/evals/files/4/teacher-focus-group.md +19 -0
  43. package/packs/research/skills/source-synthesis/evals/files/4/vendor-brochure.md +18 -0
  44. package/packs/solution-architect/skills/db-schema-design/evals/evals.json +30 -0
  45. package/packs/solution-architect/skills/db-schema-design/evals/files/4/finance-email.md +18 -0
  46. package/packs/solution-architect/skills/db-schema-design/evals/files/4/members_sample.csv +5 -0
  47. package/packs/solution-architect/skills/db-schema-design/evals/files/4/points_txn_sample.csv +17 -0
  48. package/packs/solution-architect/skills/db-schema-design/evals/files/4/requirements.md +28 -0
  49. package/packs/solution-architect/skills/design-doc/evals/evals.json +29 -0
  50. package/packs/solution-architect/skills/design-doc/evals/files/4/request.md +31 -0
  51. package/packs/solution-architect/skills/design-doc/evals/files/4/systems.md +40 -0
  52. package/packs/solution-architect/skills/tech-comparison-matrix/evals/evals.json +29 -0
  53. package/packs/solution-architect/skills/tech-comparison-matrix/evals/files/4/mobile-options.md +45 -0
  54. package/packs/sre-oncall/skills/postmortem-generator/evals/evals.json +30 -0
  55. package/packs/sre-oncall/skills/postmortem-generator/evals/files/4/finance-recon.md +28 -0
  56. package/packs/sre-oncall/skills/postmortem-generator/evals/files/4/incident-channel.txt +34 -0
  57. package/packs/sre-oncall/skills/postmortem-generator/evals/files/4/scheduler-log.txt +15 -0
  58. package/packs/stakeholder-comms/skills/guide-builder/evals/evals.json +30 -0
  59. package/packs/stakeholder-comms/skills/guide-builder/evals/files/4/handover-thread.txt +39 -0
  60. package/packs/stakeholder-comms/skills/guide-builder/evals/files/4/it-notes.txt +21 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skilldrop-cli",
3
- "version": "0.16.8",
3
+ "version": "0.16.9",
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",
@@ -44,6 +44,36 @@
44
44
  "It does not state that a specific law, regulator or sector code applies as fact; any mention is marked as something to confirm",
45
45
  "The policy itself is short: about two pages or less (roughly 800 words)"
46
46
  ]
47
+ },
48
+ {
49
+ "id": 4,
50
+ "held_out": "2026-10-06",
51
+ "prompt": "I'm in security GRC at Ledgerline Payments (850 people) and I've been handed the AI acceptable-use policy to draft. The CISO's brief is in ciso-brief.md, the tools we have are in tool-inventory.csv, legal's notes are in legal-notes.md and there's a write-up of last month's incident in incident-summary.md. Can you draft it? Three pages tops — it's going to the exec meeting and people won't read more than that.",
52
+ "assertions": [
53
+ "It says cardholder data must not go into any AI tool, including CodePilot Enterprise, and tells the CISO it has not included the rule she asked for because legal's notes say the Corvane Bank agreement and PCI scope prohibit it regardless of zero retention",
54
+ "LingoDraft is not listed as approved: its contract expired on 31 August 2026 and the renewal is unsigned, and the draft says what support should do for translation meanwhile or flags it for decision",
55
+ "Transcribo is not approved for customer calls: the DPA is unsigned, so the support team's plan for next month is blocked until it is signed",
56
+ "It points out that CodePilot has 300 seats against 410 engineers, so about 110 engineers have no seat, and says what they should use or do instead of a personal account",
57
+ "It does not route exceptions to the AI Review Group as if it were working: it notes the group has not met since June and has no chair, and names an interim approver role or flags the decision for the exec",
58
+ "It says production logs and other customer data must not be pasted into personal or public AI accounts, and gives staff a specific place to report it if they already have",
59
+ "Last-four card digits together with an email address are treated as cardholder data for now, with a note that legal is still confirming this",
60
+ "It names no law, regulation or standard other than GDPR and PCI DSS, and does not name the engineer involved in the incident"
61
+ ]
62
+ },
63
+ {
64
+ "id": 5,
65
+ "held_out": "2026-10-06",
66
+ "prompt": "I run a small video production studio, 9 of us. One of our clients, a big retailer, has sent a supplier questionnaire and one question is 'do you have an AI policy?' We don't. What I know: we use AI image generation for mood boards and storyboards, a few people use ChatGPT for first drafts of scripts, and I think one of the editors has been using an AI voice tool for scratch voiceovers. The client contracts say something about not using their footage for anything else, but I haven't re-read them. Can you write me a one-pager I can attach to the questionnaire?",
67
+ "assertions": [
68
+ "It delivers a draft policy in the reply and does not stop at a list of questions",
69
+ "It says client footage, briefs and unreleased material must not be put into AI tools unless the client's contract or written permission allows it, and says what staff do in the meantime",
70
+ "It tells the user to re-read the client contracts before sending this, and does not state what those contracts permit or prohibit as if known",
71
+ "It covers the three uses mentioned (image generation for mood boards and storyboards, ChatGPT for script drafts, the AI voice tool) and marks the voice tool use as unconfirmed; it does not present a list of approved tools with accounts or plans as already settled",
72
+ "It says a real person's voice or likeness must not be cloned or imitated with AI without that person's consent",
73
+ "It says whether and when a client is told that AI-generated images, voice or script went into work delivered to them",
74
+ "It does not state as fact that a specific law applies or that the studio owns the copyright in AI-generated material; any such point is marked as something to check",
75
+ "The policy itself fits on about one page (roughly 500 words or fewer)"
76
+ ]
47
77
  }
48
78
  ]
49
79
  }
@@ -0,0 +1,15 @@
1
+ From: Anneliese Vort (CISO)
2
+ To: Security GRC
3
+ Date: 28 September 2026
4
+ Subject: AI policy - what I want in it
5
+
6
+ Notes for the draft. I need it for the exec meeting on the 15th.
7
+
8
+ - One policy for all 850 staff, not one per department.
9
+ - All four tools on the inventory are approved. List them.
10
+ - Everyone in engineering (410 people) has a CodePilot Enterprise licence, so there is no reason for anyone to be using a personal account. Say so.
11
+ - Because CodePilot has the zero-retention addendum, say card data is OK in CodePilot. Engineers debugging payment issues need it, and it will stop them going elsewhere.
12
+ - Exceptions go through the AI Review Group.
13
+ - Support want to start using Transcribo on customer calls from next month. Cover that.
14
+ - Refer to the 9 September incident so people understand why we are doing this, without naming the engineer.
15
+ - People will not read ten pages.
@@ -0,0 +1,22 @@
1
+ # INC-2291: summary
2
+
3
+ Opened 10 September 2026. Status at 30 September: open.
4
+
5
+ ## What happened
6
+ On 9 September an engineer debugging failed refunds pasted about 600 lines of production logs into a personal account on a public chatbot.
7
+
8
+ ## What was in the logs
9
+ - 2,300 customer email addresses
10
+ - The last four digits of card numbers
11
+ - No full card numbers, expiry dates or security codes
12
+
13
+ ## Timeline
14
+ - 9 Sept: logs pasted.
15
+ - 10 Sept: the engineer reported it themselves to their team lead, who did not know where to send it. It reached Security that afternoon.
16
+ - 11 Sept: deletion request sent to the chatbot provider.
17
+ - 30 Sept: no confirmation of deletion received.
18
+
19
+ ## Contributing factors
20
+ - The engineer had no CodePilot Enterprise seat and was on the waiting list.
21
+ - No written guidance on whether logs may be pasted into AI tools.
22
+ - No clear place to report it.
@@ -0,0 +1,14 @@
1
+ # Legal notes for the AI policy
2
+
3
+ Bartholomew Nkemelu, Senior Counsel, Ledgerline Payments
4
+ 22 September 2026
5
+
6
+ 1. **Cardholder data.** Card numbers, expiry dates and security codes must not leave the cardholder data environment. Our PCI DSS scope and our acquiring agreement with Corvane Bank (clause 14.3) both prohibit sending cardholder data to any third party not listed in the agreement. Northgate AI is not listed. A zero-retention addendum does not change this.
7
+
8
+ 2. **Customer personal data.** Under GDPR, customer names, email addresses and transaction history may be processed in AskDesk and CodePilot Enterprise under the signed DPAs. They may not go into any tool without a signed DPA.
9
+
10
+ 3. **Transcribo.** We are still negotiating the sub-processor terms. Do not record customers until the DPA is signed. I cannot give a date.
11
+
12
+ 4. **AI Review Group.** It has not met since June. Idris, who chaired it, moved to the Lisbon office project and was not replaced. Somebody needs to decide who approves exceptions. That is not a legal decision.
13
+
14
+ 5. **Not yet checked.** Whether the last four digits of a card number together with an email address count as cardholder data under our scope. I will confirm with the QSA. Treat as cardholder data until I do.
@@ -0,0 +1,5 @@
1
+ tool,vendor,purpose,seats,contract_status,contract_end,data_terms,notes
2
+ CodePilot Enterprise,Northgate AI,coding assistant,300,signed,2027-03-31,"zero-retention addendum signed 2026-02-12; no training on our data",engineering only; waiting list open
3
+ AskDesk,Pellam Systems,general internal chatbot,850,signed,2027-01-31,"DPA signed; no training on our data; 30-day retention; EU hosting",SSO for all staff
4
+ Transcribo,Transcribo Inc,meeting notetaker,40,pilot,2026-12-31,"DPA in legal review - not signed",pilot limited to internal meetings
5
+ LingoDraft,Lingo Labs,translation,25,expired,2026-08-31,"renewal not signed",support still use it for Polish and Spanish replies
@@ -42,6 +42,36 @@
42
42
  "It does not state a tracking number format or pattern, a weight limit, carrier names or a dimension unit as fact",
43
43
  "It does not describe the lookup's return fields as fact, and says what the lookup returns is not yet known"
44
44
  ]
45
+ },
46
+ {
47
+ "id": 4,
48
+ "held_out": "2026-10-06",
49
+ "prompt": "Need a Claude tool so our support assistant can issue refunds itself. The endpoint spec is in refunds.openapi.yaml. Policy from Marguerite (head of support): the assistant can refund up to £500 on its own, anything above that goes to a human. Amounts are in pounds. Just the tool definition plus a short list of anything in the spec that looks off, I don't need the Python around it.",
50
+ "assertions": [
51
+ "It produces a tool definition with a name, a description and an input_schema of type object whose properties include the order reference, the amount and the reason",
52
+ "The amount parameter is an integer in minor units (pence) and its description says so; it is not defined as pounds or as a decimal",
53
+ "It flags that the spec caps amount_minor at 25000, which is £250 and below the £500 policy, and does not set the maximum to 50000",
54
+ "It flags that the spec lists amount_minor as required while its description says to omit it for a full refund",
55
+ "goodwill is either left out of the reason values or marked as deprecated with customer_request to be used instead",
56
+ "The definition states that reason_note is needed when the reason is other and is limited to 280 characters",
57
+ "It does not add parameters the spec does not have, such as a currency, a customer id or a refund method",
58
+ "The reply contains no Python client code"
59
+ ]
60
+ },
61
+ {
62
+ "id": 5,
63
+ "held_out": "2026-10-06",
64
+ "prompt": "ops run this script by hand to change a price:\n\n./reprice.sh SKU-4471 19.99 --store 12 --until 2026-11-01\n\nwant our pricing agent to be able to call it as a tool. store is optional (no store = all stores i think), until is optional too and the price goes back after that date. price is dollars. there's also a --force flag, no idea what it does, Wendell wrote the script and he's out till the 19th. quick one, just the json",
65
+ "assertions": [
66
+ "It delivers a tool definition with a name, a description and an input_schema, and does not stop at questions",
67
+ "The required array contains the SKU and the price, and does not contain store or until",
68
+ "The price parameter's description states the unit is dollars",
69
+ "It says that leaving store out meaning all stores is unconfirmed and should be checked",
70
+ "It does not state what --force does; force is either left out of the tool or included with its effect marked as unknown",
71
+ "The until parameter is described as a date in the YYYY-MM-DD form shown in the example",
72
+ "It does not state a SKU pattern, a price minimum or maximum, or a range of valid store numbers as fact; any such constraint is marked as an assumption",
73
+ "The reply is the JSON definition with at most a few lines of notes, and contains no Python client code"
74
+ ]
45
75
  }
46
76
  ]
47
77
  }
@@ -0,0 +1,63 @@
1
+ # Excerpt from payments-api/openapi.yaml, Lanternfold Events
2
+ # Changelog
3
+ # 2026-06-02 reason: "goodwill" deprecated, send "customer_request" instead.
4
+ # Still accepted until the end of the year.
5
+ # 2026-02-17 v2: amounts moved from decimal strings to integer minor units.
6
+ paths:
7
+ /v2/refunds:
8
+ post:
9
+ operationId: createRefund
10
+ summary: Refund all or part of a paid order
11
+ description: >
12
+ Creates a refund against a paid order. The money goes back to the
13
+ original payment method. An order can be refunded more than once, until
14
+ the refunded total reaches the amount paid. Returns 409 event_passed if
15
+ the event has already taken place, and 422 over_limit if the amount is
16
+ more than the remaining refundable amount.
17
+ requestBody:
18
+ required: true
19
+ content:
20
+ application/json:
21
+ schema:
22
+ type: object
23
+ additionalProperties: false
24
+ required: [order_id, amount_minor, reason]
25
+ properties:
26
+ order_id:
27
+ type: string
28
+ pattern: '^LF-[0-9]{8}$'
29
+ description: Order reference from the confirmation email, e.g. LF-00482913.
30
+ amount_minor:
31
+ type: integer
32
+ minimum: 1
33
+ maximum: 25000
34
+ description: >
35
+ Amount to refund, in minor units of the order's currency
36
+ (pence for GBP). Omit to refund the full remaining amount.
37
+ reason:
38
+ type: string
39
+ enum: [event_cancelled, event_rescheduled, duplicate_purchase, customer_request, goodwill, other]
40
+ description: Why the refund is being made. Shown on the finance report.
41
+ reason_note:
42
+ type: string
43
+ maxLength: 280
44
+ description: Free-text explanation. Required when reason is "other".
45
+ ticket_ids:
46
+ type: array
47
+ minItems: 1
48
+ items:
49
+ type: string
50
+ description: >
51
+ Tickets to cancel as part of this refund. Omit to leave the
52
+ order's tickets valid.
53
+ notify_customer:
54
+ type: boolean
55
+ default: true
56
+ description: Send the customer the refund confirmation email.
57
+ responses:
58
+ '201':
59
+ description: Refund created.
60
+ '409':
61
+ description: event_passed
62
+ '422':
63
+ description: over_limit or validation error
@@ -51,10 +51,16 @@ These four rules outrank the steps below.
51
51
  - **Met**: the resume shows it. Quote the line.
52
52
  - **Partly**: the resume shows something close, smaller or older. Say what it shows and
53
53
  what is short: "team of 12; the posting asks for 20 or more".
54
- - **Not shown**: the resume is silent. The person may well have it.
54
+ - **Not shown**: the resume is silent on a specific thing. The person may well have it.
55
55
  - **Not met**: the resume shows otherwise, such as a diploma where a degree is required
56
56
  or two years where five are asked for.
57
57
 
58
+ A requirement for a general ability, such as dealing with the public, organising work
59
+ or communicating clearly, is `Met` by any job that plainly involves it: four years
60
+ serving customers meets "friendly first point of contact". Keep `Not shown` and `Partly`
61
+ for specific things: a tool, a qualification, a setting, a scale, a number of years. Do
62
+ not mark half the table `Partly` to be safe.
63
+
58
64
  A similar tool is not the named tool. Cerner is not Epic, an in-house warehouse system is
59
65
  not SAP: when the posting requires the named one, mark it `Not met` and give the similar
60
66
  one as the nearest thing you have. A related task is not the named skill: cashing up a
@@ -76,9 +82,11 @@ These four rules outrank the steps below.
76
82
  true for it to be worth the time, and whether you would still send it.
77
83
  - **Not a match**: a requirement that cannot be worked around is unmet, such as a licence.
78
84
 
79
- Write the table first and take the count from it. The opening sentence counts every
80
- required item that is `Not met` or `Partly`, not only the worst one: "four of the six required items aren't met: the degree, the team size,
81
- advanced Excel and SAP". It must agree with the table below it. Give the verdict on what
85
+ Write the table first, then write the opening from it. The opening names every required
86
+ item that is `Not met` or `Partly`, copied from those rows: "the degree, the team size,
87
+ advanced Excel and SAP aren't met". Name them; do not count them, and do not sum them up
88
+ in a number or a fraction anywhere in the reply. When two figures differ, give both and
89
+ leave the comparison there: "12 against 20 or more", not "less than half". Give the verdict on what
82
90
  you know now; say what answer would raise it, but do not make the verdict wait on the
83
91
  answer. Do not soften a long shot into encouragement, do not harden a workable gap into a
84
92
  refusal, and do not give a percentage.
@@ -93,14 +101,17 @@ These four rules outrank the steps below.
93
101
  required item is not shown, ask once whether anything outside the resume covers it: a
94
102
  side project, a repository, a portfolio, a volunteer role. People leave their best
95
103
  evidence off the page. Anything you credited from another file goes here too, as a line
96
- to add to the resume. Never tell
97
- them to add a keyword they have not said is true, and do not end on a list of questions
98
- with no advice.
104
+ to add to the resume. Never ask
105
+ something the resume already answers. Never tell them to add a keyword they have not said
106
+ is true, or to reword a `Partly` so it reads as `Met`: "supported renewals" stays
107
+ supported, and the advice is how to present it honestly. Do not end on a list of
108
+ questions with no advice.
99
109
 
100
110
  8. **Lay the reply out in this order:** the answer and verdict; what could get it rejected;
101
111
  one table covering every requirement (requirement, required or preferred, status,
102
112
  evidence); what to bring forward; what to do next. Each requirement appears in the table
103
- once and nothing is repeated in a second table or restated section by section.
113
+ once and nothing is repeated in a second table or restated section by section. A gap is
114
+ described where it first appears and only named after that.
104
115
 
105
116
  Match the length to what you were given. A short posting and a few lines about the person
106
117
  gets a short answer: the verdict, one line per requirement, and what to do, in under 250
@@ -140,6 +151,9 @@ posting**, ask for the posting in one line: there is nothing to compare against.
140
151
  person's evening.
141
152
  - ❌ **Crediting the usual.** "As a nurse you will have used Epic" is an invention.
142
153
  - ❌ **Treating a similar tool as the named one.**
154
+ - ❌ **A count that disagrees with the table.** Name the gaps; a number invites the error.
155
+ - ❌ **Hedging everything.** A table of `Partly` tells the person nothing.
156
+ - ❌ **Coaching the wording past the facts.** Advising that "supported" be written as "owned".
143
157
  - ❌ **Advising them to add keywords** so the resume passes a filter. If it isn't true it
144
158
  doesn't go in.
145
159
  - ❌ **Judging the person.** No remarks on age, gaps, family, health or anything a recruiter
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "job-fit-analysis",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Compare a job posting with a resume and say honestly whether to apply: each requirement marked met, partly met, not shown or not met, with the resume line it rests on; the requirements an employer screens on listed first; and the questions whose answers would change the picture. Works for any occupation and level. Use when the user asks \"am I a good fit for this job\", \"should I apply for this\", \"how does my resume match this posting\", or wants the gaps between a job description and their CV before applying.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -44,6 +44,36 @@
44
44
  "Any export column names it uses are marked as assumed, since no export layout was given",
45
45
  "It does not state a response-time target or SLA figure as the team's own, since none was given"
46
46
  ]
47
+ },
48
+ {
49
+ "id": 4,
50
+ "held_out": "2026-10-06",
51
+ "prompt": "Ops and customer care at Tarn Valley Heating both report first-time fix rate and they're miles apart. The Slack thread is in thread.md and the tables are in tables.md (we're on Snowflake). The FD wants one number for the board pack, ready on the 1st of each month, shown next to last September. Can you write the definition — one page, with the SQL underneath?",
52
+ "assertions": [
53
+ "It points out that 3,912 out of 4,830 is 81%, not the 84% quoted in the thread",
54
+ "The definition counts a repair as not fixed first time when there is a return visit within a stated number of days, and does not rely only on the engineer's follow_up_required flag",
55
+ "It explains the gap between the two teams' figures: 630 of the 3,912 repairs with no follow-up flag had a return visit within 30 days, leaving 3,282 (68%)",
56
+ "A return visit is counted whether it was logged as a 'recall' or as a new 'repair', and recall visits are not themselves added to the denominator as fresh repairs",
57
+ "It says the month's figure cannot be final on the 1st of the next month because the return window has not yet run for late-month repairs, and proposes a provisional figure, a lag or a shorter window",
58
+ "It says a like-for-like comparison with September 2025 is not possible by appliance because appliance_id is empty before 3 March 2026, and says what to do instead (match by address for both periods, or mark the comparison as not comparable)",
59
+ "The SQL uses only the tables and columns listed in tables.md, restricts the denominator to completed repairs, and does not invent a column linking a return visit to its original job",
60
+ "It leaves the metric owner as an open decision, noting the previous owner left in August, and says whether subcontractor jobs are included"
61
+ ]
62
+ },
63
+ {
64
+ "id": 5,
65
+ "held_out": "2026-10-06",
66
+ "prompt": "I run a coffee subscription box, just me and one part-timer. An investor asked what our monthly churn is and I realised I've never actually defined it. Billing is on Stripe and I keep a Google Sheet of subscribers. September: started the month with 312 subscribers, 21 cancelled, 9 paused (people can pause for a month or two instead of cancelling), 34 new signed up. Can you give me a quick definition I can stick to every month, and the September number for the investor update?",
67
+ "assertions": [
68
+ "It delivers a written definition and a September figure in the reply, and does not stop at a list of questions",
69
+ "The denominator is stated as subscribers active at the start of the month (312), and the 34 new sign-ups are not netted off against cancellations",
70
+ "It gives September churn on cancellations alone as 21 out of 312, about 6.7%",
71
+ "It does not decide silently whether pauses count: it states the choice made and gives the figure with pauses included, 30 out of 312, about 9.6%",
72
+ "It says revenue churn cannot be worked out from what was given because no prices or plan amounts were provided, and it does not invent a price",
73
+ "It says whether a cancellation is counted in the month the subscriber cancels or the month their paid period ends",
74
+ "It does not quote an industry-average or benchmark churn figure as fact",
75
+ "Any Stripe field names or sheet column names it uses are marked as assumed, since none were given"
76
+ ]
47
77
  }
48
78
  ]
49
79
  }
@@ -0,0 +1,32 @@
1
+ # Tables (Snowflake, database TARNVALLEY)
2
+
3
+ ## FIELD.JOBS — one row per visit
4
+ | column | type | notes |
5
+ |---|---|---|
6
+ | job_id | NUMBER | primary key |
7
+ | address_id | NUMBER | always filled |
8
+ | appliance_id | NUMBER | NULL for every job before 2026-03-03 |
9
+ | job_type | VARCHAR | 'repair', 'recall', 'annual_service', 'install' |
10
+ | status | VARCHAR | 'completed', 'cancelled', 'no_access' |
11
+ | follow_up_required | BOOLEAN | ticked by the engineer on closing the job |
12
+ | engineer_id | NUMBER | |
13
+ | created_at | TIMESTAMP_NTZ | UK local time, when the job was booked |
14
+ | completed_at | TIMESTAMP_NTZ | UK local time, NULL unless status = 'completed' |
15
+
16
+ There is no column that links a recall, or any later visit, to the job it follows.
17
+
18
+ ## FIELD.APPLIANCES
19
+ | column | type | notes |
20
+ |---|---|---|
21
+ | appliance_id | NUMBER | primary key |
22
+ | address_id | NUMBER | |
23
+ | make | VARCHAR | |
24
+ | model | VARCHAR | |
25
+ | installed_on | DATE | often NULL |
26
+
27
+ ## FIELD.ENGINEERS
28
+ | column | type | notes |
29
+ |---|---|---|
30
+ | engineer_id | NUMBER | primary key |
31
+ | region | VARCHAR | 'north', 'central', 'coast' |
32
+ | employment_type | VARCHAR | 'employed', 'subcontractor' |
@@ -0,0 +1,31 @@
1
+ # #ops-reporting — export, 1–2 October 2026
2
+
3
+ **Gethin Aldous (Regional Ops Manager), 1 Oct 09:12**
4
+ September first-time fix is in. 3,912 of 4,830 completed repairs closed with no follow-up flag. That's 84%. Best month this year.
5
+
6
+ **Roisin Fairweather (Customer Care Lead), 1 Oct 09:40**
7
+ We get 68%. 3,282 of 4,830. We only count a repair as fixed if nobody had to go back within 30 days.
8
+
9
+ **Gethin Aldous, 1 Oct 09:44**
10
+ The engineer ticks follow_up_required when the job needs another visit. That is the record. If they didn't tick it, it was fixed.
11
+
12
+ **Roisin Fairweather, 1 Oct 09:58**
13
+ They don't tick it when they think it's fixed and it isn't. 630 of your 3,912 had someone back out within 30 days. Those customers rang us, not you.
14
+ And you can't just count recalls either. The contact centre logs about half of the go-backs as a brand new repair instead of a recall, because that's the default in the booking screen.
15
+
16
+ **Gethin Aldous, 1 Oct 10:03**
17
+ For what it's worth 4,830 already leaves out cancelled and no-access visits. We agree on that at least.
18
+
19
+ **Nkechi Brandt (BI Analyst), 1 Oct 10:20**
20
+ I pulled both sets of numbers this morning. Two things from the data side:
21
+ - appliance_id has only been filled in since 3 March 2026 when the new engineer app went live. Before that it's NULL and all you have is address_id.
22
+ - Some addresses have more than one appliance (HMOs, small commercial units). So "same address" and "same appliance" are not the same test.
23
+
24
+ **Owen Prys (Finance Director), 2 Oct 08:15**
25
+ The board pack needs one number, ready on the 1st of each month, with last September next to it for comparison. Subcontractors in or out, I don't mind, just tell me which. And who owns this going forward?
26
+
27
+ **Gethin Aldous, 2 Oct 08:31**
28
+ It was Marguerite's before she left in August. Nobody has picked it up.
29
+
30
+ **Roisin Fairweather, 2 Oct 08:40**
31
+ Installs and annual services shouldn't be anywhere near this, by the way. It's a repair measure.
@@ -43,6 +43,36 @@
43
43
  "It does not invent the director's name, the team's name, team members other than Priya, or a specific repo folder stated as fact",
44
44
  "The test cases use realistic pasted standup notes as input, and at least one covers thin or missing notes"
45
45
  ]
46
+ },
47
+ {
48
+ "id": 4,
49
+ "held_out": "2026-10-06",
50
+ "prompt": "Our library systems team keeps a small skills repo, it's this folder (CONTRIBUTING.md, registry.json, a couple of existing skills under skills/). I want to add one called ILL_Request_Triage. Staff paste in an interlibrary loan request from the request form export (patron name, card number, the title, author, year published, list price, and whether the catalogue check found a copy on our shelves) and it says which of our four routes the request goes down, with a one-line reason:\n\n- fill from our own stock, if the catalogue check says we hold a copy that's on the shelf\n- borrow through the Northmere Consortium, if we don't hold it and it was published more than 2 years ago\n- buy it, if we don't hold it, it was published in the last 2 years and the list price is under £60\n\nCategory is resource-sharing, maintainer is resource-sharing@harrowgate.example. Can you write up everything I need for the pull request?",
51
+ "assertions": [
52
+ "The skill's metadata is delivered as a skill.toml file alongside PROMPT.md and an examples folder, and no meta.json is created for the new skill",
53
+ "The skill is given a lowercase hyphenated name that starts with a verb and spells out interlibrary loan (for example triage-interlibrary-loan-requests), not ILL_Request_Triage or a name containing the abbreviation ill, and the reply tells the author the name was changed to fit the naming rules",
54
+ "handles_patron_data is set to true, and the skill's instructions tell the assistant not to repeat the library card number in its output",
55
+ "The reply tells the author that four routes were mentioned but only three were described, and does not write a rule for a fourth route as though the author had given one",
56
+ "It points out at least one request the stated rules do not cover, such as a title published in the last 2 years with a list price of £60 or more, or a copy we hold that is out on loan",
57
+ "The skill's instructions carry the 2-year and £60 thresholds exactly as given and introduce no other price or age threshold",
58
+ "There are at least three example input/expected pairs, and at least one is an awkward case such as a request with a field missing",
59
+ "A registry.json entry for the new skill is provided with category resource-sharing and maintainer resource-sharing@harrowgate.example"
60
+ ]
61
+ },
62
+ {
63
+ "id": 5,
64
+ "held_out": "2026-10-06",
65
+ "prompt": "my cofounder keeps saying we should have a 'skill' so our coding agent writes the release notes instead of me doing it every other friday. input is the list of merged PR titles since the last release, output is the notes we post for customers (they're shop owners, not devs). some PRs shouldn't show up publicly, security fixes mostly, so handle that somehow. we're 4 people and don't have a skills setup yet, i think it'd go in .claude/skills in the main repo but not sure that's right. keep it small, one file if possible, plus a couple of examples i can try it on",
66
+ "assertions": [
67
+ "It delivers a drafted instruction file for the release-notes skill and at least two example inputs to try it on, and does not stop at a list of questions",
68
+ "The skill itself is one instruction file, with no separate manifest, metadata file or multi-file package presented as required",
69
+ "It says where the skill should live is unconfirmed, treating .claude/skills as the author's guess to check, not as an established fact about their repo",
70
+ "The skill's instructions tell it to write only from the PR titles it is given and not to add features, fixes or details the titles do not contain",
71
+ "The skill's instructions tell it to write for shop owners in plain language, not to copy developer-facing PR titles through as they are",
72
+ "The skill's instructions keep security-fix PRs out of the public notes or set them aside for a person to decide, and the reply says the exact rule for what stays private is the author's to confirm",
73
+ "At least one of the examples includes a security-fix PR title",
74
+ "It does not invent a product name, a company name, a version number scheme, PR label names or a command for fetching the PR titles and state it as fact"
75
+ ]
46
76
  }
47
77
  ]
48
78
  }
@@ -0,0 +1,63 @@
1
+ # Contributing a skill
2
+
3
+ Harrowgate University Library, Systems & Discovery team. Last revised 12 March 2026.
4
+
5
+ Skills are short instruction files our staff assistant loads when a member of staff
6
+ asks for a particular job. Six of us maintain them. Keep them small.
7
+
8
+ ## Layout
9
+
10
+ Each skill is one folder under `skills/`:
11
+
12
+ ```
13
+ skills/<name>/
14
+ skill.toml metadata
15
+ PROMPT.md the instructions the assistant follows
16
+ examples/
17
+ 01-input.md what a member of staff would paste
18
+ 01-expected.md what a good answer looks like
19
+ 02-input.md
20
+ ...
21
+ ```
22
+
23
+ At least three input/expected pairs. One of them must be an awkward case (missing
24
+ field, contradictory request, nothing to do).
25
+
26
+ Since March 2026 metadata lives in `skill.toml`. A few older skills still carry a
27
+ `meta.json` until someone migrates them. New skills must not add one.
28
+
29
+ ## skill.toml
30
+
31
+ ```toml
32
+ name = "summarise-reading-list" # same as the folder name
33
+ summary = "One sentence, 120 characters at most."
34
+ category = "cataloguing" # one of the categories in registry.json
35
+ maintainer = "alias@harrowgate.example"
36
+ handles_patron_data = false
37
+ version = "0.1.0" # new skills start at 0.1.0
38
+ ```
39
+
40
+ ## Naming
41
+
42
+ - lowercase, words joined with hyphens
43
+ - starts with a verb (`summarise-`, `flag-`, `draft-`)
44
+ - no abbreviations a new member of staff would not know. Write `interlibrary-loan`,
45
+ not `ill`; write `reading-list`, not `rl`.
46
+ - 40 characters at most
47
+
48
+ ## Patron data
49
+
50
+ If the input a skill receives can contain patron names, library card numbers or
51
+ contact details, set `handles_patron_data = true`, and PROMPT.md must tell the
52
+ assistant never to repeat a library card number in its output (refer to the patron
53
+ by name or by request number instead).
54
+
55
+ ## Registry
56
+
57
+ Add one entry for the skill to the `skills` list in `registry.json` (name, category,
58
+ maintainer). Keep the list in alphabetical order by name.
59
+
60
+ ## Before you open a pull request
61
+
62
+ Run `python3 tools/lint_skills.py` from the repo root. It checks the layout, the
63
+ naming rules and that every skill is in the registry.
@@ -0,0 +1,15 @@
1
+ {
2
+ "categories": ["acquisitions", "cataloguing", "circulation", "resource-sharing"],
3
+ "skills": [
4
+ {
5
+ "name": "flag-overdue-holds",
6
+ "category": "circulation",
7
+ "maintainer": "circdesk@harrowgate.example"
8
+ },
9
+ {
10
+ "name": "summarise-reading-list",
11
+ "category": "cataloguing",
12
+ "maintainer": "metadata@harrowgate.example"
13
+ }
14
+ ]
15
+ }
@@ -0,0 +1,10 @@
1
+ # flag-overdue-holds
2
+
3
+ You are given the hold-shelf report: one line per item with request number, title,
4
+ patron name, card number and the date the item was shelved.
5
+
6
+ 1. List every item shelved more than 7 days before the report date, oldest first.
7
+ 2. For each, give the request number, the title and the patron's name.
8
+ 3. Never repeat a library card number. Refer to the patron by name.
9
+
10
+ If nothing is over 7 days, say so.
@@ -0,0 +1,2 @@
1
+ 1 item over 7 days:
2
+ - R-88121, Silent Spring, Amara Okoye (shelved 2026-02-09)
@@ -0,0 +1,3 @@
1
+ Report date 2026-02-20
2
+ R-88121 | Silent Spring | Amara Okoye | 2100457781 | 2026-02-09
3
+ R-88160 | The Peregrine | Jonas Lind | 2100331290 | 2026-02-17
@@ -0,0 +1,2 @@
1
+ Report date 2026-02-20
2
+ R-88160 | The Peregrine | Jonas Lind | 2100331290 | 2026-02-17
@@ -0,0 +1 @@
1
+ Nothing can be flagged: R-88171 (Waterlog, Petra Havel) has no shelved date.
@@ -0,0 +1,2 @@
1
+ Report date 2026-02-20
2
+ R-88171 | Waterlog | Petra Havel | 2100778123 |
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "flag-overdue-holds",
3
+ "summary": "Lists hold-shelf items uncollected for more than 7 days so the desk can release them.",
4
+ "category": "circulation",
5
+ "maintainer": "circdesk@harrowgate.example",
6
+ "version": "1.2.0"
7
+ }
@@ -0,0 +1,11 @@
1
+ # summarise-reading-list
2
+
3
+ You are given a module reading list pasted from the reading list system: one item
4
+ per line, with title, author, year, format and a `held` column (yes/no).
5
+
6
+ 1. Count the items by format (book, e-book, article, other).
7
+ 2. List every item where `held` is `no`, with title, author and year.
8
+ 3. If a line has no `held` value, list it separately under "Holding not stated".
9
+ Do not guess.
10
+
11
+ Never add items that are not in the pasted list. If the list is empty, say so and stop.
@@ -0,0 +1,4 @@
1
+ Books: 2, e-books: 1.
2
+
3
+ Not held:
4
+ - Landscape and Memory, Schama, 1995
@@ -0,0 +1,4 @@
1
+ Module HIS2041
2
+ The Making of the English Landscape | Hoskins | 1955 | book | yes
3
+ Landscape and Memory | Schama | 1995 | book | no
4
+ Fields of Vision | Daniels | 1993 | e-book | yes
@@ -0,0 +1,6 @@
1
+ Books: 1.
2
+
3
+ Not held: none.
4
+
5
+ Holding not stated:
6
+ - An Atlas of Rural Settlement, Roberts, 2000
@@ -0,0 +1,2 @@
1
+ Module GEO1010
2
+ An Atlas of Rural Settlement | Roberts | 2000 | book |
@@ -0,0 +1,6 @@
1
+ name = "summarise-reading-list"
2
+ summary = "Turns a module reading list into a count of items by format and a list of titles we do not hold."
3
+ category = "cataloguing"
4
+ maintainer = "metadata@harrowgate.example"
5
+ handles_patron_data = false
6
+ version = "0.3.0"