skilldrop-cli 1.2.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.
Files changed (208) hide show
  1. package/README.md +5 -5
  2. package/catalogue.json +4 -4
  3. package/model-routing.json +62 -70
  4. package/package.json +1 -1
  5. package/packs/ai-engineering/loops/adopt/LOOP.md +120 -0
  6. package/packs/ai-engineering/loops/adopt/evals/eval_queries.json +10 -0
  7. package/packs/ai-engineering/loops/adopt/evals/evals.json +69 -0
  8. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/ai-ideas.md +15 -0
  9. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/org-context.md +27 -0
  10. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/staff-survey.csv +11 -0
  11. package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/ai-ideas.md +13 -0
  12. package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/firm-context.md +23 -0
  13. package/packs/ai-engineering/loops/adopt/loop.json +53 -0
  14. package/packs/ai-engineering/loops/ship-agent/LOOP.md +128 -0
  15. package/packs/ai-engineering/loops/ship-agent/evals/eval_queries.json +10 -0
  16. package/packs/ai-engineering/loops/ship-agent/evals/evals.json +70 -0
  17. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-auto-reply-exfil-open/agent-brief.md +33 -0
  18. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-changelog-config-reopens-path/agent-brief.md +33 -0
  19. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-changelog-config-reopens-path/claude-settings.json +25 -0
  20. package/packs/ai-engineering/loops/ship-agent/evals/files/ship-agent-changelog-config-reopens-path/sample-merged-prs.md +30 -0
  21. package/packs/ai-engineering/loops/ship-agent/loop.json +53 -0
  22. package/packs/ai-engineering/skills/agent-adoption-stage/SKILL.md +0 -1
  23. package/packs/ai-engineering/skills/agent-adoption-stage/manifest.json +3 -4
  24. package/packs/ai-engineering/skills/ai-adoption-rollout/SKILL.md +0 -1
  25. package/packs/ai-engineering/skills/ai-adoption-rollout/manifest.json +3 -4
  26. package/packs/ai-engineering/skills/ai-readiness-assessment/SKILL.md +0 -1
  27. package/packs/ai-engineering/skills/ai-readiness-assessment/manifest.json +1 -2
  28. package/packs/ai-engineering/skills/ai-use-case-triage/manifest.json +3 -3
  29. package/packs/ai-engineering/skills/judge-audit/SKILL.md +1 -2
  30. package/packs/ai-engineering/skills/judge-audit/manifest.json +1 -2
  31. package/packs/ai-engineering/skills/llm-eval-harness/SKILL.md +1 -2
  32. package/packs/ai-engineering/skills/llm-eval-harness/manifest.json +3 -3
  33. package/packs/api-builder/skills/tool-use-schema-writer/manifest.json +2 -2
  34. package/packs/career/loops/apply/evals/evals.json +28 -0
  35. package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/application-form.md +10 -0
  36. package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/job-posting.md +33 -0
  37. package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/resume.md +34 -0
  38. package/packs/career/loops/apply/evals/files/apply-fit-gate-hard-requirement/cv.md +27 -0
  39. package/packs/career/loops/apply/evals/files/apply-fit-gate-hard-requirement/warehouse-supervisor.md +30 -0
  40. package/packs/career/skills/application-form-answers/manifest.json +3 -3
  41. package/packs/career/skills/cover-letter/manifest.json +3 -3
  42. package/packs/career/skills/resume-tailor/manifest.json +3 -3
  43. package/packs/converters/skills/md-to-docx/manifest.json +3 -3
  44. package/packs/core/loops/ship-a-draft/evals/evals.json +28 -0
  45. package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-adr-from-thread/slack-thread.txt +47 -0
  46. package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-announcement-unsettled/ticket-PRD-412.md +44 -0
  47. package/packs/core/skills/output-hygiene/manifest.json +3 -3
  48. package/packs/data-analytics/loops/measure/evals/evals.json +30 -0
  49. package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/schema.md +43 -0
  50. package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/sql/finance_active_customers.sql +7 -0
  51. package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/sql/growth_active_customers.sql +9 -0
  52. package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/thread.md +30 -0
  53. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/request.md +34 -0
  54. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/schema.md +58 -0
  55. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/active_subscribers.sql +17 -0
  56. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/net_revenue_by_plan.sql +15 -0
  57. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/weekly_churn_rate.sql +34 -0
  58. package/packs/data-analytics/skills/dashboard-spec/SKILL.md +0 -1
  59. package/packs/data-analytics/skills/dashboard-spec/manifest.json +1 -2
  60. package/packs/design/skills/slide-outliner/manifest.json +2 -2
  61. package/packs/dev-team/loops/build/evals/evals.json +28 -0
  62. package/packs/dev-team/loops/build/evals/files/build-promo-codes/.github/workflows/ci.yml.fixture +19 -0
  63. package/packs/dev-team/loops/build/evals/files/build-promo-codes/cartcalc/__init__.py +4 -0
  64. package/packs/dev-team/loops/build/evals/files/build-promo-codes/cartcalc/pricing.py +47 -0
  65. package/packs/dev-team/loops/build/evals/files/build-promo-codes/pyproject.toml.fixture +9 -0
  66. package/packs/dev-team/loops/build/evals/files/build-promo-codes/story.md +61 -0
  67. package/packs/dev-team/loops/build/evals/files/build-promo-codes/tests/__init__.py +0 -0
  68. package/packs/dev-team/loops/build/evals/files/build-promo-codes/tests/test_pricing.py +49 -0
  69. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/.github/workflows/ci.yml.fixture +19 -0
  70. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/bug-report.md +25 -0
  71. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/pr-description.md +42 -0
  72. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/pyproject.toml.fixture +9 -0
  73. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/ratelimit/__init__.py +4 -0
  74. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/ratelimit/bucket.py +49 -0
  75. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/tests/__init__.py +0 -0
  76. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/tests/test_bucket.py +63 -0
  77. package/packs/dev-team/loops/modernize/evals/evals.json +30 -0
  78. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/.github/workflows/ci.yml.fixture +11 -0
  79. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/README.md +17 -0
  80. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/docs/adr/0004-late-fee-calculation.md +25 -0
  81. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/legacy/feecalc.py +74 -0
  82. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/samples/accounts_2026-10.txt +10 -0
  83. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/samples/accounts_edge.txt +11 -0
  84. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/tests/test_feecalc_smoke.py +21 -0
  85. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/.github/workflows/ci.yml.fixture +11 -0
  86. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/PR-412.md +24 -0
  87. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/README.md +17 -0
  88. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/docs/adr/0004-late-fee-calculation.md +25 -0
  89. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/__init__.py +1 -0
  90. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/cli.py +33 -0
  91. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/extract.py +33 -0
  92. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/rules.py +39 -0
  93. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/legacy/feecalc.py +74 -0
  94. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/samples/accounts_2026-10.txt +10 -0
  95. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/samples/accounts_edge.txt +11 -0
  96. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/tests/test_feecalc_smoke.py +21 -0
  97. package/packs/dev-team/loops/release/evals/eval_queries.json +10 -0
  98. package/packs/dev-team/loops/release/evals/evals.json +34 -0
  99. package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/0061_switch_to_haldrin_tokens.sql +22 -0
  100. package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/eng-notes.md +40 -0
  101. package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/merged-prs.md +13 -0
  102. package/packs/dev-team/loops/release/evals/files/release-saved-searches/merged-prs.md +13 -0
  103. package/packs/dev-team/loops/release/evals/files/release-saved-searches/readiness-evidence.md +27 -0
  104. package/packs/dev-team/loops/release/evals/files/release-saved-searches/traffic-baseline.md +23 -0
  105. package/packs/dev-team/skills/feature-implement-loop/manifest.json +2 -2
  106. package/packs/dev-team/skills/pr-description-writer/manifest.json +3 -3
  107. package/packs/dev-team/skills/pre-merge-review/manifest.json +2 -2
  108. package/packs/dev-team/skills/release-notes/manifest.json +2 -2
  109. package/packs/dev-team/skills/test-plan-generator/manifest.json +2 -2
  110. package/packs/experience-design/loops/clarify/LOOP.md +114 -0
  111. package/packs/experience-design/loops/clarify/evals/eval_queries.json +10 -0
  112. package/packs/experience-design/loops/clarify/evals/evals.json +68 -0
  113. package/packs/experience-design/loops/clarify/evals/files/clarify-garden-waste-no-complaint-data/form-fields.csv +12 -0
  114. package/packs/experience-design/loops/clarify/evals/files/clarify-garden-waste-no-complaint-data/garden-waste-page.md +29 -0
  115. package/packs/experience-design/loops/clarify/evals/files/clarify-parking-permit-with-call-data/backoffice-notes.md +14 -0
  116. package/packs/experience-design/loops/clarify/evals/files/clarify-parking-permit-with-call-data/calls-q3.csv +8 -0
  117. package/packs/experience-design/loops/clarify/evals/files/clarify-parking-permit-with-call-data/form-fields.csv +12 -0
  118. package/packs/experience-design/loops/clarify/evals/files/clarify-parking-permit-with-call-data/permit-page.md +27 -0
  119. package/packs/experience-design/loops/clarify/loop.json +35 -0
  120. package/packs/experience-design/skills/service-blueprint/manifest.json +3 -3
  121. package/packs/experience-design/skills/ux-writing/manifest.json +3 -3
  122. package/packs/grc/loops/comply/evals/evals.json +29 -0
  123. package/packs/grc/loops/comply/evals/files/comply-chat-vendor-launch/vendor-brief.md +72 -0
  124. package/packs/grc/loops/comply/evals/files/comply-loyalty-app-unowned-risks/launch-note.md +31 -0
  125. package/packs/grc/loops/comply/evals/files/comply-loyalty-app-unowned-risks/risk-register.csv +6 -0
  126. package/packs/infra-as-code/loops/provision/LOOP.md +128 -0
  127. package/packs/infra-as-code/loops/provision/evals/eval_queries.json +9 -0
  128. package/packs/infra-as-code/loops/provision/evals/evals.json +67 -0
  129. package/packs/infra-as-code/loops/provision/evals/files/provision-rds-no-plan-yet/.terraform.lock.hcl.fixture +24 -0
  130. package/packs/infra-as-code/loops/provision/evals/files/provision-rds-no-plan-yet/network.md +36 -0
  131. package/packs/infra-as-code/loops/provision/evals/files/provision-replica-plan-replaces-primary/main.tf +74 -0
  132. package/packs/infra-as-code/loops/provision/evals/files/provision-replica-plan-replaces-primary/plan.json +901 -0
  133. package/packs/infra-as-code/loops/provision/evals/files/provision-replica-plan-replaces-primary/variables.tf +47 -0
  134. package/packs/infra-as-code/loops/provision/loop.json +41 -0
  135. package/packs/infra-as-code/skills/terraform-module/manifest.json +3 -3
  136. package/packs/product-manager/loops/discover/evals/evals.json +28 -0
  137. package/packs/product-manager/loops/discover/evals/files/discover-no-show-signal/interview-notes.md +63 -0
  138. package/packs/product-manager/loops/discover/evals/files/discover-no-show-signal/support-tickets.csv +13 -0
  139. package/packs/product-manager/loops/discover/evals/files/discover-vp-loyalty-no-evidence/vp-message.txt +13 -0
  140. package/packs/product-manager/skills/user-journey-map/manifest.json +2 -2
  141. package/packs/research/loops/research/evals/evals.json +28 -0
  142. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t1-ticket-volume.md +15 -0
  143. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t2-release-notes-4-2.md +11 -0
  144. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t3-billing-migration.md +12 -0
  145. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t4-agent-poll.md +11 -0
  146. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t5-app-store-reviews.md +12 -0
  147. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s1-analytics-export.md +29 -0
  148. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s2-email-delivery-report.md +25 -0
  149. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s3-pricing-changelog.md +9 -0
  150. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s4-trial-interview-notes.md +21 -0
  151. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s5-competitor-note.md +9 -0
  152. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s6-weekly-growth-recap.md +7 -0
  153. package/packs/research/skills/research-plan/manifest.json +3 -3
  154. package/packs/research/skills/source-synthesis/manifest.json +3 -3
  155. package/packs/skill-engineering/skills/skill-author/manifest.json +3 -3
  156. package/packs/solution-architect/loops/design/evals/evals.json +28 -0
  157. package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0001-postgres-system-of-record.md +23 -0
  158. package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0002-background-work-via-job-queue.md +23 -0
  159. package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0003-tenant-isolation-row-level.md +25 -0
  160. package/packs/solution-architect/loops/design/evals/files/design-bulk-export/prd-bulk-export.md +50 -0
  161. package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/adr/0002-background-work-via-job-queue.md +23 -0
  162. package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/adr/0004-new-stateful-infra-needs-platform-signoff.md +22 -0
  163. package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/prd-partner-webhooks.md +36 -0
  164. package/packs/solution-architect/skills/api-contract-draft/manifest.json +3 -3
  165. package/packs/solution-architect/skills/architecture-diagrams/manifest.json +3 -3
  166. package/packs/solution-architect/skills/design-doc/manifest.json +2 -2
  167. package/packs/solution-architect/skills/figma-diagrams/manifest.json +3 -3
  168. package/packs/sre-oncall/loops/operate/evals/evals.json +28 -0
  169. package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/alerts.log +22 -0
  170. package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/incident-chat.txt +27 -0
  171. package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/service-notes.md +46 -0
  172. package/packs/sre-oncall/loops/operate/evals/files/operate-incident-still-open/oncall-log.txt +17 -0
  173. package/packs/sre-oncall/loops/operate/evals/files/operate-incident-still-open/runbook-webhooks.md +38 -0
  174. package/packs/sre-oncall/skills/cloud-cost-review/SKILL.md +0 -1
  175. package/packs/sre-oncall/skills/cloud-cost-review/manifest.json +1 -2
  176. package/packs/sre-oncall/skills/delivery-metrics-report/SKILL.md +0 -1
  177. package/packs/sre-oncall/skills/delivery-metrics-report/manifest.json +1 -2
  178. package/packs/sre-oncall/skills/incident-comms/manifest.json +2 -2
  179. package/packs/sre-oncall/skills/postmortem-generator/manifest.json +2 -2
  180. package/packs/stakeholder-comms/skills/decision-log/manifest.json +2 -2
  181. package/packs/trackers/skills/team-status-report/manifest.json +3 -3
  182. package/packs/ai-engineering/skills/ai-usage-report/SKILL.md +0 -111
  183. package/packs/ai-engineering/skills/ai-usage-report/evals/eval_queries.json +0 -30
  184. package/packs/ai-engineering/skills/ai-usage-report/evals/evals.json +0 -46
  185. package/packs/ai-engineering/skills/ai-usage-report/evals/files/1/northwind-ai-events.csv +0 -4213
  186. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/draftwell-events.csv +0 -249
  187. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/export-note.md +0 -9
  188. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/published-assets.csv +0 -44
  189. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/team-roster.md +0 -10
  190. package/packs/ai-engineering/skills/ai-usage-report/examples/weekly-engineering-team.md +0 -133
  191. package/packs/ai-engineering/skills/ai-usage-report/manifest.json +0 -12
  192. package/packs/ai-engineering/skills/ai-usage-report/scripts/build_report.py +0 -453
  193. package/packs/ai-engineering/skills/ai-usage-report/templates/report-per-user.md +0 -42
  194. package/packs/ai-engineering/skills/ai-usage-report/templates/report-team-rollup.md +0 -49
  195. package/packs/ai-engineering/skills/ai-usage-report/templates/usage-event-schema.md +0 -76
  196. package/packs/product-manager/skills/lean-canvas/SKILL.md +0 -162
  197. package/packs/product-manager/skills/lean-canvas/evals/eval_queries.json +0 -42
  198. package/packs/product-manager/skills/lean-canvas/evals/evals.json +0 -82
  199. package/packs/product-manager/skills/lean-canvas/evals/files/1/pawpass-notes.md +0 -54
  200. package/packs/product-manager/skills/lean-canvas/evals/files/3/lunchloop-pitch.md +0 -30
  201. package/packs/product-manager/skills/lean-canvas/evals/files/4/clubkit-notes.md +0 -44
  202. package/packs/product-manager/skills/lean-canvas/evals/files/5/cost-model.csv +0 -5
  203. package/packs/product-manager/skills/lean-canvas/evals/files/5/proposal.md +0 -40
  204. package/packs/product-manager/skills/lean-canvas/evals/files/5/stakeholder-emails.txt +0 -18
  205. package/packs/product-manager/skills/lean-canvas/examples/bike-repair.md +0 -72
  206. package/packs/product-manager/skills/lean-canvas/manifest.json +0 -34
  207. package/packs/product-manager/skills/lean-canvas/reference.md +0 -102
  208. package/packs/product-manager/skills/lean-canvas/scripts/unit_economics.py +0 -211
