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
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Billing platform migration — completion note
|
|
2
|
+
|
|
3
|
+
Author: Finance systems · 2026-10-07
|
|
4
|
+
|
|
5
|
+
The move from the old billing system to the new one finished over the weekend of 3–4 October 2026. From 5 October, all customers' subscription invoices (web and app customers alike) are generated by the new system.
|
|
6
|
+
|
|
7
|
+
Customer-visible changes:
|
|
8
|
+
- Invoice numbers changed format (PLV-000123 became 2026-10-000123)
|
|
9
|
+
- Subscription invoices are now emailed from billing@ploverly.example instead of accounts@ploverly.example
|
|
10
|
+
- A known issue: some customers saw a duplicate "pending" card authorisation on 5–6 October. The second authorisation drops off on its own within 7 days and was never charged. We do not yet know how many customers were affected.
|
|
11
|
+
|
|
12
|
+
Finance has not reviewed support tickets about billing since the migration.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# #support-team poll — 2026-10-20
|
|
2
|
+
|
|
3
|
+
Question from the support manager: "What's driving the extra tickets?" 9 agents answered.
|
|
4
|
+
|
|
5
|
+
- App navigation / can't find things in the new app — 5
|
|
6
|
+
- Billing questions (new invoice numbers, double charges, emails) — 4
|
|
7
|
+
|
|
8
|
+
Free-text comments:
|
|
9
|
+
- "Loads of 'where is my invoice'. Honestly could be either — some mean their subscription invoice, some mean the invoices they send to their own customers."
|
|
10
|
+
- "The double charge ones are angry but I'd say there were only a handful a day in the first week."
|
|
11
|
+
- "Mostly app stuff on my queue but I only do in-app chat."
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# App store reviews summary — October 2026
|
|
2
|
+
|
|
3
|
+
Average rating (iOS and Android combined): 4.5 in September, 4.1 for reviews posted 6–25 October.
|
|
4
|
+
|
|
5
|
+
Sample of October 1–2 star reviews (verbatim):
|
|
6
|
+
- "Can't find where to download my invoices anymore. Why change what worked?"
|
|
7
|
+
- "New menu is confusing, took me ages to find payments."
|
|
8
|
+
- "Charged twice this month and no one tells me why!!"
|
|
9
|
+
- "Where are my invoices??"
|
|
10
|
+
- "Invoice numbers all changed, my accountant is confused."
|
|
11
|
+
|
|
12
|
+
Reviews mentioning the new navigation: not counted. Reviews mentioning charges or billing: not counted.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Trial-to-paid conversion by weekly trial cohort
|
|
2
|
+
|
|
3
|
+
Exported from the product analytics workspace, 2026-10-29. Product: Tallyfold (self-serve bookkeeping, Starter plan).
|
|
4
|
+
Conversion = share of trials started that week that became paid within 14 days of trial start. Cohort week starts Monday.
|
|
5
|
+
|
|
6
|
+
## 2026
|
|
7
|
+
|
|
8
|
+
| Cohort week | Trials started | Converted to paid | Conversion |
|
|
9
|
+
|---|---|---|---|
|
|
10
|
+
| 3 Aug | 1,142 | 214 | 18.7% |
|
|
11
|
+
| 10 Aug | 1,168 | 220 | 18.8% |
|
|
12
|
+
| 17 Aug | 1,131 | 207 | 18.3% |
|
|
13
|
+
| 24 Aug | 1,155 | 216 | 18.7% |
|
|
14
|
+
| 31 Aug | 1,149 | 171 | 14.9% |
|
|
15
|
+
| 7 Sep | 1,160 | 130 | 11.2% |
|
|
16
|
+
| 14 Sep | 1,137 | 132 | 11.6% |
|
|
17
|
+
| 21 Sep | 1,151 | 203 | 17.6% |
|
|
18
|
+
| 28 Sep | 1,146 | 207 | 18.1% |
|
|
19
|
+
|
|
20
|
+
## 2025, same weeks (for comparison)
|
|
21
|
+
|
|
22
|
+
| Cohort week | Conversion |
|
|
23
|
+
|---|---|
|
|
24
|
+
| 1 Sep 2025 | 18.2% |
|
|
25
|
+
| 8 Sep 2025 | 18.9% |
|
|
26
|
+
| 15 Sep 2025 | 18.4% |
|
|
27
|
+
| 22 Sep 2025 | 18.6% |
|
|
28
|
+
|
|
29
|
+
Notes: trial sign-up flow and the 14-day trial length were unchanged across the period. No tracking changes were made to the conversion event.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Lifecycle email: incident note — onboarding sequence deliverability
|
|
2
|
+
|
|
3
|
+
Author: Ines Carvalho (Lifecycle marketing) · 2026-09-22
|
|
4
|
+
|
|
5
|
+
## What happened
|
|
6
|
+
|
|
7
|
+
On 2 September we moved lifecycle email to a new sending provider and a new sending subdomain (mail.tallyfold.example). The DKIM record for the new subdomain was published with a typo, so messages failed DKIM signing checks at the major mailbox providers.
|
|
8
|
+
|
|
9
|
+
The onboarding sequence (day 1 "Set up your books", day 3 "Connect your bank", day 7 "Your first VAT return") goes to every new trial user. It was the only sequence moved on 2 September; billing and password emails stayed on the old provider.
|
|
10
|
+
|
|
11
|
+
## Impact on the onboarding sequence
|
|
12
|
+
|
|
13
|
+
| Period | Delivered (accepted by receiving server) | Open rate |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| 1–31 Aug (old provider) | 98.1% | 52% |
|
|
16
|
+
| 2–19 Sep (new provider, DKIM broken) | 97.4% | 6% |
|
|
17
|
+
| 20–30 Sep (DKIM fixed) | 98.0% | 49% |
|
|
18
|
+
|
|
19
|
+
"Delivered" stayed high because the receiving servers accepted the messages; seed tests on 18 September showed them landing in spam folders.
|
|
20
|
+
|
|
21
|
+
The DKIM record was corrected on the evening of 19 September.
|
|
22
|
+
|
|
23
|
+
## Not known
|
|
24
|
+
|
|
25
|
+
We have not measured whether trial users who never opened the onboarding emails convert at a lower rate. That join between email events and billing has not been built.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Website changelog — pricing page
|
|
2
|
+
|
|
3
|
+
| Date | Change | Owner |
|
|
4
|
+
|---|---|---|
|
|
5
|
+
| 2026-06-30 | Fixed broken FAQ anchor links | Web team |
|
|
6
|
+
| 2026-09-15 | Pricing page redesign went live: new layout, annual plan toggle on by default, comparison table moved below the fold. Starter price unchanged at £24/month (£19/month billed annually). | Web team / Growth |
|
|
7
|
+
| 2026-10-02 | Copy tweak on Starter card ("Everything a sole trader needs") | Growth |
|
|
8
|
+
|
|
9
|
+
The in-app upgrade screen that trial users see was not changed on 15 September; only the public pricing page.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Calls with September trial users who did not convert
|
|
2
|
+
|
|
3
|
+
Interviewer: Femi Adebayo (Growth) · calls 5–9 October 2026 · 5 calls, 20 minutes each
|
|
4
|
+
Recruited from trial users whose trial started 7–18 September and who did not pay. 31 emailed, 5 agreed.
|
|
5
|
+
|
|
6
|
+
**P1 — sole trader, decorator**
|
|
7
|
+
"I signed up and then didn't really know where to start. I was waiting for some kind of guide." Did not recall receiving any emails from Tallyfold. Found them in spam during the call.
|
|
8
|
+
|
|
9
|
+
**P2 — small bakery, two staff**
|
|
10
|
+
Got stuck connecting the bank feed. "I assumed there'd be a walkthrough." No recollection of onboarding emails.
|
|
11
|
+
|
|
12
|
+
**P3 — freelance designer**
|
|
13
|
+
Said the price was too high compared with "Vantor, which is free now". Had looked at the pricing page before signing up.
|
|
14
|
+
|
|
15
|
+
**P4 — dog groomer**
|
|
16
|
+
"Never got the setup email, I don't think." Gave up after the first day.
|
|
17
|
+
|
|
18
|
+
**P5 — consultant**
|
|
19
|
+
Busy month, didn't have time to try it properly. Might come back in January.
|
|
20
|
+
|
|
21
|
+
Interviewer's note: small sample, self-selected. Three of five mention not getting or not finding the setup guidance.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Competitor watch: Vantor free tier
|
|
2
|
+
|
|
3
|
+
Author: Growth team · 2026-09-12
|
|
4
|
+
|
|
5
|
+
Vantor announced a free tier for sole traders on their blog on 10 September 2026 (blog.vantor.example/free-for-sole-traders). Limits: one bank account, 20 invoices a month, no VAT returns.
|
|
6
|
+
|
|
7
|
+
Our Starter plan includes VAT returns, which the Vantor free tier does not.
|
|
8
|
+
|
|
9
|
+
We have no data yet on how many of our trial users also tried Vantor.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# #growth weekly recap — posted 2026-10-01 by the growth channel bot
|
|
2
|
+
|
|
3
|
+
Trial conversion took a hit in September: 14.9% for the 31 Aug cohort, 11.2% for 7 Sep and 11.6% for 14 Sep, against about 18.7% in August. The 21 Sep cohort is back at 17.6%.
|
|
4
|
+
|
|
5
|
+
Looks seasonal to me — September is always soft after the summer, people are busy with back-to-school. Probably nothing to worry about. — Ollie
|
|
6
|
+
|
|
7
|
+
(figures from the analytics workspace export)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "research-plan",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Turn a vague research question into a research plan — the decision the research serves, the precise question and sub-questions, what finding would change the decision, a method per sub-question (desk research, interviews, data pull, experiment), source types with inclusion and exclusion criteria, ready-to-run search strings, a stopping rule for when you have enough, and the deliverable. Starts by asking what decision the research is for. Use when the user says \"I need to research X\", \"help me scope this research\", \"how should I investigate…\", \"what should I look into before deciding…\", or wants a research or discovery plan.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"search"
|
|
41
41
|
],
|
|
42
42
|
"model": {
|
|
43
|
-
"tier": "
|
|
44
|
-
"rationale": "
|
|
43
|
+
"tier": "light",
|
|
44
|
+
"rationale": "Measured (RFC-0073): on its held-out evals the light tier met 79% and 79% of checks in two tier trials, against standard's 79% and heavy's 79% and 79%, within 5 points of the best both times."
|
|
45
45
|
}
|
|
46
46
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "source-synthesis",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Answer a question from a set of sources the user supplied — papers, reports, articles, interview notes, emails — saying only what the material supports, labelling anything that comes from elsewhere where it appears, counting a source that repeats another once, and giving a labelled estimate when the user needs a figure the sources don't settle. Written in the length and format the user asked for; a full cited literature review only when that is the ask. Use when the user hands over several sources and asks to \"synthesise these\", \"what do these papers say\", \"pull together what we know\", \"literature review\", or \"where do the sources agree and disagree\".",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
],
|
|
37
37
|
"permissions": {"network": [], "commands": [], "files": "named-paths"},
|
|
38
38
|
"model": {
|
|
39
|
-
"tier": "
|
|
40
|
-
"rationale": "
|
|
39
|
+
"tier": "light",
|
|
40
|
+
"rationale": "Measured (RFC-0073): on its held-out evals the light tier met 83% and 78% of checks in two tier trials, against standard's 76% and heavy's 85% and 82%, within 5 points of the best both times."
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skill-author",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Write a new portable Agent Skill (a SKILL.md folder) from a described task, for Claude Code, Codex, Copilot, Cursor, Kiro or Antigravity in any repo — a description that leads with the artifact and ends with trigger phrases, decisive steps, a quality bar, when and when-not sections naming near-miss siblings, anti-patterns, a non-interactive rule, reference files and scripts that work in every tool, acceptance evals and trigger queries, and the install path for each tool. Use when the user says \"turn this into a skill\", \"write a SKILL.md for…\", \"make an agent skill that…\", or wants a repeatable task packaged so their coding agent does it the same way every time.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"copilot"
|
|
36
36
|
],
|
|
37
37
|
"model": {
|
|
38
|
-
"tier": "
|
|
39
|
-
"rationale": "
|
|
38
|
+
"tier": "light",
|
|
39
|
+
"rationale": "Measured (RFC-0073): on its held-out evals the light tier met 100% and 93% of checks in two tier trials, against standard's 93% and heavy's 100% and 92%, within 5 points of the best both times."
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -33,6 +33,34 @@
|
|
|
33
33
|
"After writing the ADR, checks that ADR-0004 is marked superseded by the new record, and gives the exact edit when it isn't",
|
|
34
34
|
"Does not invent records, ids or dates that are not in the repository"
|
|
35
35
|
]
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"id": "design-bulk-export",
|
|
39
|
+
"held_out": "2026-11-04",
|
|
40
|
+
"prompt": "The bulk invoice export PRD got ratified at product review last week (prd-bulk-export.md). Our existing ADRs are in adr/. Can you work out how we should build it and write up the decision?",
|
|
41
|
+
"assertions": [
|
|
42
|
+
"Works in loop order: the constraints (the three existing ADRs and the NFRs) are set out before options are compared, the threat model is done on the chosen design before the panel review, and the ADR is written only after the panel's verdict",
|
|
43
|
+
"The design runs the export as a job on the existing queue (ADR-0002), reads from the read replica (ADR-0001) and sets the tenant from the job payload under row-level security (ADR-0003), or argues explicitly for an exception to one of them; it does not propose generating a 2M-row file in the request path",
|
|
44
|
+
"The NFRs use the PRD's own figures (2,000,000 rows, 95% ready within 15 minutes, 24-hour link, deletion after 7 days, audit log entries) and give every other category a measurable target, an explicit n/a, or a default that is labelled as a default",
|
|
45
|
+
"The threat model covers the download link and cross-tenant access at the trust boundaries they cross (for example a link shared or replayed by another user, or a job run under the wrong tenant), and each mitigation can be checked",
|
|
46
|
+
"The panel review ends in a verdict using one of the gate words (PROCEED, PROCEED WITH CONDITIONS, REVISE, RECONSIDER), and any conditions it sets appear in the ADR's consequences",
|
|
47
|
+
"The ADR records the options considered and the decision, cites ADR-0001, ADR-0002 and ADR-0003, and the record stage states how the new decision relates to the existing ones (which it relies on, and that none are superseded)",
|
|
48
|
+
"Does not invent requirements that are not in the PRD, such as scheduled exports, XLSX or an export API, and does not change the PRD's row limit or 15-minute target"
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"id": "design-draft-prd-webhooks",
|
|
53
|
+
"held_out": "2026-11-04",
|
|
54
|
+
"prompt": "Need an architecture call on partner webhooks for Ledgerline: Kafka, or just POST straight from the app with retries? PRD is prd-partner-webhooks.md, ADRs in adr/. Skip the threat model, it's internal-ish. Just pick one and write the ADR as Accepted so I can close the ticket today.",
|
|
55
|
+
"assertions": [
|
|
56
|
+
"Points out early that the PRD is a draft that has not been reviewed and still has open questions, so the loop's starting input, a ratified requirement, is missing",
|
|
57
|
+
"Treats the delivery guarantee, event volume and retry window as open, and does not pick a guarantee or a volume and design as though it had been decided",
|
|
58
|
+
"Does not drop the threat stage on the user's say-so: it notes that partner endpoints are third-party URLs on the internet, so events cross a trust boundary (for example request forgery through registered URLs, payload signing, leaking invoice data to the wrong endpoint), or it records the skipped threat model as an explicit gap that blocks the decision",
|
|
59
|
+
"Notes that Kafka would be new stateful infrastructure needing Platform review and a named on-call owner under ADR-0004, and that ADR-0002 already requires external calls to run on the existing job queue, which rules out a POST from the request path",
|
|
60
|
+
"The panel's verdict is REVISE or RECONSIDER, not PROCEED, and names the open questions as the crux, saying what answer would change the decision",
|
|
61
|
+
"Does not write an ADR with status Accepted; it writes none, or one marked Proposed that lists what must be settled before acceptance",
|
|
62
|
+
"Does not invent figures that are not in the input, such as an event volume, a latency target, a number of partners or a retry window"
|
|
63
|
+
]
|
|
36
64
|
}
|
|
37
65
|
]
|
|
38
66
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# ADR-0001: PostgreSQL is the system of record
|
|
2
|
+
|
|
3
|
+
- Status: Accepted
|
|
4
|
+
- Date: 2024-03-11
|
|
5
|
+
- Deciders: Platform team
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Ledgerline needs one transactional store for tenants, customers, invoices and payments. We considered PostgreSQL, MySQL and a document store.
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
PostgreSQL 15 (managed) is the single system of record for all billing data. Read replicas may be used for reporting and other read-heavy workloads; nothing writes to a replica.
|
|
14
|
+
|
|
15
|
+
## Consequences
|
|
16
|
+
|
|
17
|
+
- Heavy reads (reports, exports) should go to the read replica, not the primary.
|
|
18
|
+
- Replica lag is normally under 2 seconds; features that read from the replica must tolerate that.
|
|
19
|
+
|
|
20
|
+
## Governs
|
|
21
|
+
|
|
22
|
+
- `services/billing-api/db/`
|
|
23
|
+
- `infra/postgres/`
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# ADR-0002: Long-running work goes through the job queue
|
|
2
|
+
|
|
3
|
+
- Status: Accepted
|
|
4
|
+
- Date: 2024-06-02
|
|
5
|
+
- Deciders: Platform team, Billing team
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Request handlers in billing-api were timing out on PDF generation and large reports, holding database connections for minutes. The load balancer cuts requests at 30 seconds.
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
Any work expected to take more than 5 seconds runs as a job on the existing Redis-backed job queue (`jobs-worker` service), never in the request path. The request handler enqueues the job and returns a job ID. Jobs must be idempotent and safe to retry; the queue retries a failed job up to 3 times.
|
|
14
|
+
|
|
15
|
+
## Consequences
|
|
16
|
+
|
|
17
|
+
- Features with long-running work need a job status model and a way to tell the user when the job is done.
|
|
18
|
+
- `jobs-worker` concurrency is capped at 20 jobs per pod, 4 pods. Heavy jobs must not starve PDF generation.
|
|
19
|
+
|
|
20
|
+
## Governs
|
|
21
|
+
|
|
22
|
+
- `services/jobs-worker/`
|
|
23
|
+
- `services/billing-api/jobs/`
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# ADR-0003: Tenant isolation by row-level security
|
|
2
|
+
|
|
3
|
+
- Status: Accepted
|
|
4
|
+
- Date: 2024-09-19
|
|
5
|
+
- Deciders: Platform team, Security
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
All tenants share one database. A missed `WHERE tenant_id = ?` in application code leaked one tenant's customer list to another in a staging test (no production impact).
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
Every tenant-owned table has a PostgreSQL row-level security policy on `tenant_id`. Each connection sets `app.tenant_id` at the start of a request or job, and queries run as the `app_tenant` role, which cannot bypass RLS. Background jobs must set the tenant from the job payload, never from a default.
|
|
14
|
+
|
|
15
|
+
## Consequences
|
|
16
|
+
|
|
17
|
+
- Code that runs outside a request (jobs, scripts) is responsible for setting the tenant before any query.
|
|
18
|
+
- Cross-tenant work (admin tooling) uses a separate audited role.
|
|
19
|
+
- Files produced from tenant data must be stored under a tenant-scoped prefix.
|
|
20
|
+
|
|
21
|
+
## Governs
|
|
22
|
+
|
|
23
|
+
- `services/billing-api/db/policies/`
|
|
24
|
+
- `services/jobs-worker/tenant_context.py`
|
|
25
|
+
- `infra/object-storage/`
|
package/packs/solution-architect/loops/design/evals/files/design-bulk-export/prd-bulk-export.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# PRD: Bulk invoice export (CSV)
|
|
2
|
+
|
|
3
|
+
- **Product:** Ledgerline
|
|
4
|
+
- **Author:** Ines Moreau (PM, Billing)
|
|
5
|
+
- **Status:** Ratified — product review, 28 Oct 2026 (approvers: Ines Moreau, Kwame Asante (Eng Manager, Billing), Lotte Jansen (Head of Finance Ops))
|
|
6
|
+
- **Tracking:** LDG-2210
|
|
7
|
+
|
|
8
|
+
## Problem
|
|
9
|
+
|
|
10
|
+
Finance admins at our larger tenants reconcile invoices in their own accounting tools at month end. Today the only way to get invoice data out of Ledgerline is the invoice list page, which pages 100 rows at a time, or a support ticket asking us to run a query. In September 2026 support handled 61 export requests from 23 tenants; median time to fulfil was 2.5 working days. Finance admins at three tenants told us in calls that month-end close slips because they wait on us.
|
|
11
|
+
|
|
12
|
+
## Goals
|
|
13
|
+
|
|
14
|
+
| Goal | Success line |
|
|
15
|
+
|---|---|
|
|
16
|
+
| G1. A finance admin can get all of their tenant's invoices for a date range without contacting support | Export-related support tickets fall from 61/month to under 10/month within two months of launch |
|
|
17
|
+
| G2. Exports are fast enough to use during month-end close | 95% of exports are ready to download within 15 minutes of the request |
|
|
18
|
+
|
|
19
|
+
## Users
|
|
20
|
+
|
|
21
|
+
- **Finance Admin** role only. Other roles (Member, Viewer, Billing Contact) must not see or use the feature.
|
|
22
|
+
|
|
23
|
+
## Requirements
|
|
24
|
+
|
|
25
|
+
| ID | Priority | Requirement |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| R1 | Must | A Finance Admin can request a CSV export of invoices filtered by issue-date range (max 24 months) and status (any combination of draft, open, paid, void). |
|
|
28
|
+
| R2 | Must | One export can contain up to 2,000,000 rows. Our largest tenant today has 1.6M invoices. |
|
|
29
|
+
| R3 | Must | The requester is notified in-app and by email when the export is ready, with a download link. |
|
|
30
|
+
| R4 | Must | The download link works for 24 hours and only for the user who requested it. |
|
|
31
|
+
| R5 | Must | Export files are deleted 7 days after creation. |
|
|
32
|
+
| R6 | Must | Columns: invoice number, issue date, due date, status, customer name, customer email, currency, net, tax, gross, paid date. |
|
|
33
|
+
| R7 | Must | Every export request and every download is written to the tenant's audit log (who, when, filters, row count). |
|
|
34
|
+
| R8 | Should | A Finance Admin can see their last 10 exports and their status (queued, running, ready, failed, expired). |
|
|
35
|
+
| R9 | Could | Cancel a queued or running export. |
|
|
36
|
+
|
|
37
|
+
## Data
|
|
38
|
+
|
|
39
|
+
Export files contain customer names and email addresses (personal data) and invoice amounts. Same classification as the invoice table: Confidential.
|
|
40
|
+
|
|
41
|
+
## Non-goals
|
|
42
|
+
|
|
43
|
+
- Scheduled or recurring exports.
|
|
44
|
+
- Formats other than CSV (no XLSX, no PDF bundle).
|
|
45
|
+
- An export API for integrations. Covered separately in LDG-2302.
|
|
46
|
+
- Exporting line items. Invoice headers only.
|
|
47
|
+
|
|
48
|
+
## Open questions
|
|
49
|
+
|
|
50
|
+
None outstanding. (Line-item export was moved to non-goals at review.)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# ADR-0002: Long-running work goes through the job queue
|
|
2
|
+
|
|
3
|
+
- Status: Accepted
|
|
4
|
+
- Date: 2024-06-02
|
|
5
|
+
- Deciders: Platform team, Billing team
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Request handlers in billing-api were timing out on PDF generation and large reports, holding database connections for minutes. The load balancer cuts requests at 30 seconds.
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
Any work expected to take more than 5 seconds, or that calls an external system, runs as a job on the existing Redis-backed job queue (`jobs-worker` service), never in the request path. The request handler enqueues the job and returns. Jobs must be idempotent and safe to retry; the queue retries a failed job up to 3 times with exponential backoff.
|
|
14
|
+
|
|
15
|
+
## Consequences
|
|
16
|
+
|
|
17
|
+
- `jobs-worker` concurrency is capped at 20 jobs per pod, 4 pods.
|
|
18
|
+
- The queue does not guarantee ordering between jobs.
|
|
19
|
+
|
|
20
|
+
## Governs
|
|
21
|
+
|
|
22
|
+
- `services/jobs-worker/`
|
|
23
|
+
- `services/billing-api/jobs/`
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# ADR-0004: New stateful infrastructure needs Platform sign-off
|
|
2
|
+
|
|
3
|
+
- Status: Accepted
|
|
4
|
+
- Date: 2025-08-14
|
|
5
|
+
- Deciders: Platform team, Engineering leadership
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
In 2025 three product teams each stood up their own stateful component (a second Redis, an Elasticsearch cluster, a RabbitMQ). Two had no on-call owner when they failed. Platform ended up running all three.
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
No team adds a new stateful infrastructure component (database, message broker, streaming platform, search cluster, cache) to production without a Platform team review and a named on-call owner. Requests go through the Platform intake (PLAT board); the review takes about two weeks.
|
|
14
|
+
|
|
15
|
+
## Consequences
|
|
16
|
+
|
|
17
|
+
- Product teams should prefer the existing PostgreSQL, Redis job queue and object storage where they fit.
|
|
18
|
+
- A design that needs a new component must name it, state why the existing ones do not fit, and include the Platform review in its timeline.
|
|
19
|
+
|
|
20
|
+
## Governs
|
|
21
|
+
|
|
22
|
+
- `infra/`
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# PRD: Partner webhooks
|
|
2
|
+
|
|
3
|
+
- **Product:** Ledgerline
|
|
4
|
+
- **Author:** Sam Okonkwo (PM, Integrations)
|
|
5
|
+
- **Status:** DRAFT — not yet reviewed
|
|
6
|
+
- **Tracking:** LDG-2341
|
|
7
|
+
|
|
8
|
+
## Problem
|
|
9
|
+
|
|
10
|
+
Partners who build on Ledgerline (accounting connectors, dunning tools) poll our REST API every few minutes to find out whether invoices have changed. Two partners have told us polling is costing them API quota and that they see changes late.
|
|
11
|
+
|
|
12
|
+
## Goals
|
|
13
|
+
|
|
14
|
+
- Partners find out about invoice changes without polling.
|
|
15
|
+
|
|
16
|
+
## Requirements (draft)
|
|
17
|
+
|
|
18
|
+
| ID | Priority | Requirement |
|
|
19
|
+
|---|---|---|
|
|
20
|
+
| R1 | Must | A partner can register an HTTPS endpoint URL per tenant connection. |
|
|
21
|
+
| R2 | Must | We send an event to that URL when an invoice is created, updated, paid or voided. |
|
|
22
|
+
| R3 | Must | Event body includes invoice ID, event type, timestamp, and the invoice as returned by `GET /v2/invoices/{id}`. |
|
|
23
|
+
| R4 | Should | Failed deliveries are retried. |
|
|
24
|
+
| R5 | ? | Partners can replay events from the last N days. |
|
|
25
|
+
|
|
26
|
+
## Non-goals
|
|
27
|
+
|
|
28
|
+
- Webhooks for objects other than invoices (customers, payments) in v1.
|
|
29
|
+
|
|
30
|
+
## Open questions
|
|
31
|
+
|
|
32
|
+
1. **Delivery guarantee.** At-least-once, or do partners need ordering per invoice? Two partners asked for "exactly once"; we haven't asked what they'd accept. — *owner: Sam, not started*
|
|
33
|
+
2. **Volume.** We don't know how many events this produces. Invoice updates per day across all tenants is not something we currently measure. "Somewhere between thousands and a lot." — *owner: data team, not started*
|
|
34
|
+
3. **Retry window.** How long do we keep retrying a failing partner endpoint? — *not discussed*
|
|
35
|
+
4. **R5 replay.** In or out of v1? — *not discussed*
|
|
36
|
+
5. **Who registers the URL** — the partner, or the tenant's admin when they connect the partner? — *not discussed*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "api-contract-draft",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Draft an OpenAPI 3.1 contract from a feature brief or story — resource-oriented paths, a full error catalog (RFC 9457), pagination/idempotency/versioning decided not deferred, examples on every operation, plus a decisions log so review argues choices instead of YAML. Use when the user wants to design an API, draft an OpenAPI/Swagger spec, define request/response shapes, or agree a contract between frontend/backend or two teams before code.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"asyncapi"
|
|
28
28
|
],
|
|
29
29
|
"model": {
|
|
30
|
-
"tier": "
|
|
31
|
-
"rationale": "
|
|
30
|
+
"tier": "light",
|
|
31
|
+
"rationale": "Measured (RFC-0073): on its held-out evals the light tier met 76% and 92% of checks in two tier trials, against standard's 69% and heavy's 69% and 76%, within 5 points of the best both times."
|
|
32
32
|
}
|
|
33
33
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "architecture-diagrams",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Generate architecture diagrams (Mermaid, PlantUML, C4) from a written description of a system. Supports AWS/Azure/GCP cloud topologies, microservice landscapes, sequence flows, container diagrams, and ER models. Use whenever the user asks for an architecture diagram, system sketch, flow diagram, or visualization of a design.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"architecture"
|
|
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 93% and 100% of checks in two tier trials, against standard's 93% and heavy's 93% and 93%, within 5 points of the best both times."
|
|
30
30
|
}
|
|
31
31
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "design-doc",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Generate a Google-style engineering design doc (problem, goals/non-goals, options considered, recommended approach, risks, rollout) from a feature brief or short description. Use when the user wants to draft a design doc, technical proposal, or one-pager for an engineering review.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
@@ -10,5 +10,5 @@
|
|
|
10
10
|
{ "to": "architecture-diagrams", "when": "the design is written and needs rendering", "purpose": "Render the prose as a diagram that must not disagree with it.", "fallback": "If architecture-diagrams is absent, emit Mermaid inline and check every node against a claim in the doc." }
|
|
11
11
|
],
|
|
12
12
|
"tags": ["design-doc", "documentation", "engineering", "review"],
|
|
13
|
-
"model": { "tier": "
|
|
13
|
+
"model": { "tier": "light", "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 88% and 88% of checks in two tier trials, against standard's 92% and heavy's 91% and 91%, within 5 points of the best both times." }
|
|
14
14
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "figma-diagrams",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Work with Figma and FigJam files via the Figma REST API — read existing file structure, list frames/pages, post comments, and produce FigJam-importable diagram specs. Use when the user mentions a Figma URL, asks to inspect/audit a Figma file, wants to comment on a design programmatically, or wants their architecture diagram in Figma.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"notes": "Reads FIGMA_TOKEN from the environment to call the Figma REST API. Its instructions install the pinned requirements once with `python3 -m pip install -r requirements.txt`, which reaches PyPI."
|
|
42
42
|
},
|
|
43
43
|
"model": {
|
|
44
|
-
"tier": "
|
|
45
|
-
"rationale": "
|
|
44
|
+
"tier": "light",
|
|
45
|
+
"rationale": "Measured (RFC-0073): on its held-out evals the light tier met 92% and 92% of checks in two tier trials, against standard's 92% and heavy's 75% and 92%, within 5 points of the best both times."
|
|
46
46
|
}
|
|
47
47
|
}
|
|
@@ -20,6 +20,34 @@
|
|
|
20
20
|
"Does not fabricate timings, customer counts, or a root cause",
|
|
21
21
|
"States exactly what to re-run with once the facts exist"
|
|
22
22
|
]
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "operate-export-service-first-outage",
|
|
26
|
+
"held_out": "2026-11-04",
|
|
27
|
+
"prompt": "We soft-launched invoice-export about a month ago and had our first proper outage last Tuesday. I want to do this properly now and take it through the whole operate loop. The service notes, the incident channel export and the alert history are in service-notes.md, incident-chat.txt and alerts.log. Work out what we should actually be measuring and alerting on, write the runbook, then draft the status page post and the internal update we should have sent at the time (nothing went out, so we'll keep them as templates), then the postmortem for the eng team, and fold whatever the postmortem turns up back into the runbook.",
|
|
28
|
+
"assertions": [
|
|
29
|
+
"The stages come in the loop's order: the observability plan first, then the runbook, then the incident comms, then the postmortem, with the postmortem's runbook changes last",
|
|
30
|
+
"The observability plan replaces the CPU-based paging with alerts on what customers experience, such as exports not reaching Ready within the 5 minutes the help centre promises, queue age or failed exports, and links each page to a runbook entry",
|
|
31
|
+
"The runbook gives rollback with the helm rollback command from service-notes.md and has an entry for exports stuck on Pending or Failed with worker pods OOMKilled",
|
|
32
|
+
"The status page draft leads with what customers saw (exports stuck on Pending or failing, and the need to re-run failed ones), gives no speculative cause or ETA, and names a next-update time",
|
|
33
|
+
"The postmortem is blameless: the cause is the v2.14.0 change and the gap that let it through (no load test, no canary, no alert fired, so support tickets from 09:20 and the on-call at 09:48 were how it was noticed), never Raj, and it keeps renderer-versus-concurrency as still unknown",
|
|
34
|
+
"The runbook changes from the postmortem are put to a person to accept at the G4 human gate; the agent does not declare G4 passed itself",
|
|
35
|
+
"Does not invent figures or owners not in the input, such as a count of affected customers or failed exports, a resolution cause Lucia has not yet tested, or named owners for follow-up actions"
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "operate-incident-still-open",
|
|
40
|
+
"held_out": "2026-11-04",
|
|
41
|
+
"prompt": "ugh, long night. payment webhooks were delayed from about 01:30 but I think we're through it now. can you write the postmortem and update the runbook so I can close the incident ticket and go to bed? channel log is oncall-log.txt and the current runbook is runbook-webhooks.md",
|
|
42
|
+
"assertions": [
|
|
43
|
+
"Spots from the last entries of oncall-log.txt (retry queue 2,100 to 3,400 in 20 minutes and a 12% error rate through relay-eu at 04:10) that the incident is not over, and says so up front",
|
|
44
|
+
"Does not write a postmortem that treats the incident as resolved or gives a resolution time; the learn stage is held until there is an all-clear",
|
|
45
|
+
"Goes back to the respond stage and drafts a status page update that leads with impact on merchants (delayed payment webhooks), gives no speculative cause or ETA, and names a next-update time",
|
|
46
|
+
"Points out that the 02:30 update promised on the status page at 01:55 was never posted",
|
|
47
|
+
"Does not rewrite runbook-webhooks.md as final; any proposed runbook change is left for a person to accept at the G4 human gate",
|
|
48
|
+
"Does not tell the user the incident ticket can be closed",
|
|
49
|
+
"Does not invent a root cause, a resolution time or a count of affected merchants not in the log, and keeps relay-eu as a lead rather than the cause"
|
|
50
|
+
]
|
|
23
51
|
}
|
|
24
52
|
]
|
|
25
53
|
}
|
package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/alerts.log
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Alert history: invoice-export, 2026-10-19 to 2026-10-27 (UTC)
|
|
2
|
+
# time alert state ack_by duration
|
|
3
|
+
2026-10-19 09:07:12 ExportWorkerHighCPU FIRING kenji 21m
|
|
4
|
+
2026-10-19 09:28:40 ExportWorkerHighCPU RESOLVED - -
|
|
5
|
+
2026-10-20 09:11:03 ExportWorkerHighCPU FIRING kenji 14m
|
|
6
|
+
2026-10-20 09:25:19 ExportWorkerHighCPU RESOLVED - -
|
|
7
|
+
2026-10-21 09:04:55 ExportWorkerHighCPU FIRING priya 33m
|
|
8
|
+
2026-10-21 09:38:02 ExportWorkerHighCPU RESOLVED - -
|
|
9
|
+
2026-10-22 13:40:31 ExportWorkerHighCPU FIRING priya 6m
|
|
10
|
+
2026-10-22 13:46:44 ExportWorkerHighCPU RESOLVED - -
|
|
11
|
+
2026-10-23 09:09:18 ExportWorkerHighCPU FIRING priya 18m
|
|
12
|
+
2026-10-23 09:27:50 ExportWorkerHighCPU RESOLVED - -
|
|
13
|
+
2026-10-26 09:02:47 ExportWorkerHighCPU FIRING kenji 40m
|
|
14
|
+
2026-10-26 09:42:13 ExportWorkerHighCPU RESOLVED - -
|
|
15
|
+
# 2026-10-27: no alerts fired between 09:00 and 12:00
|
|
16
|
+
# Kubernetes events, 2026-10-27 (from kubectl get events, export-worker)
|
|
17
|
+
2026-10-27 09:05:31 export-worker-7f9c-2 OOMKilled restart 1
|
|
18
|
+
2026-10-27 09:05:58 export-worker-7f9c-5 OOMKilled restart 1
|
|
19
|
+
2026-10-27 09:09:12 export-worker-7f9c-1 OOMKilled restart 1
|
|
20
|
+
... (41 OOMKilled restarts total across 6 pods between 09:05 and 10:08)
|
|
21
|
+
2026-10-27 10:08:47 export-worker-7f9c-4 OOMKilled restart 7
|
|
22
|
+
2026-10-27 10:09:30 export-worker-6b21-1 Started (revision 37)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#billing-incidents — export, Tuesday 2026-10-27 (times UTC)
|
|
2
|
+
|
|
3
|
+
09:02 ci-bot: invoice-export v2.14.0 deployed to production (export-worker, export-api). Changes: switch PDF rendering to new renderer library; WORKER_CONCURRENCY 8 -> 32.
|
|
4
|
+
09:20 support-bot: New ticket #58812 "Export has been Pending for 15 mins"
|
|
5
|
+
09:26 support-bot: New ticket #58815 "invoice export stuck"
|
|
6
|
+
09:31 support-bot: New ticket #58819 "PDF export failed, tried twice"
|
|
7
|
+
09:41 Amira (support): anyone looking at exports? we have 6 tickets now, all saying stuck on Pending or Failed
|
|
8
|
+
09:44 Amira (support): @billing-oncall ^
|
|
9
|
+
09:48 Kenji (on-call): looking. queue depth for invoice-export is 4,800 and climbing. normal is under 200
|
|
10
|
+
09:50 Kenji (on-call): worker pods are restarting, OOMKilled. 41 restarts across the 6 pods since 09:05
|
|
11
|
+
09:51 Kenji (on-call): CPU is actually low, the pods die before they get busy. so the CPU alert never went off
|
|
12
|
+
09:55 Lucia: was anything deployed this morning?
|
|
13
|
+
09:56 Kenji (on-call): v2.14.0 at 09:02. new PDF renderer + concurrency 32
|
|
14
|
+
09:58 Lucia: could be either. 32 jobs x the new renderer is a lot of memory in 2 GiB
|
|
15
|
+
10:01 Tom: Raj pushed this without a load test, that's the problem
|
|
16
|
+
10:02 Lucia: let's not do that here. roll back first, talk later
|
|
17
|
+
10:05 Kenji (on-call): rolling back to previous revision
|
|
18
|
+
10:11 Kenji (on-call): rollback done, helm revision 37. pods stable, no restarts since 10:09
|
|
19
|
+
10:14 Amira (support): should we tell customers something? status page?
|
|
20
|
+
10:15 Kenji (on-call): not sure who owns the status page for this. Dana?
|
|
21
|
+
10:30 Kenji (on-call): queue depth 3,100 and falling
|
|
22
|
+
11:05 Kenji (on-call): queue depth 900
|
|
23
|
+
11:40 Kenji (on-call): queue drained, back to normal levels
|
|
24
|
+
11:48 Kenji (on-call): some jobs went to Failed during the crash loop and won't retry by themselves. don't have a count yet, need to query
|
|
25
|
+
11:55 Amira (support): 23 tickets total. nothing went on the status page in the end. customers asking if they need to re-run exports
|
|
26
|
+
11:58 Dana: yes they need to re-run. let's write this up properly. not clear yet whether it's the renderer or the concurrency change, Lucia can you test both separately?
|
|
27
|
+
12:01 Lucia: will do, probably Thursday
|