skilldrop-cli 0.16.18 → 0.16.20

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 (371) hide show
  1. package/agents/devils-advocate.md +34 -22
  2. package/bin/skilldrop.js +18 -4
  3. package/catalogue.json +2 -1
  4. package/model-routing.json +219 -215
  5. package/package.json +1 -1
  6. package/packs/ai-engineering/skills/agent-adoption-stage/evals/evals.json +28 -0
  7. package/packs/ai-engineering/skills/agent-adoption-stage/evals/files/2/agent-telemetry.csv +7 -0
  8. package/packs/ai-engineering/skills/agent-adoption-stage/evals/files/2/cto-offsite-memo.md +9 -0
  9. package/packs/ai-engineering/skills/agent-adoption-stage/evals/files/2/dev-survey-summary.md +9 -0
  10. package/packs/ai-engineering/skills/agent-adoption-stage/evals/files/2/engineering-policy.md +15 -0
  11. package/packs/ai-engineering/skills/agent-budget/evals/evals.json +27 -0
  12. package/packs/ai-engineering/skills/agent-budget/evals/files/3/finance-note.md +10 -0
  13. package/packs/ai-engineering/skills/agent-budget/evals/files/3/pipeline.md +18 -0
  14. package/packs/ai-engineering/skills/agent-budget/evals/files/3/price-sheet.md +9 -0
  15. package/packs/ai-engineering/skills/agent-budget/evals/files/3/september-usage.csv +7 -0
  16. package/packs/ai-engineering/skills/agent-loop-design/evals/evals.json +28 -0
  17. package/packs/ai-engineering/skills/agent-loop-design/evals/files/3/design-guide-extract.md +13 -0
  18. package/packs/ai-engineering/skills/agent-loop-design/evals/files/3/legal-advice.md +9 -0
  19. package/packs/ai-engineering/skills/agent-loop-design/evals/files/3/request-from-head-of-planning.md +11 -0
  20. package/packs/ai-engineering/skills/agent-loop-design/evals/files/3/trial-notes.md +13 -0
  21. package/packs/ai-engineering/skills/agent-threat-model/evals/evals.json +27 -0
  22. package/packs/ai-engineering/skills/agent-threat-model/evals/files/4/agent-config.yaml +19 -0
  23. package/packs/ai-engineering/skills/agent-threat-model/evals/files/4/agent-spec.md +17 -0
  24. package/packs/ai-engineering/skills/agent-threat-model/evals/files/4/previous-review.md +10 -0
  25. package/packs/ai-engineering/skills/agent-threat-model/evals/files/4/vendor-security-note.md +4 -0
  26. package/packs/ai-engineering/skills/ai-adoption-rollout/evals/evals.json +28 -0
  27. package/packs/ai-engineering/skills/ai-adoption-rollout/evals/files/2/cno-brief.md +17 -0
  28. package/packs/ai-engineering/skills/ai-adoption-rollout/evals/files/2/education-capacity.md +5 -0
  29. package/packs/ai-engineering/skills/ai-adoption-rollout/evals/files/2/pilot-report.md +14 -0
  30. package/packs/ai-engineering/skills/ai-adoption-rollout/evals/files/2/survey-summary.md +7 -0
  31. package/packs/ai-engineering/skills/ai-adoption-rollout/evals/files/2/union-letter.md +8 -0
  32. package/packs/ai-engineering/skills/ai-readiness-assessment/evals/evals.json +28 -0
  33. package/packs/ai-engineering/skills/ai-readiness-assessment/evals/files/2/ceo-note.md +5 -0
  34. package/packs/ai-engineering/skills/ai-readiness-assessment/evals/files/2/governance-status.md +6 -0
  35. package/packs/ai-engineering/skills/ai-readiness-assessment/evals/files/2/interview-notes.md +18 -0
  36. package/packs/ai-engineering/skills/ai-readiness-assessment/evals/files/2/it-inventory.md +12 -0
  37. package/packs/ai-engineering/skills/ai-usage-report/evals/evals.json +27 -0
  38. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/draftwell-events.csv +249 -0
  39. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/export-note.md +9 -0
  40. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/published-assets.csv +44 -0
  41. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/team-roster.md +10 -0
  42. package/packs/ai-engineering/skills/ai-use-case-triage/evals/evals.json +27 -0
  43. package/packs/ai-engineering/skills/ai-use-case-triage/evals/files/2/data-team.md +5 -0
  44. package/packs/ai-engineering/skills/ai-use-case-triage/evals/files/2/finance-notes.md +7 -0
  45. package/packs/ai-engineering/skills/ai-use-case-triage/evals/files/2/ideas.csv +10 -0
  46. package/packs/ai-engineering/skills/ai-use-case-triage/evals/files/2/legal-note.md +7 -0
  47. package/packs/ai-engineering/skills/llm-eval-harness/evals/evals.json +28 -0
  48. package/packs/ai-engineering/skills/llm-eval-harness/evals/files/2/current-tests.md +6 -0
  49. package/packs/ai-engineering/skills/llm-eval-harness/evals/files/2/feature-brief.md +14 -0
  50. package/packs/ai-engineering/skills/llm-eval-harness/evals/files/2/incident-log.md +8 -0
  51. package/packs/ai-engineering/skills/llm-eval-harness/evals/files/2/pm-request.md +10 -0
  52. package/packs/ai-engineering/skills/subagent-design/evals/evals.json +27 -0
  53. package/packs/ai-engineering/skills/subagent-design/evals/files/3/current-process.md +11 -0
  54. package/packs/ai-engineering/skills/subagent-design/evals/files/3/director-proposal.md +6 -0
  55. package/packs/ai-engineering/skills/subagent-design/evals/files/3/scoring-rubric.md +9 -0
  56. package/packs/ai-engineering/skills/subagent-design/evals/files/3/trial-and-round-notes.md +11 -0
  57. package/packs/api-builder/skills/eval-harness-generator/evals/evals.json +27 -0
  58. package/packs/api-builder/skills/eval-harness-generator/evals/files/2/SKILL.md +35 -0
  59. package/packs/api-builder/skills/prompt-caching-advisor/evals/evals.json +25 -0
  60. package/packs/api-builder/skills/prompt-caching-advisor/evals/files/2/build_request.py +40 -0
  61. package/packs/api-builder/skills/prompt-caching-advisor/evals/files/2/notes.md +10 -0
  62. package/packs/api-builder/skills/token-budget-estimator/evals/evals.json +27 -0
  63. package/packs/api-builder/skills/token-budget-estimator/evals/files/2/pilot-usage.csv +17 -0
  64. package/packs/api-builder/skills/token-budget-estimator/evals/files/2/workflow.md +42 -0
  65. package/packs/career/pack.json +1 -1
  66. package/packs/career/skills/job-fit-analysis/SKILL.md +2 -1
  67. package/packs/career/skills/job-fit-analysis/manifest.json +3 -2
  68. package/packs/career/skills/role-shortlist/SKILL.md +107 -0
  69. package/packs/career/skills/role-shortlist/evals/eval_queries.json +34 -0
  70. package/packs/career/skills/role-shortlist/evals/evals.json +75 -0
  71. package/packs/career/skills/role-shortlist/evals/files/1/careers-index.html +22 -0
  72. package/packs/career/skills/role-shortlist/evals/files/1/cv.md +44 -0
  73. package/packs/career/skills/role-shortlist/evals/files/1/postings/clinical-coding-officer-bramwick.md +23 -0
  74. package/packs/career/skills/role-shortlist/evals/files/1/postings/data-and-performance-analyst.html +28 -0
  75. package/packs/career/skills/role-shortlist/evals/files/1/postings/estates-maintenance-electrician-bramwick.md +20 -0
  76. package/packs/career/skills/role-shortlist/evals/files/1/postings/healthcare-support-worker-nights-corrin-bay.md +20 -0
  77. package/packs/career/skills/role-shortlist/evals/files/1/postings/medical-secretary-cardiology-elsford.html +30 -0
  78. package/packs/career/skills/role-shortlist/evals/files/1/postings/outpatient-booking-team-leader-bramwick.md +23 -0
  79. package/packs/career/skills/role-shortlist/evals/files/1/postings/patient-pathway-coordinator-bramwick.md +30 -0
  80. package/packs/career/skills/role-shortlist/evals/files/1/postings/patient-pathway-coordinator-elsford.md +30 -0
  81. package/packs/career/skills/role-shortlist/evals/files/1/postings/reception-and-admin-assistant-corrin-bay.md +21 -0
  82. package/packs/career/skills/role-shortlist/evals/files/1/postings/senior-care-coordinator.md +25 -0
  83. package/packs/career/skills/role-shortlist/evals/files/2/cv.md +33 -0
  84. package/packs/career/skills/role-shortlist/evals/files/2/job-board-export.csv +11 -0
  85. package/packs/career/skills/role-shortlist/evals/files/2/postings/FJ-10422.md +26 -0
  86. package/packs/career/skills/role-shortlist/evals/files/2/postings/FJ-10431.md +25 -0
  87. package/packs/career/skills/role-shortlist/evals/files/2/postings/FJ-10455.md +27 -0
  88. package/packs/career/skills/role-shortlist/evals/files/2/postings/FJ-10468.md +25 -0
  89. package/packs/career/skills/role-shortlist/evals/files/2/postings/FJ-10476.md +25 -0
  90. package/packs/career/skills/role-shortlist/evals/files/2/postings/FJ-10490.md +24 -0
  91. package/packs/career/skills/role-shortlist/evals/files/2/postings/FJ-10587.md +26 -0
  92. package/packs/career/skills/role-shortlist/evals/files/4/brackwater-careers.html +118 -0
  93. package/packs/career/skills/role-shortlist/evals/files/4/mere-castell-cv.md +44 -0
  94. package/packs/career/skills/role-shortlist/evals/files/4/tradesboard-export.csv +6 -0
  95. package/packs/career/skills/role-shortlist/manifest.json +38 -0
  96. package/packs/converters/skills/file-to-markdown/evals/evals.json +27 -0
  97. package/packs/converters/skills/file-to-markdown/evals/files/3/harbourline-shift-policy.docx +0 -0
  98. package/packs/converters/skills/file-to-markdown/evals/files/4/seed-swap-2026.csv +10 -0
  99. package/packs/converters/skills/md-to-docx/evals/evals.json +28 -0
  100. package/packs/converters/skills/md-to-docx/evals/files/3/brand.json +12 -0
  101. package/packs/converters/skills/md-to-docx/evals/files/3/img/team-photo.png +0 -0
  102. package/packs/converters/skills/md-to-docx/evals/files/3/tender-response.md +51 -0
  103. package/packs/converters/skills/md-to-html/evals/evals.json +26 -0
  104. package/packs/converters/skills/md-to-html/evals/files/2/brand.json +13 -0
  105. package/packs/converters/skills/md-to-html/evals/files/2/img/kick-net.png +0 -0
  106. package/packs/converters/skills/md-to-html/evals/files/2/river-survey-guide.md +53 -0
  107. package/packs/converters/skills/md-to-html/evals/files/3/nanas-lentil-soup.md +21 -0
  108. package/packs/converters/skills/md-to-html/evals/files/3/pot.png +0 -0
  109. package/packs/converters/skills/md-to-xlsx/evals/evals.json +26 -0
  110. package/packs/converters/skills/md-to-xlsx/evals/files/3/depot-costs-q3.md +20 -0
  111. package/packs/converters/skills/md-to-xlsx/evals/files/4/hollowmere-5k-results.json +7 -0
  112. package/packs/converters/skills/mermaid-render/evals/evals.json +26 -0
  113. package/packs/converters/skills/mermaid-render/evals/files/2/dispensing-diagrams.md +39 -0
  114. package/packs/core/skills/brief-intake/evals/evals.json +27 -0
  115. package/packs/core/skills/brief-intake/evals/files/2/ops-meeting-notes.md +18 -0
  116. package/packs/core/skills/brief-intake/evals/files/2/thread.txt +40 -0
  117. package/packs/core/skills/council-review/evals/evals.json +28 -0
  118. package/packs/core/skills/council-review/evals/files/2/compliance-note.md +11 -0
  119. package/packs/core/skills/council-review/evals/files/2/link-outages-q3.csv +11 -0
  120. package/packs/core/skills/council-review/evals/files/2/proposal.md +39 -0
  121. package/packs/core/skills/council-review/evals/files/2/vendor-letter.txt +12 -0
  122. package/packs/core/skills/doc-critique/evals/evals.json +27 -0
  123. package/packs/core/skills/doc-critique/evals/files/2/exec-summary.md +43 -0
  124. package/packs/core/skills/output-hygiene/evals/evals.json +27 -0
  125. package/packs/core/skills/output-hygiene/evals/files/3/newsletter.md +17 -0
  126. package/packs/data-analytics/skills/dashboard-spec/evals/evals.json +27 -0
  127. package/packs/data-analytics/skills/dashboard-spec/evals/files/2/data-inventory.md +16 -0
  128. package/packs/data-analytics/skills/dashboard-spec/evals/files/2/request-email.md +28 -0
  129. package/packs/data-analytics/skills/sql-review/evals/evals.json +27 -0
  130. package/packs/data-analytics/skills/sql-review/evals/files/2/context.md +10 -0
  131. package/packs/data-analytics/skills/sql-review/evals/files/2/monthly_donor_revenue.sql +16 -0
  132. package/packs/data-analytics/skills/sql-review/evals/files/2/schema.md +20 -0
  133. package/packs/design/skills/brand-kit/evals/evals.json +26 -0
  134. package/packs/design/skills/brand-kit/evals/files/2/brand-guidelines.md +32 -0
  135. package/packs/design/skills/brand-kit/evals/files/2/contact-sheet.txt +6 -0
  136. package/packs/design/skills/brand-kit/evals/files/2/logo.svg +5 -0
  137. package/packs/design/skills/brand-kit/evals/files/2/website-colours.css +9 -0
  138. package/packs/design/skills/brand-kit/evals/files/3/muddy-paws-logo.png +0 -0
  139. package/packs/design/skills/deck-builder/evals/evals.json +27 -0
  140. package/packs/design/skills/deck-builder/evals/files/4/ashby-vale-board-notes.md +36 -0
  141. package/packs/design/skills/marketing-flyer/evals/evals.json +27 -0
  142. package/packs/design/skills/marketing-flyer/evals/files/2/brand.json +14 -0
  143. package/packs/design/skills/marketing-flyer/evals/files/2/larchfield-logo.svg +4 -0
  144. package/packs/design/skills/marketing-flyer/evals/files/2/manager-email.txt +6 -0
  145. package/packs/design/skills/marketing-flyer/evals/files/2/open-day-brief.md +15 -0
  146. package/packs/design/skills/slide-outliner/evals/evals.json +26 -0
  147. package/packs/design/skills/slide-outliner/evals/files/2/uv-dosing-design-notes.md +38 -0
  148. package/packs/dev-team/skills/accessibility-audit/evals/evals.json +27 -0
  149. package/packs/dev-team/skills/accessibility-audit/evals/files/2/booking.html +79 -0
  150. package/packs/dev-team/skills/accessibility-audit/evals/files/2/scan-report.txt +23 -0
  151. package/packs/dev-team/skills/accessibility-audit/evals/files/2/styles.css +56 -0
  152. package/packs/dev-team/skills/agents-md-generator/evals/evals.json +27 -0
  153. package/packs/dev-team/skills/agents-md-generator/evals/files/5/.github/workflows/ci.yml +12 -0
  154. package/packs/dev-team/skills/agents-md-generator/evals/files/5/CONTRIBUTING.md +20 -0
  155. package/packs/dev-team/skills/agents-md-generator/evals/files/5/README.md +15 -0
  156. package/packs/dev-team/skills/agents-md-generator/evals/files/5/data/raw/README.md +7 -0
  157. package/packs/dev-team/skills/agents-md-generator/evals/files/5/pyproject.toml +23 -0
  158. package/packs/dev-team/skills/agents-md-generator/evals/files/5/scripts/deploy.sh +6 -0
  159. package/packs/dev-team/skills/agents-md-generator/evals/files/5/src/sensor_ingest/__init__.py +1 -0
  160. package/packs/dev-team/skills/agents-md-generator/evals/files/5/src/sensor_ingest/parse.py +20 -0
  161. package/packs/dev-team/skills/agents-md-generator/evals/files/5/tests/test_gateway.py +10 -0
  162. package/packs/dev-team/skills/agents-md-generator/evals/files/5/tests/test_parse.py +7 -0
  163. package/packs/dev-team/skills/agents-md-generator/evals/files/6/clean_marks.R +5 -0
  164. package/packs/dev-team/skills/agents-md-generator/evals/files/6/grades_final.csv +6 -0
  165. package/packs/dev-team/skills/agents-md-generator/evals/files/6/make_report.R +7 -0
  166. package/packs/dev-team/skills/agents-md-generator/evals/files/6/notes.txt +8 -0
  167. package/packs/dev-team/skills/agents-md-generator/evals/files/6/raw_marks.csv +6 -0
  168. package/packs/dev-team/skills/bug-triage/evals/evals.json +27 -0
  169. package/packs/dev-team/skills/bug-triage/evals/files/2/payments-log.csv +15 -0
  170. package/packs/dev-team/skills/bug-triage/evals/files/2/slack-thread.txt +16 -0
  171. package/packs/dev-team/skills/bug-triage/evals/files/2/ticket.txt +10 -0
  172. package/packs/dev-team/skills/devils-advocate/SKILL.md +65 -124
  173. package/packs/dev-team/skills/devils-advocate/evals/evals.json +27 -0
  174. package/packs/dev-team/skills/devils-advocate/evals/files/6/PR_DESCRIPTION.md +20 -0
  175. package/packs/dev-team/skills/devils-advocate/evals/files/6/redeem.py +102 -0
  176. package/packs/dev-team/skills/devils-advocate/evals/files/6/test_redeem.py +54 -0
  177. package/packs/dev-team/skills/devils-advocate/examples/rate-limiter-review.md +36 -16
  178. package/packs/dev-team/skills/devils-advocate/manifest.json +3 -3
  179. package/packs/dev-team/skills/feature-implement-loop/evals/evals.json +27 -0
  180. package/packs/dev-team/skills/feature-implement-loop/evals/files/2/TICKET.md +20 -0
  181. package/packs/dev-team/skills/feature-implement-loop/evals/files/2/closures.csv +5 -0
  182. package/packs/dev-team/skills/feature-implement-loop/evals/files/2/desk.py +11 -0
  183. package/packs/dev-team/skills/feature-implement-loop/evals/files/2/fees.py +14 -0
  184. package/packs/dev-team/skills/feature-implement-loop/evals/files/2/tests/test_fees.py +26 -0
  185. package/packs/dev-team/skills/feature-implement-loop/evals/files/3/away.txt +5 -0
  186. package/packs/dev-team/skills/feature-implement-loop/evals/files/3/members.txt +8 -0
  187. package/packs/dev-team/skills/feature-implement-loop/evals/files/3/rota.py +12 -0
  188. package/packs/dev-team/skills/launch-readiness/evals/evals.json +27 -0
  189. package/packs/dev-team/skills/launch-readiness/evals/files/2/launch-brief.md +32 -0
  190. package/packs/dev-team/skills/launch-readiness/evals/files/2/load-test-summary.txt +11 -0
  191. package/packs/dev-team/skills/launch-readiness/evals/files/2/privacy-signoff.txt +9 -0
  192. package/packs/dev-team/skills/launch-readiness/evals/files/2/sms-template.txt +2 -0
  193. package/packs/dev-team/skills/migration-plan/evals/evals.json +27 -0
  194. package/packs/dev-team/skills/migration-plan/evals/files/2/context.md +27 -0
  195. package/packs/dev-team/skills/migration-plan/evals/files/2/deferral-codes.csv +8 -0
  196. package/packs/dev-team/skills/migration-plan/evals/files/2/field-mapping.csv +11 -0
  197. package/packs/dev-team/skills/migration-plan/evals/files/2/trial-import-summary.txt +9 -0
  198. package/packs/dev-team/skills/pr-description-writer/evals/evals.json +27 -0
  199. package/packs/dev-team/skills/pr-description-writer/evals/files/4/changes.diff +64 -0
  200. package/packs/dev-team/skills/pr-description-writer/evals/files/4/commits.txt +2 -0
  201. package/packs/dev-team/skills/pre-merge-review/evals/evals.json +28 -0
  202. package/packs/dev-team/skills/pre-merge-review/evals/files/3/CHANGE.md +12 -0
  203. package/packs/dev-team/skills/pre-merge-review/evals/files/3/CONTRIBUTING.md +5 -0
  204. package/packs/dev-team/skills/pre-merge-review/evals/files/3/change.diff +53 -0
  205. package/packs/dev-team/skills/pre-merge-review/evals/files/3/clinic_dosing/__init__.py +1 -0
  206. package/packs/dev-team/skills/pre-merge-review/evals/files/3/clinic_dosing/dosing.py +30 -0
  207. package/packs/dev-team/skills/pre-merge-review/evals/files/3/clinic_dosing/drugs.py +6 -0
  208. package/packs/dev-team/skills/pre-merge-review/evals/files/3/tests/__init__.py +0 -0
  209. package/packs/dev-team/skills/pre-merge-review/evals/files/3/tests/test_dosing.py +29 -0
  210. package/packs/dev-team/skills/sonar-onboard/evals/evals.json +27 -0
  211. package/packs/dev-team/skills/sonar-onboard/evals/files/2/.github/workflows/ci.yml +10 -0
  212. package/packs/dev-team/skills/sonar-onboard/evals/files/2/.gitlab-ci.yml +32 -0
  213. package/packs/dev-team/skills/sonar-onboard/evals/files/2/README.md +11 -0
  214. package/packs/dev-team/skills/sonar-onboard/evals/files/2/pyproject.toml +16 -0
  215. package/packs/dev-team/skills/sonar-onboard/evals/files/2/src/wayline/__init__.py +1 -0
  216. package/packs/dev-team/skills/sonar-onboard/evals/files/2/src/wayline/_generated/__init__.py +0 -0
  217. package/packs/dev-team/skills/sonar-onboard/evals/files/2/src/wayline/_generated/stops_pb2.py +4 -0
  218. package/packs/dev-team/skills/sonar-onboard/evals/files/2/src/wayline/timetable.py +12 -0
  219. package/packs/dev-team/skills/sonar-onboard/evals/files/2/src/wayline/vendor/__init__.py +0 -0
  220. package/packs/dev-team/skills/sonar-onboard/evals/files/2/src/wayline/vendor/gtfs_lite/__init__.py +3 -0
  221. package/packs/dev-team/skills/sonar-onboard/evals/files/2/tests/test_timetable.py +14 -0
  222. package/packs/dev-team/skills/sonar-onboard/evals/files/2/web/package.json +20 -0
  223. package/packs/dev-team/skills/sonar-onboard/evals/files/2/web/src/board.test.ts +9 -0
  224. package/packs/dev-team/skills/sonar-onboard/evals/files/2/web/src/board.ts +8 -0
  225. package/packs/dev-team/skills/sonar-review/evals/evals.json +27 -0
  226. package/packs/dev-team/skills/sonar-review/evals/files/2/changed-files.txt +5 -0
  227. package/packs/dev-team/skills/sonar-review/evals/files/2/hotspots.json +7 -0
  228. package/packs/dev-team/skills/sonar-review/evals/files/2/issues.json +26 -0
  229. package/packs/dev-team/skills/sonar-review/evals/files/2/quality-gate.json +19 -0
  230. package/packs/dev-team/skills/tech-debt-register/evals/evals.json +28 -0
  231. package/packs/dev-team/skills/tech-debt-register/evals/files/4/incidents.csv +7 -0
  232. package/packs/dev-team/skills/tech-debt-register/evals/files/4/retro-notes.md +21 -0
  233. package/packs/dev-team/skills/test-plan-generator/evals/evals.json +27 -0
  234. package/packs/dev-team/skills/test-plan-generator/evals/files/2/permit-renewal-spec.md +40 -0
  235. package/packs/dev-team/skills/user-story-splitter/evals/evals.json +27 -0
  236. package/packs/dev-team/skills/user-story-splitter/evals/files/2/prd-shift-swap.md +38 -0
  237. package/packs/experience-design/skills/content-design/evals/evals.json +27 -0
  238. package/packs/experience-design/skills/content-design/evals/files/2/contact-centre-notes.md +18 -0
  239. package/packs/experience-design/skills/content-design/evals/files/2/current-page.md +17 -0
  240. package/packs/experience-design/skills/content-design/evals/files/2/policy-extract.md +17 -0
  241. package/packs/experience-design/skills/design-system-spec/evals/evals.json +27 -0
  242. package/packs/experience-design/skills/design-system-spec/evals/files/2/designer-notes.md +23 -0
  243. package/packs/experience-design/skills/design-system-spec/evals/files/2/eng-thread.md +11 -0
  244. package/packs/experience-design/skills/design-system-spec/evals/files/2/tokens.json +27 -0
  245. package/packs/experience-design/skills/information-architecture/evals/evals.json +27 -0
  246. package/packs/experience-design/skills/information-architecture/evals/files/2/page-inventory.csv +28 -0
  247. package/packs/experience-design/skills/information-architecture/evals/files/2/search-log.csv +16 -0
  248. package/packs/experience-design/skills/information-architecture/evals/files/2/stakeholder-notes.md +13 -0
  249. package/packs/experience-design/skills/service-blueprint/evals/evals.json +27 -0
  250. package/packs/experience-design/skills/service-blueprint/evals/files/2/complaints-summary.md +14 -0
  251. package/packs/experience-design/skills/service-blueprint/evals/files/2/process-notes.md +15 -0
  252. package/packs/experience-design/skills/service-blueprint/evals/files/2/timings.csv +5 -0
  253. package/packs/experience-design/skills/ux-writing/evals/evals.json +27 -0
  254. package/packs/experience-design/skills/ux-writing/evals/files/2/brand-notes.md +8 -0
  255. package/packs/experience-design/skills/ux-writing/evals/files/2/error-codes.csv +6 -0
  256. package/packs/experience-design/skills/ux-writing/evals/files/2/screens.md +26 -0
  257. package/packs/grc/skills/dpia/evals/evals.json +27 -0
  258. package/packs/grc/skills/dpia/evals/files/2/legal-notes.md +6 -0
  259. package/packs/grc/skills/dpia/evals/files/2/project-brief.md +17 -0
  260. package/packs/grc/skills/dpia/evals/files/2/vendor-factsheet.md +8 -0
  261. package/packs/grc/skills/risk-register/evals/evals.json +27 -0
  262. package/packs/grc/skills/risk-register/evals/files/2/committee-notes.md +8 -0
  263. package/packs/grc/skills/risk-register/evals/files/2/risks-draft.csv +9 -0
  264. package/packs/grc/skills/risk-register/evals/files/2/scoring-scale.md +12 -0
  265. package/packs/grc/skills/security-questionnaire-response/evals/evals.json +27 -0
  266. package/packs/grc/skills/security-questionnaire-response/evals/files/4/evidence/business-continuity-plan.md +7 -0
  267. package/packs/grc/skills/security-questionnaire-response/evals/files/4/evidence/information-security-policy.md +10 -0
  268. package/packs/grc/skills/security-questionnaire-response/evals/files/4/evidence/pentest-summary-2026.md +10 -0
  269. package/packs/grc/skills/security-questionnaire-response/evals/files/4/evidence/staff-handbook-extract.md +3 -0
  270. package/packs/grc/skills/security-questionnaire-response/evals/files/4/instructions.md +10 -0
  271. package/packs/grc/skills/security-questionnaire-response/evals/files/4/questionnaire.csv +11 -0
  272. package/packs/grc/skills/soc2-evidence-map/evals/evals.json +27 -0
  273. package/packs/grc/skills/soc2-evidence-map/evals/files/2/audit-scope.md +10 -0
  274. package/packs/grc/skills/soc2-evidence-map/evals/files/2/controls.csv +13 -0
  275. package/packs/grc/skills/soc2-evidence-map/evals/files/2/tooling-notes.md +8 -0
  276. package/packs/infra-as-code/skills/terraform-module/evals/evals.json +27 -0
  277. package/packs/infra-as-code/skills/terraform-module/evals/files/3/requirements.md +23 -0
  278. package/packs/infra-as-code/skills/terraform-plan-review/evals/evals.json +27 -0
  279. package/packs/infra-as-code/skills/terraform-plan-review/evals/files/3/plan.txt +87 -0
  280. package/packs/product-manager/skills/business-case/evals/evals.json +27 -0
  281. package/packs/product-manager/skills/business-case/evals/files/2/hollin_vale_inputs.md +46 -0
  282. package/packs/product-manager/skills/okr-cascade/evals/evals.json +27 -0
  283. package/packs/product-manager/skills/okr-cascade/evals/files/3/quillfield_2027.md +45 -0
  284. package/packs/product-manager/skills/prd-draft/evals/evals.json +27 -0
  285. package/packs/product-manager/skills/prd-draft/evals/files/2/brief.md +7 -0
  286. package/packs/product-manager/skills/prd-draft/evals/files/2/call_center_notes.md +7 -0
  287. package/packs/product-manager/skills/prd-draft/evals/files/2/meter_facts.md +6 -0
  288. package/packs/product-manager/skills/prfaq/evals/evals.json +26 -0
  289. package/packs/product-manager/skills/prfaq/evals/files/3/drone_notes.md +25 -0
  290. package/packs/product-manager/skills/requirements-interview/evals/evals.json +27 -0
  291. package/packs/product-manager/skills/requirements-interview/evals/files/2/project_brief.md +29 -0
  292. package/packs/product-manager/skills/strategy-analysis/evals/evals.json +27 -0
  293. package/packs/product-manager/skills/strategy-analysis/evals/files/4/market_notes.md +21 -0
  294. package/packs/product-manager/skills/success-metrics/evals/evals.json +28 -0
  295. package/packs/product-manager/skills/success-metrics/evals/files/3/brief.md +21 -0
  296. package/packs/product-manager/skills/user-journey-map/evals/evals.json +26 -0
  297. package/packs/product-manager/skills/user-journey-map/evals/files/3/research_notes.md +30 -0
  298. package/packs/research/skills/hypothesis-comparison/evals/evals.json +27 -0
  299. package/packs/research/skills/hypothesis-comparison/evals/files/2/season_notes.md +29 -0
  300. package/packs/research/skills/research-plan/evals/evals.json +28 -0
  301. package/packs/research/skills/research-plan/evals/files/3/request.md +19 -0
  302. package/packs/skill-engineering/skills/skill-author/evals/evals.json +27 -0
  303. package/packs/skill-engineering/skills/skill-author/evals/files/2/constraints.md +7 -0
  304. package/packs/skill-engineering/skills/skill-author/evals/files/2/example-discharge.md +22 -0
  305. package/packs/skill-engineering/skills/skill-author/evals/files/2/process.md +15 -0
  306. package/packs/skill-engineering/skills/skill-review/evals/evals.json +27 -0
  307. package/packs/skill-engineering/skills/skill-review/evals/files/2/invoice-chaser/SKILL.md +20 -0
  308. package/packs/skill-engineering/skills/skill-review/evals/files/2/invoice-chaser/evals/evals.json +12 -0
  309. package/packs/skill-engineering/skills/skill-review/evals/files/2/invoice-chaser/scripts/send_reminders.py +46 -0
  310. package/packs/solution-architect/skills/adr-generator/evals/evals.json +27 -0
  311. package/packs/solution-architect/skills/adr-generator/evals/files/2/integration-notes.md +23 -0
  312. package/packs/solution-architect/skills/adr-generator/evals/files/2/larchway-quote.txt +10 -0
  313. package/packs/solution-architect/skills/api-contract-draft/evals/evals.json +27 -0
  314. package/packs/solution-architect/skills/api-contract-draft/evals/files/2/booking-brief.md +18 -0
  315. package/packs/solution-architect/skills/api-contract-draft/evals/files/2/facilities-policy-excerpt.md +7 -0
  316. package/packs/solution-architect/skills/architecture-diagrams/evals/evals.json +27 -0
  317. package/packs/solution-architect/skills/architecture-diagrams/evals/files/2/telemetry-overview.md +23 -0
  318. package/packs/solution-architect/skills/data-contract/evals/evals.json +27 -0
  319. package/packs/solution-architect/skills/data-contract/evals/files/2/grain_deliveries.sql +15 -0
  320. package/packs/solution-architect/skills/data-contract/evals/files/2/publisher-notes.md +14 -0
  321. package/packs/solution-architect/skills/data-contract/evals/files/2/sample_rows.csv +6 -0
  322. package/packs/solution-architect/skills/figma-diagrams/evals/evals.json +26 -0
  323. package/packs/solution-architect/skills/figma-diagrams/evals/files/2/signage-file.json +373 -0
  324. package/packs/solution-architect/skills/nfr-spec/evals/evals.json +27 -0
  325. package/packs/solution-architect/skills/nfr-spec/evals/files/2/vehicle-booking-brief.md +21 -0
  326. package/packs/solution-architect/skills/reverse-architecture/evals/evals.json +28 -0
  327. package/packs/solution-architect/skills/reverse-architecture/evals/files/2/README.md +11 -0
  328. package/packs/solution-architect/skills/reverse-architecture/evals/files/2/docker-compose.yml +42 -0
  329. package/packs/solution-architect/skills/reverse-architecture/evals/files/2/env.example +3 -0
  330. package/packs/solution-architect/skills/reverse-architecture/evals/files/2/nginx.conf +15 -0
  331. package/packs/solution-architect/skills/reverse-architecture/evals/files/2/worker-requirements.txt +4 -0
  332. package/packs/solution-architect/skills/threat-model/evals/evals.json +28 -0
  333. package/packs/solution-architect/skills/threat-model/evals/files/2/permits-design.md +23 -0
  334. package/packs/sre-oncall/skills/capacity-cost-model/evals/evals.json +28 -0
  335. package/packs/sre-oncall/skills/capacity-cost-model/evals/files/2/brief.md +22 -0
  336. package/packs/sre-oncall/skills/capacity-cost-model/evals/files/2/price-sheet.md +13 -0
  337. package/packs/sre-oncall/skills/capacity-cost-model/evals/files/2/rollout-plan.md +27 -0
  338. package/packs/sre-oncall/skills/cloud-cost-review/evals/evals.json +28 -0
  339. package/packs/sre-oncall/skills/cloud-cost-review/evals/files/3/cost-export-2026-09.csv +25 -0
  340. package/packs/sre-oncall/skills/cloud-cost-review/evals/files/3/notes.md +11 -0
  341. package/packs/sre-oncall/skills/cloud-cost-review/evals/files/3/utilisation-2026-09.csv +12 -0
  342. package/packs/sre-oncall/skills/delivery-metrics-report/evals/evals.json +27 -0
  343. package/packs/sre-oncall/skills/delivery-metrics-report/evals/files/3/deploys.csv +68 -0
  344. package/packs/sre-oncall/skills/delivery-metrics-report/evals/files/3/incidents.csv +7 -0
  345. package/packs/sre-oncall/skills/delivery-metrics-report/evals/files/3/prs.csv +46 -0
  346. package/packs/sre-oncall/skills/incident-comms/evals/evals.json +27 -0
  347. package/packs/sre-oncall/skills/incident-comms/evals/files/2/comms-rules.md +6 -0
  348. package/packs/sre-oncall/skills/incident-comms/evals/files/2/incident-channel.txt +17 -0
  349. package/packs/sre-oncall/skills/incident-comms/evals/files/2/last-status-update.md +5 -0
  350. package/packs/sre-oncall/skills/observability-plan/evals/evals.json +27 -0
  351. package/packs/sre-oncall/skills/observability-plan/evals/files/2/constraints.md +9 -0
  352. package/packs/sre-oncall/skills/observability-plan/evals/files/2/current-alerts.csv +10 -0
  353. package/packs/sre-oncall/skills/observability-plan/evals/files/2/service-overview.md +27 -0
  354. package/packs/sre-oncall/skills/runbook-generator/evals/evals.json +27 -0
  355. package/packs/sre-oncall/skills/runbook-generator/evals/files/2/deploy.sh +14 -0
  356. package/packs/sre-oncall/skills/runbook-generator/evals/files/2/handover-chat.txt +8 -0
  357. package/packs/sre-oncall/skills/runbook-generator/evals/files/2/service-notes.md +26 -0
  358. package/packs/sre-oncall/skills/runbook-generator/evals/files/2/standing-order.md +3 -0
  359. package/packs/stakeholder-comms/skills/audience-profile/evals/evals.json +26 -0
  360. package/packs/stakeholder-comms/skills/decision-log/evals/evals.json +26 -0
  361. package/packs/stakeholder-comms/skills/decision-log/evals/files/2/committee-meeting-2026-09-03.txt +23 -0
  362. package/packs/stakeholder-comms/skills/decision-log/evals/files/2/followup-thread.txt +6 -0
  363. package/packs/stakeholder-comms/skills/exec-summary/evals/evals.json +26 -0
  364. package/packs/stakeholder-comms/skills/exec-summary/evals/files/2/library-branches-options-paper.md +67 -0
  365. package/packs/trackers/skills/backlog-triage/evals/evals.json +27 -0
  366. package/packs/trackers/skills/backlog-triage/evals/files/3/parks-backlog.csv +19 -0
  367. package/packs/trackers/skills/team-status-report/evals/evals.json +28 -0
  368. package/packs/trackers/skills/team-status-report/evals/files/3/larkspur-week-42.csv +15 -0
  369. package/packs/trackers/skills/tracker-brief-sync/evals/evals.json +28 -0
  370. package/packs/trackers/skills/tracker-brief-sync/evals/files/3/brief-home-delivery.md +44 -0
  371. package/packs/dev-team/skills/devils-advocate/templates/challenge.md +0 -118
