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.
Files changed (73) hide show
  1. package/README.md +8 -7
  2. package/bin/skilldrop.js +15 -10
  3. package/catalogue.json +13 -2
  4. package/contracts/catalogue.schema.json +2 -1
  5. package/model-routing.json +12 -8
  6. package/package.json +1 -1
  7. package/packs/ai-engineering/skills/judge-audit/SKILL.md +28 -11
  8. package/packs/ai-engineering/skills/judge-audit/evals/evals.json +30 -0
  9. package/packs/ai-engineering/skills/judge-audit/evals/files/12/judge_runs.csv +241 -0
  10. package/packs/ai-engineering/skills/judge-audit/evals/files/12/rosa_labels.csv +33 -0
  11. package/packs/ai-engineering/skills/judge-audit/evals/files/13/moderation_eval.csv +601 -0
  12. package/packs/ai-engineering/skills/judge-audit/manifest.json +2 -2
  13. package/packs/ai-engineering/skills/mcp-pairing/manifest.json +1 -1
  14. package/packs/ai-engineering/skills/mcp-pairing/reference.md +4 -3
  15. package/packs/ai-engineering/skills/subagent-design/SKILL.md +1 -0
  16. package/packs/ai-engineering/skills/subagent-design/examples/help-center-localization.md +146 -0
  17. package/packs/ai-engineering/skills/subagent-design/manifest.json +2 -2
  18. package/packs/api-builder/skills/prompt-caching-advisor/SKILL.md +4 -0
  19. package/packs/api-builder/skills/prompt-caching-advisor/examples/support-bot-block-order.md +120 -0
  20. package/packs/api-builder/skills/prompt-caching-advisor/manifest.json +2 -2
  21. package/packs/civil-architect/pack.json +60 -0
  22. package/packs/civil-architect/skills/floor-plan-layout/SKILL.md +103 -0
  23. package/packs/civil-architect/skills/floor-plan-layout/evals/eval_queries.json +30 -0
  24. package/packs/civil-architect/skills/floor-plan-layout/evals/evals.json +57 -0
  25. package/packs/civil-architect/skills/floor-plan-layout/evals/files/4/adu-programme.md +12 -0
  26. package/packs/civil-architect/skills/floor-plan-layout/examples/ground-floor.md +65 -0
  27. package/packs/civil-architect/skills/floor-plan-layout/examples/ground-floor.svg +135 -0
  28. package/packs/civil-architect/skills/floor-plan-layout/manifest.json +34 -0
  29. package/packs/civil-architect/skills/floor-plan-layout/scripts/plan_check.py +449 -0
  30. package/packs/civil-architect/skills/floor-plan-layout/templates/plan.json +38 -0
  31. package/packs/dev-team/loops/release/LOOP.md +4 -4
  32. package/packs/dev-team/loops/release/loop.json +1 -1
  33. package/packs/dev-team/skills/bug-triage/SKILL.md +1 -0
  34. package/packs/dev-team/skills/bug-triage/examples/export-row-limit-escalation.md +126 -0
  35. package/packs/dev-team/skills/bug-triage/manifest.json +2 -2
  36. package/packs/product-manager/skills/prd-draft/SKILL.md +1 -0
  37. package/packs/product-manager/skills/prd-draft/examples/approver-delay-not-slack.md +142 -0
  38. package/packs/product-manager/skills/prd-draft/manifest.json +2 -2
  39. package/profiles.json +1 -1
  40. package/packs/ai-engineering/loops/adopt/LOOP.md +0 -120
  41. package/packs/ai-engineering/loops/adopt/evals/eval_queries.json +0 -10
  42. package/packs/ai-engineering/loops/adopt/evals/evals.json +0 -69
  43. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/ai-ideas.md +0 -15
  44. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/org-context.md +0 -27
  45. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/staff-survey.csv +0 -11
  46. package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/ai-ideas.md +0 -13
  47. package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/firm-context.md +0 -23
  48. package/packs/ai-engineering/loops/adopt/loop.json +0 -53
  49. package/packs/career/loops/apply/LOOP.md +0 -97
  50. package/packs/career/loops/apply/evals/eval_queries.json +0 -9
  51. package/packs/career/loops/apply/evals/evals.json +0 -55
  52. package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/application-form.md +0 -10
  53. package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/job-posting.md +0 -33
  54. package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/resume.md +0 -34
  55. package/packs/career/loops/apply/evals/files/apply-fit-gate-hard-requirement/cv.md +0 -27
  56. package/packs/career/loops/apply/evals/files/apply-fit-gate-hard-requirement/warehouse-supervisor.md +0 -30
  57. package/packs/career/loops/apply/loop.json +0 -52
  58. package/packs/product-manager/loops/discover/LOOP.md +0 -82
  59. package/packs/product-manager/loops/discover/evals/eval_queries.json +0 -30
  60. package/packs/product-manager/loops/discover/evals/evals.json +0 -54
  61. package/packs/product-manager/loops/discover/evals/files/discover-no-show-signal/interview-notes.md +0 -63
  62. package/packs/product-manager/loops/discover/evals/files/discover-no-show-signal/support-tickets.csv +0 -13
  63. package/packs/product-manager/loops/discover/evals/files/discover-vp-loyalty-no-evidence/vp-message.txt +0 -13
  64. package/packs/product-manager/loops/discover/loop.json +0 -41
  65. package/packs/sre-oncall/loops/operate/LOOP.md +0 -84
  66. package/packs/sre-oncall/loops/operate/evals/eval_queries.json +0 -30
  67. package/packs/sre-oncall/loops/operate/evals/evals.json +0 -53
  68. package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/alerts.log +0 -22
  69. package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/incident-chat.txt +0 -27
  70. package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/service-notes.md +0 -46
  71. package/packs/sre-oncall/loops/operate/evals/files/operate-incident-still-open/oncall-log.txt +0 -17
  72. package/packs/sre-oncall/loops/operate/evals/files/operate-incident-still-open/runbook-webhooks.md +0 -38
  73. package/packs/sre-oncall/loops/operate/loop.json +0 -41
