tasks: заведены три задачи под незакрытые пункты цели о долгих записях

- intake-limits-measure меряет четыре звена, которых не берёт speechkit-limits:
  приём из Telegram и по HTTP, конвертацию и заливку в Object Storage;
- reject-oversized-recording отклоняет запись сверх потолка на приёме,
  long-text-delivery отдаёт текст в сотни килобайт файлом вместо сотни
  сообщений Telegram;
- все шесть пунктов «Завершения» цели теперь закрыты задачами.
This commit is contained in:
av
2026-08-11 10:28:56 +03:00
parent d2c85af80a
commit 9a54afba60
4 changed files with 117 additions and 0 deletions
+41
View File
@@ -0,0 +1,41 @@
# ✨ Отклонять на приёме запись сверх потолка
- **Тип:** feature
- **Категория:** Очередь
- **Зачем:** Запись сверх потолка принимается молча и висит в конвейере до истечения часового захвата, а человек всё это время ждёт текста.
- **Теги:** goal:long-recordings
Двигает пункт 2 «Завершения» цели: запись длиннее потолка отклоняется на приёме
понятным текстом, а не отказом через час.
Потолок задаётся конфигурацией, а не зашивается в код: числа приходят из
разведок `intake-limits-measure` и `speechkit-limits`, и меняются они без сборки.
## Затрагивает
- `TranscribeService.createTranscribeJob` — проверка длительности и веса до
записи файла на диск;
- контракт `POST /api/audio`: код и тело ответа на запись сверх потолка;
- ответ бота на слишком длинную запись;
- секция конфигурации: потолок длительности и потолок веса;
- `docs/database.md` — настройки с числовым значением.
## Критерии приёмки
- Запись длиннее потолка отклоняется на приёме: задача не заводится, файл на
диске не остаётся. Оракул — тест приёма на записи сверх потолка: задач ноль,
каталог хранения пуст.
- Отправитель видит человекочитаемый текст с названным пределом, а не код
ошибки. Оракул — тест: в теле ответа предел числом, текста внутренней ошибки
нет.
- Запись в пределах потолка принимается по-прежнему. Оракул — существующие
тесты приёма по HTTP.
- Потолок меняется конфигурацией без пересборки. Оракул — тест разбора
конфигурации с двумя разными значениями.
## Рамки
Берётся после `intake-limits-measure`: до неё потолок брать неоткуда. Длительность
известна из `ffprobe` — значит, проверка идёт после чтения метаданных, но до
записи в базу. Предел веса на стороне сервера уже есть
(`router.MaxMultipartMemory`), и он не отменяется, а дополняется.