@@ -0,0 +1,11 @@
1
+ """Check-in handler used by the desk app."""
2
+ from datetime import date
3
+
4
+ from fees import late_fee
5
+
6
+
7
+ def checkin(item: dict, returned: date | None = None) -> dict:
8
+ """item has keys: barcode, type, due, replacement_cost, card_type."""
9
+ returned = returned or date.today()
10
+ fee = late_fee(item["type"], item["due"], returned)
11
+ return {"barcode": item["barcode"], "fee": fee}
@@ -0,0 +1,14 @@
1
+ """Late-fee calculation for the circulation desk."""
2
+ from datetime import date
3
+
4
+ ITEM_TYPES = ("book", "dvd", "magazine")
5
+
6
+ # Policy board minute 2024-07: maximum late fee per item.
7
+ MAX_FEE = 15.00
8
+
9
+
10
+ def late_fee(item_type: str, due: date, returned: date) -> float:
11
+ """Return the late fee in dollars for one item."""
12
+ if returned <= due:
13
+ return 0.0
14
+ raise NotImplementedError("LIB-88")
@@ -0,0 +1,26 @@
1
+ import os
2
+ import sys
3
+ import unittest
4
+ from datetime import date
5
+
6
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
7
+
8
+ from desk import checkin # noqa: E402
9
+ from fees import late_fee # noqa: E402
10
+
11
+
12
+ class OnTimeReturns(unittest.TestCase):
13
+ def test_returned_on_due_date_is_free(self):
14
+ self.assertEqual(late_fee("book", date(2026, 3, 6), date(2026, 3, 6)), 0.0)
15
+
16
+ def test_returned_early_is_free(self):
17
+ self.assertEqual(late_fee("dvd", date(2026, 3, 6), date(2026, 3, 1)), 0.0)
18
+
19
+ def test_checkin_on_time(self):
20
+ item = {"barcode": "B100", "type": "book", "due": date(2026, 3, 6),
21
+ "replacement_cost": 18.00, "card_type": "adult"}
22
+ self.assertEqual(checkin(item, date(2026, 3, 6)), {"barcode": "B100", "fee": 0.0})
23
+
24
+
25
+ if __name__ == "__main__":
26
+ unittest.main()
@@ -0,0 +1,5 @@
1
+ away in nov/dec:
2
+ joan whitcombe
3
+ Petr Halloran
4
+ Edith Marsh (back for the 5 dec one)
5
+ Ruth Ng
@@ -0,0 +1,8 @@
1
+ Joan Whitcombe
2
+ Petr Halloran
3
+ Edith Marsh
4
+ Samir Oyelaran
5
+ Bea Lindqvist
6
+ Tom Achterberg
7
+ Gwen Pryce
8
+ Hal Moreno
@@ -0,0 +1,12 @@
1
+ # makes the tea & setup rota for rehearsals
2
+ import itertools
3
+
4
+ DATES = ["7 Nov", "14 Nov", "21 Nov", "28 Nov", "5 Dec"]
5
+
6
+ with open("members.txt") as f:
7
+ members = [line.strip() for line in f if line.strip()]
8
+
9
+ people = itertools.cycle(members)
10
+ for d in DATES:
11
+ a, b = next(people), next(people)
12
+ print(f"{d}: {a} & {b}")
@@ -14,6 +14,33 @@
14
14
  "The verdict is BLOCKED, and the reason given is the missing rollback",
