Contenido detallado
🎯 El objetivo
El objetivo es un vigilante que nunca duerme: un worker que lee foros, comunidades y feeds, identifica quejas y deseos recurrentes — los "problemas" — y te entrega una lista de lo que podría convertirse en producto, clasificada por potencial y con enlace a la fuente. En vez de pasar horas recorriendo Reddit, el modelo local hace el trabajo pesado de lectura y solo te avisa cuando encuentra algo de verdad.
🆕 ¿Eres nuevo por aquí?
Una "dolor" es un problema del que la gente se queja repetidamente («pierdo tiempo haciendo X a mano», «ninguna herramienta resuelve Y»). Cuando el mismo problema aparece muchas veces y nadie lo resuelve bien, eso es un señal de oportunidad — la materia prima de un producto. El vigilante existe para captar estas señales a escala.
🔑 La idea central
El vigilante tiene cuatro responsabilidades, en este orden:
- •Recolectar de fuentes permitidas (RSS, JSON oficial, API), sin infringir las reglas de nadie.
- •Puntuar con cada elemento, pregúntale al LLM: ¿es un problema real? ¿Qué producto lo resolvería? Califícalo del 0 al 10.
- •Clasificar y deduplicar, guardando la fuente de cada señal para que puedas verificarla.
- •Ejecutarse solo cada N minutos y que solo te avise de lo que supere el límite.
⚖️ Ética y reglas (lee antes de recopilar)
Antes de escribir cualquier línea de código: vigilar la web no es extraerlo todo a cualquier costo. Cada sitio tiene términos de uso (ToS) y un archivo robots.txt que indican a qué puedes acceder. Respetarlas no es solo «portarse bien»: es lo que mantiene tu worker sostenible, sin bloqueos y dentro de la ley.
🚨 Recuadro de alerta: las reglas innegociables
- ✗Usa la API/feed oficial cuando exista. Reddit, YouTube, Stack Overflow, Hacker News y muchos foros exponen JSON/RSS oficial; prefiere siempre eso a extraer datos del HTML.
- ✗Respeta los ToS y robots.txt. Si los términos prohíben la recopilación automatizada, no recopiles. Plataformas como X/Twitter imponen fuertes restricciones: no las fuerces.
- ✗Aplica rate limit. Espacia las solicitudes (p. ej.: 1 cada 2–5 s), nunca satures el servidor. Identifícate con un User-Agent real y contacto.
- ✗Nada de datos personales ni inicios de sesión de terceros. Recolecta solo contenido público y agrega tendencias; no persigas a individuos.
✓ Recopilación responsable
- ✓RSS/JSON oficial o API con clave
- ✓User-Agent identificable + límite de solicitudes
- ✓Caché local para no volver a traer lo mismo
- ✓Solo contenido público, conservando la fuente
✗ Recopilación problemática
- ✗Eludir el inicio de sesión, el paywall o el captcha
- ✗Ignorar robots.txt / ToS
- ✗Enviar miles de solicitudes/min
- ✗Recolectar datos personales de individuos
💡 Consejo práctico
Empieza por lo que es ofrecido explícitamente: Reddit sirve JSON en cualquier página (solo tienes que agregar .json) y RSS (.rss); Hacker News tiene la Firebase API; muchos blogs y foros tienen /feed. Con fuentes oficiales nunca tendrás dudas sobre si estás haciendo algo indebido.
📥 Recolección de la fuente permitida
Primer paso concreto: obtener elementos de una fuente oficial y normalizar todo a un formato único; así, el resto del pipeline no necesita saber de dónde viene. Usaremos como ejemplo el JSON oficial de Reddit, guardando una línea por elemento (formato JSONL).
⌨️ Copy-run: recopilar y normalizar
Objetivo: descargar las publicaciones nuevas de un subreddit desde la fuente oficial y guardar un elemento limpio por línea. Necesitas curl e jq.
Cómo verificar: ejecuta wc -l coletado.jsonl (debe mostrar ~25) y head -1 coletado.jsonl | jq — cada línea tiene título, texto e url de origen.
💡 Consejo práctico
Normalizar es el secreto para poder sumar fuentes sin reescribir nada. Mañana puedes cambiar la recopilación por un feed RSS (/feed) o mediante la API de Hacker News, manteniendo las las mismas claves (fuente, id, título, texto, url). El LLM y el ranking ni notan la diferencia.
🧠 Análisis con el modelo local
Ahora, lo esencial: para cada elemento recopilado, pídele al modelo local que clasifica y devuelve JSON estructurado. La clave es forzar la salida en JSON (Ollama acepta format:"json") y usar una temperatura baja para obtener una respuesta consistente. Esto transforma texto suelto en datos que el ranking entiende.
⌨️ Copy-run: puntuar un elemento mediante API local
Objetivo: enviar un elemento a la API local (compatible con OpenAI, de la Trilha 3) y recibir {dor_real, dor, produto, score}.
Cómo verificar: la salida debe ser un JSON válido con score entre 0 y 10. Si devuelve texto suelto, refuerza el prompt con "responde SOLO JSON" y confirma que pasó format:"json".
💡 Consejo práctico
Pide también un campo justificación corta: además de mejorar la puntuación (el modelo «piensa» antes), te da una línea para leer en el informe sin volver a abrir la fuente. Y da ejemplos en el system prompt de lo que es una nota 2 frente a una nota 9 — calibra el score mucho más que ajustar la temperatura.
📊 Clasificando y guardando
Con cada elemento puntuado, el worker se convierte en un curador: ordena por score, descarta lo repetido, elimina lo que quedó por debajo del umbral y guarda solo lo que vale, siempre con el enlace a la fuente. La disciplina aquí es lo que separa un informe útil de una avalancha de ruido.
Ordenar por score
Mayor potencial en la cima. sort_by(-.score) resuélvelo en una línea de jq.
Deduplicar
El mismo problema aparece en varias publicaciones. unique_by(.id) y, idealmente, agrupa elementos con problemas similares.
Descartar por debajo del umbral
Mantén solo dolor_real == true e score >= 7. El recorte es tu botón de señal/ruido.
Guardar con cita
Cada oportunidad lleva la url de origen: sin fuente, es una suposición, no una señal.
📄 El archivo de salida: oportunidades.md
Objetivo: un markdown legible y clasificado que abres por la mañana y revisas de un vistazo. Cada elemento incluye el problema, el producto y la fuente.
Cómo verificar: abre el oportunidades.md y haz clic en una fuente: debe llevar exactamente a la publicación que generó la señal. Sin eso, no puedes validar ni citar.
✓ Notificar
- ✓Superó el umbral y es nuevo (no estaba en el informe de ayer)
- ✓Dolor recurrente en más de una fuente
- ✓Hay una fuente enlazada para que puedas validar
✗ Silenciar (ruido)
- ✗Score por debajo del umbral o dolor_real:false
- ✗Duplicado de algo ya reportado
- ✗Desahogo sin un producto posible detrás
🔁 Ejecución continua
Junta las tres etapas —recopilación, puntuación, ranking— en un solo script y prográmalo con cron (Ruta 4.2). El pipeline completo fluye de izquierda a derecha: las fuentes alimentan la recopilación, el LLM local puntúa, el ranking filtra y la salida es tu informe del día.
Lee de izquierda a derecha: el flujo (en ámbar) sale de las fuentes permitidas, pasa por tres etapas de procesamiento (en cian) y termina en el informe del día. O cron abajo cierra el ciclo — al ser local, repetirlo todo el día solo cuesta electricidad.
⌨️ Copy-run principal: vigia.sh
Objetivo: todo el pipeline en un script: recopila, puntúa con el modelo local, clasifica y guarda el markdown fechado.
Cómo verificar: ejecuta bash vigia.sh una vez a mano — debe imprimir "Grabado:" y crear el oportunidades-AAAA-MM-DD.md. Solo después agrega la línea de cron. Sigue el vigia.log en las primeras rondas.
Autoevaluación (opcional): ¿por qué empezar la recopilación con una fuente oficial (RSS/JSON/API), en vez de extraer el HTML a toda costa?
📌 Resumen del módulo
Siguiente módulo:
4.5 — Tu buddy local con nombre, cara y voz