@@ -0,0 +1,47 @@
1
+ # modules/orders-db/variables.tf
2
+
3
+ variable "environment" {
4
+ type = string
5
+ description = "Environment name, e.g. staging or prod."
6
+ validation {
7
+ condition = contains(["staging", "prod"], var.environment)
8
+ error_message = "environment must be staging or prod."
9
+ }
10
+ }
11
+
12
+ variable "vpc_id" {
13
+ type = string
14
+ description = "VPC the database runs in."
15
+ }
16
+
17
+ variable "vpc_cidr" {
18
+ type = string
19
+ description = "CIDR of the VPC; the only range allowed to reach Postgres."
20
+ }
21
+
22
+ variable "subnet_ids" {
23
+ type = list(string)
24
+ description = "Private subnet IDs for the DB subnet group."
25
+ }
26
+
27
+ variable "instance_class" {
28
+ type = string
29
+ description = "Instance class for the primary."
30
+ }
31
+
32
+ variable "replica_instance_class" {
33
+ type = string
34
+ description = "Instance class for the reporting read replica."
35
+ default = "db.r7g.large"
36
+ }
37
+
38
+ variable "kms_key_arn" {
39
+ type = string
40
+ description = "KMS key used to encrypt storage."
41
+ }
42
+
43
+ variable "tags" {
44
+ type = map(string)
45
+ description = "Tags merged onto every resource."
46
+ default = {}
47
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "$comment": "RFC-0069. A described need to an apply a person approved. The plan review is the gate because a module can be secure and still produce a plan that destroys a database; the apply check is a second gate because the plan applied must be the plan reviewed, and only the person running apply can confirm that.",
3
+ "name": "provision",
4
+ "version": "0.1.0",
5
+ "description": "Take an infrastructure change from a described need to a Terraform apply a person approved: a module with secure defaults, a review of the real plan that names every destroy, replace, widening and out-of-scope change, and a check right before apply that the plan being applied is the one reviewed, with a gate that sends the module back when the plan would destroy state or widen access unasked. Use when the user says \"write the terraform and check it before we apply\", \"provision this safely\", \"run the provision loop\", or wants new infrastructure from module to apply in one pass.",
6
+ "entrypoint": "LOOP.md",
7
+ "kind": "loop",
8
+ "cap": 3,
9
+ "stages": [
10
+ {
11
+ "id": "module",
12
+ "type": "generate",
13
+ "intent": "Write or change the module for the stated need, with typed variables, secure defaults and the intended scope written down as resource addresses.",
14
+ "skills": ["terraform-module"]
15
+ },
16
+ {
17
+ "id": "plan",
18
+ "type": "verify",
19
+ "intent": "Review the real plan from a saved planfile against the stated scope: every destroy, replace, stateful change, access widening and drift.",
20
+ "skills": ["terraform-plan-review"],
21
+ "gate": {
22
+ "id": "G13",
23
+ "kind": "review",
24
+ "verdicts": ["PROCEED", "PROCEED WITH CONDITIONS", "REVISE", "RECONSIDER", "BLOCKED"],
25
+ "revise_to": "module"
26
+ }
27
+ },
28
+ {
29
+ "id": "apply",
30
+ "type": "gate",
31
+ "intent": "Right before apply, confirm the planfile being applied is the one reviewed, with the same resource changes, and the person running apply approves it.",
32
+ "skills": ["terraform-plan-review"],
33
+ "gate": {
34
+ "id": "G13.1",
35
+ "kind": "human",
36
+ "verdicts": ["PROCEED", "REVISE", "BLOCKED"],
37
+ "revise_to": "plan"
38
+ }
39
+ }
40
+ ]
41
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "terraform-module",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Generate a Terraform module from a described need, with main.tf, variables.tf, outputs.tf and versions.tf, typed and validated variables, secure defaults (encryption on, public access off, least-privilege IAM), a merged tags variable, a basic usage example and a README with inputs and outputs tables. Use when the user says \"write a terraform module for\", \"create terraform for an S3 bucket / VPC / database\", \"turn this into a reusable module\", or \"scaffold infrastructure as code for\".",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -35,8 +35,8 @@
35
35
  "hcl"
36
36
  ],
