# `:sync-core` Референсная реализация ТЗ [`SYNC-SYSTEM.md`](../SYNC-SYSTEM.md) в изоляции от существующего кода `:outbox-api` / `:journal-api` / `:client` / `:server`. Цель — проверить, что спека действительно работает, и выработать API для переиспользования как в in-process (встроенный агент), так и в удалённом (HTTP/WebSocket) сценариях. ## Что здесь | Слой | Где | Что | |---|---|---| | Domain types | `commonMain` | `DomainEvent` (sealed), `LoggedEvent`, `PendingEvent`, `Chat`/`Message`/`ChatState`/`StateSnapshot`, `CompactionState`, `SyncState` | | Интерфейсы | `commonMain` | `EventLog` / `EventLogWriter` / `EventLogReplica`, `StateStore`, `Reducer`, `Assistant`, `SyncTransport` | | In-memory бэкенд | `commonMain` | `InMemoryEventLog` (одновременно `Writer` + `Replica`), `InMemoryPendingQueue`, `InMemoryCompactionState`, `InMemorySyncState`, `DefaultChatReducer` | | SyncEngine | `commonMain` | Алгоритм §5.2 спеки (`sync()` + live-подписка) | | Transport | `commonMain` | `InProcessTransport` — имитация HTTP/WS поверх in-memory writer'а | | Assistant | `commonMain` | `Assistant` интерфейс + `LocalAssistant` (in-process генератор) + `RemoteAssistant` (заглушка под HTTP) | | Tests | `commonTest` | `SyncSpec` (abstract) + спец-тесты под все 7 инвариантов и ключевые сценарии §8 спеки | | ksqlite-бэкенд | `commonMain` | `SqliteEventLog` / `SqliteStateStore` / `SqlitePendingQueue` / `SqliteCompactionState` / `SqliteSyncState` | | ksqlite интеграционные тесты | `jvmTest` | `KsqliteSyncSpecTest` — тот же `SyncSpec`, но поверх in-memory SQLite-коннекшна | ## Границы * Не реализует HTTP/WS/SSE (это отдельный слой поверх `SyncTransport`). * Не реализует LLM (assistant'ы — детерминированные генераторы). * Не реализует streaming-протокол ответа (стриминг дельт — отдельная концепция, в спеке его нет). * Не реализует мультидевайс-race (`origin` помечает события, но спека молчит о том, как разрешать конкурентные правки одного чата с двух устройств; last-write-wins по `seq` зашит в редьюсере). ## Сборка ```bash ./gradlew :sync-core:build # компиляция + все тесты ./gradlew :sync-core:jvmTest # только JVM (включая ksqlite интеграцию) ./gradlew :sync-core:allTests # все цели ``` ## Статус Спека реализована вчерне, инварианты §2 покрыты тестами в `commonTest`. После стабилизации API и ksqlite-слоя возможна миграция существующих `:outbox-api`/`:journal-api`/`:client`/`:server` на эту модель (или нет — тогда `:sync-core` останется референсом и песочницей для новых идей).