Saltar al contenido
megapromotingVamos a hablar

Experiencia · Contenido automatizado

Un flujo que busca por sí solo los temas del día, escribe el artículo, lo traduce a diecinueve idiomas y lo publica, pero solo después de pasar por una puerta de verificación que, cuando no puede verificar, no publica nada.

El motor está escrito, completo, y está en el propio repositorio de este sitio: ocho etapas, 1.706 líneas, un cronómetro de sistema que arranca diariamente a las 00:30 UTC. La parte que importa no es la generación, sino el gate: cinco verificaciones locales, diez expresiones prohibidas y una verificación adicional que busca nombres de clientes sin acuerdo, cifras inventadas y premios que no tenemos. Si el gate no puede ejecutarse, no se publica.

Ya construido„delivered”, pentru că lucrarea există ca fișiere pe care le puteți deschide, nu ca descriere: `scripts/content-engine/` din depozitul megapromoting.com, 17 fișiere, 1.706 linii de TypeScript, unitate systemd cu cronometru, opt etape legate cap la cap și jurnale ale rulărilor. Cu o rezervă pe care o spunem noi, nu o aflați voi: **singura rulare completă din jurnale nu a publicat niciun articol.** Poarta le-a oprit pe toate trei — două pentru că verificarea nu a putut rula deloc, a treia pentru un câmp lipsă din antet. `publish` a rămas gol, IndexNow a primit zero adrese. Rularea a fost locală, pe stația de lucru, și a durat două ore și jumătate, adică peste limita de 60 de minute pusă în unitatea systemd — deci pe server ar fi fost oprită. Nu putem confirma din exterior că motorul rulează azi pe server, și nu o pretindem.

La automatización que escribe y publica sola es el lugar donde más fácil se promete lo que no se puede. Un modelo escribe mil palabras convincentes sobre cualquier cosa, incluso sobre cosas que no ocurrieron, y las escribe con la misma fluidez. Si entre el modelo y el botón de publicar no hay nada, has construido una máquina de poner errores en internet, en veinte idiomas, cada noche. Todo el trabajo está en lo que va en medio.

Nuestro flujo tiene ocho etapas. Reúne temas de fuentes abiertas, les da una nota de 0 a 100 por lo adecuadas que son, descarta todo lo que esté por debajo de 50, elige las primeras N con una regla de diversidad para que no salgan diez artículos sobre lo mismo, escribe el artículo en rumano, lo traduce a diecinueve idiomas, lo pasa por la puerta y solo entonces publica. Cada etapa escribe su coste y su resultado en un registro, para que una ejecución pueda reconstruirse después.

La puerta tiene dos capas. La primera es local y no cuesta nada: el encabezado debe existir y tener título, descripción y palabras clave; el texto debe superar 1.200 palabras; debe tener al menos tres subtítulos, al menos tres enlaces internos y una sección de preguntas con un mínimo de tres pares; y no puede contener ninguna de las diez expresiones de marketing que pusimos en la lista negra. La segunda capa es un modelo que busca otra cosa: nombre de cliente sin prueba de consentimiento, estadísticas inventadas, afirmaciones incorrectas sobre lo que podemos hacer nosotros, y premios que no tenemos — la lista de los reales está escrita en la verificación, y todo lo demás se señala.

Existe aprobación humana en cadena, y lo decimos como argumento, no como excusa. Los artículos que fallan las verificaciones duras se descartan, no se publican. Los que pasan duro, pero reciben señales de la segunda verificación, se conservan marcados, para que una persona los revise. Y si la verificación no puede ejecutarse — porque el servicio de modelos no responde, por ejemplo — el artículo se trata como fallido. Fail-closed, no fail-open. Eso fue lo que ocurrió en la única ejecución completa de los registros, y por eso no se publicó nada.

Qué incluye

El trabajo, por componentes

Recopila los temas de fuentes abiertas, en paralelo, sin caerse si una se queda en silencio

Ocho recopiladores arrancan a la vez: Hacker News, Reddit, Product Hunt, GitHub trending en tres cortes, un conjunto de catorce flujos RSS e Indie Hackers. Cada uno tiene su propio manejo de error, así que una fuente caída devuelve una lista vacía y no detiene la ejecución. Los resultados se unifican, se eliminan los duplicados por identificador, y luego se aplica un tope de ocho temas por fuente, ordenados por velocidad de circulación — para que una fuente ruidosa no inunde la etapa siguiente.

