skilldrop-cli 0.16.8 → 0.16.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/contracts/guide.schema.json +5 -1
- package/package.json +1 -1
- package/packs/ai-engineering/skills/ai-usage-policy/evals/evals.json +30 -0
- package/packs/ai-engineering/skills/ai-usage-policy/evals/files/4/ciso-brief.md +15 -0
- package/packs/ai-engineering/skills/ai-usage-policy/evals/files/4/incident-summary.md +22 -0
- package/packs/ai-engineering/skills/ai-usage-policy/evals/files/4/legal-notes.md +14 -0
- package/packs/ai-engineering/skills/ai-usage-policy/evals/files/4/tool-inventory.csv +5 -0
- package/packs/api-builder/skills/tool-use-schema-writer/evals/evals.json +30 -0
- package/packs/api-builder/skills/tool-use-schema-writer/evals/files/4/refunds.openapi.yaml +63 -0
- package/packs/career/loops/apply/LOOP.md +11 -11
- package/packs/career/loops/apply/evals/evals.json +2 -2
- package/packs/career/loops/apply/loop.json +2 -2
- package/packs/career/skills/job-fit-analysis/SKILL.md +22 -8
- package/packs/career/skills/job-fit-analysis/manifest.json +1 -1
- package/packs/core/loops/ship-a-draft/LOOP.md +6 -6
- package/packs/core/loops/ship-a-draft/evals/evals.json +2 -2
- package/packs/core/loops/ship-a-draft/loop.json +1 -1
- package/packs/core/pack.json +1 -1
- package/packs/data-analytics/skills/metric-definition/evals/evals.json +30 -0
- package/packs/data-analytics/skills/metric-definition/evals/files/4/tables.md +32 -0
- package/packs/data-analytics/skills/metric-definition/evals/files/4/thread.md +31 -0
- package/packs/dev-team/loops/release/LOOP.md +15 -15
- package/packs/dev-team/loops/release/loop.json +3 -3
- package/packs/dev-team/skills/contribution-wizard/evals/evals.json +30 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/CONTRIBUTING.md +63 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/registry.json +15 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/PROMPT.md +10 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/01-expected.md +2 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/01-input.md +3 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/02-expected.md +1 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/02-input.md +2 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/03-expected.md +1 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/examples/03-input.md +2 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/flag-overdue-holds/meta.json +7 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/PROMPT.md +11 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/01-expected.md +4 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/01-input.md +4 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/02-expected.md +6 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/02-input.md +2 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/03-expected.md +1 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/examples/03-input.md +1 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/4/skills/summarise-reading-list/skill.toml +6 -0
- package/packs/dev-team/skills/devils-advocate/evals/evals.json +29 -0
- package/packs/dev-team/skills/devils-advocate/evals/files/4/lateFees.test.ts +46 -0
- package/packs/dev-team/skills/devils-advocate/evals/files/4/lateFees.ts +46 -0
- package/packs/dev-team/skills/release-notes/evals/evals.json +29 -0
- package/packs/dev-team/skills/release-notes/evals/files/4/git-log.txt +26 -0
- package/packs/research/skills/source-synthesis/evals/evals.json +30 -0
- package/packs/research/skills/source-synthesis/evals/files/4/behaviour-logs.md +31 -0
- package/packs/research/skills/source-synthesis/evals/files/4/parent-survey.md +25 -0
- package/packs/research/skills/source-synthesis/evals/files/4/pilot-report.md +27 -0
- package/packs/research/skills/source-synthesis/evals/files/4/teacher-focus-group.md +19 -0
- package/packs/research/skills/source-synthesis/evals/files/4/vendor-brochure.md +18 -0
- package/packs/solution-architect/skills/db-schema-design/evals/evals.json +30 -0
- package/packs/solution-architect/skills/db-schema-design/evals/files/4/finance-email.md +18 -0
- package/packs/solution-architect/skills/db-schema-design/evals/files/4/members_sample.csv +5 -0
- package/packs/solution-architect/skills/db-schema-design/evals/files/4/points_txn_sample.csv +17 -0
- package/packs/solution-architect/skills/db-schema-design/evals/files/4/requirements.md +28 -0
- package/packs/solution-architect/skills/design-doc/evals/evals.json +29 -0
- package/packs/solution-architect/skills/design-doc/evals/files/4/request.md +31 -0
- package/packs/solution-architect/skills/design-doc/evals/files/4/systems.md +40 -0
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/evals.json +29 -0
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/files/4/mobile-options.md +45 -0
- package/packs/sre-oncall/loops/operate/LOOP.md +4 -4
- package/packs/sre-oncall/loops/operate/evals/evals.json +1 -1
- package/packs/sre-oncall/loops/operate/loop.json +1 -1
- package/packs/sre-oncall/pack.json +1 -1
- package/packs/sre-oncall/skills/postmortem-generator/evals/evals.json +30 -0
- package/packs/sre-oncall/skills/postmortem-generator/evals/files/4/finance-recon.md +28 -0
- package/packs/sre-oncall/skills/postmortem-generator/evals/files/4/incident-channel.txt +34 -0
- package/packs/sre-oncall/skills/postmortem-generator/evals/files/4/scheduler-log.txt +15 -0
- package/packs/stakeholder-comms/skills/guide-builder/evals/evals.json +30 -0
- package/packs/stakeholder-comms/skills/guide-builder/evals/files/4/handover-thread.txt +39 -0
- package/packs/stakeholder-comms/skills/guide-builder/evals/files/4/it-notes.txt +21 -0
package/README.md
CHANGED
|
@@ -55,14 +55,14 @@ In Claude Code you can use the plugin marketplace instead: run `/plugin marketpl
|
|
|
55
55
|
## How it works
|
|
56
56
|
|
|
57
57
|
- **A skill produces one file you own.** Each ships a quality bar, named anti-patterns and acceptance evals, so the output is an artifact, not a conversation. See [every skill, by category](guides/reference/skill-catalogue.md).
|
|
58
|
-
- **Loops order skills, and a gate decides when work moves on.** Five loops cover the lifecycle (`discover`, `design`, `build`, `release`, `operate`), plus the `ship-a-draft` wrapper for any document and `apply` for a job application. Each gate is a script, a review panel or a person, chosen by how expensive the mistake is to undo. See [the loops, stage by stage](guides/reference/loops.md) and [why loops](guides/explanation/loops.md).
|
|
58
|
+
- **Loops order skills, and a gate decides when work moves on.** Five loops cover the lifecycle (`discover`, `design`, `build`, `release`, `operate`), plus the `ship-a-draft` wrapper for any document and `apply` for a job application. Each gate is a script, a review panel or a person, chosen by how expensive the mistake is to undo. See [the operating model](guides/explanation/operating-model.md) for every stage and gate on one page, [the loops, stage by stage](guides/reference/loops.md), and [why loops](guides/explanation/loops.md).
|
|
59
59
|
- **Measured, not asserted.** `run_bench.py` runs each acceptance eval with the skill and without it, in a sandbox, and reports the lift, a blind preference from two judges, and the cost per run. The results are published whether or not they flatter the skills. See [how skills are checked](https://sananthanarayan.github.io/skilldrop/evals/) and [RFC-0040](docs/rfcs/0040-skill-benchmark.md).
|
|
60
60
|
- **Copy, never transform.** A skill is a plain `SKILL.md` folder in the [Agent Skills](https://agentskills.io) format, at `packs/<pack>/skills/<name>/`. What runs in your agent is byte-identical to what is reviewed here. There is no runtime, and the tooling has zero dependencies.
|
|
61
61
|
- **Updates keep your edits.** `npx skilldrop-cli update` replaces files you haven't touched. For any file you changed, it leaves the new version beside it as `<file>.upstream`. See [upgrade installed skills](guides/how-to/upgrade-skills.md).
|
|
62
62
|
|
|
63
63
|
## Go deeper
|
|
64
64
|
|
|
65
|
-
- **Use it:** [docs portal](https://sananthanarayan.github.io/skilldrop/docs/) · [a guide for every pack](guides/README.md#per-pack) · [install in any IDE](guides/how-to/install-per-ide.md) · [try skills in a repo you don't own](guides/how-to/install-per-ide.md#trying-skills-in-a-repo-you-dont-own) · [profiles](guides/how-to/profiles.md) · [hooks](guides/how-to/wire-a-hook.md)
|
|
65
|
+
- **Use it:** [the operating model](guides/explanation/operating-model.md) · [docs portal](https://sananthanarayan.github.io/skilldrop/docs/) · [a guide for every pack](guides/README.md#per-pack) · [install in any IDE](guides/how-to/install-per-ide.md) · [try skills in a repo you don't own](guides/how-to/install-per-ide.md#trying-skills-in-a-repo-you-dont-own) · [profiles](guides/how-to/profiles.md) · [hooks](guides/how-to/wire-a-hook.md)
|
|
66
66
|
- **Run it in CI:** [a skill on every pull request](guides/how-to/run-a-skill-in-ci.md) · [how skills are checked](https://sananthanarayan.github.io/skilldrop/evals/) · [benchmark skills yourself](guides/how-to/benchmark-skills.md) · [measure your loops](guides/how-to/measure-your-loops.md)
|
|
67
67
|
- **Roll it out:** [across your org, including an internal mirror](guides/how-to/enterprise-distribution.md) · [publish your own catalogue](guides/how-to/publish-a-catalogue.md) · [security and the OWASP Top 10s](guides/reference/owasp-mapping.md)
|
|
68
68
|
- **Reviewers:** three subagents that push back on generated work: `devils-advocate`, `security-reviewer` and `code-quality`. See [`agents/`](agents/README.md).
|
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
"enum": ["tutorial", "how-to", "reference", "explanation"],
|
|
14
14
|
"description": "tutorial = learning by doing. how-to = a task with a goal. reference = look it up. explanation = why it is this way. A page that cannot pick one is doing two jobs and should be split."
|
|
15
15
|
},
|
|
16
|
-
"status": { "enum": ["draft", "review", "stable", "deprecated"], "default": "stable" }
|
|
16
|
+
"status": { "enum": ["draft", "review", "stable", "deprecated"], "default": "stable" },
|
|
17
|
+
"stage": {
|
|
18
|
+
"enum": ["discover", "design", "build", "release", "operate"],
|
|
19
|
+
"description": "RFC-0044. The lifecycle stage a page belongs to, when it belongs to one. The docs sidebar groups staged pages under that stage, beside the stage's loop; a page that spans every stage, or none, leaves it out."
|
|
20
|
+
}
|
|
17
21
|
}
|
|
18
22
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skilldrop-cli",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.10",
|
|
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
|
|
@@ -14,18 +14,18 @@ can say what the resume shows, but only the candidate knows what is true and wha
|
|
|
14
14
|
|
|
15
15
|
| # | Stage | Type | Skills | Gate |
|
|
16
16
|
|---|---|---|---|---|
|
|
17
|
-
| 1 | `fit` | gate | [`job-fit-analysis`](../../skills/job-fit-analysis/SKILL.md) | **
|
|
17
|
+
| 1 | `fit` | gate | [`job-fit-analysis`](../../skills/job-fit-analysis/SKILL.md) | **G6** 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
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
|
+
| 5 | `confirm` | verify | [`output-hygiene`](../../../core/skills/output-hygiene/SKILL.md) | **G6.1** human |
|
|
22
22
|
|
|
23
23
|
## How to run this loop
|
|
24
24
|
|
|
25
25
|
1. **Check the fit and stop.** Run `job-fit-analysis` on the posting, the resume and any
|
|
26
26
|
other material of the candidate's: a LinkedIn summary, a portfolio, a project. Put its
|
|
27
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
|
|
28
|
+
including whether anything outside the resume covers a gap, then wait at G6.
|
|
29
29
|
- `PROCEED`: they are applying. Go on.
|
|
30
30
|
- `PROCEED WITH CONDITIONS`: they are applying and have answered the questions. Save
|
|
31
31
|
their answers to `notes.md`; from here on those answers are source material alongside
|
|
@@ -41,7 +41,7 @@ can say what the resume shows, but only the candidate knows what is true and wha
|
|
|
41
41
|
the documents, run `application-form-answers` with those questions and the tailored
|
|
42
42
|
resume. Skip this stage when there is no form.
|
|
43
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
|
|
44
|
+
6. **Confirm at G6.1.** Show the candidate the documents with four short lists: what the
|
|
45
45
|
posting asks for that the documents do not claim; every fact added from outside the
|
|
46
46
|
resume and where it came from; every line cut from the resume; and the form questions
|
|
47
47
|
that are theirs alone to answer. Ask them to confirm every line is true. `NOT READY` returns to `tailor` with their
|
|
@@ -49,8 +49,8 @@ can say what the resume shows, but only the candidate knows what is true and wha
|
|
|
49
49
|
|
|
50
50
|
## Verdicts
|
|
51
51
|
|
|
52
|
-
Defined in [`contracts/terminals.json`](../../../../contracts/terminals.json).
|
|
53
|
-
`PROCEED`, `PROCEED WITH CONDITIONS`, `RECONSIDER` or `BLOCKED`. G6 emits `READY`,
|
|
52
|
+
Defined in [`contracts/terminals.json`](../../../../contracts/terminals.json). G6 emits
|
|
53
|
+
`PROCEED`, `PROCEED WITH CONDITIONS`, `RECONSIDER` or `BLOCKED`. G6.1 emits `READY`,
|
|
54
54
|
`NOT READY` or `BLOCKED`. `RECONSIDER` leaves the loop: the candidate's time goes to a
|
|
55
55
|
better posting.
|
|
56
56
|
|
|
@@ -64,7 +64,7 @@ produce documents carrying their name that they have not confirmed.
|
|
|
64
64
|
|
|
65
65
|
Name the missing skill and skilldrop as its source, do the minimal inline version of that
|
|
66
66
|
stage under the same rule (nothing the candidate didn't supply), and record that it ran
|
|
67
|
-
degraded. Never skip G6.
|
|
67
|
+
degraded. Never skip G6.1.
|
|
68
68
|
|
|
69
69
|
## Run log (opt-in)
|
|
70
70
|
|
|
@@ -73,7 +73,7 @@ gate's verdict, append one JSON line to that file. Nothing else is recorded, and
|
|
|
73
73
|
sent anywhere. When the variable isn't set, or you can't read it, skip this section.
|
|
74
74
|
|
|
75
75
|
```bash
|
|
76
|
-
printf '%s\n' '{"ts":"2026-10-05T14:03:00Z","loop":"apply","stage":"fit","gate":"
|
|
76
|
+
printf '%s\n' '{"ts":"2026-10-05T14:03:00Z","loop":"apply","stage":"fit","gate":"G6","verdict":"PROCEED","round":1}' >> "$SKILLDROP_LOOP_LOG"
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
Fields: `ts` (UTC), `loop`, `stage`, `gate` (`null` for a stage without one), `verdict` (the
|
|
@@ -83,9 +83,9 @@ The log holds verdicts only: never the posting, the resume or the candidate's na
|
|
|
83
83
|
## Quality bar
|
|
84
84
|
|
|
85
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
|
|
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
87
|
- **The resume, the letter and the form agree.** Same titles, dates and numbers in all three.
|
|
88
|
-
- **The candidate confirms and sends.** G6 is their signature; the loop never submits an application.
|
|
88
|
+
- **The candidate confirms and sends.** G6.1 is their signature; the loop never submits an application.
|
|
89
89
|
|
|
90
90
|
## Anti-patterns to avoid
|
|
91
91
|
|
|
@@ -93,5 +93,5 @@ The log holds verdicts only: never the posting, the resume or the candidate's na
|
|
|
93
93
|
- ❌ **Treating a `Not shown` item as true** because the candidate proceeded. Only what they answered goes in.
|
|
94
94
|
- ❌ **Writing the letter from the original resume.** The letter follows the tailored one, or the two will disagree.
|
|
95
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.** A clean claim check says the words are in the source; it cannot say they are true.
|
|
96
|
+
- ❌ **Self-confirming at G6.1.** A clean claim check says the words are in the source; it cannot say they are true.
|
|
97
97
|
- ❌ **Submitting the application.** Sending is the candidate's act.
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"assertions": [
|
|
8
8
|
"Starts with job-fit-analysis and delivers its verdict before any resume or letter is written",
|
|
9
9
|
"Names the unmet bachelor's degree as a screening requirement",
|
|
10
|
-
"Stops at
|
|
10
|
+
"Stops at G6 and asks the candidate whether to apply; does not tailor the resume in the same turn",
|
|
11
11
|
"Does not advise claiming the degree or adding any keyword the resume does not support"
|
|
12
12
|
]
|
|
13
13
|
},
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"The tailored resume includes Spanish and does not claim SAP",
|
|
20
20
|
"The cover letter is written after the tailored resume and uses the same titles, dates and numbers",
|
|
21
21
|
"Runs output-hygiene on both documents before the final gate",
|
|
22
|
-
"Stops at G6 and asks the candidate to confirm every line is true; does not submit or send anything",
|
|
22
|
+
"Stops at G6.1 and asks the candidate to confirm every line is true; does not submit or send anything",
|
|
23
23
|
"Lists what the posting asks for that neither document claims"
|
|
24
24
|
]
|
|
25
25
|
}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"intent": "Say honestly where the candidate stands against the posting, then let them decide whether this application is worth writing.",
|
|
14
14
|
"skills": ["job-fit-analysis"],
|
|
15
15
|
"gate": {
|
|
16
|
-
"id": "
|
|
16
|
+
"id": "G6",
|
|
17
17
|
"kind": "human",
|
|
18
18
|
"verdicts": ["PROCEED", "PROCEED WITH CONDITIONS", "RECONSIDER", "BLOCKED"]
|
|
19
19
|
}
|
|
@@ -42,7 +42,7 @@
|
|
|
42
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
43
|
"skills": ["output-hygiene"],
|
|
44
44
|
"gate": {
|
|
45
|
-
"id": "G6",
|
|
45
|
+
"id": "G6.1",
|
|
46
46
|
"kind": "human",
|
|
47
47
|
"verdicts": ["READY", "NOT READY", "BLOCKED"],
|
|
48
48
|
"revise_to": "tailor"
|
|
@@ -51,10 +51,16 @@ These four rules outrank the steps below.
|
|
|
51
51
|
- **Met**: the resume shows it. Quote the line.
|
|
52
52
|
- **Partly**: the resume shows something close, smaller or older. Say what it shows and
|
|
53
53
|
what is short: "team of 12; the posting asks for 20 or more".
|
|
54
|
-
- **Not shown**: the resume is silent. The person may well have it.
|
|
54
|
+
- **Not shown**: the resume is silent on a specific thing. The person may well have it.
|
|
55
55
|
- **Not met**: the resume shows otherwise, such as a diploma where a degree is required
|
|
56
56
|
or two years where five are asked for.
|
|
57
57
|
|
|
58
|
+
A requirement for a general ability, such as dealing with the public, organising work
|
|
59
|
+
or communicating clearly, is `Met` by any job that plainly involves it: four years
|
|
60
|
+
serving customers meets "friendly first point of contact". Keep `Not shown` and `Partly`
|
|
61
|
+
for specific things: a tool, a qualification, a setting, a scale, a number of years. Do
|
|
62
|
+
not mark half the table `Partly` to be safe.
|
|
63
|
+
|
|
58
64
|
A similar tool is not the named tool. Cerner is not Epic, an in-house warehouse system is
|
|
59
65
|
not SAP: when the posting requires the named one, mark it `Not met` and give the similar
|
|
60
66
|
one as the nearest thing you have. A related task is not the named skill: cashing up a
|
|
@@ -76,9 +82,11 @@ These four rules outrank the steps below.
|
|
|
76
82
|
true for it to be worth the time, and whether you would still send it.
|
|
77
83
|
- **Not a match**: a requirement that cannot be worked around is unmet, such as a licence.
|
|
78
84
|
|
|
79
|
-
Write the table first
|
|
80
|
-
|
|
81
|
-
advanced Excel and SAP".
|
|
85
|
+
Write the table first, then write the opening from it. The opening names every required
|
|
86
|
+
item that is `Not met` or `Partly`, copied from those rows: "the degree, the team size,
|
|
87
|
+
advanced Excel and SAP aren't met". Name them; do not count them, and do not sum them up
|
|
88
|
+
in a number or a fraction anywhere in the reply. When two figures differ, give both and
|
|
89
|
+
leave the comparison there: "12 against 20 or more", not "less than half". Give the verdict on what
|
|
82
90
|
you know now; say what answer would raise it, but do not make the verdict wait on the
|
|
83
91
|
answer. Do not soften a long shot into encouragement, do not harden a workable gap into a
|
|
84
92
|
refusal, and do not give a percentage.
|
|
@@ -93,14 +101,17 @@ These four rules outrank the steps below.
|
|
|
93
101
|
required item is not shown, ask once whether anything outside the resume covers it: a
|
|
94
102
|
side project, a repository, a portfolio, a volunteer role. People leave their best
|
|
95
103
|
evidence off the page. Anything you credited from another file goes here too, as a line
|
|
96
|
-
to add to the resume. Never
|
|
97
|
-
them to add a keyword they have not said
|
|
98
|
-
|
|
104
|
+
to add to the resume. Never ask
|
|
105
|
+
something the resume already answers. Never tell them to add a keyword they have not said
|
|
106
|
+
is true, or to reword a `Partly` so it reads as `Met`: "supported renewals" stays
|
|
107
|
+
supported, and the advice is how to present it honestly. Do not end on a list of
|
|
108
|
+
questions with no advice.
|
|
99
109
|
|
|
100
110
|
8. **Lay the reply out in this order:** the answer and verdict; what could get it rejected;
|
|
101
111
|
one table covering every requirement (requirement, required or preferred, status,
|
|
102
112
|
evidence); what to bring forward; what to do next. Each requirement appears in the table
|
|
103
|
-
once and nothing is repeated in a second table or restated section by section.
|
|
113
|
+
once and nothing is repeated in a second table or restated section by section. A gap is
|
|
114
|
+
described where it first appears and only named after that.
|
|
104
115
|
|
|
105
116
|
Match the length to what you were given. A short posting and a few lines about the person
|
|
106
117
|
gets a short answer: the verdict, one line per requirement, and what to do, in under 250
|
|
@@ -140,6 +151,9 @@ posting**, ask for the posting in one line: there is nothing to compare against.
|
|
|
140
151
|
person's evening.
|
|
141
152
|
- ❌ **Crediting the usual.** "As a nurse you will have used Epic" is an invention.
|
|
142
153
|
- ❌ **Treating a similar tool as the named one.**
|
|
154
|
+
- ❌ **A count that disagrees with the table.** Name the gaps; a number invites the error.
|
|
155
|
+
- ❌ **Hedging everything.** A table of `Partly` tells the person nothing.
|
|
156
|
+
- ❌ **Coaching the wording past the facts.** Advising that "supported" be written as "owned".
|
|
143
157
|
- ❌ **Advising them to add keywords** so the resume passes a filter. If it isn't true it
|
|
144
158
|
doesn't go in.
|
|
145
159
|
- ❌ **Judging the person.** No remarks on age, gaps, family, health or anything a recruiter
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "job-fit-analysis",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Compare a job posting with a resume and say honestly whether to apply: each requirement marked met, partly met, not shown or not met, with the resume line it rests on; the requirements an employer screens on listed first; and the questions whose answers would change the picture. Works for any occupation and level. Use when the user asks \"am I a good fit for this job\", \"should I apply for this\", \"how does my resume match this posting\", or wants the gaps between a job description and their CV before applying.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -16,7 +16,7 @@ check the argument and the surface after.
|
|
|
16
16
|
|---|---|---|---|---|
|
|
17
17
|
| 1 | `intake` | generate | [`brief-intake`](../../skills/brief-intake/SKILL.md) | — |
|
|
18
18
|
| 2 | `draft` | generate | any generator (`*`) | — |
|
|
19
|
-
| 3 | `critique` | verify | [`doc-critique`](../../skills/doc-critique/SKILL.md) | **
|
|
19
|
+
| 3 | `critique` | verify | [`doc-critique`](../../skills/doc-critique/SKILL.md) | **G5** review |
|
|
20
20
|
| 4 | `polish` | verify | [`output-hygiene`](../../skills/output-hygiene/SKILL.md) | — |
|
|
21
21
|
|
|
22
22
|
## How to run this wrapper
|
|
@@ -29,7 +29,7 @@ check the argument and the surface after.
|
|
|
29
29
|
chosen generator will refuse to start without. Resolve those before drafting.
|
|
30
30
|
3. **Draft.** Run the chosen generator on the brief. It is a normal skilldrop skill with its
|
|
31
31
|
own quality bar — this wrapper does not override it.
|
|
32
|
-
4. **Critique at
|
|
32
|
+
4. **Critique at G5.** Run `doc-critique`, which dispatches to the same rubric the generator
|
|
33
33
|
was held to. `MAJOR REWRITE` returns to `intake` (not to `draft` — a rewrite usually means
|
|
34
34
|
the input was wrong, not the prose). `WRONG ARTIFACT` leaves the wrapper entirely.
|
|
35
35
|
5. **Polish last.** Run `output-hygiene` only once the argument is settled. It is a surface
|
|
@@ -37,14 +37,14 @@ check the argument and the surface after.
|
|
|
37
37
|
|
|
38
38
|
## Verdicts
|
|
39
39
|
|
|
40
|
-
Defined in [`contracts/terminals.json`](../../../../contracts/terminals.json).
|
|
40
|
+
Defined in [`contracts/terminals.json`](../../../../contracts/terminals.json). G5 emits the critique
|
|
41
41
|
vocabulary. `SHIP WITH CHANGES` carries its changes forward to `polish`; it does not mean the
|
|
42
42
|
changes are optional.
|
|
43
43
|
|
|
44
44
|
## When a stage's skill is not installed
|
|
45
45
|
|
|
46
46
|
Name the missing skill and skilldrop as its source, do the minimal inline version of that
|
|
47
|
-
stage, and say the stage ran degraded. Do not skip
|
|
47
|
+
stage, and say the stage ran degraded. Do not skip G5 — an unreviewed artifact is the failure
|
|
48
48
|
mode this wrapper exists to prevent.
|
|
49
49
|
|
|
50
50
|
## Run log (opt-in)
|
|
@@ -54,7 +54,7 @@ gate's verdict, append one JSON line to that file. Nothing else is recorded, and
|
|
|
54
54
|
sent anywhere. When the variable isn't set, or you can't read it, skip this section.
|
|
55
55
|
|
|
56
56
|
```bash
|
|
57
|
-
printf '%s\n' '{"ts":"2026-10-01T14:03:00Z","loop":"ship-a-draft","stage":"critique","gate":"
|
|
57
|
+
printf '%s\n' '{"ts":"2026-10-01T14:03:00Z","loop":"ship-a-draft","stage":"critique","gate":"G5","verdict":"SHIP IT","round":1}' >> "$SKILLDROP_LOOP_LOG"
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
Fields: `ts` (UTC), `loop`, `stage`, `gate` (`null` for a stage without one), `verdict` (the
|
|
@@ -71,7 +71,7 @@ which end in `BLOCKED`.
|
|
|
71
71
|
|
|
72
72
|
## Anti-patterns to avoid
|
|
73
73
|
|
|
74
|
-
- ❌ **Running `polish` as the whole review.** Clean prose with a broken argument still fails; that is what
|
|
74
|
+
- ❌ **Running `polish` as the whole review.** Clean prose with a broken argument still fails; that is what G5 is for.
|
|
75
75
|
- ❌ **Skipping `intake` because the input "is already structured."** A Slack thread that looks organized is still untagged — nobody downstream can tell what was inferred.
|
|
76
76
|
- ❌ **Looping `critique` → `draft` instead of `critique` → `intake`.** Re-drafting from the same incomplete brief reproduces the same gaps with new words.
|
|
77
77
|
- ❌ **Treating `WRONG ARTIFACT` as a severe `MAJOR REWRITE`.** It is a redirect: the user wanted a different document, and revising this one cannot get there.
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"assertions": [
|
|
8
8
|
"Chooses the target generator (exec-summary) BEFORE running intake, because the brief is shaped for a target",
|
|
9
9
|
"Runs brief-intake and tags every field explicit / implied / inferred / missing",
|
|
10
|
-
"Runs doc-critique at
|
|
10
|
+
"Runs doc-critique at G5 against the same rubric the generator was held to",
|
|
11
11
|
"Runs output-hygiene last, only once the argument is settled",
|
|
12
12
|
"Reports what output-hygiene did not touch"
|
|
13
13
|
]
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"id": "major-rewrite-returns-to-intake",
|
|
17
17
|
"prompt": "The critique on my draft came back MAJOR REWRITE. Continue the ship-a-draft wrapper.",
|
|
18
18
|
"assertions": [
|
|
19
|
-
"Routes back to `intake`, not to `draft`, because
|
|
19
|
+
"Routes back to `intake`, not to `draft`, because G5's revise_to names intake",
|
|
20
20
|
"Explains that re-drafting from the same incomplete brief reproduces the same gaps",
|
|
21
21
|
"Does not run output-hygiene on a draft that is about to be rewritten"
|
|
22
22
|
]
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"intent": "Review the draft against the same rubric the generator was held to.",
|
|
26
26
|
"skills": ["doc-critique"],
|
|
27
27
|
"gate": {
|
|
28
|
-
"id": "
|
|
28
|
+
"id": "G5",
|
|
29
29
|
"kind": "review",
|
|
30
30
|
"verdicts": ["SHIP IT", "SHIP WITH CHANGES", "MAJOR REWRITE", "WRONG ARTIFACT", "BLOCKED"],
|
|
31
31
|
"revise_to": "intake"
|
package/packs/core/pack.json
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"skill": "doc-critique",
|
|
38
38
|
"you_do": "Hand over the draft you wrote from the brief, by hand or with any generator skill.",
|
|
39
39
|
"you_get": "A critique that opens with a verdict and lists findings as blocker, major, minor or nit, each pointing to the section and suggesting a fix.",
|
|
40
|
-
"decide": "Gate
|
|
40
|
+
"decide": "Gate G5: SHIP IT or SHIP WITH CHANGES moves on; MAJOR REWRITE sends you back to the brief; WRONG ARTIFACT means you need a different kind of document."
|
|
41
41
|
},
|
|
42
42
|
{
|
|
43
43
|
"skill": "output-hygiene",
|
|
@@ -44,6 +44,36 @@
|
|
|
44
44
|
"Any export column names it uses are marked as assumed, since no export layout was given",
|
|
45
45
|
"It does not state a response-time target or SLA figure as the team's own, since none was given"
|
|
46
46
|
]
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": 4,
|
|
50
|
+
"held_out": "2026-10-06",
|
|
51
|
+
"prompt": "Ops and customer care at Tarn Valley Heating both report first-time fix rate and they're miles apart. The Slack thread is in thread.md and the tables are in tables.md (we're on Snowflake). The FD wants one number for the board pack, ready on the 1st of each month, shown next to last September. Can you write the definition — one page, with the SQL underneath?",
|
|
52
|
+
"assertions": [
|
|
53
|
+
"It points out that 3,912 out of 4,830 is 81%, not the 84% quoted in the thread",
|
|
54
|
+
"The definition counts a repair as not fixed first time when there is a return visit within a stated number of days, and does not rely only on the engineer's follow_up_required flag",
|
|
55
|
+
"It explains the gap between the two teams' figures: 630 of the 3,912 repairs with no follow-up flag had a return visit within 30 days, leaving 3,282 (68%)",
|
|
56
|
+
"A return visit is counted whether it was logged as a 'recall' or as a new 'repair', and recall visits are not themselves added to the denominator as fresh repairs",
|
|
57
|
+
"It says the month's figure cannot be final on the 1st of the next month because the return window has not yet run for late-month repairs, and proposes a provisional figure, a lag or a shorter window",
|
|
58
|
+
"It says a like-for-like comparison with September 2025 is not possible by appliance because appliance_id is empty before 3 March 2026, and says what to do instead (match by address for both periods, or mark the comparison as not comparable)",
|
|
59
|
+
"The SQL uses only the tables and columns listed in tables.md, restricts the denominator to completed repairs, and does not invent a column linking a return visit to its original job",
|
|
60
|
+
"It leaves the metric owner as an open decision, noting the previous owner left in August, and says whether subcontractor jobs are included"
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"id": 5,
|
|
65
|
+
"held_out": "2026-10-06",
|
|
66
|
+
"prompt": "I run a coffee subscription box, just me and one part-timer. An investor asked what our monthly churn is and I realised I've never actually defined it. Billing is on Stripe and I keep a Google Sheet of subscribers. September: started the month with 312 subscribers, 21 cancelled, 9 paused (people can pause for a month or two instead of cancelling), 34 new signed up. Can you give me a quick definition I can stick to every month, and the September number for the investor update?",
|
|
67
|
+
"assertions": [
|
|
68
|
+
"It delivers a written definition and a September figure in the reply, and does not stop at a list of questions",
|
|
69
|
+
"The denominator is stated as subscribers active at the start of the month (312), and the 34 new sign-ups are not netted off against cancellations",
|
|
70
|
+
"It gives September churn on cancellations alone as 21 out of 312, about 6.7%",
|
|
71
|
+
"It does not decide silently whether pauses count: it states the choice made and gives the figure with pauses included, 30 out of 312, about 9.6%",
|
|
72
|
+
"It says revenue churn cannot be worked out from what was given because no prices or plan amounts were provided, and it does not invent a price",
|
|
73
|
+
"It says whether a cancellation is counted in the month the subscriber cancels or the month their paid period ends",
|
|
74
|
+
"It does not quote an industry-average or benchmark churn figure as fact",
|
|
75
|
+
"Any Stripe field names or sheet column names it uses are marked as assumed, since none were given"
|
|
76
|
+
]
|
|
47
77
|
}
|
|
48
78
|
]
|
|
49
79
|
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Tables (Snowflake, database TARNVALLEY)
|
|
2
|
+
|
|
3
|
+
## FIELD.JOBS — one row per visit
|
|
4
|
+
| column | type | notes |
|
|
5
|
+
|---|---|---|
|
|
6
|
+
| job_id | NUMBER | primary key |
|
|
7
|
+
| address_id | NUMBER | always filled |
|
|
8
|
+
| appliance_id | NUMBER | NULL for every job before 2026-03-03 |
|
|
9
|
+
| job_type | VARCHAR | 'repair', 'recall', 'annual_service', 'install' |
|
|
10
|
+
| status | VARCHAR | 'completed', 'cancelled', 'no_access' |
|
|
11
|
+
| follow_up_required | BOOLEAN | ticked by the engineer on closing the job |
|
|
12
|
+
| engineer_id | NUMBER | |
|
|
13
|
+
| created_at | TIMESTAMP_NTZ | UK local time, when the job was booked |
|
|
14
|
+
| completed_at | TIMESTAMP_NTZ | UK local time, NULL unless status = 'completed' |
|
|
15
|
+
|
|
16
|
+
There is no column that links a recall, or any later visit, to the job it follows.
|
|
17
|
+
|
|
18
|
+
## FIELD.APPLIANCES
|
|
19
|
+
| column | type | notes |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| appliance_id | NUMBER | primary key |
|
|
22
|
+
| address_id | NUMBER | |
|
|
23
|
+
| make | VARCHAR | |
|
|
24
|
+
| model | VARCHAR | |
|
|
25
|
+
| installed_on | DATE | often NULL |
|
|
26
|
+
|
|
27
|
+
## FIELD.ENGINEERS
|
|
28
|
+
| column | type | notes |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| engineer_id | NUMBER | primary key |
|
|
31
|
+
| region | VARCHAR | 'north', 'central', 'coast' |
|
|
32
|
+
| employment_type | VARCHAR | 'employed', 'subcontractor' |
|