skilldrop-cli 1.3.0 → 1.5.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 (200) hide show
  1. package/README.md +10 -10
  2. package/bin/skilldrop.js +15 -10
  3. package/catalogue.json +8 -4
  4. package/contracts/catalogue.schema.json +2 -1
  5. package/model-routing.json +70 -78
  6. package/package.json +1 -1
  7. package/packs/ai-engineering/skills/agent-adoption-stage/SKILL.md +0 -1
  8. package/packs/ai-engineering/skills/agent-adoption-stage/manifest.json +3 -4
  9. package/packs/ai-engineering/skills/ai-adoption-rollout/SKILL.md +0 -1
  10. package/packs/ai-engineering/skills/ai-adoption-rollout/manifest.json +3 -4
  11. package/packs/ai-engineering/skills/ai-readiness-assessment/SKILL.md +0 -1
  12. package/packs/ai-engineering/skills/ai-readiness-assessment/manifest.json +1 -2
  13. package/packs/ai-engineering/skills/ai-use-case-triage/manifest.json +3 -3
  14. package/packs/ai-engineering/skills/judge-audit/SKILL.md +29 -13
  15. package/packs/ai-engineering/skills/judge-audit/evals/evals.json +30 -0
  16. package/packs/ai-engineering/skills/judge-audit/evals/files/12/judge_runs.csv +241 -0
  17. package/packs/ai-engineering/skills/judge-audit/evals/files/12/rosa_labels.csv +33 -0
  18. package/packs/ai-engineering/skills/judge-audit/evals/files/13/moderation_eval.csv +601 -0
  19. package/packs/ai-engineering/skills/judge-audit/manifest.json +2 -3
  20. package/packs/ai-engineering/skills/llm-eval-harness/SKILL.md +1 -2
  21. package/packs/ai-engineering/skills/llm-eval-harness/manifest.json +3 -3
  22. package/packs/ai-engineering/skills/mcp-pairing/manifest.json +1 -1
  23. package/packs/ai-engineering/skills/mcp-pairing/reference.md +4 -3
  24. package/packs/ai-engineering/skills/subagent-design/SKILL.md +1 -0
  25. package/packs/ai-engineering/skills/subagent-design/examples/help-center-localization.md +146 -0
  26. package/packs/ai-engineering/skills/subagent-design/manifest.json +2 -2
  27. package/packs/api-builder/skills/prompt-caching-advisor/SKILL.md +4 -0
  28. package/packs/api-builder/skills/prompt-caching-advisor/examples/support-bot-block-order.md +120 -0
  29. package/packs/api-builder/skills/prompt-caching-advisor/manifest.json +2 -2
  30. package/packs/api-builder/skills/tool-use-schema-writer/manifest.json +2 -2
  31. package/packs/career/skills/application-form-answers/manifest.json +3 -3
  32. package/packs/career/skills/cover-letter/manifest.json +3 -3
  33. package/packs/career/skills/resume-tailor/manifest.json +3 -3
  34. package/packs/converters/skills/md-to-docx/manifest.json +3 -3
  35. package/packs/core/loops/ship-a-draft/evals/evals.json +28 -0
  36. package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-adr-from-thread/slack-thread.txt +47 -0
  37. package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-announcement-unsettled/ticket-PRD-412.md +44 -0
  38. package/packs/core/skills/output-hygiene/manifest.json +3 -3
  39. package/packs/data-analytics/loops/measure/evals/evals.json +30 -0
  40. package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/schema.md +43 -0
  41. package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/sql/finance_active_customers.sql +7 -0
  42. package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/sql/growth_active_customers.sql +9 -0
  43. package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/thread.md +30 -0
  44. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/request.md +34 -0
  45. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/schema.md +58 -0
  46. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/active_subscribers.sql +17 -0
  47. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/net_revenue_by_plan.sql +15 -0
  48. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/weekly_churn_rate.sql +34 -0
  49. package/packs/data-analytics/skills/dashboard-spec/SKILL.md +0 -1
  50. package/packs/data-analytics/skills/dashboard-spec/manifest.json +1 -2
  51. package/packs/design/skills/slide-outliner/manifest.json +2 -2
  52. package/packs/dev-team/loops/build/evals/evals.json +28 -0
  53. package/packs/dev-team/loops/build/evals/files/build-promo-codes/.github/workflows/ci.yml.fixture +19 -0
  54. package/packs/dev-team/loops/build/evals/files/build-promo-codes/cartcalc/__init__.py +4 -0
  55. package/packs/dev-team/loops/build/evals/files/build-promo-codes/cartcalc/pricing.py +47 -0
  56. package/packs/dev-team/loops/build/evals/files/build-promo-codes/pyproject.toml.fixture +9 -0
  57. package/packs/dev-team/loops/build/evals/files/build-promo-codes/story.md +61 -0
  58. package/packs/dev-team/loops/build/evals/files/build-promo-codes/tests/__init__.py +0 -0
  59. package/packs/dev-team/loops/build/evals/files/build-promo-codes/tests/test_pricing.py +49 -0
  60. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/.github/workflows/ci.yml.fixture +19 -0
  61. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/bug-report.md +25 -0
  62. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/pr-description.md +42 -0
  63. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/pyproject.toml.fixture +9 -0
  64. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/ratelimit/__init__.py +4 -0
  65. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/ratelimit/bucket.py +49 -0
  66. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/tests/__init__.py +0 -0
  67. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/tests/test_bucket.py +63 -0
  68. package/packs/dev-team/loops/modernize/evals/evals.json +30 -0
  69. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/.github/workflows/ci.yml.fixture +11 -0
  70. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/README.md +17 -0
  71. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/docs/adr/0004-late-fee-calculation.md +25 -0
  72. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/legacy/feecalc.py +74 -0
  73. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/samples/accounts_2026-10.txt +10 -0
  74. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/samples/accounts_edge.txt +11 -0
  75. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/tests/test_feecalc_smoke.py +21 -0
  76. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/.github/workflows/ci.yml.fixture +11 -0
  77. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/PR-412.md +24 -0
  78. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/README.md +17 -0
  79. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/docs/adr/0004-late-fee-calculation.md +25 -0
  80. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/__init__.py +1 -0
  81. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/cli.py +33 -0
  82. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/extract.py +33 -0
  83. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/rules.py +39 -0
  84. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/legacy/feecalc.py +74 -0
  85. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/samples/accounts_2026-10.txt +10 -0
  86. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/samples/accounts_edge.txt +11 -0
  87. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/tests/test_feecalc_smoke.py +21 -0
  88. package/packs/dev-team/loops/release/LOOP.md +4 -4
  89. package/packs/dev-team/loops/release/evals/eval_queries.json +10 -0
  90. package/packs/dev-team/loops/release/evals/evals.json +34 -0
  91. package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/0061_switch_to_haldrin_tokens.sql +22 -0
  92. package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/eng-notes.md +40 -0
  93. package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/merged-prs.md +13 -0
  94. package/packs/dev-team/loops/release/evals/files/release-saved-searches/merged-prs.md +13 -0
  95. package/packs/dev-team/loops/release/evals/files/release-saved-searches/readiness-evidence.md +27 -0
  96. package/packs/dev-team/loops/release/evals/files/release-saved-searches/traffic-baseline.md +23 -0
  97. package/packs/dev-team/loops/release/loop.json +1 -1
  98. package/packs/dev-team/skills/bug-triage/SKILL.md +1 -0
  99. package/packs/dev-team/skills/bug-triage/examples/export-row-limit-escalation.md +126 -0
  100. package/packs/dev-team/skills/bug-triage/manifest.json +2 -2
  101. package/packs/dev-team/skills/feature-implement-loop/manifest.json +2 -2
  102. package/packs/dev-team/skills/pr-description-writer/manifest.json +3 -3
  103. package/packs/dev-team/skills/pre-merge-review/manifest.json +2 -2
  104. package/packs/dev-team/skills/release-notes/manifest.json +2 -2
  105. package/packs/dev-team/skills/test-plan-generator/manifest.json +2 -2
  106. package/packs/experience-design/skills/service-blueprint/manifest.json +3 -3
  107. package/packs/experience-design/skills/ux-writing/manifest.json +3 -3
  108. package/packs/grc/loops/comply/evals/evals.json +29 -0
  109. package/packs/grc/loops/comply/evals/files/comply-chat-vendor-launch/vendor-brief.md +72 -0
  110. package/packs/grc/loops/comply/evals/files/comply-loyalty-app-unowned-risks/launch-note.md +31 -0
  111. package/packs/grc/loops/comply/evals/files/comply-loyalty-app-unowned-risks/risk-register.csv +6 -0
  112. package/packs/infra-as-code/skills/terraform-module/manifest.json +3 -3
  113. package/packs/product-manager/skills/prd-draft/SKILL.md +1 -0
  114. package/packs/product-manager/skills/prd-draft/examples/approver-delay-not-slack.md +142 -0
  115. package/packs/product-manager/skills/prd-draft/manifest.json +2 -2
  116. package/packs/product-manager/skills/user-journey-map/manifest.json +2 -2
  117. package/packs/research/loops/research/evals/evals.json +28 -0
  118. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t1-ticket-volume.md +15 -0
  119. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t2-release-notes-4-2.md +11 -0
  120. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t3-billing-migration.md +12 -0
  121. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t4-agent-poll.md +11 -0
  122. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t5-app-store-reviews.md +12 -0
  123. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s1-analytics-export.md +29 -0
  124. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s2-email-delivery-report.md +25 -0
  125. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s3-pricing-changelog.md +9 -0
  126. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s4-trial-interview-notes.md +21 -0
  127. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s5-competitor-note.md +9 -0
  128. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s6-weekly-growth-recap.md +7 -0
  129. package/packs/research/skills/research-plan/manifest.json +3 -3
  130. package/packs/research/skills/source-synthesis/manifest.json +3 -3
  131. package/packs/skill-engineering/skills/skill-author/manifest.json +3 -3
  132. package/packs/solution-architect/loops/design/evals/evals.json +28 -0
  133. package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0001-postgres-system-of-record.md +23 -0
  134. package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0002-background-work-via-job-queue.md +23 -0
  135. package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0003-tenant-isolation-row-level.md +25 -0
  136. package/packs/solution-architect/loops/design/evals/files/design-bulk-export/prd-bulk-export.md +50 -0
  137. package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/adr/0002-background-work-via-job-queue.md +23 -0
  138. package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/adr/0004-new-stateful-infra-needs-platform-signoff.md +22 -0
  139. package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/prd-partner-webhooks.md +36 -0
  140. package/packs/solution-architect/skills/api-contract-draft/manifest.json +3 -3
  141. package/packs/solution-architect/skills/architecture-diagrams/manifest.json +3 -3
  142. package/packs/solution-architect/skills/design-doc/manifest.json +2 -2
  143. package/packs/solution-architect/skills/figma-diagrams/manifest.json +3 -3
  144. package/packs/sre-oncall/skills/cloud-cost-review/SKILL.md +0 -1
  145. package/packs/sre-oncall/skills/cloud-cost-review/manifest.json +1 -2
  146. package/packs/sre-oncall/skills/delivery-metrics-report/SKILL.md +0 -1
  147. package/packs/sre-oncall/skills/delivery-metrics-report/manifest.json +1 -2
  148. package/packs/sre-oncall/skills/incident-comms/manifest.json +2 -2
  149. package/packs/sre-oncall/skills/postmortem-generator/manifest.json +2 -2
  150. package/packs/stakeholder-comms/skills/decision-log/manifest.json +2 -2
  151. package/packs/trackers/skills/team-status-report/manifest.json +3 -3
  152. package/profiles.json +1 -1
  153. package/packs/ai-engineering/loops/adopt/LOOP.md +0 -120
  154. package/packs/ai-engineering/loops/adopt/evals/eval_queries.json +0 -10
  155. package/packs/ai-engineering/loops/adopt/evals/evals.json +0 -69
  156. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/ai-ideas.md +0 -15
  157. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/org-context.md +0 -27
  158. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/staff-survey.csv +0 -11
  159. package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/ai-ideas.md +0 -13
  160. package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/firm-context.md +0 -23
  161. package/packs/ai-engineering/loops/adopt/loop.json +0 -53
  162. package/packs/ai-engineering/skills/ai-usage-report/SKILL.md +0 -111
  163. package/packs/ai-engineering/skills/ai-usage-report/evals/eval_queries.json +0 -30
  164. package/packs/ai-engineering/skills/ai-usage-report/evals/evals.json +0 -46
  165. package/packs/ai-engineering/skills/ai-usage-report/evals/files/1/northwind-ai-events.csv +0 -4213
  166. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/draftwell-events.csv +0 -249
  167. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/export-note.md +0 -9
  168. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/published-assets.csv +0 -44
  169. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/team-roster.md +0 -10
  170. package/packs/ai-engineering/skills/ai-usage-report/examples/weekly-engineering-team.md +0 -133
  171. package/packs/ai-engineering/skills/ai-usage-report/manifest.json +0 -12
  172. package/packs/ai-engineering/skills/ai-usage-report/scripts/build_report.py +0 -453
  173. package/packs/ai-engineering/skills/ai-usage-report/templates/report-per-user.md +0 -42
  174. package/packs/ai-engineering/skills/ai-usage-report/templates/report-team-rollup.md +0 -49
  175. package/packs/ai-engineering/skills/ai-usage-report/templates/usage-event-schema.md +0 -76
  176. package/packs/career/loops/apply/LOOP.md +0 -97
  177. package/packs/career/loops/apply/evals/eval_queries.json +0 -9
  178. package/packs/career/loops/apply/evals/evals.json +0 -27
  179. package/packs/career/loops/apply/loop.json +0 -52
  180. package/packs/product-manager/loops/discover/LOOP.md +0 -82
  181. package/packs/product-manager/loops/discover/evals/eval_queries.json +0 -30
  182. package/packs/product-manager/loops/discover/evals/evals.json +0 -26
  183. package/packs/product-manager/loops/discover/loop.json +0 -41
  184. package/packs/product-manager/skills/lean-canvas/SKILL.md +0 -162
  185. package/packs/product-manager/skills/lean-canvas/evals/eval_queries.json +0 -42
  186. package/packs/product-manager/skills/lean-canvas/evals/evals.json +0 -82
  187. package/packs/product-manager/skills/lean-canvas/evals/files/1/pawpass-notes.md +0 -54
  188. package/packs/product-manager/skills/lean-canvas/evals/files/3/lunchloop-pitch.md +0 -30
  189. package/packs/product-manager/skills/lean-canvas/evals/files/4/clubkit-notes.md +0 -44
  190. package/packs/product-manager/skills/lean-canvas/evals/files/5/cost-model.csv +0 -5
  191. package/packs/product-manager/skills/lean-canvas/evals/files/5/proposal.md +0 -40
  192. package/packs/product-manager/skills/lean-canvas/evals/files/5/stakeholder-emails.txt +0 -18
  193. package/packs/product-manager/skills/lean-canvas/examples/bike-repair.md +0 -72
  194. package/packs/product-manager/skills/lean-canvas/manifest.json +0 -34
  195. package/packs/product-manager/skills/lean-canvas/reference.md +0 -102
  196. package/packs/product-manager/skills/lean-canvas/scripts/unit_economics.py +0 -211
  197. package/packs/sre-oncall/loops/operate/LOOP.md +0 -84
  198. package/packs/sre-oncall/loops/operate/evals/eval_queries.json +0 -30
  199. package/packs/sre-oncall/loops/operate/evals/evals.json +0 -25
  200. package/packs/sre-oncall/loops/operate/loop.json +0 -41
