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,32 @@
1
+ stages:
2
+ - test
3
+ - build
4
+
5
+ python-tests:
6
+ stage: test
7
+ image: python:3.12
8
+ script:
9
+ - pip install -e . pytest pytest-cov
10
+ - pytest --cov=src/wayline --cov-report=xml:build/coverage.xml
11
+ artifacts:
12
+ paths:
13
+ - build/coverage.xml
14
+
15
+ web-tests:
16
+ stage: test
17
+ image: node:20
18
+ script:
19
+ - cd web
20
+ - npm ci
21
+ - npm test
22
+ artifacts:
23
+ paths:
24
+ - web/coverage/lcov.info
25
+
26
+ web-build:
27
+ stage: build
28
+ image: node:20
29
+ script:
30
+ - cd web
31
+ - npm ci
32
+ - npm run build
@@ -0,0 +1,11 @@
1
+ # Wayline
2
+
3
+ Timetable and departure-board service for Harrow Valley Transit (invented example project).
4
+
5
+ - `src/wayline/` — Python service (timetable merge, departure predictions).
6
+ - `src/wayline/_generated/` — generated by protoc from the stop-feed schema. Do not edit by hand.
7
+ - `src/wayline/vendor/gtfs_lite/` — a vendored copy of a third-party feed parser, pinned. Not our code.
8
+ - `tests/` — pytest suite for the Python service.
9
+ - `web/` — TypeScript departure-board frontend; Jest tests sit next to the code as `*.test.ts`.
10
+
11
+ CI runs on our GitLab instance (see `.gitlab-ci.yml`).
@@ -0,0 +1,16 @@
1
+ [project]
2
+ name = "wayline"
3
+ version = "0.9.0"
4
+ requires-python = ">=3.11"
5
+
6
+ [tool.setuptools.packages.find]
7
+ where = ["src"]
8
+
9
+ [tool.pytest.ini_options]
10
+ testpaths = ["tests"]
11
+
12
+ [tool.coverage.run]
13
+ source = ["src/wayline"]
14
+
15
+ [tool.coverage.xml]
16
+ output = "reports/coverage.xml"
@@ -0,0 +1 @@
1
+ """Wayline timetable service."""
@@ -0,0 +1,4 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: stops.proto
4
+ _STOP_FIELDS = ("stop_id", "name", "lat", "lon", "zone")
@@ -0,0 +1,12 @@
1
+ from datetime import datetime, timedelta
2
+
3
+
4
+ def next_departures(schedule, now: datetime, limit: int = 5):
5
+ """Return the next `limit` departures at or after `now` from a list of (route, datetime)."""
6
+ upcoming = sorted((d for d in schedule if d[1] >= now), key=lambda d: d[1])
7
+ return upcoming[:limit]
8
+
9
+
10
+ def apply_delay(departure, minutes: int):
11
+ route, when = departure
12
+ return route, when + timedelta(minutes=minutes)
@@ -0,0 +1,3 @@
1
+ # Vendored third-party feed parser, pinned at 2.3.1. Upstream owns this code; do not modify.
2
+ def parse_stop_times(rows):
3
+ return [dict(zip(("trip_id", "arrival", "departure", "stop_id"), r)) for r in rows]
@@ -0,0 +1,14 @@
1
+ from datetime import datetime
2
+
3
+ from wayline.timetable import apply_delay, next_departures
4
+
5
+
6
+ def test_next_departures_orders_and_limits():
7
+ now = datetime(2026, 10, 1, 8, 0)
8
+ sched = [("12", datetime(2026, 10, 1, 8, 20)), ("7", datetime(2026, 10, 1, 8, 5)),
9
+ ("3", datetime(2026, 10, 1, 7, 50))]
10
+ assert next_departures(sched, now, limit=1) == [("7", datetime(2026, 10, 1, 8, 5))]
11
+
12
+
13
+ def test_apply_delay():
14
+ assert apply_delay(("7", datetime(2026, 10, 1, 8, 5)), 4)[1] == datetime(2026, 10, 1, 8, 9)
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "wayline-board",
3
+ "version": "0.9.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "build": "tsc -p .",
7
+ "test": "jest --coverage"
8
+ },
9
+ "jest": {
10
+ "preset": "ts-jest",
11
+ "testMatch": ["**/src/**/*.test.ts"],
12
+ "coverageDirectory": "coverage",
13
+ "coverageReporters": ["lcov", "text-summary"]
14
+ },
15
+ "devDependencies": {
16
+ "jest": "^29.7.0",
17
+ "ts-jest": "^29.1.0",
18
+ "typescript": "^5.4.0"
19
+ }
20
+ }
@@ -0,0 +1,9 @@
1
+ import { formatRow } from "./board";
2
+
3
+ test("due when zero minutes", () => {
4
+ expect(formatRow({ route: "7", minutes: 0 })).toBe("7 due");
5
+ });
6
+
7
+ test("minutes otherwise", () => {
8
+ expect(formatRow({ route: "12", minutes: 4 })).toBe("12 4 min");
9
+ });
@@ -0,0 +1,8 @@
1
+ export interface Departure {
2
+ route: string;
3
+ minutes: number;
4
+ }
5
+
6
+ export function formatRow(d: Departure): string {
7
+ return d.minutes <= 0 ? `${d.route} due` : `${d.route} ${d.minutes} min`;
8
+ }
@@ -11,6 +11,33 @@
11
11
  "Findings are grouped into the lenses (bugs, vulnerabilities, security hotspots, code smells, coverage/duplication)",