Registra y descarta, antes de gastar en escribir

Cada tema recibe una nota de 0 a 100 por lo adecuado que es para lo que hacemos, además del ángulo propuesto, la industria objetivo y el servicio objetivo. Todo lo que esté por debajo de 50 se descarta. La etapa se ejecuta sobre un modelo barato, con cuatro hilos en paralelo, precisamente porque es la etapa que decide en qué se gastará después. De la elección final se saca otra capa: la primera pasada toma un tema por industria, para que no salgan diez variaciones sobre el mismo hilo.

Escribe el artículo con estructura impuesta, no libre

El generador recibe una estructura estricta: 1.500–2.200 palabras en rumano, encabezado YAML con título de máximo 60 caracteres y descripción de 155, un H1 y de cuatro a seis H2, entre tres y cinco enlaces internos elegidos de una lista de direcciones que existen en el sitio, una cita destacada, una sección de preguntas compatible con el esquema FAQPage y un llamado final. Se ejecuta con tres hilos en paralelo, con un presupuesto de cinco minutos por artículo y un tope de 5.000 tokens en la salida.

Traduce a diecinueve idiomas, con un glosario que no se traduce

La fuente es el rumano; los destinos son diecinueve, desde inglés, ruso y ucraniano hasta árabe, hebreo, hindi, japonés y chino simplificado, incluidas dos escrituras de derecha a izquierda. Las reglas son explícitas en el prompt: la cabecera conserva su estructura, las direcciones de los enlaces internos no se reescriben ni se localizan, los números, las unidades y las fechas se conservan, y los términos de marca del glosario permanecen intactos. La traducción va con solo dos hilos en paralelo, deliberadamente: la puerta de modelos limita el caudal bajo una carga mayor.

La puerta dura: cinco condiciones y diez expresiones prohibidas

Local, sin ninguna llamada de pago: el encabezado debe existir y tener título, descripción y palabras clave; el texto debe superar 1.200 palabras, contadas después de quitar los bloques de código y las etiquetas; mínimo tres subtítulos de nivel dos; mínimo tres enlaces internos a secciones que existen en el sitio; una sección de preguntas con al menos tres pares. Además la lista negra: «game-changing», «cutting-edge», «world-class», «revolutionize», «synergy» y otras cinco. Una sola aparición hace fallar el artículo.

La segunda puerta busca exactamente lo que no puede ver un contador

Un segundo modelo, con temperatura baja y respuesta en JSON, recibe el artículo y busca cinco cosas: nombre de cliente sin prueba de que dio su consentimiento, estadísticas alucinadas del tipo de una disponibilidad porcentual sin medición, afirmaciones inexactas sobre lo que nosotros podemos hacer, lenguaje de folleto, y afirmaciones sobre herramientas de terceros que darían la impresión de que las poseemos, cuando nosotros solo las integramos. También tiene la lista de los premios que realmente tenemos — cualquier premio fuera de la lista se señala.

Cuando la verificación no puede ejecutarse, el artículo se trata como fallido

La segunda verificación tiene un presupuesto de 90 segundos, explícito para no bloquear la ejecución. Si expira o si el servicio de modelos no responde, el error se captura y se convierte en un veredicto negativo, no se ignora. La consecuencia es importante y es la que más nos gusta: un artículo no llega a publicarse porque el guardián estuvo ausente. Ya ocurrió, en la única ejecución completa de los registros — dos artículos escritos por completo no se publicaron porque la verificación no pudo hacerse.

La publicación tiene una sola condición y tres pasos

La publicación ni siquiera se llama si cero artículos han pasado la gate. Cuando se llama: añade solo el directorio de contenido, se detiene si no tiene nada que commitear, hace un commit con la fecha, el número de artículos y el número de idiomas, e intenta el push. Si el push falla, el commit se queda local y la ejecución continúa — no se pierde el trabajo y no se afirma que se haya publicado. La notificación a los motores de búsqueda se hace solo si el push ha tenido éxito.

Cada ejecución deja su balance

Al final se escribe un informe por día: cuántos temas se recogieron, cuántos pasaron la nota, cuántos se eligieron, cuántos se escribieron, cuántas traducciones salieron, cuántos pasaron la gate, qué se commiteó y qué se hizo push, qué respondieron los motores de búsqueda, cuánto duró, y el coste desglosado por modelo, con el número de llamadas y los tokens de entrada y salida. El informe es un archivo, no un panel — se puede leer, archivar y comparar.

