skilldrop-cli 0.16.7 → 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.
- package/README.md +1 -1
- package/catalogue.json +3 -2
- package/model-routing.json +4 -0
- package/package.json +1 -1
- package/packs/ai-engineering/skills/ai-usage-policy/evals/evals.json +30 -0
- package/packs/ai-engineering/skills/ai-usage-policy/evals/files/4/ciso-brief.md +15 -0
- package/packs/ai-engineering/skills/ai-usage-policy/evals/files/4/incident-summary.md +22 -0
- package/packs/ai-engineering/skills/ai-usage-policy/evals/files/4/legal-notes.md +14 -0
- package/packs/ai-engineering/skills/ai-usage-policy/evals/files/4/tool-inventory.csv +5 -0
- package/packs/api-builder/skills/tool-use-schema-writer/evals/evals.json +30 -0
- package/packs/api-builder/skills/tool-use-schema-writer/evals/files/4/refunds.openapi.yaml +63 -0
- package/packs/career/loops/apply/LOOP.md +19 -10
- package/packs/career/loops/apply/loop.json +9 -3
- package/packs/career/pack.json +27 -7
- package/packs/career/skills/application-form-answers/SKILL.md +146 -0
- package/packs/career/skills/application-form-answers/evals/eval_queries.json +34 -0
- package/packs/career/skills/application-form-answers/evals/evals.json +103 -0
- package/packs/career/skills/application-form-answers/evals/files/1/form.md +17 -0
- package/packs/career/skills/application-form-answers/evals/files/1/posting.md +20 -0
- package/packs/career/skills/application-form-answers/evals/files/1/resume.md +32 -0
- package/packs/career/skills/application-form-answers/evals/files/2/form.md +15 -0
- package/packs/career/skills/application-form-answers/evals/files/2/posting.md +21 -0
- package/packs/career/skills/application-form-answers/evals/files/2/resume.md +32 -0
- package/packs/career/skills/application-form-answers/evals/files/4/form.md +14 -0
- package/packs/career/skills/application-form-answers/evals/files/4/posting.md +25 -0
- package/packs/career/skills/application-form-answers/evals/files/4/resume.md +29 -0
- package/packs/career/skills/application-form-answers/evals/files/5/form.md +15 -0
- package/packs/career/skills/application-form-answers/evals/files/5/posting.md +18 -0
- package/packs/career/skills/application-form-answers/evals/files/5/resume.md +23 -0
- package/packs/career/skills/application-form-answers/evals/files/6/form.md +11 -0
- package/packs/career/skills/application-form-answers/evals/files/6/posting.md +28 -0
- package/packs/career/skills/application-form-answers/evals/files/6/resume.md +35 -0
- package/packs/career/skills/application-form-answers/evals/files/7/form.md +11 -0
- package/packs/career/skills/application-form-answers/evals/files/7/posting.md +19 -0
- package/packs/career/skills/application-form-answers/evals/files/7/resume.md +26 -0
- package/packs/career/skills/application-form-answers/manifest.json +31 -0
- package/packs/career/skills/cover-letter/scripts/claim_check.py +7 -4
- package/packs/career/skills/job-fit-analysis/SKILL.md +46 -16
- package/packs/career/skills/job-fit-analysis/evals/evals.json +26 -0
- package/packs/career/skills/job-fit-analysis/evals/files/6/linkedin-about.txt +5 -0
- package/packs/career/skills/job-fit-analysis/evals/files/6/posting.md +25 -0
- package/packs/career/skills/job-fit-analysis/evals/files/6/resume.md +35 -0
- package/packs/career/skills/job-fit-analysis/evals/files/7/resume.md +32 -0
- package/packs/career/skills/job-fit-analysis/manifest.json +1 -1
- package/packs/career/skills/resume-tailor/SKILL.md +37 -9
- package/packs/career/skills/resume-tailor/evals/evals.json +28 -0
- package/packs/career/skills/resume-tailor/evals/files/8/posting.md +25 -0
- package/packs/career/skills/resume-tailor/evals/files/8/resume.typ +31 -0
- package/packs/career/skills/resume-tailor/evals/files/9/linkedin-about.txt +5 -0
- package/packs/career/skills/resume-tailor/evals/files/9/posting.md +25 -0
- package/packs/career/skills/resume-tailor/evals/files/9/resume.md +35 -0
- package/packs/career/skills/resume-tailor/manifest.json +1 -1
- package/packs/career/skills/resume-tailor/scripts/claim_check.py +7 -4
- package/packs/data-analytics/skills/metric-definition/evals/evals.json +30 -0
- package/packs/data-analytics/skills/metric-definition/evals/files/4/tables.md +32 -0
- package/packs/data-analytics/skills/metric-definition/evals/files/4/thread.md +31 -0
- package/packs/dev-team/skills/contribution-wizard/evals/evals.json +30 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/CONTRIBUTING.md +63 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/registry.json +15 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/PROMPT.md +10 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/01-expected.md +2 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/01-input.md +3 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/02-expected.md +1 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/02-input.md +2 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/03-expected.md +1 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/03-input.md +2 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/meta.json +7 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/PROMPT.md +11 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/01-expected.md +4 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/01-input.md +4 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/02-expected.md +6 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/02-input.md +2 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/03-expected.md +1 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/03-input.md +1 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/skill.toml +6 -0
- package/packs/dev-team/skills/devils-advocate/evals/evals.json +29 -0
- package/packs/dev-team/skills/devils-advocate/evals/files/4/lateFees.test.ts +46 -0
- package/packs/dev-team/skills/devils-advocate/evals/files/4/lateFees.ts +46 -0
- package/packs/dev-team/skills/release-notes/evals/evals.json +29 -0
- package/packs/dev-team/skills/release-notes/evals/files/4/git-log.txt +26 -0
- package/packs/research/skills/source-synthesis/evals/evals.json +30 -0
- package/packs/research/skills/source-synthesis/evals/files/4/behaviour-logs.md +31 -0
- package/packs/research/skills/source-synthesis/evals/files/4/parent-survey.md +25 -0
- package/packs/research/skills/source-synthesis/evals/files/4/pilot-report.md +27 -0
- package/packs/research/skills/source-synthesis/evals/files/4/teacher-focus-group.md +19 -0
- package/packs/research/skills/source-synthesis/evals/files/4/vendor-brochure.md +18 -0
- package/packs/solution-architect/skills/db-schema-design/evals/evals.json +30 -0
- package/packs/solution-architect/skills/db-schema-design/evals/files/4/finance-email.md +18 -0
- package/packs/solution-architect/skills/db-schema-design/evals/files/4/members_sample.csv +5 -0
- package/packs/solution-architect/skills/db-schema-design/evals/files/4/points_txn_sample.csv +17 -0
- package/packs/solution-architect/skills/db-schema-design/evals/files/4/requirements.md +28 -0
- package/packs/solution-architect/skills/design-doc/evals/evals.json +29 -0
- package/packs/solution-architect/skills/design-doc/evals/files/4/request.md +31 -0
- package/packs/solution-architect/skills/design-doc/evals/files/4/systems.md +40 -0
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/evals.json +29 -0
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/files/4/mobile-options.md +45 -0
- package/packs/sre-oncall/skills/postmortem-generator/evals/evals.json +30 -0
- package/packs/sre-oncall/skills/postmortem-generator/evals/files/4/finance-recon.md +28 -0
- package/packs/sre-oncall/skills/postmortem-generator/evals/files/4/incident-channel.txt +34 -0
- package/packs/sre-oncall/skills/postmortem-generator/evals/files/4/scheduler-log.txt +15 -0
- package/packs/stakeholder-comms/skills/guide-builder/evals/evals.json +30 -0
- package/packs/stakeholder-comms/skills/guide-builder/evals/files/4/handover-thread.txt +39 -0
- package/packs/stakeholder-comms/skills/guide-builder/evals/files/4/it-notes.txt +21 -0
|
@@ -25,25 +25,42 @@ These four rules outrank the steps below.
|
|
|
25
25
|
"the candidate". Plain words, no scoring jargon, no mention of this skill. When they gave
|
|
26
26
|
you a few lines and no resume, say "what you told me", never "your resume".
|
|
27
27
|
|
|
28
|
-
1. **Read the
|
|
28
|
+
1. **Read everything the person gave you.** The resume is the main evidence, and so is
|
|
29
|
+
any other file of theirs they point to or that sits beside it: a LinkedIn summary, a
|
|
30
|
+
portfolio page, a project's README. Evidence from one of those counts in full: mark the
|
|
31
|
+
requirement `Met` or `Partly` on the strength of it, say where it came from, and say it
|
|
32
|
+
is not on the resume yet, because the employer will only see the resume.
|
|
33
|
+
|
|
34
|
+
When the posting is a link, read the full text. If you cannot open it, say so in one line
|
|
35
|
+
and ask for the text pasted in. Give no verdict and list no requirements for a posting you
|
|
36
|
+
have not read, and never rebuild one from what you remember of the employer. Do not guess
|
|
37
|
+
at why the link would not open.
|
|
38
|
+
|
|
39
|
+
2. **List the posting's requirements.** Keep the employer's own wording. Sort
|
|
29
40
|
them into what the posting calls required and what it calls preferred. When the posting
|
|
30
41
|
doesn't say, treat what it lists first or repeats as required, and say you inferred it.
|
|
31
42
|
|
|
32
|
-
|
|
43
|
+
3. **Find what could get the application rejected.** Two kinds of requirement do it: the
|
|
33
44
|
ones a recruiter or an application form checks before anyone reads the rest (a licence or
|
|
34
45
|
registration, a degree, a certification, a minimum number of years, the right to work,
|
|
35
46
|
location or shift, a clearance, a language), and any other required item the resume does
|
|
36
47
|
not meet, such as a named system the posting lists under "must have". These go first,
|
|
37
48
|
because one of them outweighs five met skills.
|
|
38
49
|
|
|
39
|
-
|
|
50
|
+
4. **Mark each requirement against the evidence** with one of four words:
|
|
40
51
|
- **Met**: the resume shows it. Quote the line.
|
|
41
52
|
- **Partly**: the resume shows something close, smaller or older. Say what it shows and
|
|
42
53
|
what is short: "team of 12; the posting asks for 20 or more".
|
|
43
|
-
- **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.
|
|
44
55
|
- **Not met**: the resume shows otherwise, such as a diploma where a degree is required
|
|
45
56
|
or two years where five are asked for.
|
|
46
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
|
+
|
|
47
64
|
A similar tool is not the named tool. Cerner is not Epic, an in-house warehouse system is
|
|
48
65
|
not SAP: when the posting requires the named one, mark it `Not met` and give the similar
|
|
49
66
|
one as the nearest thing you have. A related task is not the named skill: cashing up a
|
|
@@ -54,7 +71,7 @@ These four rules outrank the steps below.
|
|
|
54
71
|
date, mark it `Partly`, say the resume doesn't show how long, and ask. Never state a
|
|
55
72
|
duration you worked out from a neighbouring date.
|
|
56
73
|
|
|
57
|
-
|
|
74
|
+
5. **Give a verdict the person can act on.** Open with a plain sentence that says whether
|
|
58
75
|
to apply, in the terms they asked ("Yes, apply", "Apply, but expect the degree to be a
|
|
59
76
|
problem", "Probably not worth your weekend unless..."), then one of four labels and the
|
|
60
77
|
reason:
|
|
@@ -65,27 +82,36 @@ These four rules outrank the steps below.
|
|
|
65
82
|
true for it to be worth the time, and whether you would still send it.
|
|
66
83
|
- **Not a match**: a requirement that cannot be worked around is unmet, such as a licence.
|
|
67
84
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
advanced Excel and SAP".
|
|
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
|
|
71
90
|
you know now; say what answer would raise it, but do not make the verdict wait on the
|
|
72
91
|
answer. Do not soften a long shot into encouragement, do not harden a workable gap into a
|
|
73
92
|
refusal, and do not give a percentage.
|
|
74
93
|
|
|
75
|
-
|
|
94
|
+
6. **Say what to bring forward.** List the two to four things already in the resume that
|
|
76
95
|
answer the posting best and are buried, understated or worded differently from the
|
|
77
96
|
posting. Give the resume's wording and the posting's wording side by side.
|
|
78
97
|
|
|
79
|
-
|
|
98
|
+
7. **Close with what to do next**, in two to four lines: what to lead the application with,
|
|
80
99
|
what to say about the main gap, and the one or two questions whose answers would change
|
|
81
|
-
the verdict ("Have you used Epic anywhere? If so, where and for how long?").
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
100
|
+
the verdict ("Have you used Epic anywhere? If so, where and for how long?"). When a
|
|
101
|
+
required item is not shown, ask once whether anything outside the resume covers it: a
|
|
102
|
+
side project, a repository, a portfolio, a volunteer role. People leave their best
|
|
103
|
+
evidence off the page. Anything you credited from another file goes here too, as a line
|
|
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.
|
|
109
|
+
|
|
110
|
+
8. **Lay the reply out in this order:** the answer and verdict; what could get it rejected;
|
|
86
111
|
one table covering every requirement (requirement, required or preferred, status,
|
|
87
112
|
evidence); what to bring forward; what to do next. Each requirement appears in the table
|
|
88
|
-
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.
|
|
89
115
|
|
|
90
116
|
Match the length to what you were given. A short posting and a few lines about the person
|
|
91
117
|
gets a short answer: the verdict, one line per requirement, and what to do, in under 250
|
|
@@ -125,10 +151,14 @@ posting**, ask for the posting in one line: there is nothing to compare against.
|
|
|
125
151
|
person's evening.
|
|
126
152
|
- ❌ **Crediting the usual.** "As a nurse you will have used Epic" is an invention.
|
|
127
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".
|
|
128
157
|
- ❌ **Advising them to add keywords** so the resume passes a filter. If it isn't true it
|
|
129
158
|
doesn't go in.
|
|
130
159
|
- ❌ **Judging the person.** No remarks on age, gaps, family, health or anything a recruiter
|
|
131
160
|
may not lawfully weigh.
|
|
161
|
+
- ❌ **Inventing the posting.** A link you could not open is not a posting you have read.
|
|
132
162
|
- ❌ **Answering in a file.** They asked a question; the answer belongs in the reply.
|
|
133
163
|
- ❌ **A verdict with no advice.** "Long shot" followed by questions leaves them where they
|
|
134
164
|
started.
|
|
@@ -71,6 +71,32 @@
|
|
|
71
71
|
"The reply gives a clear answer on whether it is realistic",
|
|
72
72
|
"It does not credit him with a qualification, a cover count, a team size or a system that is not in the CV"
|
|
73
73
|
]
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"id": 6,
|
|
77
|
+
"prompt": "Am I a fit for this? CV is resume.md, job is posting.md. My LinkedIn about text is in linkedin-about.txt too.",
|
|
78
|
+
"assertions": [
|
|
79
|
+
"The onboarding or training requirement is credited from the monthly onboarding webinar described in the LinkedIn text",
|
|
80
|
+
"The reply says that evidence is not on the CV and should be added to it",
|
|
81
|
+
"Owning renewals is marked partly or not met: she supported renewals alongside the account managers and did not own them",
|
|
82
|
+
"The 3+ years in customer success or account management is marked not met or partly: her roles are in support",
|
|
83
|
+
"Gainsight is marked not shown or not met, and Salesforce is credited from the CV",
|
|
84
|
+
"Leading a small team is marked met from leading 6 support agents",
|
|
85
|
+
"Working with a product team on feedback is credited from the Customer Advisory Board or the ticket-trends report",
|
|
86
|
+
"The reply opens with a clear answer on whether to apply"
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"id": 7,
|
|
91
|
+
"prompt": "Would I be a fit for this one? https://careers.brightloop.example/jobs/4471 - my CV is resume.md",
|
|
92
|
+
"assertions": [
|
|
93
|
+
"The reply says it could not open or read the link",
|
|
94
|
+
"It asks for the posting's text to be pasted in or saved as a file",
|
|
95
|
+
"It does not list the job's requirements or mark any as met or not met, as though it had read the posting",
|
|
96
|
+
"It gives no verdict on fit",
|
|
97
|
+
"It does not state what Brightloop does or what the role involves",
|
|
98
|
+
"The reply is short, about 120 words or fewer"
|
|
99
|
+
]
|
|
74
100
|
}
|
|
75
101
|
]
|
|
76
102
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
About
|
|
2
|
+
|
|
3
|
+
I lead the support team at Hart & Lowe Software. Since January 2024 I've also run our monthly onboarding webinar for new customers, usually around 30 people on the call, and I co-chair the Customer Advisory Board with our Head of Product (8 customers, meets twice a year).
|
|
4
|
+
|
|
5
|
+
Outside work I volunteer as a reading mentor at a primary school.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Customer Success Manager
|
|
2
|
+
|
|
3
|
+
**Brightloop** · Manchester (hybrid) · £48,000 – £55,000
|
|
4
|
+
|
|
5
|
+
Brightloop makes scheduling software for 900 dental and veterinary practices.
|
|
6
|
+
|
|
7
|
+
## What you'll do
|
|
8
|
+
|
|
9
|
+
- Own a book of 60 mid-market accounts and be accountable for their renewals
|
|
10
|
+
- Run onboarding and training for new customers
|
|
11
|
+
- Lead quarterly business reviews
|
|
12
|
+
- Bring customer feedback to the product team
|
|
13
|
+
|
|
14
|
+
## What we need
|
|
15
|
+
|
|
16
|
+
- 3+ years in customer success or account management at a B2B software company
|
|
17
|
+
- Experience owning renewals or a revenue target
|
|
18
|
+
- Experience running customer onboarding or training
|
|
19
|
+
- Confident with Salesforce and a customer success platform such as Gainsight
|
|
20
|
+
- Experience leading or mentoring a small team
|
|
21
|
+
|
|
22
|
+
## Nice to have
|
|
23
|
+
|
|
24
|
+
- A customer success certification
|
|
25
|
+
- Experience working with a product team on customer feedback
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Nadia Rahman
|
|
2
|
+
|
|
3
|
+
Manchester · nadia.rahman@example.com · 07700 900612
|
|
4
|
+
|
|
5
|
+
## Profile
|
|
6
|
+
|
|
7
|
+
Support team lead with seven years in B2B software support.
|
|
8
|
+
|
|
9
|
+
## Experience
|
|
10
|
+
|
|
11
|
+
**Support Team Lead** · Hart & Lowe Software · March 2022 – present
|
|
12
|
+
|
|
13
|
+
- Lead a team of 6 support agents covering 310 customer accounts.
|
|
14
|
+
- Supported renewals for 40 accounts worth $1.2M a year by joining the account managers' quarterly reviews.
|
|
15
|
+
- Cut median first-response time from 9 hours to 3 hours by rewriting the triage rules in Zendesk.
|
|
16
|
+
- Built the weekly ticket-trends report in Salesforce that the Research & Insights team uses to plan fixes.
|
|
17
|
+
- Wrote 35 help-centre articles; self-service now resolves about a quarter of new tickets.
|
|
18
|
+
- Hire and onboard new agents; 4 hired since 2023.
|
|
19
|
+
|
|
20
|
+
**Support Agent, then Senior Support Agent** · Hart & Lowe Software · June 2019 – March 2022
|
|
21
|
+
|
|
22
|
+
- Handled billing and integration tickets for mid-market customers.
|
|
23
|
+
- Trained 5 new agents on the billing queue.
|
|
24
|
+
|
|
25
|
+
**Customer Service Adviser** · Pennine Water · September 2017 – May 2019
|
|
26
|
+
|
|
27
|
+
- Answered account and billing calls.
|
|
28
|
+
|
|
29
|
+
## Education
|
|
30
|
+
|
|
31
|
+
BA English Literature, University of Leeds, 2017
|
|
32
|
+
|
|
33
|
+
## Tools
|
|
34
|
+
|
|
35
|
+
Zendesk, Salesforce (reports & dashboards), Jira, Excel
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Tom Lindqvist
|
|
2
|
+
|
|
3
|
+
Senior Backend Engineer · Stockholm · tom.lindqvist@example.com
|
|
4
|
+
|
|
5
|
+
## Experience
|
|
6
|
+
|
|
7
|
+
### Senior Backend Engineer — Fjordcart (e-commerce platform), 2021 – present
|
|
8
|
+
|
|
9
|
+
- Tech lead for the checkout team (4 engineers).
|
|
10
|
+
- Rewrote the order service from a Python monolith module into three Go services.
|
|
11
|
+
- Cut checkout API p95 latency from 800 ms to 300 ms by removing synchronous calls to the inventory service.
|
|
12
|
+
- Moved order events onto Kafka; the warehouse and email systems now consume the same stream.
|
|
13
|
+
- Run the services on AWS ECS with Terraform; on the on-call rota, one week in five.
|
|
14
|
+
- Integrated two payment providers through their hosted checkout APIs.
|
|
15
|
+
|
|
16
|
+
### Backend Engineer — Nordlys Media, 2018 – 2021
|
|
17
|
+
|
|
18
|
+
- Built the subscription billing service in Python and PostgreSQL.
|
|
19
|
+
- Reduced failed renewals by adding a retry schedule for declined cards.
|
|
20
|
+
- Mentored two junior engineers.
|
|
21
|
+
|
|
22
|
+
### Junior Developer — Brevik Consulting, 2016 – 2018
|
|
23
|
+
|
|
24
|
+
- Client projects in Python and Django.
|
|
25
|
+
|
|
26
|
+
## Skills
|
|
27
|
+
|
|
28
|
+
Go, Python, PostgreSQL, Kafka, AWS (ECS, RDS, SQS), Terraform, Datadog
|
|
29
|
+
|
|
30
|
+
## Education
|
|
31
|
+
|
|
32
|
+
MSc Computer Science, KTH Royal Institute of Technology, 2016
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "job-fit-analysis",
|
|
3
|
-
"version": "0.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": {
|
|
@@ -24,10 +24,15 @@ These four rules outrank the steps below.
|
|
|
24
24
|
- **Write for the recruiter.** The file contains the resume and nothing else: no notes,
|
|
25
25
|
no placeholders, no brackets, no mention of this skill.
|
|
26
26
|
|
|
27
|
-
1. **Read
|
|
28
|
-
required before preferred. From the resume take every job, date, title,
|
|
29
|
-
tool and number.
|
|
30
|
-
|
|
27
|
+
1. **Read everything the person gave you.** From the posting take the requirements in the
|
|
28
|
+
employer's words, required before preferred. From the resume take every job, date, title,
|
|
29
|
+
qualification, tool and number. The person's own material also counts as a source: facts
|
|
30
|
+
they tell you, and any file they point to, such as a LinkedIn summary, a portfolio page
|
|
31
|
+
or a project's README. Save every fact that is not in the resume to `notes.md`, with
|
|
32
|
+
where it came from.
|
|
33
|
+
|
|
34
|
+
When the posting is a link, read the full text. If you cannot open it, say so and ask for
|
|
35
|
+
the text pasted in. Never rebuild a posting from what you remember of the employer.
|
|
31
36
|
|
|
32
37
|
2. **Decide what leads.** For each requirement find the resume lines that answer it. Lines
|
|
33
38
|
that answer a required item move up within their job; lines that answer nothing in this
|
|
@@ -50,16 +55,30 @@ These four rules outrank the steps below.
|
|
|
50
55
|
4. **Write the summary last**, two or three lines at the top, built only from lines below it.
|
|
51
56
|
Use the resume's own job title, not the posting's.
|
|
52
57
|
|
|
53
|
-
5. **
|
|
58
|
+
5. **Work in the resume's own format.** Many resumes are built from a source file: Typst,
|
|
59
|
+
LaTeX, Word, a resume builder's data file. Find that file and edit a copy of it, named
|
|
60
|
+
`resume-<employer>` with the same extension, beside the original. Never edit the original
|
|
61
|
+
or anything else in its project. Keep the source valid: its imports, its escapes (`\$`,
|
|
62
|
+
`\&`), its structure. Build the copy the way the original is built when the tool is
|
|
63
|
+
there (`typst compile`, `pdflatex`), and look at the page count of what comes out. If you
|
|
64
|
+
cannot build it, say so and give the command; do not describe a PDF you did not make.
|
|
65
|
+
|
|
66
|
+
6. **Treat the page count as a budget.** The result has no more pages than the original.
|
|
67
|
+
Anything you add is paid for with a cut, and every line you cut is reported in the reply
|
|
68
|
+
with a few words on why, so the person can ask for it back. Cut what answers nothing in
|
|
69
|
+
this posting first: older roles' detail before recent roles', a third example of the same
|
|
70
|
+
point before the only example of another.
|
|
71
|
+
|
|
72
|
+
7. **Keep it sendable.** Same sections as the original; one
|
|
54
73
|
column, standard headings, no tables, images or text boxes, so application systems can
|
|
55
74
|
parse it. Keep the person's contact details, spelling convention and the word they use
|
|
56
75
|
(resume or CV). Do not add a photo, date of birth or anything the original left out.
|
|
57
76
|
Employment gaps stay as the original shows them.
|
|
58
77
|
|
|
59
|
-
|
|
60
|
-
|
|
78
|
+
8. **Write a new file** beside the original: `resume-<employer>.md` for a text or Markdown
|
|
79
|
+
resume, or the copy from step 5. Never overwrite the original.
|
|
61
80
|
|
|
62
|
-
|
|
81
|
+
9. **Run the check and resolve every line it prints:**
|
|
63
82
|
|
|
64
83
|
```
|
|
65
84
|
python3 ${CLAUDE_SKILL_DIR}/scripts/claim_check.py resume-<employer>.md --source <original> --posting <posting>
|
|
@@ -71,9 +90,12 @@ These four rules outrank the steps below.
|
|
|
71
90
|
source line that shows the same thing or take it out. Rerun until what remains is wording
|
|
72
91
|
you can trace. If you cannot run it, do the same check by reading.
|
|
73
92
|
|
|
74
|
-
|
|
93
|
+
10. **Reply in this order, briefly:**
|
|
75
94
|
- the file name, or the resume itself when you cannot write files;
|
|
76
95
|
- **What changed**: four to six lines;
|
|
96
|
+
- **Cut**: each line you removed, with a few words on why. Say "nothing cut" when so;
|
|
97
|
+
- **Added from outside the resume**: each fact that came from what they told you or from
|
|
98
|
+
another file, with where it came from, for them to confirm before sending;
|
|
77
99
|
- **Not claimed**: each thing the posting asks for that the resume doesn't support, so the
|
|
78
100
|
person knows what the employer will notice;
|
|
79
101
|
- **Would be stronger with**: up to five short questions whose answers you could add,
|
|
@@ -90,6 +112,8 @@ build one only from what the person tells you about their history, and say what
|
|
|
90
112
|
- **The posting's required items are answered in the top half**, wherever the resume can.
|
|
91
113
|
- **The file can be sent as it is**: no placeholders, notes or brackets.
|
|
92
114
|
- **What the resume cannot claim is reported to the person, not papered over.**
|
|
115
|
+
- **Nothing is cut silently and nothing from outside the resume is added silently.**
|
|
116
|
+
- **The original file and its project are untouched.**
|
|
93
117
|
|
|
94
118
|
## When to use this skill
|
|
95
119
|
|
|
@@ -113,4 +137,8 @@ build one only from what the person tells you about their history, and say what
|
|
|
113
137
|
- ❌ **Smoothing over a gap** by changing dates or dropping months.
|
|
114
138
|
- ❌ **Rewriting everything.** A recruiter should still recognise the person's own career.
|
|
115
139
|
- ❌ **A longer resume than the original.** Tailoring cuts.
|
|
140
|
+
- ❌ **A silent cut.** The person finds out at interview that their favourite line is gone.
|
|
141
|
+
- ❌ **Converting the format.** A Typst or Word resume handed back as Markdown loses the
|
|
142
|
+
design the person chose and cannot be sent.
|
|
143
|
+
- ❌ **Claiming a build.** "The PDF is two pages" when no PDF was produced.
|
|
116
144
|
- ❌ **Showing the machinery.** No mention of the check, this skill, or how the file was made.
|
|
@@ -100,6 +100,34 @@
|
|
|
100
100
|
"Running the kitchen on the head chef's days off, the costed weekly specials and the hotel banqueting are in the top half of the CV",
|
|
101
101
|
"The reply tells him what the posting asks for that the CV does not claim, naming Level 3 Food Safety or the team size"
|
|
102
102
|
]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": 8,
|
|
106
|
+
"prompt": "Tailor my CV for this customer success job (posting.md). The CV is resume.typ - I build the PDF from that with Typst.",
|
|
107
|
+
"assertions": [
|
|
108
|
+
"The tailored CV is written as a new Typst file (for example resume-brightloop.typ) and resume.typ is left unchanged",
|
|
109
|
+
"The new file is still Typst source, keeping the page setup and the role helper; it is not converted to Markdown or plain text",
|
|
110
|
+
"'Hart & Lowe Software' and 'Research & Insights' appear exactly as in the original",
|
|
111
|
+
"The renewals line keeps 40 accounts and $1.2M and still says she supported renewals alongside the account managers; it does not say she owned or managed the renewals, a $1.2M book or a revenue target",
|
|
112
|
+
"Gainsight and a customer success certification are not claimed",
|
|
113
|
+
"Her job titles stay Support Team Lead, Support Agent then Senior Support Agent, and Customer Service Adviser, with the original dates",
|
|
114
|
+
"The reply lists each line that was cut, or says that nothing was cut",
|
|
115
|
+
"The reply does not state a page count or say a PDF was built unless the run actually produced a PDF file"
|
|
116
|
+
]
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"id": 9,
|
|
120
|
+
"prompt": "Tailor my CV (resume.md) to posting.md. linkedin-about.txt has a couple of things that aren't on my CV.",
|
|
121
|
+
"assertions": [
|
|
122
|
+
"The monthly onboarding webinar for new customers is added to the CV with the figures as she gave them: since January 2024, around 30 people",
|
|
123
|
+
"Co-chairing the Customer Advisory Board is added or offered, with 8 customers and twice a year unchanged if figures are given",
|
|
124
|
+
"The reply lists what was added from the LinkedIn text separately from the other changes, for her to confirm",
|
|
125
|
+
"She is not said to have owned renewals or carried a revenue target; the renewals line still says she supported them",
|
|
126
|
+
"Gainsight is not claimed",
|
|
127
|
+
"Three or more years in customer success or account management is not claimed, and her job titles are unchanged",
|
|
128
|
+
"The reading mentor volunteering is left out or kept as volunteering; it is not presented as customer experience",
|
|
129
|
+
"The reply names what the posting asks for that the CV cannot claim, such as owning renewals or Gainsight"
|
|
130
|
+
]
|
|
103
131
|
}
|
|
104
132
|
]
|
|
105
133
|
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Customer Success Manager
|
|
2
|
+
|
|
3
|
+
**Brightloop** · Manchester (hybrid) · £48,000 – £55,000
|
|
4
|
+
|
|
5
|
+
Brightloop makes scheduling software for 900 dental and veterinary practices.
|
|
6
|
+
|
|
7
|
+
## What you'll do
|
|
8
|
+
|
|
9
|
+
- Own a book of 60 mid-market accounts and be accountable for their renewals
|
|
10
|
+
- Run onboarding and training for new customers
|
|
11
|
+
- Lead quarterly business reviews
|
|
12
|
+
- Bring customer feedback to the product team
|
|
13
|
+
|
|
14
|
+
## What we need
|
|
15
|
+
|
|
16
|
+
- 3+ years in customer success or account management at a B2B software company
|
|
17
|
+
- Experience owning renewals or a revenue target
|
|
18
|
+
- Experience running customer onboarding or training
|
|
19
|
+
- Confident with Salesforce and a customer success platform such as Gainsight
|
|
20
|
+
- Experience leading or mentoring a small team
|
|
21
|
+
|
|
22
|
+
## Nice to have
|
|
23
|
+
|
|
24
|
+
- A customer success certification
|
|
25
|
+
- Experience working with a product team on customer feedback
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#set page(paper: "a4", margin: 14mm)
|
|
2
|
+
#set text(size: 10pt)
|
|
3
|
+
#let role(title, org, dates) = grid(columns: (1fr, auto), [*#title* · #org], dates)
|
|
4
|
+
|
|
5
|
+
= Nadia Rahman
|
|
6
|
+
Manchester · nadia.rahman\@example.com · 07700 900612
|
|
7
|
+
|
|
8
|
+
== Profile
|
|
9
|
+
Support team lead with seven years in B2B software support.
|
|
10
|
+
|
|
11
|
+
== Experience
|
|
12
|
+
#role("Support Team Lead", "Hart & Lowe Software", "March 2022 – present")
|
|
13
|
+
- Lead a team of 6 support agents covering 310 customer accounts.
|
|
14
|
+
- Supported renewals for 40 accounts worth \$1.2M a year by joining the account managers' quarterly reviews.
|
|
15
|
+
- Cut median first-response time from 9 hours to 3 hours by rewriting the triage rules in Zendesk.
|
|
16
|
+
- Built the weekly ticket-trends report in Salesforce that the Research & Insights team uses to plan fixes.
|
|
17
|
+
- Wrote 35 help-centre articles; self-service now resolves about a quarter of new tickets.
|
|
18
|
+
- Hire and onboard new agents; 4 hired since 2023.
|
|
19
|
+
|
|
20
|
+
#role("Support Agent, then Senior Support Agent", "Hart & Lowe Software", "June 2019 – March 2022")
|
|
21
|
+
- Handled billing and integration tickets for mid-market customers.
|
|
22
|
+
- Trained 5 new agents on the billing queue.
|
|
23
|
+
|
|
24
|
+
#role("Customer Service Adviser", "Pennine Water", "September 2017 – May 2019")
|
|
25
|
+
- Answered account and billing calls.
|
|
26
|
+
|
|
27
|
+
== Education
|
|
28
|
+
BA English Literature, University of Leeds, 2017
|
|
29
|
+
|
|
30
|
+
== Tools
|
|
31
|
+
Zendesk, Salesforce (reports & dashboards), Jira, Excel
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
About
|
|
2
|
+
|
|
3
|
+
I lead the support team at Hart & Lowe Software. Since January 2024 I've also run our monthly onboarding webinar for new customers, usually around 30 people on the call, and I co-chair the Customer Advisory Board with our Head of Product (8 customers, meets twice a year).
|
|
4
|
+
|
|
5
|
+
Outside work I volunteer as a reading mentor at a primary school.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Customer Success Manager
|
|
2
|
+
|
|
3
|
+
**Brightloop** · Manchester (hybrid) · £48,000 – £55,000
|
|
4
|
+
|
|
5
|
+
Brightloop makes scheduling software for 900 dental and veterinary practices.
|
|
6
|
+
|
|
7
|
+
## What you'll do
|
|
8
|
+
|
|
9
|
+
- Own a book of 60 mid-market accounts and be accountable for their renewals
|
|
10
|
+
- Run onboarding and training for new customers
|
|
11
|
+
- Lead quarterly business reviews
|
|
12
|
+
- Bring customer feedback to the product team
|
|
13
|
+
|
|
14
|
+
## What we need
|
|
15
|
+
|
|
16
|
+
- 3+ years in customer success or account management at a B2B software company
|
|
17
|
+
- Experience owning renewals or a revenue target
|
|
18
|
+
- Experience running customer onboarding or training
|
|
19
|
+
- Confident with Salesforce and a customer success platform such as Gainsight
|
|
20
|
+
- Experience leading or mentoring a small team
|
|
21
|
+
|
|
22
|
+
## Nice to have
|
|
23
|
+
|
|
24
|
+
- A customer success certification
|
|
25
|
+
- Experience working with a product team on customer feedback
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Nadia Rahman
|
|
2
|
+
|
|
3
|
+
Manchester · nadia.rahman@example.com · 07700 900612
|
|
4
|
+
|
|
5
|
+
## Profile
|
|
6
|
+
|
|
7
|
+
Support team lead with seven years in B2B software support.
|
|
8
|
+
|
|
9
|
+
## Experience
|
|
10
|
+
|
|
11
|
+
**Support Team Lead** · Hart & Lowe Software · March 2022 – present
|
|
12
|
+
|
|
13
|
+
- Lead a team of 6 support agents covering 310 customer accounts.
|
|
14
|
+
- Supported renewals for 40 accounts worth $1.2M a year by joining the account managers' quarterly reviews.
|
|
15
|
+
- Cut median first-response time from 9 hours to 3 hours by rewriting the triage rules in Zendesk.
|
|
16
|
+
- Built the weekly ticket-trends report in Salesforce that the Research & Insights team uses to plan fixes.
|
|
17
|
+
- Wrote 35 help-centre articles; self-service now resolves about a quarter of new tickets.
|
|
18
|
+
- Hire and onboard new agents; 4 hired since 2023.
|
|
19
|
+
|
|
20
|
+
**Support Agent, then Senior Support Agent** · Hart & Lowe Software · June 2019 – March 2022
|
|
21
|
+
|
|
22
|
+
- Handled billing and integration tickets for mid-market customers.
|
|
23
|
+
- Trained 5 new agents on the billing queue.
|
|
24
|
+
|
|
25
|
+
**Customer Service Adviser** · Pennine Water · September 2017 – May 2019
|
|
26
|
+
|
|
27
|
+
- Answered account and billing calls.
|
|
28
|
+
|
|
29
|
+
## Education
|
|
30
|
+
|
|
31
|
+
BA English Literature, University of Leeds, 2017
|
|
32
|
+
|
|
33
|
+
## Tools
|
|
34
|
+
|
|
35
|
+
Zendesk, Salesforce (reports & dashboards), Jira, Excel
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "resume-tailor",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Tailor a resume or CV to one job posting without adding anything that isn't true: reorder, cut and reword what the person has already done so the posting's needs are answered first, keep every employer, title, date and number as it was, and report what the posting asks for that the resume cannot claim. A script lists every figure and name in the draft that the original doesn't contain. Works for any occupation and level. Use when the user says \"tailor my resume for this job\", \"adapt my CV to this posting\", \"rewrite my resume for this role\", or pastes a job description next to their resume.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -31,7 +31,7 @@ MULT = {"k": 1e3, "thousand": 1e3, "m": 1e6, "mm": 1e6, "million": 1e6,
|
|
|
31
31
|
"bn": 1e9, "b": 1e9, "billion": 1e9}
|
|
32
32
|
NUMBER = re.compile(r"(?<![\w.])(\d[\d,]*(?:\.\d+)?)(?:(k|mm|m|bn|b)\b|\s?(thousand|million|billion)\b)?"
|
|
33
33
|
r"(\s?%|\s?percent\b|\s?per cent\b)?", re.I)
|
|
34
|
-
WORD = re.compile(r"\.?[A-Za-z][A-Za-z0-9+#']*(?:\.[A-Za-z0-9]+)*")
|
|
34
|
+
WORD = re.compile(r"(?<![A-Za-z0-9])\.?[A-Za-z][A-Za-z0-9+#']*(?:\.[A-Za-z0-9]+)*")
|
|
35
35
|
LIST_MARK = re.compile(r"^\s*(?:[-*•–>]+|\d+[.)]|#+|\|)\s*")
|
|
36
36
|
LINK = re.compile(r"\[([^\]]*)\]\([^)]*\)")
|
|
37
37
|
SUFFIXES = ("ations", "ation", "ments", "ment", "ings", "ing", "ers", "ies", "ed", "er", "es", "s", "ly")
|
|
@@ -73,8 +73,11 @@ def read(path):
|
|
|
73
73
|
|
|
74
74
|
|
|
75
75
|
def clean(line):
|
|
76
|
-
"""A line with its
|
|
76
|
+
"""A line with its markup removed, so `**Go**` and `Go` read the same. Resumes kept as
|
|
77
|
+
Typst or LaTeX source escape `$`, `&`, `%` and `#`; the escapes are dropped too."""
|
|
77
78
|
line = LINK.sub(r"\1", line)
|
|
79
|
+
line = re.sub(r"\\([$&%#_])", r"\1", line)
|
|
80
|
+
line = re.sub(r"(?<![$£€\w.,])\d+(?:\.\d+)?(?:em|mm|pt|cm|px|fr)\b", " ", line) # layout lengths
|
|
78
81
|
line = line.replace("’", "'").replace("‘", "'").replace("–", " - ").replace("—", " - ")
|
|
79
82
|
return re.sub(r"[*_`~]", "", line)
|
|
80
83
|
|
|
@@ -133,7 +136,7 @@ def phrases(line):
|
|
|
133
136
|
so it only counts when it is name-shaped itself or opens a longer capitalised run."""
|
|
134
137
|
text = LIST_MARK.sub("", clean(line))
|
|
135
138
|
out, run, start_of_sentence = [], [], True
|
|
136
|
-
tokens = re.findall(r"\.?[A-Za-z][A-Za-z0-9+#']*(?:\.[A-Za-z0-9]+)*|&|[.!?;:]\s|[,|·/()]|\s-\s", text + " ")
|
|
139
|
+
tokens = re.findall(r"(?<![A-Za-z0-9])\.?[A-Za-z][A-Za-z0-9+#']*(?:\.[A-Za-z0-9]+)*|&|[.!?;:]\s|[,|·/()]|\s-\s", text + " ")
|
|
137
140
|
for i, tok in enumerate(tokens):
|
|
138
141
|
if not (tok[0].isalpha() or tok[0] in ".&") or tok.strip() in (".", "!", "?", ";", ":"):
|
|
139
142
|
if run:
|
|
@@ -200,7 +203,7 @@ def check(draft, sources, posting):
|
|
|
200
203
|
if missing:
|
|
201
204
|
add("name", " ".join(words), n, raw, all(key(w) in post_names for w in missing))
|
|
202
205
|
elif len(content) > 1 and all(w.lower() not in PLAIN for w in content):
|
|
203
|
-
flat = " ".join(key(w) for w in words)
|
|
206
|
+
flat = " ".join(key(w) for w in words if w != "&")
|
|
204
207
|
if " " + flat + " " not in src_flat:
|
|
205
208
|
add("combination", " ".join(words), n, raw)
|
|
206
209
|
if posting:
|
|
@@ -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
|
}
|