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,79 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Book an event</title>
6
+ <link rel="stylesheet" href="styles.css">
7
+ </head>
8
+ <body>
9
+ <header class="site-header">
10
+ <img src="council-logo.png">
11
+ <nav>
12
+ <a href="/">Home</a>
13
+ <a href="/libraries">Libraries</a>
14
+ <a href="/contact">Contact</a>
15
+ </nav>
16
+ </header>
17
+
18
+ <main>
19
+ <h1>Book an event</h1>
20
+ <img src="divider.svg" alt="" class="divider">
21
+
22
+ <div class="form-panel">
23
+ <p class="hold-notice">We are holding your place. Complete the form to confirm.</p>
24
+
25
+ <form id="booking" novalidate>
26
+ <label for="name">Full name</label>
27
+ <input id="name" name="name" type="text" autocomplete="name">
28
+
29
+ <input id="email" name="email" type="email" placeholder="Email address">
30
+ <p class="help-text">We'll send your ticket to this address.</p>
31
+
32
+ <label for="event">Event</label>
33
+ <select id="event" name="event">
34
+ <option>Storytime for under-5s (Sat 10:00)</option>
35
+ <option>Local history talk (Tue 18:30)</option>
36
+ <option>Repair cafe (Thu 14:00)</option>
37
+ </select>
38
+
39
+ <span class="field-title">Number of tickets</span>
40
+ <div class="stepper">
41
+ <span class="step" onclick="change(-1)">&minus;</span>
42
+ <span id="count">1</span>
43
+ <span class="step" onclick="change(1)">+</span>
44
+ </div>
45
+ <p class="help-text">Maximum 4 tickets per booking.</p>
46
+
47
+ <button type="submit" class="btn-primary" aria-label="Submit reservation form">Book</button>
48
+ </form>
49
+ </div>
50
+ </main>
51
+
52
+ <footer class="site-footer">
53
+ <p>&copy; Harrowgate District Council</p>
54
+ <a href="/privacy">Privacy</a>
55
+ </footer>
56
+
57
+ <script>
58
+ var count = 1;
59
+ function change(d) {
60
+ count = Math.min(4, Math.max(1, count + d));
61
+ document.getElementById('count').textContent = count;
62
+ }
63
+
64
+ // Release the held place after 90 seconds.
65
+ setTimeout(function () {
66
+ document.getElementById('booking').reset();
67
+ window.location.href = '/events/expired';
68
+ }, 90000);
69
+
70
+ document.getElementById('booking').addEventListener('submit', function (e) {
71
+ var email = document.getElementById('email');
72
+ if (!email.value.includes('@')) {
73
+ e.preventDefault();
74
+ email.classList.add('invalid');
75
+ }
76
+ });
77
+ </script>
78
+ </body>
79
+ </html>
@@ -0,0 +1,23 @@
1
+ Automated accessibility scan
2
+ Page: /events/book
3
+ Standard: WCAG 2.2 AA
4
+ Run: 2026-10-12 09:14
5
+
6
+ Result: PASS - 0 violations, 14 passes, 0 incomplete
7
+
8
+ Passes (selected)
9
+ - html-has-lang: <html> has a lang attribute
10
+ - document-title: page has a <title>
11
+ - image-alt: all <img> elements have an alt attribute (2 of 2)
12
+ - label: form fields have accessible names (3 of 3)
13
+ - color-contrast: .help-text #767676 on #ffffff = 4.54:1 (required 4.5:1)
14
+ - color-contrast: body text #1a1a1a on #ffffff = 17.4:1
15
+ - button-name: <button> has an accessible name ("Submit reservation form")
16
+ - heading-order: headings are in order
17
+ - select-name: <select> has an associated label
18
+
19
+ Not evaluated
20
+ - .btn-primary: background colour could not be determined
21
+ - Elements inside <header> and <footer>: excluded by scan configuration
22
+
23
+ Compliance summary: WCAG 2.2 AA - PASS
@@ -0,0 +1,56 @@
1
+ body {
2
+ font-family: "Source Sans", Arial, sans-serif;
3
+ font-size: 16px;
4
+ color: #1a1a1a;
5
+ background: #ffffff;
6
+ }
7
+
8
+ *:focus {
9
+ outline: none;
10
+ }
11
+
12
+ .form-panel {
13
+ background: #f2f2f2;
14
+ padding: 24px;
15
+ max-width: 520px;
16
+ }
17
+
18
+ .help-text {
19
+ color: #767676;
20
+ font-size: 14px;
21
+ margin-top: 4px;
22
+ }
23
+
24
+ .field-title {
25
+ display: block;
26
+ font-weight: 600;
27
+ margin-top: 16px;
28
+ }
29
+
30
+ .stepper .step {
31
+ display: inline-block;
32
+ width: 32px;
33
+ height: 32px;
34
+ text-align: center;
35
+ cursor: pointer;
36
+ border: 1px solid #1a1a1a;
37
+ }
38
+
39
+ input.invalid {
40
+ border: 2px solid #d0021b;
41
+ }
42
+
43
+ /* Brand orange is fixed by the council style guide and must not change. */
44
+ .btn-primary {
45
+ background: #e87722;
46
+ color: #ffffff;
47
+ font-size: 16px;
48
+ font-weight: 400;
49
+ padding: 10px 24px;
50
+ border: none;
51
+ }
52
+
53
+ .divider {
54
+ width: 100%;
55
+ height: 8px;
56
+ }
@@ -45,6 +45,33 @@
45
45
  "No commands are invented from ecosystem convention",