Qué aspecto tiene

El recorrido, paso a paso.

01

Establecemos qué puede escribir y qué no

Antes de cualquier código: la lista de temas que cubrimos, la lista de los que no tocamos, el tono y la lista negra de expresiones. Aquí también se escribe la lista de afirmaciones que el motor no puede hacer sobre vosotros — clientes, cifras, premios, comparaciones. Entregamos: las reglas escritas, en la forma en que entran directamente en la verificación, no como un documento separado que se olvida.

02

Ponemos en marcha solo la recopilación y la anotación, sin escribir nada

Se ejecuta en modo seco: se recogen los temas, se anotan, se eligen los primeros, se escribe el informe, y se sale antes de la generación. Es barato — en una ejecución así de nuestros registros hubo 24 llamadas, todas en el modelo pequeño, con un coste medido de aproximadamente un céntimo en total. Se ve exactamente lo que habría elegido el motor, día tras día, sin que exista ningún texto. Entregamos: los informes de ejecución seca y el acuerdo sobre lo que elige.

03

Escribimos y verificamos, pero no publicamos

Se pone en marcha la generación y la gate, con la publicación desactivada. Aquí se calibran los umbrales: si todos los artículos caen por longitud, es una cosa distinta de ajustar que si caen por enlaces internos. Aquí también se ve qué señala la segunda verificación, que es la parte más instructiva. Entregamos: los artículos generados, los veredictos completos con el motivo de cada rechazo, y los umbrales ajustados.

04

Abrimos la publicación, con la gate en su sitio

Se pone en marcha el cronómetro del sistema y la publicación. La hora se elige fuera del pico, con un retraso aleatorio para que las ejecuciones no se pisen; en nuestro caso, 00:30 UTC con hasta 30 minutos de retraso, y con recuperación si el servidor estaba apagado a esa hora. Se pone el límite de tiempo por ejecución. Entregamos: la unidad de servicio y el cronómetro, los registros y el procedimiento de parada.

05

Añadimos los idiomas, uno por uno

La traducción es la etapa con mayor consumo y la más fácil de descontrolar. Los idiomas se añaden por bandas de prioridad, no todos a la vez, y se verifica qué sale en cada uno — especialmente las escrituras no latinas, donde la regla es que los términos de marca permanezcan en alfabeto latino. Entregamos: el glosario, los idiomas activados y el coste medido por idioma del registro de ejecución.

Opt etape1adunare din optculegători paraleli,fiecare cu prindereproprie de eroare2notare 0–100, aruncăsub 503alegere cudiversitate peindustrie4scriere în română,1.500–2.200 decuvinte5traducere în 19 limbicu glosar neatins6poarta dură, cincicondiții și zeceexpresii interzise7poarta a doua, carecaută clienți, cifreși premii inventate8publicare, doar dacăa trecut măcar unulCând poarta nu poate rula, nu se publică.
Opt etape

Los datos

Qué tocamos, dónde están y cuánto se quedan

Las preguntas que hace cualquiera que tenga un delegado de protección de datos — hechas aquí antes de que las haga él.

Qué entra
Títulos, direcciones y fragmentos cortos de fuentes públicas — APIs abiertas y flujos RSS. No se recopilan datos personales, no se leen cuentas privadas y no se entra tras autenticación. Cada tema conserva la fuente, el canal y el momento del descubrimiento, para que se pueda seguir de dónde partió un artículo.
Dónde están los textos
Como archivos MDX en el repositorio de código del sitio, bajo `content/daily/{limbă}/{dată}/{slug}.mdx`. No en una base de datos separada. La consecuencia es que el historial completo es el historial git: se ve quién escribió qué, cuándo, y se puede volver con un comando. Cada artículo tiene su propio encabezado, a partir del cual la página pública compone sus datos estructurados.
¿Dónde están las claves?
En un archivo de entorno leído por la unidad systemd al iniciar, fuera del repositorio de código. El cargador de entorno no sobrescribe una variable ya definida en el proceso, así que la configuración de ejecución puede sustituirse sin tocar el archivo. Las llamadas a los modelos pasan por nuestra puerta interna, dirigida localmente en el servidor.
Los registros y cuánto se conservan
Un archivo JSON por día en el directorio de registros del motor, más la salida estándar y la de error escritas por separado en `/var/log`, a través de la unidad systemd. El registro diario contiene los veredictos de la puerta por artículo, con el motivo exacto del rechazo y el número de palabras contadas. No contiene el texto de los artículos — esos están en el repositorio.
Lo que no toca
No toca vuestras cuentas de redes sociales, no envía emails, no escribe en CRM. La publicación significa un commit en el repositorio del sitio y una notificación a dos motores de búsqueda. Si queréis publicación en otros canales, se discute por separado, con la misma regla: puerta antes, no después.

