Files
yt-channel-scraper/graphify-out/2026-08-01/GRAPH_REPORT.md
T

10 KiB

Graph Report - yt-channel-scraper (2026-08-01)

Corpus Check

  • 48 files · ~51,184 words
  • Verdict: corpus is large enough that graph structure adds value.

Summary

  • 669 nodes · 1538 edges · 24 communities (21 shown, 3 thin omitted)
  • Extraction: 89% EXTRACTED · 11% INFERRED · 0% AMBIGUOUS · INFERRED: 162 edges (avg confidence: 0.78)
  • Token cost: 0 input · 0 output

Graph Freshness

  • Built from commit: 06497299
  • Run git rev-parse HEAD and compare to check if the graph is stale.
  • Run graphify update . after code changes (no API cost).

Community Hubs (Navigation)

  • Webapp Frontend (JS)
  • Transcript Extraction & Parsing
  • Config & Discovery Pipeline
  • Store & Export Layer
  • CLI Command Layer
  • Platform Design & Proposals
  • Segments Search & Backfill
  • Store Platform Tests
  • Content Analysis
  • README & Config Docs
  • Server Start Script
  • Package Manifest
  • Server Stop Script
  • test_extract.py
  • Auditoría · Cómo la extensión obtiene la transcripción / información de vídeos de YouTube
  • api
  • pipeline.py
  • setView
  • Discovery-Only Scrape Design
  • renderDashboardCharts
  • Global Constraints
  • init
  • loadChannels

God Nodes (most connected - your core abstractions)

  1. Store - 101 edges
  2. VideoRef - 42 edges
  3. api() - 39 edges
  4. toast() - 38 edges
  5. Config - 36 edges
  6. Segment - 32 edges
  7. JobManager - 26 edges
  8. discover_incremental() - 21 edges
  9. process_video() - 19 edges
  10. reconcile_markdown() - 19 edges