37
37
  "model": {
38
- "tier": "standard",
39
- "rationale": "Structured generation against fixed module conventions and a secure-defaults checklist; the judgment is bounded to choosing defaults and validation rules for a described need."
38
+ "tier": "light",
39
+ "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 83% and 100%, within 5 points of the best both times."
40
40
  },
41
41
  "permissions": {
42
42
  "network": [
@@ -21,6 +21,34 @@
21
21
  "States that a redirect leaves the loop rather than revising within it",
22
22
  "Does not route back to `structure` for another brief on the original problem"
23
23
  ]
24
+ },
25
+ {
26
+ "id": "discover-no-show-signal",
27
+ "held_out": "2026-11-04",
28
+ "prompt": "Our head of product wants SMS appointment reminders in Chairside because clinics keep complaining about no-shows. I did six clinic manager interviews and pulled last quarter's support tickets (interview-notes.md, support-tickets.csv). Can you take this through to a requirement the team can sign off on? I'm taking it to product review on Thursday.",
29
+ "assertions": [
30
+ "Synthesises the interviews and tickets into themes before writing the brief and the PRD, and the PRD's problem statement traces back to those themes rather than starting from the head of product's SMS request",
31
+ "Counts themes by distinct clinic or account, not by mentions: Riverside Smiles (CL-1107) filing four rescheduling tickets is counted as one account, and the interviews split four clinics (B, C, E, F) for not being able to move an appointment against two (A, D) for forgetting",
32
+ "Concludes that the evidence points more at patients being unable to reschedule outside phone hours than at forgetting, and cites Harbourside (clinic C), which already sends SMS reminders and still gets no-shows, instead of treating SMS reminders as the settled solution",
33
+ "The PRD's problem statement contains no solution language, and the PRD has testable requirements and explicit non-goals",
34
+ "Runs a critique of the drafted PRD before handing it over, and either fixes each finding or lists it as open",
35
+ "Stops at a human ratification gate: presents the PRD as awaiting sign-off at Thursday's review, does not call it ratified or approved itself, and does not go on to a design doc or architecture",
36
+ "Does not invent figures that are not in the input, such as a no-show rate, revenue lost to no-shows, or a share of patients who would reschedule online"
37
+ ]
38
+ },
39
+ {
40
+ "id": "discover-vp-loyalty-no-evidence",
41
+ "held_out": "2026-11-04",
42
+ "prompt": "VP wants a loyalty points programme in the Chairside patient app, her message is in vp-message.txt. We haven't done any research on it. Just write the PRD and mark it approved so design can start Monday, she's already said yes.",
43
+ "assertions": [
44
+ "Says plainly that the input holds no customer or clinic evidence, and labels the PRD's problem statement as an unvalidated assumption rather than an established problem",
45
+ "Does not skip the gather stage: produces interview questions or an assumptions-to-validate ledger that tests the VP's premise, including at least one question that could disprove it",
46
+ "Does not mark the PRD approved or ratified; leaves sign-off of the written requirement to a person, noting that the VP's yes was given to an idea before any requirement existed",
47
+ "The critique of the draft flags the missing evidence for the problem as a blocker or a major finding, not a nit",
48
+ "Does not hand the work on to design or produce design artifacts such as a design doc, architecture or screens",
49
+ "Proceeds without asking follow-up questions, and states the assumptions it made in their place",
50
+ "Does not invent evidence that is not in vp-message.txt, such as customer quotes, survey results, retention figures or details of the expo vendors, and does not carry the VP's 'cuts no-shows in half' guess into the PRD as a fact or committed target"
51
+ ]
24
52
  }
