## 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` пуст.