docs(market-research): numeric, evidence-required scoring

This commit is contained in:
fatih.bulut 2026-06-23 23:03:34 +03:00
parent 07aff55770
commit e61f2f7bd5
1 changed files with 38 additions and 27 deletions

View File

@ -1,43 +1,54 @@
# Scoring Guide
# Scoring Guide (numeric)
Score every candidate 0100 as a weighted composite. Three PRIMARY components
(cloneability, market opportunity, monetization fit) plus a secondary tiebreaker
(niche gap). Show the component scores, not just the total, so picks are auditable.
Score every candidate 0100 as a weighted composite of three PRIMARY components
plus a tiebreaker. **Every subscore must be justified by at least one real number
with a source** (see numeric-sources.md). A subscore with no supporting number is
CAPPED at 60 — you may not assign a high score on vibes.
## Components & weights
## Components & weights (unchanged)
| Component | Weight | What it measures |
| Component | Weight | Measures |
|---|---|---|
| Cloneability | 35% | How cheaply this rebuilds with clone-app + AI. |
| Market opportunity | 35% | Demand, growth, and incumbent weakness. |
| Market opportunity | 35% | Demand, growth, incumbent weakness. |
| Monetization fit | 20% | Ads/IAP friendliness and category ARPU. |
| Niche gap (tiebreaker) | 10% | Underserved region/language/segment. |
Total = 0.35·clone + 0.35·market + 0.20·monetization + 0.10·niche, each subscore 0100.
`total = 0.35·clone + 0.35·market + 0.20·monetization + 0.10·niche`, each 0100.
## Scoring each component (0100)
## Required evidence per subscore
**Cloneability** — higher = easier:
- 80100: simple CRUD/utility, few backend endpoints, no heavy ML, standard UI.
- 5079: moderate backend, some real-time or media, mainstream third-party SDKs.
- 049: heavy ML/on-device models, complex real-time/multiplayer, deep native, large content moat.
Attach an `evidence` object to each candidate. Each field is `"<number> + source"`
or `null`. A field that is `null` caps that subscore at 60.
**Market opportunity** — higher = better:
- 80100: strong/growing demand, dated or weak incumbents, clear unmet need.
- 5079: healthy demand, beatable incumbents.
- 049: saturated, dominated by entrenched well-funded players.
| Subscore | Evidence that lifts the cap above 60 |
|---|---|
| Cloneability | a stack/complexity signal (e.g. "few endpoints — RE later"); no external number required, but state the basis. |
| Market opportunity | an installs figure (Play via `play.py resolve`) AND either a Trends `trend_pct` OR a saturation `app_count`. |
| Monetization fit | a category ARPU/revenue figure (Sensor Tower/data.ai/Statista) OR top-grossing chart presence. |
| Niche gap | a region/language gap signal (saturation `app_count` low in region, or no localized incumbent). |
**Monetization fit** — higher = better:
- 80100: category with proven ads+IAP and high ARPU (casual games, utilities).
- 5079: monetizable but moderate ARPU.
- 049: hard to monetize / users expect free.
## Scoring bands (0100)
**Niche gap** — higher = more underserved:
- 80100: clear language/region/segment with no quality option.
- 049: well served everywhere.
**Cloneability** (higher = easier): 80100 simple CRUD/utility, few endpoints, no
heavy ML. 5079 moderate backend/media, mainstream SDKs. 049 heavy ML/native/
real-time/large content moat.
**Market opportunity** (higher = better): 80100 strong/growing demand (high
installs + positive `trend_pct`), weak/dated incumbents, low saturation. 5079
healthy demand, beatable incumbents, moderate saturation. 049 saturated
(`app_count` high, strong avg rating) or entrenched well-funded players.
**Monetization fit** (higher = better): 80100 proven ads+IAP, high ARPU
(casual games, utilities) with a cited revenue figure. 5079 monetizable, moderate
ARPU. 049 users expect free / hard to monetize.
**Niche gap** (higher = more underserved): 80100 clear region/language/segment
with no quality option (low regional `app_count`). 049 well served everywhere.
## Output per candidate
For each candidate keep: `name`, `package` (if resolved), `category`, the four
subscores, the weighted `total`, and a one-line rationale. Rank by `total`
descending. Produce at least 10 candidates AFTER history exclusion.
Keep: `name`, `package` (if resolved), `play_url`(s), `category`, the four
subscores, `evidence` (the cited numbers + source URLs), the weighted `total`,
and a one-line rationale. Rank by `total` descending. Produce ≥10 candidates
AFTER history exclusion.