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
package/README.md CHANGED
@@ -33,7 +33,7 @@ Install one pack. Every role pack also brings `core` (intake, critique, review c
33
33
  - **Governance, risk and compliance:** `grc` — DPIAs, SOC 2 evidence maps, risk registers, security questionnaire answers. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/grc/)
34
34
  - **Infrastructure as code:** `infra-as-code` — Terraform modules with secure defaults, and plan reviews before apply. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/infra-as-code/)
35
35
  - **Writing agent skills:** `skill-engineering` — author a portable skill with evals, and review one before it ships. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/skill-engineering/)
36
- - **Applying for a job:** `career` — an honest fit check against the posting, a tailored resume and a cover letter that claim nothing you didn't. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/career/)
36
+ - **Applying for a job:** `career` — an honest fit check against the posting, a tailored resume and cover letter that claim nothing you didn't, and the application form's answers. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/career/)
37
37
  - **Everyone:** `core` on its own. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/core/)
38
38
 
39
39
  ## Start in one command
package/catalogue.json CHANGED
@@ -188,11 +188,12 @@
188
188
  },
189
189
  "apply-for-a-job": {
190
190
  "for": "Anyone applying for a job, in any field",
191
- "description": "Prepare one application that is tailored and true: an honest fit check against the posting, a resume reworked without adding a claim, and a cover letter built only from what you supplied.",
191
+ "description": "Prepare one application that is tailored and true: an honest fit check against the posting, a resume reworked without adding a claim, a cover letter built only from what you supplied, and the application form's answers drafted from your resume.",
192
192
  "skills": [
193
193
  "job-fit-analysis",
194
194
  "resume-tailor",
195
- "cover-letter"
195
+ "cover-letter",
196
+ "application-form-answers"
196
197
  ]
197
198
  }
198
199
  }
@@ -493,6 +493,10 @@
493
493
  "cover-letter": {
494
494
  "tier": "standard",
495
495
  "rationale": "A short letter from supplied facts, with a script listing every figure and name the person's material doesn't contain."
496
+ },
497
+ "application-form-answers": {
498
+ "tier": "standard",
499
+ "rationale": "Sorts questions into three kinds and drafts short answers from the resume. The hard rule is mechanical: a declaration is never answered for the person."
496
500
  }
497
501
  }
498
502
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skilldrop-cli",
3
- "version": "0.16.7",
3
+ "version": "0.16.9",
4
4
  "description": "Portable AI-agent skills, measured against the agent without them. ADRs, PRDs, runbooks, decks and reviews, installable into Claude Code, Cursor, Kiro, and any IDE that takes custom instructions. One command per skill or per role-based pack.",
5
5
  "author": {
6
6
  "name": "Sanjay Ananthanarayan",
@@ -44,6 +44,36 @@
44
44
  "It does not state that a specific law, regulator or sector code applies as fact; any mention is marked as something to confirm",
45
45
  "The policy itself is short: about two pages or less (roughly 800 words)"
46
46
  ]
