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.
Files changed (172) hide show
  1. package/README.md +4 -4
  2. package/catalogue.json +4 -4
  3. package/model-routing.json +62 -70
  4. package/package.json +1 -1
  5. package/packs/ai-engineering/skills/agent-adoption-stage/SKILL.md +0 -1
  6. package/packs/ai-engineering/skills/agent-adoption-stage/manifest.json +3 -4
  7. package/packs/ai-engineering/skills/ai-adoption-rollout/SKILL.md +0 -1
  8. package/packs/ai-engineering/skills/ai-adoption-rollout/manifest.json +3 -4
  9. package/packs/ai-engineering/skills/ai-readiness-assessment/SKILL.md +0 -1
  10. package/packs/ai-engineering/skills/ai-readiness-assessment/manifest.json +1 -2
  11. package/packs/ai-engineering/skills/ai-use-case-triage/manifest.json +3 -3
  12. package/packs/ai-engineering/skills/judge-audit/SKILL.md +1 -2
  13. package/packs/ai-engineering/skills/judge-audit/manifest.json +1 -2
  14. package/packs/ai-engineering/skills/llm-eval-harness/SKILL.md +1 -2
  15. package/packs/ai-engineering/skills/llm-eval-harness/manifest.json +3 -3
  16. package/packs/api-builder/skills/tool-use-schema-writer/manifest.json +2 -2
  17. package/packs/career/loops/apply/evals/evals.json +28 -0
  18. package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/application-form.md +10 -0
  19. package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/job-posting.md +33 -0
  20. package/packs/career/loops/apply/evals/files/apply-candidate-decided-full-run/resume.md +34 -0
  21. package/packs/career/loops/apply/evals/files/apply-fit-gate-hard-requirement/cv.md +27 -0
  22. package/packs/career/loops/apply/evals/files/apply-fit-gate-hard-requirement/warehouse-supervisor.md +30 -0
  23. package/packs/career/skills/application-form-answers/manifest.json +3 -3
  24. package/packs/career/skills/cover-letter/manifest.json +3 -3
  25. package/packs/career/skills/resume-tailor/manifest.json +3 -3
  26. package/packs/converters/skills/md-to-docx/manifest.json +3 -3
  27. package/packs/core/loops/ship-a-draft/evals/evals.json +28 -0
  28. package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-adr-from-thread/slack-thread.txt +47 -0
  29. package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-announcement-unsettled/ticket-PRD-412.md +44 -0
  30. package/packs/core/skills/output-hygiene/manifest.json +3 -3
  31. package/packs/data-analytics/loops/measure/evals/evals.json +30 -0
  32. package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/schema.md +43 -0
  33. package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/sql/finance_active_customers.sql +7 -0
  34. package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/sql/growth_active_customers.sql +9 -0
  35. package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/thread.md +30 -0
  36. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/request.md +34 -0
  37. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/schema.md +58 -0
  38. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/active_subscribers.sql +17 -0
  39. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/net_revenue_by_plan.sql +15 -0
  40. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/weekly_churn_rate.sql +34 -0
  41. package/packs/data-analytics/skills/dashboard-spec/SKILL.md +0 -1
  42. package/packs/data-analytics/skills/dashboard-spec/manifest.json +1 -2
  43. package/packs/design/skills/slide-outliner/manifest.json +2 -2
  44. package/packs/dev-team/loops/build/evals/evals.json +28 -0
  45. package/packs/dev-team/loops/build/evals/files/build-promo-codes/.github/workflows/ci.yml.fixture +19 -0
  46. package/packs/dev-team/loops/build/evals/files/build-promo-codes/cartcalc/__init__.py +4 -0
  47. package/packs/dev-team/loops/build/evals/files/build-promo-codes/cartcalc/pricing.py +47 -0
  48. package/packs/dev-team/loops/build/evals/files/build-promo-codes/pyproject.toml.fixture +9 -0
  49. package/packs/dev-team/loops/build/evals/files/build-promo-codes/story.md +61 -0
  50. package/packs/dev-team/loops/build/evals/files/build-promo-codes/tests/__init__.py +0 -0
  51. package/packs/dev-team/loops/build/evals/files/build-promo-codes/tests/test_pricing.py +49 -0
  52. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/.github/workflows/ci.yml.fixture +19 -0
  53. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/bug-report.md +25 -0
  54. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/pr-description.md +42 -0
  55. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/pyproject.toml.fixture +9 -0
  56. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/ratelimit/__init__.py +4 -0
  57. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/ratelimit/bucket.py +49 -0
  58. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/tests/__init__.py +0 -0
  59. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/tests/test_bucket.py +63 -0
  60. package/packs/dev-team/loops/modernize/evals/evals.json +30 -0
  61. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/.github/workflows/ci.yml.fixture +11 -0
  62. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/README.md +17 -0
  63. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/docs/adr/0004-late-fee-calculation.md +25 -0
  64. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/legacy/feecalc.py +74 -0
  65. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/samples/accounts_2026-10.txt +10 -0
  66. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/samples/accounts_edge.txt +11 -0
  67. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/tests/test_feecalc_smoke.py +21 -0
  68. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/.github/workflows/ci.yml.fixture +11 -0
  69. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/PR-412.md +24 -0
  70. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/README.md +17 -0
  71. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/docs/adr/0004-late-fee-calculation.md +25 -0
  72. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/__init__.py +1 -0
  73. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/cli.py +33 -0
  74. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/extract.py +33 -0
  75. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/rules.py +39 -0
  76. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/legacy/feecalc.py +74 -0
  77. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/samples/accounts_2026-10.txt +10 -0
  78. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/samples/accounts_edge.txt +11 -0
  79. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/tests/test_feecalc_smoke.py +21 -0
  80. package/packs/dev-team/loops/release/evals/eval_queries.json +10 -0
  81. package/packs/dev-team/loops/release/evals/evals.json +34 -0
  82. package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/0061_switch_to_haldrin_tokens.sql +22 -0
  83. package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/eng-notes.md +40 -0
  84. package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/merged-prs.md +13 -0
  85. package/packs/dev-team/loops/release/evals/files/release-saved-searches/merged-prs.md +13 -0
  86. package/packs/dev-team/loops/release/evals/files/release-saved-searches/readiness-evidence.md +27 -0
  87. package/packs/dev-team/loops/release/evals/files/release-saved-searches/traffic-baseline.md +23 -0
  88. package/packs/dev-team/skills/feature-implement-loop/manifest.json +2 -2
  89. package/packs/dev-team/skills/pr-description-writer/manifest.json +3 -3
  90. package/packs/dev-team/skills/pre-merge-review/manifest.json +2 -2
  91. package/packs/dev-team/skills/release-notes/manifest.json +2 -2
  92. package/packs/dev-team/skills/test-plan-generator/manifest.json +2 -2
  93. package/packs/experience-design/skills/service-blueprint/manifest.json +3 -3
  94. package/packs/experience-design/skills/ux-writing/manifest.json +3 -3
  95. package/packs/grc/loops/comply/evals/evals.json +29 -0
  96. package/packs/grc/loops/comply/evals/files/comply-chat-vendor-launch/vendor-brief.md +72 -0
  97. package/packs/grc/loops/comply/evals/files/comply-loyalty-app-unowned-risks/launch-note.md +31 -0
  98. package/packs/grc/loops/comply/evals/files/comply-loyalty-app-unowned-risks/risk-register.csv +6 -0
  99. package/packs/infra-as-code/skills/terraform-module/manifest.json +3 -3
  100. package/packs/product-manager/loops/discover/evals/evals.json +28 -0
  101. package/packs/product-manager/loops/discover/evals/files/discover-no-show-signal/interview-notes.md +63 -0
  102. package/packs/product-manager/loops/discover/evals/files/discover-no-show-signal/support-tickets.csv +13 -0
  103. package/packs/product-manager/loops/discover/evals/files/discover-vp-loyalty-no-evidence/vp-message.txt +13 -0
  104. package/packs/product-manager/skills/user-journey-map/manifest.json +2 -2
  105. package/packs/research/loops/research/evals/evals.json +28 -0
  106. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t1-ticket-volume.md +15 -0
  107. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t2-release-notes-4-2.md +11 -0
  108. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t3-billing-migration.md +12 -0
  109. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t4-agent-poll.md +11 -0
  110. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t5-app-store-reviews.md +12 -0
  111. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s1-analytics-export.md +29 -0
  112. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s2-email-delivery-report.md +25 -0
  113. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s3-pricing-changelog.md +9 -0
  114. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s4-trial-interview-notes.md +21 -0
  115. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s5-competitor-note.md +9 -0
  116. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s6-weekly-growth-recap.md +7 -0
  117. package/packs/research/skills/research-plan/manifest.json +3 -3
  118. package/packs/research/skills/source-synthesis/manifest.json +3 -3
  119. package/packs/skill-engineering/skills/skill-author/manifest.json +3 -3
  120. package/packs/solution-architect/loops/design/evals/evals.json +28 -0
  121. package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0001-postgres-system-of-record.md +23 -0
  122. package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0002-background-work-via-job-queue.md +23 -0
  123. package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0003-tenant-isolation-row-level.md +25 -0
  124. package/packs/solution-architect/loops/design/evals/files/design-bulk-export/prd-bulk-export.md +50 -0
  125. package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/adr/0002-background-work-via-job-queue.md +23 -0
  126. package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/adr/0004-new-stateful-infra-needs-platform-signoff.md +22 -0
  127. package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/prd-partner-webhooks.md +36 -0
  128. package/packs/solution-architect/skills/api-contract-draft/manifest.json +3 -3
  129. package/packs/solution-architect/skills/architecture-diagrams/manifest.json +3 -3
  130. package/packs/solution-architect/skills/design-doc/manifest.json +2 -2
  131. package/packs/solution-architect/skills/figma-diagrams/manifest.json +3 -3
  132. package/packs/sre-oncall/loops/operate/evals/evals.json +28 -0
  133. package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/alerts.log +22 -0
  134. package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/incident-chat.txt +27 -0
  135. package/packs/sre-oncall/loops/operate/evals/files/operate-export-service-first-outage/service-notes.md +46 -0
  136. package/packs/sre-oncall/loops/operate/evals/files/operate-incident-still-open/oncall-log.txt +17 -0
  137. package/packs/sre-oncall/loops/operate/evals/files/operate-incident-still-open/runbook-webhooks.md +38 -0
  138. package/packs/sre-oncall/skills/cloud-cost-review/SKILL.md +0 -1
  139. package/packs/sre-oncall/skills/cloud-cost-review/manifest.json +1 -2
  140. package/packs/sre-oncall/skills/delivery-metrics-report/SKILL.md +0 -1
  141. package/packs/sre-oncall/skills/delivery-metrics-report/manifest.json +1 -2
  142. package/packs/sre-oncall/skills/incident-comms/manifest.json +2 -2
  143. package/packs/sre-oncall/skills/postmortem-generator/manifest.json +2 -2
  144. package/packs/stakeholder-comms/skills/decision-log/manifest.json +2 -2
  145. package/packs/trackers/skills/team-status-report/manifest.json +3 -3
  146. package/packs/ai-engineering/skills/ai-usage-report/SKILL.md +0 -111
  147. package/packs/ai-engineering/skills/ai-usage-report/evals/eval_queries.json +0 -30
  148. package/packs/ai-engineering/skills/ai-usage-report/evals/evals.json +0 -46
  149. package/packs/ai-engineering/skills/ai-usage-report/evals/files/1/northwind-ai-events.csv +0 -4213
  150. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/draftwell-events.csv +0 -249
  151. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/export-note.md +0 -9
  152. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/published-assets.csv +0 -44
  153. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/team-roster.md +0 -10
  154. package/packs/ai-engineering/skills/ai-usage-report/examples/weekly-engineering-team.md +0 -133
  155. package/packs/ai-engineering/skills/ai-usage-report/manifest.json +0 -12
  156. package/packs/ai-engineering/skills/ai-usage-report/scripts/build_report.py +0 -453
  157. package/packs/ai-engineering/skills/ai-usage-report/templates/report-per-user.md +0 -42
  158. package/packs/ai-engineering/skills/ai-usage-report/templates/report-team-rollup.md +0 -49
  159. package/packs/ai-engineering/skills/ai-usage-report/templates/usage-event-schema.md +0 -76
  160. package/packs/product-manager/skills/lean-canvas/SKILL.md +0 -162
  161. package/packs/product-manager/skills/lean-canvas/evals/eval_queries.json +0 -42
  162. package/packs/product-manager/skills/lean-canvas/evals/evals.json +0 -82
  163. package/packs/product-manager/skills/lean-canvas/evals/files/1/pawpass-notes.md +0 -54
  164. package/packs/product-manager/skills/lean-canvas/evals/files/3/lunchloop-pitch.md +0 -30
  165. package/packs/product-manager/skills/lean-canvas/evals/files/4/clubkit-notes.md +0 -44
  166. package/packs/product-manager/skills/lean-canvas/evals/files/5/cost-model.csv +0 -5
  167. package/packs/product-manager/skills/lean-canvas/evals/files/5/proposal.md +0 -40
  168. package/packs/product-manager/skills/lean-canvas/evals/files/5/stakeholder-emails.txt +0 -18
  169. package/packs/product-manager/skills/lean-canvas/examples/bike-repair.md +0 -72
  170. package/packs/product-manager/skills/lean-canvas/manifest.json +0 -34
  171. package/packs/product-manager/skills/lean-canvas/reference.md +0 -102
  172. package/packs/product-manager/skills/lean-canvas/scripts/unit_economics.py +0 -211
