## 1. Подстановки в сборке теста

- [x] 1.1 Завести в тестовом пакете подставной `contract.AudioMetaViewer`: отдаёт
  заданную длительность либо заданную ошибку
- [x] 1.2 Завести подставной `contract.AudioFileConverter` — конвертацию эти
  проверки не зовут
- [x] 1.3 `setupTestRouter` принимает каталог хранения и источник метаданных
  снаружи; `ffmpegmv` и `ffmpegconv` из импортов пакета уходят
- [x] 1.4 Каталог хранения каждому случаю даёт `t.TempDir()`; `os.Chdir` в файле
  не остаётся ни одного

## 2. Сборка запроса

- [x] 2.1 Вспомогательная функция собирает `multipart`-запрос из имени файла и
  байтов, а не из пути на диске
- [x] 2.2 Ни один случай не создаёт файлов в текущем каталоге

## 3. Проверки приёма

- [x] 3.1 Приём записи: код `201`, поле `job_id` непустое, поле `status` равно
  `created`, содержимое целиком лежит в каталоге хранения одним файлом
- [x] 3.2 Поля `audio` нет: код `400`, сообщение об отсутствии записи
- [x] 3.3 Запись нулевой длины: код `201`
- [x] 3.4 Расширение из имени отправителя: `.m4a`, `.mp3`, `.wav`, а имя без
  расширения даёт `.audio`
- [x] 3.5 Источник метаданных вернул ошибку: код `500`, задача не заведена
- [x] 3.6 Опрос готовности: найденная задача даёт `200` с полями `job_id`,
  `status` и `created_at`; неизвестный идентификатор даёт `404`
- [x] 3.7 Поля `transcription_text` в ответе нет, пока текста нет — проверяется
  по сырому JSON, а не по разобранной структуре

## 4. Линтер

- [x] 4.1 Снять исключение `errcheck` для `_test.go` в `.golangci.yml`
- [x] 4.2 `golangci-lint run` не даёт замечаний сверх четырёх объявленных долгом
  в `CLAUDE.md`

## 5. Гейт и приёмка

- [x] 5.1 `go test ./...` зелёный
- [x] 5.2 `task gate` не краснее объявленного долга: из двух известных отказов
  остаётся только `golangci-lint`
- [x] 5.3 Каждый критерий приёмки проверен своим оракулом, исход записан
- [x] 5.4 Снять `go test ./...` из списка объявленных долгов в `CLAUDE.md`,
  раздел «Гейт»: долг закрыт, и оставленная запись стала бы оправданием для
  любого будущего красного `go test` в этом пакете

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

Дословно из записи задачи `http-handler-tests-never-green`:

- `go test ./...` зелёный на чистом клоне без ручной подготовки файлов. Оракул —
  `git clone` во временный каталог и `go test ./...`.
- Тест приёма не зависит от установленного `ffprobe`: метаданные даёт подставной
  `AudioMetaViewer`. Оракул — прогон с временно переименованным `ffprobe` в
  `PATH`.
- Отказ разбора метаданных проверяется отдельным случаем и ожидает `500`, а не
  `201`. Оракул — тот же тест на подставном, возвращающем ошибку.
- Тесты не меняют рабочий каталог процесса. Оракул — `grep -n 'os.Chdir'
  internal/controller/http/transcribe_test.go` пуст.
