закрыта задача errors-as-instead-of-typecast
This commit is contained in:
@@ -49,7 +49,6 @@
|
||||
- [✨ Резать длинную запись на фрагменты и продолжать с места остановки](items/long-audio-chunking.md) — Шаг конвейера повторяется целиком: перезапуск на пятом часу шестичасовой записи начинает распознавание заново и оплачивает его второй раз.
|
||||
- [✨ Отдавать текст в сотни килобайт файлом, а не сотней сообщений](items/long-text-delivery.md) — Отправитель Telegram режет текст по 4000 знаков: расшифровка шестичасовой записи придёт сотней сообщений подряд.
|
||||
- [🔬 Загрузка большого файла частями](items/chunked-upload-choice.md) — Гигабайтный файл едет одним запросом, и обрыв на девяноста процентах начинает его заново.
|
||||
- [🧹 Сравнивать доменные ошибки через errors.As](items/errors-as-instead-of-typecast.md) — NoopJobError и JobNotFoundError проверяются приведением типа: первая же обёртка %w между слоями сломает проверку молча.
|
||||
- [🧹 Покрыть тестами разбор вывода ffprobe](items/metaviewer-adapter-tests.md) — Проверки приёма перестали звать настоящий ffprobe 2026-08-11, а своего теста у адаптера метаданных нет: разбор JSON и отличие «программы нет в PATH» от «обработка отказала» не проверяет ничто.
|
||||
- [🧹 Покрыть тестами шаги конвейера и захват задачи](items/pipeline-step-tests.md) — Тестовых файлов в проекте два, и оба мимо конвейера: потеря ссылки на файл, двойной ответ пользователю и гонка при захвате не поймаются ничем.
|
||||
- [🧹 Разобрать мелочи http-транспорта](items/http-transport-nits.md) — Маршруты зарегистрированы дважды, и переименование пути в main.go проходит проверки зелёным; обработчик пишет в журнал через стандартный log и дублирует запись, уже сделанную сервисом.
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
# 🧹 Сравнивать доменные ошибки через errors.As
|
||||
|
||||
- **Тип:** chore
|
||||
- **Категория:** Очередь
|
||||
- **Зачем:** NoopJobError и JobNotFoundError проверяются приведением типа: первая же обёртка %w между слоями сломает проверку молча.
|
||||
|
||||
Сегодня это работает только потому, что ошибку на этом пути никто не
|
||||
оборачивает. Сломается тихо: воркер перестанет отличать «задач нет» от отказа и
|
||||
начнёт писать `ERROR` раз в секунду на каждый из трёх воркеров, а `NoopJobError`
|
||||
попадёт в метрику отказов.
|
||||
|
||||
Правило записано в [conventions/errors.md](../../docs/conventions/errors.md),
|
||||
линтер на этих двух местах уже красный.
|
||||
|
||||
## Затрагивает
|
||||
|
||||
- `internal/controller/worker/worker.go`, проверка `NoopJobError`;
|
||||
- `internal/service/transcribe.go`, метод `findJob`, проверка
|
||||
`JobNotFoundError`;
|
||||
- `internal/contract/error.go` — оба типа полей не несут и годятся в sentinel;
|
||||
- `.golangci.yml` — после правки `errorlint` на этих местах должен молчать.
|
||||
|
||||
## Критерии приёмки
|
||||
|
||||
- Обе проверки идут через `errors.As` либо через `errors.Is` по sentinel.
|
||||
Оракул — `golangci-lint run` не даёт замечаний `errorlint`.
|
||||
- Обёртка `fmt.Errorf("…: %w", err)` в середине пути не ломает распознавание.
|
||||
Оракул — тест: обёрнутый `NoopJobError` воркер по-прежнему считает пустым
|
||||
прогоном и не пишет ни лога, ни метрики.
|
||||
- Метрика `transcriber_worker_job_count` на пустом прогоне не растёт. Оракул —
|
||||
тот же тест, проверка значения счётчика до и после.
|
||||
|
||||
## Рамки
|
||||
|
||||
Поведение снаружи не меняется; конвейер не трогаем.
|
||||
Reference in New Issue
Block a user