# Proposal ## Why Сборка мусора воркера управляется журналом `objects` и никогда не сканирует хранилище. Поэтому блобы, у которых нет строки в журнале (после сброса БД в обход журнала, исторических миграций или ошибок), накапливаются и не удаляются никогда: воркер их не видит. Нужна ручная сверка «хранилище ∖ журнал». ## What Changes - Добавить в `storage.Backend` перечисление объектов под префиксом (ключ, размер, время изменения); реализовать для S3 (`ListObjectsV2`) и локальной ФС (обход каталога). - Добавить в слой метаданных чтение всех ключей журнала `objects` (Postgres и SQLite). - Добавить maintenance-команду `cmd/reconcile`: по умолчанию — только отчёт (сироты и пропавшие), флаг `--delete` удаляет сироты с учётом минимального возраста (`--min-age`), область ограничена префиксом `objects/`. - Пропавшие ключи (есть в журнале, нет в хранилище) только сообщаются — автоматически не «исправляются». ## Capabilities ### New Capabilities - `storage-reconciliation`: ручная сверка объектного хранилища с журналом метаданных и удаление осиротевших блобов. ### Modified Capabilities ## Impact - `backend/internal/storage` (интерфейс + перечисление для S3 и ФС). - `backend/internal/photos` (`Repository.AllStorageKeys`, реализации pg и sqlite). - Новый `backend/cmd/reconcile`. - `README.md`, `project.md`. - Не меняет API и существующие спеки; дополняет `media-objects` ручной сверкой к журнальной сборке мусора.