12
12
  "Server vs cloud is auto-detected from sonar-project.properties rather than assumed"
13
13
  ]
14
+ },
15
+ {
16
+ "id": 2,
17
+ "held_out": "2026-10-18",
18
+ "prompt": "Will my branch pass the quality gate? I can't run the scanner here: there's no Sonar token in this environment and no network. CI saved the last scan's output into this folder: quality-gate.json, issues.json, hotspots.json, and changed-files.txt (my branch's files against main). Locally pytest-cov says 85% coverage, so I think we're fine. Give me something I can paste into the PR description, under 300 words.",
19
+ "assertions": [
20
+ "Reports that the gate fails, taking the verdict from the status in quality-gate.json, and names at least the new-code coverage condition (61.3% against 80%) and the unreviewed security hotspot condition",
21
+ "Explains that the local 85% figure does not change the result: the gate measured 61.3% coverage on new code",
22
+ "Keeps the findings to the changed files: the blocker SQL-injection issue in legacy/ledger_import.py and the issue in intake/weighbridge.py are not presented as findings for this branch (they may be noted separately as pre-existing)",
23
+ "Does not list the issue resolved as a false positive (python:S1192 in intake/payments.py) as an open finding",
24
+ "Notes that the scan analysed revision 7f3c2e1 while the branch head is 9a41d07, whose commit message suggests the float-comparison bug was fixed after the scan, so the results may be out of date",
25
+ "Does not invent issues, rule IDs, line numbers or metric values that are not in the supplied files, and does not claim to have run a new scan",
26
+ "Stays under 300 words"
27
+ ]
28
+ },
29
+ {
30
+ "id": 3,
31
+ "held_out": "2026-10-18",
32
+ "prompt": "Our contractor says the Sonar check 'went red' on their pull request and they're fixing it. I'm the project manager, not a developer. This is what I can see on the screen: 'Quality Gate failed. 2 conditions failed: Coverage on New Code 54.0% (required >= 80.0%), Duplicated Lines on New Code 6.1% (required <= 3.0%). 0 new bugs, 0 new vulnerabilities, 4 new code smells.' Is this serious? Should I hold Friday's release? Three sentences max.",
33
+ "assertions": [
34
+ "Gives a clear recommendation for Friday: this change should not go out until the gate passes, unless someone decides on purpose to accept the risk",
35
+ "Explains in plain words that the failures are about too little testing of the new code and too much copied code, and that no new bugs or security problems were reported",
36
+ "Does not describe the result as a security or data-loss problem",
37
+ "Does not invent files, rule IDs, specific issues or figures beyond the text on the screen, and does not claim to have run a scan",
38
+ "Uses at most three sentences",
39
+ "Answers without first asking for access, a token or more information"
40
+ ]
14
41
  }
15
42
  ]
16
43
  }
@@ -0,0 +1,5 @@
1
+ # git diff --name-only main...HEAD
2
+ # HEAD = 9a41d07 "fix float compare in litre totals"
3
+ intake/api.py
4
+ intake/payments.py
5
+ tests/test_payments.py
@@ -0,0 +1,7 @@
1
+ {
2
+ "hotspots": [
3
+ {"key": "HSa01", "ruleKey": "python:S4790", "securityCategory": "weak-cryptography", "vulnerabilityProbability": "LOW",
4
+ "status": "TO_REVIEW", "component": "brookmere-intake:intake/api.py", "line": 41,
5
+ "message": "Make sure this weak hash algorithm is not used in a sensitive context here."}
6
+ ]
7
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "total": 7,
3
+ "issues": [
4
+ {"key": "AZx01", "rule": "python:S1244", "severity": "MAJOR", "type": "BUG", "status": "OPEN",
5
+ "component": "brookmere-intake:intake/payments.py", "line": 88,
6
+ "message": "Do not perform equality checks with floating point values."},
7
+ {"key": "AZx02", "rule": "python:S3776", "severity": "CRITICAL", "type": "CODE_SMELL", "status": "OPEN",
8
+ "component": "brookmere-intake:intake/payments.py", "line": 52,
9
+ "message": "Refactor this function to reduce its Cognitive Complexity from 23 to the 15 allowed."},
10
+ {"key": "AZx03", "rule": "python:S1192", "severity": "MINOR", "type": "CODE_SMELL", "status": "RESOLVED", "resolution": "FALSE-POSITIVE",
11
+ "component": "brookmere-intake:intake/payments.py", "line": 120,
12
+ "message": "Define a constant instead of duplicating this literal \"litres\" 4 times."},
13
+ {"key": "AZx04", "rule": "python:S1481", "severity": "MINOR", "type": "CODE_SMELL", "status": "OPEN",
14
+ "component": "brookmere-intake:intake/api.py", "line": 17,
15
+ "message": "Remove the unused local variable \"farm_ref\"."},
16
+ {"key": "AZx05", "rule": "python:S5754", "severity": "CRITICAL", "type": "CODE_SMELL", "status": "OPEN",
17
+ "component": "brookmere-intake:tests/test_payments.py", "line": 30,
18
+ "message": "Specify an exception class to catch or reraise the exception"},
19
+ {"key": "AZx06", "rule": "python:S3649", "severity": "BLOCKER", "type": "VULNERABILITY", "status": "OPEN",
20
+ "component": "brookmere-intake:legacy/ledger_import.py", "line": 204,
21
+ "message": "Change this code to not construct SQL queries directly from user-controlled data."},
22
+ {"key": "AZx07", "rule": "python:S1481", "severity": "MINOR", "type": "CODE_SMELL", "status": "OPEN",
23
+ "component": "brookmere-intake:intake/weighbridge.py", "line": 12,
24
+ "message": "Remove the unused local variable \"tare\"."}
25
+ ]
26
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "analysis": {
3
+ "project": "brookmere-intake",
4
+ "branch": "feature/litre-rounding",
5
+ "revision": "7f3c2e1",
6
+ "date": "2026-10-16T14:02:11Z"
7
+ },
8
+ "projectStatus": {
9
+ "status": "ERROR",
10
+ "conditions": [
11
+ {"status": "ERROR", "metricKey": "new_coverage", "comparator": "LT", "errorThreshold": "80", "actualValue": "61.3"},
12
+ {"status": "ERROR", "metricKey": "new_security_hotspots_reviewed", "comparator": "LT", "errorThreshold": "100", "actualValue": "0.0"},
13
+ {"status": "ERROR", "metricKey": "new_reliability_rating", "comparator": "GT", "errorThreshold": "1", "actualValue": "3"},
14
+ {"status": "OK", "metricKey": "new_security_rating", "comparator": "GT", "errorThreshold": "1", "actualValue": "1"},
15
+ {"status": "OK", "metricKey": "new_maintainability_rating", "comparator": "GT", "errorThreshold": "1", "actualValue": "1"},
16
+ {"status": "OK", "metricKey": "new_duplicated_lines_density", "comparator": "GT", "errorThreshold": "3", "actualValue": "1.2"}
17
+ ]
18
+ }
19
+ }
@@ -40,6 +40,34 @@
40
40
  "It adds no debt items beyond the four the user listed",
41
41
  "Owners are unassigned"
42
42
  ]
43
+ },
44
+ {
45
+ "id": 4,
46
+ "held_out": "2026-10-18",
47
+ "prompt": "I lead the warehouse systems team at Kestrel Freight. Our Q3 retro debt notes are in retro-notes.md and the incident log is incidents.csv. We've been given 3 engineer-weeks of debt time this quarter. Build the debt register and tell me what we should spend those 3 weeks on. I'm taking it to the operations director, so one page.",
48
+ "assertions": [
49
+ "Puts the scanner TLS certificate renewal among this quarter's work, citing the 2026-12-01 expiry and that the person who renewed it has left with no known notes",
50
+ "Treats the stock-sync notes (Marta's and Ines's split-pallet complaints) as one item",
51
+ "Recommends the roughly 3-day split-pallet patch rather than the two-person, full-quarter sync rewrite for this quarter, because the rewrite does not fit 3 engineer-weeks, and the items picked for the quarter fit within the 3 weeks",
52
+ "Flags at least one disagreement between the notes and the incident log, such as the claimed 40 engineer-hours on sync failures against 5 logged hours, or the label printer crashing 'every week' against two logged incidents, instead of silently using one figure",
53
+ "Does not recommend the Perl reporting rewrite for this quarter, since the notes give no evidence of what it costs today",
54
+ "Does not invent costs, hours, incident counts, owners or dates beyond those in the two files",
55
+ "Fits about one page"
56
+ ]
57
+ },
58
+ {
59
+ "id": 5,
60
+ "held_out": "2026-10-18",
61
+ "prompt": "I own a small bakery. My nephew built our online ordering site years ago. The new freelancer says it's 'full of tech debt' and sent me this list: PHP 5 site, no backups of the order database, customer passwords stored in plain text, copy-pasted code everywhere, no tests. She wants two weeks to fix it. What actually matters? Just a short list I can understand.",
62
+ "assertions": [
63
+ "Puts the missing database backups and the plain-text passwords at the top, saying in plain words what could go wrong for the bakery",
64
+ "Does not rank the copied code or the missing tests above those two",
65
+ "Treats the old PHP version as a real risk because it no longer gets security fixes, without inventing a specific vulnerability or attack",
66
+ "Does not invent costs, hours, incidents or customer numbers that are not in the message",
67
+ "Says what the two weeks should go on first, rather than only listing the items",
68
+ "Is a short list in plain language, without unexplained jargon",
69
+ "Answers without first asking questions"
70
+ ]
43
71
  }