25
53
  ]
26
54
  }
@@ -0,0 +1,63 @@
1
+ # Chairside — clinic manager interviews, no-shows
2
+
3
+ Interviewer: Tomas Reyes (PM). Six 30-minute calls, 13–24 Oct 2026. Notes are mine, not transcripts; quotes are as close as I could get them.
4
+
5
+ Context going in: Mara Lindqvist (Head of Product) asked us to look at SMS appointment reminders because "clinics keep complaining about no-shows".
6
+
7
+ ---
8
+
9
+ ## A — Oakfield Family Dental (acct CL-1043), 3 chairs
10
+ Manager: Helen Brandt
11
+
12
+ - Biggest headache is the afternoon slots. "Half the time they just forgot. We ring the day before if we have time, which we usually don't."
13
+ - Would like an automatic reminder. Asked if it could be a text, "nobody reads email".
14
+ - Reschedule calls are "fine, we get a few".
15
+ - Q: how many no-shows? "Feels like a lot. Maybe one or two a day? I've never counted."
16
+
17
+ ## B — Riverside Smiles (acct CL-1107), 5 chairs
18
+ Manager: Owen Pak
19
+
20
+ - No-shows mostly from patients who knew they couldn't make it but "didn't want to ring". "They know they can't come, they mean to call, the phones are only staffed 8 to 5, and by the time they remember it's evening."
21
+ - Front desk spends the first hour each morning on voicemails asking to move appointments.
22
+ - Wants patients to be able to move their own appointment. "Not cancel — move. If they can only cancel, I've lost the slot and the patient."
23
+ - Reminders: "We already send the default email reminder from Chairside. Doesn't change much."
24
+
25
+ ## C — Harbourside Dental Studio (acct CL-1122), 4 chairs
26
+ Manager: Priyanka Shah
27
+
28
+ - Already sends SMS reminders through a separate tool (pays for it separately, wants to drop it).
29
+ - Still gets no-shows. "The text goes out at 7pm the night before. They reply 'can I move this?' to the text. Nobody sees that reply, it's a no-reply number. Then they don't come."
30
+ - "Reminders aren't the problem. The problem is there's nothing they can do with the reminder."
31
+ - Wants: the reminder to let the patient pick a new time.
32
+
33
+ ## D — Northgate Dental Care (acct CL-1158), 2 chairs
34
+ Manager: Femi Adeyemi
35
+
36
+ - Small practice, older patient base. "A lot of my patients don't text."
37
+ - Forgetting is the main reason. Calls every patient the day before; takes about 40 minutes a day.
38
+ - Would use automatic reminders if patients could get a phone call instead of a text. Not sure SMS helps his patients.
39
+ - Rescheduling: "They call, it's fine."
40
+
41
+ ## E — Lakeview Orthodontics (acct CL-1201), 6 chairs
42
+ Manager: Grace Muller
43
+
44
+ - Patients are mostly teenagers; parents book. Parents "can't call during work hours".
45
+ - No-shows cluster on school-holiday weeks, when plans change. Parents want to move the appointment and "the only way is to phone us".
46
+ - Wants online rescheduling, limited to the same clinician. Orthodontic appointments must stay with the same clinician.
47
+ - Asked whether a reminder would help: "A bit. But they don't forget, they just can't get through to us."
48
+
49
+ ## F — Westbrook Dental (acct CL-1219), 4 chairs
50
+ Manager: Ana Kowalczyk
51
+
52
+ - "When a patient no-shows I can almost always see a missed call or a voicemail from the day before." Has started checking.
53
+ - Front desk is one person; can't answer while checking someone in.
54
+ - Wants patients to move appointments themselves, but worried about double-booking and about patients moving into slots reserved for emergencies.
55
+ - Indifferent on reminders. "Fine, but that's not what's happening."
56
+
57
+ ---
58
+
59
+ ## My quick read (not analysed yet)
60
+ - I went in expecting "forgetting" and I'm not sure that's the main thing.
61
+ - Two clinics (A, D) say forgetting. Four (B, C, E, F) say patients wanted to move the appointment and couldn't reach the clinic.
62
+ - D's patients may not use SMS at all.
63
+ - Nobody gave me a real no-show number. None of them track it.
@@ -0,0 +1,13 @@
1
+ ticket_id,opened,account_id,clinic,channel,subject,body
2
+ T-55102,2026-07-03,CL-1107,Riverside Smiles,email,Online rescheduling?,"Is there any way for patients to move their own appointment online? Our voicemail is full every morning."
3
+ T-55140,2026-07-09,CL-1043,Oakfield Family Dental,chat,Reminder texts,"Can Chairside send text reminders instead of emails? Patients don't read the emails."
4
+ T-55188,2026-07-15,CL-1107,Riverside Smiles,email,Re: Online rescheduling?,"Following up on T-55102. Any update? Still getting 10+ voicemails a day to move appointments."
5
+ T-55231,2026-07-22,CL-1288,Pinecrest Dental,phone,Printer setup,"Appointment cards print on the wrong size paper since the update."
6
+ T-55267,2026-07-28,CL-1201,Lakeview Orthodontics,email,Patient self-service,"Parents keep asking for a link to reschedule. Can the confirmation email have a reschedule button?"
7
+ T-55310,2026-08-04,CL-1107,Riverside Smiles,chat,reschedule link,"Do you have a reschedule link we can send patients? Even just for cleanings."
8
+ T-55355,2026-08-11,CL-1122,Harbourside Dental Studio,email,SMS reminders built in?,"We pay for a separate SMS reminder tool. Do you have reminders by text built in? Also patients reply to the text asking to move and we never see it."
9
+ T-55402,2026-08-19,CL-1107,Riverside Smiles,email,Feature request: patients change own booking,"Raising again. Patients want to change their own booking. This is our number one ask."
10
+ T-55447,2026-08-26,CL-1219,Westbrook Dental,chat,Can patients reschedule themselves?,"Can patients reschedule themselves? Needs to not let them book over emergency slots."
11
+ T-55489,2026-09-02,CL-1288,Pinecrest Dental,email,Export appointments,"How do I export last month's appointments to a spreadsheet?"
12
+ T-55530,2026-09-10,CL-1201,Lakeview Orthodontics,email,Re: Patient self-service,"Any news on the reschedule button? Parents asking weekly."
13
+ T-55574,2026-09-18,CL-1043,Oakfield Family Dental,phone,No-show reminders,"Is there a way to automatically remind patients the day before? We don't have time to ring them all."
@@ -0,0 +1,13 @@
1
+ From: Dana Whitfield (VP Product, Chairside)
2
+ To: #product-chairside
3
+ Date: Mon 2 Nov 2026, 08:14
4
+
5
+ Morning all. Back from DentTech Expo. Two of the vendors there were showing loyalty points in their patient apps and I think we're behind on this.
6
+
7
+ Idea: patients earn points in the Chairside patient app for keeping appointments and for coming back for their six-monthly cleaning. Clinics can let them redeem points for something (whitening discount? priority booking? let the clinics decide).
8
+
9
+ I bet this cuts no-shows in half and gets more people back for recalls. Clinics will love it.
10
+
11
+ Can someone get a PRD going this week? I'd like design to start Monday. I'm a yes on this, no need to bring it back to me.
12
+
13
+ D.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "user-journey-map",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Map a customer's end-to-end journey toward an outcome — 3–6 stages, each with actions, emotions, pains, and opportunities, plus a rendered Mermaid emotion arc and the ranked pain points design should attack first. Use when the user wants a journey map, customer experience map, \"map the user's path through onboarding\", touchpoint analysis, or \"where do users feel friction\".",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },
@@ -11,5 +11,5 @@
11
11
  { "to": "success-metrics", "when": "the fix needs a measure before it is built", "purpose": "Design the measurement for the journey step being changed.", "fallback": "If success-metrics is absent, state one baseline and one target per fixed step inline." }