47
+ },
48
+ {
49
+ "id": 4,
50
+ "held_out": "2026-10-06",
51
+ "prompt": "I'm in security GRC at Ledgerline Payments (850 people) and I've been handed the AI acceptable-use policy to draft. The CISO's brief is in ciso-brief.md, the tools we have are in tool-inventory.csv, legal's notes are in legal-notes.md and there's a write-up of last month's incident in incident-summary.md. Can you draft it? Three pages tops — it's going to the exec meeting and people won't read more than that.",
52
+ "assertions": [
53
+ "It says cardholder data must not go into any AI tool, including CodePilot Enterprise, and tells the CISO it has not included the rule she asked for because legal's notes say the Corvane Bank agreement and PCI scope prohibit it regardless of zero retention",
54
+ "LingoDraft is not listed as approved: its contract expired on 31 August 2026 and the renewal is unsigned, and the draft says what support should do for translation meanwhile or flags it for decision",
55
+ "Transcribo is not approved for customer calls: the DPA is unsigned, so the support team's plan for next month is blocked until it is signed",
56
+ "It points out that CodePilot has 300 seats against 410 engineers, so about 110 engineers have no seat, and says what they should use or do instead of a personal account",
57
+ "It does not route exceptions to the AI Review Group as if it were working: it notes the group has not met since June and has no chair, and names an interim approver role or flags the decision for the exec",
58
+ "It says production logs and other customer data must not be pasted into personal or public AI accounts, and gives staff a specific place to report it if they already have",
59
+ "Last-four card digits together with an email address are treated as cardholder data for now, with a note that legal is still confirming this",
60
+ "It names no law, regulation or standard other than GDPR and PCI DSS, and does not name the engineer involved in the incident"
61
+ ]
62
+ },
63
+ {
64
+ "id": 5,
65
+ "held_out": "2026-10-06",
66
+ "prompt": "I run a small video production studio, 9 of us. One of our clients, a big retailer, has sent a supplier questionnaire and one question is 'do you have an AI policy?' We don't. What I know: we use AI image generation for mood boards and storyboards, a few people use ChatGPT for first drafts of scripts, and I think one of the editors has been using an AI voice tool for scratch voiceovers. The client contracts say something about not using their footage for anything else, but I haven't re-read them. Can you write me a one-pager I can attach to the questionnaire?",
67
+ "assertions": [
68
+ "It delivers a draft policy in the reply and does not stop at a list of questions",
69
+ "It says client footage, briefs and unreleased material must not be put into AI tools unless the client's contract or written permission allows it, and says what staff do in the meantime",
70
+ "It tells the user to re-read the client contracts before sending this, and does not state what those contracts permit or prohibit as if known",
71
+ "It covers the three uses mentioned (image generation for mood boards and storyboards, ChatGPT for script drafts, the AI voice tool) and marks the voice tool use as unconfirmed; it does not present a list of approved tools with accounts or plans as already settled",
72
+ "It says a real person's voice or likeness must not be cloned or imitated with AI without that person's consent",
73
+ "It says whether and when a client is told that AI-generated images, voice or script went into work delivered to them",
74
+ "It does not state as fact that a specific law applies or that the studio owns the copyright in AI-generated material; any such point is marked as something to check",
75
+ "The policy itself fits on about one page (roughly 500 words or fewer)"
76
+ ]
47
77
  }
48
78
  ]
49
79
  }
@@ -0,0 +1,15 @@
1
+ From: Anneliese Vort (CISO)
2
+ To: Security GRC
3
+ Date: 28 September 2026
4
+ Subject: AI policy - what I want in it
5
+
6
+ Notes for the draft. I need it for the exec meeting on the 15th.
7
+
8
+ - One policy for all 850 staff, not one per department.
9
+ - All four tools on the inventory are approved. List them.
10
+ - Everyone in engineering (410 people) has a CodePilot Enterprise licence, so there is no reason for anyone to be using a personal account. Say so.
11
+ - Because CodePilot has the zero-retention addendum, say card data is OK in CodePilot. Engineers debugging payment issues need it, and it will stop them going elsewhere.
12
+ - Exceptions go through the AI Review Group.
13
+ - Support want to start using Transcribo on customer calls from next month. Cover that.
14
+ - Refer to the 9 September incident so people understand why we are doing this, without naming the engineer.
15
+ - People will not read ten pages.
@@ -0,0 +1,22 @@
1
+ # INC-2291: summary
2
+
3
+ Opened 10 September 2026. Status at 30 September: open.
4
+
5
+ ## What happened
6
+ On 9 September an engineer debugging failed refunds pasted about 600 lines of production logs into a personal account on a public chatbot.
7
+
8
+ ## What was in the logs
9
+ - 2,300 customer email addresses
10
+ - The last four digits of card numbers
11
+ - No full card numbers, expiry dates or security codes
12
+
13
+ ## Timeline
14
+ - 9 Sept: logs pasted.
15
+ - 10 Sept: the engineer reported it themselves to their team lead, who did not know where to send it. It reached Security that afternoon.
16
+ - 11 Sept: deletion request sent to the chatbot provider.
17
+ - 30 Sept: no confirmation of deletion received.
18
+
19
+ ## Contributing factors
20
+ - The engineer had no CodePilot Enterprise seat and was on the waiting list.
21
+ - No written guidance on whether logs may be pasted into AI tools.
22
+ - No clear place to report it.
@@ -0,0 +1,14 @@
1
+ # Legal notes for the AI policy
2
+
3
+ Bartholomew Nkemelu, Senior Counsel, Ledgerline Payments
4
+ 22 September 2026
5
+
6
+ 1. **Cardholder data.** Card numbers, expiry dates and security codes must not leave the cardholder data environment. Our PCI DSS scope and our acquiring agreement with Corvane Bank (clause 14.3) both prohibit sending cardholder data to any third party not listed in the agreement. Northgate AI is not listed. A zero-retention addendum does not change this.
7
+
8
+ 2. **Customer personal data.** Under GDPR, customer names, email addresses and transaction history may be processed in AskDesk and CodePilot Enterprise under the signed DPAs. They may not go into any tool without a signed DPA.
9
+
10
+ 3. **Transcribo.** We are still negotiating the sub-processor terms. Do not record customers until the DPA is signed. I cannot give a date.
11
+
12
+ 4. **AI Review Group.** It has not met since June. Idris, who chaired it, moved to the Lisbon office project and was not replaced. Somebody needs to decide who approves exceptions. That is not a legal decision.
13
+
14
+ 5. **Not yet checked.** Whether the last four digits of a card number together with an email address count as cardholder data under our scope. I will confirm with the QSA. Treat as cardholder data until I do.
@@ -0,0 +1,5 @@
1
+ tool,vendor,purpose,seats,contract_status,contract_end,data_terms,notes
2
+ CodePilot Enterprise,Northgate AI,coding assistant,300,signed,2027-03-31,"zero-retention addendum signed 2026-02-12; no training on our data",engineering only; waiting list open
3
+ AskDesk,Pellam Systems,general internal chatbot,850,signed,2027-01-31,"DPA signed; no training on our data; 30-day retention; EU hosting",SSO for all staff
4
+ Transcribo,Transcribo Inc,meeting notetaker,40,pilot,2026-12-31,"DPA in legal review - not signed",pilot limited to internal meetings
5
+ LingoDraft,Lingo Labs,translation,25,expired,2026-08-31,"renewal not signed",support still use it for Polish and Spanish replies
@@ -42,6 +42,36 @@
42
42
  "It does not state a tracking number format or pattern, a weight limit, carrier names or a dimension unit as fact",
