skilldrop-cli 1.3.0 → 1.5.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 (200) hide show
  1. package/README.md +10 -10
  2. package/bin/skilldrop.js +15 -10
  3. package/catalogue.json +8 -4
  4. package/contracts/catalogue.schema.json +2 -1
  5. package/model-routing.json +70 -78
  6. package/package.json +1 -1
  7. package/packs/ai-engineering/skills/agent-adoption-stage/SKILL.md +0 -1
  8. package/packs/ai-engineering/skills/agent-adoption-stage/manifest.json +3 -4
  9. package/packs/ai-engineering/skills/ai-adoption-rollout/SKILL.md +0 -1
  10. package/packs/ai-engineering/skills/ai-adoption-rollout/manifest.json +3 -4
  11. package/packs/ai-engineering/skills/ai-readiness-assessment/SKILL.md +0 -1
  12. package/packs/ai-engineering/skills/ai-readiness-assessment/manifest.json +1 -2
  13. package/packs/ai-engineering/skills/ai-use-case-triage/manifest.json +3 -3
  14. package/packs/ai-engineering/skills/judge-audit/SKILL.md +29 -13
  15. package/packs/ai-engineering/skills/judge-audit/evals/evals.json +30 -0
  16. package/packs/ai-engineering/skills/judge-audit/evals/files/12/judge_runs.csv +241 -0
  17. package/packs/ai-engineering/skills/judge-audit/evals/files/12/rosa_labels.csv +33 -0
  18. package/packs/ai-engineering/skills/judge-audit/evals/files/13/moderation_eval.csv +601 -0
  19. package/packs/ai-engineering/skills/judge-audit/manifest.json +2 -3
  20. package/packs/ai-engineering/skills/llm-eval-harness/SKILL.md +1 -2
  21. package/packs/ai-engineering/skills/llm-eval-harness/manifest.json +3 -3
  22. package/packs/ai-engineering/skills/mcp-pairing/manifest.json +1 -1
  23. package/packs/ai-engineering/skills/mcp-pairing/reference.md +4 -3
  24. package/packs/ai-engineering/skills/subagent-design/SKILL.md +1 -0
  25. package/packs/ai-engineering/skills/subagent-design/examples/help-center-localization.md +146 -0
  26. package/packs/ai-engineering/skills/subagent-design/manifest.json +2 -2
  27. package/packs/api-builder/skills/prompt-caching-advisor/SKILL.md +4 -0
  28. package/packs/api-builder/skills/prompt-caching-advisor/examples/support-bot-block-order.md +120 -0
  29. package/packs/api-builder/skills/prompt-caching-advisor/manifest.json +2 -2
  30. package/packs/api-builder/skills/tool-use-schema-writer/manifest.json +2 -2
  31. package/packs/career/skills/application-form-answers/manifest.json +3 -3
  32. package/packs/career/skills/cover-letter/manifest.json +3 -3
  33. package/packs/career/skills/resume-tailor/manifest.json +3 -3
  34. package/packs/converters/skills/md-to-docx/manifest.json +3 -3
  35. package/packs/core/loops/ship-a-draft/evals/evals.json +28 -0
  36. package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-adr-from-thread/slack-thread.txt +47 -0
  37. package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-announcement-unsettled/ticket-PRD-412.md +44 -0
  38. package/packs/core/skills/output-hygiene/manifest.json +3 -3
  39. package/packs/data-analytics/loops/measure/evals/evals.json +30 -0
  40. package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/schema.md +43 -0
  41. package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/sql/finance_active_customers.sql +7 -0
  42. package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/sql/growth_active_customers.sql +9 -0
  43. package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/thread.md +30 -0
  44. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/request.md +34 -0
  45. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/schema.md +58 -0
  46. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/active_subscribers.sql +17 -0
  47. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/net_revenue_by_plan.sql +15 -0
  48. package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/weekly_churn_rate.sql +34 -0
  49. package/packs/data-analytics/skills/dashboard-spec/SKILL.md +0 -1
  50. package/packs/data-analytics/skills/dashboard-spec/manifest.json +1 -2
  51. package/packs/design/skills/slide-outliner/manifest.json +2 -2
  52. package/packs/dev-team/loops/build/evals/evals.json +28 -0
  53. package/packs/dev-team/loops/build/evals/files/build-promo-codes/.github/workflows/ci.yml.fixture +19 -0
  54. package/packs/dev-team/loops/build/evals/files/build-promo-codes/cartcalc/__init__.py +4 -0
  55. package/packs/dev-team/loops/build/evals/files/build-promo-codes/cartcalc/pricing.py +47 -0
  56. package/packs/dev-team/loops/build/evals/files/build-promo-codes/pyproject.toml.fixture +9 -0
  57. package/packs/dev-team/loops/build/evals/files/build-promo-codes/story.md +61 -0
  58. package/packs/dev-team/loops/build/evals/files/build-promo-codes/tests/__init__.py +0 -0
  59. package/packs/dev-team/loops/build/evals/files/build-promo-codes/tests/test_pricing.py +49 -0
  60. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/.github/workflows/ci.yml.fixture +19 -0
  61. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/bug-report.md +25 -0
  62. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/pr-description.md +42 -0
  63. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/pyproject.toml.fixture +9 -0
  64. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/ratelimit/__init__.py +4 -0
  65. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/ratelimit/bucket.py +49 -0
  66. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/tests/__init__.py +0 -0
  67. package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/tests/test_bucket.py +63 -0
  68. package/packs/dev-team/loops/modernize/evals/evals.json +30 -0
  69. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/.github/workflows/ci.yml.fixture +11 -0
  70. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/README.md +17 -0
  71. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/docs/adr/0004-late-fee-calculation.md +25 -0
  72. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/legacy/feecalc.py +74 -0
  73. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/samples/accounts_2026-10.txt +10 -0
  74. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/samples/accounts_edge.txt +11 -0
  75. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/tests/test_feecalc_smoke.py +21 -0
  76. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/.github/workflows/ci.yml.fixture +11 -0
  77. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/PR-412.md +24 -0
  78. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/README.md +17 -0
  79. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/docs/adr/0004-late-fee-calculation.md +25 -0
  80. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/__init__.py +1 -0
  81. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/cli.py +33 -0
  82. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/extract.py +33 -0
  83. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/rules.py +39 -0
  84. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/legacy/feecalc.py +74 -0
  85. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/samples/accounts_2026-10.txt +10 -0
  86. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/samples/accounts_edge.txt +11 -0
  87. package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/tests/test_feecalc_smoke.py +21 -0
  88. package/packs/dev-team/loops/release/LOOP.md +4 -4
  89. package/packs/dev-team/loops/release/evals/eval_queries.json +10 -0
  90. package/packs/dev-team/loops/release/evals/evals.json +34 -0
  91. package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/0061_switch_to_haldrin_tokens.sql +22 -0
  92. package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/eng-notes.md +40 -0
  93. package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/merged-prs.md +13 -0
  94. package/packs/dev-team/loops/release/evals/files/release-saved-searches/merged-prs.md +13 -0
  95. package/packs/dev-team/loops/release/evals/files/release-saved-searches/readiness-evidence.md +27 -0
  96. package/packs/dev-team/loops/release/evals/files/release-saved-searches/traffic-baseline.md +23 -0
  97. package/packs/dev-team/loops/release/loop.json +1 -1
  98. package/packs/dev-team/skills/bug-triage/SKILL.md +1 -0
  99. package/packs/dev-team/skills/bug-triage/examples/export-row-limit-escalation.md +126 -0
  100. package/packs/dev-team/skills/bug-triage/manifest.json +2 -2
  101. package/packs/dev-team/skills/feature-implement-loop/manifest.json +2 -2
  102. package/packs/dev-team/skills/pr-description-writer/manifest.json +3 -3
  103. package/packs/dev-team/skills/pre-merge-review/manifest.json +2 -2
  104. package/packs/dev-team/skills/release-notes/manifest.json +2 -2
  105. package/packs/dev-team/skills/test-plan-generator/manifest.json +2 -2
  106. package/packs/experience-design/skills/service-blueprint/manifest.json +3 -3
  107. package/packs/experience-design/skills/ux-writing/manifest.json +3 -3
  108. package/packs/grc/loops/comply/evals/evals.json +29 -0
  109. package/packs/grc/loops/comply/evals/files/comply-chat-vendor-launch/vendor-brief.md +72 -0
  110. package/packs/grc/loops/comply/evals/files/comply-loyalty-app-unowned-risks/launch-note.md +31 -0
  111. package/packs/grc/loops/comply/evals/files/comply-loyalty-app-unowned-risks/risk-register.csv +6 -0
  112. package/packs/infra-as-code/skills/terraform-module/manifest.json +3 -3
  113. package/packs/product-manager/skills/prd-draft/SKILL.md +1 -0
  114. package/packs/product-manager/skills/prd-draft/examples/approver-delay-not-slack.md +142 -0
  115. package/packs/product-manager/skills/prd-draft/manifest.json +2 -2
  116. package/packs/product-manager/skills/user-journey-map/manifest.json +2 -2
  117. package/packs/research/loops/research/evals/evals.json +28 -0
  118. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t1-ticket-volume.md +15 -0
  119. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t2-release-notes-4-2.md +11 -0
  120. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t3-billing-migration.md +12 -0
  121. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t4-agent-poll.md +11 -0
  122. package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t5-app-store-reviews.md +12 -0
  123. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s1-analytics-export.md +29 -0
  124. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s2-email-delivery-report.md +25 -0
  125. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s3-pricing-changelog.md +9 -0
  126. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s4-trial-interview-notes.md +21 -0
  127. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s5-competitor-note.md +9 -0
  128. package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s6-weekly-growth-recap.md +7 -0
  129. package/packs/research/skills/research-plan/manifest.json +3 -3
  130. package/packs/research/skills/source-synthesis/manifest.json +3 -3
  131. package/packs/skill-engineering/skills/skill-author/manifest.json +3 -3
  132. package/packs/solution-architect/loops/design/evals/evals.json +28 -0
  133. package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0001-postgres-system-of-record.md +23 -0
  134. package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0002-background-work-via-job-queue.md +23 -0
  135. package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0003-tenant-isolation-row-level.md +25 -0
  136. package/packs/solution-architect/loops/design/evals/files/design-bulk-export/prd-bulk-export.md +50 -0
  137. package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/adr/0002-background-work-via-job-queue.md +23 -0
  138. package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/adr/0004-new-stateful-infra-needs-platform-signoff.md +22 -0
  139. package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/prd-partner-webhooks.md +36 -0
  140. package/packs/solution-architect/skills/api-contract-draft/manifest.json +3 -3
  141. package/packs/solution-architect/skills/architecture-diagrams/manifest.json +3 -3
  142. package/packs/solution-architect/skills/design-doc/manifest.json +2 -2
  143. package/packs/solution-architect/skills/figma-diagrams/manifest.json +3 -3
  144. package/packs/sre-oncall/skills/cloud-cost-review/SKILL.md +0 -1
  145. package/packs/sre-oncall/skills/cloud-cost-review/manifest.json +1 -2
  146. package/packs/sre-oncall/skills/delivery-metrics-report/SKILL.md +0 -1
  147. package/packs/sre-oncall/skills/delivery-metrics-report/manifest.json +1 -2
  148. package/packs/sre-oncall/skills/incident-comms/manifest.json +2 -2
  149. package/packs/sre-oncall/skills/postmortem-generator/manifest.json +2 -2
  150. package/packs/stakeholder-comms/skills/decision-log/manifest.json +2 -2
  151. package/packs/trackers/skills/team-status-report/manifest.json +3 -3
  152. package/profiles.json +1 -1
  153. package/packs/ai-engineering/loops/adopt/LOOP.md +0 -120
  154. package/packs/ai-engineering/loops/adopt/evals/eval_queries.json +0 -10
  155. package/packs/ai-engineering/loops/adopt/evals/evals.json +0 -69
  156. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/ai-ideas.md +0 -15
  157. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/org-context.md +0 -27
  158. package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/staff-survey.csv +0 -11
  159. package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/ai-ideas.md +0 -13
  160. package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/firm-context.md +0 -23
  161. package/packs/ai-engineering/loops/adopt/loop.json +0 -53
  162. package/packs/ai-engineering/skills/ai-usage-report/SKILL.md +0 -111
  163. package/packs/ai-engineering/skills/ai-usage-report/evals/eval_queries.json +0 -30
  164. package/packs/ai-engineering/skills/ai-usage-report/evals/evals.json +0 -46
  165. package/packs/ai-engineering/skills/ai-usage-report/evals/files/1/northwind-ai-events.csv +0 -4213
  166. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/draftwell-events.csv +0 -249
  167. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/export-note.md +0 -9
  168. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/published-assets.csv +0 -44
  169. package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/team-roster.md +0 -10
  170. package/packs/ai-engineering/skills/ai-usage-report/examples/weekly-engineering-team.md +0 -133
  171. package/packs/ai-engineering/skills/ai-usage-report/manifest.json +0 -12
  172. package/packs/ai-engineering/skills/ai-usage-report/scripts/build_report.py +0 -453
  173. package/packs/ai-engineering/skills/ai-usage-report/templates/report-per-user.md +0 -42
  174. package/packs/ai-engineering/skills/ai-usage-report/templates/report-team-rollup.md +0 -49
  175. package/packs/ai-engineering/skills/ai-usage-report/templates/usage-event-schema.md +0 -76
  176. package/packs/career/loops/apply/LOOP.md +0 -97
  177. package/packs/career/loops/apply/evals/eval_queries.json +0 -9
  178. package/packs/career/loops/apply/evals/evals.json +0 -27
  179. package/packs/career/loops/apply/loop.json +0 -52
  180. package/packs/product-manager/loops/discover/LOOP.md +0 -82
  181. package/packs/product-manager/loops/discover/evals/eval_queries.json +0 -30
  182. package/packs/product-manager/loops/discover/evals/evals.json +0 -26
  183. package/packs/product-manager/loops/discover/loop.json +0 -41
  184. package/packs/product-manager/skills/lean-canvas/SKILL.md +0 -162
  185. package/packs/product-manager/skills/lean-canvas/evals/eval_queries.json +0 -42
  186. package/packs/product-manager/skills/lean-canvas/evals/evals.json +0 -82
  187. package/packs/product-manager/skills/lean-canvas/evals/files/1/pawpass-notes.md +0 -54
  188. package/packs/product-manager/skills/lean-canvas/evals/files/3/lunchloop-pitch.md +0 -30
  189. package/packs/product-manager/skills/lean-canvas/evals/files/4/clubkit-notes.md +0 -44
  190. package/packs/product-manager/skills/lean-canvas/evals/files/5/cost-model.csv +0 -5
  191. package/packs/product-manager/skills/lean-canvas/evals/files/5/proposal.md +0 -40
  192. package/packs/product-manager/skills/lean-canvas/evals/files/5/stakeholder-emails.txt +0 -18
  193. package/packs/product-manager/skills/lean-canvas/examples/bike-repair.md +0 -72
  194. package/packs/product-manager/skills/lean-canvas/manifest.json +0 -34
  195. package/packs/product-manager/skills/lean-canvas/reference.md +0 -102
  196. package/packs/product-manager/skills/lean-canvas/scripts/unit_economics.py +0 -211
  197. package/packs/sre-oncall/loops/operate/LOOP.md +0 -84
  198. package/packs/sre-oncall/loops/operate/evals/eval_queries.json +0 -30
  199. package/packs/sre-oncall/loops/operate/evals/evals.json +0 -25
  200. package/packs/sre-oncall/loops/operate/loop.json +0 -41
