skilldrop-cli 1.4.0 → 1.6.0

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 (73) hide show
  1. package/README.md +8 -7
  2. package/bin/skilldrop.js +15 -10
  3. package/catalogue.json +13 -2
  4. package/contracts/catalogue.schema.json +2 -1
  5. package/model-routing.json +12 -8
  6. package/package.json +1 -1
  7. package/packs/ai-engineering/skills/judge-audit/SKILL.md +28 -11
  8. package/packs/ai-engineering/skills/judge-audit/evals/evals.json +30 -0
  9. package/packs/ai-engineering/skills/judge-audit/evals/files/12/judge_runs.csv +241 -0
  10. package/packs/ai-engineering/skills/judge-audit/evals/files/12/rosa_labels.csv +33 -0
  11. package/packs/ai-engineering/skills/judge-audit/evals/files/13/moderation_eval.csv +601 -0
  12. package/packs/ai-engineering/skills/judge-audit/manifest.json +2 -2
  13. package/packs/ai-engineering/skills/mcp-pairing/manifest.json +1 -1
  14. package/packs/ai-engineering/skills/mcp-pairing/reference.md +4 -3
  15. package/packs/ai-engineering/skills/subagent-design/SKILL.md +1 -0
  16. package/packs/ai-engineering/skills/subagent-design/examples/help-center-localization.md +146 -0
  17. package/packs/ai-engineering/skills/subagent-design/manifest.json +2 -2
  18. package/packs/api-builder/skills/prompt-caching-advisor/SKILL.md +4 -0
  19. package/packs/api-builder/skills/prompt-caching-advisor/examples/support-bot-block-order.md +120 -0
  20. package/packs/api-builder/skills/prompt-caching-advisor/manifest.json +2 -2
  21. package/packs/civil-architect/pack.json +60 -0
  22. package/packs/civil-architect/skills/floor-plan-layout/SKILL.md +103 -0
  23. package/packs/civil-architect/skills/floor-plan-layout/evals/eval_queries.json +30 -0
  24. package/packs/civil-architect/skills/floor-plan-layout/evals/evals.json +57 -0
  25. package/packs/civil-architect/skills/floor-plan-layout/evals/files/4/adu-programme.md +12 -0
  26. package/packs/civil-architect/skills/floor-plan-layout/examples/ground-floor.md +65 -0
  27. package/packs/civil-architect/skills/floor-plan-layout/examples/ground-floor.svg +135 -0
  28. package/packs/civil-architect/skills/floor-plan-layout/manifest.json +34 -0
  29. package/packs/civil-architect/skills/floor-plan-layout/scripts/plan_check.py +449 -0
  30. package/packs/civil-architect/skills/floor-plan-layout/templates/plan.json +38 -0
  31. package/packs/dev-team/loops/release/LOOP.md +4 -4
  32. package/packs/dev-team/loops/release/loop.json +1 -1
  33. package/packs/dev-team/skills/bug-triage/SKILL.md +1 -0
  34. package/packs/dev-team/skills/bug-triage/examples/export-row-limit-escalation.md +126 -0
  35. package/packs/dev-team/skills/bug-triage/manifest.json +2 -2
  36. package/packs/product-manager/skills/prd-draft/SKILL.md +1 -0
  37. package/packs/product-manager/skills/prd-draft/examples/approver-delay-not-slack.md +142 -0
  38. package/packs/product-manager/skills/prd-draft/manifest.json +2 -2
  39. package/profiles.json +1 -1
  40. package/packs/ai-engineering/loops/adopt/LOOP.md +0 -120
  41. package/packs/ai-engineering/loops/adopt/evals/eval_queries.json +0 -10
  42. package/packs/ai-engineering/loops/adopt/evals/evals.json +0 -69
  43. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/ai-ideas.md +0 -15
  44. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/org-context.md +0 -27
  45. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/staff-survey.csv +0 -11
  46. package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/ai-ideas.md +0 -13
  47. package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/firm-context.md +0 -23
  48. package/packs/ai-engineering/loops/adopt/loop.json +0 -53
  49. package/packs/career/loops/apply/LOOP.md +0 -97
  50. package/packs/career/loops/apply/evals/eval_queries.json +0 -9
  51. package/packs/career/loops/apply/evals/evals.json +0 -55
  52. package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/application-form.md +0 -10
  53. package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/job-posting.md +0 -33
  54. package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/resume.md +0 -34
  55. package/packs/career/loops/apply/evals/files/apply-fit-gate-hard-requirement/cv.md +0 -27
  56. package/packs/career/loops/apply/evals/files/apply-fit-gate-hard-requirement/warehouse-supervisor.md +0 -30
  57. package/packs/career/loops/apply/loop.json +0 -52
  58. package/packs/product-manager/loops/discover/LOOP.md +0 -82
  59. package/packs/product-manager/loops/discover/evals/eval_queries.json +0 -30
  60. package/packs/product-manager/loops/discover/evals/evals.json +0 -54
  61. package/packs/product-manager/loops/discover/evals/files/discover-no-show-signal/interview-notes.md +0 -63
  62. package/packs/product-manager/loops/discover/evals/files/discover-no-show-signal/support-tickets.csv +0 -13
  63. package/packs/product-manager/loops/discover/evals/files/discover-vp-loyalty-no-evidence/vp-message.txt +0 -13
  64. package/packs/product-manager/loops/discover/loop.json +0 -41
  65. package/packs/sre-oncall/loops/operate/LOOP.md +0 -84
  66. package/packs/sre-oncall/loops/operate/evals/eval_queries.json +0 -30
  67. package/packs/sre-oncall/loops/operate/evals/evals.json +0 -53
  68. package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/alerts.log +0 -22
  69. package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/incident-chat.txt +0 -27
  70. package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/service-notes.md +0 -46
  71. package/packs/sre-oncall/loops/operate/evals/files/operate-incident-still-open/oncall-log.txt +0 -17
  72. package/packs/sre-oncall/loops/operate/evals/files/operate-incident-still-open/runbook-webhooks.md +0 -38
  73. package/packs/sre-oncall/loops/operate/loop.json +0 -41
