# 🧹 Разобрать мелочи http-транспорта - **Тип:** chore - **Категория:** Очередь — Поднято до контракта API: маршруты объявлены дважды, и переименование пути проходит тесты зелёным — переписывать контроллер под слепыми проверками нельзя. - **Зачем:** Маршруты зарегистрированы дважды, и переименование пути в cmd/transcriber проходит проверки зелёным; обработчик пишет в журнал через стандартный log и дублирует запись, уже сделанную сервисом. - **Теги:** review-2026-08-11 Два дефекта, найденные ревью change `2026-08-11-fix-http-handler-tests`. Оба в `internal/controller/http`, мерджатся одним заходом. **Маршруты зарегистрированы дважды.** `cmd/transcriber` объявляет пути приёма и опроса, и сборка теста объявляет их же своей копией. Проверки ходят по копии, поэтому переименование пути в `cmd/transcriber` их не роняет — а публичный контракт HTTP API проект объявил необратимым. Проверено мутацией на прогоне триажа: замена `api.POST("/audio", …)` на `api.POST("/upload", …)` оставляет тесты зелёными. Нашёл проход `review-specs`. **Обработчик пишет в журнал мимо `slog` и дублирует сервис.** `log.Printf("Err: %v", err)` — стандартный `log`, тогда как весь проект пишет через `slog`; и эту же ошибку строкой выше уже записал сервис. Типовой узел «Транспорт» в [review.md](../../docs/review.md) прямо требует обратного: «не логирует ошибку, которую уже залогировал доменный слой». Нашёл проход `review-code`. ## Затрагивает - `internal/controller/http` и `cmd/transcriber` — регистрация маршрутов приёма и опроса, сегодня продублированная в обоих местах; - `internal/controller/http/transcribe.go` — журнальная строка обработчика; - `internal/controller/http/transcribe_test.go` — сборка теста, держащая свою копию маршрутов. ## Критерии приёмки - Пути и методы объявлены в одном месте, и переименование пути роняет проверки. Оракул — мутация: заменить `/app/audiorecords` на `/app/uploads`, прогнать `go test ./internal/controller/http/` и увидеть красное. - Обработчик не пишет в журнал через стандартный `log`. Оракул — `grep -rn 'log\.' internal/controller/http/*.go` без импорта `log/slog` пуст. - Об одном отказе приёма в журнале одна запись, а не две. Оракул — прогон отказа с перехваченным журналом: строк об этой ошибке ровно одна. ## Рамки Форма ответа и коды не меняются — этим занимается [json-api-for-spa](json-api-for-spa.md).