44
72
  ]
45
73
  }
@@ -0,0 +1,7 @@
1
+ id,date,system,summary,duration_hours,owner
2
+ WH-201,2026-07-08,label-print,Label print service hung; restarted,0.5,Tomas
3
+ WH-207,2026-07-29,putaway,Deploy broke putaway location rules; rolled back,3,Ines
4
+ WH-214,2026-08-19,stock-sync,Split-pallet rows missing from ledger; manual fix,2,
5
+ WH-219,2026-09-02,label-print,Label print service hung; restarted,0.5,Tomas
6
+ WH-223,2026-09-16,putaway,Deploy broke putaway for cold-store zone; rolled back,4,Ines
7
+ WH-226,2026-09-24,stock-sync,Split-pallet rows missing from ledger; manual fix,3,
@@ -0,0 +1,21 @@
1
+ # Warehouse Systems, Q3 retro: debt column (raw, as written on the board)
2
+
3
+ Team: Kestrel Freight warehouse systems, Hollins depot. Five engineers.
4
+
5
+ - (Marta) The nightly stock sync between the WMS and the finance ledger drops rows when a pallet is
6
+ split. Finance reconciles by hand every Monday. Oleksandr in finance says it takes him about half
7
+ a day each week.
8
+ - (Ines) Monday reconciliation is painful because the sync misses split pallets. Can we fix the
9
+ sync?
10
+ - (Tomas) Sync failures cost us about 40 engineer-hours this quarter.
11
+ - (Marta) Doing the stock sync properly (rewrite on the new event feed) is a big job: two people
12
+ for a full quarter. A targeted patch for split pallets only is about 3 days.
13
+ - (Dev) The old Perl reporting scripts are horrible. Nobody wants to touch them. We should rewrite
14
+ them in Python.
15
+ - (Tomas) The label printing service crashes every week and we restart it by hand.
16
+ - (Marta) The handheld scanners talk to the WMS API through a TLS certificate that Raj used to renew
17
+ by hand. Raj left in August and nobody knows where his renewal notes are. The gateway shows the
18
+ certificate expires on 2026-12-01. If it lapses, every scanner on the floor stops.
19
+ - (Dev) The WMS adapter test suite takes 50 minutes, so people skip it before deploys.
20
+ - (Ines) Both putaway incidents this quarter came from deploys where the tests were skipped.
21
+ - (Ines) Speeding the adapter tests up to under 10 minutes: Dev thinks about a week of work.
@@ -11,6 +11,33 @@
11
11
  "Each test is pushed to the lowest pyramid level that would catch the failure",
12
12
  "Out-of-scope areas are named rather than silently skipped"
13
13
  ]
