chore(openspec): предложить fix-copy-edit-variant-sharing

Копирование фото переносит и отредактированную версию, хотя правка
принадлежит фото, чьи правки её породили. Изменение описывает фильтр
edit-ролей в Clone, разовую чистку копий миграцией и дельту требования
«Совместные объекты».
This commit is contained in:
iu
2026-10-21 20:31:39 +03:00
parent 748143c9d7
commit b075f4c3a4
5 changed files with 232 additions and 0 deletions
@@ -0,0 +1,46 @@
# Proposal
## Why
Отредактированная версия фото задумана принадлежащей только тому фото, чьи правки её
породили: воркер создаёт edit-объекты с владельцем `[]string{photoID}` и комментирует
это прямо. Но копирование фото (`Clone`) переносит **все** привязки `photo_objects`,
включая роли `edit`, `edit_thumb`, `edit_medium`, `edit_preview`. Копия фото, сделанная
после рендера правок, поэтому показывает отредактированную картинку, но не наследует
`edit_params`: в панели правок у копии параметров нет, и первая же новая правка
перезаписывает исходную обработку с нуля. Поведение расходится с замыслом и с
описанием в спеке.
## What Changes
- Копирование фото перестаёт переносить отредактированную версию: в копию
попадают только обычные роли (`original`, `thumb`, `medium`, `preview`, `playback`).
- Копия фото с правками показывается в исходном виде, параметры правок копии
остаются пустыми — как и сейчас.
- Обычные варианты по-прежнему разделяются между копиями одного оригинала: правка
принадлежит фото, а не объекту.
- Спека `media-objects` приводится к этому правилу: уточняется, кому принадлежит
отредактированная версия и что происходит при копировании.
## Capabilities
### New Capabilities
Нет.
### Modified Capabilities
- `media-objects`: копирование фото не переносит отредактированную версию на копию;
отредактированная версия остаётся привязанной только к фото, чьи правки её создали.
## Impact
- `backend/internal/photos/store.go` — `Store.Clone` (Postgres): при копировании
`photo_objects` исключаются роли `edit*`.
- `backend/internal/photos/sqlite_store.go` — `SQLiteStore.Clone` (SQLite): то же
поведение.
- `backend/internal/photos/edit_render.go` — константы ролей `edit*` используются как
список исключений (без дублирования строк в двух хранилищах).
- `backend/internal/photos/copy_test.go` — тест на копию фото с отрендеренной
отредактированной версией.
- Схема БД, HTTP API и клиенты не меняются; миграций нет.