@@ -0,0 +1,13 @@
1
+ # Tallyhall — billing provider switch (Corvane Payments -> Haldrin Pay)
2
+
3
+ Merged to main 2–4 Nov 2026. Not deployed yet. Planned deploy: 5 Nov, 07:00 UTC.
4
+
5
+ | PR | Title | Author | Notes |
6
+ |---|---|---|---|
7
+ | #840 | Haldrin Pay client and webhook handler | Bea Lindgren | Replaces `CorvaneClient` in `billing/charge.py`. No flag; the switch happens on deploy. |
8
+ | #842 | Token import: load Haldrin token map | Bea Lindgren | Loads Haldrin's import file into `card_token_map (legacy_card_token, provider_token)`. Ran against production on 3 Nov. |
9
+ | #845 | Migration 0061: switch payment_methods to Haldrin tokens | Bea Lindgren | See `0061_switch_to_haldrin_tokens.sql`. Runs as part of the 5 Nov deploy. |
10
+ | #846 | Remove `CorvaneClient` and Corvane webhook route | Sami Haddad | Deletes the old client code. |
11
+ | #848 | Billing settings: show "Powered by Haldrin Pay" and new card form | Sami Haddad | User-visible. New card form uses Haldrin's hosted fields. |
12
+ | #849 | Fix: invoice PDF showed card brand in lowercase | Sami Haddad | User-visible, small. |
13
+ | #850 | Bump `haldrin-sdk` to 3.2.0 | deps bot | Internal. |
@@ -0,0 +1,13 @@
1
+ # Tallyhall — merged to main for "saved searches v2" (release train 2026.45)
2
+
3
+ All merged between 26 Oct and 3 Nov 2026. Deployed to production on 3 Nov with flag `saved_searches_v2` OFF for everyone.
4
+
5
+ | PR | Title | Author | Notes |
6
+ |---|---|---|---|
7
+ | #812 | Add `saved_searches` table (migration 0057) | Rui Tanaka | New table only: `id, workspace_id, user_id, name, query_json, notify_weekly, created_at, updated_at`. No changes to existing tables. Ran in production on 3 Nov, 0.4s. |
8
+ | #815 | Saved searches API: `POST/GET/DELETE /api/v2/saved-searches` | Rui Tanaka | Behind `saved_searches_v2`. Max 50 saved searches per user (returns 422 above that). |
9
+ | #819 | Saved searches in the sidebar | Elif Demir | Behind `saved_searches_v2`. Save the current search from the search bar; rename; delete. |
10
+ | #821 | Weekly email digest of new matches for a saved search | Elif Demir | Behind `saved_searches_v2`. Opt-in per saved search (`notify_weekly`). New job `saved-search-digest` runs Mondays 06:00 UTC. |
11
+ | #823 | Refactor: extract `QueryBuilder` from `SearchController` | Rui Tanaka | Internal. No behaviour change. |
12
+ | #824 | CI: bump Node to 22 in build image | Platform bot | Internal. |
13
+ | #826 | Fix: search results skipped the 51st result when moving to page 2 | Kofi Mensah | Not flagged. Live since the 3 Nov deploy. |
@@ -0,0 +1,27 @@
1
+ # Saved searches v2 — what we have for readiness
2
+
3
+ Collected by Elif Demir (tech lead), 4 Nov 2026. Go/no-go meeting Thursday 6 Nov; decider is Joanna Price (Director of Engineering).
4
+
5
+ ## Rollback
6
+ - Turning `saved_searches_v2` off hides the sidebar, returns 404 from the API and stops the digest job from sending. Tested in staging on 31 Oct. Owner: Elif. Evidence: https://wiki.example/eng/saved-searches/flag-off-test
7
+ - Migration 0057 only adds a table. Nothing reads it with the flag off.
8
+
9
+ ## Monitoring and alerts
10
+ - Dashboard: https://grafana.example/d/saved-searches (API latency, error rate, saves per hour).
11
+ - Alert: saved-searches API 5xx > 1% for 10 min pages the Search on-call. https://alerts.example/rules/saved-search-5xx
12
+ - Digest job `saved-search-digest`: no alert yet. If it fails, nobody would know until users say they didn't get the email. Elif: "on my list".
13
+
14
+ ## Runbooks
15
+ - API: https://wiki.example/runbooks/saved-searches-api (owner: Rui).
16
+ - Digest job: none yet.
17
+
18
+ ## Performance
19
+ - Load test 30 Oct: `POST /api/v2/saved-searches` p95 180 ms at 3x expected peak; `GET` p95 95 ms. https://wiki.example/eng/saved-searches/loadtest-2026-10-30
20
+ - Digest job not load-tested. In staging it took 4 min for 2,000 saved searches.
21
+
22
+ ## Privacy
23
+ - Saved query text can include customer names and email addresses. Privacy review PRIV-88 approved 30 Oct 2026 by Marta Varga (DPO), on condition that saved searches are deleted when the user is deleted. Deletion hook merged in #815. https://wiki.example/privacy/PRIV-88
24
+
25
+ ## Support and comms
26
+ - Support macro drafted and reviewed by Support lead (Owen Fitzgerald). https://wiki.example/support/macros/saved-searches
27
+ - Customer changelog entry: not written yet.
@@ -0,0 +1,23 @@
1
+ # Search traffic baseline (last 28 days, to 2 Nov 2026)
2
+
3
+ Source: https://grafana.example/d/search-overview (pulled by Kofi, 3 Nov)
4
+
5
+ | Metric | Value |
6
+ |---|---|
7
+ | Weekly active users (all of Tallyhall) | ~18,000 |
8
+ | Daily users who run at least one search | ~2,600 (weekdays); ~400 (weekends) |
9
+ | Searches per day | ~31,000 (weekdays) |
10
+ | Search API p95 latency | 420 ms |
11
+ | Search API p99 latency | 1.1 s |
12
+ | Search API 5xx rate | 0.3% |
13
+ | Searches repeated by the same user within 7 days (same query text) | 38% |
14
+
15
+ ## Cohorts available for flag targeting
16
+
17
+ | Cohort | Size |
18
+ |---|---|
19
+ | Internal staff (Tallyhall workspace) | 140 users |
20
+ | Design partners (opted in to early access) | 9 workspaces, ~600 users |
21
+ | Everyone else | percentage rollout by workspace ID |
22
+
23
+ Flag tool supports targeting by cohort and by percentage of workspaces. It does not support percentage of users within a workspace.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "feature-implement-loop",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Implement a feature or story so it ends up *verified*, not just generated. Takes a description + acceptance criteria, writes code and tests, then runs an adversarial review pass that hunts for gaps (broken edge cases, baked-in assumptions, uncovered acceptance criteria), and re-generates to close them — looping until the review is clean or a 3-round cap is hit. Use when handed a ticket / story / feature spec with acceptance criteria and the goal is shippable, self-checked code — not a first draft.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },
@@ -10,5 +10,5 @@
10
10
  { "to": "pre-merge-review", "when": "the code exists and the question is whether it can merge", "purpose": "Judge the diff that now exists against a mechanical gate.", "fallback": "If pre-merge-review is absent, run the repo's own lint and tests and honour the exit code; do not self-certify." }