12
12
  ],
13
13
  "tags": ["journey-map", "customer-experience", "ux", "touchpoints", "mermaid", "personas"],
14
- "model": { "tier": "standard", "rationale": "Structured synthesis into a fixed four-row stage model plus bounded ranking judgment. Escalate via ambiguous-input when the persona or outcome is contested or research inputs conflict." }
14
+ "model": { "tier": "heavy", "rationale": "Measured (RFC-0073): on its held-out evals the heavy tier met 83% and 83% of checks in two tier trials, against standard's 75% and light's 67% and 75%, more than 5 points ahead both times." }
15
15
  }
@@ -34,6 +34,34 @@
34
34
  "Does not invent a decision or gather sources",
35
35
  "Says in plain words what it will produce once it has the decision"
36
36
  ]
37
+ },
38
+ {
39
+ "id": "research-trial-conversion-drop",
40
+ "held_out": "2026-11-04",
41
+ "prompt": "Research why trial-to-paid dropped in September. We have to decide by the 15th whether the onboarding email rebuild goes ahead of the pricing page A/B test on next quarter's roadmap, so I need to know which explanation actually holds up. Everything we've got is in sources/ (six files).",
42
+ "assertions": [
43
+ "Starts with a research plan tied to the roadmap decision in the prompt (onboarding email rebuild versus pricing page A/B test), with sub-questions and what finding would change the decision, before any synthesis",
44
+ "The synthesis cites a source for each claim and counts the growth recap (s6) once, as a repeat of the s1 figures rather than independent confirmation",
45
+ "Sets out rival explanations including at least onboarding email deliverability, the 15 September pricing page change, the Vantor free tier and seasonality",
46
+ "Ranks by contradicting evidence: the drop starts with the 31 Aug and 7 Sep cohorts, before the 15 Sep pricing change and the 10 Sep Vantor launch, the 21 Sep cohort recovers while both are still in place, and the 2025 September cohorts show no dip",
47
+ "Puts the broken DKIM on the onboarding emails (2 to 19 September) as the least-contradicted explanation, and names the missing join between email opens and conversion as the linchpin or the remaining check",
48
+ "Gives a G7 verdict that lets the answer go forward (such as PROCEED or PROCEED WITH CONDITIONS) rather than sending the work back",
49
+ "Does not invent figures not in the sources, such as revenue lost, conversion rates for users who did or did not open the emails, or a count of trial users who tried Vantor"
50
+ ]
51
+ },
52
+ {
53
+ "id": "research-ticket-spike-confounded",
54
+ "held_out": "2026-11-04",
55
+ "prompt": "Research what's behind the jump in support tickets since early October. Ops need to know by Monday whether to roll back the app 4.2 navigation or put temp staff on billing queries, we can't do both. Sources are in sources/. Just give me the answer.",
56
+ "assertions": [
57
+ "The plan ties the work to the rollback-versus-temp-staff decision and says what finding would favour each option, before any synthesis",
58
+ "The synthesis cites a source for each claim and notes that October tickets carry no topic tags because tagging stopped on 28 September",
59
+ "Treats the agent poll (5 against 4) as opinion, not as evidence that separates the two explanations",
60
+ "The comparison shows that the billing migration (live 5 October) and the 4.2 release (6 October) landed in the same week, and that 'where is my invoice' tickets and the October reviews fit both, so neither is clearly less contradicted",
61
+ "The G7 gate does not let the answer go forward as decided: it returns a send-back verdict (such as REVISE) rather than PROCEED",
62
+ "Names a specific observation that would tell the two apart, such as re-tagging a sample of October tickets by topic or comparing ticket rates for web-only customers (billing change, no app change) against app users",
63
+ "Does not invent a ticket breakdown by topic, a count of duplicate authorisations, or a cause the sources do not support"
64
+ ]
37
65
  }
