## Why

Воркер отличает «работы сейчас нет» от настоящего отказа хрупким способом: он
смотрит на точный тип значения ошибки. Пока никто по дороге не добавил к ошибке
пояснения, это работает. Первое же пояснение, добавленное в любом месте пути,
сделает пустой прогон неотличимым от поломки — молча, без единого признака в
коде. Сервис начнёт раз в секунду на каждый из трёх воркеров писать в журнал
отказ, которого не было, и засчитывать несуществующие сбои в счётчик работы.
Инвариант проекта «пустой прогон — не ошибка» стоит ровно на этой проверке.

Сегодня же на этих местах красен линтер, и вместе с двумя потерянными отказами
закрытия соединения он держит гейт проекта красным целиком.

## What Changes

- Признак «работы нет» и признак «подходящей задачи не нашлось» перестают
  зависеть от точной формы значения ошибки: они узнаются по смыслу и переживают
  любые пояснения, добавленные по дороге.
- Отказ при закрытии соединения с распознавателем перестаёт теряться: он либо
  доходит до вызывающего, либо попадает в журнал владельца.
- Поведение снаружи не меняется: пользователь, внешняя программа и набор
  состояний задачи остаются прежними.
- Гейт проекта становится зелёным целиком — снимается объявленный долг из
  четырёх замечаний линтера.

## Capabilities

### New Capabilities

- `pipeline`: конвейер расшифровки — как задача переходит между состояниями, что
  делает воркер, когда работы нет, и что считается отказом шага. Имя предвосхищено
  маркерами долга в `docs/architecture.md`; этим изменением заводится **только**
  требование о пустом прогоне, остальное поведение конвейера дописывает задача,
  которая его тронет.

### Modified Capabilities

Нет. Требования `intake` изменение не трогает.

## Impact

- `internal/contract` — форма признаков «задачи нет» и «задача не найдена»;
- `internal/controller/worker` — проверка пустого прогона, журнал и счётчик
  работы; у пакета сегодня нет ни одного теста, изменение заводит первый;
- `internal/service` — перевод «задача не найдена» в «работы нет»;
- `internal/adapter/repo/sqlite` — рождение признака «задача не найдена»;
- `internal/adapter/recognizer/yandex` и `main.go` — отказ закрытия соединения;
- гейт проекта и запись долга в `docs/conventions/errors.md` и `CLAUDE.md`.