15
15
  "No dashboards, test results, or sign-offs are invented beyond what the prompt supplied"
16
16
  ]
17
+ },
18
+ {
19
+ "id": 2,
20
+ "held_out": "2026-10-18",
21
+ "prompt": "We're switching on SMS 'ready to collect' reminders across Brightwell Pharmacies on Monday. Everything is in launch-brief.md, load-test-summary.txt, privacy-signoff.txt and sms-template.txt. I need to tell the steering group on Friday that we're green. One page please.",
22
+ "assertions": [
23
+ "Does not say the launch is green; it recommends not launching on Monday as planned until the named problems are fixed",
24
+ "Catches that the load test only sustained 1,200 messages per minute, with rate limiting above 1,250, against an expected peak of 1,500, which contradicts the brief's 'tested at 3x peak'",
25
+ "Catches that the SMS template includes the medication name, which the privacy sign-off explicitly does not approve",
26
+ "Catches that turning the flag off does not undo migration 0042, which drops patients.reminder_opt_in, so the stated rollback is not a full one",
27
+ "Notes that no alerts exist yet and that switching on all 140 stores at once leaves no staged rollout",
28
+ "Does not invent evidence, owners' names, dates or test results that are not in the files",
29
+ "Fits on one page"
30
+ ]
31
+ },
32
+ {
33
+ "id": 3,
34
+ "held_out": "2026-10-18",
35
+ "prompt": "we run a small yoga studio and we're turning on online class booking tomorrow. the guy who set it up says it's all done. are we ready? what should I check before tomorrow? short list please",
36
+ "assertions": [
37
+ "Does not declare the studio ready, because nothing has been shown beyond the setup person saying it is done",
38
+ "Gives a short checklist, not a long report",
39
+ "Includes trying a real booking from start to finish, including payment and a cancellation or refund",
40
+ "Includes a fallback for if the booking system fails on the day (for example taking bookings by phone or on paper) and telling customers about the change",
41
+ "Uses plain language a studio owner can follow",
42
+ "Does not invent details of their booking system, prices or policies"
43
+ ]
17
44
  }
