2026-09-22 — Review de engines y plan de merging del scrapping

Objetivo: consolidar TODO el scrapping de ~/nef en un solo core con cuatro perfiles nombrados: engine:editorial, engine:gartner-type-for-bikes, engine:google-places-reviews y engine:ideas-for-second-brain.

Regla: el core es uno (captura → normaliza → dedup → almacén → búsqueda → salud). Los cuatro nombres son perfiles de fuentes + salida + consumidor, no cuatro codebases.


1. Review: qué existe hoy (scrapping)

ProyectoQué scrapeaDónde correSalidaEstado
nef-silo (silo_engine.py)122 fuentes: 65 RSS + 51 X + 6 TG vía RSSHubLinode /opt/silo, cron */30silo.db (SQLite), silo.jsonl, estado.json, silo-textos.jsoncore vivo; batería hoy: solape 100% con surtido, profundidad 50%→90%
surtidofeed.py (RSS/X/YT/TG/HN), scripts/prensa_noche.py (prensa indep. AR/MX), likes_*.py (X likes)Vercel (asgi.py) + cron Mac + radio→Linodereporte/feed*.json, home.json, candidatas/, terna, boletínproducto vivo; fix DNS sin commitear
news-siloNYT/WaPo/Atlantic texto completo (RSS+sitemap, cookies/browser, boilerplate)Mac (local-only)data/corpus-mlai.jsonl, silos, infografías128 docs; sin commitear
cf-crawlCF Worker: /rss (gratis) + `/scrape/links/markdown/read` (Browser Run)
estado_turismo/spab-retrievalreseñas (Apify memo23/scrapesmith), Booking (Playwright), SerpApi, Airbnb, BigQuery Places, Reddit, YouTube, imágenesMac + Vercel (Next.js)corpus reseñas/precio/ocupaciónvivo; sesión activa hoy
estado_turismo/engineno scrapea: consume corpusCF Workers (engine.nef.workers.dev)ranking JSON (RAG+personas)eval Gemini/Workers AI ok
motor_estado_turismono scrapea: seed fakerCF Workersranking JSONprecursor del anterior
second-brain-twitterexports claude/chatgpt, X likes, X/RSS, YouTubeMac + worker CFreports/extraccion-*.md → nodoscorrida HF en planeación
second-brainno scrapea: publicaMac/quartznotas _enrich/vivo
periféricosinfoq-clone, heraldodemexico.com, datastori-es, yt-extract/whisper-videos, marvelous, church-scanner, public_domain_gem, ckan-datos—corpus ad-hoccongelados

Lectura: ya hay un core (nef-silo) y tres familias de scraping fuera de él (prensa local de surtido, places/reviews de turismo, exports personales). engine:gartner-type-for-bikes no existe: es un perfil nuevo.


2. Los cuatro engines (destino)

EngineFuentes (perfil)SalidaConsumidor
engine:editorialRSS/X/TG (122) + prensa indep. + NYT/WaPo/Atlantic (tiers)items + silos + exportsurtido (home/boletín/radio), news-silo (infografía)
engine:gartner-type-for-bikessector bici: medios, marcas, foros, reviews, reportes de mercadodossier + informe tipo Gartner (MD/HTML)cliente/portafolio (nuevo)
engine:google-places-reviewsApify (memo23/scrapesmith), SerpApi, Booking Playwright, BigQuery Places, Airbnb, Redditreseñas/precio/ocupación normalizadosestado_turismo/engine (RAG/ranking), rutas web
engine:ideas-for-second-brainexports claude/chatgpt, X likes, X/RSS, YouTubenodos candidatos (extraccion-*.md)second-brain (quartz)

3. Arquitectura de fusión: un core, cuatro perfiles

nef-engine (core)
  fuentes/         registro con `perfil` ∈ {editorial, gartner-bikes, places, ideas}
  captura/         RSS · X · TG (RSSHub) · web (trafilatura T1) · browser (T2/T3)
  normaliza/       canonical URL, lang/region, dedup MinHash + simhash
  almacén/         SQLite + jsonl + FTS5  (columna `perfil`)
  busca/           BM25 + embeddings + RRF + silos incrementales
  salud/           scheduler, backoff, topes, alertas, dry-run
  export/          JSON/RSS por perfil (nginx Linode) + SQLite local

perfiles/
  editorial/       fuentes + tiers de pago + adapter para surtido
  gartner-bikes/   fuentes del vertical + prompt de informe
  places/          adaptadores Apify/SerpApi/Booking/BigQuery → items
  ideas/           extractores de exports/likes → nodos (local-only)

Tiers de privacidad (ya validados por la batería F2.5):

  • T0 contenido del feed, universal (server).
  • T1 texto público en el server (trafilatura).
  • T2/T3 local-only: paywall (NYT/WaPo/Atlantic) y personales (chats/likes).

Interfaz: cada perfil exporta JSON con shape único ({generado, perfil, items:[{url,titulo,medio,tema,publicado,capturado,lang,region,texto?,extra?}]}), servido por nginx del Linode o artefacto Supabase. Los productos no leen la DB del engine: leen el export (o SQLite en local).