43
43
  "It does not describe the lookup's return fields as fact, and says what the lookup returns is not yet known"
44
44
  ]
45
+ },
46
+ {
47
+ "id": 4,
48
+ "held_out": "2026-10-06",
49
+ "prompt": "Need a Claude tool so our support assistant can issue refunds itself. The endpoint spec is in refunds.openapi.yaml. Policy from Marguerite (head of support): the assistant can refund up to £500 on its own, anything above that goes to a human. Amounts are in pounds. Just the tool definition plus a short list of anything in the spec that looks off, I don't need the Python around it.",
50
+ "assertions": [
51
+ "It produces a tool definition with a name, a description and an input_schema of type object whose properties include the order reference, the amount and the reason",
52
+ "The amount parameter is an integer in minor units (pence) and its description says so; it is not defined as pounds or as a decimal",
53
+ "It flags that the spec caps amount_minor at 25000, which is £250 and below the £500 policy, and does not set the maximum to 50000",
54
+ "It flags that the spec lists amount_minor as required while its description says to omit it for a full refund",
55
+ "goodwill is either left out of the reason values or marked as deprecated with customer_request to be used instead",
56
+ "The definition states that reason_note is needed when the reason is other and is limited to 280 characters",
57
+ "It does not add parameters the spec does not have, such as a currency, a customer id or a refund method",
58
+ "The reply contains no Python client code"
59
+ ]
60
+ },
61
+ {
62
+ "id": 5,
63
+ "held_out": "2026-10-06",
64
+ "prompt": "ops run this script by hand to change a price:\n\n./reprice.sh SKU-4471 19.99 --store 12 --until 2026-11-01\n\nwant our pricing agent to be able to call it as a tool. store is optional (no store = all stores i think), until is optional too and the price goes back after that date. price is dollars. there's also a --force flag, no idea what it does, Wendell wrote the script and he's out till the 19th. quick one, just the json",
65
+ "assertions": [
66
+ "It delivers a tool definition with a name, a description and an input_schema, and does not stop at questions",
67
+ "The required array contains the SKU and the price, and does not contain store or until",
68
+ "The price parameter's description states the unit is dollars",
69
+ "It says that leaving store out meaning all stores is unconfirmed and should be checked",
70
+ "It does not state what --force does; force is either left out of the tool or included with its effect marked as unknown",
71
+ "The until parameter is described as a date in the YYYY-MM-DD form shown in the example",
72
+ "It does not state a SKU pattern, a price minimum or maximum, or a range of valid store numbers as fact; any such constraint is marked as an assumption",
73
+ "The reply is the JSON definition with at most a few lines of notes, and contains no Python client code"
74
+ ]
45
75
  }