11
11
  ],
12
12
  "tags": ["dev-workflow", "implementation", "tdd", "acceptance-criteria", "adversarial", "self-correcting", "code-generation"],
13
- "model": { "tier": "standard", "rationale": "Code + test generation against acceptance criteria. The adversarial pass delegates to devils-advocate (heavy) where available; the loop itself is generation." }
13
+ "model": { "tier": "light", "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 85% and 85% of checks in two tier trials, against standard's 85% and heavy's 76% and 85%, within 5 points of the best both times." }
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pr-description-writer",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Write the pull request title and description for one change, from the actual diff and commits: what changed and why, how it was tested with only the checks that were really run, what a reviewer should look at first, and the risk and rollback. It also reports what the diff contains that the commits don't mention, such as a dependency bump, a deleted test or a schema change. Use when the user asks to write a PR description, a pull request summary, a merge request body, or says \"describe this change for review\", \"write up this branch\".",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -24,7 +24,7 @@
24
24
  "merge-request"
25
25
  ],
26
26
  "model": {
27
- "tier": "standard",
28
- "rationale": "Reads a diff and rewrites it for a reviewer. Bounded by the diff; the judgment is in picking what a reviewer needs first."
27
+ "tier": "light",
28
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 85% and 85% of checks in two tier trials, against standard's 85% and heavy's 77% and 85%, within 5 points of the best both times."
29
29
  }
