idea-validator
# idea-validator This Claude Code skill evaluates a startup idea backlog by researching competitive landscapes, assessing market timing and funding signals, and scoring viability against operator fit and solo-buildability. Use it to transform an accumulating list of unvetted ideas into a ranked pipeline, surfacing which concepts are wide open versus crowded and which align with current market conditions and operator capabilities.
git clone --depth 1 https://github.com/aaronjmars/aeon /tmp/idea-validator && cp -r /tmp/idea-validator/skills/idea-validator ~/.claude/skills/idea-validatorSKILL.md
> **${var}** — Optional theme filter (e.g. "crypto", "AI agents", "consumer", "solo-buildable"). If empty, picks the oldest unscreened batch.
Today is ${today}. Read `memory/MEMORY.md` before starting. If `soul/SOUL.md` + `soul/STYLE.md` exist and are populated, read them to ground "operator fit" scoring; otherwise score on solo-buildability and timing only.
## Why this skill exists
Idea backlogs accumulate weekly with no evaluation. Without a screening pass, the backlog is noise — no way to know which ideas are wide open vs already crowded, which match current market conditions, which are solo-buildable vs team-dependent. This skill turns the list from an archive into an active pipeline.
## Steps
### 1. Load the idea backlog
Read `memory/topics/startup-ideas.md`. If it doesn't exist, log `IDEA_VALIDATOR_SKIP: no backlog at memory/topics/startup-ideas.md` and stop.
Read `memory/topics/startup-ideas-screened.md` (create if missing — it's the screening database).
From the main ideas table, extract ideas that have NOT yet appeared in `startup-ideas-screened.md`. If `${var}` is set, additionally filter by theme/domain match.
Pick up to **8 ideas** to screen this run — prioritize oldest unscreened (earliest date first).
If fewer than 2 unscreened ideas remain: send a "backlog current" notification and stop.
### 2. Screen each idea
For each idea (name + one-liner from the table), run:
**a) Competition scan**
```
WebSearch: "[idea name] startup ${year}"
WebSearch: "[core problem/domain] tool app platform"
```
Classify competition density:
- `open` — no direct competitors found, or market clearly nascent
- `sparse` — 1–2 players, no clear winner
- `crowded` — 3+ established players with traction
- `saturated` — category has a dominant incumbent
**b) Funding signal**
```
WebSearch: "[domain] startup funding ${year}"
```
Note: any recent raises in the space? Is VC money flowing in (market heating) or absent (too early or too late)?
**c) Timing fit**
Score 1–5 based on:
- What's the tailwind right now? (regulatory shift, new infra, behavior change)
- Does recent context from `memory/logs/` match this domain? (market signals, papers, tweets)
- 5 = this could launch today and hit demand; 1 = needs 2+ years of market development
**d) Operator fit**
Score 1–5. If `soul/SOUL.md` exists and is populated:
- Does the operator have relevant domain expertise or network (per soul)?
- Is this solo-buildable or requires a team?
- Does it connect to current projects named in MEMORY.md or topic files?
- 5 = operator could validate this in a week with the current stack.
If no soul file exists, score this dimension as 3 by default (neutral) and rely on the other axes — operator fit is unknowable without the soul.
**e) Market size**
Quick estimate: small (<$1B TAM), medium ($1–10B), large (>$10B). Use WebSearch if unclear.
### 3. Score and rank
Compute a **viability score** for each idea:
```
viability = timing_fit + operator_fit + competition_bonus + size_bonus
competition_bonus: open=4, sparse=3, crowded=1, saturated=0
size_bonus: large=2, medium=1, small=0
```
Max ~16. Sort descending.
### 4. Update the screening database
Append to `memory/topics/startup-ideas-screened.md` (create if missing):
```markdown
# Startup Ideas — Screening Notes
Each idea screened by idea-validator. Sorted by date screened.
| Date Screened | Idea | Competition | Timing | Operator Fit | Market | Viability | Key Finding |
|---------------|------|-------------|--------|--------------|--------|-----------|-------------|
| YYYY-MM-DD | Idea Name | open/sparse/crowded/saturated | 1-5 | 1-5 | small/medium/large | score/16 | one-line finding |
```
### 5. Decide whether to notify
Always notify — screened ideas are always worth surfacing.
### 6. Format and send notification
Write to a temp file, then send:
```bash
mkdir -p .pending-notify-temp
TEMP=".pending-notify-temp/idea-validator-${today}.md"
# (write the body below to $TEMP)
./notify -f "$TEMP"
```
**Notification format** — match the operator's voice if soul files are populated, otherwise direct and neutral:
```
idea screener — ${today}
screened: N ideas. top picks:
1. [Name] — [one-liner]
competition: open/sparse | timing: X/5 | operator-fit: X/5
gap: [why the space is open or under-served]
tailwind: [what makes now the right time]
2. [Name] — [one-liner]
competition: [density] | timing: X/5 | operator-fit: X/5
gap: [...]
tailwind: [...]
3. [Name] — [one-liner]
competition: [density] | timing: X/5 | operator-fit: X/5
gap: [...]
tailwind: [...]
skipped: [Name] — [crowded/saturated], [Name] — [too early]
full notes: memory/topics/startup-ideas-screened.md
```
Surface top 3 by viability score. List the rest as "skipped" with one-word reason.
Keep total under 4000 chars.
### 7. Log to memory
Append to `memory/logs/${today}.md`:
```
## Idea Validator
- **Screened:** N ideas (oldest: [name], newest: [name])
- **Top pick:** [name] — [viability score]/16
- **Competition open:** N ideas
- **Saturated/skipped:** N ideas
- **Filter used:** [var or "none"]
- **Notification:** sent
- IDEA_VALIDATOR_OK
```
## Required Env Vars
None. Uses WebSearch (built-in) and local file reads only.
## Sandbox Note
WebSearch bypasses sandbox network restrictions — use it for all competition/funding research. No curl or auth-required API calls needed.
## Notes on Screening Approach
- The goal is signal, not thoroughness. Two good WebSearch queries per idea beats five mediocre ones.
- Competition density is the most important signal. If the space is open and operator-fit is high, that's a strong pick regardless of market size.
- Flag ideas where the timing score changed significantly from when they were filed — markets move fast.
- Don't evaluate based on the operator's current bandwidth. Just score the opportunity.Mention/keyword sweep on social platforms for [REPLACE: KEYWORDS] — trends, sentiment, top posts
5 concrete real-life actions, leverage-scored against open loops with specificity and anti-fluff gates
Curated AI-agent tweets, clustered into narratives with insight summaries
Tracker of AI agent substitution signals — which roles, companies, and industries show real headcount displacement. Named roles + real deployments only.
Competitive-intelligence digest on the AI agent framework space — momentum, releases, breaking changes across a curated watchlist
Cross-domain market pulse from AIXBT's free grounding endpoint — crypto, macro, tradfi, geopolitics. Refreshes taxonomy references (clusters, chains) as a bonus.
Pre-batch API provider health check — detects credit exhaustion or auth failure for every configured provider key before the scheduled batch runs, giving the operator a window to act before skills degrade
List a wallet's live ERC-20 token approvals on Base and flag unlimited / risky spender grants. Keyless via Base RPC (eth_getLogs + eth_call) — no explorer key needed.