Un caso

La noche en que el motor escribió tres artículos y no publicó ninguno

La situación

Una ejecución completa, con todas las etapas iniciadas: recopilación de fuentes abiertas, calificación, selección, escritura en rumano, traducción, puerta, publicación. El objetivo era pequeño a propósito, tres artículos, para que se viera toda la cadena sin costar mucho.

Qué construimos

La recopilación trajo 24 temas únicos después de eliminar duplicados y limitar por fuente. La calificación conservó 18 y descartó 6 por debajo del umbral de 50. La regla de diversidad eligió 3, de industrias diferentes. El generador escribió 3 artículos en rumano. El traductor produjo 57 archivos. Luego entró la puerta.

Qué salió

Ningún artículo pasó. Dos cayeron porque la segunda verificación no pudo hacerse en absoluto — el servicio de modelos no respondió dentro del presupuesto de 90 segundos, y el error se trató como veredicto negativo, no se ignoró. El tercero cayó por una sola condición: le faltaba el campo de palabras clave en el encabezado, aunque tenía 2.478 palabras, es decir, el doble del umbral mínimo. Como ningún artículo pasó, la publicación ni siquiera se llamó: el commit quedó vacío, el push no se hizo, los motores de búsqueda recibieron cero direcciones. Las 57 traducciones quedaron en disco, sin uso.

Qué no dice el caso

La ejecución fue en la estación de trabajo, no en el servidor — se ve por las rutas del registro — y duró dos horas y media, por encima del límite de 60 minutos puesto en la unidad systemd. Así que demuestra dos cosas a la vez: que la puerta aguanta, y que el lote diario es demasiado grande para el límite de tiempo configurado. Ambas son reales y ambas merecen decirse.

Preguntas

Lo que nos pregunta la gente antes de llamar

¿Se publica sin que una persona vea el texto?

Sí, si elegís así — y no, si no. El motor puede ejecutarse de forma completamente automática, y en ese modo el artículo que supera ambas capas de la puerta se publica sin que nadie lo haya leído. Pero la puerta no es decorativa: hace caer el artículo por falta de un campo de encabezado, por 1.199 palabras en lugar de 1.200, o por una sola expresión de la lista negra. Y si preferís que cada artículo pase por una pareja de ojos, se detiene la publicación automática y todo se queda hasta la etapa de verificación, con las señalizaciones a la vista. Nuestra recomendación al principio es la segunda opción, hasta que las señalizaciones se vuelvan aburridas.

¿Qué pasa cuando el modelo se equivoca en un hecho?

Depende de qué tipo de hecho, y vale la pena decir honestamente que no todos se detectan. Se detectan: el nombre del cliente puesto sin prueba de acuerdo, la estadística inventada del tipo de un porcentaje de disponibilidad sin medición, la afirmación que daría la impresión de que poseemos una herramienta que solo integramos, el premio que no está en la lista de los reales. No se detectan: una fecha calendario incorrecta de una noticia externa, o una afirmación técnica sobre un producto de un tercero que suena plausible. Para esas no hay otro guardián que una persona, y por eso cada artículo conserva en el encabezado las fuentes de las que partió — la verificación sigue siendo posible después de la publicación, y la corrección es un commit.

¿Cómo se detiene el flujo?

De tres maneras, en orden de velocidad. La parada del cronómetro del sistema — mañana no arranca nada. Vaciar la variable que contiene la clave de publicación — el motor escribe y verifica, pero la notificación a los motores de búsqueda se omite con un aviso en el registro. Y la ejecución en modo seco, que se detiene después de la elección de temas y no genera nada. Además, una ejecución individual tiene un límite de tiempo en la unidad de servicio, con señal suave primero y parada forzada después.

¿El motor está ejecutándose ahora, en el servidor?