46
46
  "The reason given is that every command must trace to a file in the tree"
47
47
  ]
48
+ },
49
+ {
50
+ "id": 5,
51
+ "held_out": "2026-10-18",
52
+ "prompt": "We're starting to use coding agents on our sensor-ingest repo, which is the current working directory (README.md, CONTRIBUTING.md, pyproject.toml, .github/workflows/ci.yml, scripts/deploy.sh, data/raw/README.md, src/, tests/). Write an AGENTS.md at the repo root. The agents keep running `make test` and it fails, which is part of why we want this. Keep it under 60 lines and don't change any other file.",
53
+ "assertions": [
54
+ "Writes AGENTS.md at the repo root, under 60 lines, and modifies no other file",
55
+ "Does not tell agents to run `make test` (there is no Makefile); the test command given is `uv run pytest -m \"not hardware\"` as in CI and CONTRIBUTING.md",
56
+ "Gives ruff (`uv run ruff format` / `uv run ruff check`) as the formatter and linter, not black, resolving the README's stale instruction in favour of CI and CONTRIBUTING.md",
57
+ "Tells agents not to run the tests marked hardware, because they need the live gateway on the plant network",
58
+ "Forbids running scripts/deploy.sh and forbids editing, renaming or deleting anything in data/raw/",
59
+ "Does not invent commands, tools or checks that appear nowhere in the repo (for example mypy, pre-commit, docker, or a Makefile target)",
60
+ "Mentions that README.md is out of date (make test, black) as something for the humans to fix, without editing it"
61
+ ]
62
+ },
63
+ {
64
+ "id": 6,
65
+ "held_out": "2026-10-18",
66
+ "prompt": "my colleague says I should add an 'agents' file so the AI helper stops messing up my marking folder (it's the folder you're in). it keeps overwriting grades_final.csv and I lose my hand corrections. I'm a teacher, not a programmer. keep the file short, like 10 lines",
67
+ "assertions": [
68
+ "Writes an AGENTS.md in the folder of roughly 10 lines (no more than about 15)",
69
+ "Notices that make_report.R itself writes grades_final.csv, so the file tells the agent not to run make_report.R (or to ask first), not only 'don't edit grades_final.csv'",
70
+ "Tells the agent not to change raw_marks.csv or grades_final.csv",
71
+ "Gives the run order from notes.txt (Rscript clean_marks.R, then Rscript make_report.R) without adding commands or packages the folder does not mention",
72
+ "Explains the change to the teacher in plain language, in a few lines",
73
+ "Delivers the file without stopping to ask questions first"
74
+ ]
48
75
  }
49
76
  ]
50
77
  }