14
+ },
15
+ {
16
+ "id": 2,
17
+ "held_out": "2026-10-18",
18
+ "prompt": "Write the test plan for the parking permit renewal release described in permit-renewal-spec.md. QA starts on Monday. Two pages at most.",
19
+ "assertions": [
20
+ "Flags that the low-emission price conflicts (50% off £120 is £60, but the price table says £65) as something to settle before testing, rather than silently picking one as the expected result",
21
+ "Flags that the spec promises seven acceptance criteria but lists six, with AC5 missing",
22
+ "Every acceptance criterion in the spec is covered by at least one test or explicitly listed as not covered",
23
+ "Includes tests on both sides of each boundary: 30 days before expiry, 60 days after expiry, and 50 g/km of CO2",
24
+ "Uses the vehicle register stub for testing and lists the live register lookup as not tested, rather than planning tests against the live service",
25
+ "Does not invent a load target such as requests per second or concurrent users for the January rush; it says the figure is needed from Parking Services",
26
+ "Fits about two pages"
27
+ ]
28
+ },
29
+ {
30
+ "id": 3,
31
+ "held_out": "2026-10-18",
32
+ "prompt": "I'm a teacher. I made a spreadsheet that works out final grades: homework is 40%, the exam is 60%, and a student who missed the exam gets 'INC'. A colleague said I should test it before I send grades home. What should I check? Just a checklist, 10 items max.",
33
+ "assertions": [
34
+ "Includes a check for a student with no exam score (expecting INC) and a check for a student with an exam score but missing homework",
35
+ "Includes at least one worked example with numbers and the expected result from the 40/60 weighting (for example homework 80 and exam 90 gives 86)",
36
+ "Includes checks for entry mistakes such as a score above 100, or a blank cell treated as zero",
37
+ "Does not invent letter-grade cut-offs, rounding rules or other rules the teacher did not state; if they matter, it asks the teacher to fill them in",
38
+ "Has no more than 10 items, written in spreadsheet terms a non-programmer understands",
39
+ "Delivers the checklist without first asking questions"
40
+ ]
14
41
  }
15
42
  ]
16
43
  }
@@ -0,0 +1,40 @@
1
+ # Online resident parking permit renewal: low-emission discount
2
+
3
+ Riverton Borough Council (invented), Parking Services. Status: approved for build, release planned
4
+ for 1 December, before the January renewal rush.
5
+
6
+ ## Background
7
+
8
+ Residents renew their parking permit online each year. From this release, permits for low-emission
9
+ vehicles get a 50% discount on the standard annual price of £120. Emissions are looked up from the
10
+ national vehicle register using the registration number the resident enters.
11
+
12
+ ## Acceptance criteria
13
+
14
+ The seven acceptance criteria below must all pass before release.
15
+
16
+ - AC1. A resident can start a renewal from 30 days before their permit's expiry date. Before that,
17
+ the renew button is hidden and the page shows the date renewal opens.
18
+ - AC2. A permit that expired 60 days ago or less can still be renewed. A permit that expired more
19
+ than 60 days ago cannot be renewed; the resident is sent to the new-application form.
20
+ - AC3. The registration number entered is looked up on the vehicle register. If the vehicle's
21
+ CO2 emissions are 50 g/km or less, the low-emission price applies.
22
+ - AC4. If the vehicle register lookup fails or times out, the resident is charged the standard
23
+ price and told they can claim the discount by contacting Parking Services.
24
+ - AC6. The price shown on the confirmation page is the amount sent to the payment provider.
25
+ - AC7. A resident can hold at most one active permit per address. Renewal replaces the old permit;
26
+ it never creates a second one.
27
+
28
+ ## Prices
29
+
30
+ | Vehicle | Annual price |
31
+ |--------------------|--------------|
32
+ | Standard | £120 |
33
+ | Low-emission | £65 |
34
+
35
+ ## Dependencies and constraints
36
+
37
+ - Vehicle register: the test environment has a stub only. The live register cannot be called from
38
+ test or staging under the data-sharing agreement.
39
+ - Payment provider: unchanged by this release and out of scope; it is tested by the provider.
40
+ - Parking Services wants confidence that the site will cope with the January renewal rush.
@@ -11,6 +11,33 @@
11
11
  "Dependencies between stories are stated, and a recommended build order follows from them",
12
12
  "Stories are independently shippable rather than layered horizontally (all backend, then all frontend)"
13
13
  ]
14
+ },
15
+ {
16
+ "id": 2,
17
+ "held_out": "2026-10-18",
18
+ "prompt": "Turn the shift-swap PRD in prd-shift-swap.md into user stories for next week's planning, with acceptance criteria and the order we should build them in.",
19
+ "assertions": [
20
+ "Each story delivers something a nurse or ward manager can use, rather than a layer such as database schema, API endpoints or UI screens",
21
+ "Flags the conflict between 'manager approval is required for all swaps' and section 9.4 of the staff agreement (same-grade, same-ward swaps need only notification), and does not silently pick one",
22
+ "Notices that the PRD's worked example is wrong (40 + 12 hours is 52, which is over the 48-hour limit) and writes acceptance criteria that enforce the 48-hour rule",
23
+ "Any story that needs a change to the payroll export is marked as blocked until the January freeze lifts, not placed in the near-term build order",
24
+ "Acceptance criteria are pass/fail with specific values from the PRD, such as the 48 hours in a rolling 7 days and the grade rule",
25
+ "Does not invent requirements, roles or rules that are not in the PRD, and adds no mobile app stories",
26
+ "Has no more than eight stories"
27
+ ]
28
+ },
29
+ {
30
+ "id": 3,
31
+ "held_out": "2026-10-18",
32
+ "prompt": "I coordinate volunteers for our town's food festival. We want our sign-up website to let people sign up for time slots, get reminders, and swap slots with each other. A developer friend said to send him 'user stories'. Can you write them? No more than five, as one short list I can send him.",
33
+ "assertions": [
34
+ "Splits the work into pieces a volunteer or coordinator could each try out on their own, with signing up for a slot coming before reminders and swapping",
35
+ "Each story has at least one concrete check for when it is done",
36
+ "Does not invent details the user didn't give, such as reminder channel, timing or slot limits, or marks them clearly as open questions for the developer",
37
+ "Gives a suggested build order with a reason",
38
+ "Has no more than five stories, short enough to send as one list",
39
+ "Delivers the list without first asking questions"
40
+ ]
14
41
  }