@@ -0,0 +1,38 @@
1
+ {
2
+ "title": "Ground floor, house on Plot 14",
3
+ "units": "m",
4
+ "north": 15,
5
+ "wall": 0.23,
6
+ "min_door_width": 0.8,
7
+ "outline": [[0, 0], [10, 0], [10, 9], [0, 9]],
8
+ "rooms": [
9
+ {"name": "Foyer", "rect": [0, 0, 2.5, 2.4], "target_area": 6},
10
+ {"name": "Stair", "rect": [0, 2.4, 2.5, 2.4]},
11
+ {"name": "Living", "rect": [2.5, 0, 5.4, 4.8], "target_area": 25.9, "min_width": 3.6, "habitable": true},
12
+ {"name": "Prayer room", "rect": [7.9, 0, 2.1, 2.2], "target_area": 4.5, "habitable": true},
13
+ {"name": "Dining", "rect": [0, 4.8, 3.4, 4.2], "target_area": 14, "habitable": true},
14
+ {"name": "Kitchen", "rect": [3.4, 4.8, 3.0, 4.2], "target_area": 12.6, "habitable": true},
15
+ {"name": "Utility", "rect": [6.4, 4.8, 1.6, 2.3], "target_area": 4},
16
+ {"name": "Toilet", "rect": [6.4, 7.1, 1.6, 1.9], "target_area": 3.2},
17
+ {"name": "Hall", "rects": [[7.9, 2.2, 2.1, 2.6], [8.0, 4.8, 2.0, 4.2]]}
18
+ ],
19
+ "doors": [
20
+ {"between": ["outside", "Foyer"], "at": [1.25, 0], "width": 1.0},
21
+ {"between": ["Foyer", "Living"], "at": [2.5, 1.2], "width": 0.9},
22
+ {"between": ["Foyer", "Stair"], "at": [1.25, 2.4], "width": 0.9},
23
+ {"between": ["Living", "Dining"], "at": [2.95, 4.8], "width": 0.9},
24
+ {"between": ["Living", "Prayer room"], "at": [7.9, 1.1], "width": 0.8},
25
+ {"between": ["Living", "Hall"], "at": [7.9, 3.5], "width": 0.9},
26
+ {"between": ["Dining", "Kitchen"], "at": [3.4, 6.9], "width": 0.9},
27
+ {"between": ["Kitchen", "Utility"], "at": [6.4, 6.0], "width": 0.8},
28
+ {"between": ["Hall", "Toilet"], "at": [8.0, 8.0], "width": 0.8},
29
+ {"between": ["Hall", "outside"], "at": [9.0, 9], "width": 0.9}
30
+ ],
31
+ "windows": [
32
+ {"room": "Living", "at": [5.2, 0], "width": 2.4},
33
+ {"room": "Dining", "at": [0, 6.9], "width": 1.5},
34
+ {"room": "Kitchen", "at": [4.9, 9], "width": 1.2},
35
+ {"room": "Prayer room", "at": [10, 1.1], "width": 0.9},
36
+ {"room": "Toilet", "at": [7.2, 9], "width": 0.6}
37
+ ]
38
+ }
@@ -5,7 +5,7 @@ description: Take merged code to live users through a planned, reversible rollou
5
5
 
6
6
  # release
7
7
 
8
- This loop covers the step between `build`, which ends when a human merges, and `operate`,
8
+ This loop covers the step between `build`, which ends when a human merges, and running the service,
9
9
  which assumes the service is already live. A merge can be undone with a revert. A launch that
10
10
  has touched users or data often cannot be undone, so this loop gets its own gates instead of
11
11
  being folded into either neighbour.
@@ -39,8 +39,8 @@ being folded into either neighbour.
39
39
  `council-review`. `RECONSIDER` means it is ready but this is the wrong time, and the work
40
40
  waits instead of going back to `plan`.
41
41
 
42
- After `PROCEED`, the change is live and the work moves to `operate`. Gaps that G3 sent to
43
- `observability-plan` or `runbook-generator` are the first things `operate` picks up.
42
+ After `PROCEED`, the change is live and the work moves to running it. Gaps that G3 sent to
43
+ `observability-plan` or `runbook-generator` are the first things to pick up there.
44
44
 
45
45
  ## Verdicts
46
46
 
@@ -83,7 +83,7 @@ which end in `BLOCKED`.
83
83
  - **Rollback exists before readiness is judged.** A plan with no way back is the one thing that cannot be fixed after launch.
84
84
  - **Readiness rests on evidence.** Every check links to something; "we're good" is `not met`.
85
85
  - **Can and should are separate gates.** G3 says whether it can ship; G3.1 says whether it should ship now.
86
- - **Detection gaps leave this loop as hand-offs.** `operate` picks them up first, rather than discovering them during the first incident.
86
+ - **Detection gaps leave this loop as hand-offs.** Running the service starts with them, rather than discovering them during the first incident.
87
87
 
88
88
  ## Anti-patterns to avoid
89
89
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$comment": "RFC-0031. Covers the step between build (ends at merge, G2.1) and operate (starts at instrument). Its gates are G3 and G3.1: the whole number places the loop in the lifecycle (discover G0 through operate G4), and a decimal is a second gate inside the same loop (RFC-0044).",
3
3
  "name": "release",
4
- "version": "0.4.0",
4
+ "version": "0.4.1",
5
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
6
  "entrypoint": "LOOP.md",
7
7
  "kind": "loop",
@@ -33,6 +33,7 @@ Converts the bug report someone *sent* into the ticket an engineer can *start*
33
33
  ## Useful references in this skill
34
34
 
35
35
  - [`templates/bug-ticket.md`](templates/bug-ticket.md) — the ticket skeleton with the severity/priority matrix and the no-repro diagnostics list
36
+ - [`examples/export-row-limit-escalation.md`](examples/export-row-limit-escalation.md) — worked example: a VP's S1/P1 for "exports losing data" that the log shows is a 10,000-row CSV cap, filed S3/P2
36
37
 
