Riskiest-Assumption Test
Convert the beliefs captured in the validation-canvas Stress Tests into
falsifiable hypotheses with explicit test methods, success criteria, and
kill criteria. Ship a 1-page Assumption Test Plan plus an interactive risk ×
impact matrix.
This skill's job is experimental: what have we proven, and what's the cheapest experiment that would invalidate the next belief? It's the bridge between the canvas (declarative beliefs) and the pitch deck (story you can defend).
What this skill produces
Every run produces exactly two files, both in the resolved RAT root
(see Phase 0 Step 0.0 for path resolution; default is docs/rat/ for solo
runs, docs/startup-kit/rat/ when invoked via orchestrator):
assumption-test-plan.md— canonical, editable Markdown with sections:## Assumptions Dump,## Ranking Matrix,## Top 3 Hypotheses,## Test Plan,## Kill Criteria,## Results. Headings are load-bearing —pitch-deckandstartup-grillgrep them.## Resultsis initially empty; the founder fills it in as tests complete, which triggers the loop-back protocol.test-matrix.html— interactive risk × impact matrix. Single self-contained HTML file. Each assumption is a draggable card on a 2D plane; click to expand the hypothesis, success criteria, kill criteria, and chosen test method. Color-coded by category (desirability / viability / feasibility). Print-clean for inclusion in board decks. Zero network dependencies.
Both files go into the resolved RAT folder. Existing files from prior sessions are appended-to (Results section), never silently overwritten.
What this skill is NOT
- Not a canvas builder. The canvas (Lean + VPC) is
validation-canvas's job. RAT reads the canvas; it does not produce it. - Not a pitch deck. The deck is
pitch-deck's job. RAT gates the deck — pitch-deck refuses to ship if RAT Results are empty for top-3 hypotheses (heavy gate). - Not the experiments themselves. RAT produces a plan — what to test,
how to test it, what success looks like. The actual landing page,
concierge service, or Wizard of Oz prototype is built in the founder's
real product surface (or with
web-artifacts-builder, etc.). - Not a generic A/B-testing framework. Methods here are early-stage validation experiments (concierge, Wizard of Oz, fake door, pre-sale, smoke test, 5-interview rule). Optimization-grade A/B testing is downstream and out of scope.
- Not a substitute for talking to customers. Several test methods require customer interviews. The skill helps design them; it does not do them for the founder.
- Not a market research firm. RAT is about what to test cheaply, not about commissioning a Forrester report.
Skill Boundaries
| Request | Skill |
|---|---|
| "Help me design an assumption test" | riskiest-assumption-test (this skill) |
| "What's my riskiest assumption?" | riskiest-assumption-test |
| "Plan a Wizard of Oz / concierge / smoke / fake-door experiment" | riskiest-assumption-test |
| "Build a landing page for my fake-door test" | web-artifacts-builder (after this skill names the test design) |
| "Discuss validation strategy with a team" | team-composer with @startup_strategist + @ux_researcher |
| "Update my canvas because a test invalidated something" | validation-canvas (loop-back, update mode) |
| "Score my pitch deck adversarially" | startup-grill |
If the founder asks for both planning AND running ("plan AND run my fake-door test"), do the planning here, then route to the appropriate builder skill for the artifact. Don't try to be a build tool inside an experiment-design skill.
Phase 0: Read prior artifacts (medium gate)
Goal: confirm validation-canvas.md exists, parse it, and STOP if it's
missing.
Step 0.0 — Path resolution + manifest awareness (v2.2.0+)
Resolve the RAT root once at invocation, in this precedence order (canonical chain):
- Explicit
output_dirarg (passed bystartup-launch-kit) → use as-is. STARTUP_KIT_DOCS_ROOTenv var set →${STARTUP_KIT_DOCS_ROOT}/rat/.- Smart default —
docs/startup-kit/exists →docs/startup-kit/rat/. Surface the smart-default notice: "Writing todocs/startup-kit/rat/(smart default). SetSTARTUP_KIT_DOCS_ROOT=./docsto write standalone instead." - Solo fallback →
docs/rat/.
Manifest awareness. Look for kit-manifest.json at
<resolved-kit-root>/kit-manifest.json first; fall back to the
working-directory root for backward compat. Use it as a hint, never as a
bypass:
- If the manifest lists
riskiest-assumption-testascompletedwith a recent mtime, surface that fact: "Manifest says you ran RAT on [date]. Update mode (re-rank, add results, revise top 3), fresh run, or skip to the next step?" Update mode is the common case — the founder just ran experiments and is updating## Results. - The
intake_answerscache, if populated, informs how to communicate push-back rigor in Phase 3 (Hypothesis Rewriting) — repeat founders get push-back on glib hypotheses regardless of declared mode. - Manifest read failures (corrupt JSON, missing fields) are non-fatal — log the issue inline and proceed as if no manifest exists.
After this skill ships its artifacts (Phase 5 — render & ship), if a
manifest exists, append/update this skill's entry. Use atomic write (write
.tmp, then rename). If the manifest doesn't exist, do NOT create it
— that's the startup-launch-kit orchestrator's job. See
startup-launch-kit/references/manifest-schema.md
for the schema.
Step 0.1 — Check for validation-canvas.md
Look for validation-canvas.md at <canvas-root>/validation-canvas.md —
the canvas root is the sibling of this skill's RAT root (e.g.,
docs/startup-kit/canvas/ when this skill's root is
docs/startup-kit/rat/, or docs/canvas/ when this skill's root is
docs/rat/). Fall back to the legacy path validation-canvas.md (cwd
root) for backward compat. If the file is missing at both, STOP and
route the founder to validation-canvas:
"This skill needs
validation-canvas.mdas its starting point — the Stress Tests section is the seed for the assumption dump. Runvalidation-canvasfirst; come back here when the canvas exists."
If the canvas was found at the legacy path, surface a one-line notice so the founder knows the artifact is at a v1 location: "Read canvas from legacy v1 path."
Override (rare): if the founder explicitly says they have a canvas in their head and want to RAT a one-pager directly, accept a paragraph dump that names: top customer segment, UVP, top 1–3 problems, and 3+ assumptions they're not sure of. Skip below the override is unusual — the canvas is the right starting point.
Step 0.2 — Parse the canvas
Read the canvas's ## Stress Tests section first — that's the explicit
seed. Then scan the Lean Canvas blocks for [Unknown — …] markers and the
VPC for un-relieved Pains and un-created Gains. Each is an assumption
candidate.
Step 0.3 — Check for prior assumption-test-plan.md
Look at <rat-root>/assumption-test-plan.md first; fall back to legacy
rat/assumption-test-plan.md (cwd-relative). If present, this is a re-run.
Surface the prior top-3 hypotheses and their Results status. Either the
founder is updating Results (run Phase 5 only) or revising the plan (full
Phase 1–5).
Phase 1: Assumption Dump
Goal: surface every implicit belief in the canvas, categorized.
Use Christensen's three-axis framing:
- Desirability — will customers want this? (Problem fit, UVP fit, segment intensity.)
- Viability — will the business model work? (Pricing, willingness to pay, unit economics, channel CAC.)
- Feasibility — can we actually build/deliver this? (Technical risk, partner risk, regulatory risk, team capacity.)
For each assumption:
- Quote the canvas line that surfaced it. ("UVP: 'Save 4 hours a week of contract redlining' assumes the segment values that 4 hours at > $300/mo.")
- Categorize as desirability / viability / feasibility. (Some assumptions span — pick the primary.)
- Phrase as a belief, not a fact. ("We believe X" — the framing makes the test-design phase easier later.)
Output: a flat list of 8–15 assumptions. (Fewer means you're missing some; more means you're being too granular — collapse closely related ones.)
See references/hypothesis-rewriting.md for the belief → hypothesis
conversion patterns used in Phase 3.
Phase 2: Risk × Impact Ranking
Goal: pick the top 3 assumptions to test now.
For each assumption, score on two axes:
- Risk (likelihood it's wrong): Low / Medium / High.
- Impact (consequence if wrong): Low / Medium / High → the higher end is "kills the business if invalidated."
Plot mentally on a 3×3 matrix. The Top 3 come from the high-risk + high-impact corner. If you have fewer than 3 in that corner, supplement from high-impact + medium-risk. Never test low-impact assumptions first — even if they're high-risk, the result doesn't move you forward.
See references/ranking-matrix.md for scoring rubrics with worked examples
and common scoring traps (e.g., founders systematically under-rate
desirability risk because they've already convinced themselves the
problem is real).
The Top 3 will be the assumptions written into ## Top 3 Hypotheses in the
output Markdown and rendered as the largest cards in the interactive HTML
matrix.
Phase 3: Hypothesis Rewriting (vague belief → falsifiable claim)
Goal: convert each top-3 belief into a falsifiable hypothesis that has a clear measurable outcome.
The pattern (see references/hypothesis-rewriting.md for full guidance and
worked examples):
We believe [specific assumption about a specific segment].
We'll know this is true if [specific measurable outcome] within [time bound].
Hard rules:
- The outcome must be observable — not "they like it", but "5 of 10 interviewees ask if they can buy it now."
- The outcome must be measurable — name the unit, named threshold.
- The time bound must be short — days or weeks at this stage, not quarters. Long time bounds are a sign of an unfalsifiable belief.
- The hypothesis must be falsifiable — there must be a plausible outcome that would convince the founder they were wrong.
Anti-patterns to refuse:
- "We believe customers will love it." (Not measurable.)
- "We believe the market is huge." (Wrong granularity — that's a market question, not an assumption test.)
- "We believe it'll work eventually." (Time-unbounded.)
- "We believe the data will show product-market fit." (Outcome is too abstract.)
If the founder produces an unfalsifiable hypothesis, push back. Don't write a test plan for a vague claim; the resulting test will produce noise.
Phase 4: Test Method Selection
Goal: match each top-3 hypothesis to the cheapest test method that can falsify it.
See references/test-method-catalog.md for the full catalog. Quick guide:
| Hypothesis category | Best methods (cheapest first) |
|---|---|
| Desirability (do they want it?) | Customer interviews (5-interview rule), landing page + email capture, fake-door test, social-media smoke test |
| Viability (will they pay?) | Pre-sale, concierge MVP with explicit pricing, willingness-to-pay survey + interview |
| Feasibility (can we deliver?) | Wizard of Oz, technical spike, prototype with stub data, expert interview |
For each top-3 hypothesis, write into the Test Plan:
- Method (named: e.g., "Concierge MVP — manually fulfill the first 5 orders").
- Setup (what you'll build/arrange — landing page URL, interview protocol, etc.).
- Sample (who, how many — "10 ICP-matched founders sourced from X").
- Success criteria (the measurable outcome from the hypothesis, restated; e.g., "≥ 4 of 10 sign LOI and pay $500 deposit").
- Kill criteria (the outcome that says you were wrong — usually a simple "less than X").
- Time bound (start date, end date — measured in days or weeks).
- Cost estimate (hours of work + dollars; if either is large, look for a cheaper method).
Hard rules:
- Method must match category. Don't run a Wizard of Oz to test willingness to pay (you need real money), and don't run a pre-sale to test feasibility (you might be able to sell it but not build it).
- Cheapest first. The job is to find out fast, not to build the product. If the cheapest method is a 30-min interview, do the interview.
- Fake-door tests need a real "door." Landing pages with a fake "Buy" button only work if you can plausibly support the demand if it materializes.
Phase 5: Render & Ship (and update mode)
Goal: produce <rat-root>/assumption-test-plan.md and
<rat-root>/test-matrix.html, save them, and present.
Step 1 — Produce assumption-test-plan.md
Structure (headings are load-bearing — pitch-deck and startup-grill
grep them):
# Assumption Test Plan — [Business Name]
> Generated [YYYY-MM-DD]. Based on `validation-canvas.md` (last updated [date]).
## Assumptions Dump
### Desirability
- [Assumption] — sourced from canvas line: "..."
- ...
### Viability
- ...
### Feasibility
- ...
## Ranking Matrix
| # | Assumption | Risk | Impact | Top 3? |
|---|---|---|---|---|
| 1 | ... | High | High | ✅ |
| 2 | ... | Med | High | ✅ |
| 3 | ... | High | Med | ✅ |
| 4 | ... | Med | Med | — |
...
## Top 3 Hypotheses
### Hypothesis 1: [short label]
- **We believe:** [specific assumption about a specific segment]
- **We'll know this is true if:** [measurable outcome] within [time bound]
- **Category:** Desirability / Viability / Feasibility
### Hypothesis 2: [short label]
- ...
### Hypothesis 3: [short label]
- ...
## Test Plan
### Test 1: [method name] for Hypothesis 1
- **Method:** ...
- **Setup:** ...
- **Sample:** ...
- **Success criteria:** ...
- **Kill criteria:** ...
- **Time bound:** [start] to [end]
- **Cost estimate:** [hours] + [dollars]
### Test 2: ...
### Test 3: ...
## Kill Criteria
(Summary of when each hypothesis is considered killed. Founder reads this
section under pressure; keep it terse.)
| # | Hypothesis | Killed if |
|---|---|---|
| 1 | ... | ... |
| 2 | ... | ... |
| 3 | ... | ... |
## Results
(Initially empty. Founder fills this section as tests complete. Each row
triggers loop-back protocol per `validation-canvas/references/folder-contract.md`.)
| # | Hypothesis | Test ran | Result | Status | Date |
|---|---|---|---|---|---|
| | | | | | |
> When a hypothesis is invalidated, return to `validation-canvas` in update
> mode and revise the affected blocks. Do not advance to `pitch-deck` with
> invalidated core assumptions.
Step 2 — Produce test-matrix.html
Read the template pattern in references/matrix-html-template.md (see file
for the full single-file Vanilla JS implementation). Key features:
- Self-contained — single file, all JS/CSS inline, zero network dependencies.
- Interactive 3×3 risk × impact grid. Each assumption is a draggable card. Founder can re-rank by dragging. Drops snap to grid cells.
- Click to expand. Card expands in place to show the hypothesis, success criteria, kill criteria, test method, and Results status.
- Color-coded by category. Desirability, Viability, Feasibility get three distinct accent colors (use brand-kit tokens if present).
- Top-3 highlight. The 3 cards selected as Top 3 in Phase 2 get a visible badge and a thicker border.
- Print-clean.
@media printcollapses to a static grid that prints cleanly to PDF for board decks. Drag handles hide; expanded states collapse to brief text.
Note: the matrix is declarative only — it visualizes the plan. It does NOT execute the experiments and does NOT write to the Markdown file. Edits in the HTML are session-local; persistence is the founder's job (re-run this skill to update the canonical Markdown).
Step 3 — Save to the resolved RAT folder
<rat-root>/assumption-test-plan.md<rat-root>/test-matrix.html
Where <rat-root> is resolved per Phase 0 Step 0.0
(docs/startup-kit/rat/ orchestrated, docs/rat/ solo default, etc.).
Create the folder if absent.
Existing files from prior sessions: append to ## Results, never silently
overwrite the rest. If the founder is materially revising the plan, ask
explicitly: "This will rewrite Hypotheses and Test Plan but preserve
Results. Confirm?"
Step 4 — Present to the user
Use present_files if available. Otherwise emit clickable computer://
links. Present the HTML first (visual primary), Markdown second.
End with three lines:
- "Riskiest assumption right now: [Hypothesis 1 in plain language]."
- "Cheapest way to test it this week: [test method, time bound, cost]."
- "Next step: run the test. When you have results, update
## Resultsand re-invokevalidation-canvasif any hypothesis was invalidated. Do NOT skip topitch-deckuntil at least one top-3 hypothesis has a confirmed result."
The third line is the heavy gate to pitch-deck. Surface it explicitly
so the founder knows pitching is blocked until results land.
Update mode (post-results loop-back)
When the founder re-invokes this skill after running tests:
- Read existing
<rat-root>/assumption-test-plan.md. Identify which Results rows are populated. - Diff with prior state. What changed?
- For each invalidated hypothesis: Surface the loop-back: "Hypothesis
[N] failed (Result: …). The affected canvas block is [block]. Run
validation-canvasin update mode to revise that block, then re-run RAT if the revision changes other assumptions." - For each confirmed hypothesis: Mark it confirmed. Note that the
founder is now free to advance to
pitch-deckfor that line of reasoning. - Suggest next experiments. If the top 3 are all resolved, the next 3 from the ranking matrix become the new top 3.
This is the loop-back protocol — invalidated assumptions are a normal
action, not a failure mode. See
validation-canvas/references/folder-contract.md
for the full pipeline-wide protocol.
Output Files
<rat-root>/assumption-test-plan.md Canonical, editable test plan
<rat-root>/test-matrix.html Interactive risk × impact matrix
Where <rat-root> resolves per Phase 0 Step 0.0:
docs/startup-kit/rat/— orchestrated (viastartup-launch-kit)docs/rat/— solo defaultdocs/startup-kit/rat/— solo withdocs/startup-kit/smart default${STARTUP_KIT_DOCS_ROOT}/rat/— env-var override
No other files. Do not scatter intermediate analyses across the working folder.
Quality Checklist
Before presenting to the user, verify each:
Phase 0 (Gate)
-
validation-canvas.mdexists (or override path was used with explicit one-pager input) - Stress Tests section +
[Unknown — …]markers were parsed as the assumption seed
Phase 1–4 (Plan)
- 8–15 assumptions in the dump (not fewer, not more)
- Each assumption has a quoted canvas line and a category
- Top 3 selected from high-impact corner of the matrix (with reasoning if a high-risk + low-impact item was excluded)
- Each top-3 hypothesis is falsifiable (measurable outcome, time bound, observable signal)
- Each top-3 hypothesis has a Test Plan row with method, setup, sample, success criteria, kill criteria, time bound, cost estimate
- Method matches hypothesis category (no Wizard of Oz for viability, no pre-sale for feasibility)
- Cheapest method considered first (no $50K research project when 10 interviews would do)
Phase 5 (Output)
-
assumption-test-plan.mduses the exact heading structure (sopitch-deckandstartup-grillcan parse it) -
test-matrix.htmlis a single file, opens in a browser, drag works, click-to-expand works, prints cleanly -
## Resultssection preserved if existing file was being updated - Brand tokens applied if
<kit-root>/brand/DESIGN.md(or legacybrand-kit/DESIGN.md) present; readscolors.primaryfrom YAML front matter - Files saved to the resolved RAT folder per Phase 0 Step 0.0 (not cwd root)
- Smart-default notice surfaced if smart-default fired
- Response ends with the three lines (riskiest assumption + cheapest test + heavy-gate-to-pitch-deck note)
Cross-Skill Integration
| Skill | When to Use |
|---|---|
validation-canvas (our own) |
Required upstream (medium gate). This skill STOPs without validation-canvas.md. After this skill ships, invalidated hypotheses route back to validation-canvas in update mode (loop-back). |
pitch-deck (our own) |
Downstream (heavy gate). Pitch-deck STOPs without populated ## Results for top-3 hypotheses. Override available with [PRE-VALIDATION DRAFT] watermark. |
startup-grill (our own) |
Last step. Reads <rat-root>/assumption-test-plan.md Results to check whether canvas was iterated after testing (yellow-flags pristine pipelines). |
brand-workshop (our own) |
Upstream — provides design tokens via DESIGN.md (Google Labs spec, version alpha; reads colors.primary from YAML front matter) at <kit-root>/brand/DESIGN.md or legacy brand-kit/DESIGN.md for the interactive matrix HTML. Optional. |
team-composer (our own) |
Instead of this skill when the founder wants to discuss validation strategy without committing to a written plan. After this skill when the test plan needs multi-role pressure-testing. |
web-artifacts-builder (Anthropic) |
After this skill names a fake-door / landing-page test, use this to actually build the test surface. |
theme-factory (Anthropic) |
When the matrix HTML needs branded styling and no brand artifact (<kit-root>/brand/DESIGN.md or legacy brand-kit/DESIGN.md) is present. |
pdf (Anthropic) |
When merging the test plan into a board packet. |
Principle: this skill owns the test design — what to test, how to test it, what success and kill look like. It does not run the tests, does not build the test surfaces, does not validate the canvas, and does not produce the pitch. Hand off rather than over-reach.
Graceful degradation: if a referenced skill is not installed, this
skill still ships <rat-root>/assumption-test-plan.md +
<rat-root>/test-matrix.html — downstream integrations are enhancements,
not requirements.