# Машинные выходы

Документация отдаётся в четырёх машинных видах. Все четыре собираются **той же сборкой,
что и сайт, из тех же файлов** — не отдельным скриптом сбоку. Приделанное сбоку
расходится с сайтом на третьем заходе, и расходится молча.

## Точка входа: /llms.txt

Карта разделов: заголовок, одна строка описания на раздел и перечень страниц со ссылками
и описаниями. Небольшой файл, с которого модели стоит начинать.

```bash
curl -s https://docs-school.sersidteh.ru/llms.txt
```

Страницы, которые ещё не написаны, помечены прямо в списке — `[страница ещё не написана]`.
Это сделано намеренно: модель, которая знает, что раздела нет, скажет об этом, а не
придумает содержимое.

## Всё сразу: /llms-full.txt

Вся документация одним текстом, страницы подряд, у каждой указан её адрес. Нужен, когда
агент читает целиком и не хочет обходить страницы по одной.

```bash
curl -s https://docs-school.sersidteh.ru/llms-full.txt
```

## Спецификация API: /openapi.draft.json

OpenAPI 3.1. Из него собран [Каталог ресурсов](/api/reference/), из него же будут собраны
клиентские библиотеки и MCP-сервер.

```bash
curl -s https://docs-school.sersidteh.ru/openapi.draft.json
```

**Обратите внимание на имя файла.** `/openapi.json` — конвенция: агент, который его
скачал, обоснованно считает, что перед ним рабочее API, и начинает дёргать адреса.
Здесь так делать нельзя, и поэтому конвенциональное имя **не занято**:

- публичного API в продукте ещё нет — маршрутов `/v1/*` ноль;
- спецификация собрана машинным разбором проектного документа, а не из кода;
- **60 путей из 226 выведены эвристикой** из сокращённой записи каталога и помечены
  `x-lms-shorthand: true` — эти адреса могут оказаться другими;
- тел запросов и состава полей в ответах нет: у таких операций стоит `x-lms-unspecified`.

У всего документа стоит `x-lms-provisional: true`. Проверять этот признак — самый дешёвый
способ не построить интеграцию на несуществующем API.

Когда API будет написано, спецификация начнёт собираться из zod-валидаторов и переедет
на `/openapi.json`. Адреса страниц справочника при этом не изменятся.

Подробнее — [Чего в справочнике ещё нет](/api/reference/#chego-v-spravochnike-eshhe-net).

## Исходник любой страницы

К адресу страницы добавляется `.md` — и вместо разметки сайта отдаётся её исходный текст.

```bash
curl -s https://docs-school.sersidteh.ru/api/errors.md
```

Работают оба написания: `/api/errors.md` и `/api/errors/index.md`. В `<head>` каждой
страницы на этот же файл стоит ссылка:

```html
<link rel="alternate" type="text/markdown" href="/api/errors.md">
```

## Почему сайт статический

Содержимое отдаётся готовым HTML и не собирается скриптом в браузере. Причина простая:
**страница, пустая без JavaScript, для модели пустая.** Из этого же следует остальное
устройство сайта:

- заголовки и якоря стабильные — на них ссылаются и люди, и агенты, и ссылка не должна
  протухать от того, что мы переставили абзац;
- одна страница — одна тема: гигантская страница «всё про API» плоха и для поиска,
  и для контекста модели;
- поиск работает офлайн: индекс лежит рядом с сайтом, внешнего сервиса нет;
- ничего важного не спрятано в картинку — скриншот иллюстрирует, но не несёт сведений,
  которых нет в тексте.

## Версия

Каждая сборка называет версию продукта, на которой собрана: в подвале каждой страницы,
в шапке `/llms.txt` и в поле `info.version` спецификации.

Эта сборка — **версия 0.1.0**, сборка из коммита `933ad56` от 8 августа 2026.

Публичный сайт всегда показывает последнюю версию. Если у вас коробка другой версии,
её собственный справочник лежит внутри установки и собран на её версии — внешняя
документация врала бы половине покупателей.
