Repaso de motores que producen conocimiento — unificación (scraping · APIs · sitios · X/anti-fomo)

Fecha: 2026-09-27. Autor: Nef + opencode. Actualiza: 2026-09-22-adr-engine-unico.md, [CREDENCIAL].md, [CREDENCIAL].md, 2026-09-22-linode-caido-permanentemente.md, [CREDENCIAL].md.

0. Objetivo

Un solo core que produzca conocimiento por scraping (RSS/sitios + APIs + X), con perfiles de salida. Recipientes: surtido (desk editorial) y finitud (escritura). Consumidores locales: second-brain (grafo), news-silo (eventos). Foco pedido: X / anti-fomo.

Estado real: el core (nef-silo/silo_engine.py) existe y está generalizado, pero lleva sin host desde el 22-sep. Lo demás sigue operando por vías locales, con duplicación.

1. Inventario verificado (2026-09-27)

MotorQué produceFuentesSalidaHostEstado
nef-silo (silo_engine)items clasificados por tema/perfil, búsqueda híbrida, silos LSH132: 75 RSS + 51 X + 6 TG (RSSHub)silo.db (36 MB), silo.jsonl, estado/salud.json, export-<perfil>.jsonsin hostcore listo (F0/F1a); export muerto
surtido/feed.pyfeed X+YT+TG+HNRSSHub + Invidiousreporte/feed*.json, RSSMac + Verceloperando; rama x-anti-fomo
surtido/scripts/home_feed.pyhome limpio por 7 temasfeed.json/feed-tech.jsonreporte/home.jsonMac (auto en hn.py)operando
surtido/scripts/prensa_noche.pyprensa indep. AR/MXRSS (cron 03:00)candidatas/prensa-*.jsonMacoperando (fragilidad DNS)
surtido/ingest.pyvideo→transcripción→triageYouTube RSS + STTcandidatas/*.jsonMac (GPU)boletín v3
surtido/papers_cn.pypapers CN traducidosOpenAlex APIreporte/papers-cn.jsonMac→ second-brain
surtido/{nlp,sentimiento,pulso,traducciones}.pysentimiento/pulso/ESReddit/Bluesky/NewsAPI (+X opcional)bloques de ediciónMacoperando
surtido/scripts/fomo_release.pymarca anti-FOMO (demo/opinado/patrocinado)feed local (X/TG/RSS)reporte/*.fomo-release.{json,md}Macoperando
surtido/scripts/likes_*.pylikes X enriquecidosexport X (privado)data/likes.db (139k)Maclocal-only
social-silo/{mine,likes_*,distill,reports_to_enrich}.pynodos candidatos desde X/exportsX likes + exports claude/chatgpt + X/RSSreports/extraccion-*.md, _enrich/Mac + HFextracción Claude en curso
news-silo/{silo,silo_medios,harvest_cf,scrape_mlai}.pysilos por evento (embeddings+HDBSCAN)corpus NYT/WaPo/Atlantic, RSSdata/silos.json, infografíasMac128 docs; local
cf-crawl (Worker)RSS parse + Browser Runsitios/URLsJSON → news-siloCloudflareBrowser Run OFF
ckan-datos2 datasets agregadosreportes SB/SB-twitterCSV/sitioMacMVP lite
estado_turismo/spab-retrievalreseñas/precio/ocupaciónApify/SerpApi/Booking/BigQuery/Redditcorpus placesMac+Vercelvivo (perfil places)
yt-extract/yt/*observatorio YouTube (dashboard/deck)InvidiousHTMLMac~copia vieja de surtido/monitoreo

2. Estado crítico: el core está sin host

  • Linode [IP] dado de baja permanente. Verificado hoy: puertos 22/80/443 cerrados.
  • Efectos: surtido/feed.py (FEED_SOURCE=engine) apunta a http://[IP]/silo/export-editorial.json → muerto; cae a nef-silo/recursos.json local (solo registro de feeds) + cron Mac. vercel.json aún reescribe /vivo* → IP muerta (radio). deploy.sh/pull.sh apuntan a la IP muerta.
  • Destino decidido (no ejecutado): OCI free (region mx-queretaro-1, ~/.oci/config presente, 4 OCPU/24 GB ARM always-on), RSSHub como sidecar, estado en OCI + snapshot a R2, exports servidos por Cloudflare.
  • El repo del core ya vive en GitHub: github.com:[usuario]/nef-silo (HEAD 8986cdd).

3. Solapamiento (lo que hay que unificar)

Del ADR: fetch RSS/X/TG ×2, clasificador de 7 temas ×2 (home_feed.py vs _REGLAS del engine), dedup ×3, clustering ×2 (LSH en engine vs HDBSCAN en news-silo), búsqueda ×3, enriquecimiento ×3. Añadido hoy:

  • Observatorio duplicado: yt-extract/yt/* ≈ surtido/monitoreo/* (misma API, código divergido).
  • Conocimiento X en dos mundos: surtido (curación editorial: channels*.json, pool-likes, fomo_release) vs social-silo (likes.db 139k + mine.py → nodos). No comparten curación ni schema.
  • Extracción de texto ×3: cf-crawl (Browser Run) vs ingest.py (STT) vs news-silo (boilerplate).

4. Unificación propuesta — un core, perfiles, recipientes

                 ┌──────────── nef-silo (core) ────────────┐
 fuentes ───────►│ captura RSS·X·TG(RSSHub)·web(T1)       │
 (perfil)        │ normaliza/dedup · SQLite+FTS5 · salud   │
                 │ export por perfil (JSON/RSS)            │
                 └───────────────┬─────────────────────────┘
                                 │
     export-editorial ──► surtido (home · boletín · radio)   ← recipiente
                       └► finitud (escritura/piezas)         ← recipiente
     export-places ─────► estado_turismo/engine (consumidor)
     perfil ideas (local) ► second-brain (grafo)             ← consumidor
     corpus/tiers ──────► news-silo (silos por evento)       ← consumidor
  • Contrato de item único (ya implementado): {url,titulo,medio,tema,perfil,publicado,capturado,lang,region,tipo,fuente} (+ texto, extra). silo_engine.py ingesta <json> --perfil X ya acepta items de cualquier scraper.
  • Perfiles = fuente+salida+consumidor, no codebases: editorial, places, ideas, gartner-bikes.
  • Tiers de privacidad: T0/T1 al server; T2/T3 (paywall, likes, chats) local-only.

5. X / anti-fomo — la capa única (foco)

Hoy hay tres piezas X sin unificar. Deben quedar así:

  1. Curación (source of truth de handles): surtido/channels.json + channels-todo.json (87 canales) + pool-likes.json (pool anti-fomo de tus likes). Es la lista que alimenta el registro del engine (51 handles X ya en recursos.json).
  2. Clasificador anti-FOMO: scripts/fomo_release.py (reglas demo/opinado/patrocinado) → debe operar sobre el export del engine (X+TG) y marcar anti_fomo por item, no sobre un feed local reconstruido.
  3. Privado (local-only): likes.db (139k likes + embeddings) + mine.py → perfil ideas → second-brain. Nunca al server. El ranking por afinidad a tus likes (likes_buscar.py) se corre local y ordena el fomo-release (pendiente de cablear).

Regla de oro: el engine captura X por handles curados (no timelines personales); el fomo es una anotación sobre items públicos; tus likes son una señal privada de ranking.

6. Brecha vs plan 22-sep

  • Hecho (repo nef-silo): F0 (perfil en fuentes/items + exportar --perfil + shape único), F1a (132 fuentes con prensa indep.), cmd ingesta, run.sh regenera export.
  • Falta: F1b (servir export + adapter surtido contra export vivo) — bloqueado por host. F2 (places), F3 (ideas), F4 (gartner-bikes).
  • Bloqueo raíz: el host del core. Sin eso, el “un solo engine” no se puede verificar de punta a punta.

7. Próximos pasos concretos (verificables)

  1. Reponer el core en OCI free mx-queretaro-1 (o correr local si se quiere inmediato): engine + RSSHub sidecar + cron */30, estado en OCI + snapshot R2. Artefacto: curl https://<host>/silo/export-editorial.json devuelve N items.
  2. Repuntar surtido: ENGINE_EXPORT_URL al nuevo host; FEED_SOURCE=engine; quitar/repuntar los rewrites /vivo* de vercel.json. Artefacto: una edición generada 100% desde el engine.
  3. Conectar X/anti-fomo al engine: fomo como anotación por item + canal curado como fuente. Artefacto: export con flag anti_fomo y conteo por demo/opinado/patrocinado.
  4. finitud como recipiente: research desk de surtido (candidatas/briefes) → bloque “conexiones del grafo” (dist/graph.json) en templates Zola.

8. NO

  • NO duplicar captura (dos scrapers de la misma fuente = doble costo + dedup inconsistente).
  • NO subir likes/X/chats ni paywall al server (T2/T3 local-only).
  • NO monorepo (rompería deploys Vercel/CF/OCI); core único + consumidores en sus repos.
  • NO fusionar consumidores (proponer, mailing, radio, estado_turismo/engine, quartz).
  • NO reintentar contra la IP muerta [IP].