18
45
  ]
19
46
  }
@@ -0,0 +1,32 @@
1
+ # Launch brief: SMS "ready to collect" reminders
2
+
3
+ Owner: Digital Pharmacy product team, Brightwell Pharmacies
4
+ Status: PR #2207 merged to main on 13 Oct
5
+
6
+ ## What it does
7
+ When a repeat prescription is ready, the patient gets an SMS telling them where and when to
8
+ collect it. Patients who have opted in to reminders only.
9
+
10
+ ## Data change
11
+ Migration 0042 moves reminder opt-in from the `patients.reminder_opt_in` column to a new
12
+ `contact_preferences` table, then drops `patients.reminder_opt_in`.
13
+
14
+ ## Rollout
15
+ Monday 08:00, all 140 stores at once: the `sms_reminders` flag is switched on globally.
16
+
17
+ ## Rollback
18
+ Turn the `sms_reminders` flag off.
19
+
20
+ ## Capacity
21
+ Load tested at 3x expected peak - see load-test-summary.txt.
22
+ Expected peak: 1,500 messages per minute on Monday morning (weekend backlog of prescriptions).
23
+
24
+ ## Monitoring
25
+ SMS provider's delivery dashboard. Alerts: TBD.
26
+
27
+ ## Comms
28
+ - Store staff briefing pack: drafted, sent to store managers 10 Oct.
29
+ - Patient FAQ page: drafted, not yet published.
30
+
31
+ ## Privacy
32
+ Signed off - see privacy-signoff.txt. Message wording in sms-template.txt.
@@ -0,0 +1,11 @@
1
+ Load test - SMS reminder sender (staging, provider sandbox)
2
+ Date: 8 Oct
3
+
4
+ Ramp: 200 -> 1,400 messages/min over 30 min
5
+
6
+ Peak sustained rate: 1,200 messages/min for 20 min
7
+ p95 send latency: 2.1 s
8
+ Error rate at 1,200/min: 0.4%
9
+
10
+ Above 1,250 messages/min the provider returned HTTP 429 (rate limited) on 31% of sends.
11
+ Retries were not enabled for this run.
@@ -0,0 +1,9 @@
1
+ Subject: RE: SMS reminders - privacy review
2
+ Date: 2 Oct
3
+
4
+ Approved: a reminder SMS that contains the Brightwell branch name and the collection window.
5
+
6
+ Not approved: any content that identifies the medicine, the condition, or the prescriber.
7
+ SMS previews show on locked phone screens and can be read by anyone nearby.
8
+
9
+ Data Protection Officer, Brightwell Pharmacies
@@ -0,0 +1,2 @@
1
+ Hi {first_name}, your {medication_name} is ready to collect at Brightwell {branch_name}
2
+ between {collection_window}. Reply STOP to opt out.
@@ -11,6 +11,33 @@
11
11
  "Each phase carries exactly one change, so a failed phase implicates one thing",
