учёт: закрыт переезд хранилища, заведён урожай его ревью

- storage-without-pocketbase закрыта как реализованная: приёмка сошлась по всем
  пяти критериям записи и по двенадцати приёмочным свойствам рубрики ревью
  дизайна, работа лежит коммитом c9b7765
- урожай триажа ревью развёрнут в одиннадцать записей с тегом партии
  review-2026-08-23 и расставлен по зависимости, а не в конец списка
- находка про признак живости воркера слита в stalled-pipeline-metric: у неё та
  же причина — вставший конвейер неотличим от простоя
This commit is contained in:
av
2026-08-23 08:41:49 +03:00
parent c9b7765646
commit 75c6f0168a
14 changed files with 540 additions and 50 deletions
@@ -0,0 +1,44 @@
# 🧹 Проверять ответ обработчика на отказ репозитория
- **Тип:** chore
- **Категория:** Очередь — Подставной репозиторий заводится там же, где тесты конвейера: одна сборка теста на два слоя
- **Зачем:** Тесты обработчиков идут по настоящему sqlite без управляемых отказов: класс «база недоступна во время запроса» не проверен нигде.
- **Теги:** review-2026-08-23
Тесты обработчиков ходят по настоящему sqlite во временном каталоге. Управляемых
отказов у него нет, поэтому весь класс «база недоступна во время запроса» не
проверен нигде: что отвечает обработчик, когда репозиторий отказал, известно
только чтением кода.
Проверять надо не отказ базы, а ответ на него: код, тело единой формы и то, что
причина не попала в ответ пользователю. Для этого репозиторию нужна подставная
реализация, отказывающая по требованию.
Гипотеза прохода `review-autotests` (A4) ревью change
`2026-08-23-storage-without-pocketbase`, понижённая триажем до наблюдения:
оракула у неё нет ровно потому, что управляемых отказов не существует. Сам пробел
проверен — `grep` по тестам пакета пуст.
## Затрагивает
- тесты `internal/controller/http` — сборка теста и способ подставить
репозиторий;
- договор ядра с хранилищем `internal/contract` — интерфейсы, по которым
подставляется отказ;
- единая форма ответа об отказе `internal/controller/http/errors.go`.
## Критерии приёмки
- Тест подставляет отказ репозитория. **Оракул:** тест — подставной
репозиторий отдаёт ошибку на названном методе, и обработчик её получает.
- Ответ на отказ идёт единой формой и не несёт причины. **Оракул:** тест на
каждом читающем обработчике — код `500`, тело эталонной формы, текста ошибки
базы в теле нет.
- Отказ виден владельцу сервиса. **Оракул:** тот же тест с перехваченным
журналом — строка уровня `ERROR` с причиной есть.
## Рамки
Настоящую базу из тестов не убираем: подставной репозиторий нужен для отказов, а
не вместо неё. Формы ответов и коды не меняем — задача проверяет то, что уже
объявлено.