46
76
  ]
47
77
  }
@@ -0,0 +1,63 @@
1
+ # Excerpt from payments-api/openapi.yaml, Lanternfold Events
2
+ # Changelog
3
+ # 2026-06-02 reason: "goodwill" deprecated, send "customer_request" instead.
4
+ # Still accepted until the end of the year.
5
+ # 2026-02-17 v2: amounts moved from decimal strings to integer minor units.
6
+ paths:
7
+ /v2/refunds:
8
+ post:
9
+ operationId: createRefund
10
+ summary: Refund all or part of a paid order
11
+ description: >
12
+ Creates a refund against a paid order. The money goes back to the
13
+ original payment method. An order can be refunded more than once, until
14
+ the refunded total reaches the amount paid. Returns 409 event_passed if
15
+ the event has already taken place, and 422 over_limit if the amount is
16
+ more than the remaining refundable amount.
17
+ requestBody:
18
+ required: true
19
+ content:
20
+ application/json:
21
+ schema:
22
+ type: object
23
+ additionalProperties: false
24
+ required: [order_id, amount_minor, reason]
25
+ properties:
26
+ order_id:
27
+ type: string
28
+ pattern: '^LF-[0-9]{8}$'
29
+ description: Order reference from the confirmation email, e.g. LF-00482913.
30
+ amount_minor:
31
+ type: integer
32
+ minimum: 1
33
+ maximum: 25000
34
+ description: >
35
+ Amount to refund, in minor units of the order's currency
36
+ (pence for GBP). Omit to refund the full remaining amount.
37
+ reason:
38
+ type: string
39
+ enum: [event_cancelled, event_rescheduled, duplicate_purchase, customer_request, goodwill, other]
40
+ description: Why the refund is being made. Shown on the finance report.
41
+ reason_note:
42
+ type: string
43
+ maxLength: 280
44
+ description: Free-text explanation. Required when reason is "other".
45
+ ticket_ids:
46
+ type: array
47
+ minItems: 1
48
+ items:
49
+ type: string
50
+ description: >
51
+ Tickets to cancel as part of this refund. Omit to leave the
52
+ order's tickets valid.
53
+ notify_customer:
54
+ type: boolean
55
+ default: true
56
+ description: Send the customer the refund confirmation email.
57
+ responses:
58
+ '201':
59
+ description: Refund created.
60
+ '409':
61
+ description: event_passed
62
+ '422':
63
+ description: over_limit or validation error
@@ -1,6 +1,6 @@
1
1
  ---
2
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 and a cover letter — 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.
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
4
  ---
5
5
 
6
6
  # apply
@@ -17,26 +17,34 @@ can say what the resume shows, but only the candidate knows what is true and wha
17
17
  | 1 | `fit` | gate | [`job-fit-analysis`](../../skills/job-fit-analysis/SKILL.md) | **G5** human |
18
18
  | 2 | `tailor` | generate | [`resume-tailor`](../../skills/resume-tailor/SKILL.md) | — |
19
19
  | 3 | `letter` | generate | [`cover-letter`](../../skills/cover-letter/SKILL.md) | — |
20
- | 4 | `confirm` | verify | [`output-hygiene`](../../../core/skills/output-hygiene/SKILL.md) | **G6** human |
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** human |
21
22
 
22
23
  ## How to run this loop
23
24
 
24
- 1. **Check the fit and stop.** Run `job-fit-analysis` on the posting and the resume. Put its
25
- verdict, the screening requirements and its questions to the candidate, then wait at G5.
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 G5.
26
29
  - `PROCEED`: they are applying. Go on.
27
30
  - `PROCEED WITH CONDITIONS`: they are applying and have answered the questions. Save
28
31
  their answers to `notes.md`; from here on those answers are source material alongside
29
32
  the resume.
30
33
  - `RECONSIDER`: they are not applying. The loop ends here, and that is a good outcome.
31
34
  2. **Tailor the resume.** Run `resume-tailor` with the resume, the posting and `notes.md`
32
- if it exists. Carry its "Not claimed" list forward.
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".
33
37
  3. **Write the letter.** Run `cover-letter` with the tailored resume, the posting, `notes.md`
