Интерфейс управления launcher-server находится в существующей админ-панели сайта по адресу /admin/launcher. Отдельное web-приложение и отдельная авторизация для control-plane не создаются.

Поток запроса

Browser получает только DTO. LAUNCHER_CONTROL_PLANE_ADMIN_TOKEN и содержимое token-файла никогда не передаются в React state, tRPC response или логи. buildId, releaseId и элементы affectedBuildIds принимают только переносимые catalog identifiers: первая ASCII-буква или цифра, затем буквы, цифры, ., _ и -, максимум 128 байт. Значения вроде .., .hidden, путей и строк с пробелами отклоняются на BFF-границе и повторно проверяются launcher-server до обращения к filesystem/S3.

Конфигурация backend

Конфигурация считается выключенной, если не задано ни одного значения. Частичная конфигурация отклоняется при запуске. В production inline token запрещён; нельзя одновременно задавать оба источника токена.

Разделы и права

Родительское право admin.launcher покрывает дочерние операции. UI скрывает недоступные вкладки, однако окончательная проверка всегда выполняется в tRPC.

S3

Launcher-раздел показывает только inventory служебного namespace. Bucket, endpoint и credentials уже принадлежат общему S3-разделу сайта, поэтому в launcher-admin нет дублирующей формы настроек. Launcher-server использует отдельную least-privilege identity для launcher/control-plane/* в том же bucket.

Ошибки и аудит

При недоступном control-plane tRPC возвращает контролируемую ошибку, а UI показывает retry state. Завершённое внешнее действие не запускается повторно, если запись административного аудита завершилась ошибкой. В аудите сохраняется id пользователя, а при чтении выводится его актуальный ник. История операций показывает локализованный этап, фактический прогресс и отдельный цвет terminal state; активный релиз исключён из вариантов повторной публикации и отката. Для офлайн-проверки доступны тесты конфигурации server adapter, каждого section-specific read permission, mutation permissions и нормализации RPC ошибок. Они не требуют запущенного launcher-server: