skilldrop-cli 0.13.0 → 0.13.1

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 CHANGED
@@ -3,9 +3,9 @@
3
3
  [![npm](https://img.shields.io/npm/v/skilldrop-cli)](https://www.npmjs.com/package/skilldrop-cli)
4
4
  [![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
5
5
 
6
- **[Browse the catalogue →](https://sananthanarayan.github.io/skilldrop/)** — all 62 skills, filterable by outcome, pack, tag, and model tier.
6
+ **[Browse the catalogue →](https://sananthanarayan.github.io/skilldrop/)** — all 63 skills, filterable by outcome, pack, tag, and model tier.
7
7
 
8
- **62 portable AI-agent skills for the deliverables knowledge workers actually ship** — diagrams, design docs, ADRs, PRDs, runbooks, decks, decision logs, threat models, adversarial reviews — installable into **Claude Code**, **Cursor**, **Kiro**, **Codex**, **GitHub Copilot**, and any AI tool that accepts custom instructions, one skill or one role-based pack at a time:
8
+ **63 portable AI-agent skills for the deliverables knowledge workers actually ship** — diagrams, design docs, ADRs, PRDs, runbooks, decks, decision logs, threat models, adversarial reviews — installable into **Claude Code**, **Cursor**, **Kiro**, **Codex**, **GitHub Copilot**, and any AI tool that accepts custom instructions, one skill or one role-based pack at a time:
9
9
 
10
10
  ```bash
11
11
  npx skilldrop-cli install --pack product-manager # or: solution-architect, dev-team,
@@ -24,13 +24,14 @@ skilldrop ships **loops**, not just parts. A loop is a named sequence of stages
24
24
 
25
25
  A loop *sequences* skills — it never contains one. Every skill stays independently installable and runnable on its own, which is what keeps a single-folder copy working in Cursor, Kiro, or Aider.
26
26
 
27
- Four loops cover the lifecycle, and they are separated by **reversibility** — how expensive the mistake is to unwind — which is why each gets its own gate rather than folding into a neighbour:
27
+ Five loops cover the lifecycle, and they are separated by **reversibility** — how expensive the mistake is to unwind — which is why each gets its own gate rather than folding into a neighbour:
28
28
 
29
29
  | Loop | Takes | Gate | Produces | Mistake costs |
30
30
  |---|---|---|---|---|
31
31
  | [`discover`](loops/discover/LOOP.md) | interviews, journeys, a strategy question | **G0** human — a person ratifies the brief | a ratified requirement | a re-brief |
32
32
  | [`design`](loops/design/LOOP.md) | a ratified requirement | **G1** review — `council-review`'s panel | a recorded decision (ADR) | months, unwound in code |
33
33
  | [`build`](loops/build/LOOP.md) | an agreed requirement or triaged defect | **G2** mechanical — `pre-merge-review`'s gate script decides | merged code | a revert |
34
+ | [`release`](loops/release/LOOP.md) | merged code | **G2.5** review — `launch-readiness` on evidence; **G2.6** human go/no-go | a live, reversible rollout | users and data, often irreversible |
34
35
  | [`operate`](loops/operate/LOOP.md) | a shipped service | **G3** human — the incident is closed | a postmortem and runbook deltas | live users, irreversible |
35
36
 
36
37
  Plus one **wrapper**, which is not a lifecycle stage but the two passes either side of *any* generator:
@@ -144,6 +145,41 @@ flowchart LR
144
145
 
145
146
  <!-- loop:build:end -->
146
147
 
148
+ ### `release` — merged code to live users
149
+
150
+ Plan the rollout and the way back, judge readiness on evidence, draft the release notes, then a human makes the go/no-go call. The gap between a merge you can revert and a launch you often cannot.
151
+
152
+ <!-- loop:release:start -->
153
+
154
+ ```mermaid
155
+ %%{init: {'theme':'base','themeVariables':{'fontFamily':'Segoe UI, Helvetica, Arial','fontSize':'15px','lineColor':'#9AA5B1'},'flowchart':{'curve':'basis','rankSpacing':70,'nodeSpacing':50,'padding':16}}}%%
156
+ flowchart LR
157
+ classDef gen fill:#E8F0FE,stroke:#4C7DF0,stroke-width:1.5px,color:#1A3A8F;
158
+ classDef review fill:#FDEAEA,stroke:#E05B5B,stroke-width:1.5px,color:#8A1F1F;
159
+ classDef gate fill:#FBE3A2,stroke:#D9971E,stroke-width:2px,color:#6B4500,font-weight:bold;
160
+ classDef ship fill:#E6F7EC,stroke:#34A853,stroke-width:2px,color:#0F6B33,font-weight:bold;
161
+
162
+ plan["plan<br/><small>migration-plan</small>"]:::gen
163
+ ready["ready<br/><small>launch-readiness</small>"]:::review
164
+ announce["announce<br/><small>release-notes</small>"]:::gen
165
+ go["go<br/><small>council-review</small>"]:::gate
166
+ G2_5{"G2.5 · review"}:::gate
167
+ G2_6{"G2.6 · human"}:::gate
168
+ DONE(["complete"]):::ship
169
+
170
+ plan --> ready
171
+ ready --> G2_5
172
+ G2_5 == "PROCEED" ==> announce
173
+ announce --> go
174
+ go --> G2_6
175
+ G2_6 == "PROCEED" ==> DONE
176
+
177
+ G2_5 -- "REVISE (max 3)" --> plan
178
+ G2_6 -- "REVISE (max 3)" --> plan
179
+ ```
180
+
181
+ <!-- loop:release:end -->
182
+
147
183
  ### `operate` — a shipped service through detection and learning
148
184
 
149
185
  Instrument, write the runbook, communicate the incident, then feed the postmortem's runbook deltas straight back into the runbook. The one loop whose failures are live.
@@ -235,6 +271,7 @@ Skills for the SDLC steps around the code itself — turning raw requirements in
235
271
  | [`release-notes`](skills/release-notes/SKILL.md) | Turn git history between two refs (default: last tag → HEAD) into two artifacts: customer-facing release notes rewritten in reader benefits — no commit-speak, no ticket IDs, no "various improvements" — and an internal Keep-a-Changelog version with a commit hash on every line. Breaking changes hoisted to the top of both with an "Action required" line (detected via `!:` markers, removed public API, migration files, major bumps); internal noise (refactors, CI, deps) never leaks into customer notes; vague commits land in a "Needs review" list instead of being guessed at. |
236
272
  | [`bug-triage`](skills/bug-triage/SKILL.md) | Turn a vague bug report ("it's broken on mobile sometimes") into a ticket an engineer can start without contacting the reporter: searchable symptom-plus-condition title, numbered repro steps from a clean state (or an explicit "no repro yet" with the exact diagnostics to collect), expected-vs-actual with the verbatim error string, every claim tagged `[reported]` / `[verified]` / `[assumption]`, severity and priority judged independently (S4/P1 is a legitimate combination), ≤3 hypotheses each with a 5-minute check, and duplicate-search hints. One bug per ticket — multi-symptom reports get split. |
237
273
  | [`migration-plan`](skills/migration-plan/SKILL.md) | Phased migration/rollout plan (schema change with live backfill, API version, datastore/auth/platform swap) built on the parallel-change pattern: expand → migrate → contract. One change per phase (a failed phase implicates exactly one thing); every phase carries an observable gate with bake time, a tested rollback with an explicit data story, and a blast radius; at most one **named point of no return**; backfill specified idempotent + resumable + rate-limited with 3-depth parity checks; dual-write requires a named reconciler; the contract phase gets a date and an owner so "we'll remove the old path later" actually happens. |
274
+ | [`launch-readiness`](skills/launch-readiness/SKILL.md) | Go/no-go readiness report for a merged change before it reaches users. It lists the change's own failure modes first, then judges seven checks in order: rollback, detection, response, measured NFR targets, data & privacy, comms, staged exposure. Each row is met / not met / n/a-with-reason, with an evidence link and an owner role, and a row with no evidence is `not met`. The verdict (PROCEED / PROCEED WITH CONDITIONS / REVISE / BLOCKED) follows mechanically from the rows, and a missing rollback blocks on its own. Gaps go to `migration-plan`, `observability-plan` or `runbook-generator` instead of being drafted inline. The `ready` stage of the `release` loop. |
238
275
 
239
276
  ### Product strategy
240
277
 
@@ -442,7 +479,7 @@ npx skilldrop-cli install --pack dev-team --project # .claude/skills — als
442
479
  npx skilldrop-cli install prfaq --ide cursor # + writes .cursor/rules/prfaq.mdc
443
480
  npx skilldrop-cli install --pack sre-oncall --ide kiro # .kiro/skills — Kiro IDE + Kiro CLI, discovered natively
444
481
  npx skilldrop-cli install adr-generator --dest .agents/skills # Codex + Copilot CLI (see below)
445
- npx skilldrop-cli loops # the five loops, their stages and gates
482
+ npx skilldrop-cli loops # the six loops, their stages and gates
446
483
  npx skilldrop-cli install --loop build # a loop + every stage skill it sequences (RFC-0028)
447
484
  npx skilldrop-cli install --loop --pack sre-oncall # every loop that pack declares
448
485
  npx skilldrop-cli agents # the reviewer subagents
@@ -466,7 +503,7 @@ skilldrop is also a **Claude Code plugin marketplace** — one marketplace, seve
466
503
  Then take the whole catalogue, or just your role's pack:
467
504
 
468
505
  ```text
469
- /plugin install skilldrop@skilldrop # all 62 skills + 3 reviewer subagents
506
+ /plugin install skilldrop@skilldrop # all 63 skills + 3 reviewer subagents
470
507
  /plugin install solution-architect@skilldrop # 17 skills
471
508
  /plugin install dev-team@skilldrop # 14 skills + the 3 reviewer subagents
472
509
  /plugin install product-manager@skilldrop # 13 skills
@@ -0,0 +1,76 @@
1
+ ---
2
+ name: release
3
+ description: Take merged code to live users through a planned, reversible rollout — plan the phases and the rollback, judge readiness on evidence, draft the release notes, then a human makes the go/no-go call. Use when the user has merged a change and asks how to roll it out, whether they are ready to launch, or for a go/no-go decision.
4
+ ---
5
+
6
+ # release
7
+
8
+ This loop covers the step between `build`, which ends when a human merges, and `operate`,
9
+ which assumes the service is already live. A merge can be undone with a revert. A launch that
10
+ has touched users or data often cannot be undone, so this loop gets its own gates instead of
11
+ being folded into either neighbour.
12
+
13
+ ## Stages
14
+
15
+ | # | Stage | Type | Skills | Gate |
16
+ |---|---|---|---|---|
17
+ | 1 | `plan` | generate | [`migration-plan`](../../skills/migration-plan/SKILL.md) | — |
18
+ | 2 | `ready` | verify | [`launch-readiness`](../../skills/launch-readiness/SKILL.md) | **G2.5** review |
19
+ | 3 | `announce` | generate | [`release-notes`](../../skills/release-notes/SKILL.md) | — |
20
+ | 4 | `go` | gate | [`council-review`](../../skills/council-review/SKILL.md) | **G2.6** human |
21
+
22
+ ## How to run this loop
23
+
24
+ 1. **Plan the rollout and the way back.** `migration-plan` sets out the phases, a tested
25
+ rollback for each one, and at most one named point of no return. For a code-only change
26
+ behind a flag, the plan can be short: the flag, the stages and how to turn it off. It still
27
+ has to exist.
28
+ 2. **Judge readiness at G2.5.** `launch-readiness` lists the change's own failure modes, then
29
+ checks rollback, detection, response, measured targets, data and privacy, comms and
30
+ exposure, each with evidence. `REVISE` returns to `plan`, and the report names which gap to
31
+ close and which skill closes it. A missing rollback is `BLOCKED` on its own.
32
+ 3. **Announce only once it is ready.** `release-notes` drafts the customer-facing and
33
+ internal notes from the git range. Writing them before G2.5 risks announcing a launch that
34
+ then does not happen.
35
+ 4. **A human decides at G2.6.** The release owner decides whether to ship *now*, given
36
+ timing, freeze windows and on-call coverage. When that decision is contested, use
37
+ `council-review`. `RECONSIDER` means it is ready but this is the wrong time, and the work
38
+ waits instead of going back to `plan`.
39
+
40
+ After `PROCEED`, the change is live and the work moves to `operate`. Gaps that G2.5 sent to
41
+ `observability-plan` or `runbook-generator` are the first things `operate` picks up.
42
+
43
+ ## Verdicts
44
+
45
+ Defined in [`contracts/terminals.json`](../../contracts/terminals.json). G2.5 emits `PROCEED`,
46
+ `PROCEED WITH CONDITIONS`, `REVISE` or `BLOCKED`. G2.6 adds `RECONSIDER`. `PROCEED WITH
47
+ CONDITIONS` at G2.5 is allowed only when the open rows are comms or exposure. A detection or
48
+ response gap is always `REVISE`.
49
+
50
+ ## Non-interactive runs
51
+
52
+ Never invent evidence such as rehearsal logs, load-test numbers, dashboards or sign-offs.
53
+ When the change being released cannot be identified, emit `BLOCKED: need <the PR, tag, or
54
+ feature name>`. G2.6 is a human gate. A headless run stops after `announce` and reports the
55
+ G2.5 verdict for a person to act on.
56
+
57
+ ## When a stage's skill is not installed
58
+
59
+ Name the missing skill and skilldrop as its source, do the minimal inline version of that
60
+ stage, and record the stage as degraded. For `ready`, the minimal version is the seven checks
61
+ written as a list, each marked met, not met or n/a with a reason. Skipping it is never the
62
+ minimal version.
63
+
64
+ ## Quality bar
65
+
66
+ - **Rollback exists before readiness is judged.** A plan with no way back is the one thing that cannot be fixed after launch.
67
+ - **Readiness rests on evidence.** Every check links to something; "we're good" is `not met`.
68
+ - **Can and should are separate gates.** G2.5 says whether it can ship; G2.6 says whether it should ship now.
69
+ - **Detection gaps leave this loop as hand-offs.** `operate` picks them up first, rather than discovering them during the first incident.
70
+
71
+ ## Anti-patterns to avoid
72
+
73
+ - ❌ **Jumping from merge to "instrument a running service".** That skips this loop entirely, which is the gap it exists to close.
74
+ - ❌ **Announcing before G2.5.** Customers hear about a launch that is then pulled.
75
+ - ❌ **Treating flag-off as a rollback without a data story.** If dual-write or a backfill has run, turning the flag off does not undo the data.
76
+ - ❌ **Letting G2.6 overrule a G2.5 `BLOCKED`.** A human can delay a ready launch; they cannot make an unready one ready by deciding to go.
@@ -0,0 +1,47 @@
1
+ {
2
+ "$comment": "RFC-0031. Covers the step between build (ends at merge, G2.1) and operate (starts at instrument). The gate ids sit between G2 and G3 to match where the loop sits in the lifecycle.",
3
+ "name": "release",
4
+ "version": "0.1.0",
5
+ "description": "Take merged code to live users through a planned, reversible rollout — plan the phases and the rollback, judge readiness on evidence, draft the release notes, then a human makes the go/no-go call. Use when the user has merged a change and asks how to roll it out, whether they are ready to launch, or for a go/no-go decision.",
6
+ "entrypoint": "LOOP.md",
7
+ "kind": "loop",
8
+ "cap": 3,
9
+ "stages": [
10
+ {
11
+ "id": "plan",
12
+ "type": "generate",
13
+ "intent": "Decide the rollout phases, the rollback for each, and the one point of no return, before anything reaches users.",
14
+ "skills": ["migration-plan"]
15
+ },
16
+ {
17
+ "id": "ready",
18
+ "type": "verify",
19
+ "intent": "Judge on evidence whether the change can go live: rollback, detection, response, measured targets, data, comms, exposure.",
20
+ "skills": ["launch-readiness"],
21
+ "gate": {
22
+ "id": "G2.5",
23
+ "kind": "review",
24
+ "verdicts": ["PROCEED", "PROCEED WITH CONDITIONS", "REVISE", "BLOCKED"],
25
+ "revise_to": "plan"
26
+ }
27
+ },
28
+ {
29
+ "id": "announce",
30
+ "type": "generate",
31
+ "intent": "Write what users and the team are told. Only after readiness, so nobody announces a launch that then fails the check.",
32
+ "skills": ["release-notes"]
33
+ },
34
+ {
35
+ "id": "go",
36
+ "type": "gate",
37
+ "intent": "A human decides whether it should ship now. Readiness says it can; this decides timing, freeze windows, and who is on call.",
38
+ "skills": ["council-review"],
39
+ "gate": {
40
+ "id": "G2.6",
41
+ "kind": "human",
42
+ "verdicts": ["PROCEED", "PROCEED WITH CONDITIONS", "REVISE", "RECONSIDER", "BLOCKED"],
43
+ "revise_to": "plan"
44
+ }
45
+ }
46
+ ]
47
+ }
@@ -146,6 +146,10 @@
146
146
  "tier": "standard",
147
147
  "rationale": "Extracts architecture from code/IaC. Escalate to heavy on large codebases where cross-file inference is heavy."
148
148
  },
149
+ "launch-readiness": {
150
+ "tier": "standard",
151
+ "rationale": "Checks evidence against a fixed checklist. Bounded synthesis, not adversarial review."
152
+ },
149
153
  "runbook-generator": {
150
154
  "tier": "standard",
151
155
  "rationale": "Operational doc from service facts. Bounded synthesis."
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skilldrop-cli",
3
- "version": "0.13.0",
3
+ "version": "0.13.1",
4
4
  "description": "Portable AI-agent skills for the deliverables knowledge workers ship \u2014 diagrams, ADRs, PRDs, runbooks, decks, reviews \u2014 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",
package/packs.json CHANGED
@@ -46,7 +46,7 @@
46
46
  },
47
47
  "dev-team": {
48
48
  "description": "Build-and-ship loop: story implementation with adversarial review, test plans, triage, migrations, release notes, agent-policy files, and code-quality gates.",
49
- "loops": ["build", "ship-a-draft"],
49
+ "loops": ["build", "release", "ship-a-draft"],
50
50
  "skills": [
51
51
  "agents-md-generator",
52
52
  "user-story-splitter",
@@ -62,18 +62,20 @@
62
62
  "sonar-review",
63
63
  "accessibility-audit",
64
64
  "output-hygiene",
65
- "contribution-wizard"
65
+ "contribution-wizard",
66
+ "launch-readiness"
66
67
  ]
67
68
  },
68
69
  "sre-oncall": {
69
70
  "description": "Operate the service: runbooks, observability design, incident communications, postmortems, and capacity/cost models.",
70
- "loops": ["operate"],
71
+ "loops": ["release", "operate"],
71
72
  "skills": [
72
73
  "runbook-generator",
73
74
  "observability-plan",
74
75
  "incident-comms",
75
76
  "postmortem-generator",
76
- "capacity-cost-model"
77
+ "capacity-cost-model",
78
+ "launch-readiness"
77
79
  ]
78
80
  },
79
81
  "stakeholder-comms": {
@@ -191,7 +193,8 @@
191
193
  "observability-plan",
192
194
  "release-notes",
193
195
  "incident-comms",
194
- "postmortem-generator"
196
+ "postmortem-generator",
197
+ "launch-readiness"
195
198
  ]
196
199
  },
197
200
  "explain-it-to-decision-makers": {
@@ -0,0 +1,95 @@
1
+ ---
2
+ name: launch-readiness
3
+ description: Produce a go/no-go launch readiness report for a merged change before it goes live — one row per check (rollback path, alert and runbook per new failure mode, NFR targets measured, comms drafted, data/privacy sign-off), each with an owner, evidence link, and met / not met / n/a-because status, ending in a PROCEED / PROCEED WITH CONDITIONS / REVISE / BLOCKED verdict. Use when the user asks "are we ready to launch", "go/no-go", "production readiness review", "launch checklist", or "can we ship this to users".
4
+ ---
5
+
6
+ # launch-readiness
7
+
8
+ You judge whether a change that is already merged *can* go live, using evidence rather than
9
+ reassurance. The output is a readiness report a release owner can act on in five minutes.
10
+ Whether it *should* go live now (timing, freeze windows, who is on call) is a separate human
11
+ decision. That belongs to `council-review` or the release owner, not to this report.
12
+
13
+ ## How to respond
14
+
15
+ 1. **Pin down what is launching.** You need: the change (a PR, a release tag, or a feature
16
+ name), who it reaches (internal, a percentage, everyone), and the release owner. If the
17
+ change itself is unknown, ask. You may ask at most 2 questions. A missing reach or owner
18
+ becomes an `[assumption]` to confirm. Everything else becomes a row that is `not met`
19
+ because evidence is missing.
20
+
21
+ 2. **List the new failure modes first.** Before any checklist, write 3–5 ways this specific
22
+ change could hurt users or data once it is live. Read them from the diff, the design doc or
23
+ the migration plan. Each later check is judged against this list. A generic checklist with
24
+ no failure modes is a ritual.
25
+
26
+ 3. **Fill [`templates/readiness-report.md`](templates/readiness-report.md).** It has one row
27
+ per check, and every row carries:
28
+ - **Status:** `met`, `not met`, or `n/a — <reason>`. `n/a` without a reason counts as `not met`.
29
+ - **Evidence:** a link, a command output, or a file path. A row with no evidence counts as
30
+ `not met`, however confident the user sounds. Evidence must cover the path the failure
31
+ mode touches; if it is unclear what it covered (which endpoint a load test hit), tag it
32
+ `[assumption]`.
33
+ - **Owner:** a role, not a person's name.
34
+
35
+ 4. **Apply the checks in this order.** The order matters: the first ones are the costliest to
36
+ discover after launch.
37
+ 1. **Rollback.** It must be a tested path back, with its data story stated. If a data or
38
+ schema change is involved and no plan exists, hand off to `migration-plan`.
39
+ 2. **Detection.** Each new failure mode needs an alert that fires before users complain. If
40
+ one is missing, hand off to `observability-plan`.
41
+ 3. **Response.** Each such alert needs a runbook entry. If one is missing, hand off to
42
+ `runbook-generator`.
43
+ 4. **Quality targets.** Every target in `nfr-spec` (latency, availability, scale) must be
44
+ *measured*, for example by a load test or canary result. A target that is only asserted
45
+ does not count.
46
+ 5. **Data and privacy.** New personal data, retention changes or new processors need a
47
+ named sign-off, or `n/a — <reason>`.
48
+ 6. **Comms.** User-facing notes are drafted (see `release-notes`), support is briefed, and
49
+ the status page owner is known if the launch is risky.
50
+ 7. **Exposure.** The first exposure is staged (flag, percentage or cohort), or there is a
51
+ stated reason why all-at-once is safe.
52
+
53
+ 5. **Give the verdict.** It is the last line, with exactly one reason:
54
+ - `PROCEED`: every row is `met` or `n/a — <reason>`.
55
+ - `PROCEED WITH CONDITIONS`: only rows 6–7 are open, and each open row has an owner and a
56
+ date. The open rows travel with the release.
57
+ - `REVISE`: any row 2–5 is `not met`. Name the row and the hand-off that fixes it.
58
+ - `BLOCKED`: rollback is `not met`, or the change or its reach is unknown. A missing
59
+ rollback blocks on its own, whatever else passes.
60
+
61
+ **Non-interactive runs** (CI, subagent, headless): never invent evidence such as test results,
62
+ dashboards or sign-offs. Tag a guessed fact `[assumption]` and list it first. If the change
63
+ being launched cannot be identified, emit `BLOCKED: need <the PR, tag, or feature name>`.
64
+
65
+ ## Useful references in this skill
66
+
67
+ - [`templates/readiness-report.md`](templates/readiness-report.md) — the report skeleton, one row per check.
68
+ - [`examples/schema-change-revise.md`](examples/schema-change-revise.md) — a worked report for a schema change that comes out `REVISE`.
69
+
70
+ ## Quality bar
71
+
72
+ - **Every row has evidence or is `not met`.** Readiness asserted is not readiness.
73
+ - **The failure modes are specific to this change.** "The service could go down" is true of everything and checks nothing.
74
+ - **Rollback is judged first and can block alone.** Every other gap can be fixed while live; an irreversible launch with no way back cannot.
75
+ - **The verdict follows mechanically from the rows.** Two reviewers given the same rows reach the same verdict.
76
+ - **Owners are roles.** "Payments on-call", not a person who will change teams.
77
+
78
+ ## When to use this skill
79
+
80
+ - ✅ A merged change is about to reach users and someone asks "are we ready?"
81
+ - ✅ A production readiness review needs a written go/no-go record.
82
+ - ✅ The `ready` stage of the `release` loop.
83
+
84
+ ## When NOT to use this skill
85
+
86
+ - ❌ Deciding whether to *merge*. That is `pre-merge-review`'s gate, which happens earlier.
87
+ - ❌ Planning the rollout phases themselves. That is `migration-plan`; this skill checks that the plan exists and has been rehearsed.
88
+ - ❌ Choosing *when* to launch. Timing and freeze windows are the release owner's call, or `council-review`'s if they are contested.
89
+
90
+ ## Anti-patterns to avoid
91
+
92
+ - ❌ **A generic checklist with every box ticked.** If no row is `not met` on a non-trivial launch, the evidence was not checked.
93
+ - ❌ **`n/a` as a way out.** Data and privacy marked `n/a` with no reason is the most common way a launch skips a review it needed.
94
+ - ❌ **Letting a strong row offset a missing rollback.** Great dashboards do not make an irreversible launch safe.
95
+ - ❌ **Writing the runbook or the alert inside this report.** Name the gap and hand it off; a readiness report that also drafts fixes becomes too long to read.
@@ -0,0 +1,10 @@
1
+ [
2
+ { "query": "Are we ready to launch this to users on Monday?", "should_trigger": true },
3
+ { "query": "Run a go/no-go check on the checkout redesign before we turn it on", "should_trigger": true },
4
+ { "query": "Do a production readiness review for the new search service", "should_trigger": true },
5
+ { "query": "Give me a launch checklist for this release and tell me what's missing", "should_trigger": true },
6
+ { "query": "Is this PR safe to merge?", "should_trigger": false },
7
+ { "query": "Plan the phased rollout and backfill for moving users to the new auth provider", "should_trigger": false },
8
+ { "query": "Write the release notes for everything since v2.3", "should_trigger": false },
9
+ { "query": "Write the runbook for the payments service", "should_trigger": false }
10
+ ]
@@ -0,0 +1,19 @@
1
+ {
2
+ "skill_name": "launch-readiness",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "prompt": "Are we ready to launch? PR #412 adds a `loyalty_points` column to `customers`, backfills it from order history, and shows points on the checkout page. Going to 100% of users Thursday. Load test hit p99 180ms against a 250ms target (link: grafana/d/lt-412). We have a dashboard but haven't added alerts yet. Support hasn't been told.",
7
+ "assertions": [
8
+ "Lists 3-5 failure modes specific to this change (e.g. backfill load on customers, wrong point totals shown at checkout) before the checklist",
9
+ "Every check row has a status of met, not met, or n/a with a reason, plus an evidence column and an owner expressed as a role",
10
+ "Rollback is the first row and is not met, because no tested rollback or data story was supplied",
11
+ "Detection is not met because no alerts exist, and the report hands off to observability-plan rather than drafting the alert inline",
12
+ "The quality-targets row is met and cites the supplied load-test link as evidence",
13
+ "Exposure is flagged because a 100% launch is not staged and no reason is given for why all-at-once is safe",
14
+ "The verdict is BLOCKED, and the reason given is the missing rollback",
15
+ "No dashboards, test results, or sign-offs are invented beyond what the prompt supplied"
16
+ ]
17
+ }
18
+ ]
19
+ }
@@ -0,0 +1,54 @@
1
+ # Worked example — schema change that comes out REVISE
2
+
3
+ ## Input given to the skill
4
+
5
+ > Go/no-go for release `orders-v4.2`. It splits `orders.address` into `shipping_address_id`
6
+ > pointing at a new `addresses` table. We followed the migration plan
7
+ > (docs/migrations/orders-address.md): expand and backfill are done in staging, and dual-write
8
+ > is behind the flag `orders.address_split`. Rollback is "turn the flag off". It was rehearsed
9
+ > in staging on 2026-09-28 (log: ci/run/88213). The p99 target for order reads is 120ms, and
10
+ > the canary at 5% shows 96ms (grafana/d/orders-canary). The existing `orders-5xx` alert
11
+ > covers this. Release notes are drafted in PR #977. Plan is 5% → 50% → 100% over three days.
12
+
13
+ ---
14
+
15
+ # Launch readiness — orders-v4.2 (address split)
16
+
17
+ **Change:** release `orders-v4.2` · **Reach:** 5% → 50% → 100% over 3 days · **Release owner:** Orders tech lead
18
+ **Assessed:** 2026-10-01 · **Inputs:** migration plan, staging rollback log, canary dashboard, PR #977
19
+
20
+ ## New failure modes
21
+
22
+ | # | Failure mode | Who is hurt | Reversible? |
23
+ |---|---|---|---|
24
+ | F1 | Dual-write diverges: an order is saved with an `addresses` row that doesn't match `orders.address` | Customers shipped to the wrong address | Partly. Data can be fixed, parcels already sent cannot |
25
+ | F2 | The read path picks the new column before the backfill is complete for that tenant | Customers who see a blank address at checkout | Yes, by turning the flag off |
26
+ | F3 | The extra join pushes order reads past p99 under full load | All checkout users | Yes, by turning the flag off |
27
+
28
+ ## Checks
29
+
30
+ | # | Check | Covers | Status | Evidence | Owner |
31
+ |---|---|---|---|---|---|
32
+ | 1 | Rollback | all | met | Flag-off rehearsed in staging, ci/run/88213. While the old column is still written, flag-off loses no data | Orders on-call |
33
+ | 2 | Detection | F1–F3 | **not met** | `orders-5xx` catches F3 errors only. Nothing detects F1 divergence or F2 blank reads, because both return 200 | Orders on-call |
34
+ | 3 | Response | F1–F3 | **not met** | There is no runbook entry for divergence. `orders-5xx` has a runbook entry, but it does not mention the flag | Orders on-call |
35
+ | 4 | Quality targets | F3 | met | Canary p99 96ms against a 120ms target at 5%, grafana/d/orders-canary | Orders tech lead |
36
+ | 5 | Data & privacy | — | n/a — no new personal data. Address data moves between tables, and retention and processors are unchanged | Migration plan §2 | Data protection lead |
37
+ | 6 | Comms | — | met | Release notes drafted in PR #977. No customer-visible change | Orders tech lead |
38
+ | 7 | Exposure | — | met | Staged 5% → 50% → 100% behind `orders.address_split` | Release owner |
39
+
40
+ ## Open items
41
+
42
+ - Row 2: add a reconciliation metric for dual-write divergence, and an alert on any non-zero count, plus an alert on blank-address reads. Orders on-call, before the 5% → 50% step. Hand off to `observability-plan`.
43
+ - Row 3: add a runbook entry for "divergence alert fires" (flag off, then run the reconciler), and add the flag to the `orders-5xx` entry. Orders on-call, same deadline. Hand off to `runbook-generator`.
44
+
45
+ ## Verdict
46
+
47
+ **REVISE.** Row 2 is not met: the two failure modes that do lasting damage (F1, F2) return 200, so nothing would detect them. Fix rows 2 and 3, then run readiness again.
48
+
49
+ ---
50
+
51
+ **Why this is a good output:** the rollback is genuinely in place, so the verdict is REVISE and
52
+ not BLOCKED. The report notices that an existing alert covering the change only catches the
53
+ failure that is easiest to undo. It does not draft the alert or runbook itself; it names the
54
+ gap, the owner and the hand-off.
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "launch-readiness",
3
+ "version": "0.1.0",
4
+ "description": "Produce a go/no-go launch readiness report for a merged change before it goes live — one row per check (rollback path, alert and runbook per new failure mode, NFR targets measured, comms drafted, data/privacy sign-off), each with an owner, evidence link, and met / not met / n/a-because status, ending in a PROCEED / PROCEED WITH CONDITIONS / REVISE / BLOCKED verdict. Use when the user asks \"are we ready to launch\", \"go/no-go\", \"production readiness review\", \"launch checklist\", or \"can we ship this to users\".",
5
+ "entrypoint": "SKILL.md",
6
+ "deps": { "npm": [], "pip": [] },
7
+ "env": { "required": [], "optional": [] },
8
+ "related": [
9
+ "migration-plan",
10
+ "observability-plan",
11
+ "runbook-generator",
12
+ "nfr-spec",
13
+ "release-notes",
14
+ "council-review",
15
+ "pre-merge-review"
16
+ ],
17
+ "handoff": [
18
+ { "to": "migration-plan", "when": "the change has no tested rollback path", "purpose": "Plan the phases and the rollback, and name the point of no return, before readiness is judged again.", "fallback": "If migration-plan is absent, write the rollback as numbered steps with its data story inline, and mark the row not met until someone has rehearsed it." },
19
+ { "to": "observability-plan", "when": "a new failure mode has no alert", "purpose": "Define the SLI and the burn-rate alert that would detect it.", "fallback": "If observability-plan is absent, name the symptom, the metric that shows it, and a threshold inline, tagged [assumption] for the owner to confirm." },
20
+ { "to": "runbook-generator", "when": "an alert exists but has no runbook entry", "purpose": "Write the procedure the on-call follows when that alert fires.", "fallback": "If runbook-generator is absent, write recognise / mitigate / escalate as three lines under the row, and keep the row not met until the on-call owner has reviewed them." }
21
+ ],
22
+ "tags": ["launch", "release", "readiness", "go-no-go", "production-readiness"],
23
+ "model": { "tier": "standard", "rationale": "Checks evidence against a fixed checklist. Bounded synthesis, not adversarial review." }
24
+ }
@@ -0,0 +1,41 @@
1
+ # Launch readiness — {change name}
2
+
3
+ **Change:** {PR / tag / feature} · **Reach:** {internal / N% / cohort / everyone} · **Release owner:** {role}
4
+ **Assessed:** {YYYY-MM-DD} · **Inputs:** {what was read — diff, design doc, migration plan, dashboards}
5
+
6
+ > **Assumptions to confirm first** (omit if none)
7
+ > - `[assumption]` {fact guessed rather than given}
8
+
9
+ ## New failure modes
10
+
11
+ What this change, specifically, could do to users or data once live.
12
+
13
+ | # | Failure mode | Who is hurt | Reversible? |
14
+ |---|---|---|---|
15
+ | F1 | {e.g. backfill locks `orders` table under peak write load} | {checkout users} | {yes / no / partly} |
16
+ | F2 | | | |
17
+ | F3 | | | |
18
+
19
+ ## Checks
20
+
21
+ Status is `met`, `not met`, or `n/a — <reason>`. No evidence means `not met`.
22
+
23
+ | # | Check | Covers | Status | Evidence | Owner |
24
+ |---|---|---|---|---|---|
25
+ | 1 | **Rollback** — tested path back, data story stated | all | | {link / command output} | {role} |
26
+ | 2 | **Detection** — an alert per failure mode, fires before users complain | F1–F3 | | | |
27
+ | 3 | **Response** — a runbook entry per alert in row 2 | F1–F3 | | | |
28
+ | 4 | **Quality targets** — each NFR target measured, not asserted | | | | |
29
+ | 5 | **Data & privacy** — sign-off for new personal data, retention, or processors | | | | |
30
+ | 6 | **Comms** — release notes drafted, support briefed, status-page owner known | | | | |
31
+ | 7 | **Exposure** — first exposure staged, or why all-at-once is safe | | | | |
32
+
33
+ ## Open items
34
+
35
+ One line per `not met` row: what closes it, who, by when, and the hand-off if any.
36
+
37
+ - Row {n}: {what closes it} — {owner role}, {date} → {`migration-plan` / `observability-plan` / `runbook-generator` / none}
38
+
39
+ ## Verdict
40
+
41
+ **{PROCEED | PROCEED WITH CONDITIONS | REVISE | BLOCKED}** — {the one reason, naming the row}.