Contexto: yt-extract — programación (cron) + arquitectura tiempo real

CRON DIARIO (seteado):
  crontab: 0 7 * * * ~//Downloads/yt-extract/scripts/daily.sh
           >> ~//Downloads/yt-extract/data/daily.log 2>&1
  scripts/daily.sh -> .venv/bin/python -m yt.observatory
  append_history(): escribe data/historia_observatorio.csv (fecha + fila por canal).
  La historia NO sobrescribe -> serie de tiempo de opt_in / stale / actividad.
 
TIEMPO REAL — HECHOS DUROS:
  - API YouTube = pull-only. No webhooks para trainability ni trending.
  - Cuota gratis 10k uds/dia ~= 7 uds/min sostenidas. Polling continuo de 38
    canales reventaria la cuota (~10k/dia).
  - El UNICO push gratis real es WebSub/RSS de UPLOADS nuevos:
      https://www.youtube.com/feeds/videos.xml?channel_id=...
      (soporta WebSub/pubsubhubbub). No cubre trainability ni trending.
 
ARQUITECTURA REAL-TIME (sin pagar):
  1) WebSub subscribe a los feeds RSS de los 38 canales -> push en upload nuevo.
  2) Receptor: Cloudflare Worker (escribe D1/KV/R2, sin laptop encendida)
     o Cloudflare Tunnel a la maquina local (local-first).
  3) Trainability reactiva: cada push -> 1 query videoTrainability (1 ud).
     Scan diario = respaldo/backstop.
  4) Trending sin push -> poll cada 15-30 min (1 ud/poll).
  Ceiling: si se quiere MUCHO mas -> cuota pagada o nada.
 
STACK DEL USUARIO APLICABLE: skills Cloudflare (Workers, Wrangler, Tunnel),
D1/KV/R2, Supabase (ya en surtido), local-first System76+Ollama.