@@ -0,0 +1,12 @@
1
+ name: ci
2
+ on: [push, pull_request]
3
+ jobs:
4
+ test:
5
+ runs-on: ubuntu-latest
6
+ steps:
7
+ - uses: actions/checkout@v4
8
+ - uses: astral-sh/setup-uv@v3
9
+ - run: uv sync
10
+ - run: uv run ruff check .
11
+ - run: uv run ruff format --check .
12
+ - run: uv run pytest -m "not hardware"
@@ -0,0 +1,20 @@
1
+ # Contributing
2
+
3
+ ## Tooling
4
+
5
+ We use uv for environments. `uv sync` installs everything, including the dev group.
6
+
7
+ We moved from black to ruff in 2025: format with `uv run ruff format .` and lint with
8
+ `uv run ruff check .`. Please don't reintroduce black.
9
+
10
+ ## Tests
11
+
12
+ Run `uv run pytest -m "not hardware"`.
13
+
14
+ Tests marked `hardware` talk to a live telemetry gateway on the plant network. They hang for
15
+ several minutes and then fail anywhere else, so only run them from the test bench at the
16
+ Eastmoor station.
17
+
18
+ ## Deploying
19
+
20
+ Deploys are done by the on-call engineer with `scripts/deploy.sh`. Don't run it from a branch.
@@ -0,0 +1,15 @@
1
+ # sensor-ingest
2
+
3
+ Ingests flow and pressure readings from Tidewater Regional Water's pumping stations and turns
4
+ the raw gateway files into hourly summaries for the operations dashboard.
5
+
6
+ ## Development
7
+
8
+ Install dependencies, then run `make test` to run the test suite.
9
+ Format code with `black .` before committing.
10
+
11
+ ## Layout
12
+
13
+ - `src/sensor_ingest/` - parsing and summarising
14
+ - `data/raw/` - raw gateway files
15
+ - `data/processed/` - hourly summaries written by the pipeline
@@ -0,0 +1,7 @@
1
+ # data/raw
2
+
3
+ Raw readings exactly as received from the station gateways. This folder is the regulatory
4
+ record for abstraction reporting and must be kept for seven years.
5
+
6
+ Never edit, rename, reformat or delete anything in this folder. The pipeline writes all
7
+ derived output to `data/processed/`.
@@ -0,0 +1,23 @@
1
+ [project]
2
+ name = "sensor-ingest"
3
+ version = "0.7.2"
4
+ requires-python = ">=3.11"
5
+ dependencies = [
6
+ "pydantic>=2.6",
7
+ ]
8
+
9
+ [dependency-groups]
10
+ dev = [
11
+ "pytest>=8.0",
12
+ "ruff>=0.6",
13
+ ]
14
+
15
+ [tool.ruff]
16
+ line-length = 100
17
+ target-version = "py311"
18
+
19
+ [tool.pytest.ini_options]
20
+ testpaths = ["tests"]
21
+ markers = [
22
+ "hardware: needs a live telemetry gateway on the plant network",
23
+ ]
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ # Deploy sensor-ingest to the production ingest host and restart the service.
3
+ # Run by the on-call engineer only, from main, over the operations VPN.
4
+ set -euo pipefail
5
+ rsync -az --delete src/ ingest-prod.tidewater.test:/opt/sensor-ingest/src/
6
+ ssh ingest-prod.tidewater.test 'sudo systemctl restart sensor-ingest'
@@ -0,0 +1 @@
1
+ """Parse raw gateway files and summarise readings by hour."""
@@ -0,0 +1,20 @@
1
+ from datetime import datetime
2
+
3
+ from pydantic import BaseModel
4
+
5
+
6
+ class Reading(BaseModel):
7
+ station: str
8
+ taken_at: datetime
9
+ flow_lps: float
10
+ pressure_bar: float
11
+
12
+
13
+ def parse_line(line: str) -> Reading:
14
+ station, ts, flow, pressure = line.strip().split(",")
15
+ return Reading(
16
+ station=station,
17
+ taken_at=datetime.fromisoformat(ts),
18
+ flow_lps=float(flow),
19
+ pressure_bar=float(pressure),
20
+ )
@@ -0,0 +1,10 @@
1
+ import socket
2
+
3
+ import pytest
4
+
5
+
6
+ @pytest.mark.hardware
7
+ def test_gateway_responds():
8
+ with socket.create_connection(("10.20.0.15", 5020), timeout=300) as s:
9
+ s.sendall(b"PING\n")
10
+ assert s.recv(4) == b"PONG"
@@ -0,0 +1,7 @@
1
+ from sensor_ingest.parse import parse_line
2
+
3
+
4
+ def test_parse_line():
5
+ r = parse_line("EASTMOOR-2,2026-09-01T10:00:00,41.5,3.2\n")
6
+ assert r.station == "EASTMOOR-2"
7
+ assert r.flow_lps == 41.5
@@ -0,0 +1,5 @@
1
+ # Fill blank marks with 0 and apply the 10% late penalty.
2
+ marks <- read.csv("raw_marks.csv", stringsAsFactors = FALSE)
3
+ marks$mark[is.na(marks$mark)] <- 0
4
+ marks$mark <- ifelse(marks$late == "Y", round(marks$mark * 0.9), marks$mark)
5
+ write.csv(marks, "clean_marks.csv", row.names = FALSE)
@@ -0,0 +1,6 @@
1
+ "student_id","mark","grade"
2
+ "S001",72,"A"
3
+ "S002",0,"U"
4
+ "S003",52,"C"
5
+ "S004",64,"B"
6
+ "S005",41,"D"
@@ -0,0 +1,7 @@
1
+ # Turn clean marks into letter grades for the exams office.
2
+ marks <- read.csv("clean_marks.csv", stringsAsFactors = FALSE)
3
+ grade <- function(m) {
4
+ if (m >= 70) "A" else if (m >= 60) "B" else if (m >= 50) "C" else if (m >= 40) "D" else "U"
5
+ }
6
+ marks$grade <- sapply(marks$mark, grade)
7
+ write.csv(marks[, c("student_id", "mark", "grade")], "grades_final.csv", row.names = FALSE)
@@ -0,0 +1,8 @@
1
+ how to do the end of term marks (so i dont forget again)
2
+
3
+ 1. put the exported marks from the gradebook in raw_marks.csv
4
+ 2. Rscript clean_marks.R <- fixes the blank cells and the late penalty
5
+ 3. Rscript make_report.R <- makes the final sheet
6
+
7
+ then check grades_final.csv by hand and send it to the exams office. i fix a few by hand
8
+ after moderation so dont lose those!!
@@ -0,0 +1,6 @@
1
+ student_id,mark,late
2
+ S001,72,N
3
+ S002,,N
4
+ S003,58,Y
5
+ S004,64,N
6
+ S005,39,N
@@ -12,6 +12,33 @@
12
12
  "Every factual claim is tagged [reported], [verified], or [assumption] — nothing is asserted untagged",
