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.
Files changed (103) hide show
  1. package/README.md +1 -1
  2. package/catalogue.json +3 -2
  3. package/model-routing.json +4 -0
  4. package/package.json +1 -1
  5. package/packs/ai-engineering/skills/ai-usage-policy/evals/evals.json +30 -0
  6. package/packs/ai-engineering/skills/ai-usage-policy/evals/files/4/ciso-brief.md +15 -0
  7. package/packs/ai-engineering/skills/ai-usage-policy/evals/files/4/incident-summary.md +22 -0
  8. package/packs/ai-engineering/skills/ai-usage-policy/evals/files/4/legal-notes.md +14 -0
  9. package/packs/ai-engineering/skills/ai-usage-policy/evals/files/4/tool-inventory.csv +5 -0
  10. package/packs/api-builder/skills/tool-use-schema-writer/evals/evals.json +30 -0
  11. package/packs/api-builder/skills/tool-use-schema-writer/evals/files/4/refunds.openapi.yaml +63 -0
  12. package/packs/career/loops/apply/LOOP.md +19 -10
  13. package/packs/career/loops/apply/loop.json +9 -3
  14. package/packs/career/pack.json +27 -7
  15. package/packs/career/skills/application-form-answers/SKILL.md +146 -0
  16. package/packs/career/skills/application-form-answers/evals/eval_queries.json +34 -0
  17. package/packs/career/skills/application-form-answers/evals/evals.json +103 -0
  18. package/packs/career/skills/application-form-answers/evals/files/1/form.md +17 -0
  19. package/packs/career/skills/application-form-answers/evals/files/1/posting.md +20 -0
  20. package/packs/career/skills/application-form-answers/evals/files/1/resume.md +32 -0
  21. package/packs/career/skills/application-form-answers/evals/files/2/form.md +15 -0
  22. package/packs/career/skills/application-form-answers/evals/files/2/posting.md +21 -0
  23. package/packs/career/skills/application-form-answers/evals/files/2/resume.md +32 -0
  24. package/packs/career/skills/application-form-answers/evals/files/4/form.md +14 -0
  25. package/packs/career/skills/application-form-answers/evals/files/4/posting.md +25 -0
  26. package/packs/career/skills/application-form-answers/evals/files/4/resume.md +29 -0
  27. package/packs/career/skills/application-form-answers/evals/files/5/form.md +15 -0
  28. package/packs/career/skills/application-form-answers/evals/files/5/posting.md +18 -0
  29. package/packs/career/skills/application-form-answers/evals/files/5/resume.md +23 -0
  30. package/packs/career/skills/application-form-answers/evals/files/6/form.md +11 -0
  31. package/packs/career/skills/application-form-answers/evals/files/6/posting.md +28 -0
  32. package/packs/career/skills/application-form-answers/evals/files/6/resume.md +35 -0
  33. package/packs/career/skills/application-form-answers/evals/files/7/form.md +11 -0
  34. package/packs/career/skills/application-form-answers/evals/files/7/posting.md +19 -0
  35. package/packs/career/skills/application-form-answers/evals/files/7/resume.md +26 -0
  36. package/packs/career/skills/application-form-answers/manifest.json +31 -0
  37. package/packs/career/skills/cover-letter/scripts/claim_check.py +7 -4
  38. package/packs/career/skills/job-fit-analysis/SKILL.md +46 -16
  39. package/packs/career/skills/job-fit-analysis/evals/evals.json +26 -0
  40. package/packs/career/skills/job-fit-analysis/evals/files/6/linkedin-about.txt +5 -0
  41. package/packs/career/skills/job-fit-analysis/evals/files/6/posting.md +25 -0
  42. package/packs/career/skills/job-fit-analysis/evals/files/6/resume.md +35 -0
  43. package/packs/career/skills/job-fit-analysis/evals/files/7/resume.md +32 -0
  44. package/packs/career/skills/job-fit-analysis/manifest.json +1 -1
  45. package/packs/career/skills/resume-tailor/SKILL.md +37 -9
  46. package/packs/career/skills/resume-tailor/evals/evals.json +28 -0
  47. package/packs/career/skills/resume-tailor/evals/files/8/posting.md +25 -0
  48. package/packs/career/skills/resume-tailor/evals/files/8/resume.typ +31 -0
  49. package/packs/career/skills/resume-tailor/evals/files/9/linkedin-about.txt +5 -0
  50. package/packs/career/skills/resume-tailor/evals/files/9/posting.md +25 -0
  51. package/packs/career/skills/resume-tailor/evals/files/9/resume.md +35 -0
  52. package/packs/career/skills/resume-tailor/manifest.json +1 -1
  53. package/packs/career/skills/resume-tailor/scripts/claim_check.py +7 -4
  54. package/packs/data-analytics/skills/metric-definition/evals/evals.json +30 -0
  55. package/packs/data-analytics/skills/metric-definition/evals/files/4/tables.md +32 -0
  56. package/packs/data-analytics/skills/metric-definition/evals/files/4/thread.md +31 -0
  57. package/packs/dev-team/skills/contribution-wizard/evals/evals.json +30 -0
  58. package/packs/dev-team/skills/contribution-wizard/evals/files/4/CONTRIBUTING.md +63 -0
  59. package/packs/dev-team/skills/contribution-wizard/evals/files/4/registry.json +15 -0
  60. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/PROMPT.md +10 -0
  61. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/01-expected.md +2 -0
  62. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/01-input.md +3 -0
  63. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/02-expected.md +1 -0
  64. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/02-input.md +2 -0
  65. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/03-expected.md +1 -0
  66. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/03-input.md +2 -0
  67. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/meta.json +7 -0
  68. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/PROMPT.md +11 -0
  69. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/01-expected.md +4 -0
  70. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/01-input.md +4 -0
  71. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/02-expected.md +6 -0
  72. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/02-input.md +2 -0
  73. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/03-expected.md +1 -0
  74. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/03-input.md +1 -0
  75. package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/skill.toml +6 -0
  76. package/packs/dev-team/skills/devils-advocate/evals/evals.json +29 -0
  77. package/packs/dev-team/skills/devils-advocate/evals/files/4/lateFees.test.ts +46 -0
  78. package/packs/dev-team/skills/devils-advocate/evals/files/4/lateFees.ts +46 -0
  79. package/packs/dev-team/skills/release-notes/evals/evals.json +29 -0
  80. package/packs/dev-team/skills/release-notes/evals/files/4/git-log.txt +26 -0
  81. package/packs/research/skills/source-synthesis/evals/evals.json +30 -0
  82. package/packs/research/skills/source-synthesis/evals/files/4/behaviour-logs.md +31 -0
  83. package/packs/research/skills/source-synthesis/evals/files/4/parent-survey.md +25 -0
  84. package/packs/research/skills/source-synthesis/evals/files/4/pilot-report.md +27 -0
  85. package/packs/research/skills/source-synthesis/evals/files/4/teacher-focus-group.md +19 -0
  86. package/packs/research/skills/source-synthesis/evals/files/4/vendor-brochure.md +18 -0
  87. package/packs/solution-architect/skills/db-schema-design/evals/evals.json +30 -0
  88. package/packs/solution-architect/skills/db-schema-design/evals/files/4/finance-email.md +18 -0
  89. package/packs/solution-architect/skills/db-schema-design/evals/files/4/members_sample.csv +5 -0
  90. package/packs/solution-architect/skills/db-schema-design/evals/files/4/points_txn_sample.csv +17 -0
  91. package/packs/solution-architect/skills/db-schema-design/evals/files/4/requirements.md +28 -0
  92. package/packs/solution-architect/skills/design-doc/evals/evals.json +29 -0
  93. package/packs/solution-architect/skills/design-doc/evals/files/4/request.md +31 -0
  94. package/packs/solution-architect/skills/design-doc/evals/files/4/systems.md +40 -0
  95. package/packs/solution-architect/skills/tech-comparison-matrix/evals/evals.json +29 -0
  96. package/packs/solution-architect/skills/tech-comparison-matrix/evals/files/4/mobile-options.md +45 -0
  97. package/packs/sre-oncall/skills/postmortem-generator/evals/evals.json +30 -0
  98. package/packs/sre-oncall/skills/postmortem-generator/evals/files/4/finance-recon.md +28 -0
  99. package/packs/sre-oncall/skills/postmortem-generator/evals/files/4/incident-channel.txt +34 -0
  100. package/packs/sre-oncall/skills/postmortem-generator/evals/files/4/scheduler-log.txt +15 -0
  101. package/packs/stakeholder-comms/skills/guide-builder/evals/evals.json +30 -0
  102. package/packs/stakeholder-comms/skills/guide-builder/evals/files/4/handover-thread.txt +39 -0
  103. 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 posting and list its requirements.** Keep the employer's own wording. Sort
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
- 2. **Find what could get the application rejected.** Two kinds of requirement do it: the
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
- 3. **Mark each requirement against the resume** with one of four words:
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
- 4. **Give a verdict the person can act on.** Open with a plain sentence that says whether
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
- The opening sentence counts every required item that is `Not met` or `Partly`, not only
69
- the worst one: "four of the six required items aren't met: the degree, the team size,
70
- 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
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
- 5. **Say what to bring forward.** List the two to four things already in the resume that
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
- 6. **Close with what to do next**, in two to four lines: what to lead the application with,
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?"). Never tell
82
- them to add a keyword they have not said is true, and do not end on a list of questions
83
- with no advice.
84
-
85
- 7. **Lay the reply out in this order:** the answer and verdict; what could get it rejected;
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.0",
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 both documents.** From the posting take the requirements in the employer's words,
28
- required before preferred. From the resume take every job, date, title, qualification,
29
- tool and number. If the person told you facts that are not in the resume, save them to
30
- `notes.md` so they count as source material.
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. **Keep it sendable.** Same sections and no more pages than the original; one
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
- 6. **Write a new file** beside the original, `resume-<employer>.md`, or the original's format
60
- when you can produce it. Never overwrite the original.
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
- 7. **Run the check and resolve every line it prints:**
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
- 8. **Reply in this order, briefly:**
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.0",
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 markdown removed, so `**Go**` and `Go` read the same."""
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
  }