Webs legibles por agentes: llms.txt, espejos en Markdown y qué se rompe de verdad
Una web legible por agentes sirve una copia limpia para máquinas de cada página, la anuncia en la cabecera y no bloquea nada que necesite descargarla. La parte difícil no es decidir hacerlo. Es que siga siendo cierto después del cuarto despliegue, porque aquí todos los fallos son invisibles en un navegador y silenciosos en tus registros.
Nosotros operamos este stack en la web que estás leyendo: un espejo en Markdown de cada página, un llms.txt por idioma, agent skills publicadas y un verificador que hace fallar el build de producción en cuanto algo de eso se rompe. Este artículo es la lista de cosas que ha cazado ese verificador, y es una lista más útil que la que se obtiene leyendo la especificación.
¿Quieres saber si un agente puede leer tu web antes de invertir en arreglarla?
Ejecutar el comprobador gratuitoLas cuatro superficies que un agente usa de verdad
La legibilidad para agentes se discute como un solo tema, pero son cuatro superficies independientes, y un sitio puede aprobar tres y seguir siendo invisible.
| Superficie | Pregunta que responde | Así se ve el fallo |
|---|---|---|
| robots.txt | ¿Se me permite descargar esto? | Ausencia silenciosa de las respuestas |
| HTML servido | ¿Está el texto aquí antes de que corra JavaScript? | Una cáscara vacía con navegación |
| Espejo en Markdown | ¿Existe una copia barata y sin ambigüedad? | Interpretación cara y ruidosa del envoltorio renderizado |
| JSON-LD | ¿Quién publicó esto y qué es? | Datos adivinados desde la prosa, o nada |
El orden importa. Arreglar los datos estructurados de una página que un fetcher de recuperación no tiene permitido leer es trabajo perdido, y es la forma más común de empezar este proyecto del revés.
llms.txt, con honestidad
llms.txt es una convención, no un estándar. Ningún motor está obligado a leerlo, y quien te venda lectura garantizada está prometiendo demasiado. También es barato de generar y le da a un agente un mapa limpio en lugar de tu navegación renderizada, y por eso publicamos uno y normalmente lo recomendamos.
Si lo publicas, tres cosas deciden si sirve para algo:
- URLs absolutas. Este es el error que vemos más, y lo cometimos nosotros. Un llms.txt se descarga y circula separado de la página de la que salió, así que no queda ninguna URL base contra la que resolver enlaces relativos. Un archivo lleno de rutas
/services/…es un archivo lleno de callejones sin salida. - La cita en bloque bajo el H1. Esa única frase es lo que un agente reutilizará con más probabilidad palabra por palabra cuando te presente. Si falta, el agente escribe esa frase por su cuenta, con lo que haya inferido.
- Notas en cada enlace. La mitad de
: notasde cada viñeta es cómo un agente con presupuesto limitado decide qué enlace abrir. Una lista pelada de títulos le obliga a adivinar.
Espejos en Markdown y cómo anunciarlos
Un espejo es el mismo contenido que la página, sin el envoltorio, servido como Markdown en una ruta predecible y enlazado desde la cabecera:
<link rel="alternate" type="text/markdown" href="/services/ai-visibility.md">Generar espejos es sencillo. Mantenerlos fieles es la parte que necesita una máquina, porque un espejo puede estar sutilmente mal de formas que nadie nota durante meses. El generador corre después del build del sitio, recorre el HTML renderizado, y el verificador compara ambos después.
Los fallos que conviene conocer
Son hallazgos reales de nuestro propio build, no hipótesis. Cada uno llegó a producción al menos una vez antes de que existiera la puerta.
| Fallo | Por qué pasa | Qué ve un agente |
|---|---|---|
| Valor de plantilla sin resolver | Un generador emite su marcador de valor ausente, o un par de delimitadores de plantilla sobrevive sin renderizar, y nadie lee la salida | Una página que te devuelve tu lenguaje de plantillas |
| Bloque de código sin cerrar | Una apertura sin su cierre | Todos los encabezados posteriores dejan de ser encabezados, y el documento pierde su estructura |
| Entidad HTML sin decodificar | Entidades no decodificadas durante la conversión | Una entidad de ampersand o apóstrofo sin decodificar, leída como sus caracteres literales en lugar de como el signo |
| Enlaces contiguos fusionados | El espacio entre dos anchors se pierde al convertir | Dos textos de enlace pegados en una sola frase |
| Atribución pegada a su enlace | Falta un espacio antes del enlace de autor | Una cadena de autor en la que la palabra previa al enlace queda fusionada con el nombre |
| Columnas de tabla que no cuadran | La fila de cabecera y la de separadores discrepan en el número de columnas | La tabla deja de interpretarse como tabla y cada número pierde su columna |
| Más de un H1 | Encabezados del envoltorio filtrándose al cuerpo | Ambigüedad sobre de qué trata la página |
| Cuerpo vacío | Contenido inyectado en el cliente, así que el espejo no tiene nada que espejar | Front matter y silencio |
Nuestro favorito fue más sutil que todos estos. Añadir un glifo decorativo a una página metió una comilla doble literal dentro de un nodo de texto SVG, lo que detuvo al minificador de HTML dentro de contenido foráneo. El resto de esa página se publicó sin minificar, y su espejo en Markdown se truncó en silencio a dos tercios, llevándose consigo todo el FAQ. Nada parecía mal en un navegador. La puerta hizo fallar el build, nombró la ruta, y la corrección fue un carácter.
La trampa del robots.txt: recuperación no es entrenamiento
Es el malentendido más caro del tema, y es una línea de configuración.
Algunos crawlers existen para recoger datos de entrenamiento. Otros descargan una página para responder una pregunta y citarla, ahora mismo. Bloquear al primer grupo es una decisión de licencia que puedes querer tomar. Bloquear al segundo te elimina por completo de las respuestas, y casi siempre es involuntario:
User-agent: GPTBot
Disallow: /
User-agent: *
Disallow: /El primer bloque es una exclusión deliberada del entrenamiento. El segundo se lleva con él a todos los fetchers de motores de respuestas, porque un crawler sin grupo propio hereda el comodín. El equipo que escribió esto creía haberse excluido del entrenamiento. También se había excluido de ser citado.
Si quieres la postura "cítame, pero no entrenes conmigo", es coherente y configurable: nombra explícitamente a los fetchers de recuperación y déjalos pasar, y excluye por nombre a los crawlers de entrenamiento.
Por qué una puerta y no una lista
Cada punto de arriba es fácil de arreglar una vez e imposible de mantener arreglado por intención. El contenido cambia cada semana, las plantillas cada mes, y ninguno de estos fallos produce un síntoma visible. Una auditoría trimestral los encuentra un trimestre tarde.
Así que las comprobaciones van en el build, junto a los tests. Las nuestras corren después de generar el sitio y hacen fallar el despliegue, de modo que un espejo roto es una pipeline en rojo y no una fuga lenta. Ese es todo el truco, y por eso entregamos el catálogo de reglas en lugar de un informe: el comprobador de legibilidad para agentes ejecuta las mismas reglas de espejo en tu navegador, y es el mismo camino de código que decide si esta web se despliega.
Para los problemas vecinos: nuestra guía del Open Knowledge Format cubre empaquetar conocimiento interno como Markdown portable, y la guía del wiki de empresa listo para IA cubre servir ese conocimiento a tus propios agentes. Este artículo trata estrictamente de la superficie pública: lo que puede leer el agente de otra persona.
Preguntas frecuentes
¿Qué hace que una web sea legible por agentes?
¿Es llms.txt un estándar?
¿Funcionan las URLs relativas en llms.txt?
¿Deberíamos bloquear GPTBot?
¿Los espejos en Markdown generan contenido duplicado para los buscadores?
¿Cómo evitamos que esto se degrade tras el lanzamiento?
Reflexiones finales
La legibilidad para agentes no es un proyecto de contenido. Son cuatro superficies mecánicas, una lista corta de fallos de conversión y una línea de configuración que decide si algo de lo demás importa.
Empieza por robots.txt, porque es la comprobación más barata y el error más caro. Después sirve una copia limpia, anúnciala, valida tus datos estructurados y pon todo detrás de una puerta para que el siguiente despliegue tenga que mantenerlo cierto.
