Product Discovery skill for Codex
Test the riskiest assumption before writing code. Codex builds an opportunity solution tree from one outcome down to research-backed customer opportunities, insists on several candidate solutions per target opportunity, and maps the assumptions behind the favourite by importance and evidence. The riskiest ones get the cheapest credible test, each pre-registered with pass and fail thresholds and the decision that follows, so results cannot be reinterpreted afterwards.
curl -fsSL codexskills.dev/install.sh \ | sh -s -- product-discovery Installs to ~/.agents/skills/product-discovery/ for every project on this machine.
curl -fsSL codexskills.dev/cli.mjs -o codex-skills.mjsnode codex-skills.mjs install product-discovery The CLI also searches, updates and removes skills. Run it with no arguments to pick from a list. Needs Node 20.12+.
curl -fsSL codexskills.dev/install.sh \ | sh -s -- --project product-discovery Installs to .agents/skills/product-discovery/ in the current repository. Commit it and everyone who runs Codex there gets it.
curl -fsSLO codexskills.dev/downloads/product-discovery.zipunzip -o product-discovery.zip -d ~/.agents/skills/ The archive holds the skill folder with its generated agents/openai.yaml. Unzip into .agents/skills/ to scope it to a repo.
& ([scriptblock]::Create((irm codexskills.dev/install.ps1))) product-discovery PowerShell 5.1 or 7. Installs to %USERPROFILE%\.agents\skills\. Add -Project for the current repo.
104-line POSIX script. No sudo, no telemetry. Read install.sh
Use it in Codex
Start a prompt with $product-discovery, or pick it from /skills.
You can also just describe the task: Codex reads the description below and loads the playbook when your request matches.
What Codex reads before loading it
Runs continuous product discovery - an opportunity solution tree from a desired outcome through customer opportunities to candidate solutions, assumption mapping by risk (value, usability, feasibility, viability), and small assumption tests (fake doors, prototypes, concierge, data mining, one-question surveys) with pre-registered pass/fail thresholds - before committing engineering time. Use when asked to do product discovery, build an opportunity solution tree, decide which idea to pursue, test an assumption cheaply, or check whether a feature is worth building.
Use it when
- The team has an outcome to move but no agreed problem to solve
- A favourite feature idea has not been checked against evidence
- You need a quick, cheap test before committing engineering time
- Discovery work needs a weekly rhythm and visible state
Use something else when
- You are ready to run a statistically powered experiment on a real build: use ab-testing
- The direction is chosen and you need to cut a first release: use mvp-scoping
- You need to rank a backlog that is already defined: use prioritization-frameworks
How to check the result
Every solution traces to an evidenced opportunity, the target opportunity has three or more candidate solutions, and each test's threshold is dated before it launched.
The mistake it prevents
Starting from a solution and inventing an opportunity above it, which turns the tree into a justification for a decision already made.
Discovery is done well when the team is working toward one measurable outcome, every candidate solution traces to a customer opportunity backed by research, the riskiest assumptions behind the chosen idea are tested with the cheapest credible experiment, and pass/fail thresholds were written down before the results arrived.
Opportunity solution tree
Outcome: raise 7-day team activation from 22% to 32%
├── Opportunity: new admins don't know who to invite first
│ ├── Solution: suggested teammates from email domain
│ └── Solution: invite step inside the first project template
├── Opportunity: invited people don't understand why they were invited
│ ├── Solution: personal note from inviter in the invite email
│ └── Solution: invitee landing page showing the shared project
└── Opportunity: teams start empty and see no value
├── Solution: import from spreadsheet
└── Solution: starter templates by team type
Rules:
- Outcome at the root: a product metric the team can influence (from OKRs or
$product-metrics), not a business lagging metric like revenue. - Opportunities are customer needs, pains or desires in the customer’s language, discovered through interviews and data. Never solutions in disguise (“need a Slack integration”).
- Break large opportunities into smaller child opportunities until one can be addressed in a few weeks.
- Compare and contrast: pick one target opportunity, then generate at least three solutions for it before choosing. One idea is not a choice.
- Experiments hang below solutions and test assumptions, not whole solutions.
Assumption mapping
For the chosen solution, list assumptions across categories, then plot by importance (would the idea fail if wrong?) and evidence (do we already know?):
| Category | Prompt | Example |
|---|---|---|
| Desirability / value | Will they want it and choose it? | Admins will add a personal note when prompted |
| Usability | Can they use it? | Admins notice the note field without guidance |
| Feasibility | Can we build it? | Email provider supports per-invite custom text |
| Viability | Does it work for the business? | No spam-compliance risk from user-written text in our emails |
| Ethical | Should we? | Notes cannot be used to phish invitees |
Test only the high-importance, low-evidence quadrant. Everything else is either known or does not matter yet.
Pick the cheapest credible test
| Test | Good for | Effort | Watch out |
|---|---|---|---|
| Data mining (existing analytics, logs, tickets) | Does the behaviour or pain already show up? | Hours | Absence of data is not absence of need |
| One-question in-product survey | Prevalence of a situation | 1-2 days | Ask about past behaviour |
| Prototype test (5-8 users) | Usability, comprehension | Days | Not evidence of demand |
| Fake door / painted door | Demand: do people click when it is offered? | Days | Must explain honestly on click; low volume pages give no signal |
| Concierge / Wizard of Oz | Value of the outcome, delivered manually | 1-3 weeks | Labour cost; small n |
| Technical spike | Feasibility | 1-5 days | Time-box strictly |
| A/B test of a real build | Measured impact at scale | Weeks | Needs traffic; see $ab-testing |
Pre-register every test:
Assumption: Admins will add a personal note when prompted
Test: show optional note field to 50% of new-workspace admins for 2 weeks (flag invite_note)
Metric: % of invites sent with a non-empty note
Pass: >= 25% | Fail: < 10% | In between: run 5 interviews to understand why
Sample needed: ~400 invites per arm at current volume (about 10 days)
Decision if pass: build full version with templates; if fail: drop and test landing page idea
Fake doors and in-product tests change what customers see: confirm with the user and any required owners (legal, brand) before they go live, and always tell users honestly what happened when they click a feature that does not exist yet.
Weekly discovery cadence
- [ ] Talk to at least one customer this week (see $customer-interviews)
- [ ] Add new opportunities to the tree; prune ones evidence has killed
- [ ] Re-check the target opportunity is still the best bet
- [ ] Run or analyze at least one assumption test
- [ ] Share a short update: what we learned, what changed, next test
Workflow for a specific idea
- [ ] 1. Name the outcome the idea is meant to move
- [ ] 2. Place the idea on the tree: which opportunity does it serve? Add evidence
- [ ] 3. Generate two or more alternative solutions for that opportunity
- [ ] 4. Map assumptions for the leading options; pick the riskiest 1-3
- [ ] 5. Design and pre-register the cheapest credible test for each
- [ ] 6. Run, then compare results to thresholds without moving them
- [ ] 7. Decide: build, iterate, switch solution, or switch opportunity
When the codebase is available, check feasibility cheaply by reading the relevant modules and data model before scheduling a spike; often the answer is in the code.
Output template
## Discovery update: <outcome>
Target opportunity: <...> (evidence: n interviews, data points)
Solutions considered: A, B, C - chosen: B because <...>
Assumptions tested this cycle:
| Assumption | Test | Threshold | Result | Decision |
Next tests:
Tree changes: <added / pruned opportunities>
Gotchas
- Starting from a solution and back-filling an opportunity makes the tree a justification document. Start from research.
- Fake-door tests on pages with little traffic produce noise; estimate sample size first.
- Moving thresholds after seeing results turns an experiment into a story.
- Prototype enthusiasm (“I’d use that!”) tests usability and appeal, not demand.
- Discovery is continuous; a one-off “discovery phase” before delivery leaves the team blind afterwards.
Verification
Check each solution on the tree links to an opportunity with cited evidence, the target opportunity has at least three candidate solutions, every running test has a written threshold and decision rule dated before launch, and results are reported against those original thresholds.
What the zip contains
SKILL.md plus the interface file below. Nothing runs on install.
agents/openai.yaml
Gives the Codex app a display name, a one-line description and a starter prompt for this skill.
interface:
display_name: "Product Discovery"
short_description: "Test the riskiest assumption before writing code"
default_prompt: "$product-discovery Build an opportunity solution tree for raising team activation" About this skill
Written and maintained by the Codex Skills editors to the same editorial standard as every skill here: a selective description, a real workflow, known pitfalls and a way to verify the work. First published , last updated . MIT licensed. Something wrong or out of date? Tell us.