Surtido: purge Aristegui + canales permanentes + corrida real local (2026-09-13)

Continuación de 2026-09-13-surtido-triage-local-r1.md.

Hecho

  • Aristegui Noticias fuera de TODO el repo (config + prompts + históricos):
    • channels.json: entrada reemplazada por Quinto Elemento Lab (MX, independiente_local) y agregado Mother Jones (EEUU, grande). 55 canales.
    • hn.py _MX: fuera “aristegui”, dentro “quinto elemento”/“quintoelemento”.
    • prompt-boletin-best-of.md: quitado de grandes MX; Mother Jones añadido en EEUU grandes (§2.4).
    • indice-credibilidad.json/.md: entrada reemplazada por Q. Elemento Lab y Mother Jones; hueco de verificación actualizado.
    • Históricos (reportes, briefes, candidatas, feed, observatorio, trainability, prensa-perfil): cleanup con limpiar_aristegui.py — 36 entradas de fuente estructurada y 31 líneas/menciones narrativas retiradas. transcripciones.json intacta (es caché de contenido, no registro de fuentes): conserva 1 mención sobre Aristegui como tema. JSONs validados.
  • Corrida real: ingest.py completo (55 canales ×5, skip-whisper) con OLLAMA_MODEL=deepseek-r1:8b local → candidatas/2026-09-13.json. Resumen: PASA 12, DUDOSO 2, RECHAZA 1, ERROR 2, SIN_TRANSCRIPCION 245.
  • Fix de ingest.py triage(): limpieza <thinking>, validación objeto JSON, setdefault("veredicto","ERROR") (evita KeyError con DeepSeek-R1).

Canal IDs resueltos (ya en channels.json)

  • Quinto Elemento Lab → UCPmmDeal2PiucQZL330FdOA (MX, independiente_local)
  • Mother Jones → UCbWB33FQvFiV0Pq9Calkgzw (EEUU, grande)

Pendientes / hallazgos de la corrida

  1. YouTube bloquea subtítulos por IP (IpBlocked): 245/263 videos sin transcripción → se descartan. Mitigaciones posibles: rotar de IP (proxies/ tunnel), habilitar STT local (faster-whisper), o tolerar caché acumulada.
  2. Títulos vacíos en scrape fallback (RSS 404): el modo scrape da sin título, degradando el triage. Pendiente: extraer títulos en el scrape.
  3. Model heredado vacío/off-schema: un JSON devolvió el esquema (“PASA | RECHAZA | DUDOSO”) y otro "" en veredicto. Pendiente: normalizar (solo aceptar los 3 valores + SIN_TRANSCRIPCION/ERROR) y re-triagear.
  4. Imprimir TITULO real en el prompt de ingest (hoy resumido a 60 chars por log).

Cómo re-correr

LLM_BACKEND=ollama OLLAMA_MODEL=deepseek-r1:8b OLLAMA_URL=http://localhost:11434 \
  nohup .venv/bin/python ingest.py --limit 5 --skip-whisper \
  > /tmp/ingest_YYYY-MM-DD.log 2>&1 &

Triage de candidatas ya guardadas: .venv/bin/python triage_rapido.py.