wip: estado de trabajo pendiente antes de la vista grid (suite 230 verde)

This commit is contained in:
urieljareth
2026-08-22 19:37:23 -06:00
parent 4f5a68b572
commit 8a59b39c98
103 changed files with 70954 additions and 1825 deletions
@@ -0,0 +1,26 @@
{
"0": "Webapp Frontend (JS)",
"1": "Transcript Extraction & Parsing",
"2": "Config & Discovery Pipeline",
"3": "Store & Export Layer",
"4": "CLI Command Layer",
"5": "Platform Design & Proposals",
"6": "Segments Search & Backfill",
"7": "Store Platform Tests",
"8": "Content Analysis",
"9": "README & Config Docs",
"10": "Server Start Script",
"11": "Package Manifest",
"12": "Server Stop Script",
"13": "Webapp Package Init",
"14": "test_extract.py",
"15": "Auditoría · Cómo la extensión obtiene la transcripción / información de vídeos de YouTube",
"16": "api",
"17": "pipeline.py",
"20": "setView",
"21": "Discovery-Only Scrape Design",
"22": "renderDashboardCharts",
"23": "Global Constraints",
"25": "init",
"27": "loadChannels"
}
+177
View File
@@ -0,0 +1,177 @@
# 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._
+12
View File
@@ -0,0 +1,12 @@
{
"runs": [
{
"date": "2026-07-27T05:54:56.822038+00:00",
"input_tokens": 11800,
"output_tokens": 4100,
"files": 37
}
],
"total_input_tokens": 11800,
"total_output_tokens": 4100
}
File diff suppressed because it is too large Load Diff
+252
View File
@@ -0,0 +1,252 @@
{
"pyproject.toml": {
"mtime": 1785126752.9759955,
"ast_hash": "f80dc007b3b67c7f7a78d9df01a81ead",
"semantic_hash": "f80dc007b3b67c7f7a78d9df01a81ead"
},
"scripts/start-server.ps1": {
"mtime": 1785132936.4055703,
"ast_hash": "7390a228e676bff301ae85c5a4e7449e",
"semantic_hash": ""
},
"scripts/stop-server.ps1": {
"mtime": 1785132762.2959402,
"ast_hash": "4a62db3fa3dca6b7109fcaadc1219226",
"semantic_hash": ""
},
"src/yt_scraper/__init__.py": {
"mtime": 1785120608.3336751,
"ast_hash": "4867131295172353fe6c2295851defc7",
"semantic_hash": "4867131295172353fe6c2295851defc7"
},
"src/yt_scraper/analysis.py": {
"mtime": 1785126463.1545029,
"ast_hash": "c28d08131e6594e1e7c6111ff01b2d37",
"semantic_hash": "c28d08131e6594e1e7c6111ff01b2d37"
},
"src/yt_scraper/chapters.py": {
"mtime": 1785120675.3308973,
"ast_hash": "1bf51b7c13486b9db9bcc3420fba2593",
"semantic_hash": "1bf51b7c13486b9db9bcc3420fba2593"
},
"src/yt_scraper/cli.py": {
"mtime": 1785561823.2458293,
"ast_hash": "100604834f369047b55641bd327333d0",
"semantic_hash": ""
},
"src/yt_scraper/config.py": {
"mtime": 1785561416.2574291,
"ast_hash": "712dddce27149cb3a5ceb34f78fac2fd",
"semantic_hash": ""
},
"src/yt_scraper/cookies.py": {
"mtime": 1785126417.4218228,
"ast_hash": "dd5ec44bb4c6e6375be80f21307fc73d",
"semantic_hash": "dd5ec44bb4c6e6375be80f21307fc73d"
},
"src/yt_scraper/discover.py": {
"mtime": 1785555427.3430922,
"ast_hash": "fce9799bd4076f35d4e5b4b1359b9782",
"semantic_hash": ""
},
"src/yt_scraper/export.py": {
"mtime": 1785126439.6829402,
"ast_hash": "f1cff31fb1004f08e997655f838e3a58",
"semantic_hash": "f1cff31fb1004f08e997655f838e3a58"
},
"src/yt_scraper/extract.py": {
"mtime": 1785561382.7161057,
"ast_hash": "a46b96123cfef40a10436e6e65b45d4b",
"semantic_hash": ""
},
"src/yt_scraper/monitor.py": {
"mtime": 1785555591.7611978,
"ast_hash": "e7948e61b74b84b246708518f02dbcae",
"semantic_hash": ""
},
"src/yt_scraper/parse.py": {
"mtime": 1785120665.3384771,
"ast_hash": "25354365ac1ab52f1561c97256573806",
"semantic_hash": "25354365ac1ab52f1561c97256573806"
},
"src/yt_scraper/pipeline.py": {
"mtime": 1785562085.460622,
"ast_hash": "7dae8872284b33015654fb356c008e67",
"semantic_hash": ""
},
"src/yt_scraper/ratelimit.py": {
"mtime": 1785120650.3795395,
"ast_hash": "6082befe56d342fc43abd5299dd6c6ea",
"semantic_hash": "6082befe56d342fc43abd5299dd6c6ea"
},
"src/yt_scraper/render.py": {
"mtime": 1785120688.3247268,
"ast_hash": "ff83764f3a8c8874557993e11eab1f89",
"semantic_hash": "ff83764f3a8c8874557993e11eab1f89"
},
"src/yt_scraper/segments.py": {
"mtime": 1785562183.2376134,
"ast_hash": "902d851e321b83c99d4cae30c1ae39fc",
"semantic_hash": ""
},
"src/yt_scraper/store.py": {
"mtime": 1785569257.9151454,
"ast_hash": "fffc4c7aa5265bd53cd7ca2856b453ef",
"semantic_hash": ""
},
"src/yt_scraper/webapp/__init__.py": {
"mtime": 1785126827.4957752,
"ast_hash": "d41d8cd98f00b204e9800998ecf8427e",
"semantic_hash": "d41d8cd98f00b204e9800998ecf8427e"
},
"src/yt_scraper/webapp/api.py": {
"mtime": 1785569267.6258545,
"ast_hash": "cadbcafc755f0e1daa574709bc54be84",
"semantic_hash": ""
},
"src/yt_scraper/webapp/app.py": {
"mtime": 1785562107.3107448,
"ast_hash": "80e375becb41e202f78239138252c5c8",
"semantic_hash": ""
},
"src/yt_scraper/webapp/jobs.py": {
"mtime": 1785556090.2023566,
"ast_hash": "45ba7f10b13b847c213f04441a5e741d",
"semantic_hash": ""
},
"src/yt_scraper/webapp/static/app.js": {
"mtime": 1785561992.7035935,
"ast_hash": "94250d573a31bf9bfb29cb54dc4c01e0",
"semantic_hash": ""
},
"tests/test_chapters.py": {
"mtime": 1785120789.3300896,
"ast_hash": "6d5303fa86de8dc99af6ae2ee17da033",
"semantic_hash": "6d5303fa86de8dc99af6ae2ee17da033"
},
"tests/test_features.py": {
"mtime": 1785126709.65728,
"ast_hash": "21f9c44ce7cc1d618ece402ab7c2b057",
"semantic_hash": "21f9c44ce7cc1d618ece402ab7c2b057"
},
"tests/test_parse.py": {
"mtime": 1785120974.3283188,
"ast_hash": "57ce74ee10fe6f9a90126ec7d9fd96b0",
"semantic_hash": "57ce74ee10fe6f9a90126ec7d9fd96b0"
},
"tests/test_render.py": {
"mtime": 1785120806.3260238,
"ast_hash": "27125960e235813724fd669001faab59",
"semantic_hash": "27125960e235813724fd669001faab59"
},
"tests/test_store_platform.py": {
"mtime": 1785194588.4186954,
"ast_hash": "44069db75a444906fb5001880dedf180",
"semantic_hash": ""
},
".opencode/agent/webapp-builder.md": {
"mtime": 1785126783.7152567,
"ast_hash": "58e92641724400370d7823dce1e02ca3",
"semantic_hash": "58e92641724400370d7823dce1e02ca3"
},
".opencode/goals/webapp-build.md": {
"mtime": 1785126796.8402326,
"ast_hash": "478e7a2350ded2fd273cfdb0714d228d",
"semantic_hash": "478e7a2350ded2fd273cfdb0714d228d"
},
"OPPORTUNITIES.md": {
"mtime": 1785122706.3466253,
"ast_hash": "4af60e3106b394664fbf5b5c5f645804",
"semantic_hash": "4af60e3106b394664fbf5b5c5f645804"
},
"README.md": {
"mtime": 1785121499.3282604,
"ast_hash": "a0a8e6b62a991fce5d6c58171f80075e",
"semantic_hash": "a0a8e6b62a991fce5d6c58171f80075e"
},
"config.example.yaml": {
"mtime": 1785561451.814817,
"ast_hash": "43661d5c00d05c922bcf884e8ac707c3",
"semantic_hash": ""
},
"docs/superpowers/plans/2026-07-26-platform-build.md": {
"mtime": 1785126240.4211702,
"ast_hash": "8097056ef23068f22c48151746de305b",
"semantic_hash": "8097056ef23068f22c48151746de305b"
},
"docs/superpowers/specs/2026-07-26-platform-design.md": {
"mtime": 1785126024.4879057,
"ast_hash": "9b85f02fd45c93cdabfd2e1c6d1e0c9e",
"semantic_hash": "9b85f02fd45c93cdabfd2e1c6d1e0c9e"
},
"src/yt_scraper/webapp/static/index.html": {
"mtime": 1785569275.8425553,
"ast_hash": "4f3d8f27f4f663c6f741be3db2312df3",
"semantic_hash": ""
},
"src/yt_scraper/_yt_http.py": {
"mtime": 1785134945.1512043,
"ast_hash": "8af224580322df5aeeba10062592d961",
"semantic_hash": ""
},
"tests/test_config.py": {
"mtime": 1785561477.3907576,
"ast_hash": "46f3eefb24bcf44535c17977ac175509",
"semantic_hash": ""
},
"tests/test_discover_incremental.py": {
"mtime": 1785555704.1061945,
"ast_hash": "e1c382a9b8f5c927a85d67814d3dbb09",
"semantic_hash": ""
},
"tests/test_extract.py": {
"mtime": 1785561483.422817,
"ast_hash": "9949ef4f6e7fe8cbdf12bc8d1dc71e3f",
"semantic_hash": ""
},
"tests/test_store_sync_watermark.py": {
"mtime": 1785555725.6495814,
"ast_hash": "9f9943f5b914078cee49bf4aaa060564",
"semantic_hash": ""
},
"tests/test_webapp_jobs.py": {
"mtime": 1785555746.4912646,
"ast_hash": "7688c701256ff0cdd2a7d78d7090c8b3",
"semantic_hash": ""
},
"CLAUDE.md": {
"mtime": 1785569349.167527,
"ast_hash": "a161232f286c0a4f674715f54b66fa76",
"semantic_hash": ""
},
"YOUTUBE-TRANSCRIPT-AUDIT.md": {
"mtime": 1785116715.5118847,
"ast_hash": "67c5b7e3b4661ca8c8a7280e63b13ba9",
"semantic_hash": ""
},
"docs/superpowers/plans/2026-07-27-discovery-only-scrape.md": {
"mtime": 1785192916.5353482,
"ast_hash": "3cf41d6331bd67e39ccd96b0e6138cf2",
"semantic_hash": ""
},
"docs/superpowers/specs/2026-07-27-discovery-only-scrape-design.md": {
"mtime": 1785192898.2889626,
"ast_hash": "529b39e9bd2adcafd17a2dc30263281c",
"semantic_hash": ""
},
"tests/test_recovery.py": {
"mtime": 1785569307.786051,
"ast_hash": "53f25aeda88cbf3755f45f2377970b62",
"semantic_hash": ""
},
"tests/test_since_filter.py": {
"mtime": 1785556104.7475204,
"ast_hash": "1d827c61156ab488e838dac91261624f",
"semantic_hash": ""
},
".claude/settings.json": {
"mtime": 1785569155.4443069,
"ast_hash": "dc072413449915d630bc773c9fb57dc7",
"semantic_hash": ""
}
}