Skip to content

feat: детект конфликтов вложений в merge/compare (фаза 2+3)#52

Merged
YuriyEnshin merged 1 commit into
masterfrom
feat/attachment-conflict-detection
Jun 24, 2026
Merged

feat: детект конфликтов вложений в merge/compare (фаза 2+3)#52
YuriyEnshin merged 1 commit into
masterfrom
feat/attachment-conflict-detection

Conversation

@YuriyEnshin

Copy link
Copy Markdown
Owner

Завершает план детекта конфликтов вложений (R2 = фазы 2+3). Использует базовую линию из R1 (v2.15.0).

Суть

Новый AttachmentChangeAnalyzer определяет сторону изменения вложения без скачивания: серверная сторона — по version.number вложения, локальная — по хэшу байт против базовой линии в маркере. Зеркало ChangeSourceAnalyzer для контента.

upload merge download merge force (update)
Изменено локально залить пропустить + репорт
Изменено на сервере пропустить + репорт скачать перезаписать + warn
Конфликт (обе стороны) пропустить + репорт пропустить + репорт перезаписать + warn

compare теперь показывает origin каждого вложения (изменено локально / на сервере / конфликт), по-прежнему без скачиваний; без базовой линии — прежнее сравнение по размеру.

Закрывает обе дыры из анализа: download merge больше не затирает локально изменённое вложение (Scenario A), upload merge — серверное (Scenario B).

Тонкость реализации

Базовая линия вложения, пропущенного при merge (Server/Conflict), сохраняется как есть, а не пересчитывается из текущего состояния сервера — иначе следующий синк счёл бы расхождение разрешённым (отравление детекта).

Тесты

+10: AttachmentChangeAnalyzer (все комбинации + Unknown-фолбэки); download merge не затирает локальное вложение; upload merge не затирает серверное; compare origin local/server/conflict. Весь набор: 392, 0 сбоев.

Релиз — minor v2.16.0.

Завершает план: вложения получают такой же детект источника, как контент.
AttachmentChangeAnalyzer определяет сторону изменения по версии сервера и
хэшу байт локально (без скачивания):
- upload merge: локальное изменение -> залить; серверное -> пропустить+репорт;
  конфликт -> пропустить+репорт.
- download merge: серверное -> скачать; локальное -> пропустить+репорт;
  конфликт -> пропустить+репорт.
- force (upload/download update): перезаписать + warning.
- compare: origin каждого вложения (локально/сервер/конфликт), без скачиваний.

Базлайн пропущенного при merge вложения сохраняется как есть (не
пересчитывается), иначе следующий синк счёл бы расхождение разрешённым.

Закрывает обе дыры из анализа: download merge больше не затирает локально
изменённое вложение, upload merge - серверное.

Тесты: +10 (анализатор: все комбинации; Scenario A/B no-clobber; compare
origin local/server/conflict).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@YuriyEnshin
YuriyEnshin merged commit 18f8bb6 into master Jun 24, 2026
1 check passed
@YuriyEnshin
YuriyEnshin deleted the feat/attachment-conflict-detection branch June 24, 2026 10:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant