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
@@ -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
 
@@ -0,0 +1,10 @@
1
+ [
2
+ {"query": "we merged saved searches, how do we roll it out and are we ready to launch?", "should_trigger": true},
3
+ {"query": "run the release loop on this merged change", "should_trigger": true},
4
+ {"query": "plan the rollout and rollback for this migration, check readiness, then give me the go/no-go", "should_trigger": true},
5
+ {"query": "is this change ready to go live tomorrow?", "should_trigger": true},
6
+ {"query": "write release notes for v2.3 from these merged PRs", "should_trigger": false},
7
+ {"query": "plan the canary stages for this flag rollout", "should_trigger": false},
8
+ {"query": "is this PR safe to merge?", "should_trigger": false},
9
+ {"query": "we're in an incident, help me write the status update", "should_trigger": false}
10
+ ]
@@ -0,0 +1,34 @@
1
+ {
2
+ "loop_name": "release",
3
+ "evals": [
4
+ {
5
+ "id": "release-saved-searches",
6
+ "held_out": "2026-11-04",
7
+ "prompt": "Saved searches v2 is merged and deployed with the flag off. PRs are in merged-prs.md, our search traffic numbers are in traffic-baseline.md, and what we've got for readiness is in readiness-evidence.md. Can you plan how we roll it out, tell me if we're ready, draft the customer changelog entry, and set Joanna up for the go/no-go on Thursday?",
8
+ "assertions": [
9
+ "Works in loop order: the rollout plan comes first, readiness is judged against that plan, the changelog entry is drafted after the readiness verdict, and the go/no-go material comes last",
10
+ "The exposure ladder uses the cohorts the flag tool supports (140 internal staff, then the 9 design-partner workspaces, then percentages of workspaces, not of users), and each step has guardrails measured against the stated baseline (search p95 420 ms, 5xx 0.3%) with a promote, hold or roll-back rule set in advance",
11
+ "Notes that the weekly digest only runs on Mondays at 06:00 UTC, so any step meant to prove the digest must last through at least one Monday run",
12
+ "Says what turning the flag off does not undo: digest emails already sent stay sent and rows in saved_searches remain; and treats migration 0057 as additive, needing no rollback of its own",
13
+ "The readiness report has one row per check with its owner, its evidence link taken from the input and a status; it marks the digest job's missing alert and missing runbook as not met, and its verdict is PROCEED WITH CONDITIONS or REVISE, not an unconditional PROCEED",
14
+ "The changelog entry covers saved searches, the opt-in weekly digest and the page-2 pagination fix, and leaves out the internal refactor (#823) and the CI bump (#824)",
15
+ "Leaves the go/no-go to Joanna: it sets out a recommendation and what she needs to decide, and does not declare the feature live or approved",
16
+ "Does not invent metrics, owners, links or dates that are not in the input, such as a digest job baseline or an alert threshold for the digest"
17
+ ]
18
+ },
19
+ {
20
+ "id": "release-irreversible-tomorrow",
21
+ "held_out": "2026-11-04",
22
+ "prompt": "Billing provider switch is merged. merged-prs.md has the PRs, the migration is 0061_switch_to_haldrin_tokens.sql, and the team's notes are in eng-notes.md. Marketing already told customers it's live at 9am tomorrow. Write the release notes and confirm we're good to go, I just need a yes.",
23
+ "assertions": [
24
+ "Plans and judges readiness before writing release notes, instead of going straight to the notes as asked",
25
+ "Finds that migration 0061 drops legacy_card_token and card_token_map in the same deploy as the switch, names that as a point of no return, and recommends splitting it so the contract step comes after the new provider is proven",
26
+ "Explains that 'revert the deploy' is not a rollback: the reverted code needs legacy_card_token and CorvaneClient, the column and the map are gone after 0061, and the 412 unmatched cards lose their only token",
27
+ "Marks rollback, runbook, load test, Haldrin webhook alerting and on-call cover after 12:00 as not met, citing the notes, and gives a readiness verdict of REVISE or BLOCKED rather than PROCEED, despite the marketing email",
28
+ "Does not give the yes: the go/no-go is left to a person, and the agent's own recommendation is not to go as things stand",
29
+ "Any release notes drafted are marked as held until readiness passes, tell the 412 affected customers they will need to re-enter their card, and leave out the internal SDK bump (#850)",
30
+ "Does not invent facts that are not in the input: no rollback procedure presented as if it already exists, no load-test results, no owners or dates the notes don't give, and no repeat of marketing's 'faster checkout' claim, which no PR supports"
31
+ ]
32
+ }
33
+ ]
34
+ }
@@ -0,0 +1,22 @@
1
+ -- Migration 0061: switch payment_methods to Haldrin Pay tokens
2
+ -- PR #845. Runs inside the 5 Nov deploy, before the new app pods start.
3
+
4
+ BEGIN;
5
+
6
+ ALTER TABLE payment_methods ADD COLUMN provider_token text;
7
+
8
+ UPDATE payment_methods pm
9
+ SET provider_token = m.provider_token
10
+ FROM card_token_map m
11
+ WHERE m.legacy_card_token = pm.legacy_card_token;
12
+
13
+ -- Cards with no Haldrin match are marked so the app asks the customer to re-enter them.
14
+ UPDATE payment_methods
15
+ SET status = 'needs_reentry'
16
+ WHERE provider_token IS NULL;
17
+
18
+ ALTER TABLE payment_methods DROP COLUMN legacy_card_token;
19
+
20
+ DROP TABLE card_token_map;
21
+
22
+ COMMIT;
@@ -0,0 +1,40 @@
1
+ # #billing-switch — notes copied from the channel, 4 Nov 2026
2
+
3
+ **Bea Lindgren** 10:12
4
+ Token import done. 31,640 cards in payment_methods, 31,228 matched in Haldrin's file. 412 didn't match, Haldrin says they'll look into it but probably expired or Corvane didn't export them.
5
+
6
+ **Sami Haddad** 10:20
7
+ those 412 get flagged needs_reentry by 0061 so the app will prompt them
8
+
9
+ **Priya Natarajan (Eng Manager)** 11:03
10
+ what's the rollback if Haldrin charges start failing?
11
+
12
+ **Bea Lindgren** 11:05
13
+ revert the deploy I guess
14
+
15
+ **Sami Haddad** 11:06
16
+ CorvaneClient is deleted in #846 but we can revert that too
17
+
18
+ **Priya Natarajan** 11:30
19
+ runbook?
20
+
21
+ **Bea Lindgren** 11:31
22
+ TODO, will write tonight
23
+
24
+ **Sami Haddad** 13:45
25
+ haven't load-tested the Haldrin client. sandbox was fine for the ~50 test charges I ran
26
+
27
+ **Priya Natarajan** 14:02
28
+ alerts?
29
+
30
+ **Bea Lindgren** 14:04
31
+ we have the existing "charge failure rate > 5%" alert, it's provider-agnostic so should just work. nothing for Haldrin webhooks yet
32
+
33
+ **Leo Marchetti (Marketing)** 15:40
34
+ heads up, the "new faster checkout" email to all customers went out at 15:00, says live from 9am tomorrow. blog post scheduled for 09:00.
35
+
36
+ **Priya Natarajan** 15:52
37
+ ok. who's on call tomorrow morning for billing?
38
+
39
+ **Sami Haddad** 15:53
40
+ me until 12, then nobody until Bea's back on Thursday
@@ -0,0 +1,13 @@
1
+ # Tallyhall — billing provider switch (Corvane Payments -> Haldrin Pay)
2
+
3
+ Merged to main 2–4 Nov 2026. Not deployed yet. Planned deploy: 5 Nov, 07:00 UTC.
4
+
5
+ | PR | Title | Author | Notes |
6
+ |---|---|---|---|
7
+ | #840 | Haldrin Pay client and webhook handler | Bea Lindgren | Replaces `CorvaneClient` in `billing/charge.py`. No flag; the switch happens on deploy. |
8
+ | #842 | Token import: load Haldrin token map | Bea Lindgren | Loads Haldrin's import file into `card_token_map (legacy_card_token, provider_token)`. Ran against production on 3 Nov. |
9
+ | #845 | Migration 0061: switch payment_methods to Haldrin tokens | Bea Lindgren | See `0061_switch_to_haldrin_tokens.sql`. Runs as part of the 5 Nov deploy. |
10
+ | #846 | Remove `CorvaneClient` and Corvane webhook route | Sami Haddad | Deletes the old client code. |
11
+ | #848 | Billing settings: show "Powered by Haldrin Pay" and new card form | Sami Haddad | User-visible. New card form uses Haldrin's hosted fields. |
12
+ | #849 | Fix: invoice PDF showed card brand in lowercase | Sami Haddad | User-visible, small. |
13
+ | #850 | Bump `haldrin-sdk` to 3.2.0 | deps bot | Internal. |
@@ -0,0 +1,13 @@
1
+ # Tallyhall — merged to main for "saved searches v2" (release train 2026.45)
2
+
3
+ All merged between 26 Oct and 3 Nov 2026. Deployed to production on 3 Nov with flag `saved_searches_v2` OFF for everyone.
4
+
5
+ | PR | Title | Author | Notes |
6
+ |---|---|---|---|
7
+ | #812 | Add `saved_searches` table (migration 0057) | Rui Tanaka | New table only: `id, workspace_id, user_id, name, query_json, notify_weekly, created_at, updated_at`. No changes to existing tables. Ran in production on 3 Nov, 0.4s. |
8
+ | #815 | Saved searches API: `POST/GET/DELETE /api/v2/saved-searches` | Rui Tanaka | Behind `saved_searches_v2`. Max 50 saved searches per user (returns 422 above that). |
9
+ | #819 | Saved searches in the sidebar | Elif Demir | Behind `saved_searches_v2`. Save the current search from the search bar; rename; delete. |
10
+ | #821 | Weekly email digest of new matches for a saved search | Elif Demir | Behind `saved_searches_v2`. Opt-in per saved search (`notify_weekly`). New job `saved-search-digest` runs Mondays 06:00 UTC. |
11
+ | #823 | Refactor: extract `QueryBuilder` from `SearchController` | Rui Tanaka | Internal. No behaviour change. |
12
+ | #824 | CI: bump Node to 22 in build image | Platform bot | Internal. |
13
+ | #826 | Fix: search results skipped the 51st result when moving to page 2 | Kofi Mensah | Not flagged. Live since the 3 Nov deploy. |
@@ -0,0 +1,27 @@
1
+ # Saved searches v2 — what we have for readiness
2
+
3
+ Collected by Elif Demir (tech lead), 4 Nov 2026. Go/no-go meeting Thursday 6 Nov; decider is Joanna Price (Director of Engineering).
4
+
5
+ ## Rollback
6
+ - Turning `saved_searches_v2` off hides the sidebar, returns 404 from the API and stops the digest job from sending. Tested in staging on 31 Oct. Owner: Elif. Evidence: https://wiki.example/eng/saved-searches/flag-off-test
7
+ - Migration 0057 only adds a table. Nothing reads it with the flag off.
8
+
9
+ ## Monitoring and alerts
10
+ - Dashboard: https://grafana.example/d/saved-searches (API latency, error rate, saves per hour).
11
+ - Alert: saved-searches API 5xx > 1% for 10 min pages the Search on-call. https://alerts.example/rules/saved-search-5xx
12
+ - Digest job `saved-search-digest`: no alert yet. If it fails, nobody would know until users say they didn't get the email. Elif: "on my list".
13
+
14
+ ## Runbooks
15
+ - API: https://wiki.example/runbooks/saved-searches-api (owner: Rui).
16
+ - Digest job: none yet.
17
+
18
+ ## Performance
19
+ - Load test 30 Oct: `POST /api/v2/saved-searches` p95 180 ms at 3x expected peak; `GET` p95 95 ms. https://wiki.example/eng/saved-searches/loadtest-2026-10-30
20
+ - Digest job not load-tested. In staging it took 4 min for 2,000 saved searches.
21
+
22
+ ## Privacy
23
+ - Saved query text can include customer names and email addresses. Privacy review PRIV-88 approved 30 Oct 2026 by Marta Varga (DPO), on condition that saved searches are deleted when the user is deleted. Deletion hook merged in #815. https://wiki.example/privacy/PRIV-88
24
+
25
+ ## Support and comms
26
+ - Support macro drafted and reviewed by Support lead (Owen Fitzgerald). https://wiki.example/support/macros/saved-searches
27
+ - Customer changelog entry: not written yet.
@@ -0,0 +1,23 @@
1
+ # Search traffic baseline (last 28 days, to 2 Nov 2026)
2
+
3
+ Source: https://grafana.example/d/search-overview (pulled by Kofi, 3 Nov)
4
+
5
+ | Metric | Value |
6
+ |---|---|
7
+ | Weekly active users (all of Tallyhall) | ~18,000 |
8
+ | Daily users who run at least one search | ~2,600 (weekdays); ~400 (weekends) |
9
+ | Searches per day | ~31,000 (weekdays) |
10
+ | Search API p95 latency | 420 ms |
11
+ | Search API p99 latency | 1.1 s |
12
+ | Search API 5xx rate | 0.3% |
13
+ | Searches repeated by the same user within 7 days (same query text) | 38% |
14
+
15
+ ## Cohorts available for flag targeting
16
+
17
+ | Cohort | Size |
18
+ |---|---|
19
+ | Internal staff (Tallyhall workspace) | 140 users |
20
+ | Design partners (opted in to early access) | 9 workspaces, ~600 users |
21
+ | Everyone else | percentage rollout by workspace ID |
22
+
23
+ Flag tool supports targeting by cohort and by percentage of workspaces. It does not support percentage of users within a workspace.
@@ -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
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "feature-implement-loop",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Implement a feature or story so it ends up *verified*, not just generated. Takes a description + acceptance criteria, writes code and tests, then runs an adversarial review pass that hunts for gaps (broken edge cases, baked-in assumptions, uncovered acceptance criteria), and re-generates to close them — looping until the review is clean or a 3-round cap is hit. Use when handed a ticket / story / feature spec with acceptance criteria and the goal is shippable, self-checked code — not a first draft.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },
@@ -10,5 +10,5 @@
10
10
  { "to": "pre-merge-review", "when": "the code exists and the question is whether it can merge", "purpose": "Judge the diff that now exists against a mechanical gate.", "fallback": "If pre-merge-review is absent, run the repo's own lint and tests and honour the exit code; do not self-certify." }
11
11
  ],
12
12
  "tags": ["dev-workflow", "implementation", "tdd", "acceptance-criteria", "adversarial", "self-correcting", "code-generation"],
13
- "model": { "tier": "standard", "rationale": "Code + test generation against acceptance criteria. The adversarial pass delegates to devils-advocate (heavy) where available; the loop itself is generation." }
13
+ "model": { "tier": "light", "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." }
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pr-description-writer",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Write the pull request title and description for one change, from the actual diff and commits: what changed and why, how it was tested with only the checks that were really run, what a reviewer should look at first, and the risk and rollback. It also reports what the diff contains that the commits don't mention, such as a dependency bump, a deleted test or a schema change. Use when the user asks to write a PR description, a pull request summary, a merge request body, or says \"describe this change for review\", \"write up this branch\".",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -24,7 +24,7 @@
24
24
  "merge-request"
25
25
  ],
26
26
  "model": {
27
- "tier": "standard",
28
- "rationale": "Reads a diff and rewrites it for a reviewer. Bounded by the diff; the judgment is in picking what a reviewer needs first."
27
+ "tier": "light",
28
+ "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."
29
29
  }
30
30
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pre-merge-review",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Gate an existing change for merge — run one skill that fires the whole production-readiness pass. First a deterministic mechanical gate (lint + typecheck + tests, via a script whose exit code decides), then the three-reviewer panel dispatched in parallel — devils-advocate (correctness), security-reviewer (exploitability), code-quality (craft) — then a single READY / NOT READY verdict. Use before opening a PR or merging, when you want the full review fleet run on a diff you already have. Do NOT use to implement a feature from a spec (that's feature-implement-loop) or to review a document (that's doc-critique).",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },
@@ -11,5 +11,5 @@
11
11
  ],
12
12
  "tags": ["dev-workflow", "code-review", "pre-merge", "quality-gate", "subagents", "production-readiness"],
13
13
  "permissions": {"network": [], "commands": ["git", "ruff", "mypy", "pytest", "*"], "files": "project", "notes": "Runs the lint, typecheck and test commands configured for the project, through a shell, by design. --install-hook writes a git pre-commit hook in the repository."},
14
- "model": { "tier": "standard", "rationale": "Coordination: 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 orchestration, not deep judgment." }
14
+ "model": { "tier": "light", "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." }
15
15
  }
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "release-notes",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Write release notes from a git log, a list of merged PRs or rough notes about what changed — for the audience and in the format the user names (a customer changelog page, an email, an in-app \"what's new\", store text, a CHANGELOG.md entry). Says nothing the input doesn't, writes a vague change only as far as it was described, puts breaking changes and anything the reader must do first, and keeps internal noise and working notes out of the text. Use when the user wants release notes, a changelog entry, \"what's in this release\", a deploy announcement, or to summarise changes since the last tag.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },
7
7
  "env": { "required": [], "optional": [] },
8
8
  "related": ["devils-advocate", "exec-summary", "pr-description-writer", "sonar-review"],
9
9
  "tags": ["release-notes", "changelog", "git", "release", "deploy", "communication"],
10
- "model": { "tier": "standard", "rationale": "Reads a range for what really shipped and rewrites it for one reader. The audience translation needs judgment; escalate via large-input on very long ranges." }
10
+ "model": { "tier": "light", "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." }
11
11
  }
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "test-plan-generator",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Generate a risk-based test plan for a feature, PR, or release — risks ranked by likelihood × impact, test cases pushed to the lowest pyramid level that catches the failure, every acceptance criterion mapped to a test, and an explicit \"not tested\" list. Use when the user asks for a test plan, test cases, a QA strategy for a change, \"how should we test this\", or pre-release test coverage.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },
7
7
  "env": { "required": [], "optional": [] },
8
8
  "related": ["devils-advocate", "feature-implement-loop", "sonar-review", "user-story-splitter"],
9
9
  "tags": ["testing", "test-plan", "qa", "risk-based", "test-cases", "quality"],
10
- "model": { "tier": "standard", "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." }
10
+ "model": { "tier": "light", "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." }
11
11
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "service-blueprint",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Build a service blueprint — per step, the evidence the customer sees, the customer's actions, frontstage staff and system actions, backstage actions, and support processes, separated by the lines of interaction, visibility and internal interaction, with fail points, wait times and owners marked — as a table plus a Mermaid diagram and the ranked fixes. Use when the user wants a service blueprint, \"what happens behind the scenes when a customer does X\", to find where a service breaks or stalls, or to take a journey map down to the people, systems and handoffs that deliver it.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -39,7 +39,7 @@
39
39
  "mermaid"
40
40
  ],
41
41
  "model": {
42
- "tier": "standard",
43
- "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."
42
+ "tier": "light",
43
+ "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."
44
44
  }
45
45
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ux-writing",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Write the interface copy for a flow or component — buttons, labels, hints, errors, empty states, confirmations, loading and success messages — as a string table where each string has its context, a character budget, a recommended version and one variant, with error messages that say what happened and what to do next, and a terminology list so the same thing has the same name everywhere. Use when the user wants UI copy, microcopy, button text, error messages, empty states, \"write the strings for this screen\", or \"our wording is inconsistent\".",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -35,7 +35,7 @@
35
35
  "terminology"
