8a8f1cfffb
- NotesApiClient: публичный /api/v1 (list exclude=content + If-None-Match, get, create, saveContent с If-Match→412 NoteConflictException, setFavorite/Category/rename, delete) - NotesRepository: сессия→клиент→кэш, offline-first список (304/сеть → кэш) - NotesCache: дисковый ETag-кэш списка (образец CalendarEventsCache) - Note модель + разбор JSON; NoteConflictException (явный выбор, не молчаливая перезапись) - NotesApiClientTest: 7 юнит-тестов через MockWebServer (пишущее — юнитами, не forbion; mail/073) Верифицировано изолированно (worktree на чистом HEAD): compileDebugKotlin + 7/7 tests + detekt OK. Закрывает часть P1 notes.diff.md (слой данных). mail/096/093, план mail/071. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>