skilldrop-cli 1.3.0 → 1.4.0
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/README.md +4 -4
- package/catalogue.json +4 -4
- package/model-routing.json +62 -70
- package/package.json +1 -1
- package/packs/ai-engineering/skills/agent-adoption-stage/SKILL.md +0 -1
- package/packs/ai-engineering/skills/agent-adoption-stage/manifest.json +3 -4
- package/packs/ai-engineering/skills/ai-adoption-rollout/SKILL.md +0 -1
- package/packs/ai-engineering/skills/ai-adoption-rollout/manifest.json +3 -4
- package/packs/ai-engineering/skills/ai-readiness-assessment/SKILL.md +0 -1
- package/packs/ai-engineering/skills/ai-readiness-assessment/manifest.json +1 -2
- package/packs/ai-engineering/skills/ai-use-case-triage/manifest.json +3 -3
- package/packs/ai-engineering/skills/judge-audit/SKILL.md +1 -2
- package/packs/ai-engineering/skills/judge-audit/manifest.json +1 -2
- package/packs/ai-engineering/skills/llm-eval-harness/SKILL.md +1 -2
- package/packs/ai-engineering/skills/llm-eval-harness/manifest.json +3 -3
- package/packs/api-builder/skills/tool-use-schema-writer/manifest.json +2 -2
- package/packs/career/loops/apply/evals/evals.json +28 -0
- package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/application-form.md +10 -0
- package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/job-posting.md +33 -0
- package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/resume.md +34 -0
- package/packs/career/loops/apply/evals/files/apply-fit-gate-hard-requirement/cv.md +27 -0
- package/packs/career/loops/apply/evals/files/apply-fit-gate-hard-requirement/warehouse-supervisor.md +30 -0
- package/packs/career/skills/application-form-answers/manifest.json +3 -3
- package/packs/career/skills/cover-letter/manifest.json +3 -3
- package/packs/career/skills/resume-tailor/manifest.json +3 -3
- package/packs/converters/skills/md-to-docx/manifest.json +3 -3
- package/packs/core/loops/ship-a-draft/evals/evals.json +28 -0
- package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-adr-from-thread/slack-thread.txt +47 -0
- package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-announcement-unsettled/ticket-PRD-412.md +44 -0
- package/packs/core/skills/output-hygiene/manifest.json +3 -3
- package/packs/data-analytics/loops/measure/evals/evals.json +30 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/schema.md +43 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/sql/finance_active_customers.sql +7 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/sql/growth_active_customers.sql +9 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/thread.md +30 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/request.md +34 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/schema.md +58 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/active_subscribers.sql +17 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/net_revenue_by_plan.sql +15 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/weekly_churn_rate.sql +34 -0
- package/packs/data-analytics/skills/dashboard-spec/SKILL.md +0 -1
- package/packs/data-analytics/skills/dashboard-spec/manifest.json +1 -2
- package/packs/design/skills/slide-outliner/manifest.json +2 -2
- package/packs/dev-team/loops/build/evals/evals.json +28 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/.github/workflows/ci.yml.fixture +19 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/cartcalc/__init__.py +4 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/cartcalc/pricing.py +47 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/pyproject.toml.fixture +9 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/story.md +61 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/tests/__init__.py +0 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/tests/test_pricing.py +49 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/.github/workflows/ci.yml.fixture +19 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/bug-report.md +25 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/pr-description.md +42 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/pyproject.toml.fixture +9 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/ratelimit/__init__.py +4 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/ratelimit/bucket.py +49 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/tests/__init__.py +0 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/tests/test_bucket.py +63 -0
- package/packs/dev-team/loops/modernize/evals/evals.json +30 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/.github/workflows/ci.yml.fixture +11 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/README.md +17 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/docs/adr/0004-late-fee-calculation.md +25 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/legacy/feecalc.py +74 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/samples/accounts_2026-10.txt +10 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/samples/accounts_edge.txt +11 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/tests/test_feecalc_smoke.py +21 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/.github/workflows/ci.yml.fixture +11 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/PR-412.md +24 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/README.md +17 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/docs/adr/0004-late-fee-calculation.md +25 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/__init__.py +1 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/cli.py +33 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/extract.py +33 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/rules.py +39 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/legacy/feecalc.py +74 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/samples/accounts_2026-10.txt +10 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/samples/accounts_edge.txt +11 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/tests/test_feecalc_smoke.py +21 -0
- package/packs/dev-team/loops/release/evals/eval_queries.json +10 -0
- package/packs/dev-team/loops/release/evals/evals.json +34 -0
- package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/0061_switch_to_haldrin_tokens.sql +22 -0
- package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/eng-notes.md +40 -0
- package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/merged-prs.md +13 -0
- package/packs/dev-team/loops/release/evals/files/release-saved-searches/merged-prs.md +13 -0
- package/packs/dev-team/loops/release/evals/files/release-saved-searches/readiness-evidence.md +27 -0
- package/packs/dev-team/loops/release/evals/files/release-saved-searches/traffic-baseline.md +23 -0
- package/packs/dev-team/skills/feature-implement-loop/manifest.json +2 -2
- package/packs/dev-team/skills/pr-description-writer/manifest.json +3 -3
- package/packs/dev-team/skills/pre-merge-review/manifest.json +2 -2
- package/packs/dev-team/skills/release-notes/manifest.json +2 -2
- package/packs/dev-team/skills/test-plan-generator/manifest.json +2 -2
- package/packs/experience-design/skills/service-blueprint/manifest.json +3 -3
- package/packs/experience-design/skills/ux-writing/manifest.json +3 -3
- package/packs/grc/loops/comply/evals/evals.json +29 -0
- package/packs/grc/loops/comply/evals/files/comply-chat-vendor-launch/vendor-brief.md +72 -0
- package/packs/grc/loops/comply/evals/files/comply-loyalty-app-unowned-risks/launch-note.md +31 -0
- package/packs/grc/loops/comply/evals/files/comply-loyalty-app-unowned-risks/risk-register.csv +6 -0
- package/packs/infra-as-code/skills/terraform-module/manifest.json +3 -3
- package/packs/product-manager/loops/discover/evals/evals.json +28 -0
- package/packs/product-manager/loops/discover/evals/files/discover-no-show-signal/interview-notes.md +63 -0
- package/packs/product-manager/loops/discover/evals/files/discover-no-show-signal/support-tickets.csv +13 -0
- package/packs/product-manager/loops/discover/evals/files/discover-vp-loyalty-no-evidence/vp-message.txt +13 -0
- package/packs/product-manager/skills/user-journey-map/manifest.json +2 -2
- package/packs/research/loops/research/evals/evals.json +28 -0
- package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t1-ticket-volume.md +15 -0
- package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t2-release-notes-4-2.md +11 -0
- package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t3-billing-migration.md +12 -0
- package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t4-agent-poll.md +11 -0
- package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t5-app-store-reviews.md +12 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s1-analytics-export.md +29 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s2-email-delivery-report.md +25 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s3-pricing-changelog.md +9 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s4-trial-interview-notes.md +21 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s5-competitor-note.md +9 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s6-weekly-growth-recap.md +7 -0
- package/packs/research/skills/research-plan/manifest.json +3 -3
- package/packs/research/skills/source-synthesis/manifest.json +3 -3
- package/packs/skill-engineering/skills/skill-author/manifest.json +3 -3
- package/packs/solution-architect/loops/design/evals/evals.json +28 -0
- package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0001-postgres-system-of-record.md +23 -0
- package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0002-background-work-via-job-queue.md +23 -0
- package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0003-tenant-isolation-row-level.md +25 -0
- package/packs/solution-architect/loops/design/evals/files/design-bulk-export/prd-bulk-export.md +50 -0
- package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/adr/0002-background-work-via-job-queue.md +23 -0
- package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/adr/0004-new-stateful-infra-needs-platform-signoff.md +22 -0
- package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/prd-partner-webhooks.md +36 -0
- package/packs/solution-architect/skills/api-contract-draft/manifest.json +3 -3
- package/packs/solution-architect/skills/architecture-diagrams/manifest.json +3 -3
- package/packs/solution-architect/skills/design-doc/manifest.json +2 -2
- package/packs/solution-architect/skills/figma-diagrams/manifest.json +3 -3
- package/packs/sre-oncall/loops/operate/evals/evals.json +28 -0
- package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/alerts.log +22 -0
- package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/incident-chat.txt +27 -0
- package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/service-notes.md +46 -0
- package/packs/sre-oncall/loops/operate/evals/files/operate-incident-still-open/oncall-log.txt +17 -0
- package/packs/sre-oncall/loops/operate/evals/files/operate-incident-still-open/runbook-webhooks.md +38 -0
- package/packs/sre-oncall/skills/cloud-cost-review/SKILL.md +0 -1
- package/packs/sre-oncall/skills/cloud-cost-review/manifest.json +1 -2
- package/packs/sre-oncall/skills/delivery-metrics-report/SKILL.md +0 -1
- package/packs/sre-oncall/skills/delivery-metrics-report/manifest.json +1 -2
- package/packs/sre-oncall/skills/incident-comms/manifest.json +2 -2
- package/packs/sre-oncall/skills/postmortem-generator/manifest.json +2 -2
- package/packs/stakeholder-comms/skills/decision-log/manifest.json +2 -2
- package/packs/trackers/skills/team-status-report/manifest.json +3 -3
- package/packs/ai-engineering/skills/ai-usage-report/SKILL.md +0 -111
- package/packs/ai-engineering/skills/ai-usage-report/evals/eval_queries.json +0 -30
- package/packs/ai-engineering/skills/ai-usage-report/evals/evals.json +0 -46
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/1/northwind-ai-events.csv +0 -4213
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/draftwell-events.csv +0 -249
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/export-note.md +0 -9
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/published-assets.csv +0 -44
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/team-roster.md +0 -10
- package/packs/ai-engineering/skills/ai-usage-report/examples/weekly-engineering-team.md +0 -133
- package/packs/ai-engineering/skills/ai-usage-report/manifest.json +0 -12
- package/packs/ai-engineering/skills/ai-usage-report/scripts/build_report.py +0 -453
- package/packs/ai-engineering/skills/ai-usage-report/templates/report-per-user.md +0 -42
- package/packs/ai-engineering/skills/ai-usage-report/templates/report-team-rollup.md +0 -49
- package/packs/ai-engineering/skills/ai-usage-report/templates/usage-event-schema.md +0 -76
- package/packs/product-manager/skills/lean-canvas/SKILL.md +0 -162
- package/packs/product-manager/skills/lean-canvas/evals/eval_queries.json +0 -42
- package/packs/product-manager/skills/lean-canvas/evals/evals.json +0 -82
- package/packs/product-manager/skills/lean-canvas/evals/files/1/pawpass-notes.md +0 -54
- package/packs/product-manager/skills/lean-canvas/evals/files/3/lunchloop-pitch.md +0 -30
- package/packs/product-manager/skills/lean-canvas/evals/files/4/clubkit-notes.md +0 -44
- package/packs/product-manager/skills/lean-canvas/evals/files/5/cost-model.csv +0 -5
- package/packs/product-manager/skills/lean-canvas/evals/files/5/proposal.md +0 -40
- package/packs/product-manager/skills/lean-canvas/evals/files/5/stakeholder-emails.txt +0 -18
- package/packs/product-manager/skills/lean-canvas/examples/bike-repair.md +0 -72
- package/packs/product-manager/skills/lean-canvas/manifest.json +0 -34
- package/packs/product-manager/skills/lean-canvas/reference.md +0 -102
- package/packs/product-manager/skills/lean-canvas/scripts/unit_economics.py +0 -211
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tool-use-schema-writer",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Takes a function description (name, purpose, parameters) and writes a valid Anthropic tool_use JSON schema, with type annotations, required fields, and a description for each parameter. Adds a Python client.messages.create(tools=[...]) snippet only when asked. Use when wiring a Claude agent to a function or API, designing tools for a multi-agent system, or documenting an existing tool for agent consumption.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
7
7
|
"env": { "required": [], "optional": [] },
|
|
8
8
|
"related": ["agent-loop-design", "subagent-design"],
|
|
9
9
|
"tags": ["claude-api", "tool-use", "json-schema", "sdk", "agents"],
|
|
10
|
-
"model": { "tier": "
|
|
10
|
+
"model": { "tier": "light", "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 94% and 94% of checks in two tier trials, against standard's 96% and heavy's 97% and 97%, within 5 points of the best both times." }
|
|
11
11
|
}
|
|
@@ -22,6 +22,34 @@
|
|
|
22
22
|
"Stops at G6.1 and asks the candidate to confirm every line is true; does not submit or send anything",
|
|
23
23
|
"Lists what the posting asks for that neither document claims"
|
|
24
24
|
]
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "apply-candidate-decided-full-run",
|
|
28
|
+
"held_out": "2026-11-04",
|
|
29
|
+
"prompt": "Help me apply for this CSM job at Quindle. The posting is job-posting.md, my CV is resume.md and the form questions are in application-form.md. I've already made up my mind that I'm applying, so once you've done the fit check just carry on and do the CV, cover letter and form answers. Closing date is Friday.",
|
|
30
|
+
"assertions": [
|
|
31
|
+
"The fit check comes first, before any CV or letter text, with each requirement marked met, partly met, not shown or not met and the resume line it rests on",
|
|
32
|
+
"Takes the candidate's stated decision to apply as the G6 decision and carries on through the tailored CV, cover letter and form answers in that order, rather than stopping to ask again",
|
|
33
|
+
"The tailored CV keeps every employer, title, date and number as in resume.md (42 accounts, £1.3M ARR, 94% retention, 15 QBR accounts, 3 saved accounts, 11 onboardings) and reports healthcare or regulated-industry experience as something it cannot claim",
|
|
34
|
+
"The cover letter is under a page, opens on the strongest evidence for the role, and adds no enthusiasm or facts about Quindle beyond the posting",
|
|
35
|
+
"Form answers follow the form's order, draft questions 1 to 4 from resume lines, and leave right to work, salary, notice period and equal-opportunities monitoring for the candidate to answer",
|
|
36
|
+
"Ends at the G6.1 confirm gate with the claims the candidate must check are true, and does not call the application ready to send before they confirm",
|
|
37
|
+
"Does not invent experience, figures or qualifications not in resume.md, such as healthcare work, a SQL certification or a notice period"
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "apply-fit-gate-hard-requirement",
|
|
42
|
+
"held_out": "2026-11-04",
|
|
43
|
+
"prompt": "help me apply for this, closes sunday. the job is warehouse-supervisor.md and my cv is cv.md. need a cover letter and the cv sorted",
|
|
44
|
+
"assertions": [
|
|
45
|
+
"Runs the fit check first, with each requirement marked and the CV line it rests on",
|
|
46
|
+
"Puts the counterbalance and reach truck licences first as an essential requirement the CV does not show (it mentions only a manual pallet truck), with WMS experience not shown and warehouse or DC supervision partly met at best",
|
|
47
|
+
"Credits what the CV does show: teams of up to 14, leading the Thursday 22:00-06:00 replenishment crew of 6, return-to-work interviews, and the First Aid at Work certificate",
|
|
48
|
+
"Names the answers that would change the picture, such as whether the candidate holds or is booking the truck licences and whether they can work 4-on-4-off nights",
|
|
49
|
+
"Stops at the G6 gate for the candidate to decide whether to apply now that they have seen the fit check, and does not produce a tailored CV or cover letter in this run",
|
|
50
|
+
"Leaves the apply decision to the candidate rather than deciding it for them either way",
|
|
51
|
+
"Does not invent a forklift licence, warehouse experience, a named WMS or night-pattern availability not in cv.md"
|
|
52
|
+
]
|
|
25
53
|
}
|
|
26
54
|
]
|
|
27
55
|
}
|
package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/application-form.md
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Quindle — application form: Customer Success Manager, Mid-Market
|
|
2
|
+
|
|
3
|
+
1. Why are you interested in this role? (max 150 words)
|
|
4
|
+
2. Tell us about a time you kept a customer who was at risk of leaving. What did you do, and what happened? (max 200 words)
|
|
5
|
+
3. How many accounts do you currently manage, and what is their total value?
|
|
6
|
+
4. Do you have experience in healthcare or another regulated industry? If yes, please describe.
|
|
7
|
+
5. Do you have the right to work in the UK? (Yes / No / I will need sponsorship)
|
|
8
|
+
6. What are your salary expectations?
|
|
9
|
+
7. What is your notice period?
|
|
10
|
+
8. Equal opportunities monitoring (optional): gender, ethnicity, disability.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Customer Success Manager, Mid-Market — Quindle
|
|
2
|
+
|
|
3
|
+
Remote (UK) · Full time · Closing date: Friday 6 November 2026
|
|
4
|
+
Apply at careers.quindle.example/jobs/csm-mm
|
|
5
|
+
|
|
6
|
+
## About the role
|
|
7
|
+
|
|
8
|
+
Quindle makes scheduling and records software for private clinics. You'll own a book of mid-market clinic groups after they go live, keep them renewing, and find room for them to grow with us. You'll report to the Head of Customer Success.
|
|
9
|
+
|
|
10
|
+
## What you'll do
|
|
11
|
+
|
|
12
|
+
- Own a portfolio of around 35 mid-market accounts
|
|
13
|
+
- Run quarterly business reviews with clinic managers and owners
|
|
14
|
+
- Spot at-risk accounts early from usage and health data, and build save plans
|
|
15
|
+
- Own renewals and work with Sales on expansion
|
|
16
|
+
- Feed customer needs back to Product
|
|
17
|
+
|
|
18
|
+
## What we're looking for
|
|
19
|
+
|
|
20
|
+
**Essential**
|
|
21
|
+
- 4+ years in a customer-facing role at a software or subscription business, including at least 2 years managing a book of accounts
|
|
22
|
+
- Track record on retention or renewals, with numbers to show it
|
|
23
|
+
- Experience running business reviews with senior customer stakeholders
|
|
24
|
+
- Comfortable working day to day in a CRM
|
|
25
|
+
|
|
26
|
+
**Nice to have**
|
|
27
|
+
- Experience in healthcare or another regulated industry
|
|
28
|
+
- Basic SQL or confidence pulling your own data
|
|
29
|
+
- Experience onboarding new customers
|
|
30
|
+
|
|
31
|
+
## What we offer
|
|
32
|
+
|
|
33
|
+
Salary £42,000–£50,000, 25 days holiday plus bank holidays, home office budget.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Sam Okonedo
|
|
2
|
+
|
|
3
|
+
sam.okonedo@example.com · 07700 900123 · Bristol
|
|
4
|
+
|
|
5
|
+
## Experience
|
|
6
|
+
|
|
7
|
+
**Account Manager — Brindle Payroll Ltd** · March 2021 – present
|
|
8
|
+
Payroll software for small and mid-sized businesses.
|
|
9
|
+
- Manage a book of 42 SMB and mid-market accounts worth £1.3M in annual recurring revenue
|
|
10
|
+
- Gross revenue retention of 94% across my book in 2024 (team average 89%)
|
|
11
|
+
- Run quarterly business reviews with finance directors and owners for my 15 largest accounts
|
|
12
|
+
- Turned around 3 accounts flagged red on our health score in 2025; all 3 renewed
|
|
13
|
+
- Led onboarding for 11 new clients after the onboarding specialist role was cut in 2023
|
|
14
|
+
- Keep all account notes, renewals and tasks in the team CRM
|
|
15
|
+
|
|
16
|
+
**Customer Support Team Lead — Marrow Telecom** · June 2018 – February 2021
|
|
17
|
+
Business broadband and phone lines.
|
|
18
|
+
- Led a team of 6 support agents handling business customer queries by phone, chat and email
|
|
19
|
+
- Team CSAT of 4.6 out of 5 over 2020
|
|
20
|
+
- Wrote the team's escalation guide, still in use when I left
|
|
21
|
+
|
|
22
|
+
**Customer Support Agent — Marrow Telecom** · September 2016 – May 2018
|
|
23
|
+
|
|
24
|
+
## Education
|
|
25
|
+
|
|
26
|
+
BA (Hons) Business Management, Harbourside University (2016)
|
|
27
|
+
|
|
28
|
+
## Training
|
|
29
|
+
|
|
30
|
+
- Introduction to SQL (online course, 2023)
|
|
31
|
+
|
|
32
|
+
## Skills
|
|
33
|
+
|
|
34
|
+
CRM administration, Excel (pivot tables, lookups), presenting to senior stakeholders
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Lee Farrant
|
|
2
|
+
|
|
3
|
+
lee.farrant@example.com · 07700 900456 · Northampton
|
|
4
|
+
|
|
5
|
+
## Profile
|
|
6
|
+
|
|
7
|
+
Retail shift manager with six years running teams on early, late and night shifts in a large supermarket.
|
|
8
|
+
|
|
9
|
+
## Experience
|
|
10
|
+
|
|
11
|
+
**Shift Manager — Hollinsby Foods, Northampton superstore** · April 2020 – present
|
|
12
|
+
- Run early and late shifts with teams of up to 14 colleagues across grocery, chilled and checkouts
|
|
13
|
+
- Lead the Thursday night replenishment crew (6 colleagues, 22:00–06:00) receiving and putting away the overnight delivery
|
|
14
|
+
- Store stock accuracy of 98.7% at the 2025 annual stock count
|
|
15
|
+
- Do the rota for the grocery department (around 30 colleagues)
|
|
16
|
+
- Carry out return-to-work interviews and first-stage disciplinary meetings
|
|
17
|
+
- Use the store's handheld stock system for gap checks, deliveries and stock counts
|
|
18
|
+
- Move cages and pallets on the shop floor with a manual pallet truck
|
|
19
|
+
|
|
20
|
+
**Customer Assistant — Hollinsby Foods** · August 2017 – March 2020
|
|
21
|
+
- Night replenishment, then checkouts and customer service desk
|
|
22
|
+
|
|
23
|
+
## Qualifications
|
|
24
|
+
|
|
25
|
+
- First Aid at Work certificate (2024)
|
|
26
|
+
- Food Hygiene Level 2
|
|
27
|
+
- GCSEs including English and Maths
|
package/packs/career/loops/apply/evals/files/apply-fit-gate-hard-requirement/warehouse-supervisor.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Night Shift Warehouse Supervisor — Pellbrook Distribution
|
|
2
|
+
|
|
3
|
+
Ambient distribution centre, Daventry area · Permanent · £34,500 plus night allowance
|
|
4
|
+
Closing date: Sunday 8 November 2026 · jobs.pellbrook.example/night-supervisor
|
|
5
|
+
|
|
6
|
+
## The role
|
|
7
|
+
|
|
8
|
+
You'll run the night shift at our ambient distribution centre, leading a team of around 20 pickers, loaders and forklift drivers so that store orders leave on time and accurately.
|
|
9
|
+
|
|
10
|
+
Shift pattern: 4 nights on, 4 nights off, 22:00–06:00.
|
|
11
|
+
|
|
12
|
+
## Responsibilities
|
|
13
|
+
|
|
14
|
+
- Plan and allocate labour across picking, loading and goods-in for the shift
|
|
15
|
+
- Hit dispatch and pick-accuracy targets
|
|
16
|
+
- Run shift briefings, toolbox talks and return-to-work interviews
|
|
17
|
+
- Carry out and record safety checks, and lead incident investigations on shift
|
|
18
|
+
- Cover forklift operation when the shift is short
|
|
19
|
+
|
|
20
|
+
## Requirements
|
|
21
|
+
|
|
22
|
+
**Essential**
|
|
23
|
+
- Current counterbalance and reach truck licences (certificates will be checked at interview)
|
|
24
|
+
- At least 2 years supervising a team in a warehouse or distribution centre
|
|
25
|
+
- Able to work the 4-on-4-off night pattern
|
|
26
|
+
- Experience using a warehouse management system (WMS)
|
|
27
|
+
|
|
28
|
+
**Desirable**
|
|
29
|
+
- First Aid at Work certificate
|
|
30
|
+
- IOSH Managing Safely or equivalent
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "application-form-answers",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Prepare the answers to a job application form from the person's resume: each question in the form's own order with either a drafted answer and the resume line behind it, or a note that it is theirs alone to answer (right to work, sponsorship, salary, declarations, monitoring questions), plus the questions that could screen the application out and the ones their resume already bears on. Works for any occupation. Use when the user says \"help me fill in this application form\", \"answer these application questions\", \"what do I put for these screening questions\", or pastes the questions from an online job application.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"job-search"
|
|
26
26
|
],
|
|
27
27
|
"model": {
|
|
28
|
-
"tier": "
|
|
29
|
-
"rationale": "
|
|
28
|
+
"tier": "light",
|
|
29
|
+
"rationale": "Measured (RFC-0073): on its held-out evals the light tier met 88% and 94% of checks in two tier trials, against standard's 88% and heavy's 81% and 81%, within 5 points of the best both times."
|
|
30
30
|
}
|
|
31
31
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cover-letter",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Write a cover letter for one job from the person's resume and the posting: under a page, opening on the strongest evidence for the role, two or three specifics matched to what the employer asked for, and no enthusiasm, company facts or experience the person didn't supply. A script lists every figure and name in the letter that their own material doesn't contain. Works for any occupation and level. Use when the user says \"write a cover letter for this job\", \"draft a covering letter\", \"write the cover note for my application\", or needs an application email to go with a resume.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"notes": "Reads the draft, source and posting files it is given. Writes nothing."
|
|
32
32
|
},
|
|
33
33
|
"model": {
|
|
34
|
-
"tier": "
|
|
35
|
-
"rationale": "
|
|
34
|
+
"tier": "light",
|
|
35
|
+
"rationale": "Measured (RFC-0073): on its held-out evals the light tier met 100% and 100% of checks in two tier trials, against standard's 100% and heavy's 100% and 100%, within 5 points of the best both times."
|
|
36
36
|
}
|
|
37
37
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "resume-tailor",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Tailor a resume or CV to one job posting without adding anything that isn't true: reorder, cut and reword what the person has already done so the posting's needs are answered first, keep every employer, title, date and number as it was, and report what the posting asks for that the resume cannot claim. A script lists every figure and name in the draft that the original doesn't contain. Works for any occupation and level. Use when the user says \"tailor my resume for this job\", \"adapt my CV to this posting\", \"rewrite my resume for this role\", or pastes a job description next to their resume.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"notes": "Reads the draft, source and posting files it is given. Writes nothing."
|
|
32
32
|
},
|
|
33
33
|
"model": {
|
|
34
|
-
"tier": "
|
|
35
|
-
"rationale": "
|
|
34
|
+
"tier": "light",
|
|
35
|
+
"rationale": "Measured (RFC-0073): on its held-out evals the light tier met 100% and 100% of checks in two tier trials, against standard's 100% and heavy's 100% and 100%, within 5 points of the best both times."
|
|
36
36
|
}
|
|
37
37
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "md-to-docx",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Turn a Markdown draft into a Word document (.docx) that someone outside engineering can open, edit and track changes in, with real Heading styles so the navigation pane and table of contents work, live hyperlinks, numbered and bulleted lists, tables, code blocks, embedded images and optional brand fonts and colours, and a warning for everything that could not be carried over. Use when the user wants a Markdown file as a Word doc, says \"send this as a .docx\", \"convert to Word\", \"legal needs it in Word\", or \"make this editable for the client\".",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
],
|
|
40
40
|
"permissions": {"network": [], "commands": [], "files": "named-paths"},
|
|
41
41
|
"model": {
|
|
42
|
-
"tier": "
|
|
43
|
-
"rationale": "
|
|
42
|
+
"tier": "heavy",
|
|
43
|
+
"rationale": "Measured (RFC-0073): on its held-out evals the heavy tier met 79% and 93% of checks in two tier trials, against standard's 64% and light's 71% and 79%, more than 5 points ahead both times."
|
|
44
44
|
}
|
|
45
45
|
}
|
|
@@ -20,6 +20,34 @@
|
|
|
20
20
|
"Explains that re-drafting from the same incomplete brief reproduces the same gaps",
|
|
21
21
|
"Does not run output-hygiene on a draft that is about to be rewritten"
|
|
22
22
|
]
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "ship-a-draft-adr-from-thread",
|
|
26
|
+
"held_out": "2026-11-04",
|
|
27
|
+
"prompt": "Can you turn this Slack thread (slack-thread.txt) into a proper ADR for moving the nightly statements job? It goes to the architecture review group on Thursday and I want it finished and ready to send, not a first draft I have to fix up.",
|
|
28
|
+
"assertions": [
|
|
29
|
+
"Produces a structured intake brief from the thread before drafting, and the ADR is written from that brief",
|
|
30
|
+
"The month-end queue capacity question Marta raised is carried into the brief and the ADR as open or a risk, not as settled",
|
|
31
|
+
"The ADR records option B as the decision, option A as rejected because it does not fix the 3h40m runtime, and option C as rejected for lack of approved budget, and keeps the unchanged statement file format and idempotent retries as requirements",
|
|
32
|
+
"After drafting, the ADR is critiqued with findings tied to sections and a G5 verdict in the critique's own terms (such as SHIP IT, SHIP WITH CHANGES or MAJOR REWRITE)",
|
|
33
|
+
"Any changes the critique calls for are made before the polish pass, and the polish pass runs last, on the revised ADR",
|
|
34
|
+
"The final ADR carries none of the thread's machine residue: no 'Generated with ExampleAI' or 'Summarised by ExampleBot' line and no 'Hope this helps' closer",
|
|
35
|
+
"Does not invent figures, dates or owners not in the thread, such as a queue capacity number, a migration date or a deadline for Marta's check"
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "ship-a-draft-announcement-unsettled",
|
|
40
|
+
"held_out": "2026-11-04",
|
|
41
|
+
"prompt": "Need the customer announcement email for scheduled exports, to go to Team plan admins. Everything's in the ticket (ticket-PRD-412.md). Marketing want final copy today so please give me something finished I can just hand over.",
|
|
42
|
+
"assertions": [
|
|
43
|
+
"The intake brief, written before any drafting, flags the launch date, the price, and whether SFTP delivery is in as unsettled in the ticket",
|
|
44
|
+
"The draft leaves those three as clearly marked placeholders or open items instead of picking a value",
|
|
45
|
+
"The critique gate does not return SHIP IT; its verdict holds the email back (such as SHIP WITH CHANGES or MAJOR REWRITE) and names the unsettled date, price and scope as the reason",
|
|
46
|
+
"Tells the user plainly that the email is not ready to go to customers, and who in the ticket has to settle each item: Hannah and Oskar on SFTP scope and date, finance (Gwen, after the 10 November pricing committee) on price",
|
|
47
|
+
"If the polish pass runs, the placeholders survive it, and the reply does not present the email as final copy",
|
|
48
|
+
"Does not stop to ask questions; the brief, draft and critique are delivered in this run",
|
|
49
|
+
"Does not invent a launch date, price or feature scope the ticket has not settled, such as stating 12 November, 26 November or $15 a month as fact"
|
|
50
|
+
]
|
|
23
51
|
}
|
|
24
52
|
]
|
|
25
53
|
}
|
package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-adr-from-thread/slack-thread.txt
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#reporting-eng — thread started by Priya Raman, Mon 2 Nov 2026
|
|
2
|
+
|
|
3
|
+
Priya Raman 10:12
|
|
4
|
+
ok we need to stop pretending the nightly statements job is fine. it failed again on the 22nd. that's twice in October (9th and 22nd), both times because reports-01 got rebooted for patching mid-run and the cron job just died. ~1,900 customers didn't get their statement until we reran it by hand at 10am
|
|
5
|
+
|
|
6
|
+
Tom Lindqvist 10:15
|
|
7
|
+
and it's getting slower. last night's run was 3h40m. the window is 01:00 to 06:00 UTC because the finance team pulls the statements at 06:30. at the rate customer count is growing we're going to blow the window sometime next year
|
|
8
|
+
|
|
9
|
+
Marta Szabo 10:21
|
|
10
|
+
options I can see:
|
|
11
|
+
A) keep cron on reports-01, add a second box with a lock so only one runs, plus retry on failure
|
|
12
|
+
B) move it onto the job queue we already run for the email service. one job per customer, workers pick them up, failed ones retry on their own
|
|
13
|
+
C) use the cloud provider's managed scheduler + functions
|
|
14
|
+
|
|
15
|
+
Tom Lindqvist 10:24
|
|
16
|
+
C is nice but there's no budget approved for it this year, I asked in September and got a no. not worth writing up as anything but rejected
|
|
17
|
+
|
|
18
|
+
Priya Raman 10:26
|
|
19
|
+
A fixes the reboot problem but not the runtime. it's still one process doing 3h40m of work
|
|
20
|
+
|
|
21
|
+
Tom Lindqvist 10:30
|
|
22
|
+
B gets us both. per-customer jobs means a reboot only kills the in-flight ones and they get retried, and we can add workers if we're getting close to the window
|
|
23
|
+
|
|
24
|
+
Marta Szabo 10:33
|
|
25
|
+
I'm fine with B in principle. my worry is month-end. the email service hammers the same queue on the 1st of every month (invoice emails). if statements and invoice emails land on the same night, does the queue keep up? I don't actually know its capacity
|
|
26
|
+
|
|
27
|
+
Priya Raman 10:35
|
|
28
|
+
can you find out?
|
|
29
|
+
|
|
30
|
+
Marta Szabo 10:36
|
|
31
|
+
I'll check with platform
|
|
32
|
+
|
|
33
|
+
Jonas Weber 10:52
|
|
34
|
+
dropping in the AI summary of the thread from the meeting notes bot, in case it helps:
|
|
35
|
+
|
|
36
|
+
> **Summary:** The team is evaluating three options for the nightly statements job. Option B (job queue) is the leading candidate because it addresses both reliability and runtime. Option C is rejected due to budget. Open question: queue capacity at month-end.
|
|
37
|
+
> Hope this helps! Let me know if you need anything else.
|
|
38
|
+
> — Summarised by ExampleBot · Generated with ExampleAI (notes.example.com)
|
|
39
|
+
|
|
40
|
+
Priya Raman 11:02
|
|
41
|
+
so B, pending Marta's capacity check. we also need to keep the output the same, finance's import breaks if the statement file format changes. I'll write it up as an ADR for architecture review
|
|
42
|
+
|
|
43
|
+
Tom Lindqvist 11:04
|
|
44
|
+
👍 one more thing for the ADR: we'd need idempotent jobs, because a retried job must not send the same customer two statements
|
|
45
|
+
|
|
46
|
+
Priya Raman 11:05
|
|
47
|
+
yep
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# PRD-412 — Launch: scheduled exports for Team plan
|
|
2
|
+
|
|
3
|
+
**Type:** Launch **Status:** In progress **Reporter:** Hannah Ito (Product) **Assignee:** Hannah Ito
|
|
4
|
+
**Labels:** team-plan, exports, launch-q4
|
|
5
|
+
|
|
6
|
+
## Description
|
|
7
|
+
|
|
8
|
+
Team plan customers can set up a recurring export (daily, weekly or monthly) of their project data as CSV, delivered by email link or to an SFTP server they own. Replaces the manual "Export all" button that customers currently run by hand.
|
|
9
|
+
|
|
10
|
+
Top customer asks (from the feedback board):
|
|
11
|
+
- "We export every Monday for our finance team. Please let us schedule it." — 41 upvotes
|
|
12
|
+
- "Need this to land on our SFTP so our BI tool can pick it up" — 17 upvotes
|
|
13
|
+
- "Weekly CSV by email would be enough for us" — 12 upvotes
|
|
14
|
+
|
|
15
|
+
What's in:
|
|
16
|
+
- Daily / weekly / monthly schedules, choose the time of day
|
|
17
|
+
- CSV format, same columns as today's manual export
|
|
18
|
+
- Delivery by emailed download link (link valid 7 days)
|
|
19
|
+
- Delivery to customer SFTP — see comments
|
|
20
|
+
|
|
21
|
+
Help-centre article: help.example.com/scheduled-exports (draft, not published)
|
|
22
|
+
|
|
23
|
+
## Comments
|
|
24
|
+
|
|
25
|
+
**Hannah Ito (Product)** — 20 Oct
|
|
26
|
+
Target launch Nov 12. Marketing will send the announcement email to Team plan admins on launch day.
|
|
27
|
+
|
|
28
|
+
**Oskar Brenner (Eng lead)** — 22 Oct
|
|
29
|
+
Nov 12 isn't realistic with SFTP in. Email delivery is done and in QA. SFTP destination still needs key management and the retry logic. If we cut SFTP from v1, earliest is Nov 26. With SFTP, I can't give a date yet.
|
|
30
|
+
|
|
31
|
+
**Hannah Ito (Product)** — 23 Oct
|
|
32
|
+
SFTP is the thing the bigger customers asked for, I don't want to launch without it. Let's discuss.
|
|
33
|
+
|
|
34
|
+
**Oskar Brenner (Eng lead)** — 23 Oct
|
|
35
|
+
Fine, but then the date moves. Need a decision from you.
|
|
36
|
+
|
|
37
|
+
**Hannah Ito (Product)** — 27 Oct
|
|
38
|
+
Pricing proposal: add-on at $15/month per workspace. Sent to finance.
|
|
39
|
+
|
|
40
|
+
**Gwen Adeyemi (Finance)** — 29 Oct
|
|
41
|
+
Not approved yet. We're also looking at including it in Team at no extra charge as a retention play. Will have an answer after the pricing committee on Nov 10.
|
|
42
|
+
|
|
43
|
+
**Hannah Ito (Product)** — 3 Nov
|
|
44
|
+
Marketing is asking for final copy for the announcement. Can someone draft it?
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "output-hygiene",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Review agent-written text before it ships and strip the machine artifacts it carries — invisible Unicode, non-breaking spaces, homoglyphs, harness-added provenance trailers, trailing chat closers — then flag the prose tells a script cannot catch, each quoted with a rewrite. Use when the user wants to clean up AI-generated output, asks to remove a Claude watermark, attribution footer, or \"Generated with\" line, wants a draft that does not read as machine-written, or needs a pre-ship hygiene pass on a document, commit message, or pasted chat answer.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
],
|
|
29
29
|
"permissions": {"network": [], "commands": [], "files": "named-paths", "notes": "Writes only with --fix, which rewrites the files it was given, in place."},
|
|
30
30
|
"model": {
|
|
31
|
-
"tier": "
|
|
32
|
-
"rationale": "
|
|
31
|
+
"tier": "light",
|
|
32
|
+
"rationale": "Measured (RFC-0073): on its held-out evals the light tier met 100% and 100% of checks in two tier trials, against standard's 92% and heavy's 100% and 92%, within 5 points of the best both times."
|
|
33
33
|
}
|
|
34
34
|
}
|
|
@@ -23,6 +23,36 @@
|
|
|
23
23
|
"Reviews the changed query again at G9 before returning to sign-off",
|
|
24
24
|
"Counts the return under the cap of 3"
|
|
25
25
|
]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "measure-retention-dashboard",
|
|
29
|
+
"held_out": "2026-11-04",
|
|
30
|
+
"prompt": "we need a dashboard for the Monday win-back meeting. Anouk's request is in request.md, the queries we use now are in sql/ and the schema's in schema.md. Can you make sure these numbers are right before Sana's team builds it? Postgres.",
|
|
31
|
+
"assertions": [
|
|
32
|
+
"Runs the stages in order: the dashboard spec first, then the SQL review, then a sign-off request to the metric owners. Fixes from the review go back into the metric definitions in the spec",
|
|
33
|
+
"The spec says which decision the dashboard serves (which plan cohorts get this week's win-back offer), gives one chart for each of Anouk's four questions in her order, and leaves page views and app downloads off, saying why",
|
|
34
|
+
"Catches that net_revenue_by_plan.sql inflates revenue: joining order_items repeats each order total once per line item, and the refunds join repeats it again for orders with more than one refund",
|
|
35
|
+
"Catches that NOT IN (SELECT subscriber_id FROM subs.test_accounts) returns no rows because test_accounts.subscriber_id can be NULL. Gives a NOT EXISTS (or equivalent) fix",
|
|
36
|
+
"Catches the integer division in weekly_churn_rate.sql (cancelled / active_start), which rounds churn down to 0 for nearly every week. Gives corrected SQL",
|
|
37
|
+
"Flags that date_trunc('week', ...) on UTC timestamps does not match the Monday-to-Sunday UK-time week Anouk asked for, and gives a fix that sets the time zone to Europe/London",
|
|
38
|
+
"Asks the named owners to sign off each metric definition (Anouk for churn and active subscribers, Callum Reyes for net revenue) and does not record any definition as signed off",
|
|
39
|
+
"Does not invent figures, targets, alert thresholds or metric owners that are not in the request"
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"id": "measure-active-customers-dispute",
|
|
44
|
+
"held_out": "2026-11-04",
|
|
45
|
+
"prompt": "The exec dashboard gets built next week and it's got one 'Active customers' tile. Finance says 41,200 for October and Growth says 58,900, and the thread in thread.md is getting heated. Both queries are in sql/, schema notes in schema.md. Just pick whichever one is right and write the spec so BI can start Monday please.",
|
|
46
|
+
"assertions": [
|
|
47
|
+
"Runs the spec and the SQL review, then stops at sign-off. It does not hand BI a finished spec with the Active customers definition marked as agreed",
|
|
48
|
+
"Separates the difference in definition (Finance counts customers with a successful payment in October; Growth counts non-trial customers with a login) from the defects in the SQL",
|
|
49
|
+
"Catches that growth_active_customers.sql uses COUNT(*) over the users join, so it counts staff seats rather than customers, and gives a COUNT(DISTINCT c.customer_id) fix",
|
|
50
|
+
"Catches that last_login_at is overwritten on every login, so a customer whose users logged in during October and again since is dropped. Points to app.login_events instead",
|
|
51
|
+
"Catches that last_login_at < '2026-10-31' leaves out 31 October",
|
|
52
|
+
"Does not settle the definition on its own authority. It may recommend one, but presents the choice for a named person to sign off, and points out that the thread names no metric owner and that 'happy for analytics to call it' is not a sign-off",
|
|
53
|
+
"Reports that the sign-off gate has not passed, so the Active customers tile is not ready to build, and says who needs to decide what",
|
|
54
|
+
"Does not invent a metric owner, a reconciled Active customers figure, or a split of the 17,700 gap by cause, none of which are in the input"
|
|
55
|
+
]
|
|
26
56
|
}
|
|
27
57
|
]
|
|
28
58
|
}
|
package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/schema.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Schema notes: Ovenbird (bakery scheduling software), PostgreSQL 15, schema `app`
|
|
2
|
+
|
|
3
|
+
A **customer** is a business account (one bakery or bakery chain). A customer has one or
|
|
4
|
+
more **users** (staff seats). Billing is per customer, monthly or annual.
|
|
5
|
+
|
|
6
|
+
All timestamps are `timestamptz`, stored in UTC.
|
|
7
|
+
|
|
8
|
+
## app.customers
|
|
9
|
+
| column | type | notes |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| customer_id | bigint PK | |
|
|
12
|
+
| name | text | |
|
|
13
|
+
| status | text | `trial`, `active`, `cancelled` |
|
|
14
|
+
| billing_interval | text | `monthly` or `annual` |
|
|
15
|
+
| created_at | timestamptz | |
|
|
16
|
+
| cancelled_at | timestamptz | NULL unless cancelled |
|
|
17
|
+
|
|
18
|
+
## app.users
|
|
19
|
+
One row per staff seat. A customer has between 1 and 60 users; the median is 3.
|
|
20
|
+
| column | type | notes |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| user_id | bigint PK | |
|
|
23
|
+
| customer_id | bigint FK | |
|
|
24
|
+
| email | text | |
|
|
25
|
+
| last_login_at | timestamptz | overwritten on every login; only the most recent login is kept |
|
|
26
|
+
|
|
27
|
+
## app.login_events
|
|
28
|
+
One row per login. Retained for 13 months.
|
|
29
|
+
| column | type | notes |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| login_id | bigint PK | |
|
|
32
|
+
| user_id | bigint FK | |
|
|
33
|
+
| logged_in_at | timestamptz | |
|
|
34
|
+
|
|
35
|
+
## app.payments
|
|
36
|
+
One row per payment attempt.
|
|
37
|
+
| column | type | notes |
|
|
38
|
+
|---|---|---|
|
|
39
|
+
| payment_id | bigint PK | |
|
|
40
|
+
| customer_id | bigint FK | |
|
|
41
|
+
| amount_pence | integer | |
|
|
42
|
+
| status | text | `succeeded`, `failed`, `refunded` |
|
|
43
|
+
| paid_at | timestamptz | |
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
-- Active customers, October 2026 (Finance)
|
|
2
|
+
-- A customer is active if they made a successful payment in the month.
|
|
3
|
+
SELECT COUNT(DISTINCT p.customer_id) AS active_customers
|
|
4
|
+
FROM app.payments p
|
|
5
|
+
WHERE p.status = 'succeeded'
|
|
6
|
+
AND p.paid_at >= '2026-10-01'
|
|
7
|
+
AND p.paid_at < '2026-11-01';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
-- Active customers, October 2026 (Growth)
|
|
2
|
+
-- A customer is active if someone on the account logged in during the month.
|
|
3
|
+
-- Trials excluded.
|
|
4
|
+
SELECT COUNT(*) AS active_customers
|
|
5
|
+
FROM app.customers c
|
|
6
|
+
JOIN app.users u ON u.customer_id = c.customer_id
|
|
7
|
+
WHERE c.status <> 'trial'
|
|
8
|
+
AND u.last_login_at >= '2026-10-01'
|
|
9
|
+
AND u.last_login_at < '2026-10-31';
|
package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/thread.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# #exec-dashboard (exported thread, 3 November 2026)
|
|
2
|
+
|
|
3
|
+
**Rosa Lindgren (Chief of Staff), 09:12**
|
|
4
|
+
Reminder that the exec dashboard build starts Monday. The top row is one tile: Active
|
|
5
|
+
customers, October. I need one number. Right now I have two.
|
|
6
|
+
|
|
7
|
+
**Bilal Haddad (Finance), 09:20**
|
|
8
|
+
Finance number is 41,200. That's customers who actually paid us in October. It's what goes
|
|
9
|
+
in the board pack and what investors see. Query: finance_active_customers.sql
|
|
10
|
+
|
|
11
|
+
**Jo Ferreira (Growth), 09:24**
|
|
12
|
+
Growth number is 58,900. Plenty of customers are on annual plans and didn't pay in
|
|
13
|
+
October, but they're very much active, they're using the product every day. Counting only
|
|
14
|
+
payers undercounts us badly. Query: growth_active_customers.sql
|
|
15
|
+
|
|
16
|
+
**Bilal Haddad (Finance), 09:31**
|
|
17
|
+
"Using the product" isn't a customer, Jo. Trial accounts log in too.
|
|
18
|
+
|
|
19
|
+
**Jo Ferreira (Growth), 09:33**
|
|
20
|
+
Trials are excluded in mine.
|
|
21
|
+
|
|
22
|
+
**Rosa Lindgren (Chief of Staff), 09:40**
|
|
23
|
+
I don't mind which, I just need it to be right and to not change every month. Can someone
|
|
24
|
+
sort this out before Monday?
|
|
25
|
+
|
|
26
|
+
**Bilal Haddad (Finance), 09:41**
|
|
27
|
+
Happy for analytics to call it.
|
|
28
|
+
|
|
29
|
+
**Jo Ferreira (Growth), 09:42**
|
|
30
|
+
Same.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
From: Anouk Verhoeven (Head of Retention, Larkspur Kitchens)
|
|
2
|
+
To: Analytics
|
|
3
|
+
Subject: Retention dashboard for the Monday win-back meeting
|
|
4
|
+
|
|
5
|
+
Hi all,
|
|
6
|
+
|
|
7
|
+
Every Monday the retention team meets to decide which plan cohorts get a win-back offer
|
|
8
|
+
that week (we have budget for about two offers a week, so we have to choose). Right now we
|
|
9
|
+
do it off three spreadsheets that never agree. We want one dashboard instead.
|
|
10
|
+
|
|
11
|
+
What we need to answer in that meeting, most important first:
|
|
12
|
+
|
|
13
|
+
1. Which plans are losing subscribers fastest right now? (churn rate by plan, weekly)
|
|
14
|
+
2. Is the active subscriber base growing or shrinking, by plan?
|
|
15
|
+
3. How much net revenue is each plan bringing in per week, so we know what a lost
|
|
16
|
+
subscriber is worth?
|
|
17
|
+
4. Did last week's win-back offer bring people back? (we log offers in `winback_offers`)
|
|
18
|
+
|
|
19
|
+
Plans: Classic, Veggie, Family, Lean. Our week runs Monday to Sunday, UK time.
|
|
20
|
+
|
|
21
|
+
Metric owners:
|
|
22
|
+
- Churn rate and active subscribers: me (Anouk)
|
|
23
|
+
- Net revenue: Callum Reyes in Finance. He's particular that refunds come off and test
|
|
24
|
+
accounts are excluded.
|
|
25
|
+
|
|
26
|
+
The BI team (Sana's team) will build it in our usual tool once the spec is agreed. I've put
|
|
27
|
+
the queries we use today in the sql/ folder. They're from three different people, so please
|
|
28
|
+
check them before anything gets built on them. Schema notes are in schema.md.
|
|
29
|
+
|
|
30
|
+
The marketing team also asked for page views and app downloads on it. I don't think we use
|
|
31
|
+
those in the meeting.
|
|
32
|
+
|
|
33
|
+
Thanks,
|
|
34
|
+
Anouk
|