34
38
  and the candidate's reason for wanting the job if they gave one. Skip this stage when the
35
39
  posting says not to send a letter.
36
- 4. **Clean both documents.** Run `output-hygiene` on the resume and the letter.
37
- 5. **Confirm at G6.** Show the candidate both documents with two short lists: what the
38
- posting asks for that neither document claims, and anything the claim check still lists.
39
- Ask them to confirm every line is true. `NOT READY` returns to `tailor` with their
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.** 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
40
48
  corrections added to `notes.md`. The candidate sends the application; the loop never does.
41
49
 
42
50
  ## Verdicts
@@ -76,7 +84,7 @@ The log holds verdicts only: never the posting, the resume or the candidate's na
76
84
 
77
85
  - **The candidate decides to apply before anything is written.** A tailored resume for a job they would have skipped is wasted work.
78
86
  - **Every claim in both documents traces to the resume or to something the candidate said.** Answers given at G5 are written to `notes.md`, so the trace exists.
79
- - **The resume and the letter agree.** Same titles, dates and numbers in both.
87
+ - **The resume, the letter and the form agree.** Same titles, dates and numbers in all three.
80
88
  - **The candidate confirms and sends.** G6 is their signature; the loop never submits an application.
81
89
 
82
90
  ## Anti-patterns to avoid
@@ -84,5 +92,6 @@ The log holds verdicts only: never the posting, the resume or the candidate's na
84
92
  - ❌ **Skipping `fit` because the candidate is keen.** The screening requirements are what they most need to see before investing the time.
85
93
  - ❌ **Treating a `Not shown` item as true** because the candidate proceeded. Only what they answered goes in.
86
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.
87
96
  - ❌ **Self-confirming at G6.** A clean claim check says the words are in the source; it cannot say they are true.
88
97
  - ❌ **Submitting the application.** Sending is the candidate's act.