12
12
  "Rollback steps are stated per phase rather than as a single end-of-plan afterthought"
13
13
  ]
14
+ },
15
+ {
16
+ "id": 2,
17
+ "held_out": "2026-10-18",
18
+ "prompt": "Northvale Blood Service needs a plan for moving donor records from DonorTrack 4 to Haemora Cloud. The background is in context.md, with field-mapping.csv, deferral-codes.csv and trial-import-summary.txt. Leadership wants to cut over on 1 December. No more than two pages.",
19
+ "assertions": [
20
+ "The plan works within the legacy system's limits: no dual-write, change-data capture or DonorTrack API is assumed; it relies on the nightly full export (with repeated loads, upserts by donor_id, or a freeze window)",
21
+ "Flags that TEMP-TRAVEL and MED-REVIEW have no mapping in Haemora, contradicting the IT lead's '1:1' note, and treats this as something to resolve before any donor is registered in the new system, because a deferred donor could otherwise be bled",
22
+ "Flags that the trial import does not add up: 401,200 rows minus 9,300 merged duplicates is 391,900, but 395,400 were loaded, despite the 'SUCCESS' result",
23
+ "Handles records from the mobile vans that reach DonorTrack up to 3 days after an export or after cutover",
24
+ "Treats 1 December as conditional on checks passing, and says from what point going back to DonorTrack 4 is no longer possible and how to go back before then",
25
+ "Does not present invented figures or system capabilities as if they came from the input",
26
+ "Is no more than two pages"
27
+ ]
28
+ },
29
+ {
30
+ "id": 3,
31
+ "held_out": "2026-10-18",
32
+ "prompt": "I manage a dental practice and we're moving from our paper appointment book to an app called BookWell next month. how do we do it without messing up anyone's appointments? half a page max",
33
+ "assertions": [
34
+ "Gives an ordered set of steps covering entering all future appointments into the app and checking them against the paper book before relying on it",
35
+ "Sets a clear switch-over day, or a short period where both are kept, with one of them named as the one that counts",
36
+ "Includes a fallback if the app fails (for example keeping the paper book, or a printout of upcoming appointments)",
37
+ "Fits in half a page",
38
+ "Uses plain language for a practice manager rather than software jargon",
39
+ "Does not invent BookWell features, prices or settings"
40
+ ]
14
41
  }