37
38
  ## Quality bar
38
39
 
@@ -0,0 +1,126 @@
1
+ # Worked example: an escalated "exports are losing data" report
2
+
3
+ Input → output oracle for `bug-triage`. Shows severity judged from the evidence rather than
4
+ the escalation, a paraphrased error replaced by the verbatim string, and a three-symptom
5
+ thread split into one bug, one more bug and one feature request.
6
+
7
+ ## Input
8
+
9
+ > Can you turn this into a ticket for the Reports squad? Our VP of Customer Success wants it
10
+ > filed as S1/P1 today. Tallow & Finch renew next month and they're furious.
11
+ >
12
+ > **#cs-escalations (pasted):**
13
+ >
14
+ > **Dana (CSM), 09:12:** Tallow & Finch say exports are losing data. Their ops lead exported
15
+ > the Shipment Activity report for October and "half the shipments are gone". Got some random
16
+ > error when it finished. Started after last week's release I think.
17
+ >
18
+ > **Dana, 09:14:** Also their dates come out as MM/DD in the CSV even though their account is
19
+ > set to DD/MM. And they asked again for scheduled exports to SFTP.
20
+ >
21
+ > **Dana, 09:20:** Screenshot text from their ops lead: "Export ready. Some rows may not be
22
+ > included. (EXPORT_ROW_LIMIT_REACHED)"
23
+ >
24
+ > **Marco (support engineer), 09:41:** Pulled the job log:
25
+ >
26
+ > ```
27
+ > 2026-11-04T08:57:31Z export_job id=exp_88213 tenant=tallow-finch.example
28
+ > report=shipment_activity range=2026-10-01..2026-10-31 format=csv status=completed
29
+ > rows_matched=14212 rows_written=10000 warning=EXPORT_ROW_LIMIT_REACHED app=5.18.2
30
+ > ```
31
+ >
32
+ > **Marco, 09:43:** The shipments are all there in the app, btw. The report shows 14,212 rows
33
+ > on screen.
34
+
35
+ ## Output
36
+
37
+ Filed as **S3/P2, not S1/P1.** Nothing stored was lost: the app still shows all 14,212 rows.
38
+ The export file stops at 10,000. That is a real bug with a likely workaround. The VP can raise
39
+ the priority to P1 for the renewal, but that changes priority only. The severity stays S3.
40
+ The thread also held two other items, split out at the bottom.
41
+
42
+ ```markdown
43
+ # CSV export of Shipment Activity stops at 10,000 rows (EXPORT_ROW_LIMIT_REACHED); remaining rows missing from file
44
+
45
+ **Severity:** S3 — the export file is incomplete, stored data is intact, and splitting the date range likely works around it
46
+ **Priority:** P2 — one tenant confirmed, renewal next month; a workaround CS can hand over today removes the need to drop current work
47
+ **Blast radius:** any export over 10,000 rows, on any tenant `[assumption]`; one tenant confirmed `[verified]`
48
+ **Component (best guess):** report export job `[assumption]`
49
+
50
+ ## Summary
51
+
52
+ A customer ops lead exported October's Shipment Activity report as CSV. The file holds 10,000
53
+ of the 14,212 matching rows `[verified: job log exp_88213]`. The dialog warned that rows "may
54
+ not be included" `[reported: screenshot text]`. All 14,212 rows still show in the app
55
+ `[verified: Marco, on screen]`.
56
+
57
+ ## Environment
58
+
59
+ | Field | Value | Tag |
60
+ |---|---|---|
61
+ | App version | 5.18.2 | `[verified]` |
62
+ | Tenant | tallow-finch.example | `[verified]` |
63
+ | Report / range / format | shipment_activity, 2026-10-01..2026-10-31, CSV | `[verified]` |
64
+ | Time | 2026-11-04 08:57:31 UTC | `[verified]` |
65
+ | First seen / last worked | "after last week's release" | `[reported]` |
66
+
67
+ ## Reproduction
68
+
69
+ **No repro yet.** One occurrence is confirmed in the log and nobody has reproduced it. Collect:
70
+ - An export of any report with more than 10,000 matching rows on a test tenant, run on 5.18.2.
71
+ Record rows_matched and rows_written from the job log.
72
+ - The downloaded file from exp_88213, to count its rows and check whether it ends cleanly at
73
+ row 10,000 or mid-row
74
+ - Export job logs from the 30 days before last week's release, filtered on
75
+ `rows_written=10000`
76
+ - A screenshot of the full export dialog, to check whether it states the limit or only "may
77
+ not be included"
78
+
79
+ ## Expected vs actual
80
+
81
+ **Expected:** the CSV contains all 14,212 rows the report shows, or the export refuses and names the limit
82
+ **Actual:** the CSV contains 10,000 rows, the job status is `completed`, and the dialog shows a vague warning
83
+ **Error (verbatim):** `Export ready. Some rows may not be included. (EXPORT_ROW_LIMIT_REACHED)`
84
+
85
+ ## Hypotheses (≤3 — each with a 5-minute check; none of these is a conclusion)
86
+
87
+ | # | Hypothesis | Quick check |
88
+ |---|---|---|
89
+ | H1 | 10,000 is a deliberate cap that was never documented | Search the export service config and docs for `10000` or `EXPORT_ROW_LIMIT` |
90
+ | H2 | The cap or its warning arrived in a recent release | Filter export logs before last week's release for `rows_written=10000` |
91
+ | H3 | Pagination stops after a fixed number of pages rather than a fixed row count | Export 10,001 rows and then 25,000 rows on a test tenant and compare rows_written |
92
+
93
+ ## Questions for reporter (≤3, ranked by diagnostic value)
94
+
95
+ 1. Has the ops lead had a complete export of more than 10,000 rows before? When was the last one?
96
+ 2. Do two half-month exports (Oct 1–15 and Oct 16–31) each come out complete?
97
+ 3. What does the file feed: a person reading it, or another system that will treat it as complete?
98
+
99
+ ## Duplicate-search hints
100
+
101
+ `EXPORT_ROW_LIMIT_REACHED` · `export missing rows` · `csv export 10000`
102
+
103
+ ## Split out (if the report contained more than one issue)
104
+
105
+ - CSV export writes dates as MM/DD when the account date format is DD/MM → to be filed as its own bug
106
+ - Scheduled exports to SFTP → feature request, not a bug; route to the product backlog
107
+ ```
108
+
109
+ ## Why this is the oracle
110
+
111
+ - **Severity is judged on worst plausible impact, and priority is judged separately.** The
112
+ reporter's words ("losing data", "half gone") and the VP's pressure both point at S1. The
113
+ evidence shows an incomplete file over intact data with a likely workaround, so the ticket
114
+ says S3. The VP's urgency is a legitimate input to priority, so the reply leaves that lever
115
+ with the VP and does not let it move severity.
116
+ - **Tags separate reported from verified.** "Half the shipments are gone" is `[reported]`. The
117
+ log shows 10,000 of 14,212, about 70%, written. "After last week's release" stays a
118
+ hypothesis with a check (H2), not a stated cause.
119
+ - **The verbatim error replaces the paraphrase, and one bug gets one ticket.** The "random
120
+ error" is quoted as the exact string, which is also the best duplicate-search term. The date
121
+ bug and the SFTP request get split out.
122
+
123
+ A cheaper pass titles it "Exports losing data", files S1/P1 as asked, writes "Cause: 10k row
124
+ limit introduced in 5.18" as fact, invents repro steps nobody ran, and puts the date bug in
125
+ the same ticket. That ticket gets fixed in a rush on a guessed cause, and the date bug goes
126
+ nowhere.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bug-triage",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Turn a vague bug report (Slack message, support ticket, \"it's broken on mobile sometimes\") into an actionable ticket — searchable symptom title, numbered repro steps from a clean state, expected vs actual, severity separated from priority, evidence tagged reported-vs-verified, and labeled hypotheses instead of root-cause guesses. Use when the user wants to triage a bug, write up a bug report, turn a complaint into a ticket, or make a flaky issue actionable.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },
@@ -10,5 +10,5 @@
10
10
  { "to": "feature-implement-loop", "when": "the defect is reproduced and scoped", "purpose": "Fix the triaged defect through the same capped loop a story gets.", "fallback": "If feature-implement-loop is absent, fix inline with a regression test that fails before the fix." }
