<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Core API on Rekeeply Spec</title><link>https://rekeeply.github.io/spec/ru/core-api/</link><description>Recent content in Core API on Rekeeply Spec</description><generator>Hugo</generator><language>ru</language><atom:link href="https://rekeeply.github.io/spec/ru/core-api/index.xml" rel="self" type="application/rss+xml"/><item><title>Модель исполнения</title><link>https://rekeeply.github.io/spec/ru/core-api/execution-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rekeeply.github.io/spec/ru/core-api/execution-model/</guid><description>&lt;h1 id="модель-исполнения"&gt;Модель исполнения&lt;a class="anchor" href="#%d0%bc%d0%be%d0%b4%d0%b5%d0%bb%d1%8c-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d0%bd%d0%b5%d0%bd%d0%b8%d1%8f"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="режимы-исполнения"&gt;Режимы исполнения&lt;a class="anchor" href="#%d1%80%d0%b5%d0%b6%d0%b8%d0%bc%d1%8b-%d0%b8%d1%81%d0%bf%d0%be%d0%bb%d0%bd%d0%b5%d0%bd%d0%b8%d1%8f"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;embedded&lt;/code&gt; (по умолчанию): core выполняется в одном процессе с клиентским приложением для минимальной задержки.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;service&lt;/code&gt;: core выполняется как локальный отдельный процесс и доступен клиентам через локальный IPC-канал.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;remote&lt;/code&gt;: клиент подключается к удаленному backend core по защищенному сетевому каналу.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="общие-правила"&gt;Общие правила&lt;a class="anchor" href="#%d0%be%d0%b1%d1%89%d0%b8%d0%b5-%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d0%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;одна и та же доменная логика core;&lt;/li&gt;
&lt;li&gt;обязательная аутентификация;&lt;/li&gt;
&lt;li&gt;одна активная сессия привязана к одному аккаунту;&lt;/li&gt;
&lt;li&gt;операции в контексте библиотеки работают только с одной активной базой;&lt;/li&gt;
&lt;li&gt;клиент обращается к core-контракту, а не к файлу БД напрямую.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="жизненный-цикл-сессии"&gt;Жизненный цикл сессии&lt;a class="anchor" href="#%d0%b6%d0%b8%d0%b7%d0%bd%d0%b5%d0%bd%d0%bd%d1%8b%d0%b9-%d1%86%d0%b8%d0%ba%d0%bb-%d1%81%d0%b5%d1%81%d1%81%d0%b8%d0%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;init&lt;/code&gt;: первичная инициализация локального vault и создание первой базы;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;unlock&lt;/code&gt;: аутентификация пользователя и открытие рабочей сессии;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;active&lt;/code&gt;: выполнение команд в контексте активной сессии (library-scoped или account-scoped);&lt;/li&gt;
&lt;li&gt;&lt;code&gt;switch-library&lt;/code&gt;: явная смена активной базы внутри сессии;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;auto-lock&lt;/code&gt;: автоматическая блокировка по таймауту неактивности;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;manual lock/logout&lt;/code&gt;: ручная блокировка или завершение сессии.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="модель-синхронизации-верхний-уровень"&gt;Модель синхронизации (верхний уровень)&lt;a class="anchor" href="#%d0%bc%d0%be%d0%b4%d0%b5%d0%bb%d1%8c-%d1%81%d0%b8%d0%bd%d1%85%d1%80%d0%be%d0%bd%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d0%b8-%d0%b2%d0%b5%d1%80%d1%85%d0%bd%d0%b8%d0%b9-%d1%83%d1%80%d0%be%d0%b2%d0%b5%d0%bd%d1%8c"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;локальная база является источником пользовательской работы по умолчанию;&lt;/li&gt;
&lt;li&gt;синхронизация выполняется асинхронно и не блокирует пользовательские операции;&lt;/li&gt;
&lt;li&gt;синхронизация поддерживает как данные уровня библиотеки, так и данные уровня аккаунта;&lt;/li&gt;
&lt;li&gt;при оффлайне core продолжает работать, синхронизация откладывается;&lt;/li&gt;
&lt;li&gt;конфликты разрешаются детерминированной политикой (уточняется отдельным разделом);&lt;/li&gt;
&lt;li&gt;передача данных для sync выполняется только по защищенному каналу.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Граница аутентификации</title><link>https://rekeeply.github.io/spec/ru/core-api/authentication-boundary/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rekeeply.github.io/spec/ru/core-api/authentication-boundary/</guid><description>&lt;h1 id="граница-аутентификации"&gt;Граница аутентификации&lt;a class="anchor" href="#%d0%b3%d1%80%d0%b0%d0%bd%d0%b8%d1%86%d0%b0-%d0%b0%d1%83%d1%82%d0%b5%d0%bd%d1%82%d0%b8%d1%84%d0%b8%d0%ba%d0%b0%d1%86%d0%b8%d0%b8"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;правила аутентификации определяет core;&lt;/li&gt;
&lt;li&gt;проверку учетных данных и выпуск сессии выполняет core;&lt;/li&gt;
&lt;li&gt;клиент только передает аутентификационные данные в core-контракт и хранит клиентские артефакты сессии;&lt;/li&gt;
&lt;li&gt;доступ к данным без активной валидной сессии запрещен.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Модель аккаунта</title><link>https://rekeeply.github.io/spec/ru/core-api/account-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rekeeply.github.io/spec/ru/core-api/account-model/</guid><description>&lt;h1 id="модель-аккаунта"&gt;Модель аккаунта&lt;a class="anchor" href="#%d0%bc%d0%be%d0%b4%d0%b5%d0%bb%d1%8c-%d0%b0%d0%ba%d0%ba%d0%b0%d1%83%d0%bd%d1%82%d0%b0"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="контракт"&gt;Контракт&lt;a class="anchor" href="#%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%b0%d0%ba%d1%82"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Реализация core ДОЛЖНА включать &lt;code&gt;Account&lt;/code&gt; как доменную сущность первого класса.&lt;/li&gt;
&lt;li&gt;Один аккаунт ДОЛЖЕН владеть нулем или более библиотек; каждая библиотека ДОЛЖНА принадлежать ровно одному аккаунту.&lt;/li&gt;
&lt;li&gt;Одна активная сессия ДОЛЖНА быть привязана ровно к одному аккаунту.&lt;/li&gt;
&lt;li&gt;Операции в контексте библиотеки в одной активной сессии ДОЛЖНЫ работать ровно с одной активной библиотекой.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="атрибуты-аккаунта"&gt;Атрибуты аккаунта&lt;a class="anchor" href="#%d0%b0%d1%82%d1%80%d0%b8%d0%b1%d1%83%d1%82%d1%8b-%d0%b0%d0%ba%d0%ba%d0%b0%d1%83%d0%bd%d1%82%d0%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt; ДОЛЖЕН существовать и ДОЛЖЕН быть неизменяемым.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;status&lt;/code&gt; ДОЛЖЕН существовать и задавать границу блокировки (&lt;code&gt;locked&lt;/code&gt;/&lt;code&gt;unlocked&lt;/code&gt; или эквивалент).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;security_policy_ref&lt;/code&gt; ДОЛЖЕН существовать и НЕ ДОЛЖЕН содержать секреты в открытом виде.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;default_library_id&lt;/code&gt; МОЖЕТ присутствовать; если задан, он ДОЛЖЕН ссылаться на библиотеку того же аккаунта.&lt;/li&gt;
&lt;li&gt;Дополнительные метаданные МОГУТ присутствовать и являются implementation-defined.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="жизненный-цикл"&gt;Жизненный цикл&lt;a class="anchor" href="#%d0%b6%d0%b8%d0%b7%d0%bd%d0%b5%d0%bd%d0%bd%d1%8b%d0%b9-%d1%86%d0%b8%d0%ba%d0%bb"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;init&lt;/code&gt; ДОЛЖЕН создавать ровно один локальный аккаунт в новом vault.&lt;/li&gt;
&lt;li&gt;Повторный &lt;code&gt;init&lt;/code&gt; для инициализированного vault ДОЛЖЕН отклоняться, если не запущен явный reset/force flow.&lt;/li&gt;
&lt;li&gt;Runtime-состояния ДОЛЖНЫ быть эквивалентны &lt;code&gt;uninitialized -&amp;gt; locked -&amp;gt; unlocked -&amp;gt; locked&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="правила-сессии-и-доступа"&gt;Правила сессии и доступа&lt;a class="anchor" href="#%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d0%b0-%d1%81%d0%b5%d1%81%d1%81%d0%b8%d0%b8-%d0%b8-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;После &lt;code&gt;unlock&lt;/code&gt; сессия ДОЛЖНА быть привязана к одному &lt;code&gt;account_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Операции уровня Raw МОГУТ выполняться без выбора активной библиотеки.&lt;/li&gt;
&lt;li&gt;Cross-account операции в одной активной сессии ДОЛЖНЫ отклоняться.&lt;/li&gt;
&lt;li&gt;Операции записи в доменные сущности ДОЛЖНЫ отклоняться, пока сессия заблокирована.&lt;/li&gt;
&lt;li&gt;Операции export/import ДОЛЖНЫ выполняться в контексте активного аккаунта.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="что-не-входит-в-модель-аккаунта"&gt;Что не входит в модель аккаунта&lt;a class="anchor" href="#%d1%87%d1%82%d0%be-%d0%bd%d0%b5-%d0%b2%d1%85%d0%be%d0%b4%d0%b8%d1%82-%d0%b2-%d0%bc%d0%be%d0%b4%d0%b5%d0%bb%d1%8c-%d0%b0%d0%ba%d0%ba%d0%b0%d1%83%d0%bd%d1%82%d0%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Нет требований по email/username/avatar.&lt;/li&gt;
&lt;li&gt;Нет требований по OAuth или social identity.&lt;/li&gt;
&lt;li&gt;Нет client/device UI-настроек в core-схеме аккаунта.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Формат переноса библиотеки</title><link>https://rekeeply.github.io/spec/ru/core-api/library-transfer-format/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rekeeply.github.io/spec/ru/core-api/library-transfer-format/</guid><description>&lt;h1 id="формат-переноса-библиотеки"&gt;Формат переноса библиотеки&lt;a class="anchor" href="#%d1%84%d0%be%d1%80%d0%bc%d0%b0%d1%82-%d0%bf%d0%b5%d1%80%d0%b5%d0%bd%d0%be%d1%81%d0%b0-%d0%b1%d0%b8%d0%b1%d0%bb%d0%b8%d0%be%d1%82%d0%b5%d0%ba%d0%b8"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="baseline"&gt;Baseline&lt;a class="anchor" href="#baseline"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Экспорт/импорт библиотеки ДОЛЖЕН использовать расширение &lt;code&gt;*.rkl&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Контейнер &lt;code&gt;*.rkl&lt;/code&gt; ДОЛЖЕН использовать &lt;code&gt;tar.zst&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Текстовые датасеты внутри &lt;code&gt;*.rkl&lt;/code&gt; ДОЛЖНЫ использовать кодировку UTF-8.&lt;/li&gt;
&lt;li&gt;Базовый scope экспорта библиотеки включает только данные уровня библиотеки.&lt;/li&gt;
&lt;li&gt;Данные &lt;code&gt;Raw&lt;/code&gt; исключаются из baseline scope экспорта/импорта библиотеки.&lt;/li&gt;
&lt;li&gt;Пакет переноса ДОЛЖЕН включать manifest-метаданные, версию формата и данные целостности.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="baseline-структуры-пакета"&gt;Baseline структуры пакета&lt;a class="anchor" href="#baseline-%d1%81%d1%82%d1%80%d1%83%d0%ba%d1%82%d1%83%d1%80%d1%8b-%d0%bf%d0%b0%d0%ba%d0%b5%d1%82%d0%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;manifest.json&lt;/code&gt; (required)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;library.json&lt;/code&gt; (required)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;taxonomy.json&lt;/code&gt; (required)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content.ndjson&lt;/code&gt; (required)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tags.json&lt;/code&gt; (required)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tag_links.ndjson&lt;/code&gt; (required)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;attachments.ndjson&lt;/code&gt; (required)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;progress.ndjson&lt;/code&gt; (optional)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;notes.ndjson&lt;/code&gt; (optional)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="baseline-manifest"&gt;Baseline manifest&lt;a class="anchor" href="#baseline-manifest"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;manifest.json&lt;/code&gt; ДОЛЖЕН включать: &lt;code&gt;format&lt;/code&gt;, &lt;code&gt;version&lt;/code&gt;, &lt;code&gt;encoding&lt;/code&gt;, &lt;code&gt;container&lt;/code&gt;, &lt;code&gt;exported_at&lt;/code&gt;, &lt;code&gt;library&lt;/code&gt;, &lt;code&gt;datasets&lt;/code&gt;, &lt;code&gt;integrity&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;format&lt;/code&gt; ДОЛЖЕН быть &lt;code&gt;rkl&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;encoding&lt;/code&gt; ДОЛЖЕН быть &lt;code&gt;utf-8&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;container&lt;/code&gt; ДОЛЖЕН быть &lt;code&gt;tar.zst&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;library&lt;/code&gt; ДОЛЖЕН включать &lt;code&gt;id&lt;/code&gt; и &lt;code&gt;name&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;datasets&lt;/code&gt; ДОЛЖЕН включать путь и checksum для каждого включенного датасета.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;integrity&lt;/code&gt; ДОЛЖЕН включать алгоритм checksum и checksum manifest.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="baseline-датасетов"&gt;Baseline датасетов&lt;a class="anchor" href="#baseline-%d0%b4%d0%b0%d1%82%d0%b0%d1%81%d0%b5%d1%82%d0%be%d0%b2"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;library.json&lt;/code&gt; ДОЛЖЕН включать &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;icon&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;taxonomy.json&lt;/code&gt; ДОЛЖЕН включать таксономию типов/подтипов и определения схем полей.&lt;/li&gt;
&lt;li&gt;Строки &lt;code&gt;content.ndjson&lt;/code&gt; ДОЛЖНЫ включать &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;type&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;created_at&lt;/code&gt;, &lt;code&gt;updated_at&lt;/code&gt;, &lt;code&gt;status_changed_at&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tags.json&lt;/code&gt; ДОЛЖЕН включать метаданные тегов.&lt;/li&gt;
&lt;li&gt;Строки &lt;code&gt;tag_links.ndjson&lt;/code&gt; ДОЛЖНЫ включать &lt;code&gt;content_id&lt;/code&gt;, &lt;code&gt;tag_id&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="правило-переноса-таксономии"&gt;Правило переноса таксономии&lt;a class="anchor" href="#%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d0%be-%d0%bf%d0%b5%d1%80%d0%b5%d0%bd%d0%be%d1%81%d0%b0-%d1%82%d0%b0%d0%ba%d1%81%d0%be%d0%bd%d0%be%d0%bc%d0%b8%d0%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Таксономия ДОЛЖНА переноситься вместе с библиотекой при export/import.&lt;/li&gt;
&lt;li&gt;В scope таксономии входят: типы контента, подтипы контента, схемы полей, теги и связи тег-контент.&lt;/li&gt;
&lt;li&gt;Импорт ДОЛЖЕН восстанавливать таксономию до или одновременно с контентными датасетами, чтобы ссылки контента оставались валидными.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="примечание-по-датасетам"&gt;Примечание по датасетам&lt;a class="anchor" href="#%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%87%d0%b0%d0%bd%d0%b8%d0%b5-%d0%bf%d0%be-%d0%b4%d0%b0%d1%82%d0%b0%d1%81%d0%b5%d1%82%d0%b0%d0%bc"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Формат переноса библиотеки ДОЛЖЕН поддерживать датасеты вложений (метаданные вложений и связи с контентом).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="baseline-датасета-вложений"&gt;Baseline датасета вложений&lt;a class="anchor" href="#baseline-%d0%b4%d0%b0%d1%82%d0%b0%d1%81%d0%b5%d1%82%d0%b0-%d0%b2%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b9"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Имя файла датасета метаданных вложений: &lt;code&gt;attachments.ndjson&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Каждая строка вложения ДОЛЖНА включать: &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;content_id&lt;/code&gt;, &lt;code&gt;uri&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Опциональные поля строки вложения: &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;mime&lt;/code&gt;, &lt;code&gt;size&lt;/code&gt;, &lt;code&gt;created_at&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content_id&lt;/code&gt; в &lt;code&gt;attachments.ndjson&lt;/code&gt; ДОЛЖЕН ссылаться на существующую запись контента.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="правила-валидации-и-безопасности"&gt;Правила валидации и безопасности&lt;a class="anchor" href="#%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d0%b0-%d0%b2%d0%b0%d0%bb%d0%b8%d0%b4%d0%b0%d1%86%d0%b8%d0%b8-%d0%b8-%d0%b1%d0%b5%d0%b7%d0%be%d0%bf%d0%b0%d1%81%d0%bd%d0%be%d1%81%d1%82%d0%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Импорт ДОЛЖЕН отклонять пакет при отсутствии любого required датасета.&lt;/li&gt;
&lt;li&gt;Импорт ДОЛЖЕН отклонять пакет при ошибке checksum любого датасета.&lt;/li&gt;
&lt;li&gt;Импорт ДОЛЖЕН отклонять небезопасные пути в архиве (&lt;code&gt;../&lt;/code&gt;, абсолютные пути и эквиваленты path traversal).&lt;/li&gt;
&lt;li&gt;Импорт ДОЛЖЕН валидировать схему и ссылки до финального commit.&lt;/li&gt;
&lt;li&gt;Импорт ДОЛЖЕН быть атомарным: при критической ошибке валидации частичное финальное состояние не фиксируется.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="baseline-порядка-импорта"&gt;Baseline порядка импорта&lt;a class="anchor" href="#baseline-%d0%bf%d0%be%d1%80%d1%8f%d0%b4%d0%ba%d0%b0-%d0%b8%d0%bc%d0%bf%d0%be%d1%80%d1%82%d0%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Сначала выполняется проверка контейнера пакета и целостности &lt;code&gt;manifest&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Затем восстанавливаются метаданные библиотеки (&lt;code&gt;library.json&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Таксономия восстанавливается до контентных датасетов.&lt;/li&gt;
&lt;li&gt;Затем восстанавливаются контентные датасеты.&lt;/li&gt;
&lt;li&gt;Затем восстанавливаются теги и связи тег-контент.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;attachments.ndjson&lt;/code&gt; восстанавливается после контентных датасетов.&lt;/li&gt;
&lt;li&gt;После этого выполняется финальная проверка ссылочной целостности и атомарный commit импорта.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Модель настроек</title><link>https://rekeeply.github.io/spec/ru/core-api/settings-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rekeeply.github.io/spec/ru/core-api/settings-model/</guid><description>&lt;h1 id="модель-настроек"&gt;Модель настроек&lt;a class="anchor" href="#%d0%bc%d0%be%d0%b4%d0%b5%d0%bb%d1%8c-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b5%d0%ba"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="группы-scope"&gt;Группы scope&lt;a class="anchor" href="#%d0%b3%d1%80%d1%83%d0%bf%d0%bf%d1%8b-scope"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;account-scoped&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;library-scoped&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="настройки-уровня-библиотеки"&gt;Настройки уровня библиотеки&lt;a class="anchor" href="#%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b8-%d1%83%d1%80%d0%be%d0%b2%d0%bd%d1%8f-%d0%b1%d0%b8%d0%b1%d0%bb%d0%b8%d0%be%d1%82%d0%b5%d0%ba%d0%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;default_status_on_create&lt;/code&gt; (&lt;code&gt;enum&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;default_priority_on_create&lt;/code&gt; (&lt;code&gt;enum|null&lt;/code&gt;, default &lt;code&gt;null&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;allow_parent_links&lt;/code&gt; (&lt;code&gt;boolean&lt;/code&gt;, default &lt;code&gt;true&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;archived_visible_by_default&lt;/code&gt; (&lt;code&gt;boolean&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="настройки-уровня-аккаунта"&gt;Настройки уровня аккаунта&lt;a class="anchor" href="#%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b8-%d1%83%d1%80%d0%be%d0%b2%d0%bd%d1%8f-%d0%b0%d0%ba%d0%ba%d0%b0%d1%83%d0%bd%d1%82%d0%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;default_library_id&lt;/code&gt; (optional)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;last_active_library_restore&lt;/code&gt; (&lt;code&gt;boolean&lt;/code&gt;, default &lt;code&gt;true&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;auto_lock_timeout_minutes&lt;/code&gt; (&lt;code&gt;integer&lt;/code&gt;, default &lt;code&gt;15&lt;/code&gt;, &lt;code&gt;0&lt;/code&gt; означает отключение)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;require_unlock_on_start&lt;/code&gt; (&lt;code&gt;boolean&lt;/code&gt;, default &lt;code&gt;true&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sync_enabled&lt;/code&gt; (&lt;code&gt;boolean&lt;/code&gt;, default &lt;code&gt;false&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sync_mode&lt;/code&gt; (&lt;code&gt;enum: manual|auto&lt;/code&gt;, default &lt;code&gt;manual&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sync_interval_minutes&lt;/code&gt; (&lt;code&gt;integer&lt;/code&gt;, default &lt;code&gt;15&lt;/code&gt;, используется при &lt;code&gt;sync_mode=auto&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;export_compression_enabled&lt;/code&gt; (&lt;code&gt;boolean&lt;/code&gt;, default &lt;code&gt;true&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;backup_enabled&lt;/code&gt; (&lt;code&gt;boolean&lt;/code&gt;, default &lt;code&gt;false&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;backup_interval_hours&lt;/code&gt; (&lt;code&gt;integer&lt;/code&gt;, default &lt;code&gt;24&lt;/code&gt;, используется при включенном backup)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;backup_retention_count&lt;/code&gt; (&lt;code&gt;integer&lt;/code&gt;, default &lt;code&gt;10&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;timezone&lt;/code&gt; (&lt;code&gt;text&lt;/code&gt;, default системная таймзона)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;locale&lt;/code&gt; (&lt;code&gt;text&lt;/code&gt;, default locale аккаунта или fallback клиента/системы)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="правила-fallback"&gt;Правила fallback&lt;a class="anchor" href="#%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d0%b0-fallback"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Если &lt;code&gt;default_library_id&lt;/code&gt; невалиден или удален, fallback: &lt;code&gt;last_active&lt;/code&gt; при наличии, иначе явный выбор библиотеки.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>