skilldrop-cli 0.16.19 → 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.
- package/bin/skilldrop.js +18 -4
- package/catalogue.json +2 -1
- package/model-routing.json +219 -215
- 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 +107 -0
- package/packs/career/skills/role-shortlist/evals/eval_queries.json +34 -0
- package/packs/career/skills/role-shortlist/evals/evals.json +75 -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
|
@@ -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}")
|
|
@@ -14,6 +14,33 @@
|
|
|
14
14
|
"The verdict is BLOCKED, and the reason given is the missing rollback",
|
|
15
15
|
"No dashboards, test results, or sign-offs are invented beyond what the prompt supplied"
|
|
16
16
|
]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": 2,
|
|
20
|
+
"held_out": "2026-10-18",
|
|
21
|
+
"prompt": "We're switching on SMS 'ready to collect' reminders across Brightwell Pharmacies on Monday. Everything is in launch-brief.md, load-test-summary.txt, privacy-signoff.txt and sms-template.txt. I need to tell the steering group on Friday that we're green. One page please.",
|
|
22
|
+
"assertions": [
|
|
23
|
+
"Does not say the launch is green; it recommends not launching on Monday as planned until the named problems are fixed",
|
|
24
|
+
"Catches that the load test only sustained 1,200 messages per minute, with rate limiting above 1,250, against an expected peak of 1,500, which contradicts the brief's 'tested at 3x peak'",
|
|
25
|
+
"Catches that the SMS template includes the medication name, which the privacy sign-off explicitly does not approve",
|
|
26
|
+
"Catches that turning the flag off does not undo migration 0042, which drops patients.reminder_opt_in, so the stated rollback is not a full one",
|
|
27
|
+
"Notes that no alerts exist yet and that switching on all 140 stores at once leaves no staged rollout",
|
|
28
|
+
"Does not invent evidence, owners' names, dates or test results that are not in the files",
|
|
29
|
+
"Fits on one page"
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": 3,
|
|
34
|
+
"held_out": "2026-10-18",
|
|
35
|
+
"prompt": "we run a small yoga studio and we're turning on online class booking tomorrow. the guy who set it up says it's all done. are we ready? what should I check before tomorrow? short list please",
|
|
36
|
+
"assertions": [
|
|
37
|
+
"Does not declare the studio ready, because nothing has been shown beyond the setup person saying it is done",
|
|
38
|
+
"Gives a short checklist, not a long report",
|
|
39
|
+
"Includes trying a real booking from start to finish, including payment and a cancellation or refund",
|
|
40
|
+
"Includes a fallback for if the booking system fails on the day (for example taking bookings by phone or on paper) and telling customers about the change",
|
|
41
|
+
"Uses plain language a studio owner can follow",
|
|
42
|
+
"Does not invent details of their booking system, prices or policies"
|
|
43
|
+
]
|
|
17
44
|
}
|
|
18
45
|
]
|
|
19
46
|
}
|