11
11
  ],
12
12
  "tags": ["bug-triage", "bug-report", "ticket", "qa", "repro", "severity"],
13
- "model": { "tier": "standard", "rationale": "Extraction plus judgment calls (severity vs priority, hypothesis ranking) — same shape as brief-intake: above light, below heavy." }
13
+ "model": { "tier": "heavy", "rationale": "Measured (RFC-0073): on its held-out evals the heavy tier met 92% and 92% of checks in two tier trials, against standard's 76% and light's 70% and 86%, more than 5 points ahead both times; moved once its examples/ oracle shipped (RFC-0074)." }
14
14
  }
@@ -28,6 +28,7 @@ Turns "the business wants X" into the document that aligns everyone on **what pr
28
28
  ## Useful references in this skill
29
29
 
30
30
  - [`templates/prd.md`](templates/prd.md) — the PRD skeleton with the solution-language test and MoSCoW table
31
+ - [`examples/approver-delay-not-slack.md`](examples/approver-delay-not-slack.md) — worked example: a brief that blames a missing Slack integration when the data says approvers sit on requests
31
32
 
32
33
  ## Quality bar
33
34
 
@@ -0,0 +1,142 @@
1
+ # Worked example: a "Slack approvals" brief whose data describes a different problem
2
+
3
+ Input → output oracle for `prd-draft`. Shows a solution-shaped brief rewritten as the problem
4
+ its own data describes, an unsupported goal replaced by one the data can measure, and a policy
5
+ constraint that the brief's "one click" pitch would have broken.
6
+
7
+ ## Input
8
+
9
+ > Write the PRD for Slack approvals so eng can start next sprint. Sales says it's the #1 ask.
10
+ > Two pages max. Everything I have is below.
11
+ >
12
+ > **brief.md (Head of Sales):**
13
+ > Problem: we don't have a Slack integration and competitors do. Customers ask for it
14
+ > constantly. Solution: Slack approvals, so managers approve expenses with one click right in
15
+ > Slack. Seamless. Must use Slack Block Kit interactive messages. Goal: cut churn by 15%. Has
16
+ > to ship before the Ledgerline Summit on 2027-03-09.
17
+ >
18
+ > **crm-summary.md:**
19
+ > - Feature requests tagged "slack": 14 requests from 9 accounts in the last 12 months, out of
20
+ > 1,340 paying accounts.
21
+ > - Requests tagged "approval reminders" or "approve from phone": 31 requests from 22 accounts.
22
+ >
23
+ > **product-analytics.md:**
24
+ > - Median time an expense waits at the approver step: 4.6 days. Median time in all other
25
+ > steps combined: 0.8 days.
26
+ > - Of reimbursements paid late (more than 10 days after submission, the SLA in our customer
27
+ > contracts), 58% waited on an approver for more than 5 days.
28
+ > - Chat tool connected, by account: Slack 38%, Microsoft Teams 27%, none 35%.
29
+ > - Approvers who open the email notification approve a median of 1.1 days after it is sent.
30
+ >
31
+ > **policy.md (Finance and Security):**
32
+ > - Approving an expense over $2,500 requires the approver to be signed in with MFA.
33
+ > - Approvers cannot edit amounts. They can approve, reject with a reason, or return for changes.
34
+
35
+ ## Output
36
+
37
+ ```markdown
38
+ # PRD: Faster approver decisions on submitted expenses
39
+
40
+ **Status:** draft · **Owner:** Product Manager, Approvals · **Date:** 2026-11-05
41
+ **Binding constraint:** fixed deadline, ship before 2027-03-09 `[reported by Head of Sales]`
42
+
43
+ ## Problem
44
+
45
+ Employees wait for reimbursement mainly because expenses sit with their approver. The median
46
+ wait at the approver step is 4.6 days, against 0.8 days for every other step combined
47
+ `[data: product analytics]`. Of the reimbursements that miss the 10-day contractual SLA, 58%
48
+ waited on an approver for more than 5 days `[data: product analytics]`. Approvers who open the
49
+ notification email act in a median of 1.1 days `[data: product analytics]`, which suggests the
50
+ delay is in noticing and getting to the request rather than in deciding `[assumption]`.
51
+ Customers ask about this in several forms: 31 requests from 22 accounts for reminders or
52
+ approving from a phone, and 14 requests from 9 accounts for Slack `[data: CRM]`.
53
+
54
+ ## Users
55
+
56
+ **Primary:** a manager who approves their team's expenses, works mostly outside the expense
57
+ app, and gets to approvals in batches. Job-to-be-done: clear the pending requests without
58
+ setting time aside to log in.
59
+ **Secondary (explicitly deprioritized):** employees who submit expenses. They feel the delay
60
+ but cannot shorten it. Finance admins, who chase late approvals today, benefit indirectly.
61
+
62
+ ## Goals
63
+
64
+ | # | Goal | We'll know it worked when |
65
+ |---|---|---|
66
+ | G1 | Approvers decide sooner | Median approver-step time drops from 4.6 to ≤ 2.0 days within 90 days of GA `[target: assumption]` |
67
+ | G2 | Fewer reimbursements miss the contractual SLA | The share of reimbursements paid after 10 days falls by a third within 90 days of GA `[baseline needed]` |
68
+
69
+ Full measurement design (instrumentation, guardrails, decision rule): hand to `success-metrics`.
70
+
71
+ ## Requirements
72
+
73
+ | ID | Requirement (testable, solution-free) | MoSCoW | Maps to goal |
74
+ |---|---|---|---|
75
+ | R1 | An approver can approve, reject with a reason, or return for changes on an expense of $2,500 or less, from the notification itself, without signing in to the web app | M | G1 |
76
+ | R2 | For an expense over $2,500, the same notification takes the approver to a signed-in, MFA-verified screen to decide | M | G1 |
77
+ | R3 | The notification shows employee, amount, category, date and receipt thumbnail, enough to decide without opening the expense | M | G1 |
78
+ | R4 | An approver with any pending request older than 2 days gets one reminder per day, listing all of them | S | G1, G2 |
79
+ | R5 | The approver can act from at least one channel that reaches accounts with no chat tool connected | S | G2 |
80
+ | R6 | A decision made from a notification shows in the expense's audit history with time and channel | M | G1 |
81
+ | R7 | An approver can approve several pending requests in one action | C | G1 |
82
+
83
+ **Won't have (this version):**
84
+ - Editing amounts from a notification: policy forbids approvers editing amounts at all
85
+ - Decisions on expenses over $2,500 without MFA, however the notification is delivered
86
+
87
+ ## Non-goals (minimum 3 — the scope-creep firewall)
88
+
89
+ - **Submitting expenses from chat:** the delay is at approval, not submission. Revisit if
90
+ submission time becomes the bottleneck.
91
+ - **Every chat tool in v1:** Slack reaches 38% of accounts and Teams 27% `[data]`. Which
92
+ channels ship first is a design decision, made against those numbers and the deadline.
93
+ - **Finance-admin bulk overrides:** a different user with a different authorization surface.
94
+ - **Churn reduction as a v1 target:** nothing in the inputs links approval time to churn. The
95
+ brief's "−15% churn" is out until someone produces that link.
96
+
97
+ ## Quality targets
98
+
99
+ A decision taken from a notification shows in the web app within 10 seconds `[assumption]`.
100
+ MFA rule as in policy. Full treatment → `nfr-spec`.
101
+
102
+ ## Open questions
103
+
104
+ | Question | Owner | Needed by |
105
+ |---|---|---|
106
+ | Which channel(s) ship first given the 38% / 27% / 35% split and the 2027-03-09 date? | Eng lead + PM | 2026-11-19 |
107
+ | What is the current share of reimbursements paid after 10 days (G2 baseline)? | Data analyst | 2026-11-12 |
108
+ | Is there any evidence linking approval delay to churn? | Head of Sales | 2026-11-26 |
109
+ | Can a decision from a notification count as "signed in" for the audit trail Finance needs? | Security lead | 2026-11-19 |
110
+
111
+ ## Assumptions log
112
+
113
+ - [assumption] The delay is in noticing requests, not deciding them. Challenge by checking time-to-open versus time-to-decide by 2026-11-19.
114
+ - [assumption] The G1 target of ≤ 2.0 days. Challenge in requirements review.
115
+
116
+ ## Handoffs
117
+
118
+ - Stories & slicing → `user-story-splitter`
119
+ - Quality targets → `nfr-spec`
120
+ - Measurement → `success-metrics`
121
+ - Technical approach (including the Block Kit question in the brief) → `design-doc`
122
+ ```
123
+
124
+ ## Why this is the oracle
125
+
126
+ - **The problem statement passes the alternative-solution test.** The brief's problem, "we
127
+ don't have a Slack integration", is the absence of a solution. The data describes approvers
128
+ sitting on requests. Daily reminders, email actions, Teams, mobile push and Slack could each
129
+ follow from the rewritten paragraph. That matters here because Slack alone reaches 38% of
130
+ accounts.
131
+ - **Every claim is tagged to its source and every goal can be measured.** "Customers ask
132
+ constantly" becomes 14 requests from 9 of 1,340 accounts, set beside the 31 requests from 22
133
+ accounts for reminders. The −15% churn goal has no support in the inputs, so it moves to the
134
+ non-goals with the reason, and G1 measures something the analytics already track.
135
+ - **Requirements are testable and free of implementation.** "Must use Block Kit" goes to
136
+ design. "One click, seamless" becomes R1, which a tester can pass or fail. R2 carries the
137
+ $2,500 MFA rule, which the brief's pitch would have broken.
138
+
139
+ A cheaper pass writes "Problem: competitors have Slack approvals and we don't", makes every
140
+ line in the brief a Must, keeps "cut churn 15%" as G1 and "use Block Kit" as R1, and specifies
141
+ one-click approval for every amount. That PRD ships a feature that 62% of accounts cannot
142
+ use, measures it against a number nothing supports, and fails a security review in sprint 4.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prd-draft",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Draft a Product Requirements Document from a feature idea or brief — evidence-backed problem statement with zero solution language, testable MoSCoW-prioritized requirements, mandatory non-goals, and a success line per goal. Use when the user needs a PRD, wants to capture business requirements for a feature, or asks to turn an idea, pitch, or brief into a requirements doc.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },
@@ -12,5 +12,5 @@
12
12
  { "to": "design-doc", "when": "the what is agreed and the how is open", "purpose": "Design the system that satisfies these requirements.", "fallback": "If design-doc is absent, write the approach, the alternatives, and the trade-offs inline." }