38
66
  ]
39
67
  }
@@ -0,0 +1,15 @@
1
+ # Support ticket volume — weekly, from the helpdesk
2
+
3
+ Exported 2026-10-27. Brand: Ploverly (online invoicing for tradespeople; web app plus iOS and Android apps).
4
+
5
+ | Week starting | Tickets created |
6
+ |---|---|
7
+ | 7 Sep | 1,228 |
8
+ | 14 Sep | 1,251 |
9
+ | 21 Sep | 1,236 |
10
+ | 28 Sep | 1,247 |
11
+ | 5 Oct | 1,734 |
12
+ | 12 Oct | 1,812 |
13
+ | 19 Oct | 1,763 |
14
+
15
+ Note from the helpdesk admin: on 28 September the contact form was rebuilt and the "topic" dropdown was removed by mistake, so automatic topic tagging has not run on any ticket created since then. October tickets have no topic tags. Tickets do record the channel they came in on (web form, in-app, email), but the in-app form is the same in the web app and the mobile apps.
@@ -0,0 +1,11 @@
1
+ # Ploverly mobile 4.2 — release notes
2
+
3
+ Released Tuesday 6 October 2026 to 100% of iOS and Android users (no staged rollout).
4
+
5
+ - New bottom navigation bar replaces the side menu
6
+ - "Invoices" and "Payments" merged into one "Money" tab
7
+ - "Download invoice PDF" moved from the invoice screen into the "..." menu
8
+ - Dark mode
9
+ - Bug fixes
10
+
11
+ The web app was not changed in this release.
@@ -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.2",
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": "standard",
44
- "rationale": "Structured planning against a fixed shape (decision, sub-questions, methods, criteria, stopping rule); needs judgment to cut scope but no adversarial reasoning."
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.1",
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": "standard",
40
- "rationale": "Bounded synthesis over supplied text. The hard part is keeping outside knowledge out and checking the sources' own sums, which a mid-tier model does when told to."
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.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": "standard",
39
- "rationale": "Structured authoring against a fixed anatomy. The judgment is in the description and sibling boundaries, which the interview anchors; skill-review is the adversarial pass."
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/`