Surprising Connections (you probably didn't know these)

  • seeded_store() --calls--> VideoRef [INFERRED] tests/test_store_platform.py → src/yt_scraper/store.py
  • test_upload_sort_uses_discovered_time_when_date_is_missing() --calls--> VideoRef [INFERRED] tests/test_store_platform.py → src/yt_scraper/store.py
  • test_upsert_videos_reports_only_new_rows() --calls--> VideoRef [INFERRED] tests/test_store_platform.py → src/yt_scraper/store.py
  • store() --calls--> Store [INFERRED] tests/test_store_platform.py → src/yt_scraper/store.py
  • test_migration_idempotent() --calls--> Store [INFERRED] tests/test_store_platform.py → src/yt_scraper/store.py

Import Cycles

  • None detected.

Hyperedges (group relationships)

  • Workstream B webapp stack (FastAPI + Alpine SPA + subagent) — opencode_agent_webapp_builder, opencode_goals_webapp_build, src_yt_scraper_webapp_static_index, docs_superpowers_specs_2026_07_26_platform_design_dark_command_center, docs_superpowers_specs_2026_07_26_platform_design_sse_job_runner [EXTRACTED 0.95]
  • FTS5 transcript search flow (proposal -> spec -> SPA view) — opportunities_search_fts5, docs_superpowers_specs_2026_07_26_platform_design_transcript_fts5, src_yt_scraper_webapp_static_index [INFERRED 0.85]
  • Cookie auth chain (vault -> resolve_active_path -> scrape job) — docs_superpowers_specs_2026_07_26_platform_design_cookie_vault_ux, docs_superpowers_specs_2026_07_26_platform_design_sse_job_runner, docs_superpowers_specs_2026_07_26_platform_design_cookies_bug_fix, src_yt_scraper_webapp_static_index [INFERRED 0.85]

Communities (24 total, 3 thin omitted)

Community 0 - "Webapp Frontend (JS)"

Cohesion: 0.06 Nodes (22): _armAutoHide(), cancelScrape(), closeClip(), closeJobWidget(), closeSidebar(), closeStats(), closeStream(), deleteJob() (+14 more)

Community 1 - "Transcript Extraction & Parsing"

Cohesion: 0.27 Nodes (10): _iter_texts(), Path, Return [(YYYY-MM, count)] of months where term appears in transcripts., render_timeline_chart(), render_top_words_chart(), render_wordcloud(), term_timeline(), _tokenize() (+2 more)

Community 2 - "Config & Discovery Pipeline"

Cohesion: 0.06 Nodes (46): _build_config(), Config, DelayConfig, load_config(), Path, Incremental channel sync — how far back a routine re-scan looks. The /video, SyncConfig, YtDlpConfig (+38 more)

Community 3 - "Store & Export Layer"

Cohesion: 0.05 Nodes (46): Connection, Cursor, Environment, Row, auto_import_dir(), cookies_dir(), delete(), import_file() (+38 more)

Community 4 - "CLI Command Layer"

Cohesion: 0.07 Nodes (44): analyze_cmd(), _apply_filters(), audio_cmd(), _channel_targets(), channels_add(), cli(), export_cmd(), _extract_handle() (+36 more)

Community 5 - "Platform Design & Proposals"

Cohesion: 0.12 Nodes (20): Platform Implementation Plan, Platform Design Spec, Cookie drag-and-drop vault UX, cli.py cookies scope bug fix, Design language: dark data command center, Architecture: Monorepo in-package webapp (Approach A), Scope rule: No AI features, Single-threaded scrape job runner + SSE event bus (+12 more)

Community 6 - "Segments Search & Backfill"

Cohesion: 0.09 Nodes (28): APIRouter, FastAPI, cache_channel_avatar(), cache_thumbnail(), Thumbnail URL for a video: stored URL, else the canonical YouTube one derived fr, Download + cache a video's thumbnail to <thumbnails_dir>/<video_id>.jpg. Returns, Download + cache a channel avatar to <avatars_dir>/<channel_id>.jpg. Returns Tru, thumbnail_url_for() (+20 more)

Community 7 - "Store Platform Tests"

Cohesion: 0.13 Nodes (28): Collection, _channel_root_url(), deep_channel_avatar(), discover_channel(), discover_incremental(), _flatten_entries(), IncrementalDiscovery, _pick_channel_avatar() (+20 more)

Community 8 - "Content Analysis"

Cohesion: 0.10 Nodes (41): Re-escanear data/markdown y hacer que la DB coincida con el disco., reconcile_cmd(), Make the DB agree with what is actually on disk. backfill_from_markdown f, reconcile_markdown(), VideoRef, Recovery paths: retryable statuses, recorded skip reasons, disk<->DB reconcile., The throttling message is the one that must stay retryable., The exact symptom the user reported: a .md exists but the row still shows a (+33 more)

Community 10 - "Server Start Script"

Cohesion: 0.38 Nodes (3): Open-Browser(), Out-Line(), Show-State()

Community 14 - "test_extract.py"

Cohesion: 0.07 Nodes (48): Response, parse_languages(), Any, Normalise legacy list / new dict / None into {lang: mode}., _coerce_languages(), describe_missing_subtitle(), _download_subtitle(), extract_video() (+40 more)

Community 15 - "Auditoría · Cómo la extensión obtiene la transcripción / información de vídeos de YouTube"

Cohesion: 0.04 Nodes (42): Arquitectura, Comandos, Cookies, Cualquier petición HTTP a CDNs de YouTube va por _yt_http.yt_get(), Documentos de referencia, El Markdown es fuente de datos, no solo salida, Estados terminales y frescura (la UI tiene que reflejar DB + disco), Frontend (+34 more)

Community 16 - "api"

Cohesion: 0.15 Nodes (29): activateCookie(), api(), checkAudio(), clearJobHistory(), copyClip(), copyText(), downloadAudio(), downloadAudioOne() (+21 more)

Community 17 - "pipeline.py"

Cohesion: 0.05 Nodes (56): align_chapters(), Chapter, chapters_from_info(), Section, merge_adjacent(), parse_auto_dump(), parse_json3(), parse_vtt() (+48 more)

Community 20 - "setView"

Cohesion: 0.24 Nodes (10): cycleSort(), destroyCharts(), loadFolders(), loadFormat(), loadSearch(), loadVideos(), openChannel(), resetSearch() (+2 more)

Community 21 - "Discovery-Only Scrape Design"

Cohesion: 0.22 Nodes (8): Architecture, Discovery-Only Scrape Design, Error Handling, Existing Context, Goal, Persistence and Results, Testing, UI

Community 22 - "renderDashboardCharts"

Cohesion: 0.36 Nodes (9): axisOpts(), barOpts(), fmtMonth(), lineOpts(), loadAnalysis(), makeChart(), renderDashboardCharts(), renderTimelineChart() (+1 more)

Community 23 - "Global Constraints"

Cohesion: 0.25 Nodes (7): Discovery-Only Scrape Implementation Plan, Global Constraints, Task 1: Make catalog insertion counts accurate, Task 2: Add discovery-only job execution, Task 3: Expose the discovery mode through the API, Task 4: Add one-channel and all-channel UI controls, Task 5: Final verification and review

Community 25 - "init"

Cohesion: 0.20 Nodes (11): checkHealth(), hydrateURL(), init(), jobActive(), loadRetryable(), reconcile(), refreshLiveState(), resetVideos() (+3 more)

Community 27 - "loadChannels"

Cohesion: 0.32 Nodes (8): addChannel(), downloadAvatarsScope(), loadChannelPending(), loadChannels(), loadDashboard(), removeChannel(), _setSyncResult(), syncChannels()

Knowledge Gaps

  • 58 isolated node(s): yt-channel-scraper, Qué es esto, Comandos, Orientación antes de leer código, Tres superficies, un solo pipeline (+53 more) These have ≤1 connection - possible missing edges or undocumented components.
  • 3 thin communities (<3 nodes) omitted from report — run graphify query to explore isolated nodes.

Suggested Questions

Questions this graph is uniquely positioned to answer:

  • Why does Store connect Store & Export Layer to Transcript Extraction & Parsing, Config & Discovery Pipeline, CLI Command Layer, Segments Search & Backfill, Content Analysis, pipeline.py? High betweenness centrality (0.151) - this node is a cross-community bridge.
  • Why does VideoRef connect Content Analysis to Config & Discovery Pipeline, Store & Export Layer, CLI Command Layer, Store Platform Tests, pipeline.py? High betweenness centrality (0.048) - this node is a cross-community bridge.
  • Why does Segment connect pipeline.py to CLI Command Layer, test_extract.py, Segments Search & Backfill? High betweenness centrality (0.032) - this node is a cross-community bridge.
  • Are the 13 inferred relationships involving Store (e.g. with ParsedMarkdown and store()) actually correct? Store has 13 INFERRED edges - model-reasoned connections that need verification.
  • Are the 31 inferred relationships involving VideoRef (e.g. with IncrementalDiscovery and store()) actually correct? VideoRef has 31 INFERRED edges - model-reasoned connections that need verification.
  • Are the 11 inferred relationships involving Config (e.g. with test_config_languages_defaults_to_dict() and test_config_prefer_manual_defaults_true()) actually correct? Config has 11 INFERRED edges - model-reasoned connections that need verification.
  • What connects yt-channel-scraper, Qué es esto, Comandos to the rest of the system? 58 weakly-connected nodes found - possible documentation gaps or missing edges.