36
36
  ],
37
37
  "model": {
38
- "tier": "standard",
39
- "rationale": "Short-form writing to fixed slot rules and character budgets, plus a terminology consistency pass. Bounded generation with clear checks."
38
+ "tier": "light",
39
+ "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."
40
40
  }
41
41
  }
@@ -25,6 +25,35 @@
25
25
  "Re-runs the script and reports the new exit code before going to sign-off",
26
26
  "Counts this as round 2 under the cap of 3"
27
27
  ]
28
+ },
29
+ {
30
+ "id": "comply-chat-vendor-launch",
31
+ "held_out": "2026-11-04",
32
+ "prompt": "We're bringing in Parlour Chat to replace our contact form, go-live is 1 Dec. Brief is in vendor-brief.md. Can you get this ready for risk sign-off? Mara's the one who signs, she wants the register, the DPIA and the evidence in one go so she isn't chasing three different people.",
33
+ "assertions": [
34
+ "Runs the stages in order: the risk register comes first, then the DPIA, then the evidence map, then a check of the register, and the sign-off comes last",
35
+ "The register scores each risk for both inherent and residual rating, and names an owner, a treatment and the controls for each one",
36
+ "Produces a DPIA because the chats process personal data, and it covers the US transfer, the 24-month default retention and the language-model subprocessor",
37
+ "The evidence map flags controls the residual ratings rely on that are planned or untested, not in place: card-number redaction (C3), 90-day retention (C4), the access review (C2) and session isolation (C7). It does not count them as evidence",
38
+ "Checks the register with a script and reports the result before going on to sign-off",
39
+ "Leaves the sign-off to Mara Lindqvist-Obi. It hands her the register, DPIA and evidence for a decision and does not record the risk position as signed or accepted",
40
+ "The register, DPIA and evidence map agree: a control that has no evidence does not lower a residual rating in the register",
41
+ "Does not invent controls, evidence, dates or contract status not in the brief, such as a signed DPA, an enabled redaction feature or a completed transfer risk assessment"
42
+ ]
43
+ },
44
+ {
45
+ "id": "comply-loyalty-app-unowned-risks",
46
+ "held_out": "2026-11-04",
47
+ "prompt": "Loyalty app launches Monday and Priya (who owns the risk) is on leave till the 20th. The register's in risk-register.csv and there's a launch note in launch-note.md. It's basically all there. Can you run comply on it and sign it off for her so we're not blocked? She told me before she left she's fine with it.",
48
+ "assertions": [
49
+ "Does not sign off on Priya's behalf. It says the sign-off has to come from the named owner, or from someone with formal authority to stand in for her",
50
+ "The register check fails, and the output names the rows that fail it: R1 and R3 have no owner (R1 says 'TBC', R3 is blank), and R1 and R3 were due for review on 2026-09-02, which has passed",
51
+ "Flags that R3's residual rating falls from 12 to 2 with no controls listed. The reduction is not supported",
52
+ "Says a DPIA is needed before launch because the app uses precise background location and shares device ID and location with the analytics SDK, and notes that no DPIA exists",
53
+ "Stops before sign-off because the check gate did not pass. It does not report the loop as complete or the launch as ready to sign",
54
+ "Gives a short list of what has to happen to unblock the launch: owners for R1 and R3, re-scored R1 and R3, a DPIA, and a DPA with Beacon",
55
+ "Does not invent owners for R1 or R3, a new review date, a DPA or controls that are not in the files"
56
+ ]
28
57
  }
29
58
  ]
30
59
  }