15
42
  ]
16
43
  }
@@ -0,0 +1,38 @@
1
+ # PRD excerpt: nurse shift swaps
2
+
3
+ St Aldric Hospital (invented), nursing workforce team. Web rostering system only; a mobile app is a
4
+ later project and not part of this work.
5
+
6
+ ## Problem
7
+
8
+ Nurses arrange shift swaps by text message and a paper book on each ward. Managers find out late,
9
+ wards end up short, and nobody can tell afterwards who worked which shift.
10
+
11
+ ## What we want
12
+
13
+ 1. A nurse can offer one of their rostered shifts for swap, and see shifts others have offered.
14
+ 2. A nurse can request to take an offered shift, giving one of their own shifts in exchange or
15
+ taking it as an extra shift.
16
+ 3. Manager approval is required for all swaps before the roster changes.
17
+ 4. The system blocks any swap that would take a nurse over 48 hours of work in any rolling 7-day
18
+ period (working-time rule). Example: a nurse on 40 hours who picks up a 12-hour shift would be
19
+ at 50 hours, which is allowed.
20
+ 5. A swap is only allowed between nurses of the same grade, or from a higher grade to cover a lower
21
+ one; never a lower grade covering a higher one.
22
+ 6. When a swap is approved, both nurses and the ward manager get a notification in the rostering
23
+ system.
24
+ 7. Extra shifts picked up through swaps are paid as overtime, and the overtime should flow
25
+ automatically into the payroll export.
26
+ 8. Every swap (offered, requested, approved, rejected) is kept in an audit history that the ward
27
+ manager can view.
28
+
29
+ ## Extract from the staff agreement (section 9.4)
30
+
31
+ "Swaps between nurses of the same grade working on the same ward do not require manager approval.
32
+ The ward manager must be notified of the swap before the first affected shift starts."
33
+
34
+ ## Constraints
35
+
36
+ - The payroll export is frozen until January while payroll moves supplier. No changes to the export
37
+ this quarter.
38
+ - Two developers. Planning wants the backlog in stories, no more than eight.
@@ -13,6 +13,33 @@
13
13
  "The cut list includes the 'market-leading service' and 'industry accolades' sentence with a reason",
14
14
  "Does not invent a phone number, URL, excess amount or other fact not in the prompt; unknowns are placeholders listed as open questions"
15
15
  ]
16
+ },
17
+ {
18
+ "id": 2,
19
+ "held_out": "2026-10-18",
20
+ "prompt": "Rewrite our Hardship Payment Plan page for Waterfold Water. The current page is in current-page.md. The policy it's meant to describe is policy-extract.md, and what customers actually ask us is in contact-centre-notes.md, along with some requests from our Comms manager. Give me the rewritten page ready to paste into the CMS, plus a short note of anything you changed on purpose or couldn't resolve.",
21
+ "assertions": [
22
+ "Uses the current policy's facts (income below £21,000, up to 24 months, 2 months of bank statements OR proof of benefit, no bill needed, decision within 10 working days) rather than the old page's figures, and notes that the old page disagreed with the policy",
23
+ "Does not carry over the '£900 over 12 months = £100 a month' example uncorrected; either flags that it doesn't add up or replaces it with a correct example",
24
+ "Does not promise a decision within 48 hours; keeps the policy's 10 working days and says why the Comms request was not followed",
25
+ "The page answers the callers' frequent questions in the reader's words, including that reminder letters and debt collection stop while the application is considered and what happens if payments are missed (two in a row, with 14 days' notice)",
26
+ "The rewritten page body is under 350 words",
27
+ "Does not invent a phone number, URL, approval rate or any other fact not in the files; the phone number and form link are left as clear placeholders",
28
+ "Delivers the finished page rather than stopping to ask questions first"
29
+ ]
30
+ },
31
+ {
32
+ "id": 3,
33
+ "held_out": "2026-10-18",
34
+ "prompt": "hi, i run a small vet clinic. our 'before your pet's operation' sheet is a wall of text and people still feed their dogs the morning of surgery!! can you make it simple? half a page max, it gets printed. here's what it says now: 'Patients must be NPO from midnight prior to the procedure. Food must be withheld after 10pm the evening before. Water may be offered until 7am. Admission is between 8:00 and 8:30am. Owners should bring any current medication. Pre-anaesthetic bloods may be performed on admission. Owners will be telephoned after 2pm regarding discharge.'",
35
+ "assertions": [
36
+ "The no-food instruction is the most prominent thing on the sheet, since that is the problem the owner described",
37
+ "Notices that 'NPO from midnight' and 'no food after 10pm' disagree, and either uses one with a stated reason or asks the clinic to confirm, rather than silently picking one",
38
+ "Keeps the other facts: water until 7am, drop-off between 8:00 and 8:30am, bring current medication, possible blood test on arrival, and a call after 2pm about going home",
39
+ "Replaces jargon like 'NPO' and 'pre-anaesthetic bloods' with words a pet owner understands",
40
+ "Does not invent facts not given, such as different rules for cats, fasting for medication, prices or a phone number",
41
+ "Fits in half a printed page (roughly 200 words or fewer)"
42
+ ]
16
43
  }
