- порядок беклога и роадмапа назначен слоями: проверки, которым можно верить → долги входа → владелец записи и контракт API → конвейер под тестами → приложение и возможности поверх; у каждого движения записана причина; - заведены восемь задач под пункты «Завершения», которых не закрывала ни одна запись, — цель any-audio-source была без задач вовсе; - у четырёх задач сняты критерии, требовавшие того, что делает задача ниже по очереди; исправлены ссылки на несуществующий repo/sqlite и на отменённую разведку об очереди.
45 lines
3.9 KiB
Markdown
45 lines
3.9 KiB
Markdown
# 🧹 Разобрать мелочи слоя хранилища
|
||
|
||
- **Тип:** chore
|
||
- **Категория:** Очередь — Мелочи слоя хранилища разбираются, пока слой в руках.
|
||
- **Зачем:** Три мелочи ниже потолка триажа: цикл воркера пишет потерю захвата уровнем ERROR и считает её отказом, тип ошибки заведён там, где конвенция просит sentinel, а FileName несёт два разных смысла.
|
||
|
||
Все три пришли ревью задачи `pocketbase-storage` 2026-08-12 и остались ниже
|
||
потолка отчёта — то есть реальны, но не блокировали. Собраны одной задачей,
|
||
потому что живут в одном пакете и правятся одним заходом.
|
||
|
||
1. **Потеря захвата — не отказ шага.** Значение «задачу за время работы забрал
|
||
другой» доезжает до цикла воркера, который пишет его уровнем `ERROR` и
|
||
увеличивает счётчик отказов. `docs/conventions/logging.md` относит «задача
|
||
досталась повторно» к `WARN`, а метрика отказов после этого считает не отказы.
|
||
2. **Тип ошибки против sentinel.** `docs/conventions/errors.md` просит sentinel
|
||
там, где данных у ошибки не читает никто; у значения о потерянном захвате
|
||
вызывающий читает только сам факт.
|
||
3. **Одно поле в двух смыслах.** У местной копии `entity.File.FileName` — имя в
|
||
хранилище и последняя часть ссылки на скачивание, у внешней — ключ объекта.
|
||
Различает их только соседнее поле, а совпадают они сегодня дословно: на этом
|
||
совпадении держится верность строки `docs/architecture.md` про ключ объекта.
|
||
|
||
## Затрагивает
|
||
|
||
- `internal/contract/error.go` — значение о потерянном захвате;
|
||
- цикл воркера `internal/controller/worker` — уровень записи и счётчик отказов;
|
||
- `internal/entity/file.go` и его потребители в `internal/service`;
|
||
- строка про ключ объекта в `docs/architecture.md`, «Внешние границы и форматы».
|
||
|
||
## Критерии приёмки
|
||
|
||
- Потеря захвата не считается отказом и не пишется на уровне владельца сервиса.
|
||
Оракул — тест воркера: после прогона с потерянным захватом счётчик отказов не
|
||
вырос, а строка в журнале идёт уровнем `WARN`.
|
||
- Форма значения об отказе совпадает с конвенцией. Оракул — `golangci-lint run`
|
||
плюс чтение `docs/conventions/errors.md` рядом с кодом.
|
||
- Два смысла имени файла разведены либо названы в документе. Оракул — `grep` по
|
||
потребителям поля: каждый читает его в одном смысле, а `docs/architecture.md`
|
||
говорит про ключ объекта то же, что делает код.
|
||
|
||
## Рамки
|
||
|
||
Раскладку файлов на диске и имена коллекций не трогаем: формат хранения объявлен
|
||
необратимым, а шаг схемы, уехавший на сервер, не переписывается.
|