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.
- package/README.md +10 -10
- package/bin/skilldrop.js +15 -10
- package/catalogue.json +8 -4
- package/contracts/catalogue.schema.json +2 -1
- package/model-routing.json +70 -78
- package/package.json +1 -1
- package/packs/ai-engineering/skills/agent-adoption-stage/SKILL.md +0 -1
- package/packs/ai-engineering/skills/agent-adoption-stage/manifest.json +3 -4
- package/packs/ai-engineering/skills/ai-adoption-rollout/SKILL.md +0 -1
- package/packs/ai-engineering/skills/ai-adoption-rollout/manifest.json +3 -4
- package/packs/ai-engineering/skills/ai-readiness-assessment/SKILL.md +0 -1
- package/packs/ai-engineering/skills/ai-readiness-assessment/manifest.json +1 -2
- package/packs/ai-engineering/skills/ai-use-case-triage/manifest.json +3 -3
- package/packs/ai-engineering/skills/judge-audit/SKILL.md +29 -13
- package/packs/ai-engineering/skills/judge-audit/evals/evals.json +30 -0
- package/packs/ai-engineering/skills/judge-audit/evals/files/12/judge_runs.csv +241 -0
- package/packs/ai-engineering/skills/judge-audit/evals/files/12/rosa_labels.csv +33 -0
- package/packs/ai-engineering/skills/judge-audit/evals/files/13/moderation_eval.csv +601 -0
- package/packs/ai-engineering/skills/judge-audit/manifest.json +2 -3
- package/packs/ai-engineering/skills/llm-eval-harness/SKILL.md +1 -2
- package/packs/ai-engineering/skills/llm-eval-harness/manifest.json +3 -3
- package/packs/ai-engineering/skills/mcp-pairing/manifest.json +1 -1
- package/packs/ai-engineering/skills/mcp-pairing/reference.md +4 -3
- package/packs/ai-engineering/skills/subagent-design/SKILL.md +1 -0
- package/packs/ai-engineering/skills/subagent-design/examples/help-center-localization.md +146 -0
- package/packs/ai-engineering/skills/subagent-design/manifest.json +2 -2
- package/packs/api-builder/skills/prompt-caching-advisor/SKILL.md +4 -0
- package/packs/api-builder/skills/prompt-caching-advisor/examples/support-bot-block-order.md +120 -0
- package/packs/api-builder/skills/prompt-caching-advisor/manifest.json +2 -2
- package/packs/api-builder/skills/tool-use-schema-writer/manifest.json +2 -2
- package/packs/career/skills/application-form-answers/manifest.json +3 -3
- package/packs/career/skills/cover-letter/manifest.json +3 -3
- package/packs/career/skills/resume-tailor/manifest.json +3 -3
- package/packs/converters/skills/md-to-docx/manifest.json +3 -3
- package/packs/core/loops/ship-a-draft/evals/evals.json +28 -0
- package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-adr-from-thread/slack-thread.txt +47 -0
- package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-announcement-unsettled/ticket-PRD-412.md +44 -0
- package/packs/core/skills/output-hygiene/manifest.json +3 -3
- package/packs/data-analytics/loops/measure/evals/evals.json +30 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/schema.md +43 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/sql/finance_active_customers.sql +7 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/sql/growth_active_customers.sql +9 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/thread.md +30 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/request.md +34 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/schema.md +58 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/active_subscribers.sql +17 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/net_revenue_by_plan.sql +15 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/weekly_churn_rate.sql +34 -0
- package/packs/data-analytics/skills/dashboard-spec/SKILL.md +0 -1
- package/packs/data-analytics/skills/dashboard-spec/manifest.json +1 -2
- package/packs/design/skills/slide-outliner/manifest.json +2 -2
- package/packs/dev-team/loops/build/evals/evals.json +28 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/.github/workflows/ci.yml.fixture +19 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/cartcalc/__init__.py +4 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/cartcalc/pricing.py +47 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/pyproject.toml.fixture +9 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/story.md +61 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/tests/__init__.py +0 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/tests/test_pricing.py +49 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/.github/workflows/ci.yml.fixture +19 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/bug-report.md +25 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/pr-description.md +42 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/pyproject.toml.fixture +9 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/ratelimit/__init__.py +4 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/ratelimit/bucket.py +49 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/tests/__init__.py +0 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/tests/test_bucket.py +63 -0
- package/packs/dev-team/loops/modernize/evals/evals.json +30 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/.github/workflows/ci.yml.fixture +11 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/README.md +17 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/docs/adr/0004-late-fee-calculation.md +25 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/legacy/feecalc.py +74 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/samples/accounts_2026-10.txt +10 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/samples/accounts_edge.txt +11 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/tests/test_feecalc_smoke.py +21 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/.github/workflows/ci.yml.fixture +11 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/PR-412.md +24 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/README.md +17 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/docs/adr/0004-late-fee-calculation.md +25 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/__init__.py +1 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/cli.py +33 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/extract.py +33 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/rules.py +39 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/legacy/feecalc.py +74 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/samples/accounts_2026-10.txt +10 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/samples/accounts_edge.txt +11 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/tests/test_feecalc_smoke.py +21 -0
- package/packs/dev-team/loops/release/LOOP.md +4 -4
- package/packs/dev-team/loops/release/evals/eval_queries.json +10 -0
- package/packs/dev-team/loops/release/evals/evals.json +34 -0
- package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/0061_switch_to_haldrin_tokens.sql +22 -0
- package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/eng-notes.md +40 -0
- package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/merged-prs.md +13 -0
- package/packs/dev-team/loops/release/evals/files/release-saved-searches/merged-prs.md +13 -0
- package/packs/dev-team/loops/release/evals/files/release-saved-searches/readiness-evidence.md +27 -0
- package/packs/dev-team/loops/release/evals/files/release-saved-searches/traffic-baseline.md +23 -0
- package/packs/dev-team/loops/release/loop.json +1 -1
- package/packs/dev-team/skills/bug-triage/SKILL.md +1 -0
- package/packs/dev-team/skills/bug-triage/examples/export-row-limit-escalation.md +126 -0
- package/packs/dev-team/skills/bug-triage/manifest.json +2 -2
- package/packs/dev-team/skills/feature-implement-loop/manifest.json +2 -2
- package/packs/dev-team/skills/pr-description-writer/manifest.json +3 -3
- package/packs/dev-team/skills/pre-merge-review/manifest.json +2 -2
- package/packs/dev-team/skills/release-notes/manifest.json +2 -2
- package/packs/dev-team/skills/test-plan-generator/manifest.json +2 -2
- package/packs/experience-design/skills/service-blueprint/manifest.json +3 -3
- package/packs/experience-design/skills/ux-writing/manifest.json +3 -3
- package/packs/grc/loops/comply/evals/evals.json +29 -0
- package/packs/grc/loops/comply/evals/files/comply-chat-vendor-launch/vendor-brief.md +72 -0
- package/packs/grc/loops/comply/evals/files/comply-loyalty-app-unowned-risks/launch-note.md +31 -0
- package/packs/grc/loops/comply/evals/files/comply-loyalty-app-unowned-risks/risk-register.csv +6 -0
- package/packs/infra-as-code/skills/terraform-module/manifest.json +3 -3
- package/packs/product-manager/skills/prd-draft/SKILL.md +1 -0
- package/packs/product-manager/skills/prd-draft/examples/approver-delay-not-slack.md +142 -0
- package/packs/product-manager/skills/prd-draft/manifest.json +2 -2
- package/packs/product-manager/skills/user-journey-map/manifest.json +2 -2
- package/packs/research/loops/research/evals/evals.json +28 -0
- package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t1-ticket-volume.md +15 -0
- package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t2-release-notes-4-2.md +11 -0
- package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t3-billing-migration.md +12 -0
- package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t4-agent-poll.md +11 -0
- package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t5-app-store-reviews.md +12 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s1-analytics-export.md +29 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s2-email-delivery-report.md +25 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s3-pricing-changelog.md +9 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s4-trial-interview-notes.md +21 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s5-competitor-note.md +9 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s6-weekly-growth-recap.md +7 -0
- package/packs/research/skills/research-plan/manifest.json +3 -3
- package/packs/research/skills/source-synthesis/manifest.json +3 -3
- package/packs/skill-engineering/skills/skill-author/manifest.json +3 -3
- package/packs/solution-architect/loops/design/evals/evals.json +28 -0
- package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0001-postgres-system-of-record.md +23 -0
- package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0002-background-work-via-job-queue.md +23 -0
- package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0003-tenant-isolation-row-level.md +25 -0
- package/packs/solution-architect/loops/design/evals/files/design-bulk-export/prd-bulk-export.md +50 -0
- package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/adr/0002-background-work-via-job-queue.md +23 -0
- package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/adr/0004-new-stateful-infra-needs-platform-signoff.md +22 -0
- package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/prd-partner-webhooks.md +36 -0
- package/packs/solution-architect/skills/api-contract-draft/manifest.json +3 -3
- package/packs/solution-architect/skills/architecture-diagrams/manifest.json +3 -3
- package/packs/solution-architect/skills/design-doc/manifest.json +2 -2
- package/packs/solution-architect/skills/figma-diagrams/manifest.json +3 -3
- package/packs/sre-oncall/skills/cloud-cost-review/SKILL.md +0 -1
- package/packs/sre-oncall/skills/cloud-cost-review/manifest.json +1 -2
- package/packs/sre-oncall/skills/delivery-metrics-report/SKILL.md +0 -1
- package/packs/sre-oncall/skills/delivery-metrics-report/manifest.json +1 -2
- package/packs/sre-oncall/skills/incident-comms/manifest.json +2 -2
- package/packs/sre-oncall/skills/postmortem-generator/manifest.json +2 -2
- package/packs/stakeholder-comms/skills/decision-log/manifest.json +2 -2
- package/packs/trackers/skills/team-status-report/manifest.json +3 -3
- package/profiles.json +1 -1
- package/packs/ai-engineering/loops/adopt/LOOP.md +0 -120
- package/packs/ai-engineering/loops/adopt/evals/eval_queries.json +0 -10
- package/packs/ai-engineering/loops/adopt/evals/evals.json +0 -69
- package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/ai-ideas.md +0 -15
- package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/org-context.md +0 -27
- package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/staff-survey.csv +0 -11
- package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/ai-ideas.md +0 -13
- package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/firm-context.md +0 -23
- package/packs/ai-engineering/loops/adopt/loop.json +0 -53
- package/packs/ai-engineering/skills/ai-usage-report/SKILL.md +0 -111
- package/packs/ai-engineering/skills/ai-usage-report/evals/eval_queries.json +0 -30
- package/packs/ai-engineering/skills/ai-usage-report/evals/evals.json +0 -46
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/1/northwind-ai-events.csv +0 -4213
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/draftwell-events.csv +0 -249
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/export-note.md +0 -9
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/published-assets.csv +0 -44
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/team-roster.md +0 -10
- package/packs/ai-engineering/skills/ai-usage-report/examples/weekly-engineering-team.md +0 -133
- package/packs/ai-engineering/skills/ai-usage-report/manifest.json +0 -12
- package/packs/ai-engineering/skills/ai-usage-report/scripts/build_report.py +0 -453
- package/packs/ai-engineering/skills/ai-usage-report/templates/report-per-user.md +0 -42
- package/packs/ai-engineering/skills/ai-usage-report/templates/report-team-rollup.md +0 -49
- package/packs/ai-engineering/skills/ai-usage-report/templates/usage-event-schema.md +0 -76
- package/packs/career/loops/apply/LOOP.md +0 -97
- package/packs/career/loops/apply/evals/eval_queries.json +0 -9
- package/packs/career/loops/apply/evals/evals.json +0 -27
- package/packs/career/loops/apply/loop.json +0 -52
- package/packs/product-manager/loops/discover/LOOP.md +0 -82
- package/packs/product-manager/loops/discover/evals/eval_queries.json +0 -30
- package/packs/product-manager/loops/discover/evals/evals.json +0 -26
- package/packs/product-manager/loops/discover/loop.json +0 -41
- package/packs/product-manager/skills/lean-canvas/SKILL.md +0 -162
- package/packs/product-manager/skills/lean-canvas/evals/eval_queries.json +0 -42
- package/packs/product-manager/skills/lean-canvas/evals/evals.json +0 -82
- package/packs/product-manager/skills/lean-canvas/evals/files/1/pawpass-notes.md +0 -54
- package/packs/product-manager/skills/lean-canvas/evals/files/3/lunchloop-pitch.md +0 -30
- package/packs/product-manager/skills/lean-canvas/evals/files/4/clubkit-notes.md +0 -44
- package/packs/product-manager/skills/lean-canvas/evals/files/5/cost-model.csv +0 -5
- package/packs/product-manager/skills/lean-canvas/evals/files/5/proposal.md +0 -40
- package/packs/product-manager/skills/lean-canvas/evals/files/5/stakeholder-emails.txt +0 -18
- package/packs/product-manager/skills/lean-canvas/examples/bike-repair.md +0 -72
- package/packs/product-manager/skills/lean-canvas/manifest.json +0 -34
- package/packs/product-manager/skills/lean-canvas/reference.md +0 -102
- package/packs/product-manager/skills/lean-canvas/scripts/unit_economics.py +0 -211
- package/packs/sre-oncall/loops/operate/LOOP.md +0 -84
- package/packs/sre-oncall/loops/operate/evals/eval_queries.json +0 -30
- package/packs/sre-oncall/loops/operate/evals/evals.json +0 -25
- 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
|
-
]
|