scout-sources
Answers "what video should we clip next?" deterministically instead of by vibes.
Professional clip channels hunt outliers — videos performing far above their
channel's baseline. The cheap keyless proxies, all available from yt-dlp:
- velocity
2 * log10(1 + views/day) — reach × freshness
- outlier
min(10, views/subscribers) — 3x+ is real signal, 5–10x is strong
- engagement
min(5, comments per 1k views) — talked-about-ness
- peaky
min(3, 10 * stdev(replay heatmap)) — a spiky most-replayed graph
means the video CONTAINS clippable moments; flat means evenly mediocre
- curiosity
min(1.5, question/superlative framing in the title) — sources
whose own title is a curiosity hook ("how come…", "richest woman ever") yield
the cold-open question moments the pipeline now leads with
score = velocity + outlier + engagement + peaky + curiosity (see score.py).
Invoke
.claude/skills/scout-sources/scout-sources.sh [out.json] [query ...]
out.json (optional): default work/_scout/candidates.json
query ... (optional): seed searches; default reads niches.txt (channel
analytics — humor pods + productivity/AI — plus visually-rich, question-driven
niches: space, wealth, true-crime, nature, history)
Env knobs: SCOUT_PER_QUERY (12 results/query), SCOUT_SHORTLIST (20 full
fetches), SCOUT_MIN_VIEWS (100000), SCOUT_DUR_MIN/SCOUT_DUR_MAX
(900/10800s — long-form only).
Output
candidates.json with ranked candidates (url, title, channel, score +
components, seen: true when work/<sha1(url)[:10]> already exists) and a
ranked table on stdout. Feed the winner straight to start.sh <url>.
How
- Parallel flat
ytsearch per query — view_count/duration/channel only
(one cheap call per niche).
- Merge, dedup, drop live/short/low-view, keep top-N by views.
- 4-way-parallel full
yt-dlp -J per shortlisted id — adds upload_date,
channel_follower_count, comment_count, heatmap.
score.py ranks and writes candidates.json.
NOT part of the per-video pipeline — run it before start.sh to decide what
to feed the pipeline. Uses plain yt-dlp ytsearch (NEVER mcptube discover,
which needs a forbidden LLM API key).
1---2name: scout-sources3description: Deterministic source-video discovery — the clip-channel "outlier" method, keyless. Searches seed niche queries via yt-dlp ytsearch, prefilters to long-form candidates, fetches full metadata, and ranks by outlier score (views/day velocity, views-per-subscriber ratio, comment engagement, replay-heatmap peakiness). Emits a ranked candidates.json to pick the next pipeline source from. No Claude call, no API key.4---56# scout-sources78Answers "what video should we clip next?" deterministically instead of by vibes.9Professional clip channels hunt **outliers** — videos performing far above their10channel's baseline. The cheap keyless proxies, all available from yt-dlp:1112- **velocity** `2 * log10(1 + views/day)` — reach × freshness13- **outlier** `min(10, views/subscribers)` — 3x+ is real signal, 5–10x is strong14- **engagement** `min(5, comments per 1k views)` — talked-about-ness15- **peaky** `min(3, 10 * stdev(replay heatmap))` — a spiky most-replayed graph16 means the video CONTAINS clippable moments; flat means evenly mediocre17- **curiosity** `min(1.5, question/superlative framing in the title)` — sources18 whose own title is a curiosity hook ("how come…", "richest woman ever") yield19 the cold-open question moments the pipeline now leads with2021`score = velocity + outlier + engagement + peaky + curiosity` (see `score.py`).2223## Invoke2425```26.claude/skills/scout-sources/scout-sources.sh [out.json] [query ...]27```2829- `out.json` (optional): default `work/_scout/candidates.json`30- `query ...` (optional): seed searches; default reads `niches.txt` (channel31 analytics — humor pods + productivity/AI — plus visually-rich, question-driven32 niches: space, wealth, true-crime, nature, history)3334Env knobs: `SCOUT_PER_QUERY` (12 results/query), `SCOUT_SHORTLIST` (20 full35fetches), `SCOUT_MIN_VIEWS` (100000), `SCOUT_DUR_MIN`/`SCOUT_DUR_MAX`36(900/10800s — long-form only).3738## Output3940`candidates.json` with ranked candidates (url, title, channel, score +41components, `seen: true` when `work/<sha1(url)[:10]>` already exists) and a42ranked table on stdout. Feed the winner straight to `start.sh <url>`.4344## How45461. Parallel flat `ytsearch` per query — `view_count`/`duration`/`channel` only47 (one cheap call per niche).482. Merge, dedup, drop live/short/low-view, keep top-N by views.493. 4-way-parallel full `yt-dlp -J` per shortlisted id — adds `upload_date`,50 `channel_follower_count`, `comment_count`, `heatmap`.514. `score.py` ranks and writes `candidates.json`.5253NOT part of the per-video pipeline — run it before `start.sh` to decide what54to feed the pipeline. Uses plain `yt-dlp` ytsearch (NEVER `mcptube discover`,55which needs a forbidden LLM API key).