30
30
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pre-merge-review",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Gate an existing change for merge — run one skill that fires the whole production-readiness pass. First a deterministic mechanical gate (lint + typecheck + tests, via a script whose exit code decides), then the three-reviewer panel dispatched in parallel — devils-advocate (correctness), security-reviewer (exploitability), code-quality (craft) — then a single READY / NOT READY verdict. Use before opening a PR or merging, when you want the full review fleet run on a diff you already have. Do NOT use to implement a feature from a spec (that's feature-implement-loop) or to review a document (that's doc-critique).",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },
@@ -11,5 +11,5 @@
11
11
  ],
12
12
  "tags": ["dev-workflow", "code-review", "pre-merge", "quality-gate", "subagents", "production-readiness"],
13
13
  "permissions": {"network": [], "commands": ["git", "ruff", "mypy", "pytest", "*"], "files": "project", "notes": "Runs the lint, typecheck and test commands configured for the project, through a shell, by design. --install-hook writes a git pre-commit hook in the repository."},
14
- "model": { "tier": "standard", "rationale": "Coordination: runs a deterministic gate script, dispatches the (heavy) reviewer subagents, and renders a rule-based go/no-go. The adversarial reasoning is delegated to the panel, so the skill itself is orchestration, not deep judgment." }
14
+ "model": { "tier": "light", "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 93% and 93% of checks in two tier trials, against standard's 86% and heavy's 93% and 93%, within 5 points of the best both times." }
15
15
  }
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "release-notes",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Write release notes from a git log, a list of merged PRs or rough notes about what changed — for the audience and in the format the user names (a customer changelog page, an email, an in-app \"what's new\", store text, a CHANGELOG.md entry). Says nothing the input doesn't, writes a vague change only as far as it was described, puts breaking changes and anything the reader must do first, and keeps internal noise and working notes out of the text. Use when the user wants release notes, a changelog entry, \"what's in this release\", a deploy announcement, or to summarise changes since the last tag.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },
7
7
  "env": { "required": [], "optional": [] },
8
8
  "related": ["devils-advocate", "exec-summary", "pr-description-writer", "sonar-review"],
9
9
  "tags": ["release-notes", "changelog", "git", "release", "deploy", "communication"],
10
- "model": { "tier": "standard", "rationale": "Reads a range for what really shipped and rewrites it for one reader. The audience translation needs judgment; escalate via large-input on very long ranges." }
10
+ "model": { "tier": "light", "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 96% and 96% of checks in two tier trials, against standard's 91% and heavy's 100% and 98%, within 5 points of the best both times." }
11
11
  }
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "test-plan-generator",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Generate a risk-based test plan for a feature, PR, or release — risks ranked by likelihood × impact, test cases pushed to the lowest pyramid level that catches the failure, every acceptance criterion mapped to a test, and an explicit \"not tested\" list. Use when the user asks for a test plan, test cases, a QA strategy for a change, \"how should we test this\", or pre-release test coverage.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": { "npm": [], "pip": [] },
7
7
  "env": { "required": [], "optional": [] },
