skilldrop-cli 0.16.6 → 0.16.7
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 -1
- package/catalogue.json +10 -1
- package/model-routing.json +12 -0
- 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/2/data-handling-sheet.md +18 -0
- package/packs/ai-engineering/skills/ai-usage-policy/evals/files/2/it-notes.md +31 -0
- package/packs/ai-engineering/skills/ai-usage-policy/evals/files/2/md-email.md +29 -0
- package/packs/api-builder/skills/tool-use-schema-writer/evals/evals.json +29 -0
- package/packs/api-builder/skills/tool-use-schema-writer/evals/files/2/book_appointment.ts +64 -0
- package/packs/career/loops/apply/LOOP.md +88 -0
- package/packs/career/loops/apply/evals/eval_queries.json +9 -0
- package/packs/career/loops/apply/evals/evals.json +27 -0
- package/packs/career/loops/apply/loop.json +46 -0
- package/packs/career/pack.json +57 -0
- package/packs/career/skills/cover-letter/SKILL.md +132 -0
- package/packs/career/skills/cover-letter/evals/eval_queries.json +34 -0
- package/packs/career/skills/cover-letter/evals/evals.json +100 -0
- package/packs/career/skills/cover-letter/evals/files/1/posting.md +28 -0
- package/packs/career/skills/cover-letter/evals/files/1/resume.md +35 -0
- package/packs/career/skills/cover-letter/evals/files/2/posting.md +20 -0
- package/packs/career/skills/cover-letter/evals/files/2/resume.md +32 -0
- package/packs/career/skills/cover-letter/evals/files/4/posting.md +19 -0
- package/packs/career/skills/cover-letter/evals/files/4/resume.md +26 -0
- package/packs/career/skills/cover-letter/evals/files/5/posting.md +21 -0
- package/packs/career/skills/cover-letter/evals/files/5/resume.md +32 -0
- package/packs/career/skills/cover-letter/evals/files/6/posting.md +25 -0
- package/packs/career/skills/cover-letter/evals/files/6/resume.md +29 -0
- package/packs/career/skills/cover-letter/evals/files/7/posting.md +18 -0
- package/packs/career/skills/cover-letter/evals/files/7/resume.md +23 -0
- package/packs/career/skills/cover-letter/manifest.json +37 -0
- package/packs/career/skills/cover-letter/scripts/claim_check.py +247 -0
- package/packs/career/skills/job-fit-analysis/SKILL.md +136 -0
- package/packs/career/skills/job-fit-analysis/evals/eval_queries.json +34 -0
- package/packs/career/skills/job-fit-analysis/evals/evals.json +76 -0
- package/packs/career/skills/job-fit-analysis/evals/files/1/posting.md +28 -0
- package/packs/career/skills/job-fit-analysis/evals/files/1/resume.md +35 -0
- package/packs/career/skills/job-fit-analysis/evals/files/2/posting.md +20 -0
- package/packs/career/skills/job-fit-analysis/evals/files/2/resume.md +32 -0
- package/packs/career/skills/job-fit-analysis/evals/files/4/posting.md +25 -0
- package/packs/career/skills/job-fit-analysis/evals/files/4/resume.md +29 -0
- package/packs/career/skills/job-fit-analysis/evals/files/5/posting.md +18 -0
- package/packs/career/skills/job-fit-analysis/evals/files/5/resume.md +23 -0
- package/packs/career/skills/job-fit-analysis/manifest.json +31 -0
- package/packs/career/skills/resume-tailor/SKILL.md +116 -0
- package/packs/career/skills/resume-tailor/evals/eval_queries.json +34 -0
- package/packs/career/skills/resume-tailor/evals/evals.json +105 -0
- package/packs/career/skills/resume-tailor/evals/files/1/posting.md +26 -0
- package/packs/career/skills/resume-tailor/evals/files/1/resume.md +32 -0
- package/packs/career/skills/resume-tailor/evals/files/2/posting.md +19 -0
- package/packs/career/skills/resume-tailor/evals/files/2/resume.md +26 -0
- package/packs/career/skills/resume-tailor/evals/files/3/posting.md +21 -0
- package/packs/career/skills/resume-tailor/evals/files/3/resume.md +32 -0
- package/packs/career/skills/resume-tailor/evals/files/4/posting.md +28 -0
- package/packs/career/skills/resume-tailor/evals/files/4/resume.md +35 -0
- package/packs/career/skills/resume-tailor/evals/files/5/posting.md +20 -0
- package/packs/career/skills/resume-tailor/evals/files/5/resume.md +32 -0
- package/packs/career/skills/resume-tailor/evals/files/6/posting.md +25 -0
- package/packs/career/skills/resume-tailor/evals/files/6/resume.md +29 -0
- package/packs/career/skills/resume-tailor/evals/files/7/posting.md +18 -0
- package/packs/career/skills/resume-tailor/evals/files/7/resume.md +23 -0
- package/packs/career/skills/resume-tailor/manifest.json +37 -0
- package/packs/career/skills/resume-tailor/scripts/claim_check.py +247 -0
- package/packs/data-analytics/skills/metric-definition/evals/evals.json +30 -0
- package/packs/data-analytics/skills/metric-definition/evals/files/2/tables.md +42 -0
- package/packs/data-analytics/skills/metric-definition/evals/files/2/thread.md +40 -0
- package/packs/dev-team/skills/contribution-wizard/evals/evals.json +29 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/AGENTS.md +9 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/CATALOG.md +18 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/CONTRIBUTING.md +45 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/OWNERS.md +7 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/detention-claim-letter/INSTRUCTIONS.md +20 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/detention-claim-letter/skill.yaml +11 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/detention-claim-letter/tests/cases.yaml +25 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/rate-con-extractor/INSTRUCTIONS.md +20 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/rate-con-extractor/skill.yaml +8 -0
- package/packs/dev-team/skills/contribution-wizard/evals/files/2/skills/rate-con-extractor/tests/cases.yaml +32 -0
- package/packs/dev-team/skills/devils-advocate/evals/evals.json +29 -0
- package/packs/dev-team/skills/devils-advocate/evals/files/2/signups.py +116 -0
- package/packs/dev-team/skills/devils-advocate/evals/files/2/test_signups.py +69 -0
- package/packs/dev-team/skills/release-notes/evals/evals.json +29 -0
- package/packs/dev-team/skills/release-notes/evals/files/2/commits.txt +35 -0
- package/packs/research/skills/source-synthesis/evals/evals.json +30 -0
- package/packs/research/skills/source-synthesis/evals/files/2/badge-data.md +27 -0
- package/packs/research/skills/source-synthesis/evals/files/2/director-email.md +16 -0
- package/packs/research/skills/source-synthesis/evals/files/2/exit-interviews.md +17 -0
- package/packs/research/skills/source-synthesis/evals/files/2/practice-weekly-article.md +21 -0
- package/packs/research/skills/source-synthesis/evals/files/2/staff-survey-summary.md +41 -0
- package/packs/solution-architect/skills/db-schema-design/evals/evals.json +29 -0
- package/packs/solution-architect/skills/db-schema-design/evals/files/2/current_tables.sql +29 -0
- package/packs/solution-architect/skills/db-schema-design/evals/files/2/notes.md +53 -0
- package/packs/solution-architect/skills/design-doc/evals/evals.json +29 -0
- package/packs/solution-architect/skills/design-doc/evals/files/2/brief.md +18 -0
- package/packs/solution-architect/skills/design-doc/evals/files/2/eng-notes.md +30 -0
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/evals.json +29 -0
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/files/2/requirements.md +20 -0
- package/packs/solution-architect/skills/tech-comparison-matrix/evals/files/2/vendor-notes.md +29 -0
- package/packs/sre-oncall/skills/postmortem-generator/evals/evals.json +30 -0
- package/packs/sre-oncall/skills/postmortem-generator/evals/files/2/pager-export.txt +22 -0
- package/packs/sre-oncall/skills/postmortem-generator/evals/files/2/slack-thread.txt +28 -0
- package/packs/stakeholder-comms/skills/guide-builder/evals/evals.json +29 -0
- package/packs/stakeholder-comms/skills/guide-builder/evals/files/2/api-notes.md +44 -0
- package/packs/stakeholder-comms/skills/guide-builder/evals/files/2/sample-booking.json +19 -0
- package/profiles.json +2 -2
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Pawsley Vets: booking rebuild, working notes
|
|
2
|
+
|
|
3
|
+
Written by Imogen Tarrant (practice systems lead), last touched 22 Sept 2026.
|
|
4
|
+
|
|
5
|
+
## Who we are
|
|
6
|
+
|
|
7
|
+
- 6 clinics. Four around Sydney (Marrickville, Newtown, Manly, Parramatta) and two in
|
|
8
|
+
Brisbane (Paddington, West End).
|
|
9
|
+
- About 38 vets. Seven of them work at two clinics on different days of the week.
|
|
10
|
+
- Roughly 450 appointments a day across the group.
|
|
11
|
+
- About 21,000 active pets belonging to about 15,000 owners. An owner can have several pets.
|
|
12
|
+
|
|
13
|
+
## Appointment types
|
|
14
|
+
|
|
15
|
+
| Type | Length |
|
|
16
|
+
|---|---|
|
|
17
|
+
| Consult | 15 min |
|
|
18
|
+
| Vaccination | 15 min |
|
|
19
|
+
| Extended consult | 30 min |
|
|
20
|
+
| Surgery consult | 60 min |
|
|
21
|
+
|
|
22
|
+
Lengths will probably change (we are talking about 20-minute consults). Each type has a price,
|
|
23
|
+
and the price is different at each clinic.
|
|
24
|
+
|
|
25
|
+
## What the new system has to do
|
|
26
|
+
|
|
27
|
+
1. **A vet's day.** Reception pulls up every appointment for one vet on one date, in time
|
|
28
|
+
order. This is the screen that is open all day at every front desk and refreshes every few
|
|
29
|
+
seconds. It has to feel instant.
|
|
30
|
+
2. **A clinic's day.** Same thing but for every vet working at one clinic that day.
|
|
31
|
+
3. **Owner portal.** An owner logs in and sees the upcoming appointments for all of their pets.
|
|
32
|
+
4. **Free slots.** Given a vet (or a clinic) and a date, what times are still open.
|
|
33
|
+
5. **Monthly report.** No-show rate per clinic per month. The directors ask for this every
|
|
34
|
+
month and today somebody counts it by hand from the paper diary.
|
|
35
|
+
6. **No double-booking a vet. Ever.** It happened 11 times last quarter. The current app checks
|
|
36
|
+
whether the slot is free and then inserts, and two receptionists at different desks can both
|
|
37
|
+
get through. If an appointment is cancelled, that time has to become bookable again.
|
|
38
|
+
|
|
39
|
+
## Stack
|
|
40
|
+
|
|
41
|
+
Database: Postgres 15 on the managed service (that is what the hosting invoice says).
|
|
42
|
+
|
|
43
|
+
Pasted from Devraj (contractor who maintains the current app), 18 Sept:
|
|
44
|
+
|
|
45
|
+
> the current booking app is on MySQL 8, has been since 2021. I'd just keep it there tbh,
|
|
46
|
+
> no reason to move
|
|
47
|
+
|
|
48
|
+
I have not chased up which of those is right.
|
|
49
|
+
|
|
50
|
+
## Other
|
|
51
|
+
|
|
52
|
+
- The existing tables are in current_tables.sql. I know they are not great.
|
|
53
|
+
- Not in scope for this piece of work: invoicing and payments, stock, clinical records.
|
|
@@ -12,6 +12,35 @@
|
|
|
12
12
|
"The rollout section names stages and what would halt it",
|
|
13
13
|
"Facts not supplied by the user are marked as open questions rather than invented"
|
|
14
14
|
]
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": 2,
|
|
18
|
+
"held_out": "2026-10-05",
|
|
19
|
+
"prompt": "Can you write the design doc for offline mode in the inspector app? Product's brief is brief.md and Halvard's notes from our eng discussion are eng-notes.md. It goes to design review on Thursday so it needs to stand on its own. Please include how much storage it needs per device too.",
|
|
20
|
+
"assertions": [
|
|
21
|
+
"It flags that the timeline does not work as written: 14 weeks from a 14 Dec 2026 start ends around 22 March 2027, after the 1 March 2027 Calder County deadline, and it proposes a way through or raises it as a decision",
|
|
22
|
+
"The size of the problem is given as 1,120 of 8,400 inspections (about 13%) with sync or save errors, or the brief's 'around 40%' is called out as unsupported by the logged numbers",
|
|
23
|
+
"It does not apply plain last-write-wins to signed inspections; it surfaces the conflict between the brief and the compliance rule that a signed inspection must never be overwritten",
|
|
24
|
+
"The server-side sync endpoint is shown as depending on the Platform team with no owner confirmed and nobody yet asked",
|
|
25
|
+
"Per-device storage need is stated as not yet measured, with no invented figure, and measuring it is listed as a to-do or open question",
|
|
26
|
+
"At least two of the alternatives from the notes (outbox queue, CRDT library, PDF re-keying) are described with the reason each was not chosen as the main approach",
|
|
27
|
+
"The rollout starts with the 12 Calder County volunteers and gives at least one concrete, checkable condition for widening or stopping it",
|
|
28
|
+
"It does not invent crash rates, backend load figures, costs or device counts that are not in the two files"
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": 3,
|
|
33
|
+
"held_out": "2026-10-05",
|
|
34
|
+
"prompt": "need a one-pager design doc by end of day for moving our cron jobs off the old box. there's like 30ish of them on a single ec2 instance (cron-01), some of them nobody knows what they do anymore. thinking either k8s cronjobs since we already have a cluster, or some managed scheduler. Jonas wants it done before the OS on that instance goes end of life but I don't remember the date. 4 of us on the team.",
|
|
35
|
+
"assertions": [
|
|
36
|
+
"It delivers a design doc in the reply rather than only asking questions",
|
|
37
|
+
"The OS end-of-life date is recorded as unknown and to be confirmed; no specific date is invented",
|
|
38
|
+
"The jobs nobody understands are dealt with explicitly, through an inventory or audit step or a named risk with a mitigation, not assumed to be understood",
|
|
39
|
+
"Both Kubernetes CronJobs and a managed scheduler are described, with a reason for preferring one or a statement of what would decide it",
|
|
40
|
+
"The job count stays approximate ('about 30'); it does not invent an exact count, job names, schedules or failure rates",
|
|
41
|
+
"It says how a migrated job is checked before its old cron entry is removed, and how to go back if it misbehaves",
|
|
42
|
+
"It is about one page: roughly 700 words or fewer"
|
|
43
|
+
]
|
|
15
44
|
}
|
|
16
45
|
]
|
|
17
46
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Brief: offline mode for the Stonecrop inspector app
|
|
2
|
+
|
|
3
|
+
From: Marguerite Adeyemi (Product), 28 Sept 2026
|
|
4
|
+
|
|
5
|
+
## Why
|
|
6
|
+
Inspectors lose work when they're in basements, plant rooms and rural sites with no signal. It's our number one support complaint. Around 40% of inspections are done with no signal, so this affects nearly half of what we do.
|
|
7
|
+
|
|
8
|
+
## What I want
|
|
9
|
+
- An inspector can open, fill in, photograph and sign an inspection with no connection, and it syncs by itself when they're back online.
|
|
10
|
+
- Works for at least 72 hours offline (covers a long weekend on a remote site).
|
|
11
|
+
- If two people edited the same inspection, last write wins. Keep it simple.
|
|
12
|
+
- Android tablets first. iOS can follow.
|
|
13
|
+
|
|
14
|
+
## Deadline
|
|
15
|
+
Calder County's contract renewal is 1 March 2027 and they've said offline is a condition. It has to be live for them before that date.
|
|
16
|
+
|
|
17
|
+
## Team
|
|
18
|
+
Two mobile engineers (Ines and Kwabena) once they're free.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Eng notes: offline mode discussion, 1 Oct 2026
|
|
2
|
+
|
|
3
|
+
Present: Ines Moreau, Kwabena Asante, Halvard Nystrom (eng lead). Notes: Halvard.
|
|
4
|
+
|
|
5
|
+
## Numbers we pulled
|
|
6
|
+
- Last quarter (Jul-Sep 2026): 8,400 inspections submitted. 1,120 of them had at least one failed save or sync error logged. We don't log "no signal" directly; this is the closest proxy we have.
|
|
7
|
+
- 310 active inspectors. 64 of them are Calder County.
|
|
8
|
+
- Support tickets tagged "lost work" last quarter: 187.
|
|
9
|
+
- Device split: 71% Android tablets, 29% iPads.
|
|
10
|
+
|
|
11
|
+
## Approaches we talked through
|
|
12
|
+
1. Outbox queue. Keep the app as it is, but writes go to a local queue and replay when online. Smallest change. Doesn't let you open an inspection you haven't already loaded.
|
|
13
|
+
2. Local-first replica. Sync each inspector's assigned inspections to an on-device database, work against that, background sync both ways. Covers the full ask. More work, and needs a conflict policy.
|
|
14
|
+
3. CRDT-based sync library. Handles merges automatically. None of us has shipped one, and the library we looked at has no Kotlin bindings.
|
|
15
|
+
4. Export to a PDF form and re-key later. Support suggested it. Nobody likes it; re-keying is where errors come from.
|
|
16
|
+
|
|
17
|
+
Leaning towards 2.
|
|
18
|
+
|
|
19
|
+
## Estimate
|
|
20
|
+
- Option 2: 14 weeks for Ines + Kwabena, Android only. Option 1 alone would be about 5 weeks.
|
|
21
|
+
- They can't start until the auth migration finishes, currently planned for 14 Dec 2026.
|
|
22
|
+
- Needs a new server-side sync endpoint (delta pull + batched push). That's in Platform's codebase. Nobody from Platform was in this meeting and nobody has been asked yet.
|
|
23
|
+
|
|
24
|
+
## Things that worry us
|
|
25
|
+
- Compliance (Roisin, by email 30 Sept): "A signed inspection is a legal record. Once signed it must never be modified or overwritten, by anyone, including by sync. Countersigning by a supervisor is added as a separate record." Supervisors do open the same inspection as the inspector, usually the same day.
|
|
26
|
+
- Photos are the bulk of the data. We haven't measured how much space 72 hours of inspections takes on a tablet.
|
|
27
|
+
- No idea yet what the sync endpoint does to backend load.
|
|
28
|
+
|
|
29
|
+
## Pilot idea
|
|
30
|
+
Start with 12 Calder County inspectors who volunteered, then the rest of Calder, then everyone.
|
|
@@ -13,6 +13,35 @@
|
|
|
13
13
|
"The recommendation is one sentence and says what would change the answer; if it isn't the top scorer, the override is explained",
|
|
14
14
|
"Numbers that are estimates are marked 'rough' or 'directional'; no benchmarks are invented beyond the figures in the prompt"
|
|
15
15
|
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"held_out": "2026-10-05",
|
|
20
|
+
"prompt": "We have to pick an observability platform by 16 Oct. requirements.md is what we need and vendor-notes.md is what Davide gathered on the three options. Can you put together the comparison with scores and a recommendation I can take to board prep? Please score query speed using the p95 numbers from the trials. For what it's worth most of the team wants Graywell.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Graywell is shown as failing the EU data residency must-have today (US-East only, EU region only on the roadmap for Q2 2027) and is not the recommended option",
|
|
23
|
+
"It flags that the Lumenstack quote does not add up: EUR 18 x 140 hosts x 12 months is EUR 30,240, not the EUR 25,200 on the quote",
|
|
24
|
+
"It notes that at EUR 30,240 Lumenstack is over the EUR 30,000 budget cap, or that whether it fits depends on getting the quote clarified",
|
|
25
|
+
"Self-hosted is shown as having no measured p95 query time because it was never trialled; no latency number is invented for it",
|
|
26
|
+
"The self-hosted assessment names the staffing risk: the team drops from 3 to 2 at the end of November and the person leaving is the only one who has run Loki in production",
|
|
27
|
+
"It notes that Graywell's EUR 18,480 is not an all-in or firm price: SAML SSO is Enterprise-tier with price on request, or the figure comes from a March sales deck and not a quote",
|
|
28
|
+
"It gives one clear recommendation and says what would change it",
|
|
29
|
+
"It does not introduce benchmarks, prices or vendor features that are not in the two files"
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": 3,
|
|
34
|
+
"held_out": "2026-10-05",
|
|
35
|
+
"prompt": "postgres vs mongo vs just sqlite for a small internal tool? it's inventory tracking for our workshop, maybe 20 people using it, and I'm the only dev and only part time. my boss wants a table he can show the owner so he can see we thought about it",
|
|
36
|
+
"assertions": [
|
|
37
|
+
"All three options (PostgreSQL, MongoDB, SQLite) are compared in one table against the same named criteria, each with a score or rating",
|
|
38
|
+
"The relative importance of the criteria is shown and tied to the facts given (about 20 users, one part-time developer)",
|
|
39
|
+
"Each score or rating has a short reason next to it",
|
|
40
|
+
"It gives one clear recommendation, not 'it depends'",
|
|
41
|
+
"It states the assumptions it had to make and what would change the answer (for example how many people write at the same time, where it is hosted, how backups are handled)",
|
|
42
|
+
"It does not invent benchmark figures, throughput numbers or costs",
|
|
43
|
+
"Large-scale performance, horizontal scaling or community popularity is not among the highest-weighted criteria"
|
|
44
|
+
]
|
|
16
45
|
}
|
|
17
46
|
]
|
|
18
47
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Observability platform: what we need (Pellingham Diagnostics)
|
|
2
|
+
|
|
3
|
+
Written by Anneke Vos (Head of Platform), 21 Sept 2026.
|
|
4
|
+
|
|
5
|
+
We're replacing the home-grown ELK box. Decision needed for the 16 Oct board prep.
|
|
6
|
+
|
|
7
|
+
## Facts
|
|
8
|
+
- 140 hosts today (112 prod, 28 non-prod). Expect about 160 by the end of 2027.
|
|
9
|
+
- Platform team: 3 engineers. One (Bashir) leaves at the end of November and the backfill is not approved.
|
|
10
|
+
- Log volume is about 90 GB/day. We need 30 days searchable.
|
|
11
|
+
|
|
12
|
+
## Must-haves (not negotiable)
|
|
13
|
+
1. All telemetry stored and processed in the EU. Logs contain patient sample IDs. Our DPO has confirmed this is a hard requirement from day one: no exceptions and no "coming soon".
|
|
14
|
+
2. Total cost at or under EUR 30,000 per year, all-in. That is what's in the 2027 budget.
|
|
15
|
+
3. SSO through our existing SAML identity provider.
|
|
16
|
+
|
|
17
|
+
## Nice-to-haves
|
|
18
|
+
- Fast log search. Devs complain the current one takes 20+ seconds.
|
|
19
|
+
- Alert routing into our pager.
|
|
20
|
+
- Not having to babysit it.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Options: notes from trials and quotes
|
|
2
|
+
|
|
3
|
+
Compiled by Davide Marchetti, platform. Last touched 29 Sept 2026.
|
|
4
|
+
|
|
5
|
+
## A. Lumenstack (SaaS)
|
|
6
|
+
- Quote ref LS-Q-7731, dated 22 Sept 2026, valid 30 days.
|
|
7
|
+
- EUR 18 per host per month. Logs, metrics and traces bundled, 30-day retention included.
|
|
8
|
+
- Quote summary line: "140 hosts, 12 months: EUR 25,200".
|
|
9
|
+
- Region: Frankfurt, available now. Signed DPA available.
|
|
10
|
+
- SAML SSO: included.
|
|
11
|
+
- Two-week trial on 20 staging hosts: p95 log query 1.8 s. Pager integration worked out of the box.
|
|
12
|
+
- Setup effort in the trial: about 2 days for one engineer.
|
|
13
|
+
|
|
14
|
+
## B. Graywell (SaaS)
|
|
15
|
+
- Pricing from their sales deck of 3 March 2026: EUR 11 per host per month, 12-month commit. No formal quote yet.
|
|
16
|
+
- 140 hosts x 11 x 12 = EUR 18,480.
|
|
17
|
+
- Region: US-East only today. Sales rep email (18 Sept): "EU region is on the roadmap for Q2 2027."
|
|
18
|
+
- SAML SSO: on the Enterprise tier only, price on request.
|
|
19
|
+
- Two-week trial on 20 staging hosts: p95 log query 0.9 s. Nicest UI by far, devs loved it.
|
|
20
|
+
- Pager integration: via webhook, needed a small script.
|
|
21
|
+
|
|
22
|
+
## C. Self-hosted (Grafana + Loki + Prometheus on our own cluster)
|
|
23
|
+
- No licence cost.
|
|
24
|
+
- Davide's estimate of extra infra: EUR 800/month (storage + 3 nodes), so EUR 9,600/year.
|
|
25
|
+
- Davide's estimate of people time: 0.4 of an engineer ongoing, plus 4-6 weeks to build.
|
|
26
|
+
- Runs in our Amsterdam region, so EU by construction.
|
|
27
|
+
- SAML: supported through our identity provider, needs config.
|
|
28
|
+
- Not trialled. We never stood it up, so there are no query numbers.
|
|
29
|
+
- Bashir is the only one of us who has run Loki in production before.
|
|
@@ -12,6 +12,36 @@
|
|
|
12
12
|
"Contributing factors are listed rather than a single root cause",
|
|
13
13
|
"Action items carry owners as roles and are derived from the contributing factors"
|
|
14
14
|
]
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": 2,
|
|
18
|
+
"held_out": "2026-10-05",
|
|
19
|
+
"prompt": "I need the postmortem for the 17 Sept label printing outage (INC-2291) for Monday's incident review. The pager export is pager-export.txt and I dumped the incident channel into slack-thread.txt. Please include what we owe merchants in SLA credits. It goes to the whole engineering org.",
|
|
20
|
+
"assertions": [
|
|
21
|
+
"The customer-facing outage is given as 94 minutes (07:12 to 08:46 UTC, or 09:12 to 10:46 CEST), not 75 minutes or 2 hours, or those other figures are explicitly reconciled against it",
|
|
22
|
+
"Times from the Slack thread (CEST) and the pager export (UTC) are put on one consistent clock, so the first support ticket (07:20 UTC / 09:20 CEST) appears before the page (07:31 UTC / 09:31 CEST)",
|
|
23
|
+
"It states that the page fired about 19 minutes after errors began and that customer tickets arrived before any alert did",
|
|
24
|
+
"The 06:55 UTC (08:55 CEST) deploy is not given as the cause; the output says the rollback to v411 had no effect and the cause was the expired rates-gateway certificate",
|
|
25
|
+
"No named individual or their team is blamed for the expired certificate; the unowned service, the renewal job failing since 27 Aug and the muted #infra-noise alerts are given as causes instead",
|
|
26
|
+
"Impact uses the measured 18,430 failed of 21,900 label requests and 212 merchant accounts, and the 'roughly 40k shipments' figure is not presented as measured",
|
|
27
|
+
"The SLA credit amount is stated as unknown because the contract terms are not in the material, and no figure is invented",
|
|
28
|
+
"The follow-up to fix the renewal job is shown as having no agreed owner or date, and the output notes the manually issued certificate expires in about 90 days (mid-December 2026)"
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": 3,
|
|
33
|
+
"held_out": "2026-10-05",
|
|
34
|
+
"prompt": "can you write up a postmortem for our backup thing. we're 5 people so nothing fancy but I want it on record. nightly db backup hadn't actually run for about 9 days, we only found out Fri 2 Oct when Lena tried to restore a copy into staging and the newest dump was old. no customer impact as far as we know. what we worked out: disk on the cron host has been full since ~Sep 23, the backup script exits 0 even when the dump fails, and nobody gets alerted on anything from that box. fixed by clearing out /var/log and re-running, good backup as of Fri 14:10.",
|
|
35
|
+
"assertions": [
|
|
36
|
+
"It states there was no known customer impact and does not invent downtime, users affected or data lost",
|
|
37
|
+
"It states the exposure plainly: roughly 9 days (about 23 Sep to 2 Oct) with no valid backup, meaning a database failure in that window would have lost up to that much data",
|
|
38
|
+
"The full disk, the script exiting 0 on failure, and the absence of alerting are given as separate contributing causes, not collapsed into one root cause",
|
|
39
|
+
"It says the problem was found by chance during a staging restore, not by monitoring",
|
|
40
|
+
"It marks as unknown or approximate the exact time backups stopped and what filled the disk, and does not invent a minute-by-minute timeline",
|
|
41
|
+
"Action items cover at least the exit-code behaviour and alerting on backup failure or staleness, each written so someone can check it is done",
|
|
42
|
+
"It does not blame Lena or any individual",
|
|
43
|
+
"It delivers the postmortem in the reply rather than only asking questions"
|
|
44
|
+
]
|
|
15
45
|
}
|
|
16
46
|
]
|
|
17
47
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
PagerTree export. Service: labelgen-prod. Incident INC-2291.
|
|
2
|
+
All timestamps UTC. Exported 2026-09-18 09:02 UTC.
|
|
3
|
+
|
|
4
|
+
2026-09-17 07:31:04 TRIGGERED alert "labelgen 5xx ratio > 25% for 15m" (source: metrics)
|
|
5
|
+
2026-09-17 07:31:05 NOTIFIED primary on-call (push + SMS)
|
|
6
|
+
2026-09-17 07:36:05 NOTIFIED primary on-call (phone call, 2nd attempt)
|
|
7
|
+
2026-09-17 07:38:41 ACKNOWLEDGED by primary on-call
|
|
8
|
+
2026-09-17 07:44:10 NOTE "suspect 06:55 deploy of labelgen v412, rolling back"
|
|
9
|
+
2026-09-17 07:52:27 NOTE "rollback to v411 complete. error rate unchanged."
|
|
10
|
+
2026-09-17 08:03:50 ESCALATED to secondary on-call (platform)
|
|
11
|
+
2026-09-17 08:05:12 ACKNOWLEDGED by secondary on-call
|
|
12
|
+
2026-09-17 08:21:33 NOTE "rates-gateway returning TLS handshake failure. cert expired 2026-09-17 07:11:58Z"
|
|
13
|
+
2026-09-17 08:40:15 NOTE "cert reissued manually, rates-gateway pods restarting"
|
|
14
|
+
2026-09-17 08:46:02 NOTE "5xx back under 1%. monitoring."
|
|
15
|
+
2026-09-17 09:20:00 RESOLVED
|
|
16
|
+
|
|
17
|
+
Metrics snapshot attached to the incident (dashboard "labelgen overview"):
|
|
18
|
+
first minute with 5xx ratio > 5%: 07:12
|
|
19
|
+
last minute with 5xx ratio > 5%: 08:46
|
|
20
|
+
label requests received 07:12-08:46: 21,900
|
|
21
|
+
label requests failed (5xx): 18,430
|
|
22
|
+
merchant accounts with >= 1 failure: 212
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#inc-2291-labels, export for Thursday 17 Sept 2026
|
|
2
|
+
(times as shown in Slack: Amsterdam time, CEST)
|
|
3
|
+
|
|
4
|
+
09:20 Odile Renner (support lead): getting tickets that label printing is failing, 3 merchants in the last few min. anyone looking?
|
|
5
|
+
09:24 Odile Renner: up to 9 tickets now
|
|
6
|
+
09:33 Marek Dvorsky (on-call): just got paged, was on the school run, looking in 5
|
|
7
|
+
09:39 Marek Dvorsky: acked. errors started right after my 8:55 deploy I think. rolling back
|
|
8
|
+
09:53 Marek Dvorsky: rollback done.... still broken. so not the deploy??
|
|
9
|
+
09:55 Tobias Lindqvist (eng manager): Marek's deploy is the only thing that changed this morning, it has to be that. did the rollback actually take?
|
|
10
|
+
09:58 Marek Dvorsky: yes v411 is live on all pods. same errors. "upstream connect error" from rates-gateway
|
|
11
|
+
10:04 Marek Dvorsky: escalating to platform
|
|
12
|
+
10:06 Yusra Haddad (platform): here
|
|
13
|
+
10:22 Yusra Haddad: found it. rates-gateway internal cert expired at 09:11 this morning. cert-manager renewal has been failing since 27 Aug, DNS challenge error after the zone move
|
|
14
|
+
10:23 Tobias Lindqvist: how did nobody see that for 3 weeks
|
|
15
|
+
10:25 Yusra Haddad: renewal failure alerts go to #infra-noise. that channel's been muted by basically everyone since the spring
|
|
16
|
+
10:26 Tobias Lindqvist: so Marek's team forgot to renew a cert. great
|
|
17
|
+
10:27 Yusra Haddad: it's not really anyone's cert. rates-gateway got moved to platform in the June reorg and never got an owner in the service catalog
|
|
18
|
+
10:41 Yusra Haddad: issued a cert by hand, pods restarting
|
|
19
|
+
10:47 Marek Dvorsky: error rate back to normal
|
|
20
|
+
10:52 Odile Renner: 61 tickets total. I'm telling merchants roughly 40k shipments were affected, ok?
|
|
21
|
+
10:55 Tobias Lindqvist: fine. outage was about 75 min for the status page
|
|
22
|
+
11:02 Odile Renner: several merchants are saying 2 hours on their side fwiw
|
|
23
|
+
11:20 Marek Dvorsky: resolving the page
|
|
24
|
+
11:31 Yusra Haddad: follow ups: (1) I'll move cert renewal failures out of #infra-noise into the platform pager by Fri 25 Sept (2) someone needs to fix the renewal job itself, the DNS challenge is still broken and the manual cert is only good for 90 days (3) rates-gateway needs an owner in the catalog
|
|
25
|
+
11:34 Tobias Lindqvist: (4) labelgen should fall back to cached rates when the gateway is down. Marek can you scope that
|
|
26
|
+
11:35 Marek Dvorsky: will scope it, no date yet
|
|
27
|
+
11:40 Odile Renner: finance asked what we owe in SLA credits. I don't have the contract terms, does anyone?
|
|
28
|
+
11:41 Tobias Lindqvist: no idea. ask legal
|
|
@@ -13,6 +13,35 @@
|
|
|
13
13
|
"No forward references that break top-to-bottom reading",
|
|
14
14
|
"Missing facts (e.g. the repo URL host or how to get a Stripe test key) are flagged as NEEDS INPUT rather than invented"
|
|
15
15
|
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"held_out": "2026-10-05",
|
|
20
|
+
"prompt": "Mirela dumped her notes on our partner API in api-notes.md and there's a sample response in sample-booking.json. Can you turn that into proper reference docs we can send to the partner devs who are integrating with us? Make sure the cancellation webhook is covered too, a couple of partners have asked about it.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"The rate limit is given as 60 requests per minute per key, following the changelog entry, and 120 is not presented as the current limit",
|
|
23
|
+
"It flags that the notes say money is integer cents in fields ending _cents while the sample response has decimal strings in unit_price and total, and does not silently document only one of them",
|
|
24
|
+
"It does not name the API key header (for example X-API-Key or Authorization: Bearer) as fact, and says the header name is not in the notes",
|
|
25
|
+
"It says the notes describe no cancellation webhook, only booking.confirmed, and does not document a cancellation event or payload",
|
|
26
|
+
"POST /bookings documents the required Idempotency-Key header and that reusing a key within 24 hours returns the original booking",
|
|
27
|
+
"The error responses in the notes are documented with their bodies: 409 slot_full with available, 422 validation_error, 429 with Retry-After, and 409 cancellation_window_closed",
|
|
28
|
+
"The POST /bookings body lists each field as required or optional, including quantity 1 to 8 and partner_ref up to 64 characters",
|
|
29
|
+
"The webhook section states the HMAC-SHA256 signature over the raw body in X-Tidewater-Signature and the 5 retries over about an hour"
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": 3,
|
|
34
|
+
"held_out": "2026-10-05",
|
|
35
|
+
"prompt": "can you write up how our nightly export works for the new analyst starting monday? roughly: cron on the reporting box kicks off export.py at 2am, it pulls yesterday's orders from the replica, writes a csv to the sftp drop, and finance's tool picks it up at like 6. if it fails Theo gets an email. there's a retry thing in there somewhere but i honestly don't remember how it works",
|
|
36
|
+
"assertions": [
|
|
37
|
+
"It delivers a written explanation of the export for the analyst, and does not stop at questions",
|
|
38
|
+
"It describes the flow in order: cron at 2am runs export.py, which reads yesterday's orders from the replica, writes a CSV to the SFTP drop, and finance's tool collects it",
|
|
39
|
+
"It says how the retry works is not known and needs confirming, and does not state a retry count, delay or backoff",
|
|
40
|
+
"It does not invent hostnames, file paths, an SFTP directory, table names, CSV columns or a CSV filename",
|
|
41
|
+
"It says Theo is emailed when the export fails, and does not add an email address, a surname or other contacts",
|
|
42
|
+
"The finance pickup is given as around 6, not as an exact confirmed time",
|
|
43
|
+
"It includes no commands for running, restarting or debugging the export, since none were supplied"
|
|
44
|
+
]
|
|
16
45
|
}
|
|
17
46
|
]
|
|
18
47
|
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# partner API notes (Mirela — for whoever writes the real docs)
|
|
2
|
+
|
|
3
|
+
base url: https://api.tidewater-rentals.example/v2
|
|
4
|
+
auth: api key in a header, one key per partner. keys come from partner support (partners@tidewater-rentals.example)
|
|
5
|
+
all times are UTC, ISO 8601. money is integer cents, field names end in _cents.
|
|
6
|
+
rate limit: 120 req/min per key. over that -> 429 with a Retry-After header (seconds).
|
|
7
|
+
|
|
8
|
+
## GET /locations
|
|
9
|
+
list of rental locations. no params.
|
|
10
|
+
returns array of { id (string, "loc_..."), name (string), timezone (string, IANA name) }
|
|
11
|
+
|
|
12
|
+
## GET /slots
|
|
13
|
+
query params:
|
|
14
|
+
- location_id — required
|
|
15
|
+
- date — required, YYYY-MM-DD, in the location's local timezone
|
|
16
|
+
- item_type — optional, one of kayak | paddleboard | canoe. leave it off to get all three
|
|
17
|
+
returns array of { slot_id (string), starts_at, ends_at, item_type, available (int, how many are left) }
|
|
18
|
+
only the next 30 days are bookable. a date further out -> 422.
|
|
19
|
+
|
|
20
|
+
## POST /bookings
|
|
21
|
+
needs an Idempotency-Key header (any uuid). same key again within 24h returns the original booking, it does not make a second one.
|
|
22
|
+
body:
|
|
23
|
+
- slot_id — required
|
|
24
|
+
- quantity — required, 1 to 8
|
|
25
|
+
- customer — required object: name (required), email (required), phone (optional)
|
|
26
|
+
- partner_ref — optional, string, max 64 chars, the partner's own order id. we echo it back.
|
|
27
|
+
responses:
|
|
28
|
+
- 201 -> the booking object, see sample-booking.json. status starts as pending_payment.
|
|
29
|
+
- 409 slot_full -> not enough left in the slot. body { "error": "slot_full", "available": <int> }
|
|
30
|
+
- 422 validation_error -> body { "error": "validation_error", "fields": { "<field>": "<reason>" } }
|
|
31
|
+
|
|
32
|
+
## DELETE /bookings/{id}
|
|
33
|
+
cancels a booking. 204, no body.
|
|
34
|
+
free up to 48h before starts_at. after that -> 409, body { "error": "cancellation_window_closed" }
|
|
35
|
+
|
|
36
|
+
## webhook
|
|
37
|
+
we POST a booking.confirmed event to the partner's url once payment clears (usually seconds, can be a few minutes).
|
|
38
|
+
payload: { event, booking_id, partner_ref, occurred_at }
|
|
39
|
+
signed: HMAC-SHA256 of the raw request body, hex, in the X-Tidewater-Signature header. the secret is per partner.
|
|
40
|
+
retries: 5 attempts over about an hour, then we stop.
|
|
41
|
+
|
|
42
|
+
## changelog
|
|
43
|
+
- 2026-08-11 rate limit dropped to 60/min per key after the August incident. (haven't fixed the top of this doc yet)
|
|
44
|
+
- 2026-05-02 added partner_ref to POST /bookings and to the webhook payload
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "bkg_7Hq2Lm",
|
|
3
|
+
"status": "pending_payment",
|
|
4
|
+
"slot_id": "slt_44190",
|
|
5
|
+
"item_type": "kayak",
|
|
6
|
+
"quantity": 2,
|
|
7
|
+
"unit_price": "32.00",
|
|
8
|
+
"total": "64.00",
|
|
9
|
+
"currency": "USD",
|
|
10
|
+
"customer": {
|
|
11
|
+
"name": "Odalys Brennan",
|
|
12
|
+
"email": "odalys.brennan@example.com",
|
|
13
|
+
"phone": null
|
|
14
|
+
},
|
|
15
|
+
"partner_ref": "ORD-10492",
|
|
16
|
+
"starts_at": "2026-11-14T15:00:00Z",
|
|
17
|
+
"ends_at": "2026-11-14T17:00:00Z",
|
|
18
|
+
"created_at": "2026-11-02T09:41:07Z"
|
|
19
|
+
}
|
package/profiles.json
CHANGED
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
},
|
|
17
17
|
"full": {
|
|
18
18
|
"description": "The complete catalogue: every pack, every reviewer agent, every loop.",
|
|
19
|
-
"packs": ["core", "solution-architect", "product-manager", "dev-team", "sre-oncall", "stakeholder-comms", "design", "ai-engineering", "api-builder", "converters", "experience-design", "research", "trackers", "data-analytics", "grc", "infra-as-code", "skill-engineering"],
|
|
19
|
+
"packs": ["core", "solution-architect", "product-manager", "dev-team", "sre-oncall", "stakeholder-comms", "design", "ai-engineering", "api-builder", "converters", "experience-design", "research", "trackers", "data-analytics", "grc", "infra-as-code", "skill-engineering", "career"],
|
|
20
20
|
"agents": ["devils-advocate", "security-reviewer", "code-quality"],
|
|
21
|
-
"loops": ["discover", "design", "build", "release", "operate", "ship-a-draft"]
|
|
21
|
+
"loops": ["discover", "design", "build", "release", "operate", "ship-a-draft", "apply"]
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
}
|