# Проверка llms.txt и разметки: валидаторы и типичные ошибки

> Как проверить llms.txt, llms-full.txt, Markdown-версии страниц и структурированные данные: код ответа, тип содержимого, структура, ссылки, валидаторы и типичные ошибки

Страница: https://llms-full-txt.ru/guides/validation/
Указатель сайта: https://llms-full-txt.ru/llms.txt

Проверка отвечает на три вопроса: файл доходит до клиента, он устроен правильно, написанное в нём совпадает с сайтом.

Файл, созданный расширением или генератором, проверяют так же, как написанный вручную. Автоматическая сборка не гарантирует ни верного адреса, ни живых ссылок.

Хватит командной строки и двух бесплатных валидаторов.

## Почему это не формальность

[Common Crawl](https://commoncrawl.org/blog) разобрал 584 тысячи файлов `llms.txt`, найденных в сети. Значительная часть из них не работает как задумано.

- 40%
- успешных ответов на /llms.txt оказались HTML-страницей: 23%
- файлов не содержат ни одной ссылки: 50%
- файлов имеют полную структуру: заголовок, описание, секции

Самая частая поломка незаметна владельцу: сайт отвечает на `/llms.txt` кодом `200`, но отдаёт главную страницу или страницу «не найдено».

## Проверка llms.txt

1. Адрес `https://сайт/llms.txt` отвечает кодом `200` без цепочки перенаправлений.
2. Тип содержимого `text/plain` или `text/markdown`, кодировка UTF-8.
3. В ответе текст, а не HTML. Первая строка начинается с `# `.
4. Заголовок первого уровня один.
5. Под заголовком есть краткое описание, строка начинается с `> `.
6. Ссылки записаны как `- [Название](адрес): пояснение`.
7. Адреса в ссылках абсолютные и отвечают `200`.
8. В файле нет закрытых страниц, черновиков и адресов с параметрами.
9. Файл помещается в разумный объём: это карта, а не весь сайт.
10. `robots.txt` не закрывает файл от роботов, которым он адресован.

```bash
curl -sI https://example.ru/llms.txt
curl -s https://example.ru/llms.txt | head -n 5
```

В первой команде смотри строки `HTTP` и `content-type`. Во второй первая строка должна начинаться с решётки.

Проверить все ссылки файла разом:

```bash
curl -s https://example.ru/llms.txt \
  | grep -oE '\]\(https?://[^)]+\)' | tr -d '()]' \
  | while read -r url; do
      printf '%s %s\n' "$(curl -s -o /dev/null -w '%{http_code}' "$url")" "$url"
    done
```

Правила формата: [формат файла](https://llms-full-txt.ru/specification/format/), [секции](https://llms-full-txt.ru/specification/sections/).

## Проверка llms-full.txt

- Отвечает `200`, тип текстовый.
- Содержит текст страниц, а не список ссылок.
- Размер известен. Файл в десятки мегабайт агент целиком не прочитает.
- Собран из того же содержимого, что и сайт, и обновляется вместе с ним.

```bash
curl -sI https://example.ru/llms-full.txt | grep -i content-length
```

Когда этот файл нужен, а когда нет: [Что такое llms-full.txt](https://llms-full-txt.ru/guides/llms-full-txt/).

## Проверка Markdown-версий и связей

```bash
curl -sI -H 'Accept: text/markdown' https://example.ru/docs/install/
curl -sI https://example.ru/docs/install/ | grep -i '^link'
curl -s https://example.ru/docs/install/ | grep -iE 'rel="(alternate|describedby)"'
```

- На запрос с `Accept: text/markdown` или на адрес с `.md` приходит текст, а не HTML.
- Адрес из `rel="alternate"` отвечает `200`.
- Адрес из `rel="describedby"` ведёт на существующий `llms.txt`.

Подробно: [Markdown-версии страниц](https://llms-full-txt.ru/guides/markdown-pages/), [обнаружение](https://llms-full-txt.ru/specification/discovery/).

## Проверка структурированных данных

| Инструмент | Что проверяет | Адрес |
|---|---|---|
| [Rich Results Test](https://search.google.com/test/rich-results) | какие расширенные результаты Google может показать, ошибки и предупреждения | `search.google.com/test/rich-results` |
| [Schema Markup Validator](https://validator.schema.org/) | соответствие словарю Schema.org без привязки к Google | `validator.schema.org` |
| [Валидатор микроразметки Яндекса](https://webmaster.yandex.ru/site/tools/microtest/) | как разметку видит Яндекс | `webmaster.yandex.ru/site/tools/microtest/` |
| Search Console, Вебмастер | ошибки разметки на всём сайте со временем | отчёты об улучшениях и о разметке |

1. Блок `application/ld+json` есть в ответе сервера, а не появляется после скриптов.
2. JSON корректен: проверка открывается без ошибки разбора.
3. Тип соответствует странице: товар - `Product`, статья - `BlogPosting` или `Article`.
4. Обязательные свойства заполнены. Для товара это название, предложение, цена, валюта, наличие.
5. Значения совпадают с видимой страницей: цена, наличие, автор, дата.
6. На странице одно описание каждой сущности, без дубля от темы.
7. Хлебные крошки в разметке совпадают с крошками на странице.
8. Проверены страницы разных видов: товар с вариантами, товар без остатка, статья, главная.

```bash
curl -s https://example.ru/product/kettle/ \
  | grep -c 'application/ld+json'
```

Ноль значит, что в ответе сервера разметки нет. Больше единицы - повод посмотреть, не дублируются ли сущности.

Какие типы нужны и что в них должно быть: [Структурированные данные и JSON-LD](https://llms-full-txt.ru/guides/json-ld/).

## Типичные ошибки

- На /llms.txt приходит код 200, но это HTML
- Сайт отдаёт главную или страницу ошибки на любой неизвестный адрес. Lighthouse и агент видят файл, которого нет.
- Тип содержимого text/html, первая строка начинается с тега.

- Ссылки в файле относительные или ведут на старые адреса
- Агент читает файл вне сайта и не может собрать адрес. Часть ссылок отвечает 404.
- В списке есть пути без домена или адреса, которые перенаправляют.

- Цена в разметке не равна цене на странице
- Разметку вывела тема из одного поля, а цену на экране показывает скидочный модуль из другого.
- Валидатор ошибок не показывает: он проверяет форму, а не правду.

- Файл создан один раз и больше не обновляется
- Генератор запускали вручную. Сайт изменился, карта осталась прежней.
- В файле есть страницы, которых уже нет, и нет новых разделов.

## Что проверка не показывает

Валидатор подтверждает форму. Он не знает, верна ли цена, жив ли автор и читает ли кто-нибудь файл.

Читают ли файл на самом деле, видно только в журналах сервера: [Как измерить видимость в AI](https://llms-full-txt.ru/guides/ai-visibility/).

Lighthouse тоже проверяет `llms.txt`, но только сам факт ответа: [Lighthouse и llms.txt](https://llms-full-txt.ru/guides/lighthouse/).
