# Верстак — синхронизация, backup и активность ## 1. Синхронизация Цель: - рабочая машина и домашняя машина имеют один vault; - обе работают offline; - сервер используется для обмена и восстановления; - при потере локальных файлов можно восстановиться с сервера. ## 2. Sync server `verstak-server` — простой Go HTTP server. Функции: - API key auth; - device registry; - operation log; - blob storage by sha256; - snapshots; - restore manifest; - deleted item retention. Пример server storage: ```text server-data/ db.sqlite blobs/ ab/ cd/ abcdef...blob snapshots/ ``` ## 3. API MVP ```http GET /api/v1/health POST /api/v1/device/register POST /api/v1/sync/push POST /api/v1/sync/pull POST /api/v1/blobs/upload GET /api/v1/blobs/{sha256} GET /api/v1/restore/manifest ``` Auth: ```http Authorization: Bearer ``` ## 4. Push/pull Client push: ```json { "device_id": "device-uuid", "ops": [], "blobs": ["sha256..."] } ``` Server response: ```json { "accepted": true, "missing_blobs": ["sha256..."] } ``` Client pull: ```json { "device_id": "device-uuid", "since_revision": 42 } ``` Response: ```json { "server_revision": 50, "ops": [] } ``` ## 5. Восстановление Сценарий: 1. Установить Верстак. 2. Ввести server URL. 3. Ввести API key/recovery key. 4. Нажать Restore. 5. Скачать manifest. 6. Скачать blobs. 7. Применить ops. 8. Пересобрать SQLite/FTS. 9. Проверить целостность. ## 6. Конфликты Не пытаться магически мержить всё. Если заметка изменилась на двух устройствах: ```text nginx.md nginx.conflict-home-2026-05-30.md ``` Если docx изменился на двух устройствах: ```text dogovor.docx dogovor.conflict-work-2026-05-30.docx ``` UI: ```text Конфликт: nginx.md [Открыть обе версии] [Оставить локальную] [Оставить серверную] [Склеить вручную] ``` ## 7. Sync не равен backup Если удалить файл на одной машине, sync может удалить везде. Поэтому сервер должен иметь: - tombstones; - trash retention; - note versions; - daily snapshots; - integrity check; - manual export. Retention example: ```yaml retention: deleted_items_days: 90 note_versions_days: 180 daily_snapshots_days: 30 ``` ## 8. Activity tracking Верстак не должен быть шпионской программой. Activity tracking должен быть явным и настраиваемым. ### Источники MVP - opened node; - edited note; - added file; - changed file through app; - launched action. ### Источники later - file watcher/scanner; - active window title; - browser URL extension; - sshkeeper integration; - idle detection. ## 9. Как понять, что пользователь работал 3 часа Верстак не “знает точно”. Он предлагает версию. Пример: ```text Похоже, ты работал по делу “ООО Ромашка / Сайт”: 14:05–17:12, примерно 3ч. Основания: - открывалась админка сайта; - изменялся catalog.xlsx; - запускался sshkeeper profile romashka-vps; - создавался screenshot-result.png; - открывалась заметка “Витрина”. [Записать 3ч] [Исправить] [Игнорировать] ``` ## 10. Группировка активности Правило MVP: - события одного дела; - разрыв меньше 20 минут — один интервал; - разрыв больше 20 минут — новый интервал; - итог округлить до 5/10/15 минут; - показать evidence. ## 11. Privacy modes ### Minimal - only inside Verstak; - actions; - manual worklog. ### Work - + file scanner/watcher; - + files opened from Verstak; - + sshkeeper events. ### Full - + active windows; - + browser URLs; - + idle detection. По умолчанию не включать Full. ## 12. Client report Из журнала работ можно собрать отчёт: ```text По сайту ООО “Ромашка” было сделано: - обновлена витрина сайта; - внесены изменения в каталог товаров; - обновлены баннеры; - проверено отображение результата. Ориентировочное время: 3 часа. ``` MVP — шаблонный отчёт без ИИ.