@@ -1,15 +0,0 @@
1
- # AI ideas: collected from the staff forum and team leads, September 2026
2
-
3
- 1. **Delivery-date replies (Customer service).** About 600 emails a week ask "where's my kitchen / when is my delivery". That's roughly 40% of the inbox. An assistant could draft the reply from the order status in KitchenTrack and the agent checks and sends. Submitted by the customer service team lead.
4
-
5
- 2. **Kitchen renders from sketches (Design).** Turn a designer's hand sketch into a photo-style render to show the customer in the showroom. Today renders take a designer about half a day each. Submitted by two designers.
6
-
7
- 3. **Showroom visit notes (Sales).** Summarise showroom visit notes into a follow-up email. Notes are handwritten in notebooks; there is no CRM. Submitted by a sales manager.
8
-
9
- 4. **Invoice matching (Finance).** Match supplier invoices to purchase orders automatically. Around 900 invoices a month, matched by hand in the accounts package. Supplier price lists are commercially confidential. Submitted by the finance manager.
10
-
11
- 5. **Machine breakdown prediction (Manufacturing).** Predict when the edge-banding and CNC machines will fail. Only 3 of 19 machines have sensors fitted; the rest have paper maintenance logs. Submitted by the factory engineer.
12
-
13
- 6. **Staff handbook Q&A (HR).** A chatbot that answers holiday, sick-pay and shift-swap questions from the staff handbook. HR gets about 40 of these a week. Submitted by HR.
14
-
15
- 7. **Product descriptions (Marketing).** Write website product descriptions from the spec sheets for the 2027 range (about 120 products). Submitted by marketing.
@@ -1,27 +0,0 @@
1
- # Pellmore Kitchens Ltd: background for the AI work
2
-
3
- ## The company
4
- - Designs, makes and fits fitted kitchens. 240 staff across the factory and the head office/showroom.
5
- - Teams: Manufacturing 130, Operations and logistics 26, Sales 22, Design 18, Customer service 14, Finance 9, Marketing 8, Leadership 6, HR 4, IT 3.
6
-
7
- ## Sponsor
8
- - Ruth Calloway, Operations Director, sponsors the AI work and signs off the first rollout wave. She wants a first wave live before the January peak.
9
-
10
- ## Tools
11
- - Office suite with its enterprise AI chat assistant, licensed since June 2026 for 25 seats. The contract says prompts and files are not used to train models and data is held in the UK/EU. Nobody has been given a seat yet; IT holds all 25.
12
- - KitchenTrack, the in-house order system. Holds customer names, delivery addresses, phone numbers, email addresses, order lines, prices paid and delivery slots. No API; IT runs a nightly CSV export of order status.
13
- - Accounts package for finance; no AI features switched on.
14
-
15
- ## Data
16
- - Customer personal data lives in KitchenTrack and the customer service inbox.
17
- - Supplier price lists are commercially confidential under the supplier agreements.
18
- - Staff HR records are held by HR only.
19
- - The finance manager is also the company's data protection lead (part of the role). There is a data protection policy (2023). There is no AI policy of any kind.
20
-
21
- ## What people are worried about
22
- - The staff survey (staff-survey.csv) found people already using personal AI accounts at work, including pasting customer emails into chatbots on their phones.
23
- - The customer service team's union rep has asked whether this is about cutting jobs in customer service.
24
- - Finance is worried about supplier pricing leaking.
25
-
26
- ## Skills and support
27
- - No AI training has been run. IT (3 people) can give two days a month to support a rollout.
@@ -1,11 +0,0 @@
1
- team,respondents,used_ai_at_work_last_month,used_personal_account_for_work,wants_training,worried_about_jobs
2
- Customer service,12,9,8,11,7
3
- Sales,15,6,5,9,2
4
- Design,14,10,7,8,3
5
- Finance,8,2,1,5,1
6
- Operations and logistics,10,1,1,4,2
7
- Marketing,6,6,3,4,1
8
- Manufacturing,21,0,0,6,9
9
- HR,4,1,0,3,0
10
- Leadership,5,3,2,2,0
11
- IT,3,3,1,0,0
@@ -1,13 +0,0 @@
1
- # AI ideas from the October partners' meeting
2
-
3
- 1. **Client tax-query replies.** Draft replies to client emails asking about their tax position, using the client's file (prior returns, correspondence, working papers). Roughly 350 such emails a month across the tax team; each takes a manager 20 to 40 minutes. Margaret's priority.
4
-
5
- 2. **Bank statement extraction.** Pull transactions from the PDF bank statements clients send in, ready for bookkeeping. About 1,100 statements a month.
6
-
7
- 3. **Client call notes.** Record and summarise client calls into the practice management system.
8
-
9
- 4. **Procedures manual Q&A.** Answer staff questions from the firm's internal procedures manual (onboarding, filing deadlines process, how to raise an invoice). The manual is 140 pages and nobody can find anything in it. No client data in it.
10
-
11
- 5. **Weekly guidance briefing.** Summarise the week's published tax guidance updates into a one-page staff briefing. Uses only public material.
12
-
13
- 6. **Newsletter drafts.** Draft the quarterly client newsletter from the partners' bullet points.
@@ -1,23 +0,0 @@
1
- # Corrow Lane Accounting LLP: background
2
-
3
- ## The firm
4
- - 58 people: 6 partners, 14 in the tax team, 21 in accounts and bookkeeping, 9 in payroll, 8 in practice support (admin, IT, marketing).
5
- - Around 1,900 clients: sole traders, small companies and some high-net-worth individuals.
6
-
7
- ## Sponsor
8
- - Margaret Ilsley, managing partner, sponsors the AI work and will sign off any rollout. She has decided client tax-query replies come first.
9
-
10
- ## Systems
11
- - Client files live on an on-premises file server and in LedgerDesk, the practice management system. LedgerDesk has no AI features and no export API.
12
- - Email is hosted by our email provider.
13
- - No AI tool is licensed or approved. In August 2026 the IT manager blocked two public chatbot sites after a junior was seen pasting a client's payslip into one.
14
-
15
- ## Client contracts
16
- - Every client signs our standard engagement letter. Clause 9.2 reads: "We will not disclose your information to any third party, or process it using third-party services other than those listed in Schedule B, without your prior written consent."
17
- - Schedule B lists three services: our email hosting provider, our payroll bureau, and our cloud backup provider. Nothing else.
18
- - Engagement letters are reissued each April.
19
-
20
- ## Other
21
- - Our professional indemnity insurer's renewal questionnaire, due January 2027, asks whether we use AI on client work and how it is controlled.
22
- - Practice support has one IT manager and no one with AI experience.
23
- - Staff survey (informal, September): 31 of 58 said they would use an AI tool if the firm approved one.
@@ -1,53 +0,0 @@
1
- {
2
- "$comment": "RFC-0069. AI ideas to a first rollout wave a sponsor approved. Readiness is scored against the first slice, not the whole organisation, because a gap only blocks the use cases that need what is missing; the gate sits there so a slice that needs it goes back to triage before anyone writes a policy for it.",
3
- "name": "adopt",
4
- "version": "0.1.0",
5
- "description": "Take an organisation from a pile of AI ideas to a first rollout wave its sponsor approved: the use cases ranked with a first slice, readiness scored against that slice, a usage policy covering the data the slice touches, and a cohort rollout whose first wave is the slice's users, with a gate that sends the slice back when a blocking gap stands in its way. Use when the user says \"help us start using AI\", \"roll out AI across the team\", \"run the adopt loop\", or has AI ideas, no policy and no rollout plan.",
6
- "entrypoint": "LOOP.md",
7
- "kind": "loop",
8
- "cap": 3,
9
- "stages": [
10
- {
11
- "id": "triage",
12
- "type": "generate",
13
- "intent": "Rank the candidate use cases on value, feasibility and risk with the weights shown, and name one first slice with the observable that would prove or kill it.",
14
- "skills": ["ai-use-case-triage"]
15
- },
16
- {
17
- "id": "readiness",
18
- "type": "verify",
19
- "intent": "Score readiness against what the first slice needs, and judge whether any blocking gap stands between the slice and its first users.",
20
- "skills": ["ai-readiness-assessment"],
21
- "gate": {
22
- "id": "G11",
23
- "kind": "review",
24
- "verdicts": ["PROCEED", "PROCEED WITH CONDITIONS", "REVISE", "RECONSIDER", "BLOCKED"],
25
- "revise_to": "triage"
26
- }
27
- },
28
- {
29
- "id": "policy",
30
- "type": "generate",
31
- "intent": "Write the usage rules for the people in the slice, covering every kind of data the slice puts into a tool, each restriction paired with what to do instead.",
32
- "skills": ["ai-usage-policy"]
33
- },
34
- {
35
- "id": "rollout",
36
- "type": "generate",
37
- "intent": "Plan the cohorts, enablement, champions and comms, with the slice's users as the pilot and the slice's observable as the pilot's adoption gate.",
38
- "skills": ["ai-adoption-rollout"]
39
- },
40
- {
41
- "id": "sign-off",
42
- "type": "gate",
43
- "intent": "The sponsor approves the first wave, with the policy and the readiness conditions it opens under.",
44
- "skills": ["doc-critique"],
45
- "gate": {
46
- "id": "G11.1",
47
- "kind": "human",
48
- "verdicts": ["PROCEED", "PROCEED WITH CONDITIONS", "REVISE", "BLOCKED"],
49
- "revise_to": "policy"
50
- }
51
- }
52
- ]
53
- }
@@ -1,97 +0,0 @@
1
- ---
2
- name: apply
3
- description: Take one job posting and one resume to an application ready to send — an honest fit check, a tailored resume, a cover letter and the answers to the application form — with the candidate deciding whether to apply before any writing, and confirming every claim is true before anything is sent. Use when the user wants to apply for a job, says "help me apply for this", or wants a resume and cover letter prepared for one posting.
4
- ---
5
-
6
- # apply
7
-
8
- One application, start to send, for any job. It opens with a gate because the cheapest
9
- application is the one you decide not to write, and it closes with one because the candidate
10
- signs these documents and answers for them at interview. Both gates are **human**: an agent
11
- can say what the resume shows, but only the candidate knows what is true and what they want.
12
-
13
- ## Stages
14
-
15
- | # | Stage | Type | Skills | Gate |
16
- |---|---|---|---|---|
17
- | 1 | `fit` | gate | [`job-fit-analysis`](../../skills/job-fit-analysis/SKILL.md) | **G6** human |
18
- | 2 | `tailor` | generate | [`resume-tailor`](../../skills/resume-tailor/SKILL.md) | — |
19
- | 3 | `letter` | generate | [`cover-letter`](../../skills/cover-letter/SKILL.md) | — |
20
- | 4 | `form` | generate | [`application-form-answers`](../../skills/application-form-answers/SKILL.md) | — |
21
- | 5 | `confirm` | verify | [`output-hygiene`](../../../core/skills/output-hygiene/SKILL.md) | **G6.1** human |
22
-
23
- ## How to run this loop
24
-
25
- 1. **Check the fit and stop.** Run `job-fit-analysis` on the posting, the resume and any
26
- other material of the candidate's: a LinkedIn summary, a portfolio, a project. Put its
27
- verdict, what could get the application rejected and its questions to the candidate,
28
- including whether anything outside the resume covers a gap, then wait at G6.
29
- - `PROCEED`: they are applying. Go on.
30
- - `PROCEED WITH CONDITIONS`: they are applying and have answered the questions. Save
31
- their answers to `notes.md`; from here on those answers are source material alongside
32
- the resume.
33
- - `RECONSIDER`: they are not applying. The loop ends here, and that is a good outcome.
34
- 2. **Tailor the resume.** Run `resume-tailor` with the resume, the posting and `notes.md`
35
- if it exists. It works in the resume's own format, on a copy. Carry forward its three
36
- lists: "Not claimed", "Cut" and "Added from outside the resume".
37
- 3. **Write the letter.** Run `cover-letter` with the tailored resume, the posting, `notes.md`
38
- and the candidate's reason for wanting the job if they gave one. Skip this stage when the
39
- posting says not to send a letter.
40
- 4. **Answer the form.** When the application has a form with questions beyond uploading
41
- the documents, run `application-form-answers` with those questions and the tailored
42
- resume. Skip this stage when there is no form.
43
- 5. **Clean the documents.** Run `output-hygiene` on the resume and the letter.
44
- 6. **Confirm at G6.1.** Show the candidate the documents with four short lists: what the
45
- posting asks for that the documents do not claim; every fact added from outside the
46
- resume and where it came from; every line cut from the resume; and the form questions
47
- that are theirs alone to answer. Ask them to confirm every line is true. `NOT READY` returns to `tailor` with their
48
- corrections added to `notes.md`. The candidate sends the application; the loop never does.
49
-
50
- ## Verdicts
51
-
52
- Defined in [`contracts/terminals.json`](../../../../contracts/terminals.json). G6 emits
53
- `PROCEED`, `PROCEED WITH CONDITIONS`, `RECONSIDER` or `BLOCKED`. G6.1 emits `READY`,
54
- `NOT READY` or `BLOCKED`. `RECONSIDER` leaves the loop: the candidate's time goes to a
55
- better posting.
56
-
57
- ## Non-interactive runs
58
-
59
- With no person present, neither gate can be satisfied. Run `fit`, deliver the analysis and
60
- emit `BLOCKED: need the candidate's decision to apply`. Do not decide for them, and do not
61
- produce documents carrying their name that they have not confirmed.
62
-
63
- ## When a stage's skill is not installed
64
-
65
- Name the missing skill and skilldrop as its source, do the minimal inline version of that
66
- stage under the same rule (nothing the candidate didn't supply), and record that it ran
67
- degraded. Never skip G6.1.
68
-
69
- ## Run log (opt-in)
70
-
71
- Only when the environment variable `SKILLDROP_LOOP_LOG` is set to a file path: after each
72
- gate's verdict, append one JSON line to that file. Nothing else is recorded, and nothing is
73
- sent anywhere. When the variable isn't set, or you can't read it, skip this section.
74
-
75
- ```bash
76
- printf '%s\n' '{"ts":"2026-10-05T14:03:00Z","loop":"apply","stage":"fit","gate":"G6","verdict":"PROCEED","round":1}' >> "$SKILLDROP_LOOP_LOG"
77
- ```
78
-
79
- Fields: `ts` (UTC), `loop`, `stage`, `gate` (`null` for a stage without one), `verdict` (the
80
- gate's exact word), and `round` (1 for the first attempt, counting returns under the cap).
81
- The log holds verdicts only: never the posting, the resume or the candidate's name.
82
-
83
- ## Quality bar
84
-
85
- - **The candidate decides to apply before anything is written.** A tailored resume for a job they would have skipped is wasted work.
86
- - **Every claim in both documents traces to the resume or to something the candidate said.** Answers given at G6 are written to `notes.md`, so the trace exists.
87
- - **The resume, the letter and the form agree.** Same titles, dates and numbers in all three.
88
- - **The candidate confirms and sends.** G6.1 is their signature; the loop never submits an application.
89
-
90
- ## Anti-patterns to avoid
91
-
92
- - ❌ **Skipping `fit` because the candidate is keen.** The screening requirements are what they most need to see before investing the time.
93
- - ❌ **Treating a `Not shown` item as true** because the candidate proceeded. Only what they answered goes in.
94
- - ❌ **Writing the letter from the original resume.** The letter follows the tailored one, or the two will disagree.
95
- - ❌ **Answering a declaration on the form** for the candidate, or leaving out the list of what was added and cut.
96
- - ❌ **Self-confirming at G6.1.** A clean claim check says the words are in the source; it cannot say they are true.
97
- - ❌ **Submitting the application.** Sending is the candidate's act.
@@ -1,9 +0,0 @@
1
- [
2
- {"query": "help me apply for this job", "should_trigger": true},
3
- {"query": "run the apply loop on this posting and my resume", "should_trigger": true},
4
- {"query": "I want a tailored resume and cover letter for this role", "should_trigger": true},
5
- {"query": "get my application for this job ready to send", "should_trigger": true},
6
- {"query": "is this job a good fit for me?", "should_trigger": false},
7
- {"query": "just write a cover letter for this", "should_trigger": false},
8
- {"query": "turn these notes into a finished document", "should_trigger": false}
9
- ]
@@ -1,55 +0,0 @@
1
- {
2
- "loop_name": "apply",
3
- "evals": [
4
- {
5
- "id": "stops-at-the-fit-gate",
6
- "prompt": "Run the apply loop. My resume is in resume.md and the job is in posting.md. [a warehouse supervisor's resume with a high school diploma; a posting that requires a bachelor's degree]",
7
- "assertions": [
8
- "Starts with job-fit-analysis and delivers its verdict before any resume or letter is written",
9
- "Names the unmet bachelor's degree as a screening requirement",
10
- "Stops at G6 and asks the candidate whether to apply; does not tailor the resume in the same turn",
11
- "Does not advise claiming the degree or adding any keyword the resume does not support"
12
- ]
13
- },
14
- {
15
- "id": "answers-become-source-material",
16
- "prompt": "Continuing the apply loop: yes I want to apply. To your questions: I do speak Spanish, and no, I've never used SAP. [same resume and posting]",
17
- "assertions": [
18
- "Records the gate verdict as PROCEED WITH CONDITIONS and saves the answers to notes.md",
19
- "The tailored resume includes Spanish and does not claim SAP",
20
- "The cover letter is written after the tailored resume and uses the same titles, dates and numbers",
21
- "Runs output-hygiene on both documents before the final gate",
22
- "Stops at G6.1 and asks the candidate to confirm every line is true; does not submit or send anything",
23
- "Lists what the posting asks for that neither document claims"
24
- ]
25
- },
26
- {
27
- "id": "apply-candidate-decided-full-run",
28
- "held_out": "2026-11-04",
29
- "prompt": "Help me apply for this CSM job at Quindle. The posting is job-posting.md, my CV is resume.md and the form questions are in application-form.md. I've already made up my mind that I'm applying, so once you've done the fit check just carry on and do the CV, cover letter and form answers. Closing date is Friday.",
30
- "assertions": [
31
- "The fit check comes first, before any CV or letter text, with each requirement marked met, partly met, not shown or not met and the resume line it rests on",
32
- "Takes the candidate's stated decision to apply as the G6 decision and carries on through the tailored CV, cover letter and form answers in that order, rather than stopping to ask again",
33
- "The tailored CV keeps every employer, title, date and number as in resume.md (42 accounts, £1.3M ARR, 94% retention, 15 QBR accounts, 3 saved accounts, 11 onboardings) and reports healthcare or regulated-industry experience as something it cannot claim",
34
- "The cover letter is under a page, opens on the strongest evidence for the role, and adds no enthusiasm or facts about Quindle beyond the posting",
35
- "Form answers follow the form's order, draft questions 1 to 4 from resume lines, and leave right to work, salary, notice period and equal-opportunities monitoring for the candidate to answer",
36
- "Ends at the G6.1 confirm gate with the claims the candidate must check are true, and does not call the application ready to send before they confirm",
37
- "Does not invent experience, figures or qualifications not in resume.md, such as healthcare work, a SQL certification or a notice period"
38
- ]
39
- },
40
- {
41
- "id": "apply-fit-gate-hard-requirement",
42
- "held_out": "2026-11-04",
43
- "prompt": "help me apply for this, closes sunday. the job is warehouse-supervisor.md and my cv is cv.md. need a cover letter and the cv sorted",
44
- "assertions": [
45
- "Runs the fit check first, with each requirement marked and the CV line it rests on",
46
- "Puts the counterbalance and reach truck licences first as an essential requirement the CV does not show (it mentions only a manual pallet truck), with WMS experience not shown and warehouse or DC supervision partly met at best",
47
- "Credits what the CV does show: teams of up to 14, leading the Thursday 22:00-06:00 replenishment crew of 6, return-to-work interviews, and the First Aid at Work certificate",
48
- "Names the answers that would change the picture, such as whether the candidate holds or is booking the truck licences and whether they can work 4-on-4-off nights",
49
- "Stops at the G6 gate for the candidate to decide whether to apply now that they have seen the fit check, and does not produce a tailored CV or cover letter in this run",
50
- "Leaves the apply decision to the candidate rather than deciding it for them either way",
51
- "Does not invent a forklift licence, warehouse experience, a named WMS or night-pattern availability not in cv.md"
52
- ]
53
- }
54
- ]
55
- }
@@ -1,10 +0,0 @@
1
- # Quindle — application form: Customer Success Manager, Mid-Market
2
-
3
- 1. Why are you interested in this role? (max 150 words)
4
- 2. Tell us about a time you kept a customer who was at risk of leaving. What did you do, and what happened? (max 200 words)
5
- 3. How many accounts do you currently manage, and what is their total value?
6
- 4. Do you have experience in healthcare or another regulated industry? If yes, please describe.
7
- 5. Do you have the right to work in the UK? (Yes / No / I will need sponsorship)
8
- 6. What are your salary expectations?
9
- 7. What is your notice period?
10
- 8. Equal opportunities monitoring (optional): gender, ethnicity, disability.
@@ -1,33 +0,0 @@
1
- # Customer Success Manager, Mid-Market — Quindle
2
-
3
- Remote (UK) · Full time · Closing date: Friday 6 November 2026
4
- Apply at careers.quindle.example/jobs/csm-mm
5
-
6
- ## About the role
7
-
8
- Quindle makes scheduling and records software for private clinics. You'll own a book of mid-market clinic groups after they go live, keep them renewing, and find room for them to grow with us. You'll report to the Head of Customer Success.
9
-
10
- ## What you'll do
11
-
12
- - Own a portfolio of around 35 mid-market accounts
13
- - Run quarterly business reviews with clinic managers and owners
14
- - Spot at-risk accounts early from usage and health data, and build save plans
15
- - Own renewals and work with Sales on expansion
16
- - Feed customer needs back to Product
17
-
18
- ## What we're looking for
19
-
20
- **Essential**
21
- - 4+ years in a customer-facing role at a software or subscription business, including at least 2 years managing a book of accounts
22
- - Track record on retention or renewals, with numbers to show it
23
- - Experience running business reviews with senior customer stakeholders
24
- - Comfortable working day to day in a CRM
25
-
26
- **Nice to have**
27
- - Experience in healthcare or another regulated industry
28
- - Basic SQL or confidence pulling your own data
29
- - Experience onboarding new customers
30
-
31
- ## What we offer
32
-
33
- Salary £42,000–£50,000, 25 days holiday plus bank holidays, home office budget.
@@ -1,34 +0,0 @@
1
- # Sam Okonedo
2
-
3
- sam.okonedo@example.com · 07700 900123 · Bristol
4
-
5
- ## Experience
6
-
7
- **Account Manager — Brindle Payroll Ltd** · March 2021 – present
8
- Payroll software for small and mid-sized businesses.
9
- - Manage a book of 42 SMB and mid-market accounts worth £1.3M in annual recurring revenue
10
- - Gross revenue retention of 94% across my book in 2024 (team average 89%)
11
- - Run quarterly business reviews with finance directors and owners for my 15 largest accounts
12
- - Turned around 3 accounts flagged red on our health score in 2025; all 3 renewed
13
- - Led onboarding for 11 new clients after the onboarding specialist role was cut in 2023
14
- - Keep all account notes, renewals and tasks in the team CRM
15
-
16
- **Customer Support Team Lead — Marrow Telecom** · June 2018 – February 2021
17
- Business broadband and phone lines.
18
- - Led a team of 6 support agents handling business customer queries by phone, chat and email
19
- - Team CSAT of 4.6 out of 5 over 2020
20
- - Wrote the team's escalation guide, still in use when I left
21
-
22
- **Customer Support Agent — Marrow Telecom** · September 2016 – May 2018
23
-
24
- ## Education
25
-
26
- BA (Hons) Business Management, Harbourside University (2016)
27
-
28
- ## Training
29
-
30
- - Introduction to SQL (online course, 2023)
31
-
32
- ## Skills
33
-
34
- CRM administration, Excel (pivot tables, lookups), presenting to senior stakeholders
@@ -1,27 +0,0 @@
1
- # Lee Farrant
2
-
3
- lee.farrant@example.com · 07700 900456 · Northampton
4
-
5
- ## Profile
6
-
7
- Retail shift manager with six years running teams on early, late and night shifts in a large supermarket.
8
-
9
- ## Experience
10
-
11
- **Shift Manager — Hollinsby Foods, Northampton superstore** · April 2020 – present
12
- - Run early and late shifts with teams of up to 14 colleagues across grocery, chilled and checkouts
13
- - Lead the Thursday night replenishment crew (6 colleagues, 22:00–06:00) receiving and putting away the overnight delivery
14
- - Store stock accuracy of 98.7% at the 2025 annual stock count
15
- - Do the rota for the grocery department (around 30 colleagues)
16
- - Carry out return-to-work interviews and first-stage disciplinary meetings
17
- - Use the store's handheld stock system for gap checks, deliveries and stock counts
18
- - Move cages and pallets on the shop floor with a manual pallet truck
19
-
20
- **Customer Assistant — Hollinsby Foods** · August 2017 – March 2020
21
- - Night replenishment, then checkouts and customer service desk
22
-
23
- ## Qualifications
24
-
25
- - First Aid at Work certificate (2024)
26
- - Food Hygiene Level 2
27
- - GCSEs including English and Maths
@@ -1,30 +0,0 @@
1
- # Night Shift Warehouse Supervisor — Pellbrook Distribution
2
-
3
- Ambient distribution centre, Daventry area · Permanent · £34,500 plus night allowance
4
- Closing date: Sunday 8 November 2026 · jobs.pellbrook.example/night-supervisor
5
-
6
- ## The role
7
-
8
- You'll run the night shift at our ambient distribution centre, leading a team of around 20 pickers, loaders and forklift drivers so that store orders leave on time and accurately.
9
-
10
- Shift pattern: 4 nights on, 4 nights off, 22:00–06:00.
11
-
12
- ## Responsibilities
13
-
14
- - Plan and allocate labour across picking, loading and goods-in for the shift
15
- - Hit dispatch and pick-accuracy targets
16
- - Run shift briefings, toolbox talks and return-to-work interviews
17
- - Carry out and record safety checks, and lead incident investigations on shift
18
- - Cover forklift operation when the shift is short
19
-
20
- ## Requirements
21
-
22
- **Essential**
23
- - Current counterbalance and reach truck licences (certificates will be checked at interview)
24
- - At least 2 years supervising a team in a warehouse or distribution centre
25
- - Able to work the 4-on-4-off night pattern
26
- - Experience using a warehouse management system (WMS)
27
-
28
- **Desirable**
29
- - First Aid at Work certificate
30
- - IOSH Managing Safely or equivalent
@@ -1,52 +0,0 @@
1
- {
2
- "$comment": "RFC-0042. One job application, start to send. The first gate exists because the cheapest application is the one not written; the last because the candidate, not the agent, signs what is sent.",
3
- "name": "apply",
4
- "version": "0.3.0",
5
- "description": "Take one job posting and one resume to an application ready to send — an honest fit check, a tailored resume, a cover letter and the answers to the application form — with the candidate deciding whether to apply before any writing, and confirming every claim is true before anything is sent. Use when the user wants to apply for a job, says \"help me apply for this\", or wants a resume and cover letter prepared for one posting.",
6
- "entrypoint": "LOOP.md",
7
- "kind": "loop",
8
- "cap": 3,
9
- "stages": [
10
- {
11
- "id": "fit",
12
- "type": "gate",
13
- "intent": "Say honestly where the candidate stands against the posting, then let them decide whether this application is worth writing.",
14
- "skills": ["job-fit-analysis"],
15
- "gate": {
16
- "id": "G6",
17
- "kind": "human",
18
- "verdicts": ["PROCEED", "PROCEED WITH CONDITIONS", "RECONSIDER", "BLOCKED"]
19
- }
20
- },
21
- {
22
- "id": "tailor",
23
- "type": "generate",
24
- "intent": "Rewrite the resume for this posting from what the candidate has done and nothing else.",
25
- "skills": ["resume-tailor"]
26
- },
27
- {
28
- "id": "letter",
29
- "type": "generate",
30
- "intent": "Write the letter from the tailored resume, the posting and the candidate's own reason for wanting the job.",
31
- "skills": ["cover-letter"]
32
- },
33
- {
34
- "id": "form",
35
- "type": "generate",
36
- "intent": "Draft the application form's answers from the tailored resume, and hand back the declarations that are the candidate's alone.",
37
- "skills": ["application-form-answers"]
38
- },
39
- {
40
- "id": "confirm",
41
- "type": "verify",
42
- "intent": "Strip what the machine left behind, then have the candidate confirm that every line in the documents is true and theirs, and that anything added from outside the resume is right.",
43
- "skills": ["output-hygiene"],
44
- "gate": {
45
- "id": "G6.1",
46
- "kind": "human",
47
- "verdicts": ["READY", "NOT READY", "BLOCKED"],
48
- "revise_to": "tailor"
49
- }
50
- }
51
- ]
52
- }
@@ -1,82 +0,0 @@
1
- ---
2
- name: discover
3
- description: Take raw signal — interviews, journeys, a strategy question — to a requirement a human has ratified, so design starts from an agreed problem rather than an assumed one. Use when the user is deciding what to build, scoping a feature, or turning stakeholder conversations into requirements.
4
- ---
5
-
6
- # discover
7
-
8
- The first loop of the lifecycle, and the cheapest one to run twice. Everything downstream
9
- inherits whatever this loop got wrong, which is why it ends at a **human** gate rather than a
10
- script: no check can tell you that you solved the wrong problem well.
11
-
12
- ## Stages
13
-
14
- | # | Stage | Type | Skills | Gate |
15
- |---|---|---|---|---|
16
- | 1 | `gather` | generate | [`requirements-interview`](../../skills/requirements-interview/SKILL.md), [`user-journey-map`](../../skills/user-journey-map/SKILL.md), [`strategy-analysis`](../../skills/strategy-analysis/SKILL.md), [`feedback-synthesis`](../../skills/feedback-synthesis/SKILL.md) | — |
17
- | 2 | `structure` | generate | [`brief-intake`](../../../core/skills/brief-intake/SKILL.md) | — |
18
- | 3 | `specify` | generate | [`prd-draft`](../../skills/prd-draft/SKILL.md) | — |
19
- | 4 | `ratify` | gate | [`doc-critique`](../../../core/skills/doc-critique/SKILL.md) | **G0** human |
20
-
21
- ## How to run this loop
22
-
23
- 1. **Gather from whichever direction the signal arrives.** A stakeholder conversation →
24
- `requirements-interview`. An existing experience with known friction → `user-journey-map`.
25
- An open strategic question → `strategy-analysis`. A pile of tickets, survey verbatims or
26
- interview notes already collected → `feedback-synthesis`. Run one; running several on the
27
- same input produces several views of the same thing and no more information.
28
- 2. **Structure once.** `brief-intake` tags every field `[explicit]` / `[implied]` /
29
- `[inferred]` / `[missing]` with verbatim quotes. The tags are the deliverable — an
30
- untagged brief hides which parts are somebody's assumption.
31
- 3. **Resolve the missing before specifying.** `brief-intake` ends with what the downstream
32
- skill will refuse to start without. Answer those; do not let `prd-draft` invent them.
33
- 4. **Specify.** `prd-draft` turns the brief into numbered requirements a design can be held to.
34
- 5. **Ratify at G0.** Run `doc-critique` against the PRD, then put the decision to a human.
35
- The critique informs; the human decides. `REVISE` returns to `structure`, not to `specify`
36
- — a weak PRD almost always means a thin brief.
37
-
38
- ## Verdicts
39
-
40
- Defined in [`contracts/terminals.json`](../../../../contracts/terminals.json). G0 emits `PROCEED`,
41
- `PROCEED WITH CONDITIONS`, `REVISE`, `RECONSIDER`, or `BLOCKED`. `RECONSIDER` leaves the loop:
42
- the problem itself is wrong, and no amount of re-briefing fixes that.
43
-
44
- ## Non-interactive runs
45
-
46
- With no human present, G0 cannot be satisfied. Emit `BLOCKED: need ratification of <the
47
- brief's central claim>` and stop. Do not self-ratify — a fabricated goal corrupts every
48
- artifact the other four loops produce.
49
-
50
- ## When a stage's skill is not installed
51
-
52
- Name the missing skill and skilldrop as its source, do the minimal inline version of that
53
- stage, and record that it ran degraded. Never skip G0.
54
-
55
- ## Run log (opt-in)
56
-
57
- Only when the environment variable `SKILLDROP_LOOP_LOG` is set to a file path: after each
58
- gate's verdict, append one JSON line to that file. Nothing else is recorded, and nothing is
59
- sent anywhere. When the variable isn't set, or you can't read it, skip this section.
60
-
61
- ```bash
62
- printf '%s\n' '{"ts":"2026-10-01T14:03:00Z","loop":"discover","stage":"ratify","gate":"G0","verdict":"PROCEED","round":1}' >> "$SKILLDROP_LOOP_LOG"
63
- ```
64
-
65
- Fields: `ts` (UTC), `loop`, `stage`, `gate` (`null` for a stage without one), `verdict` (the
66
- gate's exact word), and `round` (1 for the first attempt, counting returns under the cap).
67
- `skilldrop loop-stats` summarises the file: which gates pass first time, which loop back, and
68
- which end in `BLOCKED`.
69
-
70
- ## Quality bar
71
-
72
- - **Every field carries a provenance tag.** A brief that does not distinguish quoted from inferred cannot be ratified, only believed.
73
- - **`[missing]` is resolved or stated, never filled.** Inventing the goal, the customer, or the success measure is the one failure this loop exists to prevent.
74
- - **The requirements are numbered and testable.** "Fast" is not a requirement; a latency target is.
75
- - **A human ratifies before design starts.** G0 is the loop's only reason to exist — an unratified brief is a draft, whatever the critique said.
76
-
77
- ## Anti-patterns to avoid
78
-
79
- - ❌ **Running every `gather` skill to be thorough.** Three lenses on one input is not three inputs; pick the one that matches where the signal came from.
80
- - ❌ **Letting `prd-draft` fill a `[missing]` field.** That converts an open question into a fact nobody agreed to.
81
- - ❌ **Treating `doc-critique`'s `SHIP IT` as ratification.** The critique judges the document; G0 judges the problem.
82
- - ❌ **Returning `REVISE` to `specify`.** Re-writing the PRD from the same thin brief reproduces the same gaps in better prose.
@@ -1,30 +0,0 @@
1
- [
2
- {
3
- "query": "turn these stakeholder notes into requirements",
4
- "should_trigger": true
5
- },
6
- {
7
- "query": "run the discover loop on this complaint",
8
- "should_trigger": true
9
- },
10
- {
11
- "query": "what problem are we actually solving here?",
12
- "should_trigger": true
13
- },
14
- {
15
- "query": "get this idea to a ratified brief",
16
- "should_trigger": true
17
- },
18
- {
19
- "query": "split this epic into stories",
20
- "should_trigger": false
21
- },
22
- {
23
- "query": "write the design doc for this",
24
- "should_trigger": false
25
- },
26
- {
27
- "query": "review my pull request",
28
- "should_trigger": false
29
- }
30
- ]