Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Opportunity Solution Tree (Teresa Torres) mapping outcomes → opportunities → solutions → assumption tests. Use when prioritizing discovery work, mapping solutions to a problem, or checking whether a roadmap moves outcomes.
.claude/skills/borghei-opportunity-solution-tree/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 122% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 91% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 5% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 125% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 97% | 0% |
Teresa Torres' framework from Continuous Discovery Habits. An OST visualizes the path from a desired outcome to the assumption tests that will validate or invalidate candidate solutions.
[Outcome]
|
+-------------+-------------+
| | |
Opportunity Opportunity Opportunity
| | |
+--+--+ +--+--+ +--+--+
| | | | | |
Solution Solution ...
|
+----+----+
| |
Assumption Assumption
Test TestBefore building the tree, confirm these inputs. If any is unknown or vague, ASK — do not assume:
Stop rule: ask only the 2-3 that most change the output. If the user says "just draft it," proceed and list your assumptions at the top of the artifact.
A good outcome is:
Examples:
NOT outcomes:
Opportunities come from customer evidence, not the team's imagination:
Opportunities are customer problems/needs, not solutions:
Group similar opportunities. Aim for 3-7 distinct opportunity clusters per outcome.
For each opportunity, brainstorm 3-5 solutions. Resist jumping to one.
Multiple solutions matter because:
For each candidate solution, list:
For each top assumption, design a cheap test (interview, prototype, A/B, landing page, prefab Wizard-of-Oz).
ost_validator.pyAudit for: missing outcome, opportunities written as solutions, single-solution branches, no assumption tests, tree without recent updates.
bashpython3 project-management/discovery/opportunity-solution-tree/scripts/ost_validator.py \ --input ost.json --format markdown
OST is a living artifact. Each week:
Wrong: "Build the new dashboard" (output) Wrong: "Make customers happy" (vague) Wrong: "Hit $20M ARR" (too high; many teams)
Right: One number a team can move. Decompose company OKRs to team-level outcome. See project-management/execution/north-star-metric.
If the statement is a thing to build → solution. If the statement is a customer pain / desire / need → opportunity.
| Statement | Type | |-----------|------| | "Add bulk CSV import" | Solution | | "Admins want to invite many users at once" | Opportunity | | "Build SAML SSO" | Solution | | "Enterprise IT requires SSO to approve purchase" | Opportunity | | "Replace the onboarding video" | Solution | | "New users can't find the start button" | Opportunity |
For each opportunity:
Score = impact × frequency × strategic fit. Prioritize accordingly.
Don't allow single-solution branches. If only one solution comes up:
Goal: at least 3 candidate solutions per opportunity worth pursuing.
For each solution, the cheapest test first:
Spend the minimum to learn the most.
references/ost-fundamentals.md — Teresa Torres framework deepreferences/ost-anti-patterns.md — common failures + fixesproject-management/discovery/identify-assumptions — assumption surfacingproject-management/discovery/brainstorm-experiments — test designproject-management/discovery/customer-interview-script — interview prepproject-management/discovery/interview-synthesis — turn interviews into opportunitiesproject-management/execution/north-star-metric — outcome definitionproject-management/strategy-frameworks/lean-canvas — strategic contextproduct-team/research-summarizer — interview synthesis| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-04 | pass→pass | 10,196 | 12,572 | +23% | 1 | 1 | 0% | 1,762 | 3,963 | +125% | 0 | 0 | — |
case-01 | fail→fail | 24,698 | 19,951 | -19% | 1 | 1 | 0% | 4,183 | 5,076 | +21% | 0 | 0 | — |
case-02 | fail→fail | 26,668 | 20,579 | -23% | 1 | 1 | 0% | 4,069 | 5,005 | +23% | 0 | 0 | — |
case-03 | fail→pass | 13,149 | 14,834 | +13% | 1 | 1 | 0% | 1,954 | 4,345 | +122% | 0 | 0 | — |
case-05 | pass→pass | 13,478 | 14,235 | +6% | 1 | 1 | 0% | 2,128 | 4,191 | +97% | 0 | 0 | — |
case-06 | pass→pass | 16,199 | 17,019 | +5% | 1 | 1 | 0% | 2,366 | 4,512 | +91% | 0 | 0 | — |
case-07 | pass→pass | 18,261 | 16,537 | -9% | 1 | 1 | 0% | 2,702 | 4,391 | +63% | 0 | 0 | — |
case-08 | pass→pass | 12,678 | 11,972 | -6% | 1 | 1 | 0% | 1,871 | 3,832 | +105% | 0 | 0 | — |
case-09 | pass→pass | 16,475 | 14,658 | -11% | 1 | 1 | 0% | 2,544 | 4,136 | +63% | 0 | 0 | — |
case-14 | fail→pass | 17,675 | 18,199 | +3% | 1 | 1 | 0% | 2,366 | 4,522 | +91% | 0 | 0 | — |
case-10 | fail→fail | 16,232 | 13,698 | -16% | 1 | 1 | 0% | 2,435 | 4,091 | +68% | 0 | 0 | — |
case-11 | fail→pass | 14,908 | 2,781 | -81% | 1 | 1 | 0% | 2,360 | 2,485 | +5% | 0 | 0 | — |
case-12 | pass→pass | 14,909 | 16,393 | +10% | 1 | 1 | 0% | 2,192 | 4,465 | +104% | 0 | 0 | — |
case-13 | pass→pass | 15,640 | 13,914 | -11% | 1 | 1 | 0% | 2,292 | 3,974 | +73% | 0 | 0 | — |
case-15 | pass→pass | 13,627 | 11,652 | -14% | 1 | 1 | 0% | 2,059 | 3,700 | +80% | 0 | 0 | — |
case-16 | pass→pass | 10,898 | 7,067 | -35% | 1 | 1 | 0% | 1,617 | 2,943 | +82% | 0 | 0 | — |
case-17 | pass→pass | 13,935 | 7,724 | -45% | 1 | 1 | 0% | 2,113 | 3,191 | +51% | 0 | 0 | — |
case-18 | pass→pass | 11,360 | 12,209 | +7% | 1 | 1 | 0% | 1,651 | 3,626 | +120% | 0 | 0 | — |
case-19 | pass→pass | 12,951 | 11,611 | -10% | 1 | 1 | 0% | 2,040 | 3,728 | +83% | 0 | 0 | — |
case-20 | pass→pass | 13,347 | 13,418 | +1% | 1 | 1 | 0% | 2,733 | 4,732 | +73% | 0 | 0 | — |
case-21 | pass→pass | 16,564 | 21,767 | +31% | 1 | 1 | 0% | 2,674 | 5,363 | +101% | 0 | 0 | — |
case-22 | pass→pass | 27,512 | 30,654 | +11% | 1 | 1 | 0% | 4,905 | 7,661 | +56% | 0 | 0 | — |
case-23 | pass→pass | 15,712 | 14,856 | -5% | 1 | 1 | 0% | 2,285 | 4,187 | +83% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +13 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.