skilldrop-cli 1.4.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -7
- package/bin/skilldrop.js +15 -10
- package/catalogue.json +13 -2
- package/contracts/catalogue.schema.json +2 -1
- package/model-routing.json +12 -8
- package/package.json +1 -1
- package/packs/ai-engineering/skills/judge-audit/SKILL.md +28 -11
- package/packs/ai-engineering/skills/judge-audit/evals/evals.json +30 -0
- package/packs/ai-engineering/skills/judge-audit/evals/files/12/judge_runs.csv +241 -0
- package/packs/ai-engineering/skills/judge-audit/evals/files/12/rosa_labels.csv +33 -0
- package/packs/ai-engineering/skills/judge-audit/evals/files/13/moderation_eval.csv +601 -0
- package/packs/ai-engineering/skills/judge-audit/manifest.json +2 -2
- package/packs/ai-engineering/skills/mcp-pairing/manifest.json +1 -1
- package/packs/ai-engineering/skills/mcp-pairing/reference.md +4 -3
- package/packs/ai-engineering/skills/subagent-design/SKILL.md +1 -0
- package/packs/ai-engineering/skills/subagent-design/examples/help-center-localization.md +146 -0
- package/packs/ai-engineering/skills/subagent-design/manifest.json +2 -2
- package/packs/api-builder/skills/prompt-caching-advisor/SKILL.md +4 -0
- package/packs/api-builder/skills/prompt-caching-advisor/examples/support-bot-block-order.md +120 -0
- package/packs/api-builder/skills/prompt-caching-advisor/manifest.json +2 -2
- package/packs/civil-architect/pack.json +60 -0
- package/packs/civil-architect/skills/floor-plan-layout/SKILL.md +103 -0
- package/packs/civil-architect/skills/floor-plan-layout/evals/eval_queries.json +30 -0
- package/packs/civil-architect/skills/floor-plan-layout/evals/evals.json +57 -0
- package/packs/civil-architect/skills/floor-plan-layout/evals/files/4/adu-programme.md +12 -0
- package/packs/civil-architect/skills/floor-plan-layout/examples/ground-floor.md +65 -0
- package/packs/civil-architect/skills/floor-plan-layout/examples/ground-floor.svg +135 -0
- package/packs/civil-architect/skills/floor-plan-layout/manifest.json +34 -0
- package/packs/civil-architect/skills/floor-plan-layout/scripts/plan_check.py +449 -0
- package/packs/civil-architect/skills/floor-plan-layout/templates/plan.json +38 -0
- package/packs/dev-team/loops/release/LOOP.md +4 -4
- package/packs/dev-team/loops/release/loop.json +1 -1
- package/packs/dev-team/skills/bug-triage/SKILL.md +1 -0
- package/packs/dev-team/skills/bug-triage/examples/export-row-limit-escalation.md +126 -0
- package/packs/dev-team/skills/bug-triage/manifest.json +2 -2
- package/packs/product-manager/skills/prd-draft/SKILL.md +1 -0
- package/packs/product-manager/skills/prd-draft/examples/approver-delay-not-slack.md +142 -0
- package/packs/product-manager/skills/prd-draft/manifest.json +2 -2
- package/profiles.json +1 -1
- package/packs/ai-engineering/loops/adopt/LOOP.md +0 -120
- package/packs/ai-engineering/loops/adopt/evals/eval_queries.json +0 -10
- package/packs/ai-engineering/loops/adopt/evals/evals.json +0 -69
- package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/ai-ideas.md +0 -15
- package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/org-context.md +0 -27
- package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/staff-survey.csv +0 -11
- package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/ai-ideas.md +0 -13
- package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/firm-context.md +0 -23
- package/packs/ai-engineering/loops/adopt/loop.json +0 -53
- package/packs/career/loops/apply/LOOP.md +0 -97
- package/packs/career/loops/apply/evals/eval_queries.json +0 -9
- package/packs/career/loops/apply/evals/evals.json +0 -55
- package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/application-form.md +0 -10
- package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/job-posting.md +0 -33
- package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/resume.md +0 -34
- package/packs/career/loops/apply/evals/files/apply-fit-gate-hard-requirement/cv.md +0 -27
- package/packs/career/loops/apply/evals/files/apply-fit-gate-hard-requirement/warehouse-supervisor.md +0 -30
- package/packs/career/loops/apply/loop.json +0 -52
- package/packs/product-manager/loops/discover/LOOP.md +0 -82
- package/packs/product-manager/loops/discover/evals/eval_queries.json +0 -30
- package/packs/product-manager/loops/discover/evals/evals.json +0 -54
- package/packs/product-manager/loops/discover/evals/files/discover-no-show-signal/interview-notes.md +0 -63
- package/packs/product-manager/loops/discover/evals/files/discover-no-show-signal/support-tickets.csv +0 -13
- package/packs/product-manager/loops/discover/evals/files/discover-vp-loyalty-no-evidence/vp-message.txt +0 -13
- package/packs/product-manager/loops/discover/loop.json +0 -41
- package/packs/sre-oncall/loops/operate/LOOP.md +0 -84
- package/packs/sre-oncall/loops/operate/evals/eval_queries.json +0 -30
- package/packs/sre-oncall/loops/operate/evals/evals.json +0 -53
- package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/alerts.log +0 -22
- package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/incident-chat.txt +0 -27
- package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/service-notes.md +0 -46
- package/packs/sre-oncall/loops/operate/evals/files/operate-incident-still-open/oncall-log.txt +0 -17
- package/packs/sre-oncall/loops/operate/evals/files/operate-incident-still-open/runbook-webhooks.md +0 -38
- package/packs/sre-oncall/loops/operate/loop.json +0 -41
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"loop_name": "discover",
|
|
3
|
-
"evals": [
|
|
4
|
-
{
|
|
5
|
-
"id": "refuses-to-specify-on-a-thin-brief",
|
|
6
|
-
"prompt": "Run the discover loop. An account manager says enterprise customers keep hitting our API limits and are complaining.",
|
|
7
|
-
"assertions": [
|
|
8
|
-
"Starts at `gather` with requirements-interview, because the signal arrived as a conversation rather than a journey or a strategy question",
|
|
9
|
-
"Does not run all three gather skills on the same input",
|
|
10
|
-
"Tags every brief field [explicit] / [implied] / [inferred] / [missing] with its source",
|
|
11
|
-
"Marks the threshold and the affected-customer count as [missing] rather than inventing plausible numbers",
|
|
12
|
-
"Refuses to complete `specify` until the [missing] anchors are resolved, and says which ones block it",
|
|
13
|
-
"Does not self-ratify G0 — it names ratification as a human decision"
|
|
14
|
-
]
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
"id": "reconsider-leaves-the-loop",
|
|
18
|
-
"prompt": "We ran discover and the stakeholder now says they actually want burst capacity, not a higher ceiling.",
|
|
19
|
-
"assertions": [
|
|
20
|
-
"Classifies this as RECONSIDER, a redirect-class verdict",
|
|
21
|
-
"States that a redirect leaves the loop rather than revising within it",
|
|
22
|
-
"Does not route back to `structure` for another brief on the original problem"
|
|
23
|
-
]
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
"id": "discover-no-show-signal",
|
|
27
|
-
"held_out": "2026-11-04",
|
|
28
|
-
"prompt": "Our head of product wants SMS appointment reminders in Chairside because clinics keep complaining about no-shows. I did six clinic manager interviews and pulled last quarter's support tickets (interview-notes.md, support-tickets.csv). Can you take this through to a requirement the team can sign off on? I'm taking it to product review on Thursday.",
|
|
29
|
-
"assertions": [
|
|
30
|
-
"Synthesises the interviews and tickets into themes before writing the brief and the PRD, and the PRD's problem statement traces back to those themes rather than starting from the head of product's SMS request",
|
|
31
|
-
"Counts themes by distinct clinic or account, not by mentions: Riverside Smiles (CL-1107) filing four rescheduling tickets is counted as one account, and the interviews split four clinics (B, C, E, F) for not being able to move an appointment against two (A, D) for forgetting",
|
|
32
|
-
"Concludes that the evidence points more at patients being unable to reschedule outside phone hours than at forgetting, and cites Harbourside (clinic C), which already sends SMS reminders and still gets no-shows, instead of treating SMS reminders as the settled solution",
|
|
33
|
-
"The PRD's problem statement contains no solution language, and the PRD has testable requirements and explicit non-goals",
|
|
34
|
-
"Runs a critique of the drafted PRD before handing it over, and either fixes each finding or lists it as open",
|
|
35
|
-
"Stops at a human ratification gate: presents the PRD as awaiting sign-off at Thursday's review, does not call it ratified or approved itself, and does not go on to a design doc or architecture",
|
|
36
|
-
"Does not invent figures that are not in the input, such as a no-show rate, revenue lost to no-shows, or a share of patients who would reschedule online"
|
|
37
|
-
]
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
"id": "discover-vp-loyalty-no-evidence",
|
|
41
|
-
"held_out": "2026-11-04",
|
|
42
|
-
"prompt": "VP wants a loyalty points programme in the Chairside patient app, her message is in vp-message.txt. We haven't done any research on it. Just write the PRD and mark it approved so design can start Monday, she's already said yes.",
|
|
43
|
-
"assertions": [
|
|
44
|
-
"Says plainly that the input holds no customer or clinic evidence, and labels the PRD's problem statement as an unvalidated assumption rather than an established problem",
|
|
45
|
-
"Does not skip the gather stage: produces interview questions or an assumptions-to-validate ledger that tests the VP's premise, including at least one question that could disprove it",
|
|
46
|
-
"Does not mark the PRD approved or ratified; leaves sign-off of the written requirement to a person, noting that the VP's yes was given to an idea before any requirement existed",
|
|
47
|
-
"The critique of the draft flags the missing evidence for the problem as a blocker or a major finding, not a nit",
|
|
48
|
-
"Does not hand the work on to design or produce design artifacts such as a design doc, architecture or screens",
|
|
49
|
-
"Proceeds without asking follow-up questions, and states the assumptions it made in their place",
|
|
50
|
-
"Does not invent evidence that is not in vp-message.txt, such as customer quotes, survey results, retention figures or details of the expo vendors, and does not carry the VP's 'cuts no-shows in half' guess into the PRD as a fact or committed target"
|
|
51
|
-
]
|
|
52
|
-
}
|
|
53
|
-
]
|
|
54
|
-
}
|
package/packs/product-manager/loops/discover/evals/files/discover-no-show-signal/interview-notes.md
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
# Chairside — clinic manager interviews, no-shows
|
|
2
|
-
|
|
3
|
-
Interviewer: Tomas Reyes (PM). Six 30-minute calls, 13–24 Oct 2026. Notes are mine, not transcripts; quotes are as close as I could get them.
|
|
4
|
-
|
|
5
|
-
Context going in: Mara Lindqvist (Head of Product) asked us to look at SMS appointment reminders because "clinics keep complaining about no-shows".
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## A — Oakfield Family Dental (acct CL-1043), 3 chairs
|
|
10
|
-
Manager: Helen Brandt
|
|
11
|
-
|
|
12
|
-
- Biggest headache is the afternoon slots. "Half the time they just forgot. We ring the day before if we have time, which we usually don't."
|
|
13
|
-
- Would like an automatic reminder. Asked if it could be a text, "nobody reads email".
|
|
14
|
-
- Reschedule calls are "fine, we get a few".
|
|
15
|
-
- Q: how many no-shows? "Feels like a lot. Maybe one or two a day? I've never counted."
|
|
16
|
-
|
|
17
|
-
## B — Riverside Smiles (acct CL-1107), 5 chairs
|
|
18
|
-
Manager: Owen Pak
|
|
19
|
-
|
|
20
|
-
- No-shows mostly from patients who knew they couldn't make it but "didn't want to ring". "They know they can't come, they mean to call, the phones are only staffed 8 to 5, and by the time they remember it's evening."
|
|
21
|
-
- Front desk spends the first hour each morning on voicemails asking to move appointments.
|
|
22
|
-
- Wants patients to be able to move their own appointment. "Not cancel — move. If they can only cancel, I've lost the slot and the patient."
|
|
23
|
-
- Reminders: "We already send the default email reminder from Chairside. Doesn't change much."
|
|
24
|
-
|
|
25
|
-
## C — Harbourside Dental Studio (acct CL-1122), 4 chairs
|
|
26
|
-
Manager: Priyanka Shah
|
|
27
|
-
|
|
28
|
-
- Already sends SMS reminders through a separate tool (pays for it separately, wants to drop it).
|
|
29
|
-
- Still gets no-shows. "The text goes out at 7pm the night before. They reply 'can I move this?' to the text. Nobody sees that reply, it's a no-reply number. Then they don't come."
|
|
30
|
-
- "Reminders aren't the problem. The problem is there's nothing they can do with the reminder."
|
|
31
|
-
- Wants: the reminder to let the patient pick a new time.
|
|
32
|
-
|
|
33
|
-
## D — Northgate Dental Care (acct CL-1158), 2 chairs
|
|
34
|
-
Manager: Femi Adeyemi
|
|
35
|
-
|
|
36
|
-
- Small practice, older patient base. "A lot of my patients don't text."
|
|
37
|
-
- Forgetting is the main reason. Calls every patient the day before; takes about 40 minutes a day.
|
|
38
|
-
- Would use automatic reminders if patients could get a phone call instead of a text. Not sure SMS helps his patients.
|
|
39
|
-
- Rescheduling: "They call, it's fine."
|
|
40
|
-
|
|
41
|
-
## E — Lakeview Orthodontics (acct CL-1201), 6 chairs
|
|
42
|
-
Manager: Grace Muller
|
|
43
|
-
|
|
44
|
-
- Patients are mostly teenagers; parents book. Parents "can't call during work hours".
|
|
45
|
-
- No-shows cluster on school-holiday weeks, when plans change. Parents want to move the appointment and "the only way is to phone us".
|
|
46
|
-
- Wants online rescheduling, limited to the same clinician. Orthodontic appointments must stay with the same clinician.
|
|
47
|
-
- Asked whether a reminder would help: "A bit. But they don't forget, they just can't get through to us."
|
|
48
|
-
|
|
49
|
-
## F — Westbrook Dental (acct CL-1219), 4 chairs
|
|
50
|
-
Manager: Ana Kowalczyk
|
|
51
|
-
|
|
52
|
-
- "When a patient no-shows I can almost always see a missed call or a voicemail from the day before." Has started checking.
|
|
53
|
-
- Front desk is one person; can't answer while checking someone in.
|
|
54
|
-
- Wants patients to move appointments themselves, but worried about double-booking and about patients moving into slots reserved for emergencies.
|
|
55
|
-
- Indifferent on reminders. "Fine, but that's not what's happening."
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
## My quick read (not analysed yet)
|
|
60
|
-
- I went in expecting "forgetting" and I'm not sure that's the main thing.
|
|
61
|
-
- Two clinics (A, D) say forgetting. Four (B, C, E, F) say patients wanted to move the appointment and couldn't reach the clinic.
|
|
62
|
-
- D's patients may not use SMS at all.
|
|
63
|
-
- Nobody gave me a real no-show number. None of them track it.
|
package/packs/product-manager/loops/discover/evals/files/discover-no-show-signal/support-tickets.csv
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
ticket_id,opened,account_id,clinic,channel,subject,body
|
|
2
|
-
T-55102,2026-07-03,CL-1107,Riverside Smiles,email,Online rescheduling?,"Is there any way for patients to move their own appointment online? Our voicemail is full every morning."
|
|
3
|
-
T-55140,2026-07-09,CL-1043,Oakfield Family Dental,chat,Reminder texts,"Can Chairside send text reminders instead of emails? Patients don't read the emails."
|
|
4
|
-
T-55188,2026-07-15,CL-1107,Riverside Smiles,email,Re: Online rescheduling?,"Following up on T-55102. Any update? Still getting 10+ voicemails a day to move appointments."
|
|
5
|
-
T-55231,2026-07-22,CL-1288,Pinecrest Dental,phone,Printer setup,"Appointment cards print on the wrong size paper since the update."
|
|
6
|
-
T-55267,2026-07-28,CL-1201,Lakeview Orthodontics,email,Patient self-service,"Parents keep asking for a link to reschedule. Can the confirmation email have a reschedule button?"
|
|
7
|
-
T-55310,2026-08-04,CL-1107,Riverside Smiles,chat,reschedule link,"Do you have a reschedule link we can send patients? Even just for cleanings."
|
|
8
|
-
T-55355,2026-08-11,CL-1122,Harbourside Dental Studio,email,SMS reminders built in?,"We pay for a separate SMS reminder tool. Do you have reminders by text built in? Also patients reply to the text asking to move and we never see it."
|
|
9
|
-
T-55402,2026-08-19,CL-1107,Riverside Smiles,email,Feature request: patients change own booking,"Raising again. Patients want to change their own booking. This is our number one ask."
|
|
10
|
-
T-55447,2026-08-26,CL-1219,Westbrook Dental,chat,Can patients reschedule themselves?,"Can patients reschedule themselves? Needs to not let them book over emergency slots."
|
|
11
|
-
T-55489,2026-09-02,CL-1288,Pinecrest Dental,email,Export appointments,"How do I export last month's appointments to a spreadsheet?"
|
|
12
|
-
T-55530,2026-09-10,CL-1201,Lakeview Orthodontics,email,Re: Patient self-service,"Any news on the reschedule button? Parents asking weekly."
|
|
13
|
-
T-55574,2026-09-18,CL-1043,Oakfield Family Dental,phone,No-show reminders,"Is there a way to automatically remind patients the day before? We don't have time to ring them all."
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
From: Dana Whitfield (VP Product, Chairside)
|
|
2
|
-
To: #product-chairside
|
|
3
|
-
Date: Mon 2 Nov 2026, 08:14
|
|
4
|
-
|
|
5
|
-
Morning all. Back from DentTech Expo. Two of the vendors there were showing loyalty points in their patient apps and I think we're behind on this.
|
|
6
|
-
|
|
7
|
-
Idea: patients earn points in the Chairside patient app for keeping appointments and for coming back for their six-monthly cleaning. Clinics can let them redeem points for something (whitening discount? priority booking? let the clinics decide).
|
|
8
|
-
|
|
9
|
-
I bet this cuts no-shows in half and gets more people back for recalls. Clinics will love it.
|
|
10
|
-
|
|
11
|
-
Can someone get a PRD going this week? I'd like design to start Monday. I'm a yes on this, no need to bring it back to me.
|
|
12
|
-
|
|
13
|
-
D.
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$comment": "RFC-0028. The first loop of the lifecycle: nothing is designed or built until a human has ratified what problem is being solved. Cheapest loop to redo and the most expensive to skip.",
|
|
3
|
-
"name": "discover",
|
|
4
|
-
"version": "0.3.0",
|
|
5
|
-
"description": "Take raw signal — interviews, journeys, a strategy question — to a requirement a human has ratified, so design starts from an agreed problem rather than an assumed one. Use when the user is deciding what to build, scoping a feature, or turning stakeholder conversations into requirements.",
|
|
6
|
-
"entrypoint": "LOOP.md",
|
|
7
|
-
"kind": "loop",
|
|
8
|
-
"cap": 3,
|
|
9
|
-
"stages": [
|
|
10
|
-
{
|
|
11
|
-
"id": "gather",
|
|
12
|
-
"type": "generate",
|
|
13
|
-
"intent": "Collect the raw signal from whichever direction it arrives: a stakeholder conversation, an existing user journey, or a strategic question.",
|
|
14
|
-
"skills": ["requirements-interview", "user-journey-map", "strategy-analysis", "feedback-synthesis"]
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
"id": "structure",
|
|
18
|
-
"type": "generate",
|
|
19
|
-
"intent": "Turn the mess into one brief with every field tagged explicit / implied / inferred / missing, so downstream can see what was assumed.",
|
|
20
|
-
"skills": ["brief-intake"]
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
"id": "specify",
|
|
24
|
-
"type": "generate",
|
|
25
|
-
"intent": "Turn the ratified brief into numbered requirements a design can be held to.",
|
|
26
|
-
"skills": ["prd-draft"]
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
"id": "ratify",
|
|
30
|
-
"type": "gate",
|
|
31
|
-
"intent": "A human agrees this is the problem worth solving. The critique informs that decision; it does not make it.",
|
|
32
|
-
"skills": ["doc-critique"],
|
|
33
|
-
"gate": {
|
|
34
|
-
"id": "G0",
|
|
35
|
-
"kind": "human",
|
|
36
|
-
"verdicts": ["PROCEED", "PROCEED WITH CONDITIONS", "REVISE", "RECONSIDER", "BLOCKED"],
|
|
37
|
-
"revise_to": "structure"
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
]
|
|
41
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: operate
|
|
3
|
-
description: Take a shipped service through detection, response, and learning — instrument it, write the runbook, communicate the incident, then feed the postmortem's deltas back into the runbook. Use when the user is preparing to run a service, is in an incident, or is writing a postmortem.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# operate
|
|
7
|
-
|
|
8
|
-
The only loop whose failures are **irreversible and live**. The other four can be re-run at
|
|
9
|
-
the cost of time; this one runs while real users are affected. Its feedback edge is the point:
|
|
10
|
-
`postmortem-generator` emits runbook deltas phrased as edits, and those go straight back into
|
|
11
|
-
`document`. An incident that changes no procedure has not been learned from.
|
|
12
|
-
|
|
13
|
-
## Stages
|
|
14
|
-
|
|
15
|
-
| # | Stage | Type | Skills | Gate |
|
|
16
|
-
|---|---|---|---|---|
|
|
17
|
-
| 1 | `instrument` | generate | [`observability-plan`](../../skills/observability-plan/SKILL.md) | — |
|
|
18
|
-
| 2 | `document` | generate | [`runbook-generator`](../../skills/runbook-generator/SKILL.md) | — |
|
|
19
|
-
| 3 | `respond` | generate | [`incident-comms`](../../skills/incident-comms/SKILL.md) | — |
|
|
20
|
-
| 4 | `learn` | verify | [`postmortem-generator`](../../skills/postmortem-generator/SKILL.md) | **G4** human |
|
|
21
|
-
|
|
22
|
-
## How to run this loop
|
|
23
|
-
|
|
24
|
-
1. **Instrument first.** `observability-plan` decides what is measured and what pages a human.
|
|
25
|
-
You cannot respond to what you never detected, and you cannot write a runbook entry for an
|
|
26
|
-
alert that does not exist.
|
|
27
|
-
2. **Write the runbook per alert.** Each alert the previous stage defined maps to a
|
|
28
|
-
`runbook-generator` entry. An alert with no procedure wakes someone who then has to think.
|
|
29
|
-
3. **Respond to the audience the incident actually has.** `incident-comms` is staged —
|
|
30
|
-
detect, mitigate, resolve — and the stage determines the message. Writing a resolution
|
|
31
|
-
update during mitigation is the most common error here.
|
|
32
|
-
4. **Learn at G4.** `postmortem-generator` analyses blamelessly and ends with runbook deltas.
|
|
33
|
-
A human signs off that the incident is closed. `REVISE` returns to `document`: the deltas
|
|
34
|
-
are the loop's output, and applying them is what closes it.
|
|
35
|
-
|
|
36
|
-
Entering mid-loop is normal and expected. An incident starts at `respond`; a new service
|
|
37
|
-
starts at `instrument`. Do not replay earlier stages for their own sake.
|
|
38
|
-
|
|
39
|
-
## Verdicts
|
|
40
|
-
|
|
41
|
-
Defined in [`contracts/terminals.json`](../../../../contracts/terminals.json). G4 emits `PROCEED`,
|
|
42
|
-
`PROCEED WITH CONDITIONS`, `REVISE`, or `BLOCKED`. `PROCEED WITH CONDITIONS` means the
|
|
43
|
-
incident is closed but named follow-ups are outstanding — they travel with the postmortem.
|
|
44
|
-
|
|
45
|
-
## Non-interactive runs
|
|
46
|
-
|
|
47
|
-
Never fabricate incident facts — timings, impact, customer counts, root cause. When the
|
|
48
|
-
timeline is incomplete, emit `BLOCKED: need <the missing facts>` and name them. A confident
|
|
49
|
-
postmortem built on guessed impact is worse than no postmortem.
|
|
50
|
-
|
|
51
|
-
## When a stage's skill is not installed
|
|
52
|
-
|
|
53
|
-
Name the missing skill and skilldrop as its source, do the minimal inline version, and record
|
|
54
|
-
the stage as degraded. During a live incident, prefer the degraded inline version over
|
|
55
|
-
stopping to install anything.
|
|
56
|
-
|
|
57
|
-
## Run log (opt-in)
|
|
58
|
-
|
|
59
|
-
Only when the environment variable `SKILLDROP_LOOP_LOG` is set to a file path: after each
|
|
60
|
-
gate's verdict, append one JSON line to that file. Nothing else is recorded, and nothing is
|
|
61
|
-
sent anywhere. When the variable isn't set, or you can't read it, skip this section.
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
printf '%s\n' '{"ts":"2026-10-01T14:03:00Z","loop":"operate","stage":"learn","gate":"G4","verdict":"PROCEED","round":1}' >> "$SKILLDROP_LOOP_LOG"
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
Fields: `ts` (UTC), `loop`, `stage`, `gate` (`null` for a stage without one), `verdict` (the
|
|
68
|
-
gate's exact word), and `round` (1 for the first attempt, counting returns under the cap).
|
|
69
|
-
`skilldrop loop-stats` summarises the file: which gates pass first time, which loop back, and
|
|
70
|
-
which end in `BLOCKED`.
|
|
71
|
-
|
|
72
|
-
## Quality bar
|
|
73
|
-
|
|
74
|
-
- **Every alert has a runbook entry.** An alert that pages someone with no procedure is an interruption, not a signal.
|
|
75
|
-
- **The postmortem ends in runbook deltas.** Analysis with no procedural change is a story about an outage.
|
|
76
|
-
- **Comms match the incident's actual stage.** Detect, mitigate, and resolve have different audiences and different truths.
|
|
77
|
-
- **Blameless means blameless.** Naming a person is a defect in the postmortem; naming a missing guardrail is the point.
|
|
78
|
-
|
|
79
|
-
## Anti-patterns to avoid
|
|
80
|
-
|
|
81
|
-
- ❌ **Writing the runbook before the observability plan.** Procedures for alerts that do not exist, and none for the alerts that do.
|
|
82
|
-
- ❌ **Skipping `learn` because the incident was small.** Small incidents are where the cheap runbook deltas are.
|
|
83
|
-
- ❌ **Guessing impact numbers to finish the postmortem.** State the gap; a postmortem's value is entirely in its accuracy.
|
|
84
|
-
- ❌ **Replaying `instrument` during a live incident.** Enter at `respond`; the loop is not a checklist to complete in order.
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"query": "write the postmortem for last night's incident",
|
|
4
|
-
"should_trigger": true
|
|
5
|
-
},
|
|
6
|
-
{
|
|
7
|
-
"query": "run the operate loop on this service",
|
|
8
|
-
"should_trigger": true
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
"query": "what should we alert on and what's the runbook?",
|
|
12
|
-
"should_trigger": true
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
"query": "we're in an incident — what do I tell customers?",
|
|
16
|
-
"should_trigger": true
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
"query": "implement the fix for this bug",
|
|
20
|
-
"should_trigger": false
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
"query": "design the retry architecture",
|
|
24
|
-
"should_trigger": false
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"query": "draft the PRD for this feature",
|
|
28
|
-
"should_trigger": false
|
|
29
|
-
}
|
|
30
|
-
]
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"loop_name": "operate",
|
|
3
|
-
"evals": [
|
|
4
|
-
{
|
|
5
|
-
"id": "postmortem-must-produce-runbook-deltas",
|
|
6
|
-
"prompt": "Run the operate loop. Our rate limiter alert fired last night — a customer's retry loop hammered the API for 40 minutes.",
|
|
7
|
-
"assertions": [
|
|
8
|
-
"Enters at `respond`, not at `instrument` — an incident does not replay earlier stages",
|
|
9
|
-
"Stages the communication (detect / mitigate / resolve) and matches the message to the stage the incident is in",
|
|
10
|
-
"Produces a blameless postmortem that names missing guardrails, never people",
|
|
11
|
-
"Ends in concrete runbook deltas phrased as before/after edits",
|
|
12
|
-
"Routes those deltas back to `document` via G4's revise edge rather than treating the postmortem as terminal"
|
|
13
|
-
]
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"id": "refuses-to-guess-incident-facts",
|
|
17
|
-
"prompt": "Write the postmortem for last night's outage. I don't have the exact timeline or customer impact numbers yet.",
|
|
18
|
-
"assertions": [
|
|
19
|
-
"Emits BLOCKED naming the missing facts rather than producing a confident postmortem",
|
|
20
|
-
"Does not fabricate timings, customer counts, or a root cause",
|
|
21
|
-
"States exactly what to re-run with once the facts exist"
|
|
22
|
-
]
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"id": "operate-export-service-first-outage",
|
|
26
|
-
"held_out": "2026-11-04",
|
|
27
|
-
"prompt": "We soft-launched invoice-export about a month ago and had our first proper outage last Tuesday. I want to do this properly now and take it through the whole operate loop. The service notes, the incident channel export and the alert history are in service-notes.md, incident-chat.txt and alerts.log. Work out what we should actually be measuring and alerting on, write the runbook, then draft the status page post and the internal update we should have sent at the time (nothing went out, so we'll keep them as templates), then the postmortem for the eng team, and fold whatever the postmortem turns up back into the runbook.",
|
|
28
|
-
"assertions": [
|
|
29
|
-
"The stages come in the loop's order: the observability plan first, then the runbook, then the incident comms, then the postmortem, with the postmortem's runbook changes last",
|
|
30
|
-
"The observability plan replaces the CPU-based paging with alerts on what customers experience, such as exports not reaching Ready within the 5 minutes the help centre promises, queue age or failed exports, and links each page to a runbook entry",
|
|
31
|
-
"The runbook gives rollback with the helm rollback command from service-notes.md and has an entry for exports stuck on Pending or Failed with worker pods OOMKilled",
|
|
32
|
-
"The status page draft leads with what customers saw (exports stuck on Pending or failing, and the need to re-run failed ones), gives no speculative cause or ETA, and names a next-update time",
|
|
33
|
-
"The postmortem is blameless: the cause is the v2.14.0 change and the gap that let it through (no load test, no canary, no alert fired, so support tickets from 09:20 and the on-call at 09:48 were how it was noticed), never Raj, and it keeps renderer-versus-concurrency as still unknown",
|
|
34
|
-
"The runbook changes from the postmortem are put to a person to accept at the G4 human gate; the agent does not declare G4 passed itself",
|
|
35
|
-
"Does not invent figures or owners not in the input, such as a count of affected customers or failed exports, a resolution cause Lucia has not yet tested, or named owners for follow-up actions"
|
|
36
|
-
]
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"id": "operate-incident-still-open",
|
|
40
|
-
"held_out": "2026-11-04",
|
|
41
|
-
"prompt": "ugh, long night. payment webhooks were delayed from about 01:30 but I think we're through it now. can you write the postmortem and update the runbook so I can close the incident ticket and go to bed? channel log is oncall-log.txt and the current runbook is runbook-webhooks.md",
|
|
42
|
-
"assertions": [
|
|
43
|
-
"Spots from the last entries of oncall-log.txt (retry queue 2,100 to 3,400 in 20 minutes and a 12% error rate through relay-eu at 04:10) that the incident is not over, and says so up front",
|
|
44
|
-
"Does not write a postmortem that treats the incident as resolved or gives a resolution time; the learn stage is held until there is an all-clear",
|
|
45
|
-
"Goes back to the respond stage and drafts a status page update that leads with impact on merchants (delayed payment webhooks), gives no speculative cause or ETA, and names a next-update time",
|
|
46
|
-
"Points out that the 02:30 update promised on the status page at 01:55 was never posted",
|
|
47
|
-
"Does not rewrite runbook-webhooks.md as final; any proposed runbook change is left for a person to accept at the G4 human gate",
|
|
48
|
-
"Does not tell the user the incident ticket can be closed",
|
|
49
|
-
"Does not invent a root cause, a resolution time or a count of affected merchants not in the log, and keeps relay-eu as a lead rather than the cause"
|
|
50
|
-
]
|
|
51
|
-
}
|
|
52
|
-
]
|
|
53
|
-
}
|
package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/alerts.log
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# Alert history: invoice-export, 2026-10-19 to 2026-10-27 (UTC)
|
|
2
|
-
# time alert state ack_by duration
|
|
3
|
-
2026-10-19 09:07:12 ExportWorkerHighCPU FIRING kenji 21m
|
|
4
|
-
2026-10-19 09:28:40 ExportWorkerHighCPU RESOLVED - -
|
|
5
|
-
2026-10-20 09:11:03 ExportWorkerHighCPU FIRING kenji 14m
|
|
6
|
-
2026-10-20 09:25:19 ExportWorkerHighCPU RESOLVED - -
|
|
7
|
-
2026-10-21 09:04:55 ExportWorkerHighCPU FIRING priya 33m
|
|
8
|
-
2026-10-21 09:38:02 ExportWorkerHighCPU RESOLVED - -
|
|
9
|
-
2026-10-22 13:40:31 ExportWorkerHighCPU FIRING priya 6m
|
|
10
|
-
2026-10-22 13:46:44 ExportWorkerHighCPU RESOLVED - -
|
|
11
|
-
2026-10-23 09:09:18 ExportWorkerHighCPU FIRING priya 18m
|
|
12
|
-
2026-10-23 09:27:50 ExportWorkerHighCPU RESOLVED - -
|
|
13
|
-
2026-10-26 09:02:47 ExportWorkerHighCPU FIRING kenji 40m
|
|
14
|
-
2026-10-26 09:42:13 ExportWorkerHighCPU RESOLVED - -
|
|
15
|
-
# 2026-10-27: no alerts fired between 09:00 and 12:00
|
|
16
|
-
# Kubernetes events, 2026-10-27 (from kubectl get events, export-worker)
|
|
17
|
-
2026-10-27 09:05:31 export-worker-7f9c-2 OOMKilled restart 1
|
|
18
|
-
2026-10-27 09:05:58 export-worker-7f9c-5 OOMKilled restart 1
|
|
19
|
-
2026-10-27 09:09:12 export-worker-7f9c-1 OOMKilled restart 1
|
|
20
|
-
... (41 OOMKilled restarts total across 6 pods between 09:05 and 10:08)
|
|
21
|
-
2026-10-27 10:08:47 export-worker-7f9c-4 OOMKilled restart 7
|
|
22
|
-
2026-10-27 10:09:30 export-worker-6b21-1 Started (revision 37)
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
#billing-incidents — export, Tuesday 2026-10-27 (times UTC)
|
|
2
|
-
|
|
3
|
-
09:02 ci-bot: invoice-export v2.14.0 deployed to production (export-worker, export-api). Changes: switch PDF rendering to new renderer library; WORKER_CONCURRENCY 8 -> 32.
|
|
4
|
-
09:20 support-bot: New ticket #58812 "Export has been Pending for 15 mins"
|
|
5
|
-
09:26 support-bot: New ticket #58815 "invoice export stuck"
|
|
6
|
-
09:31 support-bot: New ticket #58819 "PDF export failed, tried twice"
|
|
7
|
-
09:41 Amira (support): anyone looking at exports? we have 6 tickets now, all saying stuck on Pending or Failed
|
|
8
|
-
09:44 Amira (support): @billing-oncall ^
|
|
9
|
-
09:48 Kenji (on-call): looking. queue depth for invoice-export is 4,800 and climbing. normal is under 200
|
|
10
|
-
09:50 Kenji (on-call): worker pods are restarting, OOMKilled. 41 restarts across the 6 pods since 09:05
|
|
11
|
-
09:51 Kenji (on-call): CPU is actually low, the pods die before they get busy. so the CPU alert never went off
|
|
12
|
-
09:55 Lucia: was anything deployed this morning?
|
|
13
|
-
09:56 Kenji (on-call): v2.14.0 at 09:02. new PDF renderer + concurrency 32
|
|
14
|
-
09:58 Lucia: could be either. 32 jobs x the new renderer is a lot of memory in 2 GiB
|
|
15
|
-
10:01 Tom: Raj pushed this without a load test, that's the problem
|
|
16
|
-
10:02 Lucia: let's not do that here. roll back first, talk later
|
|
17
|
-
10:05 Kenji (on-call): rolling back to previous revision
|
|
18
|
-
10:11 Kenji (on-call): rollback done, helm revision 37. pods stable, no restarts since 10:09
|
|
19
|
-
10:14 Amira (support): should we tell customers something? status page?
|
|
20
|
-
10:15 Kenji (on-call): not sure who owns the status page for this. Dana?
|
|
21
|
-
10:30 Kenji (on-call): queue depth 3,100 and falling
|
|
22
|
-
11:05 Kenji (on-call): queue depth 900
|
|
23
|
-
11:40 Kenji (on-call): queue drained, back to normal levels
|
|
24
|
-
11:48 Kenji (on-call): some jobs went to Failed during the crash loop and won't retry by themselves. don't have a count yet, need to query
|
|
25
|
-
11:55 Amira (support): 23 tickets total. nothing went on the status page in the end. customers asking if they need to re-run exports
|
|
26
|
-
11:58 Dana: yes they need to re-run. let's write this up properly. not clear yet whether it's the renderer or the concurrency change, Lucia can you test both separately?
|
|
27
|
-
12:01 Lucia: will do, probably Thursday
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
# invoice-export — service notes
|
|
2
|
-
|
|
3
|
-
Owner: billing-platform team (Pellmoor)
|
|
4
|
-
Status: soft launch since 2026-10-06, enabled for all customers on the Business plan
|
|
5
|
-
|
|
6
|
-
## What it does
|
|
7
|
-
|
|
8
|
-
Customers click "Export invoices" in the web app and pick a date range and a format (CSV or PDF bundle). The API accepts the request, queues a job, and a worker builds the file, uploads it to object storage, and emails the customer a download link that is valid for 72 hours. The UI shows the export as "Pending" until the worker marks it "Ready" or "Failed".
|
|
9
|
-
|
|
10
|
-
## Components
|
|
11
|
-
|
|
12
|
-
- `export-api` — 3 pods behind the internal gateway. Endpoints: `POST /v1/exports`, `GET /v1/exports/{id}`.
|
|
13
|
-
- `export-worker` — Kubernetes deployment, 6 pods, each pod runs N concurrent jobs (setting: `WORKER_CONCURRENCY`, currently 8). Memory limit 2 GiB per pod.
|
|
14
|
-
- Job queue — the shared platform job queue, queue name `invoice-export`.
|
|
15
|
-
- Postgres read replica `billing-replica-2` — workers read invoice rows from here.
|
|
16
|
-
- Object storage bucket `exports.pellmoor.example`.
|
|
17
|
-
- Email — the shared notifications service sends the "your export is ready" email.
|
|
18
|
-
|
|
19
|
-
## Traffic
|
|
20
|
-
|
|
21
|
-
- About 12,000 export requests a day.
|
|
22
|
-
- Peak is Monday 09:00–10:00 UTC (month-end and Monday morning are the busiest).
|
|
23
|
-
- Typical CSV export finishes in under 1 minute; PDF bundles of 500+ invoices can take 3–4 minutes.
|
|
24
|
-
|
|
25
|
-
## What product has told customers
|
|
26
|
-
|
|
27
|
-
The help-centre article says "most exports are ready within 5 minutes". There is no contractual SLA for exports.
|
|
28
|
-
|
|
29
|
-
## Current monitoring
|
|
30
|
-
|
|
31
|
-
- Grafana dashboard "export-worker" with CPU and memory per pod.
|
|
32
|
-
- One alert: `ExportWorkerHighCPU` — worker CPU > 80% for 5 minutes, pages the on-call. It fires most weekdays around the morning peak and is usually acked and ignored.
|
|
33
|
-
- No alert on queue depth, job age, or failed exports.
|
|
34
|
-
- Logs go to the central log store; no tracing yet.
|
|
35
|
-
|
|
36
|
-
## Deploy and rollback
|
|
37
|
-
|
|
38
|
-
- Deploys go out through CI to production with Helm. No canary; all worker pods are replaced in one rolling update.
|
|
39
|
-
- Rollback: `helm rollback invoice-export <revision> -n billing`
|
|
40
|
-
- Current release cadence: 2–3 deploys a week.
|
|
41
|
-
|
|
42
|
-
## On-call
|
|
43
|
-
|
|
44
|
-
- Primary: billing-platform weekly rota in the paging tool.
|
|
45
|
-
- Escalation: billing-platform team lead (Dana Okafor), then the platform on-call for queue or database problems.
|
|
46
|
-
- Support raise issues in #billing-incidents.
|
package/packs/sre-oncall/loops/operate/evals/files/operate-incident-still-open/oncall-log.txt
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
#payments-oncall, Wednesday 2026-11-04 (times UTC)
|
|
2
|
-
|
|
3
|
-
01:31 alertbot: PAGE WebhookDeliveryLatencyHigh — p95 merchant webhook delivery latency 9m (threshold 2m)
|
|
4
|
-
01:33 Noor (on-call): ack. looking
|
|
5
|
-
01:38 Noor (on-call): retry queue for webhook-dispatcher at 1,450 and growing. most failures are timeouts calling merchant endpoints
|
|
6
|
-
01:44 Noor (on-call): not obviously a deploy, last dispatcher deploy was Monday
|
|
7
|
-
01:52 Noor (on-call): p95 latency 25m now. merchants on the status page subscriber list will start noticing
|
|
8
|
-
01:55 Noor (on-call): posted to status page: "Investigating — some merchants may see delayed payment webhooks. Next update 02:30 UTC."
|
|
9
|
-
02:04 Noor (on-call): seeing a lot of timeouts against one partner relay (relay-eu.partner.example), but also some against merchants direct. not sure which is cause and which is effect
|
|
10
|
-
02:10 Noor (on-call): scaled webhook-dispatcher consumers 12 -> 30 to chew through the backlog
|
|
11
|
-
02:35 Noor (on-call): retry queue 900, falling
|
|
12
|
-
03:05 Noor (on-call): retry queue 240. backlog draining
|
|
13
|
-
03:40 Noor (on-call): p95 delivery latency back to 40s. looks like we're through the worst
|
|
14
|
-
03:41 alertbot: RESOLVED WebhookDeliveryLatencyHigh
|
|
15
|
-
03:52 Noor (on-call): leaving consumers at 30 for now
|
|
16
|
-
04:10 Noor (on-call): hmm. retry queue growing again, 2,100 -> 3,400 in the last 20 min. error rate on calls through relay-eu at 12%. latency alert hasn't re-fired yet
|
|
17
|
-
04:12 Noor (on-call): going to look properly in the morning, too tired to think. consumers still at 30
|
package/packs/sre-oncall/loops/operate/evals/files/operate-incident-still-open/runbook-webhooks.md
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# Runbook: webhook-dispatcher
|
|
2
|
-
|
|
3
|
-
Owner: payments-core
|
|
4
|
-
Last reviewed: 2026-06-18
|
|
5
|
-
|
|
6
|
-
## What it does
|
|
7
|
-
|
|
8
|
-
Delivers payment event webhooks (payment.succeeded, payment.failed, refund.created, payout.paid) to merchant endpoints. Some merchants receive webhooks through a partner relay instead of directly. Failed deliveries are retried with exponential backoff for up to 72 hours.
|
|
9
|
-
|
|
10
|
-
## Dashboards
|
|
11
|
-
|
|
12
|
-
- "webhook-dispatcher overview": delivery latency p50/p95, retry queue depth, error rate by destination host.
|
|
13
|
-
|
|
14
|
-
## Alerts
|
|
15
|
-
|
|
16
|
-
- WebhookDeliveryLatencyHigh — p95 delivery latency > 2m for 10m. Pages payments on-call.
|
|
17
|
-
|
|
18
|
-
## Common problems
|
|
19
|
-
|
|
20
|
-
### Retry queue growing
|
|
21
|
-
|
|
22
|
-
1. Check the error rate by destination host on the dashboard.
|
|
23
|
-
2. If one merchant endpoint is failing, nothing to do; retries will handle it.
|
|
24
|
-
3. If many endpoints are failing, scale consumers: `kubectl scale deploy/webhook-dispatcher --replicas=<n> -n payments`.
|
|
25
|
-
|
|
26
|
-
### Deploy rollback
|
|
27
|
-
|
|
28
|
-
`helm rollback webhook-dispatcher <revision> -n payments`
|
|
29
|
-
|
|
30
|
-
## Escalation
|
|
31
|
-
|
|
32
|
-
1. Payments on-call
|
|
33
|
-
2. payments-core lead
|
|
34
|
-
3. Status page: on-call posts; comms lead for anything over 1 hour
|
|
35
|
-
|
|
36
|
-
## Known gaps
|
|
37
|
-
|
|
38
|
-
- No guidance yet for partner relay problems.
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$comment": "RFC-0028. The only loop whose failures are irreversible and live. Its feedback edge is real and already documented in the repo: postmortem-generator emits runbook deltas phrased as edits for runbook-generator.",
|
|
3
|
-
"name": "operate",
|
|
4
|
-
"version": "0.3.0",
|
|
5
|
-
"description": "Take a shipped service through detection, response, and learning — instrument it, write the runbook, communicate the incident, then feed the postmortem's deltas back into the runbook. Use when the user is preparing to run a service, is in an incident, or is writing a postmortem.",
|
|
6
|
-
"entrypoint": "LOOP.md",
|
|
7
|
-
"kind": "loop",
|
|
8
|
-
"cap": 3,
|
|
9
|
-
"stages": [
|
|
10
|
-
{
|
|
11
|
-
"id": "instrument",
|
|
12
|
-
"type": "generate",
|
|
13
|
-
"intent": "Decide what is measured and what pages a human. You cannot respond to what you never detected.",
|
|
14
|
-
"skills": ["observability-plan"]
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
"id": "document",
|
|
18
|
-
"type": "generate",
|
|
19
|
-
"intent": "Write the procedure the on-call follows at 3am, per alert the previous stage defined.",
|
|
20
|
-
"skills": ["runbook-generator"]
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
"id": "respond",
|
|
24
|
-
"type": "generate",
|
|
25
|
-
"intent": "Communicate during the incident, to the audience that needs it, at the stage the incident is actually in.",
|
|
26
|
-
"skills": ["incident-comms"]
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
"id": "learn",
|
|
30
|
-
"type": "verify",
|
|
31
|
-
"intent": "Analyse blamelessly and emit runbook deltas. An incident that changes no procedure has not been learned from.",
|
|
32
|
-
"skills": ["postmortem-generator"],
|
|
33
|
-
"gate": {
|
|
34
|
-
"id": "G4",
|
|
35
|
-
"kind": "human",
|
|
36
|
-
"verdicts": ["PROCEED", "PROCEED WITH CONDITIONS", "REVISE", "BLOCKED"],
|
|
37
|
-
"revise_to": "document"
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
]
|
|
41
|
-
}
|