a82a63f696
OnelinersClient does GET /api/oneliners with X-API-Key + If-None-Match, classifies 200/304/transient/network. Mirrors doctate-client-core::server_sync::poll_once exactly. JSON parsing lives in domain.OnelinersJson (org.json) so the wire DTOs are first-class in-memory types. SnapshotCache persists the last successful response + its ETag in filesDir/recordings/snapshot_cache.json. SyncWorkerLoop primes the case store from this cache on cold start before the first network call, so the watch never flashes an empty list while the service boots. Worker loop integration: when the pending queue is empty and a poller is wired, runOnce polls instead of just publishing Idle. Success runs mergeServerSnapshot + reconcileWithServerSnapshot, then writes the new snapshot to the cache. Phase 4's poller-null behaviour remains as the test/skeleton path. 13 new tests (OnelinersJsonTest 3, OnelinersClientTest 6, SnapshotCacheTest 4) covering parse round-trip, 200/304/transient/network classification, If-None-Match header presence, corrupted-cache resilience. 71 tests green total.