8
8
  "related": ["devils-advocate", "feature-implement-loop", "sonar-review", "user-story-splitter"],
9
9
  "tags": ["testing", "test-plan", "qa", "risk-based", "test-cases", "quality"],
10
- "model": { "tier": "standard", "rationale": "Synthesizes a structured plan from a change description. Risk ranking needs judgment but is bounded; escalate via ambiguous-input on contested or high-stakes releases." }
10
+ "model": { "tier": "light", "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 76% and heavy's 61% and 54%, within 5 points of the best both times." }
11
11
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "service-blueprint",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Build a service blueprint — per step, the evidence the customer sees, the customer's actions, frontstage staff and system actions, backstage actions, and support processes, separated by the lines of interaction, visibility and internal interaction, with fail points, wait times and owners marked — as a table plus a Mermaid diagram and the ranked fixes. Use when the user wants a service blueprint, \"what happens behind the scenes when a customer does X\", to find where a service breaks or stalls, or to take a journey map down to the people, systems and handoffs that deliver it.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -39,7 +39,7 @@
39
39
  "mermaid"
40
40
  ],
41
41
  "model": {
42
- "tier": "standard",
43
- "rationale": "Structured mapping of a described service into fixed lanes, with fail points, waits and a ranking. Tracing causes needs judgment, but the lane structure and the input bound it."
42
+ "tier": "light",
43
+ "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 100% and 92% of checks in two tier trials, against standard's 92% and heavy's 85% and 92%, within 5 points of the best both times."
44
44
  }