@@ -1,8 +1,8 @@
1
1
  {
2
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
3
  "name": "apply",
4
- "version": "0.1.0",
5
- "description": "Take one job posting and one resume to an application ready to send — an honest fit check, a tailored resume and a cover letter — 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
+ "version": "0.2.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
6
  "entrypoint": "LOOP.md",
7
7
  "kind": "loop",
8
8
  "cap": 3,
@@ -30,10 +30,16 @@
30
30
  "intent": "Write the letter from the tailored resume, the posting and the candidate's own reason for wanting the job.",
31
31
  "skills": ["cover-letter"]
32
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
+ },
33
39
  {
34
40
  "id": "confirm",
35
41
  "type": "verify",
36
- "intent": "Strip what the machine left behind, then have the candidate confirm that every line in both documents is true and theirs.",
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.",
37
43
  "skills": ["output-hygiene"],
38
44
  "gate": {
39
45
  "id": "G6",
@@ -1,7 +1,16 @@
1
1
  {
2
- "description": "One job application, for any occupation: an honest check of your resume against the posting, a tailored resume and a cover letter that say nothing you didn't, and a script that lists every figure and name in a draft that your own resume doesn't contain.",
2
+ "description": "One job application, for any occupation: an honest check of your resume against the posting, a tailored resume and a cover letter that say nothing you didn't, the application form's answers drafted from your resume, and a script that lists every figure and name in a draft that your own resume doesn't contain.",
3
3
  "display_name": "Job applications",
4
- "keywords": ["resume", "cv", "cover letter", "job application", "job search", "career change", "job posting"],
4
+ "keywords": [
5
+ "resume",
6
+ "cv",
7
+ "cover letter",
8
+ "job application",
9
+ "job search",
10
+ "career change",
11
+ "job posting",
12
+ "application form"
13
+ ],
5
14
  "links": {
6
15
  "documentation": "https://sananthanarayan.github.io/skilldrop/packs/career/"
7
16
  },
@@ -12,13 +21,18 @@
12
21
  ],
13
22
  "first-value": {
14
23
  "audience-posture": "non-technical",
15
- "prerequisites": ["Your resume or CV as text, Markdown or a file your agent can read", "The job posting, pasted or saved as a file"],
24
+ "prerequisites": [
25
+ "Your resume or CV as text, Markdown or a file your agent can read",
26
+ "The job posting, pasted or saved as a file"
27
+ ],
16
28
  "starter-task": "Find out where you stand against a posting before you write the application",
17
29
  "starter-prompt": "My resume is in resume.md and the job I'm looking at is in posting.md. Am I a good fit? Be honest about what's missing.",
18
30
  "verification": "job-fit-analysis opens with a verdict (strong match, worth applying, long shot or not a match), lists the requirements an employer screens on first, marks every requirement met, partly, not shown or not met with the resume line behind it, and ends with questions about what your resume doesn't show.",
19
31
  "recovery": "If it credits you with something that isn't in your resume, say so and run it again. If job-fit-analysis does not activate, ask for it by name (\"use job-fit-analysis\")."
20
32
  },
21
- "requires": ["core"],
33
+ "requires": [
34
+ "core"
35
+ ],
22
36
  "journey": {
23
37
  "when": "You've found a job you might apply for and want an application that is tailored to it and true.",
24
38
  "you_bring": [
@@ -31,20 +45,26 @@
31
45
  "steps": [
32
46
  {
33
47
  "skill": "job-fit-analysis",
34
- "you_do": "Give it the posting and your resume.",
48
+ "you_do": "Give it the posting, your resume and anything else of yours that bears on the job, such as a LinkedIn summary or a project.",
35
49
  "you_get": "A verdict, the screening requirements first, every requirement marked against your resume with the line it rests on, and questions about what your resume doesn't show.",
36
50
  "decide": "Whether to apply, and your answers to its questions."
37
51
  },
38
52
  {
39
53
  "skill": "resume-tailor",
40
54
  "you_do": "Give it the resume, the posting and your answers.",
41
- "you_get": "A tailored resume in a new file with every employer, title, date and number as you had them, what changed, and what the posting asks for that your resume cannot claim."
55
+ "you_get": "A tailored resume in your resume's own format, as a new file, with every employer, title, date and number as you had them, plus what changed, what was cut, what was added from outside the resume, and what the posting asks for that it cannot claim."
42
56
  },
43
57
  {
44
58
  "skill": "cover-letter",
45
59
  "you_do": "Give it the tailored resume, the posting and your reason for wanting the job.",
46
60
  "you_get": "A letter under a page that opens on your strongest evidence and says nothing about you or the employer that you or the posting didn't supply."
47
61
  },
62
+ {
63
+ "skill": "application-form-answers",
64
+ "you_do": "If the application has a form, give it the form's questions and the tailored resume.",
65
+ "you_get": "An answer sheet in the form's order: answers drafted from your resume inside each word limit, the questions that could screen you out named first, and the declarations that are yours alone handed back with what on your resume bears on them.",
66
+ "decide": "Your answers on right to work, salary, start date and the other declarations."
67
+ },
48
68
  {
49
69
  "skill": "output-hygiene",
50
70
  "you_do": "Run it on the resume and the letter before you send them.",
@@ -52,6 +72,6 @@
52
72
  "decide": "Read both documents once more: you sign them, so every line has to be true."
53
73
  }
54
74
  ],
55
- "you_end_with": "A resume and a cover letter for one posting that you can defend line by line at interview, and a list of what the employer will notice is missing."
75
+ "you_end_with": "A resume, a cover letter and a form's answers for one posting that you can defend line by line at interview, and a list of what the employer will notice is missing."
56
76
  }
57
77
  }
@@ -0,0 +1,146 @@
1
+ ---
2
+ name: application-form-answers
3
+ description: Prepare the answers to a job application form from the person's resume: each question in the form's own order with either a drafted answer and the resume line behind it, or a note that it is theirs alone to answer (right to work, sponsorship, salary, declarations, monitoring questions), plus the questions that could screen the application out and the ones their resume already bears on. Works for any occupation. Use when the user says "help me fill in this application form", "answer these application questions", "what do I put for these screening questions", or pastes the questions from an online job application.
4
+ ---
5
+
6
+ # application-form-answers
7
+
8
+ You prepare an answer sheet for the form that sits between a finished resume and a submitted
9
+ application. Forms ask three kinds of question: facts the resume already answers, short
10
+ written answers, and declarations only the person can make. You draft the first two from
11
+ their own material and hand the third back to them, with a note when something on their
12
+ resume bears on it. A wrong tick on a form is a statement the person made to an employer, so
13
+ you never tick one for them.
14
+
15
+ ## How to respond
16
+
17
+ These four rules outrank the steps below.
18
+
19
+ - **Answer first.** The reply opens with the questions that need the person's attention,
20
+ then the answer sheet. No preamble.
21
+ - **Use only what you were given.** Answers come from the resume, the posting and what the
22
+ person told you. Nothing is filled in from what applicants usually say.
23
+ - **Deliver from what you have.** Draft every answer the material supports. Do not stop
24
+ because some answers are theirs to give.
25
+ - **Write to the person.** Address them as "you". The drafted answers are in their voice,
26
+ first person, ready to paste. No mention of this skill.
27
+
28
+ 1. **Read every file you were given, then take the questions from the form.** The resume,
29
+ the posting and the form are all sources: the posting holds the salary range and the
30
+ requirements the form's questions are screening for. Keep the form's order and wording,
31
+ its required and optional marks, its answer choices and its word or character limits.
32
+ Refer to each question by the form's own number or letter, or by its label when it has
33
+ none; never renumber. When the person pastes a link you cannot open, say so and ask for
34
+ the questions pasted in.
35
+
36
+ 2. **Sort each question into one of three kinds.**
37
+ - **From your resume**: a fact the resume settles. A name, a current job title, a
38
+ qualification held, a number the resume states, a rating of a skill the resume shows.
39
+ - **To write**: a free-text answer, such as a summary of experience, an example, or a
40
+ description of how they have used something.
41
+ - **Yours to answer**: anything that is a declaration, a preference or a private fact.
42
+ Right to work and visa sponsorship; salary, current or expected; notice period and start
43
+ date; willingness to relocate, travel or work a shift pattern; relatives at the company,
44
+ conflicts of interest and outside business; criminal record, disciplinary history and
45
+ health; referees; equal-opportunities questions on gender, ethnicity, age or disability;
46
+ "how did you hear about us"; and any yes or no about something the resume does not
47
+ state.
48
+
49
+ 3. **Answer the resume questions exactly as the resume has them.** Titles, dates,
50
+ qualifications and numbers are copied, not improved. Where a form offers choices, pick the
51
+ one the resume supports and say which line supports it. A qualification in progress is
52
+ not the qualification: choose the level actually held. Work out a number of years only
53
+ from the dates of the roles that count, show the sum, and when the question asks about
54
+ something the resume does not show them doing, the honest number is 0.
55
+
56
+ 4. **Draft the written answers from their own material, inside the limit.**
57
+ - Count the words or characters and stay under the form's limit.
58
+ - Use one or two specific things from the resume, with their numbers. Say what they did
59
+ and who used it. Add no result, effect or reason the resume does not state: "the
60
+ purchasing team uses it every week" is in the resume, "which cut queries" is not.
61
+ - When the question asks about something they have not done ("describe your experience
62
+ with SAP"), write the honest answer: what they have not used, then the nearest thing
63
+ they have, named as itself.
64
+ - When the question needs a story the resume does not contain ("a time you dealt with a
65
+ difficult customer"), do not invent one. Say which job it probably happened in and give
66
+ a four-line outline they can fill in: what happened, what you did, how it ended, what
67
+ you would do the same again. Ask them for the incident.
68
+ - "Why do you want to work here?" never gets an invented feeling, admiration or claim
69
+ about the employer. When they gave a reason, use it. When they gave none, draft from
70
+ fit alone: what the posting says the job is, set beside what the resume shows they
71
+ already do. Mark it as a starting point and ask for their own reason in a sentence.
72
+
73
+ 5. **Hand back the questions that are theirs, with what bears on them.** Do not suggest an
74
+ answer. Do point out what they should have in mind when they answer:
75
+ - something on the resume or cover letter that touches the question: a business they
76
+ founded and a question about outside activities, a city on the resume and a question
77
+ about the office, a career break and a question about gaps;
78
+ - a range the posting states, for a salary question;
79
+ - whether the field is optional. Monitoring questions are theirs and usually optional;
80
+ say so and nothing more.
81
+ A question about gaps in employment is answered with what the resume says about the gap,
82
+ word for word, and nothing added.
83
+
84
+ 6. **Name what could screen the application out.** A required question whose honest answer
85
+ is the one the employer does not want (no degree, None for a required tool, 0 years), and
86
+ a required field they cannot complete yet (a portfolio link they do not have). Put these
87
+ first, with what, if anything, they can do about each. Never change the answer to pass
88
+ the screen.
89
+
90
+ 7. **Keep the form, the resume and the letter consistent.** If an answer would differ from
91
+ the resume, such as a title or a date, the resume wins, and you say so.
92
+
93
+ 8. **Put the answers where the person asked for them.**
94
+ - When the form is a file and they ask you to fill it in, fill in that file: each answer
95
+ written against its question in the form's own layout, ready to copy across. A question
96
+ that is theirs gets a clearly marked blank, `[yours to answer]`, with any note about it
97
+ kept in the reply and out of the form.
98
+ - Otherwise the reply is the answer sheet: every question in the form's order, each with
99
+ the answer or "Yours to answer" and the resume line or note behind it.
100
+
101
+ 9. **Lay the reply out in this order:**
102
+ - **Before you submit**: the screening risks, then the questions that are theirs to
103
+ answer and what bears on each;
104
+ - the answer sheet, or the name of the file you filled in and the drafted written
105
+ answers so they can be read without opening it;
106
+ - nothing after it but a question, if one answer from them would complete a draft.
107
+
108
+ **With a form and no resume**, mark what you can from what the person said and return the
109
+ rest as needing the resume. **With no form questions**, ask for them in one line.
110
+
111
+ ## Quality bar
112
+
113
+ - **Every question on the form appears once, in the form's order and wording.**
114
+ - **No declaration, preference or private fact is answered for the person.**
115
+ - **Every drafted answer traces to the resume or the person's own words, and fits its limit.**
116
+ - **Honest answers that could screen the application out are named first, and left honest.**
117
+ - **Where the resume bears on a question that is theirs, they are told.**
118
+
119
+ ## When to use this skill
120
+
121
+ - ✅ An online application asks screening questions beyond uploading a resume
122
+ - ✅ A form wants short written answers with word limits
123
+ - ✅ Checking, before submitting, which answers are declarations to think about
124
+
125
+ ## When NOT to use this skill
126
+
127
+ - ❌ Deciding whether the job is worth applying for. Use `job-fit-analysis`.
128
+ - ❌ Tailoring the resume the form asks you to upload. Use `resume-tailor`.
129
+ - ❌ Writing the cover letter the form asks you to attach. Use `cover-letter`.
130
+
131
+ ## Anti-patterns to avoid
132
+
133
+ - ❌ **Ticking a declaration.** "Yes" to right to work, "No" to relatives, a salary figure:
134
+ none of these is in a resume, and guessing makes the person's statement for them.
135
+ - ❌ **Answering to pass the screen.** "Yes" to a degree they do not hold, "Basic" for a tool
136
+ they have never opened.
137
+ - ❌ **Inventing the example.** A made-up difficult customer is a lie they must then retell.
138
+ - ❌ **Inventing the motive.** No reason given, no "why us" answer written.
139
+ - ❌ **Advising on monitoring questions.** They are the person's, and optional is all you say.
140
+ - ❌ **Ignoring the limit.** A 160-word answer to a 100-word field is cut off by the form.
141
+ - ❌ **Answering in chat when asked to fill in the form.** They then have to copy every
142
+ answer across by hand.
143
+ - ❌ **Renumbering.** "Q4" for the form's fourth un-numbered field sends them to the wrong box.
144
+ - ❌ **Decorating a written answer** with an outcome the resume does not give.
145
+ - ❌ **Skipping questions.** Name, email and phone are listed too, so the sheet is complete.
146
+ - ❌ **Showing the machinery.** No legend, no account of how the sheet was produced.
@@ -0,0 +1,34 @@
1
+ [
2
+ {
3
+ "query": "Help me fill in this application form",
4
+ "should_trigger": true
5
+ },
6
+ {
7
+ "query": "What do I put for these screening questions on the job application?",
8
+ "should_trigger": true
9
+ },
10
+ {
11
+ "query": "Answer these application questions from my resume",
12
+ "should_trigger": true
13
+ },
14
+ {
15
+ "query": "The form has a 100-word 'summarise your experience' box, draft it from my CV",
16
+ "should_trigger": true
17
+ },
18
+ {
19
+ "query": "Is this job a good fit for me?",
20
+ "should_trigger": false
21
+ },
22
+ {
23
+ "query": "Tailor my resume for this posting",
24
+ "should_trigger": false
25
+ },
26
+ {
27
+ "query": "Write the cover letter for this application",
28
+ "should_trigger": false
29
+ },
30
+ {
31
+ "query": "Answer this customer's security questionnaire from our policies",
32
+ "should_trigger": false
33
+ }
34
+ ]