# ✨ Отклонять на приёме запись сверх потолка

- **Тип:** feature
- **Категория:** Очередь — Отклонять сверх потолка можно, когда потолок замерен.
- **Зачем:** Запись сверх потолка принимается молча и висит в конвейере до истечения часового захвата, а человек всё это время ждёт текста.

Запись длиннее потолка отклоняется на приёме понятным текстом, а не отказом
через час.

Потолок задаётся конфигурацией, а не зашивается в код: числа приходят из
разведок `intake-limits-measure` и `speechkit-limits`, и меняются они без сборки.

## Затрагивает

- `TranscribeService.createRecord` — проверка длительности и веса до записи
  файла в хранилище;
- контракт `POST /app/audiorecords`: код и тело ответа на запись сверх потолка;
- `GET /app/config` — потолок длительности рядом с потолком размера, чтобы экран
  отклонял такую запись до отправки;
- секция конфигурации: потолок длительности и потолок веса;
- `docs/database.md` — настройки с числовым значением.

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

- Запись длиннее потолка отклоняется на приёме: аудиозапись не заводится, файл в
  хранилище не остаётся. Оракул — тест приёма на записи сверх потолка: записей
  ноль, каталог хранения пуст.
- Отправитель видит человекочитаемый текст с названным пределом, а не код
  ошибки. Оракул — тест: в теле ответа предел числом, текста внутренней ошибки
  нет.
- Запись в пределах потолка принимается по-прежнему. Оракул — существующие
  тесты приёма по HTTP.
- Потолок меняется конфигурацией без пересборки. Оракул — тест разбора
  конфигурации с двумя разными значениями.

## Рамки

Берётся после `intake-limits-measure`: до неё потолок брать неоткуда. Длительность
известна из `ffprobe` — значит, проверка идёт после чтения метаданных, но до
записи в базу. Предел размера на стороне сервера уже есть — `entity.MaxRecordSize`
стоит и у поля файла, и у тела запроса приёма, — и он не отменяется, а
дополняется потолком длительности.
