---
title: "Webs legibles por agentes: llms.txt y espejos en Markdown"
canonical: https://wavect.io/es/blog/agent-readable-website-llms-txt-markdown-mirrors/
language: es
description: "Qué hace que un sitio sea legible por agentes de IA: acceso de robots, HTML servido, espejos en Markdown, llms.txt y JSON-LD, más los fallos de conversión que caza una puerta de build."
image: "https://wavect.io/img/blog/headers/header_agent-readable-website-llms-txt-markdown-mirrors.png"
---

[**Volver**](/es/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/es/team/kevin-riedl/)

[Kevin Riedl](/es/team/kevin-riedl/) https://linkedin.com/in/wsdt

9 min de lectura · 18 ago 2026 Última revisión 18 de agosto de 2026

[**Siguiente**](/es/blog/can-an-ai-agent-use-your-product/)

# Webs legibles por agentes: llms.txt, espejos en Markdown y qué se rompe de verdad

Resumen

Una web legible por agentes necesita que funcionen juntas cuatro superficies independientes: reglas de robots que dejen pasar a los fetchers de recuperación, texto presente en el HTML servido antes de que corra JavaScript, una copia limpia en Markdown o llms.txt anunciada con rel=alternate, y JSON-LD válido que nombre al editor. Aprobar tres de las cuatro te deja igualmente invisible. llms.txt es una convención y no un estándar, y su defecto más común son las URLs relativas, porque el archivo se lee separado de la página de la que salió. Los fallos de conversión que conviene blindar son valores de plantilla sin resolver, bloques de código sin cerrar, entidades HTML sin decodificar, enlaces contiguos fusionados, columnas de tabla que no cuadran, H1 duplicados y cuerpos vacíos. El error más caro es confundir crawlers de entrenamiento con fetchers de recuperación: bloquear GPTBot es una decisión de licencia, mientras que un disallow con comodín debajo te elimina por completo de las respuestas. Ninguno de estos fallos tiene un síntoma visible, así que las comprobaciones van en el build y no en una lista.

**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.

## Las 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 `: notas` de 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](/es/tools/agent-readability-checker/) 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](/es/blog/open-knowledge-format-okf/) cubre empaquetar conocimiento interno como Markdown portable, y la [guía del wiki de empresa listo para IA](/es/blog/ai-ready-company-wiki/) 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?

Cuatro cosas juntas: reglas de robots que dejen pasar a los fetchers de recuperación, texto presente en el HTML servido antes de que corra JavaScript, una copia limpia en Markdown o llms.txt anunciada en la cabecera, y JSON-LD válido que nombre al editor. Aprobar tres de las cuatro suele bastar para seguir invisible.

### ¿Es llms.txt un estándar?

No. Es una convención y ningún motor está obligado a leerla. Es barata de publicar y da a un agente un mapa limpio en lugar de navegación renderizada, y por eso mantenemos uno, pero trata las promesas de lectura garantizada como motivo para dudar del resto de la propuesta.

### ¿Funcionan las URLs relativas en llms.txt?

No de forma fiable. El archivo se descarga y circula separado de la página de la que salió, así que no queda URL base contra la que resolver. Usa URLs absolutas.

### ¿Deberíamos bloquear GPTBot?

Es una decisión de licencia, no de visibilidad. Bloquear GPTBot o CCBot te excluye de los datos de entrenamiento y no te elimina de las respuestas de ChatGPT ni de Perplexity, porque las sirven fetchers de recuperación distintos. Bloquear esos fetchers es lo que te saca de las respuestas.

### ¿Los espejos en Markdown generan contenido duplicado para los buscadores?

Lleva la URL canónica dentro del espejo y mantén los espejos fuera de tu sitemap XML, para que el descubrimiento siga apuntando a la página HTML. El espejo es una representación alternativa de un documento canónico, anunciada con rel=alternate.

### ¿Cómo evitamos que esto se degrade tras el lanzamiento?

Pon las comprobaciones en el build y no en un documento. El contenido y las plantillas cambian constantemente y ninguno de estos fallos tiene síntoma visible, así que todo lo que dependa de la intención retrocede en uno o dos trimestres.

## 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.

## También te puede gustar..

[**Open Knowledge Format: la guía para empresas** Cómo empaquetar el conocimiento de la organización como Markdown portable y legible con señales de procedencia y frescura.](/es/blog/open-knowledge-format-okf/) [**AI enablement vs consultoría de IA genérica** Compara una implementación medible sobre tu propia infraestructura con un encargo que solo entrega estrategia.](/es/compare/ai-enablement-vs-generic-ai-consultancy/)

Ingeniería de agentes

## Continúa por este clúster

Agentes de código, MCP, contexto, evaluación y controles para automatización fiable.

[Empieza por el artículo fundamental**Ingeniería de grafos para agentes de IA: ¿Cuándo compensa un knowledge graph?**](/es/blog/graph-engineering-ai-agents/)

- [Las URLs traducidas rompen hreflang: usa un solo slug en inglés](/es/blog/english-slugs-vs-localized-urls-hreflang/)
- [¿Puede un agente de IA usar tu producto, o solo leer sobre él?](/es/blog/can-an-ai-agent-use-your-product/)
- [Graft Review 2026: ¿el mapa del repo debe ir en Git?](/es/blog/graft-review-agent-repo-map/)
- [Cómo controlar los costes de agentes de código con compresión de salida](/es/blog/codag-cost-control/)
- [Uso de tokens más inteligente con tu agente de programación IA](/es/blog/smarter-token-usage-with-your-ai-coding-agent/)

Tu bandeja, sin ruido

## Sigue el trabajo que te importa

Recibe un correo breve cuando publiquemos algo nuevo. Sigue todo el blog o solo los temas que te interesan.

[**Volver**](/es/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/es/team/kevin-riedl/)

[Kevin Riedl](/es/team/kevin-riedl/) https://linkedin.com/in/wsdt

9 min de lectura · 18 ago 2026 Última revisión 18 de agosto de 2026

[**Siguiente**](/es/blog/can-an-ai-agent-use-your-product/)

Nuevos artículos por correo ×

×

Recibe nuevos artículos por correo