17
44
  ]
18
45
  }
@@ -0,0 +1,18 @@
1
+ # Notes from the Contact Centre Lead and the Comms team
2
+
3
+ Why people call us about the hardship page (sample of 400 calls, August 2026):
4
+
5
+ | Reason for call | Share |
6
+ |---|---|
7
+ | "Am I eligible?" | 38% |
8
+ | "What do I need to send?" | 27% |
9
+ | "Will you keep chasing me / sending letters while you decide?" | 18% |
10
+ | "How much will I pay each month?" | 11% |
11
+ | Other | 6% |
12
+
13
+ Lots of callers have already received a reminder letter and are anxious. Many read the page on a phone.
14
+
15
+ From the Comms manager:
16
+ - "Can we say decisions are made within 48 hours? It sounds much more reassuring."
17
+ - "Please keep the page body under 350 words. The CMS template cuts off anything after that."
18
+ - "Add the phone number and the link to the online form." (We'll supply both later; don't hold the draft for them.)
@@ -0,0 +1,17 @@
1
+ # Hardship Payment Plan
2
+
3
+ Waterfold Water is proud to be ranked among the region's most trusted utilities, and we are committed to supporting every customer through difficult times.
4
+
5
+ Customers who are experiencing financial difficulty and who have accrued arrears on their water and wastewater account may, subject to eligibility criteria, be able to apply for a Hardship Payment Plan, whereby outstanding arrears are repaid in equal instalments in addition to ongoing charges.
6
+
7
+ Eligibility is restricted to households whose gross annual household income is below £18,500, or where one or more members of the household are in receipt of a qualifying means-tested benefit.
8
+
9
+ Arrears may be repaid in equal instalments over a period of up to 12 months. By way of illustration, a customer with arrears of £900 would repay the sum of £100 per month in addition to their usual charges.
10
+
11
+ In order to be considered, applicants are required to furnish three months of bank statements for all accounts held by members of the household, together with proof of receipt of any qualifying benefit, and a copy of their most recent bill.
12
+
13
+ Applications are typically processed within 5 working days of receipt of all documentation. Waterfold Water reserves the right to decline applications at its discretion.
14
+
15
+ Please be advised that a Hardship Payment Plan may be cancelled in the event of non-payment.
16
+
17
+ Waterfold Water has won the Regional Utility Customer Care Award three years running.
@@ -0,0 +1,17 @@
1
+ # Waterfold Water — Customer Assistance Policy, section 4: Hardship Payment Plan
2
+
3
+ Version 3.0. Effective 1 September 2026. Supersedes version 2.2 in full.
4
+
5
+ 4.1 Eligibility. A household is eligible if its gross annual household income is below £21,000, OR if any member of the household receives a qualifying means-tested benefit (Schedule B).
6
+
7
+ 4.2 Term. Arrears are repaid in equal monthly instalments over up to 24 months, on top of ongoing charges.
8
+
9
+ 4.3 Evidence. The applicant provides EITHER the last 2 months of bank statements for the household's main account, OR proof of a qualifying benefit. Not both. A copy of a bill is not required; we hold the account details.
10
+
11
+ 4.4 Decision. A decision is issued within 10 working days of receiving the evidence.
12
+
13
+ 4.5 Collection activity. All collection activity on the account (reminder letters, referral to debt collection agents) is paused from the day an application is received until the decision is issued.
14
+
15
+ 4.6 Cancellation. A plan is cancelled if two consecutive monthly payments are missed. Before cancelling, we write to the customer and give 14 days to make the missed payment.
16
+
17
+ 4.7 Reapplication. A customer whose plan is cancelled may reapply after 6 months.
@@ -14,6 +14,33 @@
14
14
  "Every WCAG citation is a real WCAG 2.2 criterion with the correct number and name",