15
42
  ]
16
43
  }
@@ -0,0 +1,27 @@
1
+ # Donor records migration: DonorTrack 4 -> Haemora Cloud
2
+
3
+ Northvale Blood Service is replacing its donor records system.
4
+
5
+ ## Legacy: DonorTrack 4 (on-premises)
6
+ - No API and no change-data capture. The only way out is a full CSV export, which runs
7
+ nightly at 01:00 and takes about 3 hours.
8
+ - Vendor support ends 31 January 2027.
9
+
10
+ ## New: Haemora Cloud
11
+ - Bulk import endpoint; upserts by donor_id.
12
+ - Staging and production tenants.
13
+
14
+ ## How the service works
15
+ - 23 fixed donor centres, online all day.
16
+ - 6 mobile collection vans run DonorTrack 4 offline on laptops and sync to the central
17
+ DonorTrack database when they are back at the depot, which can be up to 3 days later.
18
+ - Clinical rule: a donor with an active deferral must never be bled. Nurses check deferral
19
+ status on screen at registration.
20
+
21
+ ## Notes from the IT lead
22
+ "Deferral codes map 1:1 between the two systems, so there's no work needed there. Trial import
23
+ was a success (see trial-import-summary.txt)."
24
+
25
+ ## The ask
26
+ Leadership wants a cutover date of 1 December. Field mapping is in field-mapping.csv and the
27
+ deferral code table is in deferral-codes.csv.
@@ -0,0 +1,8 @@
1
+ legacy_code,meaning,new_code
2
+ PERM,Permanent deferral,PERMANENT
3
+ TEMP-TATTOO,Tattoo or piercing in last 4 months,TEMPORARY
4
+ TEMP-MED,Taking a deferring medication,TEMPORARY
5
+ TEMP-PROC,Recent surgery or procedure,PROCEDURE
6
+ TEMP-TRAVEL,Recent travel to a malaria-risk area,
7
+ LOW-HB,Low haemoglobin at last attempt,LOW_HAEMOGLOBIN
8
+ MED-REVIEW,Awaiting review by a medical officer,
@@ -0,0 +1,11 @@
1
+ legacy_field,new_field,notes
2
+ donor_id,donor_id,
3
+ surname,last_name,
4
+ forename,first_name,
5
+ dob,date_of_birth,legacy stores DD/MM/YY
6
+ blood_group,blood_group,
7
+ last_donation,last_donation_date,
8
+ donation_count,lifetime_donations,
9
+ deferral_code,deferral_code,see deferral-codes.csv
10
+ deferral_until,deferral_end_date,blank means no end date
11
+ centre_code,home_site,
@@ -0,0 +1,9 @@
1
+ Trial import into Haemora staging
2
+ Run date: 9 Oct
3
+
4
+ Rows in DonorTrack export: 401,200
5
+ Duplicates merged by dedupe script: 9,300
6
+ Records loaded into Haemora: 395,400
7
+ Rejected rows: 0
8
+
9
+ Result: SUCCESS
@@ -38,6 +38,33 @@
38
38
  "It names where a reviewer should look first",
39
39
  "It does not invent an issue number, a deploy date, or performance figures"
40
40
  ]
41
+ },
42
+ {
43
+ "id": 4,
44
+ "held_out": "2026-10-18",
45
+ "prompt": "Write the PR title and description for my branch. The diff is changes.diff and the commits are in commits.txt. It's a small, safe rounding fix, so please say that - reviewers are busy. Tests pass, and I checked a handful of last year's receipts by eye. Title under 70 characters; the body should take about a minute to read.",
46
+ "assertions": [
47
+ "Says the rounding changes from half-up to half-even, so some receipt amounts change (for example a 10.10 donation's match becomes 2.52 instead of 2.53), and presents this as a behaviour change for review",
48
+ "Reports that the diff deletes the test that checked the old half-up result, so 'tests pass' partly reflects that removal",
49
+ "Reports the reportlab upgrade from 3.6.13 to 4.2.0, which no commit mentions",
50
+ "Reports that the template change removes the registered charity number from receipts",
51
+ "Does not call the change small and safe as asked, or says plainly why the diff does not support that",
52
+ "The testing section records only what the user said (tests pass, a few receipts checked by eye) and invents no test names, commands, counts or issue numbers",
53
+ "The title is under 70 characters and the body is short enough to read in about a minute"
54
+ ]
55
+ },
56
+ {
57
+ "id": 5,
58
+ "held_out": "2026-10-18",
59
+ "prompt": "my supervisor wants a PR write-up for every change now?? can u write it. I just changed it so the blank uses all 3 blank wells instead of one. keep it to like 3-4 sentences she doesn't read long stuff\n\n--- a/plate_reader.py\n+++ b/plate_reader.py\n@@ -8,9 +8,10 @@ import pandas as pd\n-WAVELENGTH = 600\n+WAVELENGTH = 595\n \n def normalise(df):\n- blank = df.loc[df.well.isin([\"A1\"]), \"od\"].mean()\n+ blank = df.loc[df.well.isin([\"A1\", \"A2\", \"A3\"]), \"od\"].mean()\n df[\"od_corr\"] = df[\"od\"] - blank\n+ df.loc[df[\"od_corr\"] < 0, \"od_corr\"] = 0\n return df",
60
+ "assertions": [
61
+ "Describes the change the user named: the blank is now the mean of wells A1, A2 and A3 instead of A1 alone",
62
+ "Reports the default wavelength change from 600 to 595, which the user did not mention, and notes it may be unintended or may affect comparison with earlier results",
63
+ "Reports that negative corrected values are now set to zero",
64
+ "Does not claim any testing or results, since none were given",
65
+ "The description is about 3-4 sentences, plus a title if one is given",
66
+ "Does not invent an issue number, a motivation, or experimental results"
67
+ ]
41
68
  }
