Brief reutilizable — siguiente sesión SPAB (Cloudflare scrape / HF / Claude local / opencode DeepSeek / pickle)

Fecha: 2026-09-18 Uso: pegar como prompt inicial, con los paths y reglas abajo.


Brief — SPAB: silos de reseñas y panel de burbuja turística (retoma)

Eres mi agente en sesión nueva. Responde en español (bilingüe ES/EN). Contexto: diseñador-desarrollador en México; clientes WordPress/Elementor + R&D web creativo; local-first (System76 + Ollama). Proyecto SPAB: análisis de burbuja turística en Quintana Roo con varias capas de datos → panel Streamlit + silos semánticos + señales de demanda.

Stack disponible en esta sesión

  • Cloudflare: Workers + Browser Rendering (Playwright) para scrapear lo que bloquee Reddit/sitios; D1/KV para cache si hace falta. Nota: Google Maps ya cubierto gratis por actor Apify memo23 (10 reseñas/run, APIFY_API_KEY en ~/nef/estado_turismo/spab-retrieval/.env).
  • Hugging Face: embeddings Qwen/Qwen3-Embedding-0.6B (multilingüe, funciona con español; all-MiniLM-L6-v2 NO). Token HF: ~/nef/news-silo/.env (HF_APIKEY, cargar → HF_TOKEN). Sentiment: cardiffnlp/twitter-xlm-roberta-base-sentiment (ES) o SetFit few-shot si elijo fine-tune.
  • Claude local: revisión/redacción (claude code).
  • opencode + DeepSeek: agente principal de código.
  • pickle: cachear embeddings por id de doc (embeddings.pkl) para no re-embedear en cada corrida.

Estado actual (paths y corpus)

  • ~/nef/estado_turismo/spab-retrieval/
    • panel.py (Streamlit+Plotly, .venv-panel, corre en http://localhost:8501; 6 tabs: índice, ocupación, valor, demanda, estacional, cobertura — FALTA tab reseñas).
    • scripts/corpus_resenas.py (Google Maps memo23 + Reddit subreddit RSS), scripts/corpus_x_qroo.py, scripts/hedonico.py (descartado, R² 0.167), scripts/ocupacion_bacalar.py (débil, no imputar).
    • data/corpus/: resenas_maps.jsonl (36 reseñas polares 1★/5★, 5 destinos), reddit.jsonl (198: tulum 50, cozumel 50, bacalar 50, solotravel 48), x_qroo.jsonl (75 posts X: MaraLezama, SEDETURQROO, SECTUR_mx, RivieraMaya), prensa_qroo.jsonl (25 NewsAPI).
    • .env: APIFY_API_KEY.
  • ~/nef/news-silo/ (git, commit 67513a4): silo.py, silo_medios.py (Qwen3-Embedding + HDBSCAN + c-TF-IDF, respeta campo destino del doc, filtro limpieza), .venv (Py 3.12, sentence-transformers, torch). Correr: cd ~/nef/news-silo && .venv/bin/python silo_medios.py --dir <corpus> --min-cluster-size 4 (sin --youtube).
  • ~/nef/surtido/ → contenedor docker rsshub-surtido en :1200 (X timelines vía RSSHub), .env.local (TWITTER_AUTH_TOKEN, NEWSAPI_KEY).

Restricciones de fetching (verificadas)

  • Reddit: www.reddit.com/search.json → 403; search.rss → 429; /r/<sub>/.rss?sort=new → funciona con UA navegador, pero rate-limit ~40-60 s entre peticiones (429). Backoff ya en corpus_resenas.py.
  • X por query: bloqueado sin pagar (twitterapi.io, RSSHub /twitter/keyword 404, Apify tweet-scraper Demo Mode). Vivir: timelines RSSHub + prensa NewsAPI.

Pendientes priorizados

  1. Backfill Reddit (pacing ~45 s o background): r/cancun, r/playadelcarmen, r/puertovallarta, r/QuintanaRoo, r/MexicoTravel. Prioridad r/cancun.
  2. Más reseñas Google Maps (memo23, 10/run free): cubrir destinos faltantes.
  3. Sentiment scoring (NO existe aún): ground truth = estrellas en resenas_maps.jsonl; aplicar a reseñas y luego Reddit/X/prensa. YouTube ya fue decidido = solo sentiment.
  4. Tab “Reseñas” en el panel: cruce destino × tema × polaridad + TEMA 0 como indicador de demanda.
  5. Re-correr silo_medios con corpus completo (incl. reseñas, sin youtube).
  6. Índice de demanda desde reseñas: volumen/recencia del TEMA 0 (seguridad, presupuesto, transporte) + pregunta de r/bacalar “¿cómo impactó el aeropuerto de Tulum a Bacalar?” → cruzar con AFAC/aeropuerto Tulum.
  7. Cachear embeddings con pickle en silo_medios.py.
  8. Commit pendiente: engine/ (motor Qwen) en estado_turismo.

Reglas de trabajo

  • Scope pequeño: la versión más chica que funcione.
  • Persistir TODO insumo reutilizable en ~/nef/decisions/YYYY-MM-DD-*.md (prompts, scripts, decisiones, briefs). Decirme el path cuando lo guardes.
  • Nunca commitear secretos (.env, tokens); .env y .venv están gitignored.
  • Al cerrar: resumir estado por capa + responder quién verá el panel esta semana (testigo externo, p.ej. UI2).