No podemos confirmar eso desde fuera y no lo vamos a afirmar. Lo que sí podemos mostrar es el código, la unidad de servicio, el cronómetro, el procedimiento de instalación y los registros de las ejecuciones que tenemos. La única ejecución completa en los registros fue en una estación de trabajo, no en un servidor —se ve por las rutas de los archivos— y duró dos horas y media, es decir, por encima del límite de 60 minutos de la unidad systemd. Si te interesa el estado de hoy de nuestra instalación, pregunta y lo verificamos juntos. Preferimos esa pregunta a un «sí» que resulte falso.

¿Cuántos artículos ha publicado hasta ahora?

Según los registros que tenemos: cero. La ejecución completa reunió 24 temas, mantuvo 18 tras la puntuación, eligió 3, escribió 3 artículos y 57 traducciones —y la gate los detuvo a los tres. Dos porque la segunda verificación no pudo ejecutarse en absoluto, uno por un campo faltante en el encabezado, aunque tenía 2.478 palabras, así que había superado ampliamente el umbral de longitud. La publicación no se invocó, los motores de búsqueda no recibieron ninguna dirección. Podríamos no decirte esto. Lo decimos porque es exactamente la demostración que necesita el servicio: la gate realmente detiene.

¿No es «contenido de AI» lo que perjudica el posicionamiento en la búsqueda?

La pregunta correcta no es quién lo escribió, sino si el texto responde a algo que alguien realmente busca y si es verificable. Por eso los umbrales de la gate están puestos sobre cosas que se correlacionan con la utilidad, no con el estilo: longitud mínima, estructura con subtítulos, enlaces internos a páginas que existen, sección de preguntas. Y por eso la lista negra contiene exactamente las expresiones que señalan texto escrito para rellenar espacio. Lo que no te prometemos es una posición concreta en los resultados —eso depende de muchas cosas que no están en nuestras manos.

¿Cuánto cuesta una ejecución?

El costo se mide, no se estima: cada llamada al modelo contabiliza sus tokens de entrada y salida, y el informe diario da el total desglosado por modelo, con el número de llamadas. En la ejecución en seco de nuestros registros: 24 llamadas al modelo barato. En la ejecución completa con tres artículos y 57 traducciones: 32 llamadas, de las cuales 3 al modelo caro —que hicieron la mayor parte del costo. El modelo usado en cada etapa es una variable de entorno, así que se puede bajar una etapa a un modelo más barato sin tocar el código. La cifra en dinero depende de los modelos elegidos y de sus tarifas en el momento de la ejecución.

¿En qué idiomas escribe y qué pasa con los términos de marca?

La fuente es el rumano, los destinos son diecinueve —inglés, ruso, ucraniano, polaco, alemán, italiano, francés, español, neerlandés, árabe, turco, hebreo, hindi, japonés, coreano, indonesio, chino simplificado, portugués brasileño y checo. Cada idioma tiene escrito en la configuración el motivo por el que está ahí. Los términos de marca y los técnicos están en un glosario y permanecen sin traducir, incluso en árabe, hebreo y las escrituras asiáticas, donde la regla es explícita: se conservan en alfabeto latino. Las direcciones de los enlaces internos nunca se localizan.

¿Qué no está listo de lo que me has descrito?

Tres cosas, dichas ahora para que no las descubras por tu cuenta. La documentación propia se adelantó al código en algunos puntos —el comentario al inicio de la etapa de puntuación menciona un modelo que ya no es el llamado, y el registro de fuentes describe un conjunto de flujos RSS mayor que el de la lista. La segunda: dos de las fuentes inscritas en el registro están marcadas como activas, pero su recolector no se llama en la función que reúne todo, así que hoy no aportan nada. La tercera: la ejecución completa de los registros superó el límite de tiempo de la unidad de servicio, lo que significa que en el servidor, con la configuración actual, se habría detenido a la mitad —hay que subir el límite o reducir el lote diario antes de arrancarlo automáticamente.

En qué se basan las afirmaciones anteriores (26 fuentes)

26 de ellas son código y archivos de nuestros repositorios. No publicamos su nombre ni la línea: juntos, en una sola página, describirían con demasiada precisión cómo están construidos sistemas que no son solo nuestros. Los repasamos contigo, en el repositorio, a petición — la verificación sigue siendo posible, solo que se hace en una conversación.

¿Qué te gustaría que funcionara mejor?

Cuéntanos tu proceso. Juntos decidimos qué merece la pena construir, qué podemos conectar y cómo verificamos el resultado.

Vamos a hablar