# Tasks ## 1. Список edit-ролей - [ ] 1.1 В `backend/internal/photos/edit_render.go` собрать общий список ролей (`RoleEdit`, `RoleEditThumb`, `RoleEditMedium`, `RoleEditPreview`) и хелпер проверки роли; проверить, что список используется в обоих хранилищах и не дублируется строковыми литералами ## 2. Копирование без отредактированной версии - [ ] 2.1 В `Store.Clone` (`backend/internal/photos/store.go`) исключить edit-роли из переносимых привязок `photo_objects`; проверить тестом `copy_test.go`: копия получает обычные варианты и не получает edit-объекты - [ ] 2.2 В `SQLiteStore.Clone` (`backend/internal/photos/sqlite_store.go`) сделать то же для SQLite; проверить тем же тестом, прогнанным на SQLite-хранилище ## 3. Разовая чистка существующих копий - [ ] 3.1 Добавить миграцию Postgres `backend/migrations/000016_*.up.sql` и `.down.sql`, удаляющую edit-привязки у фото с пустыми `edit_params`; проверить на тестовой базе, что привязки исходных фото с правками остались, а «чужие» удалены - [ ] 3.2 Добавить миграцию SQLite `backend/migrations/sqlite/000008_*.up.sql` и `.down.sql` с тем же действием; проверить тем же сценарием на SQLite - [ ] 3.3 Убедиться, что удалённые объекты подбираются сборщиком мусора (`ClaimGarbage` не возвращает объекты с привязками); проверить существующим тестом `objects_test.go` ## 4. Интеграционная проверка - [ ] 4.1 Прогнать `cd backend && go test ./internal/photos/ -v`; убедиться, что тесты зелёные - [ ] 4.2 Прогнать `make test`; убедиться, что весь бэкенд зелёный - [ ] 4.3 Проверить вручную: отредактировать фото, скопировать его в другой альбом и убедиться, что копия показывает исходник, а панель правок у копии пустая