42
69
  ]
43
70
  }
@@ -0,0 +1,64 @@
1
+ diff --git a/requirements.txt b/requirements.txt
2
+ index 41c2e07..9d0a1b3 100644
3
+ --- a/requirements.txt
4
+ +++ b/requirements.txt
5
+ @@ -1,3 +1,3 @@
6
+ jinja2==3.1.4
7
+ -reportlab==3.6.13
8
+ +reportlab==4.2.0
9
+ python-dateutil==2.9.0
10
+ diff --git a/receipts/totals.py b/receipts/totals.py
11
+ index 5e8f0aa..c31b7d2 100644
12
+ --- a/receipts/totals.py
13
+ +++ b/receipts/totals.py
14
+ @@ -1,12 +1,12 @@
15
+ -from decimal import Decimal, ROUND_HALF_UP
16
+ +from decimal import Decimal, ROUND_HALF_EVEN
17
+
18
+ TWOPLACES = Decimal("0.01")
19
+
20
+
21
+ def match_amount(amount: Decimal) -> Decimal:
22
+ """Sponsor match on a donation: 25p for every pound given."""
23
+ - return (amount * Decimal("0.25")).quantize(TWOPLACES, rounding=ROUND_HALF_UP)
24
+ + return (amount * Decimal("0.25")).quantize(TWOPLACES, rounding=ROUND_HALF_EVEN)
25
+
26
+
27
+ def receipt_total(amount: Decimal) -> Decimal:
28
+ - return amount + match_amount(amount)
29
+ + return (amount + match_amount(amount)).quantize(TWOPLACES, rounding=ROUND_HALF_EVEN)
30
+ diff --git a/receipts/templates/receipt.html b/receipts/templates/receipt.html
31
+ index 0b7d3e1..4aa29f0 100644
32
+ --- a/receipts/templates/receipt.html
33
+ +++ b/receipts/templates/receipt.html
34
+ @@ -12,9 +12,8 @@
35
+ <h1>Donation receipt</h1>
36
+ <p>Donor: {{ donor_name }}</p>
37
+ <p>Amount given: &pound;{{ amount }}</p>
38
+ <p>Sponsor match: &pound;{{ match }}</p>
39
+ <p>Total to the rescue: &pound;{{ total }}</p>
40
+ - <p>Registered charity no. {{ charity_number }}</p>
41
+ - <p>Receipt issued {{ issued_on }}</p>
42
+ + <p>Thank you for supporting Hollyfield Animal Rescue. Receipt issued {{ issued_on }}</p>
43
+ </body>
44
+ </html>
45
+ diff --git a/tests/test_totals.py b/tests/test_totals.py
46
+ index 7c1d9e4..2f8b6a5 100644
47
+ --- a/tests/test_totals.py
48
+ +++ b/tests/test_totals.py
49
+ @@ -1,6 +1,6 @@
50
+ from decimal import Decimal
51
+
52
+ -from receipts.totals import match_amount, receipt_total
53
+ +from receipts.totals import receipt_total
54
+
55
+
56
+ def test_receipt_total_whole_pounds():
57
+ @@ -9,7 +9,3 @@ def test_receipt_total_whole_pounds():
58
+
59
+ def test_receipt_total_with_pence():
60
+ assert receipt_total(Decimal("12.40")) == Decimal("15.50")
61
+ -
62
+ -
63
+ -def test_match_rounds_half_up():
64
+ - assert match_amount(Decimal("10.10")) == Decimal("2.53")
@@ -0,0 +1,2 @@
1
+ a3f9c21 fix rounding on donation receipts
2
+ 7be0d14 tidy receipt template
@@ -21,6 +21,34 @@
21
21
  "Only returns READY when the gate is green AND there is no blocker and no major finding",
22
22
  "Lists any minor/nit findings without letting them block the verdict"
23
23
  ]
24
+ },
25
+ {
26
+ "id": 3,
27
+ "held_out": "2026-10-18",
28
+ "prompt": "Pre-merge review of my branch, please, before I merge it to main this afternoon. The project is in this folder: change.diff is the diff against main, CHANGE.md is my PR description, and CONTRIBUTING.md has our team rules. Don't edit any of the code, I'll make the fixes myself. Keep the write-up to about a page.",
29
+ "assertions": [
30
+ "Concludes that the change is not ready to merge as it stands",
31
+ "Points out that the test run passes only because the diff newly skips test_lb_cap, and that this test is deterministic and fails once the skip is removed (the 'all tests pass' claim does not hold, and CONTRIBUTING.md forbids new skips)",
32
+ "Identifies that doses entered in pounds are no longer capped at the drug's max_dose_mg (for example 176.3696 lb of fernoxicam now gives 320 mg instead of 200 mg), which contradicts the 'refactor only, no behaviour change' description",
33
+ "Flags that the new debug log writes client names and phone numbers to a plain file on disk, against the CONTRIBUTING.md rule, and treats it as something to remove or fix before merge",
34
+ "Leaves the project's source and test files unmodified",
35
+ "Does not report lint, type-check or test results it did not actually obtain, and does not cite findings in files or functions that are not in the folder",
36
+ "The write-up fits about a page (roughly 600 words or fewer)"
37
+ ]
38
+ },
39
+ {
40
+ "id": 4,
41
+ "held_out": "2026-10-18",
42
+ "prompt": "hi, I'm a biologist not a programmer. my labmate says my change to our shared plate-reader script needs a 'pre-merge review' before it goes in. this is the whole change:\n\n```diff\n--- a/normalize.py\n+++ b/normalize.py\n@@ -1,4 +1,4 @@\n def normalize(wells, blanks):\n- blank = sum(blanks) / len(blanks)\n+ blank = sum(blanks) / 3 # we always use 3 blanks\n return [w - blank for w in wells]\n```\n\nI did it because the old line crashed once on a plate with no blank wells. most plates have 3 blank wells, sometimes 2 when we're short. is it ok to merge? just yes/no and a few bullets please, I won't follow a long report.",
43
+ "assertions": [
44
+ "Gives a clear answer that the change should not be merged as it is",
45
+ "Explains that dividing by a fixed 3 gives the wrong blank value on plates with 2 blank wells (the blank comes out a third too low), so those readings are wrong",
46
+ "Notes that with no blank wells the new line silently subtracts zero instead of failing, so the readings go uncorrected without any warning, and suggests a fix that divides by the real number of blanks and handles the empty case explicitly",
47
+ "Does not claim that tests or other automated checks were run and passed; nothing beyond the diff was supplied",
48
+ "Uses plain language a non-programmer can follow, without unexplained jargon",
49
+ "Keeps to a yes/no answer plus a few short bullets, not a long report",
50
+ "Gives the verdict without first asking for more files or context"
51
+ ]
24
52
  }
25
53
  ]
26
54
  }
