Files
iu 98aaa3156a chore(openspec): архивировать add-orphaned-preview-handling и синхронизировать спеки
Новое требование в phone-album-sync о потере/возврате серверной копии у
разгруженного превью, требование в android-client о метке потерянного элемента
и действии удаления с устройства.
2026-10-16 14:13:01 +03:00

4.3 KiB
Raw Permalink Blame History

Tasks

1. Доменное состояние и политика

  • 1.1 Добавить LocalAssetState.ORPHANED в android/.../domain/model/Sync.kt и проверить, что LocalAssetState.from/Room-строка корректно читают значение (unit-тест на round-trip состояния)
  • 1.2 Обработать ORPHANED в GallerySyncPolicy.decide: NONE во всех режимах, без RESTORE; проверить покрытием всех сочетаний mode × state в GallerySyncPolicyTest
  • 1.3 Пропускать ORPHANED в цикле загрузки SyncPlanner.plan наравне с PREVIEW (не заливать превью как оригинал); проверить unit-тестом SyncPlannerTest
  • 1.4 Исключить ORPHANED из RestoreManager.restoreTargets; проверить unit-тестом RestoreManagerTest

2. Детекция и переходы синхронизации

  • 2.1 В SyncCoordinator.reconcile помечать ORPHANED записи индекса, чей serverPhotoId отсутствует в livePhotoIds; проверить unit-тестом SyncCoordinatorTest
  • 2.2 В reconcile снимать пометку ORPHANED, если serverPhotoId снова в livePhotoIds; проверить unit-тестом SyncCoordinatorTest
  • 2.3 Реализовать повторную заливку вернувшегося оригинала: считать ORPHANED, если hash из индекса/hashesOutside снова присутствует на устройстве, и ставить обычную загрузку; проверить unit-тестом планировщика/координатора
  • 2.4 Убедиться, что в режиме C загруженный обратно оригинал снова разгружается обычным проходом; проверить unit-тестом координатора

3. UI: метка и действия

  • 3.1 В DeviceAlbumViewModel отдавать набор orphanedMediaIds, а serverOriginalsByMediaId/transferredMediaIds должны исключать ORPHANED; проверить unit-тестом helper-функции
  • 3.2 Показать перечёркнутое облако (Icons.Filled.CloudOff) для ORPHANED в сетке DeviceAlbumScreen с отдельным testTag; проверить Compose-тестом маркера
  • 3.3 Добавить источник PhotoAttributeSource.Orphaned в PhotoAttributeResolver.resolve; проверить unit-тестом резолвера (приоритет над Server при отсутствии копии)
  • 3.4 Для ORPHANED-шита показать только действие «Удалить с устройства» без серверных атрибутов; проверить Compose-тестом шита
  • 3.5 Реализовать удаление превью с устройства через существующий delete-consent и удаление записи индекса, без запросов к серверу; проверить instrumented-тестом (файл и индекс удалены)

4. Интеграционная проверка

  • 4.1 E2E: разгрузить в режиме C, удалить серверное фото, прогнать reconcile и убедиться, что элемент стал ORPHANED с перечёркнутым облаком; проверить прогоном DeviceSyncE2ETest
  • 4.2 E2E: вернуть оригинал на устройство и убедиться, что элемент заливается заново и снова разгружается в C; проверить прогоном DeviceSyncE2ETest
  • 4.3 Прогнать cd android && ./gradlew test и cd android && ./gradlew :app:assembleDebug; убедиться, что сборка и unit-тесты зелёные

Workflow follow-up

  • Архивировать change после выполнения задач и прохождения ревью по правилам проекта.
  • Проверить итоговый результат после архивации.