Viska Research Agent · Daily Research Pipeline

YouTube Daily Research → Slack — Exact Workflow

Public Atom feeds → 4-layer relevance classify → theme-grouped delivery. No credential, stdlib only.
● priority source 10 channels no API key cron-ready
39
records / run (today)
24
fund-relevant
0
fetch errors
Slack #feed landed

Step 0 · The roster — the only config

research/youtube-channels.json — 10 public channels, each a YouTube channel_id → Atom feed.

Luke Gromen (FFTT) Monetary Matters (Jack Farley) Fed Guy (Joseph Wang) Empire / Blockworks Capital Flows Research Jordi Visser Labs DoubleLine Capital All-In Podcast Nate B Jones Peter Diamandis
7 macro · 3 tech. Add a channel = add one row (name + channel_id Atom URL). No code change.

The pipeline — 4 steps

1

Ingest public Atom feeds → RECORD JSON

python3 .claude/skills/substack-digest/youtube_adapter.py --window 30

Per channel: fetch Atom XML → parse → drop Shorts → keep within window → dedup vs state file (new-since last-seen video id) → write one RECORD per new video. Stamps the roster name onto each record so it resolves against the registry (the Atom <title> drifts and would otherwise quarantine). One dead feed never kills the run.

roster: research/youtube-channels.jsonstate: youtube-state.json
research/inbox/youtube/2026-06-28_yt-fed-guy-joseph-wang_<id>.json × 39
youtube-adapter [wrote] 10 channels / 39 records / 0 errors
2

Orchestrate resolve + 4-layer classify → payload/1

python3 .claude/skills/substack-digest/pipeline.py --sources youtube --out research/digests/2026-06-28

Load inbox → resolve each record against registry.json (unknown → quarantined, not dropped) → classify against 4 relevance anchors. Any layer hits → relevant + theme-tagged.

LayerAnchor source
positionsthe held book
themesstrategic-time-grid (Copper, Gold, Energy Infra…)
thesesactive theses
macromacro frame
items: 39 · relevant: 24 · by_source_class {youtube: 24}
2026-06-28-research-payload.json  -daily-digest.md  -slack-blocks.json
3

Transform payload/1 → ViskaMimir delivery body

python3 .claude/skills/substack-digest/to_mimir.py \ research/digests/2026-06-28/2026-06-28-research-payload.json \ --out research/digests/2026-06-28/2026-06-28-mimir-body.json

Builds theme-grouped sections[] from clean video titles + theme tags — not the noisy description (that leaks promo lines). EN narrative. Optional --signal prepends the ViskaStrat book-positioning section as the lead.

{title, asOf, summary, sections[], sources[], confidence}
4

Deliver two proven Slack lanes

A — direct: pipeline.py --sources youtube --slack → shells to mimir-post/post-to-slack.py (reads MIMIR_FEED_WEBHOOK_URL, never echoes) → #feed.

B — canonical (prod): hand the Step-3 body to ViskaMimir POST /api/research → renders → Slack. Proven E2E channel=C09F44U5BAP.

The whole thing — one daily run

# from repo root cd ~/Dev/_Client-Orgs/Viska-funds-AI/ViskaRes D=$(date +%F); SD=.claude/skills/substack-digest python3 $SD/youtube_adapter.py --window 30 python3 $SD/pipeline.py --sources youtube --out research/digests/$D --slack python3 $SD/to_mimir.py research/digests/$D/$D-research-payload.json --out research/digests/$D/$D-mimir-body.json

WHY IT WORKS