diff --git a/Отчёты об изменениях/2026-10-21-изменения-без-спецификаций.md b/Отчёты об изменениях/2026-10-21-изменения-без-спецификаций.md index d667c45..f25ef8e 100644 --- a/Отчёты об изменениях/2026-10-21-изменения-без-спецификаций.md +++ b/Отчёты об изменениях/2026-10-21-изменения-без-спецификаций.md @@ -125,9 +125,35 @@ openspec validate --specs → 23 passed, 0 failed openspec validate fix-copy-edit-variant-sharing --type change → valid ``` -## 8. Что дальше +## 8. Реализация `fix-copy-edit-variant-sharing` -- Реализация правки копирования — из `/opsx-apply` для изменённого - `fix-copy-edit-variant-sharing`. -- После реализации и архивации изменений дельта `media-objects` будет перенесена в +Изменение реализовано полностью (9/9 задач): + +| Что | Где | +| --- | --- | +| Общий список edit-ролей `EditRoles()` и предикат `IsEditRole()` | `backend/internal/photos/edit_render.go` | +| `Clone` не переносит edit-привязки (Postgres: `role <> ALL($3::text[])`) | `backend/internal/photos/store.go` | +| То же для SQLite (`role NOT IN (...)`) | `backend/internal/photos/sqlite_store.go` | +| Сброс правок использует общий список ролей | `backend/internal/photos/edit_service.go` | +| Разовая чистка копий, созданных до фикса | `backend/migrations/000016_*.sql`, `backend/migrations/sqlite/000008_*.sql` | +| Контрактная проверка копирования (оба хранилища) | `backend/internal/repo/contract/contract.go`, кейс `Clone` | +| Сервисные тесты: копия и миграция | `backend/internal/photos/copy_test.go`, `backend/internal/e2e/copy_edit_test.go` | + +Проверки: + +- `make test` (с Postgres) — весь бэкенд зелёный; +- контрактный кейс `Clone` проходит на SQLite и Postgres; без фикса он падает + («clone shares the edited version»); +- e2e на SQLite: копия показывает исходник, `edit_params` пусты, миграция убирает + «чужие» привязки, не трогая привязки владельца; +- ручная проверка через HTTP и браузер: в просмотре копии грузится `thumb.webp` + (не `edit_preview`), все ползунки панели «Редактирование» в нуле. + +## 9. Что дальше + +- Ревью и архивация изменения `/opsx-archive` — дельта `media-objects` переедет в основную спеку. +- Изменение требует Postgres для полного прогона: в этом окружении поднимался + временный контейнер `postgres:16-alpine` на порту 55432 + (`TEST_DATABASE_URL='postgres://postgres:postgres@127.0.0.1:55432/galo?sslmode=disable'`). +