# ✨ Поднять Swagger UI без внешней сети

- **Тип:** feature
- **Категория:** Ядро
- **Зачем:** Контракт читается машиной, но человеку нечем выполнить запрос к живому сервису из браузера, а внешних CDN в локальной сети нет
- **Теги:** goal:read-api, sprint:2026-08-04

Человек открывает UI на отдельном пути и выполняет запрос к живому сервису — не
имея интернета.

Сервис живёт в локальной сети и на VPS без гарантии выхода наружу, поэтому
статика отдаётся самим сервисом и лежит в бинаре: внешние CDN здесь означают
«работает, пока работает чужой сайт».

**UI — новый адресат недоверенного входа наизнанку:** он даёт человеку одним
нажатием выполнить запрос к любому описанному маршруту, включая приём. Права
на запись из браузера не должны появляться сами собой — это ровно та граница, которую
описывает `docs/security.md`.

Двигает строку «Завершения» цели: «Контракт чтения читается машиной».

## Критерии приёмки

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

## Рамки

Схема не трогается. Берётся после спеки. Наружу ничего не выкладывается — это
решение человека и отдельная задача деплоя.
