# Graph Report - yt-channel-scraper (2026-07-31) ## Corpus Check - 45 files · ~46,603 words - Verdict: corpus is large enough that graph structure adds value. ## Summary - 612 nodes · 1392 edges · 25 communities (22 shown, 3 thin omitted) - Extraction: 91% EXTRACTED · 9% INFERRED · 0% AMBIGUOUS · INFERRED: 129 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 - render.py - config.py - setView - Discovery-Only Scrape Design - renderDashboardCharts - Global Constraints - loadJobs ## God Nodes (most connected - your core abstractions) 1. `Store` - 96 edges 2. `api()` - 36 edges 3. `toast()` - 36 edges 4. `Config` - 34 edges 5. `Segment` - 32 edges 6. `JobManager` - 26 edges 7. `VideoRef` - 25 edges 8. `discover_incremental()` - 21 edges 9. `process_video()` - 19 edges 10. `subscribeJob()` - 18 edges ## Surprising Connections (you probably didn't know these) - `test_config_languages_defaults_to_dict()` --calls--> `Config` [INFERRED] tests/test_extract.py → src/yt_scraper/config.py - `test_config_prefer_manual_defaults_true()` --calls--> `Config` [INFERRED] tests/test_extract.py → src/yt_scraper/config.py - `test_dashboard_aggregates()` --calls--> `Segment` [INFERRED] tests/test_store_platform.py → src/yt_scraper/parse.py - `test_store_and_search_segments()` --calls--> `Segment` [INFERRED] tests/test_store_platform.py → src/yt_scraper/parse.py - `test_store_segments_overwrites()` --calls--> `Segment` [INFERRED] tests/test_store_platform.py → src/yt_scraper/parse.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 (25 total, 3 thin omitted) ### Community 0 - "Webapp Frontend (JS)" Cohesion: 0.07 Nodes (20): _armAutoHide(), closeClip(), closeJobWidget(), closeSidebar(), closeStats(), _disarmAutoHide(), downloadClipTxt(), downloadFile() (+12 more) ### Community 1 - "Transcript Extraction & Parsing" Cohesion: 0.16 Nodes (17): merge_adjacent(), parse_auto_dump(), parse_json3(), parse_vtt(), Segment, _vtt_ts_to_seconds(), store(), test_export_json_csv() (+9 more) ### Community 2 - "Config & Discovery Pipeline" Cohesion: 0.08 Nodes (34): Config, Path, deep_channel_avatar(), Robust avatar recovery via non-flat yt-dlp call on the channel root URL., _extract_handle(), _keep_ref(), Same shorts/live rules the store was populated under — see jobs._keep_ref., Discover + process pending videos for a channel, optionally on an interval. (+26 more) ### Community 3 - "Store & Export Layer" Cohesion: 0.06 Nodes (43): Connection, Cursor, Environment, Row, auto_import_dir(), cookies_dir(), delete(), import_file() (+35 more) ### Community 4 - "CLI Command Layer" Cohesion: 0.08 Nodes (37): analyze_cmd(), _apply_filters(), audio_cmd(), _channel_targets(), channels_add(), cli(), export_cmd(), _extract_handle() (+29 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.10 Nodes (26): APIRouter, FastAPI, cache_thumbnail(), Thumbnail URL for a video: stored URL, else the canonical YouTube one derived fr, Download + cache a video's thumbnail to /.jpg. Returns, thumbnail_url_for(), backfill_from_markdown(), parse_markdown() (+18 more) ### Community 7 - "Store Platform Tests" Cohesion: 0.06 Nodes (44): Collection, _channel_root_url(), discover_channel(), discover_incremental(), _flatten_entries(), IncrementalDiscovery, _pick_channel_avatar(), Any (+36 more) ### Community 8 - "Content Analysis" 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 10 - "Server Start Script" Cohesion: 0.38 Nodes (3): Open-Browser(), Out-Line(), Show-State() ### Community 14 - "test_extract.py" Cohesion: 0.08 Nodes (46): Response, parse_languages(), Any, Normalise legacy list / new dict / None into ``{lang: mode}``., _coerce_languages(), _download_subtitle(), extract_video(), _normalize_lang() (+38 more) ### Community 15 - "Auditoría · Cómo la extensión obtiene la transcripción / información de vídeos de YouTube" Cohesion: 0.05 Nodes (41): 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, Frontend, Idiomas: dict por-idioma con compatibilidad legacy (+33 more) ### Community 16 - "api" Cohesion: 0.14 Nodes (34): activateCookie(), addChannel(), api(), checkAudio(), copyClip(), copyText(), downloadAudio(), downloadAudioOne() (+26 more) ### Community 17 - "pipeline.py" Cohesion: 0.24 Nodes (15): align_chapters(), Chapter, chapters_from_info(), Section, _normalize_date(), process_video(), Regenerate .md for done videos that have stored segments. Returns count re-rende, Extract + parse + store + render a single video. Returns final status string. (+7 more) ### Community 18 - "render.py" Cohesion: 0.20 Nodes (16): build_filename_stem(), format_timestamp(), _make_env(), Path, quote_yaml(), render_markdown(), to_json(), test_build_filename_stem() (+8 more) ### Community 19 - "config.py" Cohesion: 0.27 Nodes (13): _build_config(), DelayConfig, load_config(), Incremental channel sync — how far back a routine re-scan looks. The /video, SyncConfig, YtDlpConfig, Tests for the YAML config loader. Focuses on the ``languages`` and ``prefer_man, test_load_legacy_languages_list() (+5 more) ### Community 20 - "setView" Cohesion: 0.18 Nodes (14): checkHealth(), cycleSort(), destroyCharts(), hydrateURL(), init(), loadFolders(), loadFormat(), loadSearch() (+6 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 24 - "loadJobs" Cohesion: 0.29 Nodes (7): cancelScrape(), clearJobHistory(), closeStream(), deleteJob(), jobActionLabel(), jobIsTerminal(), loadJobs() ## Knowledge Gaps - **57 isolated node(s):** `yt-channel-scraper`, `Qué es esto`, `Comandos`, `Orientación antes de leer código`, `Tres superficies, un solo pipeline` (+52 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`, `Store Platform Tests`, `Content Analysis`, `pipeline.py`?** _High betweenness centrality (0.146) - this node is a cross-community bridge._ - **Why does `Segment` connect `Transcript Extraction & Parsing` to `CLI Command Layer`, `Segments Search & Backfill`, `Store Platform Tests`, `test_extract.py`, `pipeline.py`, `render.py`?** _High betweenness centrality (0.035) - this node is a cross-community bridge._ - **Why does `VideoRef` connect `Store Platform Tests` to `Transcript Extraction & Parsing`, `Config & Discovery Pipeline`, `Store & Export Layer`, `CLI Command Layer`?** _High betweenness centrality (0.027) - this node is a cross-community bridge._ - **Are the 12 inferred relationships involving `Store` (e.g. with `ParsedMarkdown` and `store()`) actually correct?** _`Store` has 12 INFERRED edges - model-reasoned connections that need verification._ - **Are the 9 inferred relationships involving `Config` (e.g. with `test_config_languages_defaults_to_dict()` and `test_config_prefer_manual_defaults_true()`) actually correct?** _`Config` has 9 INFERRED edges - model-reasoned connections that need verification._ - **Are the 17 inferred relationships involving `Segment` (e.g. with `Chapter` and `Section`) actually correct?** _`Segment` has 17 INFERRED edges - model-reasoned connections that need verification._ - **What connects `yt-channel-scraper`, `Qué es esto`, `Comandos` to the rest of the system?** _57 weakly-connected nodes found - possible documentation gaps or missing edges._