Torres · Perri (Product Kata) · Ulwick (ODI)
Five steps — and the ODI score for a defensible ranking
Step 1 — anchor the single outcome at the root. One product outcome (a measurable behavior change), not a business metric and not a feature. "Increase weekly active teams" ✓; "ship collaboration" ✗ (a solution); "grow revenue" ✗ (translate it down to the product behavior that drives it).
Step 2 — populate opportunities from interview snippets (evidence up). An opportunity is a need, pain or desire in the customer's words, never a solution in disguise. "A faster export" is a solution; "I lose the thread when I have to leave the app to share results" is the opportunity. De-dupe into a hierarchy; keep each snippet→opportunity link traceable.
Step 3 — size, then pick ONE. Rank by importance × prevalence × strategic fit. Lightweight for weekly steering; ODI when you need a defensible, quantified ranking for a roadmap argument:
Ulwick opportunity score = importance + max(importance − satisfaction, 0)
High-importance / low-satisfaction outcomes are underserved → the real opportunities. High-importance / high-satisfaction = table stakes (don't over-invest). Low-importance = ignore, or overserved (candidates to cut).
Step 4 — branch 2–3 competing solutions under the chosen opportunity (diverge before converge). A single-branch tree means you're committed, not discovering.
Step 5 — drop assumption tests under each solution. The leaves are tests, not features. Product Kata plugs in here: outcome → current state → target condition → obstacle (the chosen opportunity) → experiment (the leaf). Skipping the target condition and jumping root→solution is the classic kata failure.
Worked — B2B SaaS activation (all numbers illustrative)
Outcome: lift week-1 activation (new accounts that complete a first successful data export) from 34% → 50%.
Opportunities: O1 "I couldn't tell if my import actually worked" — 12/20 (highest prevalence + emotion → work first); O2 "I didn't have my data file ready" — 7/20; O3 "The sample template didn't match my use case" — 5/20. O1 chosen; O2/O3 parked, not deleted.
Solutions under O1: S1 progress bar + success/failure confirmation · S2 inline validation preview ("row 14: invalid date") · S3 concierge white-glove · S4 (AI) LLM auto-maps columns to schema.
Tests (riskiest first): S4 = Model-Capability → offline golden-set eval before any UI, bar ≥90% correct column maps on 50 real files · S3 = Viability → margin model · S1 = Desirability/Usability → 5-user prototype. Then pre-mortem the winning branch and run one end-to-end Wizard-of-Oz of the whole import flow before full build.
Model-Capability leaf → pro §ai-evals · ODI ranking pairs with Kano → §Prioritization