4. Mapeo scraper → destino

HoyDestino
nef-silo/silo_engine.pycore (se generaliza: perfil en fuentes/items)
surtido/feed.pyeditorial (fuente ya cubierta; queda adapter delgado)
surtido/scripts/prensa_noche.pyeditorial (añadir Página 12, Periodistas Unidos, Revista Espejo)
news-silo/scrape_mlai.pyeditorial tier T2/T3 (paywall local) + boilerplate
cf-crawlcaptura/browser del core (Browser Run opcional)
spab-retrieval/{corpus_resenas,reviews_airbnb,corpus_social,corpus_x_qroo,corpus_youtube}places (adaptador → items)
spab-retrieval/{precio_booking,precio_serpapi}places (extra.precio)
spab-retrieval/{datatur,ocupacion_*}places (extra.ocupacion)
second-brain-twitter/{extract_exports,claude_export_split,chatgpt_export_split}ideas (local-only)
second-brain-twitter/{likes,likes_deep,likes_hdbscan,likes_graph}ideas (local-only)
second-brain-twitter/{mine,distill,units,graph}ideas (capa LLM/salida)
estado_turismo/engine, motor_estado_turismoconsumidores (no se fusionan)
surtido/{proponer,mailing,asgi,cartel,radio}consumidores (no se fusionan)
second-brain (quartz)consumidor (no se fusiona)
gartner-bikesnuevo perfil (fuentes por definir)

5. Fases (cada una termina en artefacto verificable)

F0 — core generalizado (nef-silo, dueño: sesión nef-silo)

  • perfil en fuentes/items + exportar --perfil con shape único.
  • Artefacto: export-editorial.json + export-places.json verificables por curl.

F1 — engine:editorial (detalle: [CREDENCIAL].md)

  • Añadir prensa indep. faltante; export → adapter feed.py --desde-engine; /api/proponer y /api/cron con FEED_SOURCE=engine; retirar cron local.
  • Artefacto: una edición completa generada 100% desde el engine.

F2 — engine:google-places-reviews

  • Envolver los scrapers de spab-retrieval como fuentes perfil=places (adaptador que escribe items + extra), corriendo donde ya corren (Mac/Vercel).
  • Artefacto: places.json con N reseñas/precios y el estado_turismo/engine consumiéndolo sin cambios de contrato.

F3 — engine:ideas-for-second-brain

  • Perfil ideas local-only: exports + likes → items → extractor LLM → nodos.
  • Artefacto: extraccion-*.md regenerados desde el engine + _enrich/ actualizado.

F4 — engine:gartner-type-for-bikes (nuevo)

  • 15–25 fuentes semilla del vertical (medios especializados, marcas, foros, reviews, reportes) + prompt de síntesis tipo Gartner (mapa de mercado: categorías, jugadores, fortalezas, huecos).
  • MVP: dossier de 1 vertical → informe MD/HTML con fuentes citadas.
  • Artefacto: primer informe con fuentes trazables.

6. Riesgos / lista de NO

  • NO un repo monolítico que rompa los deploys (Vercel/CF/Linode): core único + perfiles, consumidores en sus repos.
  • NO subir T3 (paywall/personal) al server; NO mezclar perfil=ideas con editorial en un mismo export público.
  • NO duplicar captura (dos scrapers de la misma fuente = doble costo y dedup inconsistente).
  • NO fusionar los consumidores (proponer/mailing/web/radio, estado_turismo/engine, quartz): solo consumen.
  • NO inventar fuentes para gartner-bikes sin verificar (regla MBFC/credibilidad).
  • Un solo core = punto único de falla → se heredan salud/alertas + failsafes.

7. Coordinación

Cuatro sesiones abiertas hoy (nef-silo, news-silo, second-brain-twitter, surtido). Dueño del core: nef-silo. Este plan es la propuesta de consolidación; el punto de contacto entre perfiles es el shape del export.


8. Estado de ejecución (2026-09-22, misma sesión)

F0 — core generalizado: HECHO y desplegado.

  • silo_engine.py: perfil en fuentes/items (migración idempotente, default editorial); construir_recursos escribe perfil por fuente; capturar lo propaga al item; exportar --perfil con shape único (url/titulo/medio/tema/perfil/publicado/capturado/lang/region/tipo/fuente).
  • Verificado en local (DB temporal) y en el Linode: 4660 items con perfil=editorial; data/export-editorial.json (600 items, 347 KB).
  • Commit: 8a77fea (nef-silo).

F1a — prensa independiente al registro: HECHO y capturado.

  • recursos.json: 122 → 132 fuentes (75 RSS + 51 X + 6 TG) tomando prensa_noche.FUENTES.
  • Captura real en el Linode: Página 12 37, Revista Espejo 10, Chiapas Paralelo 10, Periodistas Unidos 7, Contralínea 6. (Río Doce RSS da 500; Rompeviento TV usa YouTube y da 0 — ambos ya conocidos.)

Pendiente inmediato (F1b): servir export-editorial.json por nginx y hacer feed.py --desde-engine en surtido; luego F2 (places), F3 (ideas), F4 (gartner-bikes).