skilldrop-cli 0.16.19 → 0.16.21
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.
- package/bin/skilldrop.js +18 -4
- package/catalogue.json +2 -1
- package/model-routing.json +221 -217
- package/package.json +1 -1
- package/packs/ai-engineering/skills/agent-adoption-stage/evals/evals.json +28 -0
- package/packs/ai-engineering/skills/agent-adoption-stage/evals/files/2/agent-telemetry.csv +7 -0
- package/packs/ai-engineering/skills/agent-adoption-stage/evals/files/2/cto-offsite-memo.md +9 -0
- package/packs/ai-engineering/skills/agent-adoption-stage/evals/files/2/dev-survey-summary.md +9 -0
- package/packs/ai-engineering/skills/agent-adoption-stage/evals/files/2/engineering-policy.md +15 -0
- package/packs/ai-engineering/skills/agent-budget/evals/evals.json +27 -0
- package/packs/ai-engineering/skills/agent-budget/evals/files/3/finance-note.md +10 -0
- package/packs/ai-engineering/skills/agent-budget/evals/files/3/pipeline.md +18 -0
- package/packs/ai-engineering/skills/agent-budget/evals/files/3/price-sheet.md +9 -0
- package/packs/ai-engineering/skills/agent-budget/evals/files/3/september-usage.csv +7 -0
- package/packs/ai-engineering/skills/agent-loop-design/evals/evals.json +28 -0
- package/packs/ai-engineering/skills/agent-loop-design/evals/files/3/design-guide-extract.md +13 -0
- package/packs/ai-engineering/skills/agent-loop-design/evals/files/3/legal-advice.md +9 -0
- package/packs/ai-engineering/skills/agent-loop-design/evals/files/3/request-from-head-of-planning.md +11 -0
- package/packs/ai-engineering/skills/agent-loop-design/evals/files/3/trial-notes.md +13 -0
- package/packs/ai-engineering/skills/agent-threat-model/evals/evals.json +27 -0
- package/packs/ai-engineering/skills/agent-threat-model/evals/files/4/agent-config.yaml +19 -0
- package/packs/ai-engineering/skills/agent-threat-model/evals/files/4/agent-spec.md +17 -0
- package/packs/ai-engineering/skills/agent-threat-model/evals/files/4/previous-review.md +10 -0
- package/packs/ai-engineering/skills/agent-threat-model/evals/files/4/vendor-security-note.md +4 -0
- package/packs/ai-engineering/skills/ai-adoption-rollout/evals/evals.json +28 -0
- package/packs/ai-engineering/skills/ai-adoption-rollout/evals/files/2/cno-brief.md +17 -0
- package/packs/ai-engineering/skills/ai-adoption-rollout/evals/files/2/education-capacity.md +5 -0
- package/packs/ai-engineering/skills/ai-adoption-rollout/evals/files/2/pilot-report.md +14 -0
- package/packs/ai-engineering/skills/ai-adoption-rollout/evals/files/2/survey-summary.md +7 -0
- package/packs/ai-engineering/skills/ai-adoption-rollout/evals/files/2/union-letter.md +8 -0
- package/packs/ai-engineering/skills/ai-readiness-assessment/evals/evals.json +28 -0
- package/packs/ai-engineering/skills/ai-readiness-assessment/evals/files/2/ceo-note.md +5 -0
- package/packs/ai-engineering/skills/ai-readiness-assessment/evals/files/2/governance-status.md +6 -0
- package/packs/ai-engineering/skills/ai-readiness-assessment/evals/files/2/interview-notes.md +18 -0
- package/packs/ai-engineering/skills/ai-readiness-assessment/evals/files/2/it-inventory.md +12 -0
- package/packs/ai-engineering/skills/ai-usage-report/evals/evals.json +27 -0
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/draftwell-events.csv +249 -0
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/export-note.md +9 -0
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/published-assets.csv +44 -0
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/team-roster.md +10 -0
- package/packs/ai-engineering/skills/ai-use-case-triage/evals/evals.json +27 -0
- package/packs/ai-engineering/skills/ai-use-case-triage/evals/files/2/data-team.md +5 -0
- package/packs/ai-engineering/skills/ai-use-case-triage/evals/files/2/finance-notes.md +7 -0
- package/packs/ai-engineering/skills/ai-use-case-triage/evals/files/2/ideas.csv +10 -0
- package/packs/ai-engineering/skills/ai-use-case-triage/evals/files/2/legal-note.md +7 -0
- package/packs/ai-engineering/skills/llm-eval-harness/evals/evals.json +28 -0
- package/packs/ai-engineering/skills/llm-eval-harness/evals/files/2/current-tests.md +6 -0
- package/packs/ai-engineering/skills/llm-eval-harness/evals/files/2/feature-brief.md +14 -0
- package/packs/ai-engineering/skills/llm-eval-harness/evals/files/2/incident-log.md +8 -0
- package/packs/ai-engineering/skills/llm-eval-harness/evals/files/2/pm-request.md +10 -0
- package/packs/ai-engineering/skills/subagent-design/evals/evals.json +27 -0
- package/packs/ai-engineering/skills/subagent-design/evals/files/3/current-process.md +11 -0
- package/packs/ai-engineering/skills/subagent-design/evals/files/3/director-proposal.md +6 -0
- package/packs/ai-engineering/skills/subagent-design/evals/files/3/scoring-rubric.md +9 -0
- package/packs/ai-engineering/skills/subagent-design/evals/files/3/trial-and-round-notes.md +11 -0
- package/packs/api-builder/skills/eval-harness-generator/evals/evals.json +27 -0
- package/packs/api-builder/skills/eval-harness-generator/evals/files/2/SKILL.md +35 -0
- package/packs/api-builder/skills/prompt-caching-advisor/evals/evals.json +25 -0
- package/packs/api-builder/skills/prompt-caching-advisor/evals/files/2/build_request.py +40 -0
- package/packs/api-builder/skills/prompt-caching-advisor/evals/files/2/notes.md +10 -0
- package/packs/api-builder/skills/token-budget-estimator/evals/evals.json +27 -0
- package/packs/api-builder/skills/token-budget-estimator/evals/files/2/pilot-usage.csv +17 -0
- package/packs/api-builder/skills/token-budget-estimator/evals/files/2/workflow.md +42 -0
- package/packs/career/pack.json +1 -1
- package/packs/career/skills/job-fit-analysis/SKILL.md +2 -1
- package/packs/career/skills/job-fit-analysis/manifest.json +3 -2
- package/packs/career/skills/role-shortlist/SKILL.md +118 -0
- package/packs/career/skills/role-shortlist/evals/eval_queries.json +34 -0
- package/packs/career/skills/role-shortlist/evals/evals.json +105 -0
- package/packs/career/skills/role-shortlist/evals/files/1/careers-index.html +22 -0
- package/packs/career/skills/role-shortlist/evals/files/1/cv.md +44 -0
- package/packs/career/skills/role-shortlist/evals/files/1/postings/clinical-coding-officer-bramwick.md +23 -0
- package/packs/career/skills/role-shortlist/evals/files/1/postings/data-and-performance-analyst.html +28 -0
- package/packs/career/skills/role-shortlist/evals/files/1/postings/estates-maintenance-electrician-bramwick.md +20 -0
- package/packs/career/skills/role-shortlist/evals/files/1/postings/healthcare-support-worker-nights-corrin-bay.md +20 -0
- package/packs/career/skills/role-shortlist/evals/files/1/postings/medical-secretary-cardiology-elsford.html +30 -0
- package/packs/career/skills/role-shortlist/evals/files/1/postings/outpatient-booking-team-leader-bramwick.md +23 -0
- package/packs/career/skills/role-shortlist/evals/files/1/postings/patient-pathway-coordinator-bramwick.md +30 -0
- package/packs/career/skills/role-shortlist/evals/files/1/postings/patient-pathway-coordinator-elsford.md +30 -0
- package/packs/career/skills/role-shortlist/evals/files/1/postings/reception-and-admin-assistant-corrin-bay.md +21 -0
- package/packs/career/skills/role-shortlist/evals/files/1/postings/senior-care-coordinator.md +25 -0
- package/packs/career/skills/role-shortlist/evals/files/2/cv.md +33 -0
- package/packs/career/skills/role-shortlist/evals/files/2/job-board-export.csv +11 -0
- package/packs/career/skills/role-shortlist/evals/files/2/postings/FJ-10422.md +26 -0
- package/packs/career/skills/role-shortlist/evals/files/2/postings/FJ-10431.md +25 -0
- package/packs/career/skills/role-shortlist/evals/files/2/postings/FJ-10455.md +27 -0
- package/packs/career/skills/role-shortlist/evals/files/2/postings/FJ-10468.md +25 -0
- package/packs/career/skills/role-shortlist/evals/files/2/postings/FJ-10476.md +25 -0
- package/packs/career/skills/role-shortlist/evals/files/2/postings/FJ-10490.md +24 -0
- package/packs/career/skills/role-shortlist/evals/files/2/postings/FJ-10587.md +26 -0
- package/packs/career/skills/role-shortlist/evals/files/4/brackwater-careers.html +118 -0
- package/packs/career/skills/role-shortlist/evals/files/4/mere-castell-cv.md +44 -0
- package/packs/career/skills/role-shortlist/evals/files/4/tradesboard-export.csv +6 -0
- package/packs/career/skills/role-shortlist/manifest.json +38 -0
- package/packs/converters/skills/file-to-markdown/evals/evals.json +27 -0
- package/packs/converters/skills/file-to-markdown/evals/files/3/harbourline-shift-policy.docx +0 -0
- package/packs/converters/skills/file-to-markdown/evals/files/4/seed-swap-2026.csv +10 -0
- package/packs/converters/skills/md-to-docx/evals/evals.json +28 -0
- package/packs/converters/skills/md-to-docx/evals/files/3/brand.json +12 -0
- package/packs/converters/skills/md-to-docx/evals/files/3/img/team-photo.png +0 -0
- package/packs/converters/skills/md-to-docx/evals/files/3/tender-response.md +51 -0
- package/packs/converters/skills/md-to-html/evals/evals.json +26 -0
- package/packs/converters/skills/md-to-html/evals/files/2/brand.json +13 -0
- package/packs/converters/skills/md-to-html/evals/files/2/img/kick-net.png +0 -0
- package/packs/converters/skills/md-to-html/evals/files/2/river-survey-guide.md +53 -0
- package/packs/converters/skills/md-to-html/evals/files/3/nanas-lentil-soup.md +21 -0
- package/packs/converters/skills/md-to-html/evals/files/3/pot.png +0 -0
- package/packs/converters/skills/md-to-xlsx/evals/evals.json +26 -0
- package/packs/converters/skills/md-to-xlsx/evals/files/3/depot-costs-q3.md +20 -0
- package/packs/converters/skills/md-to-xlsx/evals/files/4/hollowmere-5k-results.json +7 -0
- package/packs/converters/skills/mermaid-render/evals/evals.json +26 -0
- package/packs/converters/skills/mermaid-render/evals/files/2/dispensing-diagrams.md +39 -0
- package/packs/core/skills/brief-intake/evals/evals.json +27 -0
- package/packs/core/skills/brief-intake/evals/files/2/ops-meeting-notes.md +18 -0
- package/packs/core/skills/brief-intake/evals/files/2/thread.txt +40 -0
- package/packs/core/skills/council-review/evals/evals.json +28 -0
- package/packs/core/skills/council-review/evals/files/2/compliance-note.md +11 -0
- package/packs/core/skills/council-review/evals/files/2/link-outages-q3.csv +11 -0
- package/packs/core/skills/council-review/evals/files/2/proposal.md +39 -0
- package/packs/core/skills/council-review/evals/files/2/vendor-letter.txt +12 -0
- package/packs/core/skills/doc-critique/evals/evals.json +27 -0
- package/packs/core/skills/doc-critique/evals/files/2/exec-summary.md +43 -0
- package/packs/core/skills/output-hygiene/evals/evals.json +27 -0
- package/packs/core/skills/output-hygiene/evals/files/3/newsletter.md +17 -0
- package/packs/data-analytics/skills/dashboard-spec/evals/evals.json +27 -0
- package/packs/data-analytics/skills/dashboard-spec/evals/files/2/data-inventory.md +16 -0
- package/packs/data-analytics/skills/dashboard-spec/evals/files/2/request-email.md +28 -0
- package/packs/data-analytics/skills/sql-review/evals/evals.json +27 -0
- package/packs/data-analytics/skills/sql-review/evals/files/2/context.md +10 -0
- package/packs/data-analytics/skills/sql-review/evals/files/2/monthly_donor_revenue.sql +16 -0
- package/packs/data-analytics/skills/sql-review/evals/files/2/schema.md +20 -0
- package/packs/design/skills/brand-kit/evals/evals.json +26 -0
- package/packs/design/skills/brand-kit/evals/files/2/brand-guidelines.md +32 -0
- package/packs/design/skills/brand-kit/evals/files/2/contact-sheet.txt +6 -0
- package/packs/design/skills/brand-kit/evals/files/2/logo.svg +5 -0
- package/packs/design/skills/brand-kit/evals/files/2/website-colours.css +9 -0
- package/packs/design/skills/brand-kit/evals/files/3/muddy-paws-logo.png +0 -0
- package/packs/design/skills/deck-builder/evals/evals.json +27 -0
- package/packs/design/skills/deck-builder/evals/files/4/ashby-vale-board-notes.md +36 -0
- package/packs/design/skills/marketing-flyer/evals/evals.json +27 -0
- package/packs/design/skills/marketing-flyer/evals/files/2/brand.json +14 -0
- package/packs/design/skills/marketing-flyer/evals/files/2/larchfield-logo.svg +4 -0
- package/packs/design/skills/marketing-flyer/evals/files/2/manager-email.txt +6 -0
- package/packs/design/skills/marketing-flyer/evals/files/2/open-day-brief.md +15 -0
- package/packs/design/skills/slide-outliner/evals/evals.json +26 -0
- package/packs/design/skills/slide-outliner/evals/files/2/uv-dosing-design-notes.md +38 -0
- package/packs/dev-team/skills/accessibility-audit/evals/evals.json +27 -0
- package/packs/dev-team/skills/accessibility-audit/evals/files/2/booking.html +79 -0
- package/packs/dev-team/skills/accessibility-audit/evals/files/2/scan-report.txt +23 -0
- package/packs/dev-team/skills/accessibility-audit/evals/files/2/styles.css +56 -0
- package/packs/dev-team/skills/agents-md-generator/evals/evals.json +27 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/5/.github/workflows/ci.yml +12 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/5/CONTRIBUTING.md +20 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/5/README.md +15 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/5/data/raw/README.md +7 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/5/pyproject.toml +23 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/5/scripts/deploy.sh +6 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/5/src/sensor_ingest/__init__.py +1 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/5/src/sensor_ingest/parse.py +20 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/5/tests/test_gateway.py +10 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/5/tests/test_parse.py +7 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/6/clean_marks.R +5 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/6/grades_final.csv +6 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/6/make_report.R +7 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/6/notes.txt +8 -0
- package/packs/dev-team/skills/agents-md-generator/evals/files/6/raw_marks.csv +6 -0
- package/packs/dev-team/skills/bug-triage/evals/evals.json +27 -0
- package/packs/dev-team/skills/bug-triage/evals/files/2/payments-log.csv +15 -0
- package/packs/dev-team/skills/bug-triage/evals/files/2/slack-thread.txt +16 -0
- package/packs/dev-team/skills/bug-triage/evals/files/2/ticket.txt +10 -0
- package/packs/dev-team/skills/feature-implement-loop/evals/evals.json +27 -0
- package/packs/dev-team/skills/feature-implement-loop/evals/files/2/TICKET.md +20 -0
- package/packs/dev-team/skills/feature-implement-loop/evals/files/2/closures.csv +5 -0
- package/packs/dev-team/skills/feature-implement-loop/evals/files/2/desk.py +11 -0
- package/packs/dev-team/skills/feature-implement-loop/evals/files/2/fees.py +14 -0
- package/packs/dev-team/skills/feature-implement-loop/evals/files/2/tests/test_fees.py +26 -0
- package/packs/dev-team/skills/feature-implement-loop/evals/files/3/away.txt +5 -0
- package/packs/dev-team/skills/feature-implement-loop/evals/files/3/members.txt +8 -0
- package/packs/dev-team/skills/feature-implement-loop/evals/files/3/rota.py +12 -0
- package/packs/dev-team/skills/launch-readiness/evals/evals.json +27 -0
- package/packs/dev-team/skills/launch-readiness/evals/files/2/launch-brief.md +32 -0
- package/packs/dev-team/skills/launch-readiness/evals/files/2/load-test-summary.txt +11 -0
- package/packs/dev-team/skills/launch-readiness/evals/files/2/privacy-signoff.txt +9 -0
- package/packs/dev-team/skills/launch-readiness/evals/files/2/sms-template.txt +2 -0
- package/packs/dev-team/skills/migration-plan/evals/evals.json +27 -0
- package/packs/dev-team/skills/migration-plan/evals/files/2/context.md +27 -0
- package/packs/dev-team/skills/migration-plan/evals/files/2/deferral-codes.csv +8 -0
- package/packs/dev-team/skills/migration-plan/evals/files/2/field-mapping.csv +11 -0
- package/packs/dev-team/skills/migration-plan/evals/files/2/trial-import-summary.txt +9 -0
- package/packs/dev-team/skills/pr-description-writer/evals/evals.json +27 -0
- package/packs/dev-team/skills/pr-description-writer/evals/files/4/changes.diff +64 -0
- package/packs/dev-team/skills/pr-description-writer/evals/files/4/commits.txt +2 -0
- package/packs/dev-team/skills/pre-merge-review/evals/evals.json +28 -0
- package/packs/dev-team/skills/pre-merge-review/evals/files/3/CHANGE.md +12 -0
- package/packs/dev-team/skills/pre-merge-review/evals/files/3/CONTRIBUTING.md +5 -0
- package/packs/dev-team/skills/pre-merge-review/evals/files/3/change.diff +53 -0
- package/packs/dev-team/skills/pre-merge-review/evals/files/3/clinic_dosing/__init__.py +1 -0
- package/packs/dev-team/skills/pre-merge-review/evals/files/3/clinic_dosing/dosing.py +30 -0
- package/packs/dev-team/skills/pre-merge-review/evals/files/3/clinic_dosing/drugs.py +6 -0
- package/packs/dev-team/skills/pre-merge-review/evals/files/3/tests/__init__.py +0 -0
- package/packs/dev-team/skills/pre-merge-review/evals/files/3/tests/test_dosing.py +29 -0
- package/packs/dev-team/skills/sonar-onboard/evals/evals.json +27 -0
- package/packs/dev-team/skills/sonar-onboard/evals/files/2/.github/workflows/ci.yml +10 -0
- package/packs/dev-team/skills/sonar-onboard/evals/files/2/.gitlab-ci.yml +32 -0
- package/packs/dev-team/skills/sonar-onboard/evals/files/2/README.md +11 -0
- package/packs/dev-team/skills/sonar-onboard/evals/files/2/pyproject.toml +16 -0
- package/packs/dev-team/skills/sonar-onboard/evals/files/2/src/wayline/__init__.py +1 -0
- package/packs/dev-team/skills/sonar-onboard/evals/files/2/src/wayline/_generated/__init__.py +0 -0
- package/packs/dev-team/skills/sonar-onboard/evals/files/2/src/wayline/_generated/stops_pb2.py +4 -0
- package/packs/dev-team/skills/sonar-onboard/evals/files/2/src/wayline/timetable.py +12 -0
- package/packs/dev-team/skills/sonar-onboard/evals/files/2/src/wayline/vendor/__init__.py +0 -0
- package/packs/dev-team/skills/sonar-onboard/evals/files/2/src/wayline/vendor/gtfs_lite/__init__.py +3 -0
- package/packs/dev-team/skills/sonar-onboard/evals/files/2/tests/test_timetable.py +14 -0
- package/packs/dev-team/skills/sonar-onboard/evals/files/2/web/package.json +20 -0
- package/packs/dev-team/skills/sonar-onboard/evals/files/2/web/src/board.test.ts +9 -0
- package/packs/dev-team/skills/sonar-onboard/evals/files/2/web/src/board.ts +8 -0
- package/packs/dev-team/skills/sonar-review/evals/evals.json +27 -0
- package/packs/dev-team/skills/sonar-review/evals/files/2/changed-files.txt +5 -0
- package/packs/dev-team/skills/sonar-review/evals/files/2/hotspots.json +7 -0
- package/packs/dev-team/skills/sonar-review/evals/files/2/issues.json +26 -0
- package/packs/dev-team/skills/sonar-review/evals/files/2/quality-gate.json +19 -0
- package/packs/dev-team/skills/tech-debt-register/evals/evals.json +28 -0
- package/packs/dev-team/skills/tech-debt-register/evals/files/4/incidents.csv +7 -0
- package/packs/dev-team/skills/tech-debt-register/evals/files/4/retro-notes.md +21 -0
- package/packs/dev-team/skills/test-plan-generator/evals/evals.json +27 -0
- package/packs/dev-team/skills/test-plan-generator/evals/files/2/permit-renewal-spec.md +40 -0
- package/packs/dev-team/skills/user-story-splitter/evals/evals.json +27 -0
- package/packs/dev-team/skills/user-story-splitter/evals/files/2/prd-shift-swap.md +38 -0
- package/packs/experience-design/skills/content-design/evals/evals.json +27 -0
- package/packs/experience-design/skills/content-design/evals/files/2/contact-centre-notes.md +18 -0
- package/packs/experience-design/skills/content-design/evals/files/2/current-page.md +17 -0
- package/packs/experience-design/skills/content-design/evals/files/2/policy-extract.md +17 -0
- package/packs/experience-design/skills/design-system-spec/evals/evals.json +27 -0
- package/packs/experience-design/skills/design-system-spec/evals/files/2/designer-notes.md +23 -0
- package/packs/experience-design/skills/design-system-spec/evals/files/2/eng-thread.md +11 -0
- package/packs/experience-design/skills/design-system-spec/evals/files/2/tokens.json +27 -0
- package/packs/experience-design/skills/information-architecture/evals/evals.json +27 -0
- package/packs/experience-design/skills/information-architecture/evals/files/2/page-inventory.csv +28 -0
- package/packs/experience-design/skills/information-architecture/evals/files/2/search-log.csv +16 -0
- package/packs/experience-design/skills/information-architecture/evals/files/2/stakeholder-notes.md +13 -0
- package/packs/experience-design/skills/service-blueprint/evals/evals.json +27 -0
- package/packs/experience-design/skills/service-blueprint/evals/files/2/complaints-summary.md +14 -0
- package/packs/experience-design/skills/service-blueprint/evals/files/2/process-notes.md +15 -0
- package/packs/experience-design/skills/service-blueprint/evals/files/2/timings.csv +5 -0
- package/packs/experience-design/skills/ux-writing/evals/evals.json +27 -0
- package/packs/experience-design/skills/ux-writing/evals/files/2/brand-notes.md +8 -0
- package/packs/experience-design/skills/ux-writing/evals/files/2/error-codes.csv +6 -0
- package/packs/experience-design/skills/ux-writing/evals/files/2/screens.md +26 -0
- package/packs/grc/skills/dpia/evals/evals.json +27 -0
- package/packs/grc/skills/dpia/evals/files/2/legal-notes.md +6 -0
- package/packs/grc/skills/dpia/evals/files/2/project-brief.md +17 -0
- package/packs/grc/skills/dpia/evals/files/2/vendor-factsheet.md +8 -0
- package/packs/grc/skills/risk-register/evals/evals.json +27 -0
- package/packs/grc/skills/risk-register/evals/files/2/committee-notes.md +8 -0
- package/packs/grc/skills/risk-register/evals/files/2/risks-draft.csv +9 -0
- package/packs/grc/skills/risk-register/evals/files/2/scoring-scale.md +12 -0
- package/packs/grc/skills/security-questionnaire-response/evals/evals.json +27 -0
- package/packs/grc/skills/security-questionnaire-response/evals/files/4/evidence/business-continuity-plan.md +7 -0
- package/packs/grc/skills/security-questionnaire-response/evals/files/4/evidence/information-security-policy.md +10 -0
- package/packs/grc/skills/security-questionnaire-response/evals/files/4/evidence/pentest-summary-2026.md +10 -0
- package/packs/grc/skills/security-questionnaire-response/evals/files/4/evidence/staff-handbook-extract.md +3 -0
- package/packs/grc/skills/security-questionnaire-response/evals/files/4/instructions.md +10 -0
- package/packs/grc/skills/security-questionnaire-response/evals/files/4/questionnaire.csv +11 -0
- package/packs/grc/skills/soc2-evidence-map/evals/evals.json +27 -0
- package/packs/grc/skills/soc2-evidence-map/evals/files/2/audit-scope.md +10 -0
- package/packs/grc/skills/soc2-evidence-map/evals/files/2/controls.csv +13 -0
- package/packs/grc/skills/soc2-evidence-map/evals/files/2/tooling-notes.md +8 -0
- package/packs/infra-as-code/skills/terraform-module/evals/evals.json +27 -0
- package/packs/infra-as-code/skills/terraform-module/evals/files/3/requirements.md +23 -0
- package/packs/infra-as-code/skills/terraform-plan-review/evals/evals.json +27 -0
- package/packs/infra-as-code/skills/terraform-plan-review/evals/files/3/plan.txt +87 -0
- package/packs/product-manager/skills/business-case/evals/evals.json +27 -0
- package/packs/product-manager/skills/business-case/evals/files/2/hollin_vale_inputs.md +46 -0
- package/packs/product-manager/skills/okr-cascade/evals/evals.json +27 -0
- package/packs/product-manager/skills/okr-cascade/evals/files/3/quillfield_2027.md +45 -0
- package/packs/product-manager/skills/prd-draft/evals/evals.json +27 -0
- package/packs/product-manager/skills/prd-draft/evals/files/2/brief.md +7 -0
- package/packs/product-manager/skills/prd-draft/evals/files/2/call_center_notes.md +7 -0
- package/packs/product-manager/skills/prd-draft/evals/files/2/meter_facts.md +6 -0
- package/packs/product-manager/skills/prfaq/evals/evals.json +26 -0
- package/packs/product-manager/skills/prfaq/evals/files/3/drone_notes.md +25 -0
- package/packs/product-manager/skills/requirements-interview/evals/evals.json +27 -0
- package/packs/product-manager/skills/requirements-interview/evals/files/2/project_brief.md +29 -0
- package/packs/product-manager/skills/strategy-analysis/evals/evals.json +27 -0
- package/packs/product-manager/skills/strategy-analysis/evals/files/4/market_notes.md +21 -0
- package/packs/product-manager/skills/success-metrics/evals/evals.json +28 -0
- package/packs/product-manager/skills/success-metrics/evals/files/3/brief.md +21 -0
- package/packs/product-manager/skills/user-journey-map/evals/evals.json +26 -0
- package/packs/product-manager/skills/user-journey-map/evals/files/3/research_notes.md +30 -0
- package/packs/research/skills/hypothesis-comparison/evals/evals.json +27 -0
- package/packs/research/skills/hypothesis-comparison/evals/files/2/season_notes.md +29 -0
- package/packs/research/skills/research-plan/evals/evals.json +28 -0
- package/packs/research/skills/research-plan/evals/files/3/request.md +19 -0
- package/packs/skill-engineering/skills/skill-author/evals/evals.json +27 -0
- package/packs/skill-engineering/skills/skill-author/evals/files/2/constraints.md +7 -0
- package/packs/skill-engineering/skills/skill-author/evals/files/2/example-discharge.md +22 -0
- package/packs/skill-engineering/skills/skill-author/evals/files/2/process.md +15 -0
- package/packs/skill-engineering/skills/skill-review/evals/evals.json +27 -0
- package/packs/skill-engineering/skills/skill-review/evals/files/2/invoice-chaser/SKILL.md +20 -0
- package/packs/skill-engineering/skills/skill-review/evals/files/2/invoice-chaser/evals/evals.json +12 -0
- package/packs/skill-engineering/skills/skill-review/evals/files/2/invoice-chaser/scripts/send_reminders.py +46 -0
- package/packs/solution-architect/skills/adr-generator/evals/evals.json +27 -0
- package/packs/solution-architect/skills/adr-generator/evals/files/2/integration-notes.md +23 -0
- package/packs/solution-architect/skills/adr-generator/evals/files/2/larchway-quote.txt +10 -0
- package/packs/solution-architect/skills/api-contract-draft/evals/evals.json +27 -0
- package/packs/solution-architect/skills/api-contract-draft/evals/files/2/booking-brief.md +18 -0
- package/packs/solution-architect/skills/api-contract-draft/evals/files/2/facilities-policy-excerpt.md +7 -0
- package/packs/solution-architect/skills/architecture-diagrams/evals/evals.json +27 -0
- package/packs/solution-architect/skills/architecture-diagrams/evals/files/2/telemetry-overview.md +23 -0
- package/packs/solution-architect/skills/data-contract/evals/evals.json +27 -0
- package/packs/solution-architect/skills/data-contract/evals/files/2/grain_deliveries.sql +15 -0
- package/packs/solution-architect/skills/data-contract/evals/files/2/publisher-notes.md +14 -0
- package/packs/solution-architect/skills/data-contract/evals/files/2/sample_rows.csv +6 -0
- package/packs/solution-architect/skills/figma-diagrams/evals/evals.json +26 -0
- package/packs/solution-architect/skills/figma-diagrams/evals/files/2/signage-file.json +373 -0
- package/packs/solution-architect/skills/nfr-spec/evals/evals.json +27 -0
- package/packs/solution-architect/skills/nfr-spec/evals/files/2/vehicle-booking-brief.md +21 -0
- package/packs/solution-architect/skills/reverse-architecture/evals/evals.json +28 -0
- package/packs/solution-architect/skills/reverse-architecture/evals/files/2/README.md +11 -0
- package/packs/solution-architect/skills/reverse-architecture/evals/files/2/docker-compose.yml +42 -0
- package/packs/solution-architect/skills/reverse-architecture/evals/files/2/env.example +3 -0
- package/packs/solution-architect/skills/reverse-architecture/evals/files/2/nginx.conf +15 -0
- package/packs/solution-architect/skills/reverse-architecture/evals/files/2/worker-requirements.txt +4 -0
- package/packs/solution-architect/skills/threat-model/evals/evals.json +28 -0
- package/packs/solution-architect/skills/threat-model/evals/files/2/permits-design.md +23 -0
- package/packs/sre-oncall/skills/capacity-cost-model/evals/evals.json +28 -0
- package/packs/sre-oncall/skills/capacity-cost-model/evals/files/2/brief.md +22 -0
- package/packs/sre-oncall/skills/capacity-cost-model/evals/files/2/price-sheet.md +13 -0
- package/packs/sre-oncall/skills/capacity-cost-model/evals/files/2/rollout-plan.md +27 -0
- package/packs/sre-oncall/skills/cloud-cost-review/evals/evals.json +28 -0
- package/packs/sre-oncall/skills/cloud-cost-review/evals/files/3/cost-export-2026-09.csv +25 -0
- package/packs/sre-oncall/skills/cloud-cost-review/evals/files/3/notes.md +11 -0
- package/packs/sre-oncall/skills/cloud-cost-review/evals/files/3/utilisation-2026-09.csv +12 -0
- package/packs/sre-oncall/skills/delivery-metrics-report/evals/evals.json +27 -0
- package/packs/sre-oncall/skills/delivery-metrics-report/evals/files/3/deploys.csv +68 -0
- package/packs/sre-oncall/skills/delivery-metrics-report/evals/files/3/incidents.csv +7 -0
- package/packs/sre-oncall/skills/delivery-metrics-report/evals/files/3/prs.csv +46 -0
- package/packs/sre-oncall/skills/incident-comms/evals/evals.json +27 -0
- package/packs/sre-oncall/skills/incident-comms/evals/files/2/comms-rules.md +6 -0
- package/packs/sre-oncall/skills/incident-comms/evals/files/2/incident-channel.txt +17 -0
- package/packs/sre-oncall/skills/incident-comms/evals/files/2/last-status-update.md +5 -0
- package/packs/sre-oncall/skills/observability-plan/evals/evals.json +27 -0
- package/packs/sre-oncall/skills/observability-plan/evals/files/2/constraints.md +9 -0
- package/packs/sre-oncall/skills/observability-plan/evals/files/2/current-alerts.csv +10 -0
- package/packs/sre-oncall/skills/observability-plan/evals/files/2/service-overview.md +27 -0
- package/packs/sre-oncall/skills/runbook-generator/evals/evals.json +27 -0
- package/packs/sre-oncall/skills/runbook-generator/evals/files/2/deploy.sh +14 -0
- package/packs/sre-oncall/skills/runbook-generator/evals/files/2/handover-chat.txt +8 -0
- package/packs/sre-oncall/skills/runbook-generator/evals/files/2/service-notes.md +26 -0
- package/packs/sre-oncall/skills/runbook-generator/evals/files/2/standing-order.md +3 -0
- package/packs/stakeholder-comms/skills/audience-profile/evals/evals.json +26 -0
- package/packs/stakeholder-comms/skills/decision-log/evals/evals.json +26 -0
- package/packs/stakeholder-comms/skills/decision-log/evals/files/2/committee-meeting-2026-09-03.txt +23 -0
- package/packs/stakeholder-comms/skills/decision-log/evals/files/2/followup-thread.txt +6 -0
- package/packs/stakeholder-comms/skills/exec-summary/evals/evals.json +26 -0
- package/packs/stakeholder-comms/skills/exec-summary/evals/files/2/library-branches-options-paper.md +67 -0
- package/packs/trackers/skills/backlog-triage/evals/evals.json +27 -0
- package/packs/trackers/skills/backlog-triage/evals/files/3/parks-backlog.csv +19 -0
- package/packs/trackers/skills/team-status-report/evals/evals.json +28 -0
- package/packs/trackers/skills/team-status-report/evals/files/3/larkspur-week-42.csv +15 -0
- package/packs/trackers/skills/tracker-brief-sync/evals/evals.json +28 -0
- package/packs/trackers/skills/tracker-brief-sync/evals/files/3/brief-home-delivery.md +44 -0
|
@@ -14,6 +14,33 @@
|
|
|
14
14
|
"Ends with a 'what's solid' section and a must-verify-with-live-AT checklist",
|
|
15
15
|
"Does not claim a pass on any behavior the markup can't show, and does not invent elements not in the snippet"
|
|
16
16
|
]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": 2,
|
|
20
|
+
"held_out": "2026-10-18",
|
|
21
|
+
"prompt": "I'm on the digital team at Harrowgate District Libraries. Our event booking page is booking.html with styles.css, and our automated scanner's output is scan-report.txt - it says we pass. Before we put a 'WCAG 2.2 AA compliant' badge on the site, please confirm we're compliant. Only the booking form inside <main> is ours; the header and footer belong to the council's central web team, so leave them out. The brand orange #E87722 is fixed by the council style guide and cannot change. We have one front-end developer, so keep it to what she can act on - no more than about two pages.",
|
|
22
|
+
"assertions": [
|
|
23
|
+
"Does not confirm WCAG 2.2 AA compliance or approve the badge; it says the page fails on the issues found and that a scan plus a code review cannot by themselves establish conformance",
|
|
24
|
+
"Catches that the scanner measured the help text against white, but the text sits on the #f2f2f2 panel, where #767676 is about 4.1:1 and fails the 4.5:1 minimum",
|
|
25
|
+
"Finds that white text on the #E87722 button is about 3:1 and fails for 16px normal-weight text, and proposes a fix that keeps the orange (for example dark text on the orange) rather than changing the brand colour",
|
|
26
|
+
"Finds that the ticket stepper built from clickable spans cannot be operated by keyboard or understood by a screen reader, and that the 90-second hold resets the form and redirects with no warning or way to extend it",
|
|
27
|
+
"Keeps to the stated scope: header and footer problems are not reported as findings to fix, and the empty alt on the decorative divider image is not reported as a failure",
|
|
28
|
+
"Does not invent elements, behaviours, or screen-reader test results that are not in the supplied files",
|
|
29
|
+
"The audit is about two pages or less (roughly 1,000 words or fewer)"
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": 3,
|
|
34
|
+
"held_out": "2026-10-18",
|
|
35
|
+
"prompt": "hi, I run a small bakery and my nephew made our website ordering page. a customer who is blind emailed to say she couldn't place an order. he says the order button is this: <div class=\"btn\" onclick=\"placeOrder()\">Order now</div> and the cake photos don't have any descriptions on them. what do I tell him to fix? just a few bullet points in plain English please, I don't know any of the tech words",
|
|
36
|
+
"assertions": [
|
|
37
|
+
"Says the order button needs to be a real button (or have the equivalent role, focus and keyboard handling) because a screen-reader or keyboard user cannot find or press a clickable div",
|
|
38
|
+
"Says the cake photos need short text descriptions (alt text) so a screen reader can describe them",
|
|
39
|
+
"Gives a few plain-English bullet points the owner can pass on, not a long report",
|
|
40
|
+
"Avoids unexplained jargon; any technical term the nephew needs is explained in a few words",
|
|
41
|
+
"Does not claim to have found other specific problems on a page it has not seen, and does not say the rest of the page is fine; at most it suggests testing the whole ordering flow",
|
|
42
|
+
"Delivers the advice without stopping to ask for the page's code first"
|
|
43
|
+
]
|
|
17
44
|
}
|
|
18
45
|
]
|
|
19
46
|
}
|
|
@@ -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)">−</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>© 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,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,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!!
|
|
@@ -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.
|
|
@@ -14,6 +14,33 @@
|
|
|
14
14
|
"Final report has a status (VERIFIED, VERIFIED WITH OPEN ITEMS, or BLOCKED), an acceptance-criteria table mapping each criterion to a test, manual-verify, or open item, an honest round log, and open items",
|
|
15
15
|
"Does not add criteria the user did not give without echoing them back first"
|
|
16
16
|
]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": 2,
|
|
20
|
+
"held_out": "2026-10-18",
|
|
21
|
+
"prompt": "Please implement LIB-88 (TICKET.md) in this repo - the code is fees.py and desk.py, closures.csv holds the closure dates, and the tests are in tests/test_fees.py. Tests run with `python3 -m unittest discover -s tests`. When you're done, give me a short summary: what you built, what you checked, and anything I need to decide.",
|
|
22
|
+
"assertions": [
|
|
23
|
+
"Implements the fee calculation with tests, runs `python3 -m unittest discover -s tests`, and reports the real result; it does not claim tests pass without having run them",
|
|
24
|
+
"Flags that the ticket's worked example is wrong: 8 March is a Sunday and 9 March is a closure day, so 3 chargeable days and $0.75, not $1.25; no test expects $1.25",
|
|
25
|
+
"Notices that the existing MAX_FEE of $15.00 in fees.py conflicts with the ticket's $10.00 cap and says which one it applied",
|
|
26
|
+
"Has tests with specific expected amounts for the junior-card rule, the cap at the lower of replacement cost and $10.00, and the Sunday and closure exclusions",
|
|
27
|
+
"Does not invent a daily rate for magazines; a magazine is rejected or raised as a decision for the user",
|
|
28
|
+
"Uses only the standard library, and the existing tests and desk.checkin still work",
|
|
29
|
+
"The closing summary is short (a few lines plus any decisions needed)"
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": 3,
|
|
34
|
+
"held_out": "2026-10-18",
|
|
35
|
+
"prompt": "hi, I do the tea and setup rota for our community choir with rota.py (members.txt is everyone). can you make it skip people who are away? they're in away.txt, I typed it in a hurry. just make it work and tell me in a couple of lines what you changed, I'm not a programmer",
|
|
36
|
+
"assertions": [
|
|
37
|
+
"After the change, running rota.py puts nobody on a date when away.txt says they are away, even though away.txt uses different capitalisation and extra spaces",
|
|
38
|
+
"Handles or clearly points out that Edith Marsh is back for 5 Dec, rather than silently leaving her off every date or treating '(back for the 5 dec one)' as part of her name",
|
|
39
|
+
"The header line and the name that is not a member (Ruth Ng) cause no error and do not appear in the rota",
|
|
40
|
+
"The script is actually run and the output keeps the same 'date: name & name' format",
|
|
41
|
+
"The reply to the user is a couple of plain-language lines without programming jargon",
|
|
42
|
+
"Does not add features that were not asked for (no new options, dependencies or file formats)"
|
|
43
|
+
]
|
|
17
44
|
}
|
|
18
45
|
]
|
|
19
46
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# LIB-88: Late fees for overdue items
|
|
2
|
+
|
|
3
|
+
As a circulation desk volunteer, I want the system to work out the late fee when an item is
|
|
4
|
+
checked in, so every patron is charged the same way.
|
|
5
|
+
|
|
6
|
+
Constraint: the desk laptops are locked down. Python 3.10, standard library only - nothing can
|
|
7
|
+
be pip-installed.
|
|
8
|
+
|
|
9
|
+
## Acceptance criteria
|
|
10
|
+
|
|
11
|
+
1. Fee = daily rate x chargeable days late. Daily rates: book $0.25, DVD $1.00.
|
|
12
|
+
2. Sundays, and the dates listed in closures.csv, are not chargeable days.
|
|
13
|
+
3. An item returned on or before its due date is charged $0.00.
|
|
14
|
+
4. The fee for one item is capped at its replacement cost or $10.00, whichever is lower.
|
|
15
|
+
5. Patrons with a junior card (card type "junior") are never charged.
|
|
16
|
+
|
|
17
|
+
## Worked example (from the desk)
|
|
18
|
+
|
|
19
|
+
A book due Friday 2026-03-06 and returned Wednesday 2026-03-11 is 5 days late:
|
|
20
|
+
5 x $0.25 = $1.25.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""Check-in handler used by the desk app."""
|
|
2
|
+
from datetime import date
|
|
3
|
+
|
|
4
|
+
from fees import late_fee
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def checkin(item: dict, returned: date | None = None) -> dict:
|
|
8
|
+
"""item has keys: barcode, type, due, replacement_cost, card_type."""
|
|
9
|
+
returned = returned or date.today()
|
|
10
|
+
fee = late_fee(item["type"], item["due"], returned)
|
|
11
|
+
return {"barcode": item["barcode"], "fee": fee}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""Late-fee calculation for the circulation desk."""
|
|
2
|
+
from datetime import date
|
|
3
|
+
|
|
4
|
+
ITEM_TYPES = ("book", "dvd", "magazine")
|
|
5
|
+
|
|
6
|
+
# Policy board minute 2024-07: maximum late fee per item.
|
|
7
|
+
MAX_FEE = 15.00
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def late_fee(item_type: str, due: date, returned: date) -> float:
|
|
11
|
+
"""Return the late fee in dollars for one item."""
|
|
12
|
+
if returned <= due:
|
|
13
|
+
return 0.0
|
|
14
|
+
raise NotImplementedError("LIB-88")
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
import unittest
|
|
4
|
+
from datetime import date
|
|
5
|
+
|
|
6
|
+
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
|
|
7
|
+
|
|
8
|
+
from desk import checkin # noqa: E402
|
|
9
|
+
from fees import late_fee # noqa: E402
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class OnTimeReturns(unittest.TestCase):
|
|
13
|
+
def test_returned_on_due_date_is_free(self):
|
|
14
|
+
self.assertEqual(late_fee("book", date(2026, 3, 6), date(2026, 3, 6)), 0.0)
|
|
15
|
+
|
|
16
|
+
def test_returned_early_is_free(self):
|
|
17
|
+
self.assertEqual(late_fee("dvd", date(2026, 3, 6), date(2026, 3, 1)), 0.0)
|
|
18
|
+
|
|
19
|
+
def test_checkin_on_time(self):
|
|
20
|
+
item = {"barcode": "B100", "type": "book", "due": date(2026, 3, 6),
|
|
21
|
+
"replacement_cost": 18.00, "card_type": "adult"}
|
|
22
|
+
self.assertEqual(checkin(item, date(2026, 3, 6)), {"barcode": "B100", "fee": 0.0})
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
if __name__ == "__main__":
|
|
26
|
+
unittest.main()
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# makes the tea & setup rota for rehearsals
|
|
2
|
+
import itertools
|
|
3
|
+
|
|
4
|
+
DATES = ["7 Nov", "14 Nov", "21 Nov", "28 Nov", "5 Dec"]
|
|
5
|
+
|
|
6
|
+
with open("members.txt") as f:
|
|
7
|
+
members = [line.strip() for line in f if line.strip()]
|
|
8
|
+
|
|
9
|
+
people = itertools.cycle(members)
|
|
10
|
+
for d in DATES:
|
|
11
|
+
a, b = next(people), next(people)
|
|
12
|
+
print(f"{d}: {a} & {b}")
|