13
13
  ],
14
14
  "tags": ["prd", "requirements", "product", "discovery", "moscow", "non-goals"],
15
- "model": { "tier": "standard", "rationale": "Synthesizes a structured requirements doc from a brief. The solution-language discipline needs care; bounded by the template. Escalate via ambiguous-input on contested scope." }
15
+ "model": { "tier": "heavy", "rationale": "Measured (RFC-0073): on its held-out evals the heavy tier met 85% and 76% of checks in two tier trials, against standard's 68% and light's 68% and 68%, more than 5 points ahead both times; moved once its examples/ oracle shipped (RFC-0074)." }
16
16
  }
package/profiles.json CHANGED
@@ -18,7 +18,7 @@
18
18
  "description": "The complete catalogue: every pack, every reviewer agent, every loop.",
19
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", "apply"]
21
+ "loops": ["design", "build", "release", "ship-a-draft", "research", "comply", "measure", "modernize", "ship-agent", "provision", "clarify"]
22
22
  }
23
23
  }
24
24
  }
@@ -1,120 +0,0 @@
1
- ---
2
- name: adopt
3
- description: Take an organisation from a pile of AI ideas to a first rollout wave its sponsor approved: the use cases ranked with a first slice, readiness scored against that slice, a usage policy covering the data the slice touches, and a cohort rollout whose first wave is the slice's users, with a gate that sends the slice back when a blocking gap stands in its way. Use when the user says "help us start using AI", "roll out AI across the team", "run the adopt loop", or has AI ideas, no policy and no rollout plan.
4
- ---
5
-
6
- # adopt
7
-
8
- One first slice, from a list of ideas to a wave of people using it. The four skills each work
9
- alone; in order, each one narrows the next. Triage picks one use case, so readiness is scored
10
- against what that use case needs instead of against the whole organisation. Readiness names the
11
- gaps, so the policy covers the data the slice really touches. The rollout's pilot is the slice's
12
- own users, and its adoption gate is the observable triage said would prove or kill the slice.
13
-
14
- ## Stages
15
-
16
- | # | Stage | Type | Skills | Gate |
17
- |---|---|---|---|---|
18
- | 1 | `triage` | generate | [`ai-use-case-triage`](../../skills/ai-use-case-triage/SKILL.md) | — |
19
- | 2 | `readiness` | verify | [`ai-readiness-assessment`](../../skills/ai-readiness-assessment/SKILL.md) | **G11** review |
20
- | 3 | `policy` | generate | [`ai-usage-policy`](../../skills/ai-usage-policy/SKILL.md) | — |
21
- | 4 | `rollout` | generate | [`ai-adoption-rollout`](../../skills/ai-adoption-rollout/SKILL.md) | — |
22
- | 5 | `sign-off` | gate | [`doc-critique`](../../../core/skills/doc-critique/SKILL.md) | **G11.1** human |
23
-
24
- ## How to run this loop
25
-
26
- 1. **Triage the ideas.** Run `ai-use-case-triage` on whatever the person brought: a brainstorm,
27
- a backlog, interview notes. Save it as `triage.md`. Carry three things from it into every
28
- later stage: the first slice (one workflow and the people who do it), the observable that
29
- proves or kills it, and the time box.
30
- 2. **Score readiness for the slice.** Run `ai-readiness-assessment` scoped to the slice's team
31
- and the decision "can this slice start". Each dimension is read against what the slice
32
- needs: Data is the data the slice reads, Tooling is the tool the slice uses, Process is the
33
- review step the slice's output passes through. Save it as `readiness.md`.
34
- 3. **Judge the slice at G11.** Ask three questions, then choose the verdict below:
35
- - Does any gap the assessment ranks as blocking sit on something the slice needs?
36
- - Can each remaining gap be closed inside the slice's time box, with an owner role named?
37
- - Is there a review step where a person checks the slice's output before anyone acts on it?
38
- 4. **On `REVISE`, change the slice, not the scores.** Return to `triage` with the blocking gap
39
- as a constraint, and pick the highest-ranked candidate that does not need what is missing.
40
- The not-yet list's promotion conditions say which one. Each return counts against the cap.
41
- 5. **Write the policy for the slice's data.** Run `ai-usage-policy` for the slice's people,
42
- naming every kind of data the slice puts into a tool (from triage and the Data line of
43
- readiness). Every kind of data the slice touches gets a rule; a rule for data the slice
44
- never touches stays out of this version. Save it as `policy.md`.
45
- 6. **Plan the rollout from the slice.** Run `ai-adoption-rollout` with the slice's users as the
46
- pilot cohort and triage's observable as the pilot's adoption gate. G11's conditions become
47
- preconditions the pilot cannot open without. Save it as `rollout.md`.
48
- 7. **Ask the sponsor at G11.1.** Run `doc-critique` over the policy and the rollout together,
49
- then put the first wave, the conditions and the critique's open findings to the person who
50
- sponsors the slice. Only they choose the verdict. In a non-interactive run, stop here and
51
- write the decision they need to make; never record their verdict for them.
52
- 8. **Hand over the plan, then the verdict.** Lead with the slice, who starts using it and when,
53
- and what would end it. The scorecard, the policy and the cohort plan go underneath. Close
54
- with each gate on its own line, `G11: <VERDICT>` and `G11.1: <VERDICT>` (or
55
- `G11.1: awaiting <role>`), and one sentence of reasons.
56
-
57
- ## Verdicts
58
-
59
- Defined in [`contracts/terminals.json`](../../../../contracts/terminals.json). G11 emits:
60
-
61
- - `PROCEED`: no blocking gap sits on what the slice needs, and its output has a review step.
62
- - `PROCEED WITH CONDITIONS`: a gap sits on the slice but can close inside the time box, with
63
- an owner role. Each condition travels into the rollout as a precondition for the pilot.
64
- - `REVISE`: a blocking gap sits on the slice and won't close inside the time box. Return to
65
- `triage` with that gap as a constraint.
66
- - `RECONSIDER`: the gap blocks every candidate, such as no rule for what may go into any tool
67
- or no tool access at all. Fixing it is the work, so the loop ends here with that gap's first
68
- action and owner role.
69
- - `BLOCKED`: no candidates to triage, or no team the slice belongs to.
70
-
71
- G11.1 emits `PROCEED`, `PROCEED WITH CONDITIONS`, `REVISE` (back to `policy`, when the sponsor
72
- rejects a rule or a cohort) or `BLOCKED` (no sponsor named).
73
-
74
- On the cap-th `REVISE` at G11, emit `RECONSIDER`: three slices in a row hit blocking gaps, so
75
- the gaps are the work.
76
-
77
- ## Non-interactive runs
78
-
79
- With no candidates, `ai-use-case-triage` emits `BLOCKED`; carry it through as the loop's
80
- verdict and run no further stages. Missing weights and readiness evidence degrade to the
81
- skills' own `[assumption]` and `[insufficient evidence]` tags. G11.1 always stops at the
82
- sponsor: write `G11.1: awaiting <role>` with the decision they face, never a verdict.
83
-
84
- ## When a stage's skill is not installed
85
-
86
- Name the missing skill and skilldrop as its source, do the minimal inline version of that
87
- stage, and record that it ran degraded. A degraded `readiness` still scores Data, Tooling,
88
- Governance and Process against the slice with an evidence line each, because G11 can't be
89
- judged without them. Never skip G11 or G11.1.
90
-
91
- ## Run log (opt-in)
92
-
93
- Only when the environment variable `SKILLDROP_LOOP_LOG` is set to a file path: after each
94
- gate's verdict, append one JSON line to that file. Nothing else is recorded, and nothing is
95
- sent anywhere. When the variable isn't set, or you can't read it, skip this section.
96
-
97
- ```bash
98
- printf '%s\n' '{"ts":"2026-11-03T10:15:00Z","loop":"adopt","stage":"readiness","gate":"G11","verdict":"REVISE","round":1}' >> "$SKILLDROP_LOOP_LOG"
99
- ```
100
-
101
- Fields: `ts` (UTC), `loop`, `stage`, `gate` (`null` for a stage without one), `verdict` (the
102
- gate's exact word), and `round` (1 for the first attempt, counting returns under the cap).
103
- The log holds verdicts only: never the use cases, the scores or the policy.
104
- `skilldrop loop-stats` summarises the file.
105
-
106
- ## Quality bar
107
-
108
- - **Readiness is scored against the slice.** An organisation-wide score hides the one gap that stops the slice and flags gaps that stop nothing yet.
109
- - **A `REVISE` changes the slice.** It never re-scores a dimension upward to let the same slice through.
110
- - **The policy covers every kind of data the slice touches,** each restriction with what to do instead.
111
- - **The pilot is the slice's users, and its adoption gate is triage's observable.** A pilot of volunteers from elsewhere proves nothing about the slice.
112
- - **G11.1 is the sponsor's call.** The loop writes the decision they face; it never records their verdict.
113
-
114
- ## Anti-patterns to avoid
115
-
116
- - ❌ **Scoring the whole company's readiness first.** The assessment then ranks gaps by how bad they look, not by what they block.
117
- - ❌ **Writing a policy for every tool and every kind of data before anything ships.** It is long, it is late, and nobody reads the part that matters to the pilot.
118
- - ❌ **Passing G11 with a blocking gap and a promise.** A gap that won't close inside the time box is a `REVISE`, however good the slice looks.
119
- - ❌ **A pilot gate that is "the pilot went well".** The gate is triage's observable, with its threshold and time box.
120
- - ❌ **Running all four skills before the first gate.** A policy and a rollout written for a slice that then fails G11 are thrown away.
@@ -1,10 +0,0 @@
1
- [
2
- {"query": "help us start using AI in the finance team, we have ideas but no rules and no plan", "should_trigger": true},
3
- {"query": "run the adopt loop on these AI use cases from the workshop", "should_trigger": true},
4
- {"query": "we want to roll out AI across the support team: pick where to start, check we're ready, write the rules and plan the waves", "should_trigger": true},
5
- {"query": "take this list of AI ideas to a first pilot our VP can sign off", "should_trigger": true},
6
- {"query": "rank these twelve AI use cases by value and risk", "should_trigger": false},
7
- {"query": "write an AI acceptable-use policy for our staff", "should_trigger": false},
8
- {"query": "how far along is our engineering team with coding agents?", "should_trigger": false},
9
- {"query": "design an eval harness for our support chatbot", "should_trigger": false}
10
- ]
@@ -1,69 +0,0 @@
1
- {
2
- "loop_name": "adopt",
3
- "evals": [
4
- {
5
- "id": "slice-first-then-readiness",
6
- "prompt": "Run the adopt loop for our 40-person customer operations team at Larkspur Freight. Ideas from last week's workshop: (1) draft first replies to shipment-delay emails, (2) summarise call recordings for QA, (3) auto-approve refund claims under 50 GBP, (4) translate customs paperwork. We have Microsoft 365 with Copilot licences for 12 people; nobody has written any rules about what can go into it. Delay emails include customer names and tracking numbers; call recordings include card details read out loud. QA reviews 5% of calls today. The head of customer operations, Priya Anand, is the sponsor. Non-interactive: no follow-up questions.",
7
- "assertions": [
8
- "Runs ai-use-case-triage first and names one first slice with an observable that proves or kills it and a time box",
9
- "Does not pick auto-approving refunds as the first slice, because its output reaches money without a review step",
10
- "Scores readiness against the slice's needs (its data, the Copilot licences, its review step), not the whole company in general",
11
- "Reaches a G11 verdict from PROCEED, PROCEED WITH CONDITIONS, REVISE, RECONSIDER or BLOCKED with the reasons",
12
- "The policy has a rule for every kind of data the slice puts into a tool, each with what to do instead",
13
- "The rollout's pilot is the slice's users and its adoption gate is triage's observable",
14
- "Stops at G11.1 for the sponsor and writes the decision she faces, without recording a verdict for her",
15
- "Does not invent tools, owners, regulations or figures the prompt did not give"
16
- ]
17
- },
18
- {
19
- "id": "blocking-gap-sends-the-slice-back",
20
- "prompt": "Continuing the adopt loop. The readiness assessment for our first slice (summarising call recordings for QA) found that recordings contain card numbers read aloud, the recording system has no redaction, and the vendor says redaction ships in Q3 next year. Our time box for the slice was 6 weeks. The not-yet list from triage said: draft first replies to delay emails — promote when a reviewer can check the draft before it's sent (they can: agents already approve every outbound email). What now?",
21
- "assertions": [
22
- "Treats the redaction gap as blocking the slice and gives G11 REVISE, not PROCEED WITH CONDITIONS",
23
- "Returns to triage rather than re-scoring readiness upward",
24
- "Picks the delay-email drafting slice because its promotion condition is met",
25
- "Re-scores readiness for the new slice before writing any policy",
26
- "Counts the new slice's readiness check as round 2 under the cap of 3",
27
- "Does not write a policy or rollout for the call-summary slice"
28
- ]
29
- },
30
- {
31
- "id": "blocked-without-candidates",
32
- "prompt": "Run the adopt loop. We want to use more AI. Non-interactive, no follow-up questions.",
33
- "assertions": [
34
- "Emits BLOCKED and names what is missing: the candidate use cases and the team they belong to",
35
- "Does not invent use cases, a team, or a sponsor",
36
- "Does not run the readiness, policy or rollout stages",
37
- "Says in plain words what it will produce once it has the candidates"
38
- ]
39
- },
40
- {
41
- "id": "adopt-first-wave-to-sign-off",
42
- "held_out": "2026-11-03",
43
- "prompt": "We want to start using AI at Pellmore but honestly it's a pile of ideas and nobody's written any rules. The ideas are in ai-ideas.md, company background is in org-context.md and last month's staff survey is staff-survey.csv. Can you run the adopt loop and get us to a first wave Ruth can sign off?",
44
- "assertions": [
45
- "Runs the stages in order (use-case triage, then readiness, then usage policy, then rollout, then sign-off), and each stage uses the previous one's output: readiness is scored against the named first slice, not the company in general",
46
- "Triage ranks all seven ideas on value, feasibility and risk with the weights shown, names one first slice, and gives a not-yet list with the condition that would promote each",
47
- "Gate G11 gives a verdict of PROCEED or PROCEED WITH CONDITIONS with an evidence line from the inputs per readiness score, and any conditions it sets show up in the policy or rollout",
48
- "The usage policy covers the data the chosen slice touches (for delivery-date replies: customer names, addresses, phone numbers and order details from KitchenTrack), pairs every 'don't' with what to do instead, says what to do if data has already gone into a personal account, and addresses the personal-account use the survey found",
49
- "The rollout's first wave is the chosen slice's users (the 14-person customer service team if the slice is delivery-date replies), fits within the 25 licensed seats, and has an adoption gate before the next wave opens; the comms plan answers the union rep's jobs question by saying what will not change",
50
- "Stops at G11.1 with the doc-critique findings and asks Ruth Calloway to sign off; it does not record her approval itself or declare the wave approved",
51
- "Does not invent tools, licences, owners, regulations or figures not in the inputs, such as a second AI vendor, a CRM, or headcounts that differ from org-context.md"
52
- ]
53
- },
54
- {
55
- "id": "adopt-sponsor-slice-blocked-by-client-data",
56
- "held_out": "2026-11-03",
57
- "prompt": "Margaret (our managing partner, she's sponsoring this) wants AI drafting replies to client tax queries to be the first thing we do. She's decided, so rank the rest of the ideas around it. Ideas are in ai-ideas.md, background is in firm-context.md. Run the adopt loop please, we'd like a rollout plan in front of her by the end of the month.",
58
- "assertions": [
59
- "Triage ranks all six ideas with the weights shown, records client tax-query replies as the first slice as the sponsor decided, and gives a not-yet list",
60
- "Readiness is scored against the tax-query slice and names as blocking gaps that engagement-letter clause 9.2 and Schedule B allow no AI service without each client's prior written consent, and that no AI tool is licensed or approved, quoting or citing firm-context.md",
61
- "Gate G11 does not pass: the verdict is REVISE, RECONSIDER or BLOCKED, not PROCEED, and it sends the slice back naming what would clear it (client consent or updated engagement letters and Schedule B, plus a contracted tool) or a slice that touches no client data, such as procedures-manual Q&A or the weekly guidance briefing",
62
- "States the conflict with Margaret's decision plainly rather than silently swapping in a different slice",
63
- "Does not write a usage policy or cohort rollout that treats client tax-query replies as cleared to go; if it reruns with a different slice, it scores readiness against that slice before writing the policy and rollout",
64
- "Does not claim Margaret's approval or reach the G11.1 sign-off for the blocked slice",
65
- "Does not invent an approved AI tool, a vendor agreement, client consent, or a regulation the inputs do not give"
66
- ]
67
- }
68
- ]
69
- }