Un correo breve cuando publicamos. Gratis y sin seguimiento.

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/es/blog/agent-readable-website-llms-txt-markdown-mirrors/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-08-18",
      "inLanguage": "es",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-08-18",
      "url": "https://wavect.io/es/blog/agent-readable-website-llms-txt-markdown-mirrors/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "abstract": "Una web legible por agentes necesita que funcionen juntas cuatro superficies independientes: reglas de robots que dejen pasar a los fetchers de recuperación, texto presente en el HTML servido antes de que corra JavaScript, una copia limpia en Markdown o llms.txt anunciada con rel=alternate, y JSON-LD válido que nombre al editor. Aprobar tres de las cuatro te deja igualmente invisible. llms.txt es una convención y no un estándar, y su defecto más común son las URLs relativas, porque el archivo se lee separado de la página de la que salió. Los fallos de conversión que conviene blindar son valores de plantilla sin resolver, bloques de código sin cerrar, entidades HTML sin decodificar, enlaces contiguos fusionados, columnas de tabla que no cuadran, H1 duplicados y cuerpos vacíos. El error más caro es confundir crawlers de entrenamiento con fetchers de recuperación: bloquear GPTBot es una decisión de licencia, mientras que un disallow con comodín debajo te elimina por completo de las respuestas. Ninguno de estos fallos tiene un síntoma visible, así que las comprobaciones van en el build y no en una lista.",
  "articleBody": " Resumen del blog/IA y agentes/Ingeniería de agentes Webs legibles por agentes: llms.txt, espejos en Markdown y qué se rompe de verdad Resumen Una web legible por agentes necesita que funcionen juntas cuatro superficies independientes: reglas de robots que dejen pasar a los fetchers de recuperación, texto presente en el HTML servido antes de que corra JavaScript, una copia limpia en Markdown o llms.txt anunciada con rel=alternate, y JSON-LD válido que nombre al editor. Aprobar tres de las cuatro te deja igualmente invisible. llms.txt es una convención y no un estándar, y su defecto más común son las URLs relativas, porque el archivo se lee separado de la página de la que salió. Los fallos de conversión que conviene blindar son valores de plantilla sin resolver, bloques de código sin cerrar, entidades HTML sin decodificar, enlaces contiguos fusionados, columnas de tabla que no cuadran, H1 duplicados y cuerpos vacíos. El error más caro es confundir crawlers de entrenamiento con fetchers de recuperación: bloquear GPTBot es una decisión de licencia, mientras que un disallow con comodín debajo te elimina por completo de las respuestas. Ninguno de estos fallos tiene un síntoma visible, así que las comprobaciones van en el build y no en una lista. 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. Las 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. SuperficiePregunta que respondeAsí 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 : notas de 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. FalloPor qué pasaQué ve un agente Valor de plantilla sin resolverUn generador emite su marcador de valor ausente, o un par de delimitadores de plantilla sobrevive sin renderizar, y nadie lee la salidaUna página que te devuelve tu lenguaje de plantillas Bloque de código sin cerrarUna apertura sin su cierreTodos los encabezados posteriores dejan de ser encabezados, y el documento pierde su estructura",
  "articleSection": "Engineering",
  "author": {
    "@id": "https://wavect.io/team/kevin-riedl/#person",
    "@type": "Person",
    "name": "Kevin Riedl",
    "sameAs": [
      "https://www.wikidata.org/wiki/Q139796365",
      "https://www.linkedin.com/in/wsdt",
      "https://github.com/wsdt"
    ],
    "url": "https://wavect.io/team/kevin-riedl/"
  },
  "dateModified": "2026-08-18",
  "datePublished": "2026-08-18",
  "description": "Una web legible por agentes necesita que funcionen juntas cuatro superficies independientes: reglas de robots que dejen pasar a los fetchers de recuperación, texto presente en el HTML servido antes de que corra JavaScript, una copia limpia en Markdown o llms.txt anunciada con rel=alternate, y JSON-LD válido que nombre al editor. Aprobar tres de las cuatro te deja igualmente invisible. llms.txt es una convención y no un estándar, y su defecto más común son las URLs relativas, porque el archivo se lee separado de la página de la que salió. Los fallos de conversión que conviene blindar son valores de plantilla sin resolver, bloques de código sin cerrar, entidades HTML sin decodificar, enlaces contiguos fusionados, columnas de tabla que no cuadran, H1 duplicados y cuerpos vacíos. El error más caro es confundir crawlers de entrenamiento con fetchers de recuperación: bloquear GPTBot es una decisión de licencia, mientras que un disallow con comodín debajo te elimina por completo de las respuestas. Ninguno de estos fallos tiene un síntoma visible, así que las comprobaciones van en el build y no en una lista.",
  "headline": "Webs legibles por agentes: llms.txt, espejos en Markdown y qué se rompe",
  "image": "https://wavect.io/img/blog/headers/header_agent-readable-website-llms-txt-markdown-mirrors.svg",
  "inLanguage": "es",
  "keywords": "Visibilidad en IA, Web legible por máquinas",
  "mainEntityOfPage": {
    "@id": "https://wavect.io/es/blog/agent-readable-website-llms-txt-markdown-mirrors/",
    "@type": "WebPage"
  },
  "publisher": {
    "@id": "https://wavect.io/#organization",
    "@type": [
      "Organization",
      "ProfessionalService",
      "LocalBusiness"
    ]
  },
  "url": "https://wavect.io/es/blog/agent-readable-website-llms-txt-markdown-mirrors/",
  "wordCount": 2060
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/es/",
      "name": "Inicio",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/es/blog/overview/",
      "name": "Resumen del blog",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/es/blog/topics/ai-agents/",
      "name": "IA y agentes",
      "position": 3
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/es/blog/clusters/agent-engineering/",
      "name": "Ingeniería de agentes",
      "position": 4
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/es/blog/agent-readable-website-llms-txt-markdown-mirrors/",
      "name": "Webs legibles por agentes: llms.txt y espejos en Markdown | ",
      "position": 5
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Cuatro cosas juntas: reglas de robots que dejen pasar a los fetchers de recuperación, texto presente en el HTML servido antes de que corra JavaScript, una copia limpia en Markdown o llms.txt anunciada en la cabecera, y JSON-LD válido que nombre al editor. Aprobar tres de las cuatro suele bastar para seguir invisible."
      },
      "name": "¿Qué hace que una web sea legible por agentes?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "No. Es una convención y ningún motor está obligado a leerla. Es barata de publicar y da a un agente un mapa limpio en lugar de navegación renderizada, y por eso mantenemos uno, pero trata las promesas de lectura garantizada como motivo para dudar del resto de la propuesta."
      },
      "name": "¿Es llms.txt un estándar?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "No de forma fiable. El archivo se descarga y circula separado de la página de la que salió, así que no queda URL base contra la que resolver. Usa URLs absolutas."
      },
      "name": "¿Funcionan las URLs relativas en llms.txt?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Es una decisión de licencia, no de visibilidad. Bloquear GPTBot o CCBot te excluye de los datos de entrenamiento y no te elimina de las respuestas de ChatGPT ni de Perplexity, porque las sirven fetchers de recuperación distintos. Bloquear esos fetchers es lo que te saca de las respuestas."
      },
      "name": "¿Deberíamos bloquear GPTBot?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Lleva la URL canónica dentro del espejo y mantén los espejos fuera de tu sitemap XML, para que el descubrimiento siga apuntando a la página HTML. El espejo es una representación alternativa de un documento canónico, anunciada con rel=alternate."
      },
      "name": "¿Los espejos en Markdown generan contenido duplicado para los buscadores?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Pon las comprobaciones en el build y no en un documento. El contenido y las plantillas cambian constantemente y ninguno de estos fallos tiene síntoma visible, así que todo lo que dependa de la intención retrocede en uno o dos trimestres."
      },
      "name": "¿Cómo evitamos que esto se degrade tras el lanzamiento?"
    }
  ]
}
```