13
13
  "Severity is assigned with a stated reason rather than inherited from the reporter's tone"
14
14
  ]
15
+ },
16
+ {
17
+ "id": 2,
18
+ "held_out": "2026-10-18",
19
+ "prompt": "Can you write this up as a ticket for the payments squad? The customer's ticket is ticket.txt, our Slack thread is slack-thread.txt, and payments-log.csv is what the payments team exported this morning. Also give me the root cause so support can reply to the customer today. Keep the ticket itself to one screen.",
20
+ "assertions": [
21
+ "Uses the log to show that only one $6.50 was captured for acct_7781; the other $6.50 was an authorisation that was voided 30 minutes later, so the 'charged twice' claim is the customer's report, not a confirmed second charge",
22
+ "Points out that the same pattern appears on 2026-10-14 on app version 3.1.4, before 3.2.0 shipped, so the claim that 3.2 is the cause is not supported",
23
+ "Does not take on the 'P0, happening to everyone' framing; it notes 3 affected accounts out of 4,812 orders and sets urgency with its own stated reasons",
24
+ "Does not give a definite root cause; any cause is offered as a hypothesis together with what would confirm or rule it out",
25
+ "Notes the conflict between the log, which says a pass was issued for the captured order, and the customer saying no pass appeared",
26
+ "Does not invent a phone model, iOS version, error message or figures that are not in the files",
27
+ "The ticket itself fits on roughly one screen (about 40 lines or fewer)"
28
+ ]
29
+ },
30
+ {
31
+ "id": 3,
32
+ "held_out": "2026-10-18",
33
+ "prompt": "I'm the school office manager. the attendance website keeps logging me out when I switch to another tab?? happened 3 times today and once I lost a whole morning register I'd half filled in. can you write it up for our IT guy, just a few lines",
34
+ "assertions": [
35
+ "Produces a short write-up of a few lines that IT could act on, not a long report",
36
+ "States the symptom clearly: being logged out after switching tabs, with unsaved register entries lost",
37
+ "Treats the lost register data as the serious part when judging how urgent it is",
38
+ "Lists the few details IT will need that the report does not give (for example browser, how long she was away from the tab, the time it happened) instead of guessing them",
39
+ "Does not invent a browser, device, error message or cause; any suggested cause is clearly marked as a guess",
40
+ "Delivers the write-up without stopping to ask questions first"
41
+ ]
15
42
  }
