skilldrop-cli 0.16.16 → 0.16.18
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/model-routing.json +1 -1
- package/package.json +1 -1
- package/packs/ai-engineering/pack.json +1 -1
- package/packs/ai-engineering/skills/ai-usage-policy/SKILL.md +60 -41
- package/packs/ai-engineering/skills/ai-usage-policy/evals/evals.json +28 -0
- package/packs/ai-engineering/skills/ai-usage-policy/evals/files/6/board-meeting-extract.md +13 -0
- package/packs/ai-engineering/skills/ai-usage-policy/evals/files/6/ops-notes.md +42 -0
- package/packs/ai-engineering/skills/ai-usage-policy/evals/files/6/vendor-sheet-murmurly.txt +10 -0
- package/packs/ai-engineering/skills/ai-usage-policy/manifest.json +3 -3
- package/packs/solution-architect/skills/design-doc/evals/evals.json +28 -0
- package/packs/solution-architect/skills/design-doc/evals/files/6/figures.csv +11 -0
- package/packs/solution-architect/skills/design-doc/evals/files/6/premeet-notes.md +25 -0
- package/packs/solution-architect/skills/design-doc/evals/files/6/requirements.md +8 -0
- package/packs/solution-architect/skills/design-doc/manifest.json +1 -1
- package/packs/stakeholder-comms/skills/guide-builder/SKILL.md +51 -52
- package/packs/stakeholder-comms/skills/guide-builder/evals/evals.json +27 -0
- package/packs/stakeholder-comms/skills/guide-builder/evals/files/6/setup-notes.md +11 -0
- package/packs/stakeholder-comms/skills/guide-builder/evals/files/6/thread.txt +13 -0
- package/packs/stakeholder-comms/skills/guide-builder/manifest.json +3 -3
- package/packs/stakeholder-comms/skills/guide-builder/examples/local-setup-guide.md +0 -127
- package/packs/stakeholder-comms/skills/guide-builder/templates/api-reference.md +0 -120
- package/packs/stakeholder-comms/skills/guide-builder/templates/design-walkthrough.md +0 -72
- package/packs/stakeholder-comms/skills/guide-builder/templates/setup-guide.md +0 -109
package/model-routing.json
CHANGED
|
@@ -232,7 +232,7 @@
|
|
|
232
232
|
},
|
|
233
233
|
"guide-builder": {
|
|
234
234
|
"tier": "standard",
|
|
235
|
-
"rationale": "Shapes notes into a
|
|
235
|
+
"rationale": "Shapes notes into a guide without adding to them. Generation, not adversarial review."
|
|
236
236
|
},
|
|
237
237
|
"reverse-architecture": {
|
|
238
238
|
"tier": "standard",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skilldrop-cli",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.18",
|
|
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",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
{
|
|
44
44
|
"skill": "ai-usage-policy",
|
|
45
45
|
"you_do": "Give the population, the tools and any data rules already in force.",
|
|
46
|
-
"you_get": "
|
|
46
|
+
"you_get": "A policy at the length your audience needs: what's allowed first, every restriction paired with what to do instead or who decides, what to do if data has already gone in, and no claim about a tool, owner or law that you didn't give it."
|
|
47
47
|
},
|
|
48
48
|
{
|
|
49
49
|
"skill": "ai-adoption-rollout",
|
|
@@ -1,59 +1,75 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ai-usage-policy
|
|
3
|
-
description: Draft an organisation's AI
|
|
3
|
+
description: Draft an organisation's AI use policy or staff guidance from what it has told you about its people, tools, data and worries — every "don't" paired with what to do instead (or who decides, when no approved way exists yet), what to do if data has already gone into a tool, and no claim about a tool, licence, owner, regulation or commitment the input didn't give. Written in the length, labels and voice the audience needs. Use when a team needs rules for what people may put into AI tools, or asks for an AI acceptable-use or governance policy. Do NOT use to write a repo's agent-tooling policy (that's agents-md-generator) or to analyse one agent's capability surface (that's agent-threat-model).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# ai-usage-policy
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
**The rule: every "don't" comes with what to do instead.** A policy that only forbids doesn't
|
|
9
|
+
stop the work; it moves it to a personal account where nobody can see it. So each prohibition
|
|
10
|
+
names the approved way to do the same task today: ✅ *"Don't paste client reports into a chat
|
|
11
|
+
tool to summarise them. Use the summariser in the document system, which keeps them inside."*
|
|
12
|
+
When no approved way exists yet, the policy says so and says who decides: ✅ *"There's no
|
|
13
|
+
approved tool for transcribing interviews yet. Ask the operations lead before using one."*
|
|
9
14
|
|
|
10
|
-
|
|
15
|
+
The policy also says **what to do if it has already happened**: data pasted into the wrong
|
|
16
|
+
tool, a draft sent unchecked. Who to tell, how fast, and that telling is what's expected.
|
|
11
17
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
- **Write for someone who has never heard of this skill.** No skill names, no paths or scripts from this folder, no internal terms, and nothing about how the run was set up. A next step is one plain sentence at the end that describes the work.
|
|
20
|
-
- **For this skill:** A usable policy says what to do when the rule has already been broken (data already pasted into a tool) and how it is enforced; include both. Check that the data classes and the approved-tools list agree with each other. Make no claim about where a tool sends data unless the user told you.
|
|
18
|
+
A second rule sits beside it: **claim nothing you weren't given.** No statement about where a
|
|
19
|
+
tool sends data, whether it trains on inputs, how many seats exist, who owns the policy, how
|
|
20
|
+
fast exceptions are handled, or which law applies, unless the input says so. A vendor's own
|
|
21
|
+
data-sheet is the vendor's claim: report it as "the vendor says", never as fact, and never
|
|
22
|
+
let it be the reason sensitive data is allowed. Check the tools against what you were told
|
|
23
|
+
(seat counts against headcount, a contract that has lapsed, terms not yet signed) and say
|
|
24
|
+
where they don't line up.
|
|
21
25
|
|
|
22
|
-
|
|
26
|
+
## How to respond
|
|
23
27
|
|
|
24
|
-
|
|
28
|
+
1. **Write for the people who'll read it, at the size asked for.** "A short note for our
|
|
29
|
+
twelve staff", "one page to attach for a client", "the full policy for the board": that
|
|
30
|
+
sets the length, voice and structure. Use the organisation's own words for its data and
|
|
31
|
+
roles; if it already classifies data, use those names, not a new scheme.
|
|
25
32
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
| **Internal** | internal docs, non-personal telemetry, private repo code | approved tools with data-retention off / enterprise terms |
|
|
30
|
-
| **Restricted** | personal data, credentials, customer content under contract, regulated records | never pasted; only via a named reviewed integration, if at all |
|
|
33
|
+
2. **Say what's allowed, plainly, first.** The common, low-risk uses (drafting, rewording,
|
|
34
|
+
brainstorming on non-sensitive material) are named as fine, so the restrictions read as
|
|
35
|
+
targeted rather than blanket.
|
|
31
36
|
|
|
32
|
-
|
|
37
|
+
3. **The restrictions, each with its alternative.** State them as behaviours tied to the
|
|
38
|
+
organisation's real data: what not to put in which tool, and what to do instead. Review
|
|
39
|
+
before use only where the consequence warrants it: something reaching a customer, money,
|
|
40
|
+
a legal position, a decision about a person.
|
|
33
41
|
|
|
34
|
-
|
|
42
|
+
4. **The tools, as far as you know them.** The tools the input names, and what each is
|
|
43
|
+
cleared for, as far as the input says. For anything else, the route to ask, with the role
|
|
44
|
+
who decides if the input names one, or "to be agreed" if it doesn't.
|
|
35
45
|
|
|
36
|
-
|
|
46
|
+
5. **If something has already gone wrong.** One short section: who to tell, and that
|
|
47
|
+
reporting quickly is what's expected.
|
|
37
48
|
|
|
38
|
-
|
|
49
|
+
6. **Keep notes to the requester out of the policy.** The policy is a document someone will
|
|
50
|
+
circulate. Questions for the person who asked (who owns this, which tool contract to
|
|
51
|
+
check, whether a law applies) go in a short list after it, never as bracketed tags inside.
|
|
39
52
|
|
|
40
|
-
|
|
53
|
+
7. **Deliver from what you have.** With anything about the organisation to go on, write the
|
|
54
|
+
policy and state any assumption in one line. Ask first only when you don't know who it is
|
|
55
|
+
for or what kind of data they handle.
|
|
41
56
|
|
|
42
57
|
## Quality bar
|
|
43
58
|
|
|
44
|
-
- **Every
|
|
45
|
-
|
|
46
|
-
- **
|
|
47
|
-
- **
|
|
48
|
-
|
|
49
|
-
- **
|
|
50
|
-
- **
|
|
59
|
+
- **Every prohibition names an alternative,** or says no approved way exists yet and who
|
|
60
|
+
decides.
|
|
61
|
+
- **There is a line on what to do if it has already happened.**
|
|
62
|
+
- **Nothing unsupplied:** no data-handling claim, seat count, owner, turnaround, commitment or
|
|
63
|
+
regulation the input didn't give; vendor claims are attributed to the vendor.
|
|
64
|
+
- **The tool list is checked against the input** and mismatches are named.
|
|
65
|
+
- **The length, voice and labels fit the audience asked for.**
|
|
66
|
+
- **No notes, tags or questions to the requester inside the policy.**
|
|
51
67
|
|
|
52
68
|
## When to use this skill
|
|
53
69
|
|
|
54
70
|
- ✅ "What are people allowed to put into these tools?" — the question every rollout hits in week one.
|
|
55
|
-
- ✅ Standing up
|
|
56
|
-
- ✅ Replacing an informal "be sensible" norm with something
|
|
71
|
+
- ✅ Standing up guidance before or alongside an AI rollout.
|
|
72
|
+
- ✅ Replacing an informal "be sensible" norm with something people can follow.
|
|
57
73
|
|
|
58
74
|
## When NOT to use this skill
|
|
59
75
|
|
|
@@ -65,11 +81,14 @@ A policy that prohibits without offering a permitted path doesn't reduce risk; i
|
|
|
65
81
|
|
|
66
82
|
## Anti-patterns to avoid
|
|
67
83
|
|
|
68
|
-
- ❌ **Prohibition without an alternative.**
|
|
69
|
-
- ❌ **
|
|
70
|
-
- ❌ **
|
|
71
|
-
|
|
72
|
-
- ❌ **
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
84
|
+
- ❌ **Prohibition without an alternative.** It moves the work out of sight.
|
|
85
|
+
- ❌ **Repeating the vendor.** "The tool never stores your data" because a sales sheet said so.
|
|
86
|
+
- ❌ **Invented machinery.** An owner, a five-day exception turnaround, a quarterly review, a
|
|
87
|
+
tier scheme the organisation never asked for.
|
|
88
|
+
- ❌ **The full framework on a short note.** Tier tables and review matrices for a twelve-person
|
|
89
|
+
team that asked for half a page.
|
|
90
|
+
- ❌ **Bracketed notes in the policy.** `[confirm with counsel]` in a document about to be
|
|
91
|
+
attached for a client.
|
|
92
|
+
- ❌ **Naming laws the user didn't name.** Say what to check, in the note after the policy.
|
|
93
|
+
- ❌ **Requiring review of everything.** A gate on low-risk drafting trains people to ignore the
|
|
94
|
+
gates that matter.
|
|
@@ -74,6 +74,34 @@
|
|
|
74
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
75
|
"The policy itself fits on about one page (roughly 500 words or fewer)"
|
|
76
76
|
]
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"id": 6,
|
|
80
|
+
"held_out": "2026-10-17",
|
|
81
|
+
"prompt": "I'm the operations director at Harrowmere Veterinary Group (11 clinics, about 230 staff). The board wants a staff policy on using AI tools at its next meeting. Everything I know is in three files: `ops-notes.md`, `vendor-sheet-murmurly.txt` and `board-meeting-extract.md`. Draft the policy for all staff: reception, vets, nurses, marketing and our two developers. Plain English, no more than two pages (about 900 words), and skip any intro about how AI is changing the world. Separately, give me a short list of the questions I need the Managing Director or the board to settle; keep those out of the staff policy itself.",
|
|
82
|
+
"assertions": [
|
|
83
|
+
"It says Murmurly transcription may be used only in the pilot at Northgate and Fernhill clinics (with the client told and able to object) and that other clinics must not start using it yet; it does not describe Murmurly as approved across the group",
|
|
84
|
+
"It does not repeat Murmurly's data-handling claims (zero retention, never used for training, compliant with every law, certified secure) as established fact; any it mentions are attributed to the vendor or marked unverified pending the unsigned contract",
|
|
85
|
+
"Every use the policy rules out comes with an alternative staff can use (such as the Dosewell formulary for doses, or a Tallowby Business seat) or a statement that there is no approved way yet and that the Managing Director decides; no prohibition is left without one",
|
|
86
|
+
"It tells staff what to do if client, payment or staff details have already been put into an AI tool, including reporting it to the Practice Compliance Lead under the existing data incident procedure, and it does not treat the receptionist's incident as already resolved",
|
|
87
|
+
"It does not say every member of staff has or can get a Tallowby Business account; it reflects that there are 40 seats and that who gets them is undecided",
|
|
88
|
+
"It does not invent a policy owner, review date or cycle, training programme, tool, licence count, or regulation not in the files; the claim about the veterinary regulator's rules on AI in clinical records is marked as unchecked, not stated as a rule",
|
|
89
|
+
"The staff policy is about 900 words or fewer, and the questions for the Managing Director or board are given separately from it rather than inside it"
|
|
90
|
+
]
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": 7,
|
|
94
|
+
"held_out": "2026-10-17",
|
|
95
|
+
"prompt": "hi, we run Millbrook Lane Bakery, 3 shops and about 18 staff. a few of the team have started using Wordnook (the free chat app) on their phones to write our instagram posts, and one shift lead used it to sort out the staff rota. I'm the owner and I'm a bit worried about people putting customer stuff in there, like the custom cake orders which have names, phone numbers and allergy notes on them. can you write me something short I can pin up in the back room? half a page max, no jargon please",
|
|
96
|
+
"assertions": [
|
|
97
|
+
"It delivers the notice in this reply rather than asking questions first; any gaps are noted briefly without holding up the notice",
|
|
98
|
+
"The notice is about half a page (roughly 250 words or fewer) and written in plain everyday words, without terms like 'data controller', 'LLM' or 'personal data processing'",
|
|
99
|
+
"It says customer names, phone numbers and allergy or order details from cake orders must not be typed into Wordnook, and says what to do instead (for example, write the post without them, or ask the owner)",
|
|
100
|
+
"It covers staff information such as the rota (names, hours) as well as customer information",
|
|
101
|
+
"Every 'don't' on the notice is paired with what to do instead or with 'ask the owner'",
|
|
102
|
+
"It says what to do if someone has already typed customer or staff details into Wordnook, at least telling the owner",
|
|
103
|
+
"It does not invent a paid plan, app settings, a law, a named person other than the owner, training, a review date, or other tools, and does not state as fact what Wordnook does or does not do with what is typed into it"
|
|
104
|
+
]
|
|
77
105
|
}
|
|
78
106
|
]
|
|
79
107
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Board meeting, 2 October: extract, item 6 (AI tools)
|
|
2
|
+
|
|
3
|
+
- Murmurly: agreed as a PILOT only, at Northgate and Fernhill clinics, until the contract
|
|
4
|
+
and data processing terms are signed and the pilot is reviewed. Other clinics are not to
|
|
5
|
+
start using it. Pilot vets must tell the client a consult is being transcribed and stop
|
|
6
|
+
if the client objects.
|
|
7
|
+
- Glimmerpress: no client pet photos until the marketing team has a way to get the
|
|
8
|
+
owner's permission. No decision yet on how that will work.
|
|
9
|
+
- Policy ownership: two names were put forward (Head of Clinical Services, IT Manager).
|
|
10
|
+
Not agreed. The Managing Director will decide who owns the policy, and until then any
|
|
11
|
+
"can I use AI for this?" question not covered by the policy goes to the Managing Director.
|
|
12
|
+
- Codewren: decision on buying deferred until the trial ends.
|
|
13
|
+
- Ops director to draft a staff policy for the next meeting.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# AI tools: where we are (ops director's notes, October)
|
|
2
|
+
|
|
3
|
+
Harrowmere Veterinary Group: 11 clinics, about 230 staff. Reception and client care, vets,
|
|
4
|
+
vet nurses, a small marketing team (3), and two in-house developers who look after the
|
|
5
|
+
booking site and the practice-management integrations.
|
|
6
|
+
|
|
7
|
+
## What people are using
|
|
8
|
+
|
|
9
|
+
- **Tallowby Chat** (general chat assistant). We bought 40 seats on the Tallowby Business
|
|
10
|
+
plan in the spring, mostly for clinic managers and marketing. Nobody has decided who gets
|
|
11
|
+
the other seats or whether we buy more. Plenty of staff are using the free Tallowby app on
|
|
12
|
+
their own phones and personal accounts instead, including reception.
|
|
13
|
+
- **Murmurly** (consult transcription). Vets love it. See the board extract for what was
|
|
14
|
+
actually agreed. The vendor sheet is in `vendor-sheet-murmurly.txt`. Contract and data
|
|
15
|
+
processing terms are with our solicitor and have NOT been signed yet.
|
|
16
|
+
- **Codewren** (coding assistant). The two developers are on a free 60-day trial that ends
|
|
17
|
+
next month. No decision on buying it. They have mentioned pasting chunks of the booking
|
|
18
|
+
site code and, once, a config file to debug a payment issue.
|
|
19
|
+
- **Glimmerpress** (image generator). Marketing uses it for social posts. Worry: someone
|
|
20
|
+
suggested uploading photos clients send us of their pets to "make them look festive" for
|
|
21
|
+
the Christmas campaign. We have never asked clients whether we can use those photos.
|
|
22
|
+
|
|
23
|
+
## What's already gone wrong
|
|
24
|
+
|
|
25
|
+
- Two weeks ago a receptionist pasted a whole client complaint into her personal Tallowby
|
|
26
|
+
account to help write a reply. It had the client's full name, phone number, home address,
|
|
27
|
+
the pet's treatment history and the last four digits of their card. She told her manager
|
|
28
|
+
afterwards. Nothing else has been done about it yet.
|
|
29
|
+
- A locum vet asked Tallowby for a dosage for a cat and used it. It turned out fine, but
|
|
30
|
+
that should have come from the Dosewell formulary, which every clinic already subscribes to.
|
|
31
|
+
|
|
32
|
+
## Things that already exist
|
|
33
|
+
|
|
34
|
+
- Data incidents go to the Practice Compliance Lead under the existing data incident
|
|
35
|
+
procedure. Staff mostly don't know that.
|
|
36
|
+
- Client photos and records live in the practice-management system.
|
|
37
|
+
|
|
38
|
+
## Things I don't know
|
|
39
|
+
|
|
40
|
+
- Someone at the board said the veterinary regulator "has rules about AI in clinical
|
|
41
|
+
records". Nobody has checked whether that's true.
|
|
42
|
+
- Who owns this policy going forward. See board extract.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
MURMURLY FOR VETERINARY PRACTICES - WHY TEAMS TRUST US
|
|
2
|
+
|
|
3
|
+
* Zero data retention: recordings are deleted the moment your note is ready.
|
|
4
|
+
* Your data is NEVER used to train our models.
|
|
5
|
+
* Fully compliant with every data protection law in every market we serve.
|
|
6
|
+
* Bank-grade encryption, end to end.
|
|
7
|
+
* Certified secure by independent auditors.
|
|
8
|
+
* Clinical-grade accuracy: 99.4% of notes need no correction.
|
|
9
|
+
|
|
10
|
+
Start your free practice-wide rollout today.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai-usage-policy",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Draft an organisation's AI
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Draft an organisation's AI use policy or staff guidance from what it has told you about its people, tools, data and worries — every \"don't\" paired with what to do instead (or who decides, when no approved way exists yet), what to do if data has already gone into a tool, and no claim about a tool, licence, owner, regulation or commitment the input didn't give. Written in the length, labels and voice the audience needs. Use when a team needs rules for what people may put into AI tools, or asks for an AI acceptable-use or governance policy. Do NOT use to write a repo's agent-tooling policy (that's agents-md-generator) or to analyse one agent's capability surface (that's agent-threat-model).",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
7
7
|
"npm": [],
|
|
@@ -28,6 +28,6 @@
|
|
|
28
28
|
],
|
|
29
29
|
"model": {
|
|
30
30
|
"tier": "standard",
|
|
31
|
-
"rationale": "Drafts a policy
|
|
31
|
+
"rationale": "Drafts a policy that pairs every restriction with an alternative and claims nothing unsupplied. Bounded generation; escalate via ambiguous-input where a regulatory regime is named or contested."
|
|
32
32
|
}
|
|
33
33
|
}
|
|
@@ -70,6 +70,34 @@
|
|
|
70
70
|
"The rollout includes a step that observes or logs would-be limiting before requests are actually blocked, or a stated way to switch enforcement off quickly",
|
|
71
71
|
"It is about one page: roughly 700 words or fewer"
|
|
72
72
|
]
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": 6,
|
|
76
|
+
"held_out": "2026-10-17",
|
|
77
|
+
"prompt": "Can you write the nurse rostering proposal for the Digital Programme Board on 23 October? Notes from the pre-meet are in premeet-notes.md, the requirements we agreed are in requirements.md, and the quotes and other numbers are in figures.csv. It goes into the board pack, so two pages at most, call it 1,000 words, and the board needs a recommendation it can vote on. Save it as rostering-proposal.md.",
|
|
78
|
+
"assertions": [
|
|
79
|
+
"Within its first few paragraphs it says what is proposed and which option it recommends (a recommendation that depends on a stated condition counts), framed as a decision for this board to take; it does not say the board already approved Corvane in March",
|
|
80
|
+
"ShiftLattice is not recommended as it stands, because its Canadian hosting fails the UK data requirement (IG-07), and the document says so even though ward managers prefer it; making it conditional on UK hosting becoming available is fine",
|
|
81
|
+
"The recommended option's weaknesses are stated as well as its strengths (for example Corvane's payroll interface being only in beta, or the in-house route being uncosted and needing a developer for most of a year)",
|
|
82
|
+
"The two agency spend figures (£4.2m from the finance ledger and £3.1m from the nursing workforce report) are not merged or silently reduced to one: it reports the discrepancy, or uses one with the other noted, and says it needs reconciling",
|
|
83
|
+
"The ward-manager time saved is stated as not measured, with a way to measure it (for example timing rota work on some wards); no hours-per-week or money saving is presented as fact, and Priya's 'a day a week' is not used as a measured figure",
|
|
84
|
+
"It does not invent facts the inputs do not give: no named owners for actions, no go-live or milestone dates, no author name, and no cost for the in-house option or other figures absent from figures.csv",
|
|
85
|
+
"It respects the board pack limit: roughly 1,100 words or fewer"
|
|
86
|
+
]
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": 7,
|
|
90
|
+
"held_out": "2026-10-17",
|
|
91
|
+
"prompt": "hey can you write me a one-pager to get our two partners to sign off on this. we're a small vet practice, Linthorpe Vets, 3 vets and 6 support staff. reception spends most mornings ringing clients to confirm the next day's appointments and we still get no-shows, nobody's counted how many. we want to switch to text reminders. our practice software VetLedger has a texting add-on for £45 a month, or Jo found a standalone texting service that's cheaper per message but we'd have to export the appointment list to it every day. some of the older clients only have landlines on file. a page max please",
|
|
92
|
+
"assertions": [
|
|
93
|
+
"It delivers the one-pager rather than stopping to ask questions; any open questions appear inside the document, not instead of it",
|
|
94
|
+
"Near the top it says what is proposed and which of the two options it recommends, or the specific fact that would decide between them",
|
|
95
|
+
"The trade-off between the options is stated honestly: the add-on costs a fixed £45 a month, while the standalone service needs a daily manual export that can be forgotten or go out of date",
|
|
96
|
+
"It says clients with only a landline on file will not get texts and need another route (such as a phone call), so morning calls do not disappear entirely",
|
|
97
|
+
"The no-show rate is recorded as not yet counted, with a way to find out (for example counting no-shows for a few weeks before and after the switch); no no-show rate or time saving is presented as fact",
|
|
98
|
+
"It does not invent facts the user did not give: no per-message price for the standalone service, no message volumes, no money saved, no named owners beyond Jo's stated role, no go-live dates and no author name",
|
|
99
|
+
"It fits on one page: roughly 550 words or fewer"
|
|
100
|
+
]
|
|
73
101
|
}
|
|
74
102
|
]
|
|
75
103
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
item,value,source
|
|
2
|
+
Wards in scope,14,Nursing directorate
|
|
3
|
+
Nursing staff on rotas (registered nurses and healthcare assistants),620,Nursing directorate
|
|
4
|
+
Corvane rostering module - implementation,£185000,Corvane quote September 2026
|
|
5
|
+
Corvane rostering module - annual licence,£62000,Corvane quote September 2026
|
|
6
|
+
ShiftLattice - implementation,£20000,ShiftLattice quote September 2026
|
|
7
|
+
ShiftLattice - annual subscription,£48000,ShiftLattice quote September 2026
|
|
8
|
+
In-house extension of Access rota tool,not costed,Digital
|
|
9
|
+
Agency nursing spend 2025/26,£4.2m,Finance ledger (Tomasz Lee)
|
|
10
|
+
Agency nursing spend 2025/26,£3.1m,Nursing workforce report (Helen Marsh)
|
|
11
|
+
Rota publication lead time today,4 weeks,Nursing directorate
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Nurse rostering - pre-meet for Digital Programme Board
|
|
2
|
+
|
|
3
|
+
Wrenfield District Hospital, 2 October 2026
|
|
4
|
+
|
|
5
|
+
Present: Helen Marsh (Deputy Chief Nurse), Tomasz Lee (Finance Business Partner), Ade Okafor (Head of Digital), Priya Raman (Ward Manager, Elm Ward), Gary Fenn (Information Governance Lead)
|
|
6
|
+
|
|
7
|
+
**Where we are**
|
|
8
|
+
- Helen: every ward still builds its rota in its own spreadsheet and keeps the live version on the office whiteboard. Gaps get spotted a few days out, which is when we end up ringing agencies.
|
|
9
|
+
- Helen: the board will want to know how many hours this gives back to ward managers. "Put a number on it." Nobody has ever timed how long rota work takes. Priya: "feels like a day a week, for me anyway."
|
|
10
|
+
|
|
11
|
+
**Money**
|
|
12
|
+
- Tomasz: agency nursing spend for 2025/26 was £4.2m, from the finance ledger.
|
|
13
|
+
- Helen: her figure from the nursing workforce report is £3.1m for the same year.
|
|
14
|
+
- Not resolved which is right or why they differ.
|
|
15
|
+
|
|
16
|
+
**Options**
|
|
17
|
+
- ShiftLattice: Priya and two other ward managers sat through the demo and loved it - self-rostering on the phone, very easy to use. Priya: "it's the obvious choice."
|
|
18
|
+
- Gary: ShiftLattice told us their data is hosted in Canada and they have no date for UK hosting. Policy IG-07 says staff personal data stays in the UK. Gary can't sign it off as it stands.
|
|
19
|
+
- Corvane rostering module: Corvane already runs our patient record system. Ade has the quote. Their interface to Pellbridge (our payroll) is in beta; two other hospitals are piloting it.
|
|
20
|
+
- In-house: Ade says we could extend the old Access rota tool, but it would need a developer for most of a year. Not costed.
|
|
21
|
+
|
|
22
|
+
**Other**
|
|
23
|
+
- Priya: "Didn't the board already approve Corvane back in March?" Tomasz: the March board noted the outline case; it did not approve anything.
|
|
24
|
+
- Helen would like it live before winter. No date agreed.
|
|
25
|
+
- Proposal to go to the Digital Programme Board on 23 October.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Rostering requirements (agreed at pre-meet)
|
|
2
|
+
|
|
3
|
+
1. Staff can request shifts and leave from their phone.
|
|
4
|
+
2. Rotas published at least 6 weeks ahead (today: 4 weeks).
|
|
5
|
+
3. Shows each ward's minimum safe staffing per shift and flags gaps as soon as they appear.
|
|
6
|
+
4. Hours worked go to Pellbridge payroll without being typed in again.
|
|
7
|
+
5. Staff personal data is held in the UK (policy IG-07).
|
|
8
|
+
6. Ward managers can use it after a short training session.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "design-doc",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Generate a Google-style engineering design doc (problem, goals/non-goals, options considered, recommended approach, risks, rollout) from a feature brief or short description. Use when the user wants to draft a design doc, technical proposal, or one-pager for an engineering review.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
@@ -1,68 +1,65 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: guide-builder
|
|
3
|
-
description: Turn raw notes,
|
|
3
|
+
description: Turn raw notes, a spec, a thread or a messy procedure into a guide someone else can follow — a setup guide, a how-to, an onboarding walkthrough, or a reference for developers — in the length and voice its reader needs. Holds only what the notes say, marks anything inferred where it appears, orders steps so nothing is used before it is set up, and keeps open questions out of the guide so it can be sent as it stands. Use when the user wants setup or getting-started instructions, a walkthrough of how something works, or reference docs for an API or event schema — and it is NOT an SRE operational runbook (use runbook-generator) or a design proposal for review (use design-doc).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# guide-builder
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
**The rule: the guide holds only what the notes say.** A guide is followed literally. The
|
|
9
|
+
agent's habit is to make it feel complete: a confirmation message nobody mentioned ("you
|
|
10
|
+
should see *Connected*"), a menu path from a different version, "required" on every field, a
|
|
11
|
+
retry policy that sounds standard. Each invented detail is a step the reader will look for
|
|
12
|
+
and not find. So every fact comes from the material. An inference from it (a unit read off a
|
|
13
|
+
sample value, the likely meaning of a field) is marked as an inference where it appears:
|
|
14
|
+
✅ *"`ts` looks like seconds since 1970, judging by the sample; confirm before relying on
|
|
15
|
+
it."*
|
|
16
|
+
|
|
17
|
+
A second rule: **the guide can be sent as it stands.** Questions for the person who asked,
|
|
18
|
+
internal notes, "confirm with engineering" and to-do markers go in your reply, never in the
|
|
19
|
+
guide. Where the reader will need something the notes don't settle, the guide tells the
|
|
20
|
+
*reader* who to ask, if the notes say who: ✅ *"Your login for the booking system comes from
|
|
21
|
+
the office manager."*
|
|
9
22
|
|
|
10
23
|
## How to respond
|
|
11
24
|
|
|
12
|
-
**
|
|
25
|
+
1. **Write for the reader they named, at the size asked for.** A README section, a page for a
|
|
26
|
+
new starter, a sheet for volunteers, a reference for developers: that sets the voice,
|
|
27
|
+
length and shape. Short asks get short guides.
|
|
13
28
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
- **For this skill:** Turn the notes into the guide and stop. No endpoints, expected outputs, time estimates, troubleshooting rows or teardown steps that are not in the notes, and no warnings or to-do markers inside the guide.
|
|
29
|
+
2. **Order by dependency, not by the notes.** Nothing is used before the step that sets it
|
|
30
|
+
up: an account before signing in with it, a password store before the password goes in.
|
|
31
|
+
Notes are usually written in the order things were remembered; the guide follows the
|
|
32
|
+
order they have to be done.
|
|
19
33
|
|
|
20
|
-
|
|
34
|
+
3. **One action per step, with a way to tell it worked when the notes give one.** Number the
|
|
35
|
+
steps. Split compound ones. Add a success check only where the notes say what success
|
|
36
|
+
looks like; don't invent screens, messages or outputs.
|
|
21
37
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
| **API reference** → [`templates/api-reference.md`](templates/api-reference.md) | contracts other developers code against | endpoints, request/response shapes, OpenAPI, event names, payload schemas, status codes, webhooks, Kafka/SNS topics, JSON Schema |
|
|
38
|
+
4. **For developer references, the contract as given.** Each endpoint, event or field with
|
|
39
|
+
what the notes say about it: type, whether it's required, meaning, an example where the
|
|
40
|
+
notes have one. Where the notes don't say whether a field is required or what a value
|
|
41
|
+
means, the reference says that, rather than guessing. Error responses only as documented.
|
|
27
42
|
|
|
28
|
-
|
|
43
|
+
5. **What the notes don't cover stays out.** A feature people have asked about but the notes
|
|
44
|
+
don't describe, steps for a device or tool the notes never mention, a header name or host
|
|
45
|
+
nobody wrote down: leave them out of the guide, and name them once in your reply.
|
|
29
46
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
- **Design walkthrough** needs *who it's for* (new hire vs adjacent team) and *what they should be able to do after reading*.
|
|
33
|
-
- **API reference** needs the *transport + auth model* and *versioning scheme*. Without auth, the examples are unrunnable.
|
|
34
|
-
|
|
35
|
-
If the source is genuinely too thin, say so once and draft with gaps flagged as `> ⚠️ NEEDS INPUT: …` — don't invent.
|
|
36
|
-
|
|
37
|
-
4. **Fill the matching template.** Each template is ordered the way a reader actually consumes it. Don't reorder sections to match the input's order; reorder the input to match the reader's path.
|
|
38
|
-
|
|
39
|
-
5. **Apply the universal easy-to-follow rules** (these are the spine of every style):
|
|
40
|
-
- **One action per step.** Number them. No compound step hiding three commands behind one number.
|
|
41
|
-
- **Every step ends in a check.** "You should see `Listening on :3000`." A step with no success signal can't tell the reader whether to continue or stop.
|
|
42
|
-
- **Commands are complete and paste-able.** Real flags, not pseudocode. Placeholders are unmistakable (`<YOUR_API_KEY>`, never `your-key-here` buried mid-line) and listed once up front.
|
|
43
|
-
- **Lead each section with the outcome, not the backstory.** "By the end of this section the service answers on localhost." The "why" belongs in a walkthrough, not a quickstart.
|
|
44
|
-
- **Front-load the happy path.** Push edge cases, troubleshooting, and teardown to the end.
|
|
45
|
-
|
|
46
|
-
## Useful references in this skill
|
|
47
|
-
|
|
48
|
-
- [`templates/setup-guide.md`](templates/setup-guide.md) — install/configure/run, prerequisites → verify → troubleshooting.
|
|
49
|
-
- [`templates/design-walkthrough.md`](templates/design-walkthrough.md) — mental model → components → flow → key decisions → where the code lives.
|
|
50
|
-
- [`templates/api-reference.md`](templates/api-reference.md) — conventions → per-endpoint/event contracts → error catalog → changelog.
|
|
51
|
-
- [`examples/local-setup-guide.md`](examples/local-setup-guide.md) — raw notes → a finished setup guide, showing the detection call and the verify-after-every-step discipline.
|
|
47
|
+
6. **Deliver from what you have.** With notes to work from, write the guide and state any
|
|
48
|
+
assumption about the reader in one line. Ask first only when there is nothing to work from.
|
|
52
49
|
|
|
53
50
|
## Quality bar
|
|
54
51
|
|
|
55
|
-
- **
|
|
56
|
-
- **
|
|
57
|
-
- **
|
|
58
|
-
- **
|
|
59
|
-
- **
|
|
60
|
-
- **
|
|
52
|
+
- **Every fact in the guide is in the notes;** every inference is marked where it appears.
|
|
53
|
+
- **The guide can be sent as written:** no questions, internal notes or to-do markers in it.
|
|
54
|
+
- **A reader following top to bottom never uses something before it is set up.**
|
|
55
|
+
- **One action per step;** success checks only where the notes give them.
|
|
56
|
+
- **References say "not stated" rather than guessing types, required fields or meanings.**
|
|
57
|
+
- **Length and voice fit the reader asked for.**
|
|
61
58
|
|
|
62
59
|
## When to use this skill
|
|
63
60
|
|
|
64
61
|
- ✅ "Write setup instructions for getting our service running locally."
|
|
65
|
-
- ✅ "Turn this
|
|
62
|
+
- ✅ "Turn this description into an onboarding walkthrough for new staff."
|
|
66
63
|
- ✅ "Document these endpoints / this event schema for the developers who'll consume them."
|
|
67
64
|
- ✅ Converting messy notes or a spec into a doc someone can follow without you present.
|
|
68
65
|
|
|
@@ -75,11 +72,13 @@ You help the user turn rough material — notes, a spec, an architecture descrip
|
|
|
75
72
|
|
|
76
73
|
## Anti-patterns to avoid
|
|
77
74
|
|
|
78
|
-
- ❌
|
|
79
|
-
|
|
80
|
-
- ❌
|
|
81
|
-
- ❌
|
|
82
|
-
|
|
83
|
-
- ❌
|
|
84
|
-
-
|
|
85
|
-
- ❌ **
|
|
75
|
+
- ❌ **The plausible detail.** A success message, a default, a menu path or a retry count the
|
|
76
|
+
notes never mention.
|
|
77
|
+
- ❌ **Notes to the requester inside the guide.** "Internal: confirm with eng before sending."
|
|
78
|
+
- ❌ **Steps for what the notes don't cover,** written from general knowledge because the
|
|
79
|
+
reader will need them. Tell the reader who to ask instead.
|
|
80
|
+
- ❌ **Template sections on a small ask.** "Mental model", "Data & state", "Where it runs" for a
|
|
81
|
+
five-line description.
|
|
82
|
+
- ❌ **"Required: yes" on every field** because the column needed filling.
|
|
83
|
+
- ❌ **Compound steps.** Three commands behind one number.
|
|
84
|
+
- ❌ **Announcing your approach.** "Reading this as a setup guide…" — just write it.
|
|
@@ -72,6 +72,33 @@
|
|
|
72
72
|
"It does not invent a queue or topic name, how often events are sent, delivery guarantees, value ranges stated as fact, or fields that are not in the sample",
|
|
73
73
|
"The reference is about a page or less, with no sections on things that were not supplied such as authentication, retries or versioning"
|
|
74
74
|
]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": 6,
|
|
78
|
+
"held_out": "2026-10-17",
|
|
79
|
+
"prompt": "Can you turn setup-notes.md and thread.txt into a setup guide for Wren? She's a new analyst starting Monday and needs to get Larkspur running on her laptop on day one without pinging anyone. She's fine in a terminal but has never seen our stack. Something she can follow in one sitting, under 600 words.",
|
|
80
|
+
"assertions": [
|
|
81
|
+
"The steps run in an order that works: lark-analysts access is requested up front, `lark runtime start` comes before `lark db init`, the database is initialised before `lark seed`, and the config file is created before `lark login`, which comes before `lark sync`, even though the notes put seeding first",
|
|
82
|
+
"The local database port is given as 6543, the 2.4 default from the thread, and 5433 is not presented as the current port",
|
|
83
|
+
"`lark deploy --prod` does not appear as a step, and the lunch chat is left out",
|
|
84
|
+
"If the guide says the login can stop working and need `lark login` again, it is marked as one colleague's experience rather than stated as documented behaviour",
|
|
85
|
+
"It does not invent a region or workspace value, a VPN requirement either way, or any command, flag, file path, error message or timing not in the two files",
|
|
86
|
+
"The guide is delivered without stopping to ask first, and the unanswered questions (which region Wren should use, whether sync needs the VPN off-site) are raised to the requester outside the guide rather than answered by guesswork inside it",
|
|
87
|
+
"The guide is under 600 words"
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": 7,
|
|
92
|
+
"held_out": "2026-10-17",
|
|
93
|
+
"prompt": "hi, I do the welcome stuff for Brackenhill Allotment Association. can you make this into a short welcome guide for new plot holders? half a page max, they're mostly retirees and young families, not techy at all.\n\nshed key is in the lockbox by the gate, code is on the welcome sheet. water troughs get turned on in april by whoever's on the rota. sign the tool book when you borrow anything. bonfires NOT allowed, council letter last yr. compost bays - green bin is for weeds, the wooden ones for everything else? not sure tbh ask Derek. new folk do their induction walk with a committee member before they get a key",
|
|
94
|
+
"assertions": [
|
|
95
|
+
"The induction walk with a committee member comes before getting the key or using the lockbox, even though the notes mention the key first",
|
|
96
|
+
"It does not invent the lockbox code, a date for the water going on, rota names, contact details for Derek or anyone else, rent, opening hours, penalties or any rule not in the notes",
|
|
97
|
+
"The compost-bay split is not stated as a settled rule in the guide, and the requester is told outside the guide that it needs confirming with Derek",
|
|
98
|
+
"The bonfire ban and signing the tool book are both included as clear rules",
|
|
99
|
+
"It is written in plain everyday language a non-technical newcomer can follow, with no jargon or committee shorthand left unexplained",
|
|
100
|
+
"The guide fits in about half a page (roughly 250 words or fewer) and is delivered without stopping to ask questions first"
|
|
101
|
+
]
|
|
75
102
|
}
|
|
76
103
|
]
|
|
77
104
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# larkspur local setup - rough notes (Tobin, not tidied)
|
|
2
|
+
|
|
3
|
+
- `lark seed --sample` loads the sample dataset so you have tables to query. do this first thing so there's something to look at
|
|
4
|
+
- install the CLI from the intranet: Fenmoor Hub > Tools > Larkspur CLI, run the installer. check with `lark --version`, should be 2.4 or later
|
|
5
|
+
- seed writes into your local db, so you need one: `lark db init` (creates it on port 5433)
|
|
6
|
+
- db init only works if the local runtime is up: `lark runtime start`
|
|
7
|
+
- config lives at ~/.lark/config.toml. clone the larkspur-starter repo, copy config.example.toml to ~/.lark/config.toml, fill in `workspace` and `region`
|
|
8
|
+
- `lark login` opens the browser for SSO. it reads workspace from the config file so the config has to exist first or it errors
|
|
9
|
+
- you must be in the lark-analysts group or login fails with "not authorised". Ines on the platform team adds people. can take up to a working day so ideally request before day one
|
|
10
|
+
- after login, `lark sync` pulls the shared dimension tables. first sync takes about 10 min, later ones are quick
|
|
11
|
+
- `lark status` shows runtime, db and login state if something looks off
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#data-onboarding (export)
|
|
2
|
+
|
|
3
|
+
Tobin: pinned my setup notes for whoever starts next. local db is on 5433 btw
|
|
4
|
+
Mara: heads up, since 2.4 `lark db init` defaults to 6543. 5433 kept clashing with other stuff on people's machines
|
|
5
|
+
Tobin: ah yes, my notes predate that. 6543 it is
|
|
6
|
+
Pell: what region do new people put in the config? I just copied mine from someone
|
|
7
|
+
Tobin: depends which team they land on. I'll check for Wren and get back to you
|
|
8
|
+
Pell: also does `lark sync` need the VPN on? I think it does when I'm off-site but not 100%
|
|
9
|
+
Mara: no idea, haven't worked from home in ages
|
|
10
|
+
Pell: fwiw my login stopped working after the long weekend, had to run `lark login` again
|
|
11
|
+
Mara: reminder for platform folks only: `lark deploy --prod` is still frozen until the migration is signed off, don't run it
|
|
12
|
+
Tobin: lunch at 12:30 anyone?
|
|
13
|
+
Mara: yes
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "guide-builder",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Turn raw notes,
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Turn raw notes, a spec, a thread or a messy procedure into a guide someone else can follow — a setup guide, a how-to, an onboarding walkthrough, or a reference for developers — in the length and voice its reader needs. Holds only what the notes say, marks anything inferred where it appears, orders steps so nothing is used before it is set up, and keeps open questions out of the guide so it can be sent as it stands. Use when the user wants setup or getting-started instructions, a walkthrough of how something works, or reference docs for an API or event schema — and it is NOT an SRE operational runbook (use runbook-generator) or a design proposal for review (use design-doc).",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
7
7
|
"env": { "required": [], "optional": [] },
|
|
8
8
|
"related": ["brief-intake", "design-doc", "exec-summary", "runbook-generator"],
|
|
9
9
|
"tags": ["guide", "setup", "documentation", "api-reference", "onboarding", "walkthrough"],
|
|
10
|
-
"model": { "tier": "standard", "rationale": "Shapes notes into a
|
|
10
|
+
"model": { "tier": "standard", "rationale": "Shapes notes into a guide without adding to them. Generation, not adversarial review." }
|
|
11
11
|
}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
# Example: raw notes → setup guide
|
|
2
|
-
|
|
3
|
-
Shows the two things that make this skill earn its keep: the **style-detection call up front**, and the **verify-after-every-step** discipline that turns notes into something a stranger can follow.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Input (what the user pasted)
|
|
8
|
-
|
|
9
|
-
> need a getting-started doc for `widget-api`. it's a Go service, needs Postgres 15. clone, copy the env file (need a STRIPE_KEY from the dashboard), `make deps`, bring up postgres with docker, `make migrate`, then `make run`. it serves on 8080. there's a `/healthz`. people keep forgetting to start postgres first and then complain migrate hangs.
|
|
10
|
-
|
|
11
|
-
## The skill's first line back (style detection)
|
|
12
|
-
|
|
13
|
-
> Reading this as a **setup guide** — it's clone → configure → run with a defined finish line (`/healthz` answering). Two things I'm filling with defaults; correct me if wrong: end state is **running locally** (not deployed), and the prerequisite baseline assumes Go and Docker are already installed. Drafting now.
|
|
14
|
-
|
|
15
|
-
## Output
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
# widget-api — Setup guide
|
|
20
|
-
|
|
21
|
-
**Goal:** Run `widget-api` locally against a Dockerized Postgres and get a healthy response from `/healthz`.
|
|
22
|
-
**Time:** ~10 minutes
|
|
23
|
-
**You'll have at the end:** the API serving on `localhost:8080` with migrations applied.
|
|
24
|
-
|
|
25
|
-
## Placeholders used in this guide
|
|
26
|
-
|
|
27
|
-
| Placeholder | What to put | Where to get it |
|
|
28
|
-
|---|---|---|
|
|
29
|
-
| `<STRIPE_KEY>` | Stripe secret key for the test mode | Stripe Dashboard → Developers → API keys |
|
|
30
|
-
|
|
31
|
-
## Prerequisites
|
|
32
|
-
|
|
33
|
-
| Need | Version | Check it | If missing |
|
|
34
|
-
|---|---|---|---|
|
|
35
|
-
| Go | `>= 1.22` | `go version` | https://go.dev/dl |
|
|
36
|
-
| Docker | any recent | `docker --version` | https://docs.docker.com/get-docker |
|
|
37
|
-
| Postgres image | 15 | (pulled in step 3) | — |
|
|
38
|
-
|
|
39
|
-
## Steps
|
|
40
|
-
|
|
41
|
-
### 1. Clone the repo and enter it
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
git clone git@github.com:example/widget-api.git && cd widget-api
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
**You should see:** a `Makefile` in the directory — `ls Makefile`.
|
|
48
|
-
|
|
49
|
-
### 2. Configure environment
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
cp .env.example .env
|
|
53
|
-
# then set in .env:
|
|
54
|
-
# STRIPE_KEY=<STRIPE_KEY>
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
**You should see:** no placeholders left — `grep '<' .env` returns nothing.
|
|
58
|
-
|
|
59
|
-
### 3. Start Postgres (do this before migrating)
|
|
60
|
-
|
|
61
|
-
```bash
|
|
62
|
-
docker compose up -d postgres
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
**You should see:** `docker compose ps` lists `postgres` as `healthy`. Wait for `healthy` before the next step — migrating against a not-yet-ready Postgres is what makes `make migrate` appear to hang.
|
|
66
|
-
|
|
67
|
-
### 4. Install Go dependencies
|
|
68
|
-
|
|
69
|
-
```bash
|
|
70
|
-
make deps
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
**You should see:** `go mod download` completes with no errors.
|
|
74
|
-
|
|
75
|
-
### 5. Run migrations
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
make migrate
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
**You should see:** `migrations applied: N` and a return to the prompt within a few seconds.
|
|
82
|
-
|
|
83
|
-
### 6. Start the service
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
make run
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
**You should see:** `widget-api listening on :8080`.
|
|
90
|
-
|
|
91
|
-
## Verify it works
|
|
92
|
-
|
|
93
|
-
```bash
|
|
94
|
-
curl -s localhost:8080/healthz
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
**Expected:** `{"status":"ok","db":"connected"}`
|
|
98
|
-
|
|
99
|
-
## Troubleshooting
|
|
100
|
-
|
|
101
|
-
| Symptom | Likely cause | Fix |
|
|
102
|
-
|---|---|---|
|
|
103
|
-
| `make migrate` hangs | Postgres not `healthy` yet | Re-check step 3; wait for `healthy`, then retry |
|
|
104
|
-
| `connection refused :5432` | Postgres container not up | `docker compose up -d postgres` |
|
|
105
|
-
| `/healthz` returns `db:"down"` | migrations not applied | run step 5 |
|
|
106
|
-
|
|
107
|
-
## Teardown
|
|
108
|
-
|
|
109
|
-
```bash
|
|
110
|
-
docker compose down -v
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
Removes the Postgres container and its volume. Your `.env` is left intact.
|
|
114
|
-
|
|
115
|
-
## Next steps
|
|
116
|
-
|
|
117
|
-
- Run the tests: `make test`
|
|
118
|
-
- Reference for the endpoints this service exposes: generate one with `/guide-builder` in **API reference** style.
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
### Why this passes the quality bar
|
|
123
|
-
|
|
124
|
-
- **Every step ends in a check** — the reader never guesses whether to continue.
|
|
125
|
-
- **The one gotcha from the notes** ("people forget to start postgres") became step 3's check *and* the first troubleshooting row, instead of buried prose.
|
|
126
|
-
- **The single placeholder is listed once up front**, not left as a surprise mid-command.
|
|
127
|
-
- **One end-to-end verify** (`/healthz`) proves the whole chain, not just the last command.
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
# {API / event stream name} — Developer reference
|
|
2
|
-
|
|
3
|
-
**Base URL:** `{https://api.example.com/v1}`
|
|
4
|
-
**Auth:** {e.g. "Bearer token in `Authorization` header; obtain via …"}
|
|
5
|
-
**Versioning:** {e.g. "URL-path `/v1`; breaking changes ship a new path. See Changelog."}
|
|
6
|
-
**Content type:** `application/json` unless stated.
|
|
7
|
-
|
|
8
|
-
## Conventions
|
|
9
|
-
|
|
10
|
-
These apply to every endpoint/event below — read once, don't repeat per item.
|
|
11
|
-
|
|
12
|
-
- **Errors** return this shape:
|
|
13
|
-
```json
|
|
14
|
-
{ "error": { "code": "string", "message": "human-readable", "details": {} } }
|
|
15
|
-
```
|
|
16
|
-
- **Pagination:** {e.g. "cursor-based: pass `?cursor=`; response includes `next_cursor` (null on last page)"}
|
|
17
|
-
- **Idempotency:** {e.g. "mutating calls accept an `Idempotency-Key` header; replays within 24h return the original result"}
|
|
18
|
-
- **Rate limits:** {e.g. "600 req/min/token; `429` with `Retry-After` when exceeded"}
|
|
19
|
-
- **Timestamps:** ISO 8601 UTC (`2026-05-26T14:30:00Z`).
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## Endpoints
|
|
24
|
-
|
|
25
|
-
### `{METHOD} /{path}` — {one-line purpose}
|
|
26
|
-
|
|
27
|
-
{One sentence on when a consumer calls this.}
|
|
28
|
-
|
|
29
|
-
**Auth:** {required scope/role, or "none"}
|
|
30
|
-
|
|
31
|
-
**Path / query params**
|
|
32
|
-
|
|
33
|
-
| Param | In | Type | Required | Description |
|
|
34
|
-
|---|---|---|---|---|
|
|
35
|
-
| `{id}` | path | string | yes | {…} |
|
|
36
|
-
| `{limit}` | query | integer | no | {default, max} |
|
|
37
|
-
|
|
38
|
-
**Request body**
|
|
39
|
-
|
|
40
|
-
| Field | Type | Required | Description |
|
|
41
|
-
|---|---|---|---|
|
|
42
|
-
| `{field}` | string | yes | {…} |
|
|
43
|
-
| `{field}` | integer | no | {default} |
|
|
44
|
-
|
|
45
|
-
```json
|
|
46
|
-
{ "field": "value", "field2": 42 }
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
**Response `200`**
|
|
50
|
-
|
|
51
|
-
| Field | Type | Description |
|
|
52
|
-
|---|---|---|
|
|
53
|
-
| `{id}` | string | {…} |
|
|
54
|
-
| `{status}` | enum(`a`,`b`) | {…} |
|
|
55
|
-
|
|
56
|
-
```json
|
|
57
|
-
{ "id": "abc_123", "status": "a", "created_at": "2026-05-26T14:30:00Z" }
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
**Errors**
|
|
61
|
-
|
|
62
|
-
| Status | `error.code` | When |
|
|
63
|
-
|---|---|---|
|
|
64
|
-
| `400` | `invalid_request` | {…} |
|
|
65
|
-
| `404` | `not_found` | {…} |
|
|
66
|
-
| `409` | `conflict` | {…} |
|
|
67
|
-
|
|
68
|
-
```json
|
|
69
|
-
{ "error": { "code": "not_found", "message": "No resource with id abc_123" } }
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
## Events / messages
|
|
75
|
-
|
|
76
|
-
For each event a consumer subscribes to.
|
|
77
|
-
|
|
78
|
-
### `{event.name}` — {one-line: what happened}
|
|
79
|
-
|
|
80
|
-
- **Emitted when:** {the trigger}
|
|
81
|
-
- **Transport:** {e.g. "Kafka topic `orders.v1`" / "webhook POST to your callback URL" / "SNS topic ARN …"}
|
|
82
|
-
- **Delivery:** {e.g. "at-least-once; consumers MUST be idempotent on `event_id`"}
|
|
83
|
-
- **Ordering:** {e.g. "ordered per `partition_key = order_id`; no global order"}
|
|
84
|
-
|
|
85
|
-
**Payload**
|
|
86
|
-
|
|
87
|
-
| Field | Type | Required | Description |
|
|
88
|
-
|---|---|---|---|
|
|
89
|
-
| `event_id` | string (uuid) | yes | dedup key |
|
|
90
|
-
| `occurred_at` | string (ISO 8601) | yes | when the fact happened (not when delivered) |
|
|
91
|
-
| `data.{field}` | string | yes | {…} |
|
|
92
|
-
|
|
93
|
-
```json
|
|
94
|
-
{
|
|
95
|
-
"event_id": "evt_01HX...",
|
|
96
|
-
"type": "{event.name}",
|
|
97
|
-
"occurred_at": "2026-05-26T14:30:00Z",
|
|
98
|
-
"data": { "order_id": "ord_123", "amount_cents": 4999 }
|
|
99
|
-
}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
**Consumer notes:** {what a subscriber must handle — out-of-order arrival, schema evolution, poison messages}
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
## Error code catalog
|
|
107
|
-
|
|
108
|
-
| `error.code` | Meaning | Consumer action |
|
|
109
|
-
|---|---|---|
|
|
110
|
-
| `invalid_request` | malformed input | fix and retry; don't blind-retry |
|
|
111
|
-
| `rate_limited` | over quota | back off per `Retry-After` |
|
|
112
|
-
| `conflict` | idempotency or state clash | inspect existing resource |
|
|
113
|
-
| {…} | … | … |
|
|
114
|
-
|
|
115
|
-
## Changelog
|
|
116
|
-
|
|
117
|
-
| Version / date | Change | Breaking? |
|
|
118
|
-
|---|---|---|
|
|
119
|
-
| `v1` — {YYYY-MM-DD} | initial | — |
|
|
120
|
-
| {…} | … | yes/no |
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
# {System / feature} — How it works
|
|
2
|
-
|
|
3
|
-
**Who this is for:** {e.g. "an engineer joining the payments team" / "an adjacent team integrating with us"}
|
|
4
|
-
**After reading, you'll be able to:** {concrete capability — "trace a checkout request end-to-end and know which service owns each step"}
|
|
5
|
-
**Status:** describes the system as built on {YYYY-MM-DD}. For *why we chose this design*, see {link to ADRs / design-doc}.
|
|
6
|
-
|
|
7
|
-
## The mental model
|
|
8
|
-
|
|
9
|
-
{One paragraph or one diagram. The single idea a reader must hold to understand everything below — e.g. "Every write goes through the command bus; reads come straight from a denormalized view. Nothing reads the write tables directly."}
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
{Optional ASCII or Mermaid sketch — or link to an architecture-diagrams output. Keep it to the load-bearing boxes and arrows, not every box.}
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Components
|
|
16
|
-
|
|
17
|
-
What each piece does and why it exists — not how to deploy it.
|
|
18
|
-
|
|
19
|
-
| Component | Responsibility | Why it's separate |
|
|
20
|
-
|---|---|---|
|
|
21
|
-
| {name} | {one line — what it owns} | {what would break if it were merged into its neighbour} |
|
|
22
|
-
| {…} | … | … |
|
|
23
|
-
|
|
24
|
-
## How a {request / event / job} flows through
|
|
25
|
-
|
|
26
|
-
Trace one representative path step by step. This is the heart of the walkthrough.
|
|
27
|
-
|
|
28
|
-
1. **{Entry point}** — {what happens, which component, what data} → `{file or module:fn}`
|
|
29
|
-
2. **{Next hop}** — {…} → `{file:fn}`
|
|
30
|
-
3. **{…}** — {…}
|
|
31
|
-
4. **{Result}** — {what the caller gets back / what side effect lands}
|
|
32
|
-
|
|
33
|
-
> Trace it yourself: {how to watch this flow live — a log query, a trace ID, a debug endpoint}.
|
|
34
|
-
|
|
35
|
-
## Key design decisions (and why)
|
|
36
|
-
|
|
37
|
-
The non-obvious choices a reader will otherwise undo by accident.
|
|
38
|
-
|
|
39
|
-
- **{Decision}** — {why; what was rejected}. {Link to the ADR if one exists.}
|
|
40
|
-
- **{Decision}** — {…}
|
|
41
|
-
|
|
42
|
-
## Data & state
|
|
43
|
-
|
|
44
|
-
- **Source of truth:** {where the canonical data lives}
|
|
45
|
-
- **Derived / cached:** {what's a projection of it, and how it's kept in sync}
|
|
46
|
-
- **What's NOT persisted:** {e.g. "session state is in memory; a restart drops it — by design"}
|
|
47
|
-
|
|
48
|
-
## Where the code lives
|
|
49
|
-
|
|
50
|
-
| Concern | Path | Notes |
|
|
51
|
-
|---|---|---|
|
|
52
|
-
| {entry points / routes} | `{path}` | {…} |
|
|
53
|
-
| {core logic} | `{path}` | start here when reading |
|
|
54
|
-
| {data layer} | `{path}` | … |
|
|
55
|
-
| {tests worth reading first} | `{path}` | the integration tests document the contract |
|
|
56
|
-
|
|
57
|
-
## Making common changes
|
|
58
|
-
|
|
59
|
-
How to do the things a new contributor will need in week one.
|
|
60
|
-
|
|
61
|
-
- **Add a {new endpoint / event / field}:** {the 2–4 places to touch, in order}
|
|
62
|
-
- **Change {common thing}:** {…}
|
|
63
|
-
|
|
64
|
-
## Gotchas / sharp edges
|
|
65
|
-
|
|
66
|
-
- ⚠️ {Non-obvious constraint that will bite — "the queue is at-least-once; handlers must be idempotent"}
|
|
67
|
-
- ⚠️ {…}
|
|
68
|
-
|
|
69
|
-
## Glossary
|
|
70
|
-
|
|
71
|
-
- **{Term}** — {definition in this system's context, not the generic one}
|
|
72
|
-
- **{Term}** — {…}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
# {Project / component} — Setup guide
|
|
2
|
-
|
|
3
|
-
**Goal:** {one sentence — the end state, e.g. "Run the API locally with a seeded database and answer a request on `localhost:3000`."}
|
|
4
|
-
**Time:** ~{N} minutes
|
|
5
|
-
**You'll have at the end:** {concrete artifact — "a running server, a seeded DB, and a passing health check"}
|
|
6
|
-
|
|
7
|
-
## Placeholders used in this guide
|
|
8
|
-
|
|
9
|
-
Replace these everywhere they appear. Nothing else is a placeholder.
|
|
10
|
-
|
|
11
|
-
| Placeholder | What to put | Where to get it |
|
|
12
|
-
|---|---|---|
|
|
13
|
-
| `<YOUR_API_KEY>` | {what it is} | {where to obtain it} |
|
|
14
|
-
| `<DB_PASSWORD>` | {what it is} | {…} |
|
|
15
|
-
|
|
16
|
-
## Prerequisites
|
|
17
|
-
|
|
18
|
-
Check each before starting — a failed setup is almost always a missing prerequisite.
|
|
19
|
-
|
|
20
|
-
| Need | Version | Check it | If missing |
|
|
21
|
-
|---|---|---|---|
|
|
22
|
-
| {Node / Python / Docker / …} | `>= {x.y}` | `node --version` | {install link / command} |
|
|
23
|
-
| {…} | … | `…` | … |
|
|
24
|
-
|
|
25
|
-
## Steps
|
|
26
|
-
|
|
27
|
-
### 1. {Imperative — e.g. "Clone the repo and enter it"}
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
git clone {repo-url} && cd {repo-dir}
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
**You should see:** {what success looks like — e.g. "a `package.json` in the directory: `ls package.json`"}
|
|
34
|
-
|
|
35
|
-
### 2. {Imperative — e.g. "Install dependencies"}
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
{exact command — e.g. `npm ci`}
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
**You should see:** {e.g. "`added 412 packages` with no errors"}
|
|
42
|
-
|
|
43
|
-
### 3. {Imperative — e.g. "Configure environment"}
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
cp .env.example .env
|
|
47
|
-
# then set:
|
|
48
|
-
# API_KEY=<YOUR_API_KEY>
|
|
49
|
-
# DB_PASSWORD=<DB_PASSWORD>
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
**You should see:** {e.g. "`.env` exists and has no remaining `<…>` placeholders: `grep '<' .env` returns nothing"}
|
|
53
|
-
|
|
54
|
-
### 4. {Imperative — e.g. "Start dependencies"}
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
{e.g. `docker compose up -d postgres`}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
**You should see:** {e.g. "`docker compose ps` shows postgres as `healthy`"}
|
|
61
|
-
|
|
62
|
-
### 5. {Imperative — e.g. "Run migrations and seed"}
|
|
63
|
-
|
|
64
|
-
```bash
|
|
65
|
-
{e.g. `npm run db:migrate && npm run db:seed`}
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
**You should see:** {e.g. "`Migrations complete (3 applied)` and `Seeded 12 rows`"}
|
|
69
|
-
|
|
70
|
-
### 6. {Imperative — e.g. "Start the service"}
|
|
71
|
-
|
|
72
|
-
```bash
|
|
73
|
-
{e.g. `npm run dev`}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
**You should see:** {e.g. "`Listening on http://localhost:3000`"}
|
|
77
|
-
|
|
78
|
-
## Verify it works
|
|
79
|
-
|
|
80
|
-
One end-to-end check that proves the whole setup, not just the last step.
|
|
81
|
-
|
|
82
|
-
```bash
|
|
83
|
-
{e.g. `curl -s localhost:3000/health`}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
**Expected:** {e.g. `{"status":"ok","db":"connected"}`}
|
|
87
|
-
|
|
88
|
-
If you get this, you're done.
|
|
89
|
-
|
|
90
|
-
## Troubleshooting
|
|
91
|
-
|
|
92
|
-
| Symptom | Likely cause | Fix |
|
|
93
|
-
|---|---|---|
|
|
94
|
-
| {exact error text} | {what's actually wrong} | {command or step to fix} |
|
|
95
|
-
| `ECONNREFUSED ...:5432` | Postgres not up yet | Re-run step 4; wait for `healthy` |
|
|
96
|
-
| {…} | … | … |
|
|
97
|
-
|
|
98
|
-
## Teardown
|
|
99
|
-
|
|
100
|
-
```bash
|
|
101
|
-
{e.g. `docker compose down -v`}
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
Removes {what — "containers and the local volume; your `.env` is left intact"}.
|
|
105
|
-
|
|
106
|
-
## Next steps
|
|
107
|
-
|
|
108
|
-
- {Where to go now — "Run the test suite: `npm test`"}
|
|
109
|
-
- {Link to the design walkthrough or API reference for this project, if one exists}
|