package/README.md CHANGED
@@ -15,22 +15,22 @@ npx skilldrop-cli install --pack dev-team # or product-manager, solution-arc
15
15
 
16
16
  From a held-out eval, written blind from the skill's description:
17
17
 
18
- > *"We're taking ClaimLens to the investment committee on Thursday… Can you build a lean canvas for it and set out our riskiest assumptions and how we'd test them?"*
18
+ > *"Our design agency sent the Figma file for Ostwick Museum's new signage as a JSON export… Can you (1) list the pages and the frames on each, (2) check the Final page against what the Brief page asks for, and (3) draft the comments I should leave for the agency on any frames with problems — one line each."*
19
19
 
20
- | Plain Claude Code | With [`lean-canvas`](https://sananthanarayan.github.io/skilldrop/skills/lean-canvas/) |
20
+ | Plain Claude Code | With [`figma-diagrams`](https://sananthanarayan.github.io/skilldrop/skills/figma-diagrams/) |
21
21
  |---|---|
22
- | Finds the corrected break-even (~225 seats), then recommends *"scope the ask to Claims-only Phase 1"*. | *"Corrected, break-even is 225 seats — more than all three departments combined (215), so full rollout still doesn't cover running costs at £40/seat."* |
22
+ | Finds the same three problems, then drafts comments of two sentences or more, and adds a fourth one about the Archive page that the file doesn't support. | *"The cover email is wrong on both counts. The Sign Types page has 11 frames, not 12, and Type 07 is missing."* Then one line per frame with a problem. |
23
23
 
24
- The blind judge picked the skill's answer: *"A misses this and recommends a Claims-only phase that cannot break even."*
24
+ Both blind judges picked the skill's answer: *"A keeps each comment to a single sentence as asked, while B's main comments run to two sentences and its fourth comment is speculative."*
25
25
 
26
26
  ## The receipts
27
27
 
28
- Every skill runs as a real agent session twice: once with the skill, once without. The results are [published either way](https://sananthanarayan.github.io/skilldrop/evals/). In the last full run (23 October 2026: 117 skills, 520 evals, `claude-sonnet-5`):
28
+ Every skill runs as a real agent session twice: once with the skill, once without. The results are [published either way](https://sananthanarayan.github.io/skilldrop/evals/). In the latest run (5 November 2026: 111 skills, 300 held-out evals written blind from each skill's description, `claude-sonnet-5-5`, scripts free to run):
29
29
 
30
- - **With a skill, answers met 73% of their checks; without one, 53%.** The checks were written by each skill's author, so the fairer numbers are the next ones.
31
- - **Two blind judges preferred the skill's answer in 62% and 61% of pairs.** Each judge saw only the request and both answers, in shuffled order. On the 176 held-out evals that no revision or admission was based on, it was 49% and 48%: no preference.
32
- - **On Sonnet 5.5, now the standard tier, the judges preferred the plain agent.** On all 308 held-out evals the skill won 40% and 43% of pairs ([what the benchmark showed](guides/explanation/what-the-benchmark-showed.md#standard-on-sonnet-55)).
33
- - **4 skills that didn't beat the plain agent were [retired](https://sananthanarayan.github.io/skilldrop/evals/#retired)**, and they're listed. Each new skill has to win on held-out evals before it ships.
30
+ - **With a skill, answers met 84% of their checks; without one, 76%.**
31
+ - **Two blind judges preferred the skill's answer in 44% and 42% of pairs.** Each judge saw only the request and both answers, in shuffled order. Skills that ship a script came out slightly ahead of the plain agent (52%); skills that are instructions alone lost about two pairs in three ([what the benchmark showed](guides/explanation/what-the-benchmark-showed.md#a-new-baseline-with-scripts-free-to-run)).
32
+ - **Loops are measured against their own skills, used without the loop.** Three are clearly ahead of both their skills and the plain agent: [`release`](packs/dev-team/loops/release/LOOP.md), [`modernize`](packs/dev-team/loops/modernize/LOOP.md) and [`ship-agent`](packs/ai-engineering/loops/ship-agent/LOOP.md). Start there: `npx skilldrop-cli install --loop release`. Four loops that lost to their own skills were retired ([RFC-0074](docs/rfcs/0074-loops-measured-four-retired.md)).
33
+ - **Ten skills and four loops that didn't beat the alternative were [retired](https://sananthanarayan.github.io/skilldrop/evals/#retired)**, and they're listed. Each new skill has to win on held-out evals before it ships.
34
34
 
35
35
  [Get started](https://sananthanarayan.github.io/skilldrop/start/) · [Browse the packs](https://sananthanarayan.github.io/skilldrop/packs/) · [Search all skills](https://sananthanarayan.github.io/skilldrop/catalogue/) · [Docs](https://sananthanarayan.github.io/skilldrop/docs/) · [What stays stable in 1.x](guides/reference/versioning-and-stability.md) · [Contribute](CONTRIBUTING.md)
36
36
 
@@ -80,7 +80,7 @@ Install one pack. Every role pack also brings `core` (intake, critique, review c
80
80
  ## How it works
81
81
 
82
82
  - **A skill produces one file you own.** Each ships a quality bar, named anti-patterns and acceptance evals, so the output is an artifact, not a conversation. See [every skill, by category](guides/reference/skill-catalogue.md).
83
- - **Loops order skills, and a gate decides when work moves on.** Five loops cover the lifecycle (`discover`, `design`, `build`, `release`, `operate`), plus the `ship-a-draft` wrapper for any document and loops for jobs beside it, such as `research`, `comply`, `adopt` for a team starting with AI, `ship-agent` for an AI agent and `provision` for a Terraform change. Each gate is a script, a review panel or a person, chosen by how expensive the mistake is to undo. See [the operating model](guides/explanation/operating-model.md) for every stage and gate on one page, [the loops, stage by stage](guides/reference/loops.md), and [why loops](guides/explanation/loops.md).
83
+ - **Loops order skills, and a gate decides when work moves on.** Loops cover three lifecycle stages (`design`, `build`, `release`), plus the `ship-a-draft` wrapper for any document and loops for jobs beside it, such as `research`, `comply`, `ship-agent` for an AI agent and `provision` for a Terraform change. Every loop is measured against its own skills used without it; four that lost were retired. Each gate is a script, a review panel or a person, chosen by how expensive the mistake is to undo. See [the operating model](guides/explanation/operating-model.md) for every stage and gate on one page, [the loops, stage by stage](guides/reference/loops.md), and [why loops](guides/explanation/loops.md).
84
84
  - **Measured, not asserted.** `run_bench.py` runs each acceptance eval with the skill and without it, in a sandbox, and reports the lift, a blind preference from two judges, and the cost per run. The results are published whether or not they flatter the skills. See [how skills are checked](https://sananthanarayan.github.io/skilldrop/evals/) and [RFC-0040](docs/rfcs/0040-skill-benchmark.md).
85
85
  - **Copy, never transform.** A skill is a plain `SKILL.md` folder in the [Agent Skills](https://agentskills.io) format, at `packs/<pack>/skills/<name>/`. What runs in your agent is byte-identical to what is reviewed here. There is no runtime, and the tooling has zero dependencies.
86
86
  - **Updates keep your edits.** `npx skilldrop-cli update` replaces files you haven't touched. For any file you changed, it leaves the new version beside it as `<file>.upstream`. See [upgrade installed skills](guides/how-to/upgrade-skills.md).
package/bin/skilldrop.js CHANGED
@@ -264,11 +264,16 @@ function readPacksCatalog(dir, source) {
264
264
  }
265
265
 
266
266
  /* RFC-0046: a skill that left the catalogue keeps a record in catalogue.json `retired`, so an
267
- installed copy can say why it stopped updating instead of looking like an unreachable source. */
268
- function retiredNote(cat, s) {
267
+ installed copy can say why it stopped updating instead of looking like an unreachable source.
268
+ RFC-0074: a loop can be retired too; its record says "kind": "loop". `isLoop` picks the kind
269
+ the caller is asking about; left out, a record of either kind answers (search). */
270
+ function retiredNote(cat, s, isLoop) {
269
271
  const r = cat && cat.retired && cat.retired[s];
270
272
  if (!r) return null;
271
- return `'${s}' was retired in ${r.in}: ${r.why}` + (r.instead ? ` Use ${r.instead} instead.` : "");
273
+ const kind = r.kind || "skill";
274
+ if (isLoop !== undefined && kind !== (isLoop ? "loop" : "skill")) return null;
275
+ const what = kind === "loop" ? `The loop '${s}'` : `'${s}'`;
276
+ return `${what} was retired in ${r.in}: ${r.why}` + (r.instead ? ` Use ${r.instead} instead.` : "");
272
277
  }
273
278
 
274
279
  /* Minimal TOML read — the [pack] table's basic-string scalars (name, version, description).
@@ -1225,7 +1230,7 @@ function expandNames(args, cat) {
1225
1230
  return packMembers(ps, args.flags.pack, "skills");
1226
1231
  }
1227
1232
  if (!args._.length) die("nothing to install — pass skill names, --pack <name>, or --all");
1228
- for (const s of args._) if (!skillExists(cat, s)) die(retiredNote(cat, s) || `unknown skill '${s}' in catalog '${cat.source}'`);
1233
+ for (const s of args._) if (!skillExists(cat, s)) die(retiredNote(cat, s, false) || `unknown skill '${s}' in catalog '${cat.source}'`);
1229
1234
  return args._.slice();
1230
1235
  }
1231
1236
 
@@ -1567,7 +1572,7 @@ function installedRows(flags) {
1567
1572
  const loop = isLoopEntry(entry);
1568
1573
  try {
1569
1574
  cat = resolveCatalog(src === BUNDLED ? undefined : src);
1570
- if (!loop && !unitExists(cat, s, loop)) retired = retiredNote(cat, s);
1575
+ if (!unitExists(cat, s, loop)) retired = retiredNote(cat, s, loop);
1571
1576
  if (unitExists(cat, s, loop)) {
1572
1577
  current = unitMeta(cat, s, loop).version || null;
1573
1578
  // Same version, different files: the catalog changed the skill without bumping it.
@@ -1711,7 +1716,7 @@ function outdated(args) {
1711
1716
  console.log(`\n${drift.length} skill(s) changed upstream with the same version. Read the change first (skilldrop diff <skill>),` +
1712
1717
  `\nthen take it with: skilldrop update --changed`);
1713
1718
  if (gone.length)
1714
- console.log(`\n${gone.length} retired skill(s) will not update. Keep them as they are, or remove them: skilldrop uninstall ${gone.map((r) => r.s).join(" ")}${targetHint(args.flags)}`);
1719
+ console.log(`\n${gone.length} retired skill(s) or loop(s) will not update. Keep them as they are, or remove them: skilldrop uninstall ${gone.map((r) => r.s).join(" ")}${targetHint(args.flags)}`);
1715
1720
  console.log(stale.length ? `\n${stale.length} outdated — run: skilldrop update` : (drift.length || gone.length ? "" : "everything up to date."));
1716
1721
  }
1717
1722
 
@@ -1767,7 +1772,7 @@ function diff(args) {
1767
1772
  const loop = isLoopEntry(entry);
1768
1773
  const src = args.flags.from || (entry ? lsrc(entry) : BUNDLED);
1769
1774
  const cat = resolveCatalog(src === BUNDLED ? undefined : src);
1770
- if (!unitExists(cat, s, loop)) die(loop ? `'${s}' is no longer in catalog '${cat.source}'` : (retiredNote(cat, s) || `'${s}' is no longer in catalog '${cat.source}'`));
1775
+ if (!unitExists(cat, s, loop)) die(retiredNote(cat, s, loop) || `'${s}' is no longer in catalog '${cat.source}'`);
1771
1776
  const theirs = unitHashes(cat, s, loop), mine = fileHashes(path.join(dest, s));
1772
1777
  const base = (entry && entry.files) || {};
1773
1778
  const changed = Object.keys(theirs).filter((f) => f in mine && mine[f] !== theirs[f]).sort();
@@ -1811,7 +1816,7 @@ function doctor(args) {
1811
1816
  else try { data = JSON.parse(raw); } catch (e) { add("error", `${lp} is not valid JSON`, "fix or delete it; skilldrop can't track updates until then"); }
1812
1817
  const names = Object.keys(data);
1813
1818
  for (const n of names) {
1814
- const note = !isLoopEntry(data[n]) && lsrc(data[n]) === BUNDLED && retiredNote(resolveCatalog(), n);
1819
+ const note = lsrc(data[n]) === BUNDLED && retiredNote(resolveCatalog(), n, isLoopEntry(data[n]));
1815
1820
  if (note) add("warn", note, `skilldrop uninstall ${n}${targetHint(args.flags)}, or keep it as it is; it will not update`);
1816
1821
  if (!fs.existsSync(path.join(dest, n))) add("error", `${n} is in the ledger but its folder is gone`, `skilldrop install ${n} (or uninstall ${n} to drop the record)`);
1817
1822
  else if (!data[n].file) {
@@ -2293,7 +2298,7 @@ function installLoops(args) {
2293
2298
  }
2294
2299
  if (!names.length && args.flags.all) names = available.slice();
2295
2300
  if (!names.length) die("nothing to install — pass loop names, --pack <name>, or --all");
2296
- for (const n of names) if (!available.includes(n)) die(`unknown loop '${n}' in catalog '${cat.source}'`);
2301
+ for (const n of names) if (!available.includes(n)) die(retiredNote(cat, n, true) || `unknown loop '${n}' in catalog '${cat.source}'`);
2297
2302
 
2298
2303
  let bad = 0;
2299
2304
  for (const n of names) {
@@ -2569,7 +2574,7 @@ function info(args) {
2569
2574
  if (args.flags.pack) return infoPack(args);
2570
2575
  const cat = resolveCatalog(args.flags.from);
2571
2576
  const s = args._[0] || die("pass a skill name, or --pack <name>");
2572
- if (!skillExists(cat, s)) die(retiredNote(cat, s) || `unknown skill '${s}' in catalog '${cat.source}'`);
2577
+ if (!skillExists(cat, s)) die(retiredNote(cat, s, false) || `unknown skill '${s}' in catalog '${cat.source}'`);
2573
2578
  const m = manifestOf(cat, s);
2574
2579
  const ps = packsOf(cat) || {};
2575
2580
  const inPacks = Object.entries(ps).filter(([, p]) => p.skills.includes(s)).map(([n]) => n);
package/catalogue.json CHANGED
@@ -18,8 +18,7 @@
18
18
  "success-metrics",
19
19
  "user-story-splitter",
20
20
  "user-journey-map",
21
- "feedback-synthesis",
22
- "lean-canvas"
21
+ "feedback-synthesis"
23
22
  ]
24
23
  },
25
24
  "design-the-system": {
@@ -124,7 +123,6 @@
124
123
  "ai-adoption-rollout",
125
124
  "ai-usage-policy",
126
125
  "agent-adoption-stage",
127
- "ai-usage-report",
128
126
  "agent-config-review",
129
127
  "agent-incident-response"
130
128
  ]
@@ -217,6 +215,12 @@
217
215
  "md-to-html": { "in": "1.2.0", "why": "On its held-out evals, in each of two trials and with both blind judges, the agent without it made the better page: the skill's script showed raw HTML as text and its security policy blocked embeds, and it adds no rule the agent breaks." },
218
216
  "mermaid-render": { "in": "1.2.0", "why": "On its held-out evals, in each of two trials and with both blind judges, the agent without it fixed the same diagrams, ran the Mermaid CLI itself and said plainly what it had not rendered; the skill adds no rule it breaks." },
219
217
  "marketing-flyer": { "in": "1.2.0", "why": "On its held-out evals, in each of two trials and with both blind judges, the agent without it built the whole flyer with placeholders where the skill stopped or used a generic template; it adds no rule the agent breaks." },
220
- "deck-builder": { "in": "1.2.0", "why": "On its held-out evals the agent without it built the better deck in each of two trials; rebuilt rule-first, with its script able to run, it still lost on fresh evals (judges 2 and 1 of 4; 69% of checks against 81%).", "instead": "md-to-pptx" }
218
+ "deck-builder": { "in": "1.2.0", "why": "On its held-out evals the agent without it built the better deck in each of two trials; rebuilt rule-first, with its script able to run, it still lost on fresh evals (judges 2 and 1 of 4; 69% of checks against 81%).", "instead": "md-to-pptx" },
219
+ "ai-usage-report": { "in": "1.4.0", "why": "On its held-out evals, over three trials and with both blind judges, the agent without it made the better report: it kept every rule the skill teaches (counts show activity, not quality; missing data is not zero; no leaderboard), while the skill refused to rank when asked, hid names the manager had supplied, and its script read neither eval's export." },
220
+ "lean-canvas": { "in": "1.4.0", "why": "On its held-out evals, in each of three trials and with both blind judges, the agent without it made the better canvas: it caught the same errors and went further, while the skill's lead on checks came from its own format and its script's break-even left out the cost of replacing lost customers.", "instead": "business-case" },
221
+ "adopt": { "in": "1.5.0", "kind": "loop", "why": "On its held-out evals its own four skills, installed without the loop, were preferred in every pair by both blind judges: the loop narrowed the policy to the first use case when the team had no rules at all, its gate swapped out the use case the sponsor had chosen, and its reply carried gate jargon. Install ai-use-case-triage, ai-readiness-assessment, ai-usage-policy and ai-adoption-rollout and run them in the pack's order." },
222
+ "apply": { "in": "1.5.0", "kind": "loop", "why": "On its held-out evals its own skills, installed without the loop, were preferred in every pair by both blind judges: its fit gate stopped before writing anything even when the candidate had already decided to apply, and its confirm gate left form answers blank. Use job-fit-analysis to decide, then resume-tailor, cover-letter and application-form-answers." },
223
+ "discover": { "in": "1.5.0", "kind": "loop", "why": "On its held-out evals the plain agent was preferred in every pair and its own skills in three of four: its ratification gate refused to record an approval the requester had already given, and its reply carried gate jargon. Use feedback-synthesis on raw signal, then prd-draft." },
224
+ "operate": { "in": "1.5.0", "kind": "loop", "why": "On its held-out evals its own skills, installed without the loop, were preferred in every pair by both blind judges: the skills already link instrumentation, runbook, comms and postmortem, and the loop added gate jargon and broke its own one rule. Use observability-plan, runbook-generator, incident-comms and postmortem-generator in that order." }
221
225
  }
222
226
  }
@@ -31,13 +31,14 @@
31
31
  },
32
32
  "retired": {
33
33
  "type": "object",
34
- "description": "RFC-0046. Skills removed from the catalogue, so an installed copy can say why it stopped updating. A retired name has no folder and nothing references it; validate.py checks both.",
34
+ "description": "RFC-0046. Skills (and, RFC-0074, loops) removed from the catalogue, so an installed copy can say why it stopped updating. A retired name has no folder and nothing references it; validate.py checks both.",
35
35
  "additionalProperties": {
36
36
  "type": "object",
37
37
  "additionalProperties": false,
38
38
  "required": ["in", "why"],
39
39
  "properties": {
40
40
  "in": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$", "description": "The skilldrop-cli version that removed it." },
41
+ "kind": { "enum": ["skill", "loop"], "description": "RFC-0074. What was retired; a record without it is a skill." },
41
42
  "why": { "type": "string", "description": "One sentence, shown by outdated, update, doctor, diff, info and install." },
42
43
  "instead": { "type": "string", "description": "A skill that covers the same job, when one does. Omit it when the agent without a skill does as well." }
43
44
  }
@@ -107,8 +107,8 @@
107
107
  "rationale": "Structures a decision into MADR/Nygard. Some judgment on title/consequences; not adversarial."
108
108
  },
109
109
  "agent-adoption-stage": {
110
- "tier": "standard",
111
- "rationale": "Places a team on a fixed 5-stage ladder from observables and routes one unlock. Bounded diagnosis against a rubric; escalate via ambiguous-input when the observables are contradictory or the distribution is heavily skewed."
110
+ "tier": "light",
111
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 79% and 86% of checks in two tier trials, against standard's 82% and heavy's 79% and 79%, within 5 points of the best both times."
112
112
  },
113
113
  "agent-budget": {
114
114
  "tier": "standard",
@@ -135,8 +135,8 @@
135
135
  "rationale": "Repo inspection plus synthesis against a fixed section order and line budget — the same shape as reverse-architecture. The judgment is the counterfactual test on each convention line, which is bounded; escalate via large-input on monorepos."
136
136
  },
137
137
  "ai-adoption-rollout": {
138
- "tier": "standard",
139
- "rationale": "Generates a phased people-rollout with gates and enablement from a stated tool and population. Structured planning against a fixed shape; escalate via ambiguous-input for large or politically contested rollouts."
138
+ "tier": "light",
139
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 79% and 71% of checks in two tier trials, against standard's 75% and heavy's 64% and 64%, within 5 points of the best both times."
140
140
  },
141
141
  "ai-readiness-assessment": {
142
142
  "tier": "standard",
@@ -146,25 +146,21 @@
146
146
  "tier": "standard",
147
147
  "rationale": "Drafts a policy document against a fixed structure (tiers, behaviours, review matrix, exception route). Bounded generation; escalate via ambiguous-input where a regulatory regime is named or contested."
148
148
  },
149
- "ai-usage-report": {
150
- "tier": "standard",
151
- "rationale": "Tabulates telemetry into a report. Mostly mechanical, but the 'AI theater' effectiveness call needs judgment."
152
- },
153
149
  "ai-use-case-triage": {
154
- "tier": "standard",
155
- "rationale": "Scores candidates on weighted axes and forces a rejection list. Structured comparison with stated weights; escalate via ambiguous-input when candidates are numerous or the value data is contested."
150
+ "tier": "light",
151
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 83% and 92% of checks in two tier trials, against standard's 81% and heavy's 85% and 92%, within 5 points of the best both times."
156
152
  },
157
153
  "api-contract-draft": {
158
- "tier": "standard",
159
- "rationale": "Schema synthesis against fixed conventions. The resource modeling needs judgment; the conventions bound it. Escalate via ambiguous-input on contested multi-team contracts."
154
+ "tier": "light",
155
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 76% and 92% of checks in two tier trials, against standard's 69% and heavy's 69% and 76%, within 5 points of the best both times."
160
156
  },
161
157
  "application-form-answers": {
162
- "tier": "standard",
163
- "rationale": "Sorts questions into three kinds and drafts short answers from the resume. The hard rule is mechanical: a declaration is never answered for the person."
158
+ "tier": "light",
159
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 88% and 94% of checks in two tier trials, against standard's 88% and heavy's 81% and 81%, within 5 points of the best both times."
164
160
  },
165
161
  "architecture-diagrams": {
166
- "tier": "standard",
167
- "rationale": "Translates prose to diagram syntax. Correctness matters; reasoning is bounded."
162
+ "tier": "light",
163
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 93% and 100% of checks in two tier trials, against standard's 93% and heavy's 93% and 93%, within 5 points of the best both times."
168
164
  },
169
165
  "audience-profile": {
170
166
  "tier": "light",
@@ -187,8 +183,8 @@
187
183
  "rationale": "Extraction + tagging [explicit]/[implied]/[inferred]. The tagging needs care — above light, below heavy."
188
184
  },
189
185
  "bug-triage": {
190
- "tier": "standard",
191
- "rationale": "Extraction plus judgment calls (severity vs priority, hypothesis ranking) — same shape as brief-intake: above light, below heavy."
186
+ "tier": "heavy",
187
+ "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)."
192
188
  },
193
189
  "bundle-size-review": {
194
190
  "tier": "standard",
@@ -219,8 +215,8 @@
219
215
  "rationale": "Multi-perspective deliberation + weighted reconciliation across distinct expert seats. Cheaper models collapse the seats into one voice and either manufacture or miss the real cruxes. Never downgrade."
220
216
  },
221
217
  "cover-letter": {
222
- "tier": "standard",
223
- "rationale": "A short letter from supplied facts, with a script listing every figure and name the person's material doesn't contain."
218
+ "tier": "light",
219
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 100% and 100% of checks in two tier trials, against standard's 100% and heavy's 100% and 100%, within 5 points of the best both times."
224
220
  },
225
221
  "dashboard-spec": {
226
222
  "tier": "standard",
@@ -231,8 +227,8 @@
231
227
  "rationale": "Schema + SLA synthesis against fixed quality dimensions and an evolution matrix. Semantics capture needs care; bounded by the catalog. Escalate via large-input on wide schemas."
232
228
  },
233
229
  "decision-log": {
234
- "tier": "light",
235
- "rationale": "Extracts decisions/owners/dates from notes. Pattern extraction; escalate on long transcripts via large-input rule."
230
+ "tier": "standard",
231
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier fell more than 5 points behind the best in both tier trials (79% and 61% against standard's 79%); one step up, to standard."
236
232
  },
237
233
  "delivery-metrics-report": {
238
234
  "tier": "standard",
@@ -243,8 +239,8 @@
243
239
  "rationale": "Reads a version diff, changelogs and CI evidence against a fixed checklist; the merge verdict follows from what is verified, not open-ended judgment."
244
240
  },
245
241
  "design-doc": {
246
- "tier": "standard",
247
- "rationale": "Synthesizes a design doc from a brief. Escalate to heavy via large-input or ambiguous-input when alternatives are genuinely contested."
242
+ "tier": "light",
243
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 88% and 88% of checks in two tier trials, against standard's 92% and heavy's 91% and 91%, within 5 points of the best both times."
248
244
  },
249
245
  "design-system-spec": {
250
246
  "tier": "standard",
@@ -276,16 +272,16 @@
276
272
  "rationale": "Compression to one page. Needs to keep the right signal; escalate on very long source docs."
277
273
  },
278
274
  "feature-implement-loop": {
279
- "tier": "standard",
280
- "rationale": "Code + test generation against acceptance criteria. The adversarial pass delegates to devils-advocate (heavy) where available; the loop itself is generation."
275
+ "tier": "light",
276
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 85% and 85% of checks in two tier trials, against standard's 85% and heavy's 76% and 85%, within 5 points of the best both times."
281
277
  },
282
278
  "feedback-synthesis": {
283
279
  "tier": "standard",
284
280
  "rationale": "Coding feedback into themes is bounded judgment; the counts by distinct person and segment come from its script."
285
281
  },
286
282
  "figma-diagrams": {
287
- "tier": "standard",
288
- "rationale": "API calls + spec generation. Bounded transformation."
283
+ "tier": "light",
284
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 92% and 92% of checks in two tier trials, against standard's 92% and heavy's 75% and 92%, within 5 points of the best both times."
289
285
  },
290
286
  "file-to-markdown": {
291
287
  "tier": "light",
@@ -300,8 +296,8 @@
300
296
  "rationale": "Judgment-heavy: generating real rivals, rating every evidence-hypothesis cell honestly and resisting the favourite theory is where a fast pass fails; the script only does the arithmetic."
301
297
  },
302
298
  "incident-comms": {
303
- "tier": "standard",
304
- "rationale": "Audience-segmented message generation under a strict don't-retract discipline. Same shape as exec-summary/audience-profile — translation and altitude, not adversarial reasoning."
299
+ "tier": "light",
300
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 93% and 100% of checks in two tier trials, against standard's 85% and heavy's 92% and 93%, within 5 points of the best both times."
305
301
  },
306
302
  "information-architecture": {
307
303
  "tier": "standard",
@@ -323,13 +319,9 @@
323
319
  "tier": "standard",
324
320
  "rationale": "Checks evidence against a fixed checklist. Bounded synthesis, not adversarial review."
325
321
  },
326
- "lean-canvas": {
327
- "tier": "standard",
328
- "rationale": "Filling the canvas is structured; the value is in ranking assumptions by risk and naming the cheapest test that could kill the riskiest one."
329
- },
330
322
  "llm-eval-harness": {
331
- "tier": "standard",
332
- "rationale": "Methodology synthesis against a fixed decision tree and pitfall catalog. Grading-method and metric choices need judgment but are bounded; escalate via ambiguous-input on novel task types."
323
+ "tier": "light",
324
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 71% and 71% of checks in two tier trials, against standard's 71% and heavy's 71% and 71%, within 5 points of the best both times."
333
325
  },
334
326
  "mcp-pairing": {
335
327
  "tier": "standard",
@@ -340,8 +332,8 @@
340
332
  "rationale": "Mechanical conversion to Confluence storage format done by its script, with an optional publish; the model checks what was dropped and what will be overwritten."
341
333
  },
342
334
  "md-to-docx": {
343
- "tier": "standard",
344
- "rationale": "A stdlib script does the conversion; the model restructures the Markdown so it converts cleanly (heading levels, footnotes, HTML), reads each warning and explains the losses. Bounded editing, no open-ended generation."
335
+ "tier": "heavy",
336
+ "rationale": "Measured (RFC-0073): on its held-out evals the heavy tier met 79% and 93% of checks in two tier trials, against standard's 64% and light's 71% and 79%, more than 5 points ahead both times."
345
337
  },
346
338
  "md-to-pptx": {
347
339
  "tier": "light",
@@ -368,40 +360,40 @@
368
360
  "rationale": "Structured derivation against a fixed roll-up discipline; the causal-sentence and gap judgments need care but the template bounds them. Escalate via ambiguous-input when the company objectives themselves are contested."
369
361
  },
370
362
  "output-hygiene": {
371
- "tier": "standard",
372
- "rationale": "The mechanical pass is a deterministic script; the model does bounded rewriting of flagged prose against a fixed tell list, not adversarial review."
363
+ "tier": "light",
364
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 100% and 100% of checks in two tier trials, against standard's 92% and heavy's 100% and 92%, within 5 points of the best both times."
373
365
  },
374
366
  "postmortem-generator": {
375
- "tier": "standard",
376
- "rationale": "Synthesizes a structured doc from incident notes. Contributing-factor chains need judgment but are bounded; escalate via large-input on huge scrollbacks."
367
+ "tier": "light",
368
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 93% and 91% of checks in two tier trials, against standard's 92% and heavy's 90% and 87%, within 5 points of the best both times."
377
369
  },
378
370
  "pr-description-writer": {
379
- "tier": "standard",
380
- "rationale": "Reads a diff and rewrites it for a reviewer. Bounded by the diff; the judgment is in picking what a reviewer needs first."
371
+ "tier": "light",
372
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 85% and 85% of checks in two tier trials, against standard's 85% and heavy's 77% and 85%, within 5 points of the best both times."
381
373
  },
382
374
  "prd-draft": {
383
- "tier": "standard",
384
- "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."
375
+ "tier": "heavy",
376
+ "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)."
385
377
  },
386
378
  "pre-merge-review": {
387
- "tier": "standard",
388
- "rationale": "Orchestration: runs a deterministic gate script, dispatches the (heavy) reviewer subagents, and renders a rule-based go/no-go. The adversarial reasoning is delegated to the panel, so the skill itself is coordination."
379
+ "tier": "light",
380
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 93% and 93% of checks in two tier trials, against standard's 86% and heavy's 93% and 93%, within 5 points of the best both times."
389
381
  },
390
382
  "prfaq": {
391
383
  "tier": "standard",
392
384
  "rationale": "Synthesizes a press release and FAQs from a product concept against a fixed format. The specificity discipline needs care but the template bounds it; escalate via ambiguous-input when the concept itself is contested."
393
385
  },
394
386
  "prompt-caching-advisor": {
395
- "tier": "standard",
396
- "rationale": "Structural analysis of prompt with threshold arithmetic and pattern matching — above light, no need for heavy."
387
+ "tier": "heavy",
388
+ "rationale": "Measured (RFC-0073): on its held-out evals the heavy tier met 90% and 90% of checks in two tier trials, against standard's 63% and light's 83% and 73%, more than 5 points ahead both times; moved once its examples/ oracle shipped (RFC-0074)."
397
389
  },
398
390
  "refactor-plan": {
399
391
  "tier": "standard",
400
392
  "rationale": "Sequencing behaviour-preserving steps follows known patterns (characterise, parallel change, strangle); escalate via ambiguous-input for contested rewrites."
401
393
  },
402
394
  "release-notes": {
403
- "tier": "standard",
404
- "rationale": "Classifies commits and rewrites them for a reader. The audience translation needs judgment; escalate via large-input on very long ranges."
395
+ "tier": "light",
396
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 96% and 96% of checks in two tier trials, against standard's 91% and heavy's 100% and 98%, within 5 points of the best both times."
405
397
  },
406
398
  "rendering-strategy": {
407
399
  "tier": "standard",
@@ -412,12 +404,12 @@
412
404
  "rationale": "Question banks are rubric-shaped, but ranking by design impact and deriving falsification conditions for the specific feature is synthesis — above light."
413
405
  },
414
406
  "research-plan": {
415
- "tier": "standard",
416
- "rationale": "Structured planning against a fixed shape (decision, sub-questions, methods, criteria, stopping rule); needs judgment to cut scope but no adversarial reasoning."
407
+ "tier": "light",
408
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 79% and 79% of checks in two tier trials, against standard's 79% and heavy's 79% and 79%, within 5 points of the best both times."
417
409
  },
418
410
  "resume-tailor": {
419
- "tier": "standard",
420
- "rationale": "Reorders and rewords existing content against a posting, with a script listing every figure and name the original doesn't contain."
411
+ "tier": "light",
412
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 100% and 100% of checks in two tier trials, against standard's 100% and heavy's 100% and 100%, within 5 points of the best both times."
421
413
  },
422
414
  "reverse-architecture": {
423
415
  "tier": "standard",
@@ -444,20 +436,20 @@
444
436
  "rationale": "Matches questions to evidence and writes short answers. The hard rule is mechanical: no evidence, no answer."
445
437
  },
446
438
  "service-blueprint": {
447
- "tier": "standard",
448
- "rationale": "Structured mapping of a described service into fixed lanes, with fail points, waits and a ranking. Tracing causes needs judgment, but the lane structure and the input bound it."
439
+ "tier": "light",
440
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 100% and 92% of checks in two tier trials, against standard's 92% and heavy's 85% and 92%, within 5 points of the best both times."
449
441
  },
450
442
  "skill-author": {
451
- "tier": "standard",
452
- "rationale": "Structured authoring against a fixed anatomy. The judgment is in the description and sibling boundaries, which the interview anchors; skill-review is the adversarial pass."
443
+ "tier": "light",
444
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 100% and 93% of checks in two tier trials, against standard's 93% and heavy's 100% and 92%, within 5 points of the best both times."
453
445
  },
454
446
  "skill-review": {
455
447
  "tier": "heavy",
456
448
  "rationale": "Adversarial audit with a verdict: routing collisions and paraphrased safety issues are what a fast pass misses, and the lint script covers only the mechanical half."
457
449
  },
458
450
  "slide-outliner": {
459
- "tier": "standard",
460
- "rationale": "Outlines a deck to a time budget. Structuring, not deep reasoning."
451
+ "tier": "light",
452
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 86% and 90% of checks in two tier trials, against standard's 83% and heavy's 83% and 93%, within 5 points of the best both times."
461
453
  },
462
454
  "slo-spec": {
463
455
  "tier": "standard",
@@ -476,8 +468,8 @@
476
468
  "rationale": "Formats Sonar API findings into a report. The hard analysis is Sonar's; this is synthesis. Escalate on very large diffs."
477
469
  },
478
470
  "source-synthesis": {
479
- "tier": "standard",
480
- "rationale": "Bounded synthesis over supplied text with a fixed citation format and strength criteria; the citation checker catches the mechanical failures, so mid-tier judgment is enough."
471
+ "tier": "light",
472
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 83% and 78% of checks in two tier trials, against standard's 76% and heavy's 85% and 82%, within 5 points of the best both times."
481
473
  },
482
474
  "sql-review": {
483
475
  "tier": "heavy",
@@ -488,32 +480,32 @@
488
480
  "rationale": "Framework selection plus evidenced multi-factor judgment ending in a ranked, committal verdict. Cheaper models fill cells with generic filler, skip the TOWS crossings, and refuse to take a side. Never downgrade."
489
481
  },
490
482
  "subagent-design": {
491
- "tier": "standard",
492
- "rationale": "Design synthesis against a fixed topology catalog and role-card template. The fan-out-or-refuse judgment is bounded by the three-reasons rule; escalate via ambiguous-input on genuinely novel workflow shapes."
483
+ "tier": "heavy",
484
+ "rationale": "Measured (RFC-0073): on its held-out evals the heavy tier met 100% and 100% of checks in two tier trials, against standard's 86% and light's 85% and 86%, more than 5 points ahead both times; moved once its examples/ oracle shipped (RFC-0074)."
493
485
  },
494
486
  "success-metrics": {
495
487
  "tier": "standard",
496
488
  "rationale": "Structured measurement design; the primary-metric and counter-metric choices need judgment but the template bounds it. Escalate via ambiguous-input when the goal itself is contested."
497
489
  },
498
490
  "team-status-report": {
499
- "tier": "standard",
500
- "rationale": "A script computes every count and the suggested RAG; the model writes plain-language summaries, attributes outside facts and frames risks and asks. Bounded writing over computed numbers."
491
+ "tier": "light",
492
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 93% and 93% of checks in two tier trials, against standard's 93% and heavy's 93% and 93%, within 5 points of the best both times."
501
493
  },
502
494
  "tech-debt-register": {
503
495
  "tier": "standard",
504
496
  "rationale": "Structures and ranks items against stated evidence. Judgment is bounded: a cost with no evidence is recorded as unknown, not estimated."
505
497
  },
506
498
  "terraform-module": {
507
- "tier": "standard",
508
- "rationale": "Structured generation against fixed module conventions and a secure-defaults checklist; the judgment is bounded to choosing defaults and validation rules for a described need."
499
+ "tier": "light",
500
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 100% and 100% of checks in two tier trials, against standard's 92% and heavy's 83% and 100%, within 5 points of the best both times."
509
501
  },
510
502
  "terraform-plan-review": {
511
503
  "tier": "heavy",
512
504
  "rationale": "Adversarial review of a destructive change: judging which replacements lose data, which access changes widen exposure, and what is out of scope needs careful reasoning; a missed destroy costs far more than the model."
513
505
  },
514
506
  "test-plan-generator": {
515
- "tier": "standard",
516
- "rationale": "Synthesizes a structured plan from a change description. Risk ranking needs judgment but is bounded; escalate via ambiguous-input on contested or high-stakes releases."
507
+ "tier": "light",
508
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 76% and 92% of checks in two tier trials, against standard's 76% and heavy's 61% and 54%, within 5 points of the best both times."
517
509
  },
518
510
  "threat-model": {
519
511
  "tier": "heavy",
@@ -524,24 +516,24 @@
524
516
  "rationale": "Arithmetic breakdown plus heuristic judgment on dominant cost drivers — standard fits."
525
517
  },
526
518
  "tool-use-schema-writer": {
527
- "tier": "standard",
528
- "rationale": "Schema generation from natural-language description — structured output task that fits standard tier."
519
+ "tier": "light",
520
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 94% and 94% of checks in two tier trials, against standard's 96% and heavy's 97% and 97%, within 5 points of the best both times."
529
521
  },
530
522
  "tracker-brief-sync": {
531
523
  "tier": "standard",
532
524
  "rationale": "Maps doc sections to items and writes acceptance criteria that restate requirements; a script checks the spec, writes the import file and computes drift. Bounded transformation with a deterministic check."
533
525
  },
534
526
  "user-journey-map": {
535
- "tier": "standard",
536
- "rationale": "Structured synthesis into a fixed four-row stage model plus bounded ranking judgment. Escalate via ambiguous-input when the persona or outcome is contested or research inputs conflict."
527
+ "tier": "heavy",
528
+ "rationale": "Measured (RFC-0073): on its held-out evals the heavy tier met 83% and 83% of checks in two tier trials, against standard's 75% and light's 67% and 75%, more than 5 points ahead both times."
537
529
  },
538
530
  "user-story-splitter": {
539
531
  "tier": "standard",
540
532
  "rationale": "Decomposes an epic into INVEST slices with testable ACs. Structured synthesis; escalation rules cover large or contradictory PRDs."
541
533
  },
542
534
  "ux-writing": {
543
- "tier": "standard",
544
- "rationale": "Short-form writing to fixed slot rules and character budgets, plus a terminology consistency pass. Bounded generation with clear checks."
535
+ "tier": "light",
536
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 92% and 92% of checks in two tier trials, against standard's 83% and heavy's 75% and 83%, within 5 points of the best both times."
545
537
  },
546
538
  "web-performance-review": {
547
539
  "tier": "standard",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skilldrop-cli",
3
- "version": "1.3.0",
3
+ "version": "1.5.0",
4
4
  "description": "Portable AI-agent skills, measured against the agent without them. ADRs, PRDs, runbooks, decks and reviews, installable into Claude Code, Cursor, Kiro, and any IDE that takes custom instructions. One command per skill or per role-based pack.",
5
5
  "author": {
6
6
  "name": "Sanjay Ananthanarayan",
@@ -82,7 +82,6 @@ The load-bearing idea: **the bottleneck moves.** Each stage is limited by someth
82
82
  - ❌ Assessing organisational preconditions — data, policy ownership, incentives — that's [`ai-readiness-assessment`](../ai-readiness-assessment/SKILL.md), a different axis (a team can be governance-ready and stuck at stage 1).
83
83
  - ❌ Planning how a tool reaches people — cohorts, enablement, comms — that's [`ai-adoption-rollout`](../ai-adoption-rollout/SKILL.md).
84
84
  - ❌ Choosing which use cases to build — that's [`ai-use-case-triage`](../ai-use-case-triage/SKILL.md).
85
- - ❌ Reporting measured usage from telemetry — that's [`ai-usage-report`](../ai-usage-report/SKILL.md).
86
85
  - ❌ Designing one specific loop or fleet — that's `agent-loop-design` / `subagent-design`, which this skill routes *to*.
87
86
 
88
87
  ## Anti-patterns to avoid