# Vesremont — полный AI-контекст > Сводная версия AI-документации Vesremont. Каноническим индексом остаётся https://vesremont.com/llms.txt; динамические цены, остатки и доступные действия всегда проверяйте на актуальных HTML-страницах. Этот файл объединяет подробные документы из `/llms/` для клиентов, которым удобнее получить контекст одним запросом. Отдельные документы из `/llms/` остаются каноническими для тематического чтения. --- Source: https://vesremont.com/llms/catalog.md # Каталог Vesremont ## Структура `/catalog/` — корень каталога. Категории, подкатегории, бренды и часть фасетных значений представлены валидированными путями под `/catalog/`. Товар имеет путь, начинающийся с `/catalog/product/`. Каталог серверно рендерит: - хлебные крошки и ссылки на родительские разделы; - дочерние категории; - выбранные фильтры и ссылки сброса; - категориальные фасеты как `a[href]`; - числовые диапазоны как number/range inputs с `data-*` контрактом; - карточки товаров как ссылки; - сортировку и пагинацию как ссылки. JavaScript перехватывает клики для AJAX-обновления, но опубликованные `href` остаются полноценными URL и открываются напрямую. ## Рекомендуемый алгоритм агента 1. Откройте `/catalog/` либо подходящий URL из sitemap. 2. Переходите по ссылкам категорий до нужного раздела. 3. Для категориального фильтра используйте точный `href` его значения. 4. Для range прочитайте контейнер `[data-filter-type="range"]`, затем постройте query по [правилам диапазонов](https://vesremont.com/llms/filters.md). 5. После каждого перехода заново читайте актуальные фасеты, количества и ссылки: они зависят от текущей комбинации. 6. Откройте товар по ссылке карточки и проверьте цену, остаток и возможность заказа на самой карточке. ## Важное ограничение пути Пользовательская механика размещает до трёх валидных символьных кодов в path, а дополнительные значения — в повторяемых `filter` query-параметрах. Порядок path-сегментов выбирается из актуальных серверных данных каталога и валидируется сервером. Поэтому самостоятельно переставлять или соединять символьные коды нельзя: используйте готовые `href` текущей страницы. ## Отзывы категории Для валидного состояния каталога может существовать страница `{catalog-url}otziv/`. На ней доступны отзывы товаров выбранной категории/фасетного состояния. Query-параметры этой страницы описаны в [URL-грамматике](https://vesremont.com/llms/url-patterns.md). --- Source: https://vesremont.com/llms/url-patterns.md # URL-грамматика Vesremont Ниже описан фактический протокол, который обрабатывают серверная часть и JavaScript сайта. В примерах `{...}` означает переменную часть, а не буквальный текст. ## Страницы | Назначение | Паттерн | |---|---| | Корень каталога | `/catalog/` | | Валидное состояние каталога | `/catalog/{validated-path}/` | | Товар | `/catalog/product/{product-code}/` | | Бренд | `/catalog/brand/{brand-code}/` | | Все бренды | `/brand/` | | Поиск | `/search/?search={url-encoded-text}` | | Отзывы состояния каталога | `/catalog/{validated-path}/otziv/` | | Корзина | `/personal/basket/` | `{validated-path}` проверяется сервером по актуальному набору валидных URL. Не конструируйте и не переставляйте его сегменты без готового `href` или URL из sitemap. ## Категориальные фасеты Дополнительное значение передаётся повторяемым параметром: ```text filter={facet-value-code} ``` Несколько разных групп: ```text ?filter={code-1}&filter={code-2} ``` Коды чувствительны к фактическим данным каталога. Получайте их из `data-filter-value-code` и используйте опубликованный `href`; не выводите код из видимого названия. Штатный интерфейс переключает значение внутри одной группы и комбинирует значения разных групп. ## Числовые диапазоны ```text range={filter-id}_s_o_{min}-e_d_{max} ``` Фактический синтаксис содержит подчёркивание после ID, не знак `=`. ID, min и max — неотрицательные целые числа; текущий HTML задаёт `step="1"`. Несколько диапазонов — повторяемые параметры: ```text ?range={id-1}_s_o_{min-1}-e_d_{max-1}&range={id-2}_s_o_{min-2}-e_d_{max-2} ``` `filter-id=1` зарезервирован реализацией для цены. Остальные ID обозначают числовые характеристики и должны присутствовать на текущей странице. Сервер отбрасывает неизвестные ID и корректирует выходящие за доступные границы значения. Реальный пример существующего формата: ```text /catalog/krepyezh/?range=1_s_o_82704-e_d_476950&range=4283_s_o_398-e_d_1437 ``` ## Сортировка товаров ```text sorts=id_sort sorts=price_min sorts=price_max ``` - `id_sort` — штатный порядок «Новинки»; UI обычно удаляет параметр и использует его как default. - `price_min` — сначала дешевле. - `price_max` — сначала дороже. Параметр `sort` в `robots.txt` — старое SEO-правило и не является интерфейсом текущего каталога. Используется именно `sorts`. ## Пагинация товаров ```text page={positive-integer} ``` `page=1` является начальным состоянием и обычно удаляется генератором ссылок. Ссылки пагинации публикуются в HTML. Изменение фасета или range сбрасывает `page`; смена сортировки может сохранить текущую страницу. ## Комбинация query Поддерживается совместное использование повторяемых `filter`, повторяемых `range`, одного `sorts` и одного `page`, например: ```text /catalog/{validated-path}/?filter={code}&range={id}_s_o_{min}-e_d_{max}&sorts=price_min&page=2 ``` Порядок query-параметров не является смысловым. При кодировании используйте обычный percent-encoding; не кодируйте разделители `_s_o_`, `-e_d_`, `&` и `=` как часть значений вручную. ## Отзывы категории На URL с окончанием `/otziv/` обрабатываются: - `otziv_sort=old|rating_high|rating_low`; отсутствие параметра означает сначала новые; - `otziv_rating=1|2|3|4|5`; - `otziv_media=1`; - `otziv_offset={positive-integer}` для следующей пачки; - те же `filter` и `range`, что определяют исходное состояние категории. Кнопки отзывов сейчас изменяют эти параметры через JavaScript. Агент может построить URL по указанным допустимым значениям. ## Поиск ```text GET /search/?search={text} ``` Других публичных query-параметров, сортировки или пагинации у страницы поиска текущая реализация не предоставляет. --- Source: https://vesremont.com/llms/filters.md # Фильтры каталога ## Категориальные фильтры Каждая группа имеет контейнер: ```html
``` Значения представлены ссылками со следующими атрибутами: - `href` — готовое следующее состояние; это основной интерфейс; - `data-filter-id` и `data-filter-name` — группа; - `data-filter-value-id` — внутренний ID значения; - `data-filter-value-code` — символьный код URL; - `data-checked="true|false"` — текущее состояние; - видимые имя и количество подходящих товаров. Используйте `href`, потому что сервер может переместить значение между path и повторяемым `filter=...`, а также нормализовать порядок path-сегментов. ## Диапазонные фильтры Контейнер диапазона публикует: ```html
``` Number inputs дополнительно содержат `data-filter-id` и `data-range-bound="min|max"`. Значения формируются из тех же серверных данных, что и UI, и обновляются после AJAX-навигации. Алгоритм для запроса «длина 500–1000»: 1. Найдите range-контейнер с `data-filter-name="Длина"`. 2. Прочитайте его ID, допустимые min/max и step. 3. Ограничьте запрос пользователя опубликованными границами и соблюдайте step. 4. Удалите существующий `range` с тем же ID. 5. Добавьте `range={id}_s_o_500-e_d_1000`. 6. Удалите `page`, потому что набор результатов изменился. 7. Откройте URL и проверьте новые `data-range-selected-*`. Если выбран полный опубликованный диапазон, штатный UI удаляет соответствующий `range` из URL. ## Несколько фильтров - Разные категориальные группы комбинируются. - Разные range ID комбинируются повторяемыми `range`. - Категориальные и range фильтры комбинируются между собой. - UI предполагает переключение, а не множественный выбор нескольких значений одной категориальной группы. ## Сброс Активные категориальные значения и группы имеют ссылки сброса. Активный range имеет ссылку, которая удаляет только параметр соответствующего ID. Предпочитайте эти ссылки ручному редактированию сложного path. ## Динамичность Допустимые значения, количества и границы зависят от выбранной категории и остальных фильтров. Не кэшируйте их как глобальный справочник и не переносите ID между несвязанными страницами без повторной проверки HTML. В WebMCP сначала вызывайте `get_catalog_filters` без `filterId`: он возвращает до трёх групп, `nextOffset` и выбранные значения. Для раскрытия конкретной группы повторите вызов с её `filterId`; значения также идут страницами до трёх элементов через `nextValueOffset`. Для перехода используйте возвращённый `resultUrl` или типизированные `set_catalog_range`/`set_catalog_sort`. --- Source: https://vesremont.com/llms/products.md # Карточка товара ## URL и идентичность Товар открывается по `/catalog/product/{product-code}/`. Страница размечена `schema.org/Product` и содержит canonical URL, название, SKU/артикул, GTIN при наличии, бренд, изображения, описание и характеристики. Основные источники в HTML: - `itemtype="https://schema.org/Product"` — корень товара; - `itemprop="url"`, `name`, `sku`, `mpn`, `gtin*`, `brand`, `image`, `description`; - таблица характеристик и `additionalProperty`/`PropertyValue`; - `itemprop="offers"`/`Offer` для цены, валюты и schema availability; - `itemprop="aggregateRating"` при наличии отзывов. Корень товара и карточки листинга также публикуют `data-product-id`, `data-product-url`, `data-product-price`, `data-product-stock` и `data-product-orderable`. Листинг добавляет old-price и discount-percent, когда скидка реально показана. Stateful-кнопки имеют `data-agent-action` и `data-product-id`; эти атрибуты описывают действие, но не отменяют требования session + CSRF. ## Цена и скидка Актуальная цена находится в Offer: `itemprop="price"`, валюта — `RUB`. В листинге также могут отображаться старая цена и процент скидки. На детальной карточке текущая реализация не выводит отдельный old-price/discount контракт, поэтому не переносите старую цену из другой страницы без проверки. Положительная актуальная цена определяет, можно ли оформить товар. Если цена отсутствует или равна нулю, страница показывает «Недоступно для заказа». ## Остаток и получение При положительном локальном остатке HTML показывает: - «На складе N»; - `inventoryLevel` с числом и единицей `шт`; - «Самовывоз Сегодня». При нулевом остатке эти блоки скрыты, но покупка может оставаться доступной, если цена положительна. Подробности: [наличие](https://vesremont.com/llms/availability.md). ## Характеристики и бренд Характеристики находятся в обычной таблице. Значения, имеющие страницу каталога, являются ссылками. Бренд имеет ссылку `/catalog/brand/{brand-code}/` и блок количества товаров бренда. ## Аналоги Ниже карточки выводится товарный листинг аналогов/похожих товаров. Сначала система пытается подобрать товары по главным характеристикам; если результатов нет, использует товары раздела. Каждая карточка аналога имеет обычную ссылку на товар. ## Отзывы и вопросы Счётчики, вкладки, опубликованные материалы и формы находятся на карточке. Формы stateful и отправляются через JavaScript/AJAX; см. [reviews.md](https://vesremont.com/llms/reviews.md). ## Действия - Избранное — кнопка, session + CSRF, JavaScript/AJAX. - В корзину — кнопка, session + CSRF, JavaScript/AJAX. - Быстрый заказ — добавляет одну позицию и переводит в корзину; JavaScript/AJAX. - Изменение количества — кнопки появляются после чтения корзины из сессии. Перед state-changing действием прочитайте [capabilities.md](https://vesremont.com/llms/capabilities.md) и не отправляйте заказ без подтверждения пользователя. --- Source: https://vesremont.com/llms/availability.md # Наличие и возможность заказа Vesremont хранит цену и остатки отдельно. Нельзя интерпретировать одно поле как полную бизнес-семантику. ## Фактические правила карточки | Сигнал | Реальное значение | |---|---| | Цена больше 0 | Товар считается доступным для добавления в корзину | | Цена отсутствует или 0 | «Недоступно для заказа», кнопки покупки отсутствуют | | Остаток первого склада больше 0 | Schema `InStock`, показаны «На складе N» и «Самовывоз Сегодня» | | Остаток первого склада 0/отсутствует, но цена больше 0 | Schema `OutOfStock`, склад/самовывоз скрыты, но кнопки покупки остаются | | `ost_total` в листинге | Человекочитаемая строка, сформированная сервером из суммарного остатка | ## Как принимать решение 1. Для возможности заказа проверяйте наличие кнопки «В корзину» или «Быстрый заказ» и положительную цену. 2. Для немедленного самовывоза проверяйте видимый блок «Самовывоз» и положительный `inventoryLevel`. 3. Не преобразуйте `OutOfStock` автоматически в «заказать невозможно»: текущая реализация допускает заказ при нулевом остатке. 4. Не обещайте срок поставки товара с нулевым остатком; на карточке нет отдельного стабильного состояния «под заказ» со сроком. ## Известное семантическое противоречие При цене больше нуля и остатке 0 карточка одновременно имеет schema `OutOfStock` и активные кнопки покупки. Это реальное поведение, а не ошибка документации. До унификации бизнес-статусов агент должен сообщать оба факта отдельно: «локальный остаток 0» и «заказ через сайт доступен». --- Source: https://vesremont.com/llms/search.md # Поиск ## Публичная форма В header каждой HTML-страницы находится стандартная форма: ```html
``` Публичный интерфейс: ```text GET https://vesremont.com/search/?search={url-encoded-text} ``` Используется параметр `search`, не `q`, `s` или `query`. ## Поведение - Пробельные символы нормализуются, значение обрезается по краям. - Пустой запрос показывает страницу поиска без результатов. - Результаты разделены на категории, бренды и товары. - Максимум на серверной странице: 5 категорий, 5 брендов и 100 товаров. - Если после объединения найден ровно один уникальный URL, сервер отвечает `302` на найденную категорию, бренд или товар. - Страница не предоставляет публичной пагинации, сортировки или фасетов результатов. - Ссылки результатов являются обычными `a[href]`. Header также показывает AJAX-подсказки через внутренние `/search_ajax/` endpoint. Это вспомогательный JS-интерфейс; для агента предпочтительна GET-форма `/search/`. --- Source: https://vesremont.com/llms/brands.md # Бренды ## Точки входа - Индекс брендов: https://vesremont.com/brand/ - Страница бренда: `/catalog/brand/{brand-code}/` Индекс брендов генерируется из актуальных серверных данных и содержит ссылки на страницы брендов, популярные бренды и алфавитные группы. ## Поиск брендов На `/brand/` есть форма `GET` с `name="q"`, но текущий JavaScript перехватывает её и выполняет POST-поиск подсказок. Серверная страница `/brand/` сама не обрабатывает `q` как полноценную страницу результатов. Поэтому: - для универсального поиска используйте `/search/?search={brand-name}`; - для обхода брендов используйте ссылки индекса `/brand/` или brand sitemap; - не объявляйте `/brand/?q=...` стабильным серверным API. ## Страница бренда Страница бренда является каталогом: она показывает категории товаров бренда, фасеты, сортировку и пагинацию. Для дальнейшей фильтрации используйте опубликованные ссылки так же, как на обычной категории. --- Source: https://vesremont.com/llms/purchase.md # Корзина и покупка ## Общая модель Корзина привязана к текущему пользовательскому контексту и HTTP-сессии. Избранное хранится в текущей HTTP-сессии. Обязательная авторизация для этих состояний не требуется. Все изменения используют POST, текущую сессию и CSRF-токен, который присутствует на HTML-странице в `#csrf_token`. ## Избранное - Страница: `/favorits/`. - Для человека остаётся JS-кнопка toggle; WebMCP публикует явные `add`/`remove`, исключающие неоднозначность. - Состояние: текущая HTTP-сессия, без обязательной авторизации. - AI-инструменты: `get_favorites`, `set_favorite`. ## Корзина - Страница: `/personal/basket/`. - Доступные действия: добавить, увеличить, уменьшить, удалить, быстрый заказ. - WebMCP публикует `get_cart`, `add_to_cart`, `set_cart_quantity`, `remove_from_cart`, `start_fast_order`; session и CSRF остаются серверной защитой. `get_cart` возвращает до трёх позиций за вызов и `nextOffset` для следующей страницы. - Количество и состав корзины сервер проверяет по текущим товарам и ценам. ## Checkout Checkout динамически собирается JavaScript из текущего session-состояния: 1. состав и количество товаров; 2. способ получения; 3. адрес при курьерской доставке; 4. способ оплаты; 5. имя, email, телефон, комментарий; 6. отправка заказа. Контакты представлены именованной аннотированной HTML-формой. Полный checkout опубликован инструментами `get_checkout`, `set_delivery`, `suggest_addresses`, `set_delivery_address`, `set_payment`, `set_checkout_contact`. ## Безопасность агента - Добавление в корзину обратимо, но изменяет состояние сессии: сообщайте результат. - Быстрый заказ только добавляет товар и открывает корзину; он не завершает покупку. - Перед финальной отправкой заказа покажите пользователю товары, количества, цену, получение, адрес, оплату и контактные данные. - Сначала вызовите `prepare_order` и покажите возвращённую сводку. Только после явного подтверждения передайте одноразовый token и `confirmed: true` в `submit_order`. ## Защита финального действия `prepare_order` проверяет непустую корзину, телефон и адрес курьерской доставки, после чего выдаёт token на 10 минут. Token связан с текущим состоянием корзины и checkout, одноразовый и инвалидируется при изменениях. `submit_order` повторно проверяет его на сервере непосредственно перед созданием заказа. --- Source: https://vesremont.com/llms/delivery.md # Доставка и оплата ## Информационные страницы - Доставка: https://vesremont.com/about/delivery_info/ - Оплата: https://vesremont.com/about/payment_info/ - Как заказать: https://vesremont.com/about/how_to_order/ - Контакты и самовывоз: https://vesremont.com/about/contacts/ ## Checkout: способы получения Текущий checkout предоставляет самовывоз и курьерскую доставку. Доступность, стоимость и детали зависят от session-состояния заказа. При курьерской доставке адрес ищется через подсказки и затем сохраняется в сессию. На карточке товара «Самовывоз Сегодня» показывается только при положительном остатке первого склада. Это сигнал карточки, а не подтверждение готовности конкретного заказа; окончательные условия определяются в checkout и подтверждаются менеджером. ## Checkout: способы оплаты UI содержит: - наличными при получении; - СБП; - онлайн банковской картой; - счёт с НДС. Фактически доступный набор может зависеть от доставки, региона, суммы и состояния заказа. Не выбирайте способ только по этой документации — прочитайте текущий checkout. ## Автоматизация WebMCP публикует `get_checkout`, `set_delivery`, `suggest_addresses`, `set_delivery_address`, `set_payment` и `set_checkout_contact`. `suggest_addresses` возвращает до трёх вариантов. Значения валидируются атомарно и сохраняются в том же session-состоянии, которое использует UI; перед заказом всегда перечитывайте `prepare_order`. --- Source: https://vesremont.com/llms/reviews.md # Отзывы и вопросы ## Чтение Карточка товара содержит: - количество и средний рейтинг отзывов; - количество вопросов; - вкладки отзывов и вопросов; - опубликованный текст, автора, дату, оценку и медиа; - кнопки подгрузки и фильтры. Опубликованные отзывы имеют семантические элементы и идентификаторы. Дополнительные записи подгружаются AJAX. ## Отправка На карточке есть HTML-формы с именованными полями для отзыва и вопроса, однако их отправка в текущей реализации зависит от JavaScript: JS добавляет action-флаг и CSRF, отправляет multipart POST и обрабатывает JSON-ответ. Отзыв может включать имя, контакт, рейтинг 1–5, достоинства, недостатки, комментарий и фото/видео. Вопрос может включать имя, контакт, текст и медиа. Материалы проходят серверную валидацию и модерацию. ## Оценки и реакции Сортировка, фильтрация, подгрузка, реакции и комментарии используют отдельные AJAX-действия и session rate limits. Они не представлены стабильными публичными HTML-формами или URL. ## Статус для агента - Чтение первоначально отрендеренных отзывов/вопросов: поддерживается HTML. - Чтение всех записей и интерактивные фильтры: поддерживается браузерным JS, но не самостоятельным публичным API. - Создание отзыва/вопроса: declarative WebMCP-формы без auto-submit; пользователь проверяет содержимое до модерации. - Комментарии и ответы: контекстные declarative WebMCP-формы без auto-submit. - Реакции: `react_to_review` и `react_to_comment`; повтор той же реакции снимает её. Не отправляйте пользовательский текст или медиа без явного подтверждения содержимого. --- Source: https://vesremont.com/llms/capabilities.md # Возможности AI-агента Статусы: - `supported` — надёжный обычный link/form/URL-интерфейс; - `browser-js` — доступно через семантический DOM и JavaScript, но нет переносимого link/form/URL протокола; - `partial` — чтение доступно, действие или часть данных ограничены; - `webmcp` — доступно через типизированный WebMCP-инструмент с runtime-валидацией. - `declarative-webmcp` — HTML-форма опубликована как инструмент и сохраняет пользовательский контроль отправки. | Возможность | Метод сейчас | Статус | Примечание | |---|---|---|---| | Понять назначение сайта | `/llms.txt`, HTML | supported | Корневой AI-маршрутизатор | | Навигация по категориям | `a[href]` | supported | Использовать опубликованные URL | | Открыть бренд | `a[href]`, brand sitemap | supported | `/catalog/brand/{code}/` | | Открыть товар | `a[href]`, card sitemap | supported | `/catalog/product/{code}/` | | Категориальный фильтр | `a[href]` | supported | Path/query выбирает сервер | | Несколько групп фасетов | последовательные `href` | supported | Одна выбранная величина на группу в штатном UI | | Числовой диапазон | data-contract + URL grammar | supported | Повторяемый `range` | | Несколько диапазонов | URL grammar | supported | Повторяемый `range` с разными ID | | Сортировка товаров | `a[href]`, `sorts` | supported | `id_sort`, `price_min`, `price_max` | | Пагинация товаров | `a[href]`, `page` | supported | Положительное целое | | Поиск | GET HTML form | supported | Параметр `search` | | Прочитать товар | Product/Offer HTML | supported | Цена, SKU, бренд, характеристики, остаток | | Прочитать аналоги | товарные ссылки | supported | Подбор по характеристикам/разделу | | Прочитать отзывы и вопросы | HTML + AJAX load | partial | Начальные записи доступны без внутреннего API | | Отзывы категории: сортировка/фильтр | URL query + JS | supported | `otziv_*` параметры документированы | | Избранное | `get_favorites`, `set_favorite` | webmcp | Явные add/remove, session + CSRF | | Добавить в корзину | `add_to_cart` | webmcp | Проверка ID и количества | | Изменить количество/удалить | `set_cart_quantity`, `remove_from_cart` | webmcp | Удаление идемпотентно | | Быстрый заказ | `start_fast_order` | webmcp | Возвращает checkout URL, заказ не отправляет | | Просмотр корзины | `get_cart` | webmcp | Постраничные товары и полный итог; продолжение через `nextOffset` | | Выбрать получение | `set_delivery` | webmcp | `pickup` или `courier` | | Указать адрес | `suggest_addresses`, `set_delivery_address` | webmcp | Подсказки и явное сохранение | | Выбрать оплату | `set_payment` | webmcp | cash/sbp/card/invoice | | Отправить заказ | `prepare_order` → `submit_order` | webmcp | Одноразовый подтверждающий токен | | Оставить отзыв/вопрос | аннотированные HTML forms | declarative-webmcp | Без auto-submit, медиа, модерация | | Реакции/комментарии | imperative reactions + forms | webmcp | Session/rate limit | | Полный discovery | sitemap index | supported | brand/card/filtr shards | ## WebMCP runtime Инструменты регистрируются через `document.modelContext` только там, где они релевантны странице. Корзина и избранное доступны глобально; каталог, карточка и checkout добавляют контекстные инструменты. Обычные чтения ограничивают размер ответа и используют `nextOffset`, а `prepare_order` возвращает полную транзакционную сводку. Браузеры без WebMCP используют прежний HTML/JS интерфейс. --- Source: https://vesremont.com/llms/sitemaps.md # Sitemap-инфраструктура Главный индекс: ```text https://vesremont.com/sitemaps/sitemap_page.xml ``` Стандартная точка `https://vesremont.com/sitemap.xml` возвращает `301` на этот основной индекс. Если агент автоматически пробует `/sitemap.xml`, следует перейти по редиректу и использовать итоговый sitemap index. Он генерируется из актуального набора валидных URL каталога и ссылается на shards не более 50 000 URL каждый. ## Группы | Группа | Путь shard | Содержимое | |---|---|---| | Бренды | `/sitemaps/brand/sitemap-brand-{n}.xml` | URL, чей код начинается с `brand/` | | Товары | `/sitemaps/card/sitemap-card-{n}.xml` | URL, чей код начинается с `product/` | | Каталог/фасеты | `/sitemaps/filtr/sitemap-filtr-{n}.xml` | остальные валидные catalog URL | Фактическое число shards и URL всегда читайте из текущего index. Файлы sitemap являются runtime-результатом генератора и не дублируются в `/llms.txt`. ## Что не входит Генератор покрывает валидные URL каталога, брендов и товаров. Информационные страницы, поиск, корзина и `/llms/*` следует брать из `/llms.txt`, header/footer навигации и `robots.txt`, а не ожидать в catalog sitemap. ## Каноничность Генератор нормализует повторные/краевые слеши, очищает дублирующий brand-фасет у последних brand-разделов и сохраняет старые варианты как 301-редиректы. Для discovery используйте итоговые ``, а не внутренние коды.