15
15
  "Ends with open questions for engineering, each naming the decision it blocks"
16
16
  ]
17
+ },
18
+ {
19
+ "id": 2,
20
+ "held_out": "2026-10-18",
21
+ "prompt": "Write the component spec for the dose stepper in our MedRound ward medication app so engineering can build it. The designer's notes are in designer-notes.md, our tokens are in tokens.json, and the open build questions are in eng-thread.md. Keep it to one Confluence page, about 1,200 words maximum.",
22
+ "assertions": [
23
+ "Flags that the error text colour #E57373 on the white surface is about 3:1 and fails the 4.5:1 text contrast requirement, despite the designer's note saying it passes, and proposes the darker error token or another fix",
24
+ "Flags that 20 × 20 px buttons fall below the WCAG 2.2 AA minimum target size of 24 × 24 CSS px (2.5.8), and does not present 44 px as the AA requirement",
25
+ "Does not use 'color.border.focus-strong' as if it exists; notes it is missing from tokens.json and points to an existing token or leaves it as an open question",
26
+ "Does not specify press-and-hold auto-repeat as settled behaviour; it follows the clinical safety objection (one tap, one step) or raises the disagreement as a decision to be made",
27
+ "States what happens at 0.5 mL and 10 mL and when someone types an out-of-range or off-step value such as 12, 0 or 2.3, answering QA's question",
28
+ "Does not invent usage data (such as how often nurses hit 10 mL), token values or research not in the files",
29
+ "Stays within about 1,200 words"
30
+ ]
31
+ },
32
+ {
33
+ "id": 3,
34
+ "held_out": "2026-10-18",
35
+ "prompt": "our developer asked me to 'spec' the newsletter signup box on our garden centre website before he builds it. i'm the marketing person, i don't really know what that means lol. it's just an email box and a button that says Join. to save space i was going to put 'Your email' inside the box instead of a label above it. can you give me a short checklist he can work from? one screen max.",
36
+ "assertions": [
37
+ "Covers what happens with an invalid or empty email, while the form is sending, after a successful signup, and if sending fails",
38
+ "Advises against using the placeholder text as the only label, and explains why in plain terms (it disappears when typing, and screen readers and some users miss it)",
39
+ "Covers keyboard use and screen-reader needs, such as a programmatic label and error messages that are announced",
40
+ "Written plainly for a marketing person to hand to a developer, without unexplained design-system jargon",
41
+ "Does not invent brand colours, fonts, token names, pixel values or a privacy policy link not given; anything needed is left as something to fill in",
42
+ "Fits on one screen (roughly 300 words or fewer) as a checklist"
43
+ ]
17
44
  }
18
45
  ]
19
46
  }
@@ -0,0 +1,23 @@
1
+ # Dose stepper — designer notes (MedRound ward medication app, tablet)
2
+
3
+ Context: nurses use MedRound on shared ward tablets to record liquid doses given at the bedside. The dose stepper replaces a free-text field that produced typing errors (e.g. "50" entered for "5.0").
4
+
5
+ Anatomy as drawn:
6
+ - Label above the field ("Dose (mL)")
7
+ - Minus button, value field, plus button, in one row
8
+ - Unit suffix "mL" inside the field, right-aligned
9
+ - Helper text below ("Prescribed: 5 mL")
10
+ - Error text below, replaces helper text
11
+
12
+ Behaviour as drawn:
13
+ - Step 0.5 mL. Minimum 0.5 mL, maximum 10 mL (the largest syringe the wards stock).
14
+ - Nurses can also type a value directly.
15
+ - Minus is disabled at the minimum, plus is disabled at the maximum.
16
+ - If the entered dose differs from the prescribed dose, show a warning (not an error) and require a second tap on Confirm.
17
+
18
+ Visual:
19
+ - Plus/minus buttons are 20 × 20 px so the row fits the narrow MAR column. WCAG only asks for 44 px at AAA so 20 px is fine for AA.
20
+ - Field border uses `color.border.default`; on focus use `color.border.focus-strong`.
21
+ - Error text uses `color.text.error` (#E57373) on the white surface — checked, passes AA.
22
+ - Disabled buttons use `color.icon.disabled`.
23
+ - Warning uses `color.text.warning`.