16
43
  ]
17
44
  }
@@ -0,0 +1,15 @@
1
+ timestamp_utc,order_id,account,event,amount_usd,app_version,pass_issued
2
+ 2026-10-14T18:02:11Z,ord-40917,acct_2290,AUTH,6.50,3.1.4,
3
+ 2026-10-14T18:02:40Z,ord-40918,acct_2290,AUTH,6.50,3.1.4,
4
+ 2026-10-14T18:02:42Z,ord-40918,acct_2290,CAPTURE,6.50,3.1.4,yes
5
+ 2026-10-14T18:32:11Z,ord-40917,acct_2290,VOID,6.50,3.1.4,
6
+ 2026-10-16T11:48:05Z,ord-42230,acct_5012,AUTH,2.75,3.2.0,
7
+ 2026-10-16T11:48:31Z,ord-42231,acct_5012,AUTH,2.75,3.2.0,
8
+ 2026-10-16T11:48:33Z,ord-42231,acct_5012,CAPTURE,2.75,3.2.0,yes
9
+ 2026-10-16T12:18:05Z,ord-42230,acct_5012,VOID,2.75,3.2.0,
10
+ 2026-10-16T12:14:58Z,ord-42261,acct_7781,AUTH,6.50,3.2.0,
11
+ 2026-10-16T12:15:31Z,ord-42262,acct_7781,AUTH,6.50,3.2.0,
12
+ 2026-10-16T12:15:33Z,ord-42262,acct_7781,CAPTURE,6.50,3.2.0,yes
13
+ 2026-10-16T12:44:58Z,ord-42261,acct_7781,VOID,6.50,3.2.0,
14
+ # An AUTH that is never captured is voided automatically 30 minutes later.
15
+ # Orders 2026-10-14 00:00Z to 2026-10-16 13:00Z: 4,812 total. The rows above are all the cases where one account had two AUTHs within 60 seconds.
@@ -0,0 +1,16 @@
1
+ #lakeshore-transit-app (2026-10-16, times UTC-4)
2
+
3
+ 09:20 Dana R. (Customer Operations Manager)
4
+ Another double charge on mobile tickets. This is a P0 - it's happening to everyone since the
5
+ 3.2 release. I need it fixed today and I need something to tell customers.
6
+
7
+ 09:26 Kofi A. (iOS developer)
8
+ 3.2.0 went live in the app stores yesterday at 10:00 our time. It's definitely the new
9
+ payment retry logic in 3.2, I'd bet money on it. We can roll back.
10
+
11
+ 09:31 Mei L. (Support lead)
12
+ We've had 3 tickets like this since Tuesday. All say "charged twice". One also says the pass
13
+ didn't appear.
14
+
15
+ 09:40 Dana R.
16
+ Can someone write this up properly for the payments squad?
@@ -0,0 +1,10 @@
1
+ Support ticket T-55102
2
+ Channel: in-app "Contact us" form
3
+ Received: 2026-10-16 09:02 (local time, UTC-4)
4
+ Account: acct_7781
5
+
6
+ Message from customer:
7
+ I bought a day pass in the app this morning around 8:15 and got charged TWICE. The app froze
8
+ on the payment spinner so I pressed Pay again. My bank now shows two $6.50 charges. And the
9
+ pass never showed up in the app so I had to pay cash on the 8:30 bus as well!! Fix this and
10
+ refund me. I'm on an iPhone, the app updated itself yesterday.