@@ -1,97 +0,0 @@
1
- ---
2
- name: apply
3
- description: Take one job posting and one resume to an application ready to send — an honest fit check, a tailored resume, a cover letter and the answers to the application form — with the candidate deciding whether to apply before any writing, and confirming every claim is true before anything is sent. Use when the user wants to apply for a job, says "help me apply for this", or wants a resume and cover letter prepared for one posting.
4
- ---
5
-
6
- # apply
7
-
8
- One application, start to send, for any job. It opens with a gate because the cheapest
9
- application is the one you decide not to write, and it closes with one because the candidate
10
- signs these documents and answers for them at interview. Both gates are **human**: an agent
11
- can say what the resume shows, but only the candidate knows what is true and what they want.
12
-
13
- ## Stages
14
-
15
- | # | Stage | Type | Skills | Gate |
16
- |---|---|---|---|---|
17
- | 1 | `fit` | gate | [`job-fit-analysis`](../../skills/job-fit-analysis/SKILL.md) | **G6** human |
18
- | 2 | `tailor` | generate | [`resume-tailor`](../../skills/resume-tailor/SKILL.md) | — |
19
- | 3 | `letter` | generate | [`cover-letter`](../../skills/cover-letter/SKILL.md) | — |
20
- | 4 | `form` | generate | [`application-form-answers`](../../skills/application-form-answers/SKILL.md) | — |
21
- | 5 | `confirm` | verify | [`output-hygiene`](../../../core/skills/output-hygiene/SKILL.md) | **G6.1** human |
22
-
23
- ## How to run this loop
24
-
25
- 1. **Check the fit and stop.** Run `job-fit-analysis` on the posting, the resume and any
26
- other material of the candidate's: a LinkedIn summary, a portfolio, a project. Put its
27
- verdict, what could get the application rejected and its questions to the candidate,
28
- including whether anything outside the resume covers a gap, then wait at G6.
29
- - `PROCEED`: they are applying. Go on.
30
- - `PROCEED WITH CONDITIONS`: they are applying and have answered the questions. Save
31
- their answers to `notes.md`; from here on those answers are source material alongside
32
- the resume.
33
- - `RECONSIDER`: they are not applying. The loop ends here, and that is a good outcome.
34
- 2. **Tailor the resume.** Run `resume-tailor` with the resume, the posting and `notes.md`
35
- if it exists. It works in the resume's own format, on a copy. Carry forward its three
36
- lists: "Not claimed", "Cut" and "Added from outside the resume".
37
- 3. **Write the letter.** Run `cover-letter` with the tailored resume, the posting, `notes.md`
38
- and the candidate's reason for wanting the job if they gave one. Skip this stage when the
39
- posting says not to send a letter.
40
- 4. **Answer the form.** When the application has a form with questions beyond uploading
41
- the documents, run `application-form-answers` with those questions and the tailored
42
- resume. Skip this stage when there is no form.
43
- 5. **Clean the documents.** Run `output-hygiene` on the resume and the letter.
44
- 6. **Confirm at G6.1.** Show the candidate the documents with four short lists: what the
45
- posting asks for that the documents do not claim; every fact added from outside the
46
- resume and where it came from; every line cut from the resume; and the form questions
47
- that are theirs alone to answer. Ask them to confirm every line is true. `NOT READY` returns to `tailor` with their
48
- corrections added to `notes.md`. The candidate sends the application; the loop never does.
49
-
50
- ## Verdicts
51
-
52
- Defined in [`contracts/terminals.json`](../../../../contracts/terminals.json). G6 emits
53
- `PROCEED`, `PROCEED WITH CONDITIONS`, `RECONSIDER` or `BLOCKED`. G6.1 emits `READY`,
54
- `NOT READY` or `BLOCKED`. `RECONSIDER` leaves the loop: the candidate's time goes to a
55
- better posting.
56
-
57
- ## Non-interactive runs
58
-
59
- With no person present, neither gate can be satisfied. Run `fit`, deliver the analysis and
60
- emit `BLOCKED: need the candidate's decision to apply`. Do not decide for them, and do not
61
- produce documents carrying their name that they have not confirmed.
62
-
63
- ## When a stage's skill is not installed
64
-
65
- Name the missing skill and skilldrop as its source, do the minimal inline version of that
66
- stage under the same rule (nothing the candidate didn't supply), and record that it ran
67
- degraded. Never skip G6.1.
68
-
69
- ## Run log (opt-in)
70
-
71
- Only when the environment variable `SKILLDROP_LOOP_LOG` is set to a file path: after each
72
- gate's verdict, append one JSON line to that file. Nothing else is recorded, and nothing is
73
- sent anywhere. When the variable isn't set, or you can't read it, skip this section.
74
-
75
- ```bash
76
- printf '%s\n' '{"ts":"2026-10-05T14:03:00Z","loop":"apply","stage":"fit","gate":"G6","verdict":"PROCEED","round":1}' >> "$SKILLDROP_LOOP_LOG"
77
- ```
78
-
79
- Fields: `ts` (UTC), `loop`, `stage`, `gate` (`null` for a stage without one), `verdict` (the
80
- gate's exact word), and `round` (1 for the first attempt, counting returns under the cap).
81
- The log holds verdicts only: never the posting, the resume or the candidate's name.
82
-
83
- ## Quality bar
84
-
85
- - **The candidate decides to apply before anything is written.** A tailored resume for a job they would have skipped is wasted work.
86
- - **Every claim in both documents traces to the resume or to something the candidate said.** Answers given at G6 are written to `notes.md`, so the trace exists.
87
- - **The resume, the letter and the form agree.** Same titles, dates and numbers in all three.
88
- - **The candidate confirms and sends.** G6.1 is their signature; the loop never submits an application.
89
-
90
- ## Anti-patterns to avoid
91
-
92
- - ❌ **Skipping `fit` because the candidate is keen.** The screening requirements are what they most need to see before investing the time.
93
- - ❌ **Treating a `Not shown` item as true** because the candidate proceeded. Only what they answered goes in.
94
- - ❌ **Writing the letter from the original resume.** The letter follows the tailored one, or the two will disagree.
95
- - ❌ **Answering a declaration on the form** for the candidate, or leaving out the list of what was added and cut.
96
- - ❌ **Self-confirming at G6.1.** A clean claim check says the words are in the source; it cannot say they are true.
97
- - ❌ **Submitting the application.** Sending is the candidate's act.
@@ -1,9 +0,0 @@
1
- [
2
- {"query": "help me apply for this job", "should_trigger": true},
3
- {"query": "run the apply loop on this posting and my resume", "should_trigger": true},
4
- {"query": "I want a tailored resume and cover letter for this role", "should_trigger": true},
5
- {"query": "get my application for this job ready to send", "should_trigger": true},
6
- {"query": "is this job a good fit for me?", "should_trigger": false},
7
- {"query": "just write a cover letter for this", "should_trigger": false},
8
- {"query": "turn these notes into a finished document", "should_trigger": false}
9
- ]
@@ -1,27 +0,0 @@
1
- {
2
- "loop_name": "apply",
3
- "evals": [
4
- {
5
- "id": "stops-at-the-fit-gate",
6
- "prompt": "Run the apply loop. My resume is in resume.md and the job is in posting.md. [a warehouse supervisor's resume with a high school diploma; a posting that requires a bachelor's degree]",
7
- "assertions": [
8
- "Starts with job-fit-analysis and delivers its verdict before any resume or letter is written",
9
- "Names the unmet bachelor's degree as a screening requirement",
10
- "Stops at G6 and asks the candidate whether to apply; does not tailor the resume in the same turn",
11
- "Does not advise claiming the degree or adding any keyword the resume does not support"
12
- ]
13
- },
14
- {
15
- "id": "answers-become-source-material",
16
- "prompt": "Continuing the apply loop: yes I want to apply. To your questions: I do speak Spanish, and no, I've never used SAP. [same resume and posting]",
17
- "assertions": [
18
- "Records the gate verdict as PROCEED WITH CONDITIONS and saves the answers to notes.md",
19
- "The tailored resume includes Spanish and does not claim SAP",
20
- "The cover letter is written after the tailored resume and uses the same titles, dates and numbers",
21
- "Runs output-hygiene on both documents before the final gate",
22
- "Stops at G6.1 and asks the candidate to confirm every line is true; does not submit or send anything",
23
- "Lists what the posting asks for that neither document claims"
24
- ]
25
- }
26
- ]
27
- }
@@ -1,52 +0,0 @@
1
- {
2
- "$comment": "RFC-0042. One job application, start to send. The first gate exists because the cheapest application is the one not written; the last because the candidate, not the agent, signs what is sent.",
3
- "name": "apply",
4
- "version": "0.3.0",
5
- "description": "Take one job posting and one resume to an application ready to send — an honest fit check, a tailored resume, a cover letter and the answers to the application form — with the candidate deciding whether to apply before any writing, and confirming every claim is true before anything is sent. Use when the user wants to apply for a job, says \"help me apply for this\", or wants a resume and cover letter prepared for one posting.",
6
- "entrypoint": "LOOP.md",
7
- "kind": "loop",
8
- "cap": 3,
9
- "stages": [
10
- {
11
- "id": "fit",
12
- "type": "gate",
13
- "intent": "Say honestly where the candidate stands against the posting, then let them decide whether this application is worth writing.",
14
- "skills": ["job-fit-analysis"],
15
- "gate": {
16
- "id": "G6",
17
- "kind": "human",
18
- "verdicts": ["PROCEED", "PROCEED WITH CONDITIONS", "RECONSIDER", "BLOCKED"]
19
- }
20
- },
21
- {
22
- "id": "tailor",
23
- "type": "generate",
24
- "intent": "Rewrite the resume for this posting from what the candidate has done and nothing else.",
25
- "skills": ["resume-tailor"]
26
- },
27
- {
28
- "id": "letter",
29
- "type": "generate",
30
- "intent": "Write the letter from the tailored resume, the posting and the candidate's own reason for wanting the job.",
31
- "skills": ["cover-letter"]
32
- },
33
- {
34
- "id": "form",
35
- "type": "generate",
36
- "intent": "Draft the application form's answers from the tailored resume, and hand back the declarations that are the candidate's alone.",
37
- "skills": ["application-form-answers"]
38
- },
39
- {
40
- "id": "confirm",
41
- "type": "verify",
42
- "intent": "Strip what the machine left behind, then have the candidate confirm that every line in the documents is true and theirs, and that anything added from outside the resume is right.",
43
- "skills": ["output-hygiene"],
44
- "gate": {
45
- "id": "G6.1",
46
- "kind": "human",
47
- "verdicts": ["READY", "NOT READY", "BLOCKED"],
48
- "revise_to": "tailor"
49
- }
50
- }
51
- ]
52
- }
@@ -1,82 +0,0 @@
1
- ---
2
- name: discover
3
- description: Take raw signal — interviews, journeys, a strategy question — to a requirement a human has ratified, so design starts from an agreed problem rather than an assumed one. Use when the user is deciding what to build, scoping a feature, or turning stakeholder conversations into requirements.
4
- ---
5
-
6
- # discover
7
-
8
- The first loop of the lifecycle, and the cheapest one to run twice. Everything downstream
9
- inherits whatever this loop got wrong, which is why it ends at a **human** gate rather than a
10
- script: no check can tell you that you solved the wrong problem well.
11
-
12
- ## Stages
13
-
14
- | # | Stage | Type | Skills | Gate |
15
- |---|---|---|---|---|
16
- | 1 | `gather` | generate | [`requirements-interview`](../../skills/requirements-interview/SKILL.md), [`user-journey-map`](../../skills/user-journey-map/SKILL.md), [`strategy-analysis`](../../skills/strategy-analysis/SKILL.md), [`feedback-synthesis`](../../skills/feedback-synthesis/SKILL.md) | — |
17
- | 2 | `structure` | generate | [`brief-intake`](../../../core/skills/brief-intake/SKILL.md) | — |
18
- | 3 | `specify` | generate | [`prd-draft`](../../skills/prd-draft/SKILL.md) | — |
19
- | 4 | `ratify` | gate | [`doc-critique`](../../../core/skills/doc-critique/SKILL.md) | **G0** human |
20
-
21
- ## How to run this loop
22
-
23
- 1. **Gather from whichever direction the signal arrives.** A stakeholder conversation →
24
- `requirements-interview`. An existing experience with known friction → `user-journey-map`.
25
- An open strategic question → `strategy-analysis`. A pile of tickets, survey verbatims or
26
- interview notes already collected → `feedback-synthesis`. Run one; running several on the
27
- same input produces several views of the same thing and no more information.
28
- 2. **Structure once.** `brief-intake` tags every field `[explicit]` / `[implied]` /
29
- `[inferred]` / `[missing]` with verbatim quotes. The tags are the deliverable — an
30
- untagged brief hides which parts are somebody's assumption.
31
- 3. **Resolve the missing before specifying.** `brief-intake` ends with what the downstream
32
- skill will refuse to start without. Answer those; do not let `prd-draft` invent them.
33
- 4. **Specify.** `prd-draft` turns the brief into numbered requirements a design can be held to.
34
- 5. **Ratify at G0.** Run `doc-critique` against the PRD, then put the decision to a human.
35
- The critique informs; the human decides. `REVISE` returns to `structure`, not to `specify`
36
- — a weak PRD almost always means a thin brief.
37
-
38
- ## Verdicts
39
-
40
- Defined in [`contracts/terminals.json`](../../../../contracts/terminals.json). G0 emits `PROCEED`,
41
- `PROCEED WITH CONDITIONS`, `REVISE`, `RECONSIDER`, or `BLOCKED`. `RECONSIDER` leaves the loop:
42
- the problem itself is wrong, and no amount of re-briefing fixes that.
43
-
44
- ## Non-interactive runs
45
-
46
- With no human present, G0 cannot be satisfied. Emit `BLOCKED: need ratification of <the
47
- brief's central claim>` and stop. Do not self-ratify — a fabricated goal corrupts every
48
- artifact the other four loops produce.
49
-
50
- ## When a stage's skill is not installed
51
-
52
- Name the missing skill and skilldrop as its source, do the minimal inline version of that
53
- stage, and record that it ran degraded. Never skip G0.
54
-
55
- ## Run log (opt-in)
56
-
57
- Only when the environment variable `SKILLDROP_LOOP_LOG` is set to a file path: after each
58
- gate's verdict, append one JSON line to that file. Nothing else is recorded, and nothing is
59
- sent anywhere. When the variable isn't set, or you can't read it, skip this section.
60
-
61
- ```bash
62
- printf '%s\n' '{"ts":"2026-10-01T14:03:00Z","loop":"discover","stage":"ratify","gate":"G0","verdict":"PROCEED","round":1}' >> "$SKILLDROP_LOOP_LOG"
63
- ```
64
-
65
- Fields: `ts` (UTC), `loop`, `stage`, `gate` (`null` for a stage without one), `verdict` (the
66
- gate's exact word), and `round` (1 for the first attempt, counting returns under the cap).
67
- `skilldrop loop-stats` summarises the file: which gates pass first time, which loop back, and
68
- which end in `BLOCKED`.
69
-
70
- ## Quality bar
71
-
72
- - **Every field carries a provenance tag.** A brief that does not distinguish quoted from inferred cannot be ratified, only believed.
73
- - **`[missing]` is resolved or stated, never filled.** Inventing the goal, the customer, or the success measure is the one failure this loop exists to prevent.
74
- - **The requirements are numbered and testable.** "Fast" is not a requirement; a latency target is.
75
- - **A human ratifies before design starts.** G0 is the loop's only reason to exist — an unratified brief is a draft, whatever the critique said.
76
-
77
- ## Anti-patterns to avoid
78
-
79
- - ❌ **Running every `gather` skill to be thorough.** Three lenses on one input is not three inputs; pick the one that matches where the signal came from.
80
- - ❌ **Letting `prd-draft` fill a `[missing]` field.** That converts an open question into a fact nobody agreed to.
81
- - ❌ **Treating `doc-critique`'s `SHIP IT` as ratification.** The critique judges the document; G0 judges the problem.
82
- - ❌ **Returning `REVISE` to `specify`.** Re-writing the PRD from the same thin brief reproduces the same gaps in better prose.
@@ -1,30 +0,0 @@
1
- [
2
- {
3
- "query": "turn these stakeholder notes into requirements",
4
- "should_trigger": true
5
- },
6
- {
7
- "query": "run the discover loop on this complaint",
8
- "should_trigger": true
9
- },
10
- {
11
- "query": "what problem are we actually solving here?",
12
- "should_trigger": true
13
- },
14
- {
15
- "query": "get this idea to a ratified brief",
16
- "should_trigger": true
17
- },
18
- {
19
- "query": "split this epic into stories",
20
- "should_trigger": false
21
- },
22
- {
23
- "query": "write the design doc for this",
24
- "should_trigger": false
25
- },
26
- {
27
- "query": "review my pull request",
28
- "should_trigger": false
29
- }
30
- ]
@@ -1,26 +0,0 @@
1
- {
2
- "loop_name": "discover",
3
- "evals": [
4
- {
5
- "id": "refuses-to-specify-on-a-thin-brief",
6
- "prompt": "Run the discover loop. An account manager says enterprise customers keep hitting our API limits and are complaining.",
7
- "assertions": [
8
- "Starts at `gather` with requirements-interview, because the signal arrived as a conversation rather than a journey or a strategy question",
9
- "Does not run all three gather skills on the same input",
10
- "Tags every brief field [explicit] / [implied] / [inferred] / [missing] with its source",
11
- "Marks the threshold and the affected-customer count as [missing] rather than inventing plausible numbers",
12
- "Refuses to complete `specify` until the [missing] anchors are resolved, and says which ones block it",
13
- "Does not self-ratify G0 — it names ratification as a human decision"
14
- ]
15
- },
16
- {
17
- "id": "reconsider-leaves-the-loop",
18
- "prompt": "We ran discover and the stakeholder now says they actually want burst capacity, not a higher ceiling.",
19
- "assertions": [
20
- "Classifies this as RECONSIDER, a redirect-class verdict",
21
- "States that a redirect leaves the loop rather than revising within it",
22
- "Does not route back to `structure` for another brief on the original problem"
23
- ]
24
- }
25
- ]
26
- }
@@ -1,41 +0,0 @@
1
- {
2
- "$comment": "RFC-0028. The first loop of the lifecycle: nothing is designed or built until a human has ratified what problem is being solved. Cheapest loop to redo and the most expensive to skip.",
3
- "name": "discover",
4
- "version": "0.3.0",
5
- "description": "Take raw signal — interviews, journeys, a strategy question — to a requirement a human has ratified, so design starts from an agreed problem rather than an assumed one. Use when the user is deciding what to build, scoping a feature, or turning stakeholder conversations into requirements.",
6
- "entrypoint": "LOOP.md",
7
- "kind": "loop",
8
- "cap": 3,
9
- "stages": [
10
- {
11
- "id": "gather",
12
- "type": "generate",
13
- "intent": "Collect the raw signal from whichever direction it arrives: a stakeholder conversation, an existing user journey, or a strategic question.",
14
- "skills": ["requirements-interview", "user-journey-map", "strategy-analysis", "feedback-synthesis"]
15
- },
16
- {
17
- "id": "structure",
18
- "type": "generate",
19
- "intent": "Turn the mess into one brief with every field tagged explicit / implied / inferred / missing, so downstream can see what was assumed.",
20
- "skills": ["brief-intake"]
21
- },
22
- {
23
- "id": "specify",
24
- "type": "generate",
25
- "intent": "Turn the ratified brief into numbered requirements a design can be held to.",
26
- "skills": ["prd-draft"]
27
- },
28
- {
29
- "id": "ratify",
30
- "type": "gate",
31
- "intent": "A human agrees this is the problem worth solving. The critique informs that decision; it does not make it.",
32
- "skills": ["doc-critique"],
33
- "gate": {
34
- "id": "G0",
35
- "kind": "human",
36
- "verdicts": ["PROCEED", "PROCEED WITH CONDITIONS", "REVISE", "RECONSIDER", "BLOCKED"],
37
- "revise_to": "structure"
38
- }
39
- }
40
- ]
41
- }
@@ -1,162 +0,0 @@
1
- ---
2
- name: lean-canvas
3
- description: Turn a startup or internal-product idea into a lean canvas that finds what could kill it — the nine boxes filled only from what the user said, each entry tagged evidence-backed (with its source) or assumption, the assumptions ranked by how likely each is wrong times how badly the idea fails if it is, the cheapest test with a pass/fail line set in advance for the top ones, a computed unit-economics check when price and costs are given, and a plain call when the idea should change before anything is built. Use when the user says "lean canvas", "help me think through my startup idea", "what are the riskiest assumptions", "how do I validate this idea", "is this idea worth building", or "poke holes in my business model".
4
- ---
5
-
6
- # lean-canvas
7
-
8
- The canvas is the vehicle; the product is the assumption work. A filled-in grid tells the
9
- founder what they already believe. This skill tells them which belief is most likely to sink
10
- the idea, and the cheapest way to find out this week. For a costed invest/defer decision with
11
- NPV and options, use `business-case`; for the press release and FAQ of an idea already
12
- approved, `prfaq`; for market and competitor frameworks, `strategy-analysis`; for measuring a
13
- feature after it ships, `success-metrics`.
14
-
15
- ## How to respond
16
-
17
- **Four rules come before the steps and outrank them:**
18
-
19
- - **Answer what was asked, first.** Open with the answer, the decision or the artifact, in plain words. Scores, matrices, frameworks and tags come after it, and anything that doesn't change the answer is cut.
20
- - **Use only what you were given.** Don't add facts, names, numbers, incidents, history, steps or sections the input doesn't contain. What you need and don't have is left out of the artifact and listed once at the end under "To confirm".
21
- - **Deliver from what you have.** When the request gives you something to work on, state your assumptions in a line and produce the result. When it gives you nothing to work on, ask for it in one or two plain sentences and say what you will do once you have it.
22
- - **Write for someone who has never heard of this skill.** No skill names, no paths or scripts from this folder, no internal terms, and nothing about how the run was set up. A next step is one plain sentence at the end that describes the work.
23
- - **For this skill:** A box with nothing behind it says so. "Unfair advantage: none yet" is a correct entry; an invented moat, channel or metric is a wrong one.
24
-
25
- 1. **Fill the nine boxes from the input only.** Problem (top 1–3), customer segments with the
26
- **early adopter** named separately, unique value proposition, solution, channels, revenue
27
- streams, cost structure, key metrics, unfair advantage. Tag every entry `[evidence: <source
28
- the user gave>]` or `[assumption]`. A box the user left empty gets `[not stated]`, not a
29
- filler. Internal products: revenue becomes the budget or saving that funds it, and the
30
- customer is the team that has to adopt it.
31
-
32
- 2. **Grade the evidence before trusting it.** Evidence counts for a box only when it comes
33
- from the stated early adopter and records behaviour, not opinion.
34
- - ✅ *"7 of the 20 cycle commuters we stopped at the office rack paid for a repair in the last three months"* — behaviour, right segment.
35
- - ❌ *"12 people from my running club said they'd definitely sign up"* — wrong segment (runners, not cycle commuters) and stated intent. Tag it `[evidence: running-club chat — wrong segment, intent only]` and rate the box as an assumption.
36
- - A third-party statistic (*"a council survey says 2,000 people cycle to the business district"*) sizes the segment; it doesn't show they feel the problem enough to pay.
37
- - A lifetime or retention figure is evidence only if the data covers that long and every
38
- customer. A six-month average from a three-month pilot, or from "the ones who stuck
39
- with it", is an assumption; the real lifetime is unknown and probably shorter.
40
-
41
- 3. **Test the claimed unfair advantage.** An unfair advantage can't be copied or bought by a
42
- funded competitor within a year: insider information, an existing audience or customer
43
- base, a network effect, a community, exclusive access or contract, a team member's
44
- authority. A feature, an algorithm, "AI", "first mover", "better UX" or "passion" is not
45
- one; it moves to Solution or UVP. Write ✅ *"Unfair advantage: none yet. The folding
46
- repair stand is a feature — any mechanic can buy or copy one. A candidate: exclusive
47
- access to office car parks, if landlords grant it."* ❌ *"Unfair advantage: our
48
- proprietary stand design."*
49
-
50
- 4. **Check every channel against the early adopter.** For each stated channel, ask: do these
51
- people go there? A channel aimed at a different buyer (a procurement conference for ward
52
- nurses who buy nothing themselves, Instagram ads for commuters the input says are offline
53
- all day) is a mismatch. Name it, and say who the channel does reach. If **no** stated channel reaches the early adopter, that is a change-before-building
54
- finding (step 7).
55
-
56
- 5. **Compute the unit economics when price and costs are given.** Never estimate. Run:
57
-
58
- ```bash
59
- # Claude Code
60
- python3 "${CLAUDE_SKILL_DIR}/scripts/unit_economics.py" --price 12 --variable-cost 7 --cac 90 --lifetime 6 --fixed 6000
61
- # Other IDEs (from the skill folder)
62
- python3 scripts/unit_economics.py --price 12 --variable-cost 7 --cac 90 --lifetime 6 --fixed 6000
63
- ```
64
-
65
- Derive inputs from what the user gave and show the derivation (✅ *"CAC $90 = $900 ad
66
- spend ÷ 10 sign-ups"*). Use one currency and one period throughout. Add `--churn` instead of `--lifetime` when churn is given,
67
- `--market-customers` when the user sizes the market. The script returns gross margin,
68
- LTV, CAC payback, LTV:CAC, the most a customer can cost to acquire, break-even customers
69
- and where the numbers don't close. If no script can run, do the same arithmetic by hand
70
- and show every line. Price or cost missing → skip this step, list what's missing under
71
- "To confirm", and write no number the user didn't give.
72
-
73
- 6. **Rank the assumptions by risk = likelihood wrong × impact if wrong.** Likelihood: high
74
- (no evidence, wrong-segment evidence, or opinion only), medium (right segment but few
75
- people or indirect), low (observed behaviour from the right segment). Impact: fatal (the
76
- idea fails), pivot (a box has to change), tune (a number moves). Score 3/2/1 each and sort.
77
- The riskiest assumption sits in problem, customer or channel far more often than in
78
- solution, because a solution can be rebuilt in a sprint while a problem nobody has can't
79
- be fixed by building. Say in one sentence why the top one beats the others **for this
80
- idea**. A solution assumption ("can the matching algorithm be accurate?") ranks first only
81
- when the problem and customer are already backed by behaviour. Ties: the assumption the
82
- others depend on goes first (a channel test means nothing until the problem holds).
83
-
84
- 7. **Say plainly when the idea should change before anything is built.** Triggers: no stated
85
- channel reaches the early adopter; CAC payback is longer than the customer lifetime;
86
- break-even needs more customers than the stated market holds; the only problem evidence is
87
- from a different segment. Write one sentence per trigger with what has to change.
88
- ✅ *"Change before building: each member costs $90 to acquire and returns $30 over six
89
- months, so every sign-up adds a $60 loss."* Silence on a finding the numbers show is a
90
- failure. An assumption the user's own numbers already disprove is a finding here, not a
91
- test to run: a $90 CAC against a $10 ceiling needs a new channel, not more of the old one.
92
-
93
- 8. **Design the cheapest test that could prove each of the top 1–3 assumptions wrong.**
94
- Each test names: what to do, the sample, the pass/fail line **set before running**, the
95
- cost, the time, and what changes if it fails. Use counts, not percentages, for small
96
- samples. Take thresholds from step 5 where possible (the most a customer can cost to
97
- acquire is the channel test's fail line). Test menu and interview rules in
98
- [`reference.md`](reference.md).
99
- - ✅ *"Stand at two office bike racks for a morning and ask 20 cyclists about the last
100
- time their bike needed fixing; never pitch. If fewer than 6 paid for a repair in the
101
- past three months, the problem is wrong. Cost: $0. Time: two mornings."*
102
- - ✅ *"Put a sign-up sheet with the $12 price and a card form at one rack for a week. Fail
103
- if fewer than 5 of the cyclists who stop pay the first month."*
104
- - ❌ *"Validate the market."* ❌ *"Run a survey to gauge interest."* ❌ *"Build an MVP and see."*
105
-
106
- 9. **Write the reply in this order.** Keep it lean: under about 500 words unless a document
107
- was asked for, and shorter when the user says "quick" or "short".
108
- 1. **Riskiest assumption and its test**: two to four lines, first in the reply.
109
- 2. **Change before building**: one line per trigger from step 7, or omitted when none fired.
110
- 3. **Canvas**: nine rows, one line each, every entry tagged.
111
- 4. **Next assumptions and tests**: numbers 2–3, same shape as the first, with the risk score.
112
- 5. **Unit economics**: the computed lines and the flags, only when step 5 ran.
113
- 6. **To confirm**: what was missing, once.
114
-
115
- **Non-interactive runs** (subagent, CI, headless): a missing early adopter, channel or price
116
- is not asked about; the most defensible reading of the input is used, tagged `[assumption]`,
117
- and ranked as an assumption to test. No idea at all — no problem and no customer — emits
118
- `BLOCKED: need the idea: who has the problem and what the problem is`, because a canvas of
119
- invented boxes tests nothing.
120
-
121
- ## Useful references in this skill
122
-
123
- - [`reference.md`](reference.md) — the test menu, how to set a pass/fail line, interview rules, what counts as an unfair advantage, internal-product reading of the boxes
124
- - [`scripts/unit_economics.py`](scripts/unit_economics.py) — gross margin, LTV, CAC payback, break-even customers and the flags (stdlib only)
125
- - [`examples/bike-repair.md`](examples/bike-repair.md) — worked example: an on-site bike repair subscription where the payback outruns the lifetime
126
-
127
- ## Quality bar
128
-
129
- - **The first lines are the riskiest assumption and its test**, not the canvas.
130
- - **Every canvas entry carries a tag**, and every `[evidence]` names the source the user gave.
131
- - **Wrong-segment and opinion-only evidence is downgraded** and said to be.
132
- - **A feature claimed as an unfair advantage is moved out**, and the box reads "none yet" if nothing else qualifies.
133
- - **Each channel is checked against the early adopter**, mismatches named.
134
- - **Unit economics are computed with the derivation shown**, and payback longer than lifetime is flagged.
135
- - **Each top test has a sample, a pre-set pass/fail line, a cost and a time.**
136
- - **Nothing is invented**: no market sizes, competitors, prices, churn or channels the user didn't give.
137
-
138
- ## When to use this skill
139
-
140
- - ✅ A founder's or intrapreneur's idea in their own words: "is this worth building?"
141
- - ✅ "Fill in a lean canvas for…" or "what are my riskiest assumptions?"
142
- - ✅ Planning what to test before writing code or asking for budget
143
- - ✅ An internal tool pitch where adoption by another team is the real bet
144
-
145
- ## When NOT to use this skill
146
-
147
- - ❌ An investment case with options, NPV, payback ranges and a sponsor — `business-case`
148
- - ❌ The press release and FAQ for an idea that is already approved — `prfaq`
149
- - ❌ Market attractiveness, competitors, SWOT or Five Forces — `strategy-analysis`
150
- - ❌ How to measure a feature that has shipped or is about to — `success-metrics`
151
- - ❌ Turning interview notes or tickets already collected into themes — `feedback-synthesis`
152
-
153
- ## Anti-patterns to avoid
154
-
155
- - ❌ **The tidy grid.** Nine confident boxes and no ranking: the founder learns nothing they didn't write.
156
- - ❌ **Accepting the moat.** "Our AI" as unfair advantage. Funded competitors copy features.
157
- - ❌ **Counting "they'd use it" as evidence.** Opinion about the future is the weakest signal there is.
158
- - ❌ **Estimating the economics.** "Margins look healthy" when a $90 CAC against $30 of lifetime margin loses money on every customer.
159
- - ❌ **Riskiest assumption = will the tech work.** The usual killer is that the people can't be reached or don't care enough to pay.
160
- - ❌ **Tests with no fail line.** "Talk to some customers" can't fail, so it can't teach.
161
- - ❌ **Inventing a channel or a market size** to make a box look complete.
162
- - ❌ **Burying "change this first"** under the canvas, or leaving it out to be encouraging.
@@ -1,42 +0,0 @@
1
- [
2
- {
3
- "query": "Fill in a lean canvas for my idea: a subscription app that plans weekly meals for parents of kids with food allergies",
4
- "should_trigger": true
5
- },
6
- {
7
- "query": "What are the riskiest assumptions in my startup idea, and how do I test them before I write any code?",
8
- "should_trigger": true
9
- },
10
- {
11
- "query": "Poke holes in my business model — $49/month, we pay about $300 to get each customer, they stay around five months",
12
- "should_trigger": true
13
- },
14
- {
15
- "query": "I want to pitch an internal tool to the ops leadership team. Is it worth building, and what should I validate first?",
16
- "should_trigger": true
17
- },
18
- {
19
- "query": "How do I validate this idea cheaply this month? It's a marketplace for renting camping gear between neighbours",
20
- "should_trigger": true
21
- },
22
- {
23
- "query": "Write the business case for the new routing platform with build, buy and do-nothing options and NPV for the steering committee",
24
- "should_trigger": false
25
- },
26
- {
27
- "query": "The exec team approved the idea — write the press release and FAQ working backwards from launch",
28
- "should_trigger": false
29
- },
30
- {
31
- "query": "Run a Five Forces analysis on the meal-kit market before we decide whether to enter",
32
- "should_trigger": false
33
- },
34
- {
35
- "query": "What should we measure to know whether the new onboarding checklist worked after it ships?",
36
- "should_trigger": false
37
- },
38
- {
39
- "query": "Here are 30 customer interview notes — find the themes and what we should fix first",
40
- "should_trigger": false
41
- }
42
- ]