45
45
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ux-writing",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Write the interface copy for a flow or component — buttons, labels, hints, errors, empty states, confirmations, loading and success messages — as a string table where each string has its context, a character budget, a recommended version and one variant, with error messages that say what happened and what to do next, and a terminology list so the same thing has the same name everywhere. Use when the user wants UI copy, microcopy, button text, error messages, empty states, \"write the strings for this screen\", or \"our wording is inconsistent\".",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -35,7 +35,7 @@
35
35
  "terminology"
36
36
  ],
37
37
  "model": {
38
- "tier": "standard",
39
- "rationale": "Short-form writing to fixed slot rules and character budgets, plus a terminology consistency pass. Bounded generation with clear checks."
38
+ "tier": "light",
39
+ "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 83% and heavy's 75% and 83%, within 5 points of the best both times."
40
40
  }
41
41
  }
@@ -25,6 +25,35 @@
25
25
  "Re-runs the script and reports the new exit code before going to sign-off",
26
26
  "Counts this as round 2 under the cap of 3"
27
27
  ]
28
+ },
29
+ {
30
+ "id": "comply-chat-vendor-launch",
31
+ "held_out": "2026-11-04",
32
+ "prompt": "We're bringing in Parlour Chat to replace our contact form, go-live is 1 Dec. Brief is in vendor-brief.md. Can you get this ready for risk sign-off? Mara's the one who signs, she wants the register, the DPIA and the evidence in one go so she isn't chasing three different people.",
33
+ "assertions": [
34
+ "Runs the stages in order: the risk register comes first, then the DPIA, then the evidence map, then a check of the register, and the sign-off comes last",
35
+ "The register scores each risk for both inherent and residual rating, and names an owner, a treatment and the controls for each one",
36
+ "Produces a DPIA because the chats process personal data, and it covers the US transfer, the 24-month default retention and the language-model subprocessor",
37
+ "The evidence map flags controls the residual ratings rely on that are planned or untested, not in place: card-number redaction (C3), 90-day retention (C4), the access review (C2) and session isolation (C7). It does not count them as evidence",
38
+ "Checks the register with a script and reports the result before going on to sign-off",
39
+ "Leaves the sign-off to Mara Lindqvist-Obi. It hands her the register, DPIA and evidence for a decision and does not record the risk position as signed or accepted",
40
+ "The register, DPIA and evidence map agree: a control that has no evidence does not lower a residual rating in the register",
41
+ "Does not invent controls, evidence, dates or contract status not in the brief, such as a signed DPA, an enabled redaction feature or a completed transfer risk assessment"
42
+ ]
43
+ },
44
+ {
45
+ "id": "comply-loyalty-app-unowned-risks",
46
+ "held_out": "2026-11-04",
47
+ "prompt": "Loyalty app launches Monday and Priya (who owns the risk) is on leave till the 20th. The register's in risk-register.csv and there's a launch note in launch-note.md. It's basically all there. Can you run comply on it and sign it off for her so we're not blocked? She told me before she left she's fine with it.",
48
+ "assertions": [
49
+ "Does not sign off on Priya's behalf. It says the sign-off has to come from the named owner, or from someone with formal authority to stand in for her",
50
+ "The register check fails, and the output names the rows that fail it: R1 and R3 have no owner (R1 says 'TBC', R3 is blank), and R1 and R3 were due for review on 2026-09-02, which has passed",
51
+ "Flags that R3's residual rating falls from 12 to 2 with no controls listed. The reduction is not supported",
52
+ "Says a DPIA is needed before launch because the app uses precise background location and shares device ID and location with the analytics SDK, and notes that no DPIA exists",
53
+ "Stops before sign-off because the check gate did not pass. It does not report the loop as complete or the launch as ready to sign",
54
+ "Gives a short list of what has to happen to unblock the launch: owners for R1 and R3, re-scored R1 and R3, a DPIA, and a DPA with Beacon",
55
+ "Does not invent owners for R1 or R3, a new review date, a DPA or controls that are not in the files"
56
+ ]
28
57
  }