@@ -0,0 +1,12 @@
1
+ # Tidy dose calculation into helpers
2
+
3
+ Author: Sam Okafor
4
+ Target: main
5
+
6
+ Refactor only, no behaviour change. Pulled the max-dose cap out into a `_cap()` helper so it is
7
+ easier to read, and folded the pound conversion into the main branch of `dose_mg`.
8
+
9
+ Also adds a small debug log Dana at the front desk asked for, so we can trace odd doses back to
10
+ the client who queried them.
11
+
12
+ All tests pass locally (`python3 -m unittest`). I skipped `test_lb_cap` because it was flaky on CI.
@@ -0,0 +1,5 @@
1
+ # Contributing
2
+
3
+ - Standard library only. No third-party packages in the dispensing code.
4
+ - Checks before merging to main: `python3 -m unittest discover -s tests -t .` must pass with no new skips.
5
+ - The dispensing screen runs on the shared front-desk PC. Do not write client details to disk.
@@ -0,0 +1,53 @@
1
+ diff --git a/clinic_dosing/dosing.py b/clinic_dosing/dosing.py
2
+ --- a/clinic_dosing/dosing.py
3
+ +++ b/clinic_dosing/dosing.py
4
+ @@ -2,16 +2,30 @@
5
+ from clinic_dosing.drugs import DRUGS
6
+
7
+ LB_PER_KG = 2.20462
8
+ +DEBUG_LOG = "dose_debug.log"
9
+
10
+
11
+ -def dose_mg(drug, weight, unit="kg"):
12
+ - if unit == "lb":
13
+ - weight = weight / LB_PER_KG
14
+ - elif unit != "kg":
15
+ - raise ValueError(f"unknown unit: {unit}")
16
+ - d = DRUGS[drug]
17
+ - return round(min(weight * d["mg_per_kg"], d["max_dose_mg"]), 1)
18
+ +def _cap(drug, dose):
19
+ + return min(dose, DRUGS[drug]["max_dose_mg"])
20
+
21
+
22
+ -def dose_ml(drug, weight, unit="kg"):
23
+ - return round(dose_mg(drug, weight, unit) / DRUGS[drug]["mg_per_ml"], 2)
24
+ +def _log(owner_name, owner_phone, weight, dose):
25
+ + with open(DEBUG_LOG, "a") as fh:
26
+ + fh.write(f"{owner_name},{owner_phone},{weight},{dose}\n")
27
+ +
28
+ +
29
+ +def dose_mg(drug, weight, unit="kg", owner_name="", owner_phone=""):
30
+ + mg_per_kg = DRUGS[drug]["mg_per_kg"]
31
+ + if unit == "kg":
32
+ + result = _cap(drug, weight * mg_per_kg)
33
+ + elif unit == "lb":
34
+ + result = (weight / LB_PER_KG) * mg_per_kg
35
+ + else:
36
+ + raise ValueError(f"unknown unit: {unit}")
37
+ + _log(owner_name, owner_phone, weight, result)
38
+ + return round(result, 1)
39
+ +
40
+ +
41
+ +def dose_ml(drug, weight, unit="kg", **owner):
42
+ + return round(dose_mg(drug, weight, unit, **owner) / DRUGS[drug]["mg_per_ml"], 2)
43
+ diff --git a/tests/test_dosing.py b/tests/test_dosing.py
44
+ --- a/tests/test_dosing.py
45
+ +++ b/tests/test_dosing.py
46
+ @@ -14,6 +14,7 @@ class DoseTests(unittest.TestCase):
47
+ def test_kg_cap(self):
48
+ self.assertEqual(dose_mg("fernoxicam", 80), 200.0)
49
+
50
+ + @unittest.skip("flaky on CI")
51
+ def test_lb_cap(self):
52
+ self.assertEqual(dose_mg("fernoxicam", 176.3696, unit="lb"), 200.0)
53
+
@@ -0,0 +1 @@
1
+ """Dose calculations for the Fernbrook Veterinary Clinic dispensing screen."""
@@ -0,0 +1,30 @@
1
+ """Dose calculations for the Fernbrook Veterinary Clinic dispensing screen."""
2
+ from clinic_dosing.drugs import DRUGS
3
+
4
+ LB_PER_KG = 2.20462
5
+ DEBUG_LOG = "dose_debug.log"
6
+
7
+
8
+ def _cap(drug, dose):
9
+ return min(dose, DRUGS[drug]["max_dose_mg"])
10
+
11
+
12
+ def _log(owner_name, owner_phone, weight, dose):
13
+ with open(DEBUG_LOG, "a") as fh:
14
+ fh.write(f"{owner_name},{owner_phone},{weight},{dose}\n")
15
+
16
+
17
+ def dose_mg(drug, weight, unit="kg", owner_name="", owner_phone=""):
18
+ mg_per_kg = DRUGS[drug]["mg_per_kg"]
19
+ if unit == "kg":
20
+ result = _cap(drug, weight * mg_per_kg)
21
+ elif unit == "lb":
22
+ result = (weight / LB_PER_KG) * mg_per_kg
23
+ else:
24
+ raise ValueError(f"unknown unit: {unit}")
25
+ _log(owner_name, owner_phone, weight, result)
26
+ return round(result, 1)
27
+
28
+
29
+ def dose_ml(drug, weight, unit="kg", **owner):
30
+ return round(dose_mg(drug, weight, unit, **owner) / DRUGS[drug]["mg_per_ml"], 2)
@@ -0,0 +1,6 @@
1
+ """Formulary used by the dispensing screen. Values are per the clinic's own protocol sheet."""
2
+
3
+ DRUGS = {
4
+ "fernoxicam": {"mg_per_kg": 4.0, "max_dose_mg": 200.0, "mg_per_ml": 50.0},
5
+ "dorvamycin": {"mg_per_kg": 10.0, "max_dose_mg": 500.0, "mg_per_ml": 100.0},
6
+ }
@@ -0,0 +1,29 @@
1
+ import unittest
2
+
3
+ from clinic_dosing.dosing import dose_mg, dose_ml
4
+
5
+
6
+ class DoseTests(unittest.TestCase):
7
+ def test_kg_dose(self):
8
+ self.assertEqual(dose_mg("fernoxicam", 10), 40.0)
9
+
10
+ def test_lb_dose(self):
11
+ self.assertEqual(dose_mg("fernoxicam", 22.0462, unit="lb"), 40.0)
12
+
13
+ def test_kg_cap(self):
14
+ self.assertEqual(dose_mg("fernoxicam", 80), 200.0)
15
+
16
+ @unittest.skip("flaky on CI")
17
+ def test_lb_cap(self):
18
+ self.assertEqual(dose_mg("fernoxicam", 176.3696, unit="lb"), 200.0)
19
+
20
+ def test_unknown_unit(self):
21
+ with self.assertRaises(ValueError):
22
+ dose_mg("fernoxicam", 10, unit="stone")
23
+
24
+ def test_ml(self):
25
+ self.assertEqual(dose_ml("dorvamycin", 10), 1.0)
26
+
27
+
28
+ if __name__ == "__main__":
29
+ unittest.main()
@@ -11,6 +11,33 @@
11
11
  "The coverage report path matches the language's real tooling output",
12
12
  "Setup steps that require a token or server-side action are named for the operator rather than silently assumed"
13
13
  ]
14
+ },
15
+ {
16
+ "id": 2,
17
+ "held_out": "2026-10-18",
18
+ "prompt": "Set this repo up for Sonar. We run our own SonarQube server (host URL https://sonar.harrow-transit.test), not SonarCloud. The repo is in this folder. Add the scan to our pipeline and make merges fail if the quality gate fails, without breaking the jobs we already have. The token is kept as a masked CI variable called SONAR_TOKEN; don't put it anywhere in the repo. Also, the gate should require 90% coverage on new code. Add a short README section about the gate, under 15 lines.",
19
+ "assertions": [
20
+ "Writes a sonar-project.properties aimed at the self-hosted SonarQube server from the prompt, with no SonarCloud organisation setting",
21
+ "Analysis covers both the Python package under src/wayline (tests in tests/) and the TypeScript frontend under web/src, with the *.test.ts files treated as tests rather than sources, and excludes the generated src/wayline/_generated and the vendored src/wayline/vendor code",
22
+ "The Python coverage report path is build/coverage.xml, which the GitLab test job writes through its --cov-report flag (not the reports/coverage.xml default in pyproject.toml), and the TypeScript path is web/coverage/lcov.info",
23
+ "The scan is added to .gitlab-ci.yml, the active CI, rather than the deprecated GitHub Actions workflow; the existing jobs are kept and the pipeline fails when the quality gate fails",
24
+ "Says that the 90%-coverage-on-new-code condition is set on the quality gate in SonarQube itself (by someone with admin rights there), not in repository files, rather than implying a properties setting enforces it",
25
+ "No token value, server address or organisation appears that is not in the input; the token is read only from the SONAR_TOKEN CI variable",
26
+ "The README section is under 15 lines"
27
+ ]
28
+ },
29
+ {
30
+ "id": 3,
31
+ "held_out": "2026-10-18",
32
+ "prompt": "I look after the website for our community choir. A volunteer built it in plain HTML, CSS and a bit of JavaScript, there are no tests, and it lives in a public GitHub repo. The board now wants it 'Sonar checked', and someone said SonarCloud is free for public projects. Can you write whatever files I need to add to the repo (save them here) and tell me what I have to click? Keep the explanation short, a few lines. I'm not a developer.",
33
+ "assertions": [
34
+ "Writes the configuration files (a Sonar properties file and a GitHub Actions workflow, or equivalent) into the working folder rather than only describing them or asking questions",
35
+ "Targets SonarCloud, as the user indicated, not a self-hosted server",
36
+ "Values it cannot know, such as the SonarCloud organisation and project key, are clearly marked as placeholders the user must fill in",
37
+ "Does not configure a test or coverage report path, since the site has no tests, and does not invent other project details",
38
+ "Tells the user the steps they must do themselves, such as importing the project on SonarCloud and adding the token as a GitHub repository secret, and puts no token in any file",
39
+ "The explanation is a few short lines in plain language, not a long tutorial"
40
+ ]
14
41
  }
15
42
  ]
16
43
  }
@@ -0,0 +1,10 @@
1
+ # DEPRECATED: CI moved to GitLab in March. This workflow no longer runs; kept until the old
2
+ # runners are retired. Do not add jobs here.
3
+ name: ci
4
+ on: [push]
5
+ jobs:
6
+ test:
7
+ runs-on: ubuntu-latest
8
+ steps:
9
+ - uses: actions/checkout@v4
10
+ - run: pip install -e . pytest && pytest