From flywheel
Design growth experiments using Matt Lerner's behavior-first framework. Starts with a specific user behavior, diagnoses the barrier, and produces a testable experiment card. Use after positioning is established to turn positioning into traction. Supports multi-canvas portfolios via the --canvas flag.
npx claudepluginhub untangling-systems/flywheel --plugin flywheelThis skill uses the workspace's default tool permissions.
<grow_context> #$ARGUMENTS </grow_context>
Verifies tests pass on completed feature branch, presents options to merge locally, create GitHub PR, keep as-is or discard; executes choice and cleans up worktree.
Guides root cause investigation for bugs, test failures, unexpected behavior, performance issues, and build failures before proposing fixes.
Writes implementation plans from specs for multi-step tasks, mapping files and breaking into TDD bite-sized steps before coding.
<grow_context> #$ARGUMENTS </grow_context>
Design a growth experiment that's specific enough for someone else to run. Matt Lerner's framework: most growth problems are behavior problems. Find the behavior, diagnose the barrier, test the smallest intervention.
This skill reads a positioning canvas to design experiments. The path is resolved in this order:
--canvas <path> in the user's arguments. Use that path.--canvas, scan docs/positioning/ for .md files (excluding portfolio.md and archive/). If exactly one exists, use it. If multiple exist, list them and ASK which to design experiments for.docs/positioning/current.md.For all references below to docs/positioning/current.md, substitute the resolved canvas path.
/fw:position has established who you're for and why they careSearch for docs/positioning/current.md.
If it doesn't exist: Redirect. "Growth experiments without positioning are shots in the dark. Who are you targeting? What do they care about? Run /fw:position first — your growth experiments need to target specific segments with specific value claims."
This is a soft redirect, not a hard block. If the user insists, proceed with a warning: "Proceeding without a positioning canvas. The experiment may target too broad an audience or test a value prop that hasn't been validated. I'll flag this in the experiment card."
If it exists: Read it. Extract the customer segments and value chains — these constrain which behaviors and barriers are worth testing.
Search docs/growth-experiments/ for existing files.
If any exist: Summarize:
"You have [N] prior experiments. [Brief summary: which behaviors targeted, which completed, what results]. Want to review any before designing a new one?"
Note experiments that are still running (status: running) — avoid designing experiments that conflict with active ones.
If none: Proceed.
Search docs/copy-tests/ for files with filled-in Outcome Notes. If any exist, note which messaging has been tested in the real world — this informs which value claims have traction.
If the user provided an argument (a behavior or growth challenge), carry it into Step 1. If not, proceed to Step 1 with the opening question.
Five steps, in order. Lerner's framework works because each step constrains the next. Use references/enforcement-prompts.md for redirect and warning text.
"What specific action do you want a person to take? Not a metric — a behavior. Not 'increase signups' — 'a seed-stage founder clicks Start Free Trial within 60 seconds of landing on the homepage.' Who does what, where, when?"
What you're looking for:
Enforcement triggers:
references/enforcement-prompts.md)When this step is done: You have a sentence: "[Specific person] [specific action] [specific context]."
Use AskUserQuestion to confirm:
"The target behavior: [statement]. Is this the right behavior to focus on, or should we sharpen it?"
"Why aren't they doing this already? What's stopping them? Think about the real barriers — not what you assume, but what you've observed or what's likely given their situation."
Present Lerner's barrier categories to guide the diagnosis:
What you're looking for:
Enforcement triggers:
When this step is done: One named barrier with evidence and a connection to the positioning.
Use AskUserQuestion to confirm:
"The primary barrier: [barrier type] — [specific description]. Evidence: [what supports this]. Sound right?"
"Now turn the barrier into a hypothesis. Format: 'If we [intervention], then [behavior] will [change], because [barrier] will be reduced.' The intervention should be the smallest thing that could work."
What you're looking for:
Enforcement triggers:
When this step is done: A complete hypothesis statement with intervention, predicted change, and causal reasoning.
"How will you actually run this test? Walk me through the mechanics: what you'll change, who sees it, how long it runs, and what you'll measure."
Read the experiment template from references/experiment-card-template.md for the structure.
What you're looking for:
Enforcement triggers:
When this step is done: A complete experiment design.
"Before you run this, decide what success looks like. What result would make you say 'the hypothesis was right, double down on this'? What result would make you say 'the hypothesis was wrong, try a different barrier'? And what's the ambiguous middle — the result that means you need to run it again or dig deeper?"
What you're looking for:
Enforcement triggers:
When this step is done: Complete success criteria with success, failure, ambiguous thresholds, and next bets.
After all 5 steps are complete:
references/experiment-card-template.md"Here's your experiment card. Read it imagining you're handing it to someone who wasn't in this conversation. Could they run this experiment without asking you any questions? If not, what's missing?"
This is the success gate from Lerner's framework — the card must be executable by someone who didn't design it.
After user approval:
docs/growth-experiments/{slug}-{date}.mdFrontmatter:
---
type: growth-experiment
tags: [behavior keywords, barrier type, channel/context]
confidence: [ask user: high, medium, low]
created: YYYY-MM-DD
source: [session description]
positioning-canvas: docs/positioning/current.md
behavior: "[the target behavior from Step 1]"
barrier: "[the barrier type and description from Step 2]"
status: designed
---
The status field tracks experiment lifecycle: designed → running → completed. Users update this manually or via /fw:compound.
Use AskUserQuestion:
Question: "Experiment card saved to docs/growth-experiments/[filename]. What next?"
Options:
/fw:grow again for a different behavior or barrier/fw:copy to create the intervention's copy (landing page variant, email, etc.)/fw:compound to capture what you learned about your growth model/fw:position if the experiment design revealed positioning gapsBehaviors, not metrics. The framework starts with what a person does, not what a dashboard shows. "Increase signups" is not a behavior. "A seed-stage founder clicks Start Free Trial" is. This distinction is the core of Lerner's framework — enforce it relentlessly.
One barrier at a time. Every growth experiment tests one barrier. If you're not sure which barrier is biggest, that's your first experiment — a diagnostic, not an optimization.
Smallest intervention. The experiment should be embarrassingly simple. If it requires a sprint of engineering work, it's too big. The goal is to learn whether the barrier diagnosis is correct, not to build the final solution.
Success criteria before running. Define what success, failure, and ambiguity look like before the experiment starts. Humans are excellent at rationalizing results after the fact. Pre-committed criteria prevent that.
Grounded in positioning. The behavior should target a segment from the canvas. The barrier should relate to a value claim. The intervention should use messaging from the positioning. Growth experiments that ignore positioning are random acts of marketing.
The card must be handoff-ready. If someone who wasn't in this session can't run the experiment from the card alone, the card isn't done.
Come back with results. The experiment card has a result field that starts empty. Encourage the user to return with /fw:compound to record what happened. That's where the compounding loop closes.
When invoked with disable-model-invocation context:
--canvas <path> if provided; otherwise apply Canvas Path Resolution silently (single canvas: use it; multiple: use docs/positioning/current.md and flag the assumption; none: use docs/positioning/current.md)source: "pipeline mode — assumptions flagged"