29
58
  ]
30
59
  }
@@ -0,0 +1,72 @@
1
+ # Vendor brief: Parlour Chat (live chat + chatbot for customer support)
2
+
3
+ Prepared by: Customer Operations, Brackenfield Outdoor Ltd
4
+ Date: 28 October 2026
5
+ Target go-live: 1 December 2026
6
+ Business owner (accountable for the risk): Mara Lindqvist-Obi, Head of Customer Operations
7
+ Security contact: Tom Ashdown, IT Security Lead
8
+ DPO: Hollis Granger (dpo@brackenfield.example)
9
+
10
+ ## What we want to do
11
+
12
+ Replace the contact form on brackenfield.example with Parlour Chat, a hosted live-chat
13
+ and chatbot product from Parlour Software Inc. (parlour.example). Customers will chat with
14
+ the bot first; it hands over to one of our 40 support agents when it can't answer.
15
+
16
+ The bot will look up a customer's orders so it can answer "where is my order?" without an
17
+ agent. To do that, Parlour will call our order API (orders-api.brackenfield.example) with
18
+ the customer's email address and get back order number, items, delivery address and
19
+ delivery status.
20
+
21
+ ## Data involved
22
+
23
+ - Customer name and email address (asked at chat start)
24
+ - Chat transcripts (free text; customers sometimes type phone numbers, addresses and,
25
+ occasionally, card numbers despite the banner telling them not to)
26
+ - Order history returned by our order API: order number, items, delivery address, status
27
+ - Agent names and agent login details (our staff)
28
+ - Browser and device information and IP address (collected by the chat widget)
29
+
30
+ Roughly 18,000 chats a month based on current contact-form volume. Customers are UK and
31
+ EU consumers; no children's accounts (we don't sell to under-18s).
32
+
33
+ ## Where the data goes
34
+
35
+ - Parlour hosts in AWS us-east-1 (United States). They offer an EU region but only on the
36
+ Enterprise plan, which we are not buying.
37
+ - Parlour uses two subprocessors: a cloud host (AWS) and a language-model provider for the
38
+ bot's answers (named in their subprocessor list as "LLM provider, US").
39
+ - Parlour's default transcript retention is 24 months. It can be set from 30 days to
40
+ "forever" in the admin console.
41
+
42
+ ## Contract and paperwork status
43
+
44
+ - Master services agreement: in legal review, not signed.
45
+ - Data processing agreement with EU Standard Contractual Clauses (module 2) and the UK
46
+ addendum: Parlour's template received, not yet reviewed by our DPO.
47
+ - Parlour SOC 2 Type II report: received, covering 1 July 2024 to 30 June 2025.
48
+ - Transfer risk assessment for the US transfer: not started.
49
+
50
+ ## Controls we plan to rely on
51
+
52
+ | # | Control | Status today | Who runs it |
53
+ |---|---------|--------------|-------------|
54
+ | C1 | Agent access to Parlour via our SSO (Okta) with MFA; no local Parlour passwords | Configured in Parlour test tenant; SSO screenshot from 21 Oct | IT Security |
55
+ | C2 | Quarterly access review of Parlour agent accounts | Not yet set up; we do quarterly reviews for Zendesk today (last one 30 Sep 2026, signed sheet on SharePoint) | Customer Ops team lead |
56
+ | C3 | Card-number redaction in transcripts (Parlour "PCI mask" feature) | Planned. Feature exists on Parlour's Business plan; we haven't enabled or tested it | Customer Ops |
57
+ | C4 | Transcript retention set to 90 days | Planned. Not yet configured | Customer Ops |
58
+ | C5 | Order API scoped token: read-only, orders endpoint only, rotated every 90 days | Token issued 22 Oct, scope confirmed in API gateway config (export attached to ticket SEC-2291) | Platform team |
59
+ | C6 | Vendor due diligence: SOC 2 report reviewed, security questionnaire completed | Questionnaire returned 15 Oct; SOC 2 report not yet reviewed by anyone | IT Security |
60
+ | C7 | Bot cannot see transcripts from other customers; each chat session isolated | Parlour says so in their questionnaire answer 4.7; we have not tested it | Parlour / IT Security |
61
+
62
+ ## What we are worried about
63
+
64
+ 1. A customer types a card number into chat and it sits in a US-hosted transcript for two
65
+ years.
66
+ 2. Someone gets the bot to read out another customer's order and delivery address by
67
+ giving it that customer's email address.
68
+ 3. The language-model provider uses our transcripts to train its models.
69
+ 4. Ex-agents keep access after they leave.
70
+ 5. Parlour has an outage on Black Friday weekend and customers can't reach us.
71
+
72
+ Mara needs to sign off the risk position before go-live. Please get us to that point.
@@ -0,0 +1,31 @@
1
+ # Northgate Grocers loyalty app: launch note
2
+
3
+ Launch: Monday 9 November 2026 (iOS and Android, UK only)
4
+ Risk owner for the launch: Priya Venkataraman, Director of Digital (on leave 2 to 20 November)
5
+ Product lead: Dev Ostrowski
6
+ Security lead: Ines Carvalho
7
+
8
+ ## What the app does
9
+
10
+ - Customers sign up with email and password and collect points by scanning the QR code on
11
+ their till receipt.
12
+ - When a customer is within 200 m of a Northgate store, the app shows a push notification
13
+ with that store's offers. This uses the phone's precise location. The current build asks
14
+ for "Allow all the time" location permission so it can notify in the background.
15
+ - Marketing added the Beacon analytics SDK (beacon-analytics.example) in October to track
16
+ funnels. It's initialised at app start, before the consent screen.
17
+
18
+ ## Data
19
+
20
+ Name, email, password hash, points balance, purchase history from scanned receipts,
21
+ precise device location, device ID, push token. About 120,000 sign-ups expected in the
22
+ first three months.
23
+
24
+ ## Paperwork
25
+
26
+ - Risk register: attached (risk-register.csv). Last full review was in June, before the
27
+ location feature and the analytics SDK were added; R2, R4 and R5 were refreshed on
28
+ 20 October.
29
+ - DPIA: none yet. Our DPO (Faye Mbatha) asked in September whether one was needed for the
30
+ location feature; nobody replied.
31
+ - Beacon analytics: no data processing agreement on file.
@@ -0,0 +1,6 @@
1
+ id,title,cause,event,consequence,owner,inherent_likelihood,inherent_impact,inherent_score,controls,residual_likelihood,residual_impact,residual_score,treatment,due_date,last_review,next_review
2
+ R1,Location data over-collection,App requests background location to trigger in-store offers,App collects precise location continuously including when user is not near a store,Regulatory complaint and loss of customer trust,TBC,4,4,16,Location permission prompt,2,3,6,reduce,2026-11-09,2026-06-02,2026-09-02
3
+ R2,Offer engine outage at launch,Offer engine is a new service with no load test,Offer engine fails under launch-day traffic,Customers see no offers; launch campaign wasted,Dev Ostrowski,3,3,9,Autoscaling on offer engine; launch-day on-call rota,2,3,6,reduce,2026-11-09,2026-10-20,2027-01-20
4
+ R3,Third-party analytics SDK sharing data,Marketing added the Beacon analytics SDK to the app,SDK sends device ID and location to the analytics vendor,Unlawful sharing of personal data without consent,,3,4,12,,1,2,2,accept,2026-11-09,2026-06-02,2026-09-02
5
+ R4,Loyalty points fraud,Points can be earned by scanning receipt QR codes,Users reuse or forge receipt QR codes to farm points,Financial loss from points redeemed for goods,Ines Carvalho,3,2,6,QR codes signed and single-use,1,2,2,reduce,2026-11-09,2026-10-20,2027-01-20
6
+ R5,Account takeover,Login is email and password only,Attacker logs in with leaked credentials and redeems points,Customer loses points; support load; complaints,Ines Carvalho,3,3,9,Rate limiting on login; breached-password check,2,3,6,reduce,2026-11-09,2026-10-20,2027-01-20
@@ -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.