<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Модель библиотеки on Rekeeply Spec</title><link>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/</link><description>Recent content in Модель библиотеки on Rekeeply Spec</description><generator>Hugo</generator><language>ru</language><atom:link href="https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/index.xml" rel="self" type="application/rss+xml"/><item><title>Типизация контента</title><link>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/content-typing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/content-typing/</guid><description>&lt;h1 id="типизация-контента"&gt;Типизация контента&lt;a class="anchor" href="#%d1%82%d0%b8%d0%bf%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f-%d0%ba%d0%be%d0%bd%d1%82%d0%b5%d0%bd%d1%82%d0%b0"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="базовые-правила"&gt;Базовые правила&lt;a class="anchor" href="#%d0%b1%d0%b0%d0%b7%d0%be%d0%b2%d1%8b%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;&lt;code&gt;content_type&lt;/code&gt; является обязательным полем; создание записи без типа НЕ ДОПУСКАЕТСЯ.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content_subtype&lt;/code&gt; является необязательным полем.&lt;/li&gt;
&lt;li&gt;При ручном создании записи выбор начинается с &lt;code&gt;content_type&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;После выбора типа подтип и остальные поля могут быть заполнены позже.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="набор-по-умолчанию-и-рекомендуемый-набор"&gt;Набор по умолчанию и рекомендуемый набор&lt;a class="anchor" href="#%d0%bd%d0%b0%d0%b1%d0%be%d1%80-%d0%bf%d0%be-%d1%83%d0%bc%d0%be%d0%bb%d1%87%d0%b0%d0%bd%d0%b8%d1%8e-%d0%b8-%d1%80%d0%b5%d0%ba%d0%be%d0%bc%d0%b5%d0%bd%d0%b4%d1%83%d0%b5%d0%bc%d1%8b%d0%b9-%d0%bd%d0%b0%d0%b1%d0%be%d1%80"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Следующий набор типов/подтипов доступен в системе по умолчанию и рекомендуется на основе практического личного опыта использования.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="book"&gt;&lt;code&gt;book&lt;/code&gt;&lt;a class="anchor" href="#book"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Назначение: длинные письменные материалы и справочные книги.&lt;/p&gt;
&lt;p&gt;Поля: см. &lt;a href="type-specific-fields/"&gt;Поля по типам&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Поля контента</title><link>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/content-fields/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/content-fields/</guid><description>&lt;h1 id="поля-контента"&gt;Поля контента&lt;a class="anchor" href="#%d0%bf%d0%be%d0%bb%d1%8f-%d0%ba%d0%be%d0%bd%d1%82%d0%b5%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%bb%d0%b0%d1%81%d1%81%d1%8b-%d0%bf%d0%be%d0%bb%d0%b5%d0%b9"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Поля класса &lt;code&gt;system&lt;/code&gt; управляются core и НЕ ДОЛЖНЫ редактироваться пользователем вручную.&lt;/li&gt;
&lt;li&gt;Поля класса &lt;code&gt;user_editable&lt;/code&gt; видимы и редактируемы пользователем.&lt;/li&gt;
&lt;li&gt;Поля класса &lt;code&gt;computed&lt;/code&gt; вычисляются core и ДОЛЖНЫ рассматриваться как read-only.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="базовый-набор-общих-полей"&gt;Базовый набор общих полей&lt;a class="anchor" href="#%d0%b1%d0%b0%d0%b7%d0%be%d0%b2%d1%8b%d0%b9-%d0%bd%d0%b0%d0%b1%d0%be%d1%80-%d0%be%d0%b1%d1%89%d0%b8%d1%85-%d0%bf%d0%be%d0%bb%d0%b5%d0%b9"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="system"&gt;&lt;code&gt;system&lt;/code&gt;&lt;a class="anchor" href="#system"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt; - неизменяемый идентификатор записи.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;library_id&lt;/code&gt; - идентификатор библиотеки-владельца.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;created_at&lt;/code&gt; - момент создания.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;updated_at&lt;/code&gt; - момент последнего изменения.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;status_changed_at&lt;/code&gt; - момент последней смены статуса.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="user_editable"&gt;&lt;code&gt;user_editable&lt;/code&gt;&lt;a class="anchor" href="#user_editable"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;content_type&lt;/code&gt; - обязательный ключ типа.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content_subtype&lt;/code&gt; - опциональный ключ подтипа.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt; - заголовок записи.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;status&lt;/code&gt; - &lt;code&gt;inbox | todo | in_progress | skimmed | done | dropped&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;priority&lt;/code&gt; - &lt;code&gt;low | medium | high&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rating&lt;/code&gt; - опциональная целочисленная оценка в диапазоне &lt;code&gt;1..10&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;recommendation&lt;/code&gt; - опциональный маркер рекомендации: &lt;code&gt;recommended | neutral | not_recommended&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;favorite&lt;/code&gt; - независимый флаг избранного.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;archived&lt;/code&gt; - независимый флаг архивирования.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;parent_content_id&lt;/code&gt; - опциональная родительская связь.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;source_url&lt;/code&gt; - опциональная ссылка на источник.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;summary&lt;/code&gt; - опциональное краткое описание.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="computed"&gt;&lt;code&gt;computed&lt;/code&gt;&lt;a class="anchor" href="#computed"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;search_text&lt;/code&gt; - нормализованный текстовый индекс для быстрого поиска.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;last_activity_at&lt;/code&gt; - вычисляемое время последней активности.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;is_completed&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-%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;/li&gt;
&lt;li&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;code&gt;name&lt;/code&gt; (optional), &lt;code&gt;mime&lt;/code&gt; (optional), &lt;code&gt;size&lt;/code&gt; (optional), &lt;code&gt;created_at&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Baseline файл датасета для export/import вложений: &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"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Клиенты ДОЛЖНЫ запрещать редактирование полей классов &lt;code&gt;system&lt;/code&gt; и &lt;code&gt;computed&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Core ДОЛЖЕН поддерживать консистентность всех &lt;code&gt;computed&lt;/code&gt; полей.&lt;/li&gt;
&lt;li&gt;При создании записи &lt;code&gt;status&lt;/code&gt; РЕКОМЕНДУЕТСЯ автоматически устанавливать в &lt;code&gt;inbox&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;При создании записи &lt;code&gt;priority&lt;/code&gt; РЕКОМЕНДУЕТСЯ оставлять пустым по умолчанию, если значение явно не задано.&lt;/li&gt;
&lt;li&gt;При смене статуса ДОЛЖЕН обновляться &lt;code&gt;status_changed_at&lt;/code&gt;, при этом &lt;code&gt;updated_at&lt;/code&gt; НЕ ДОЛЖЕН обновляться.&lt;/li&gt;
&lt;li&gt;При изменении флага &lt;code&gt;favorite&lt;/code&gt; поле &lt;code&gt;updated_at&lt;/code&gt; НЕ ДОЛЖНО обновляться.&lt;/li&gt;
&lt;li&gt;При изменении флага &lt;code&gt;archived&lt;/code&gt; поле &lt;code&gt;updated_at&lt;/code&gt; НЕ ДОЛЖНО обновляться.&lt;/li&gt;
&lt;li&gt;Если &lt;code&gt;rating&lt;/code&gt; задан, значение ДОЛЖНО находиться в диапазоне &lt;code&gt;1..10&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Пользовательские поля, кроме &lt;code&gt;content_type&lt;/code&gt; и &lt;code&gt;status&lt;/code&gt;, не обязательны в момент создания и могут заполняться позже.&lt;/li&gt;
&lt;li&gt;Type-specific поля не являются обязательными в baseline и становятся обязательными только если пользовательская схема помечает их как required.&lt;/li&gt;
&lt;li&gt;Реализация МОЖЕТ добавлять дополнительные поля любого класса как implementation-defined расширения.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="связанные-разделы"&gt;Связанные разделы&lt;a class="anchor" href="#%d1%81%d0%b2%d1%8f%d0%b7%d0%b0%d0%bd%d0%bd%d1%8b%d0%b5-%d1%80%d0%b0%d0%b7%d0%b4%d0%b5%d0%bb%d1%8b"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="field-types/"&gt;Типы полей&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="type-specific-fields/"&gt;Поля по типам&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Типы полей</title><link>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/field-types/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/field-types/</guid><description>&lt;h1 id="типы-полей"&gt;Типы полей&lt;a class="anchor" href="#%d1%82%d0%b8%d0%bf%d1%8b-%d0%bf%d0%be%d0%bb%d0%b5%d0%b9"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="область-действия"&gt;Область действия&lt;a class="anchor" href="#%d0%be%d0%b1%d0%bb%d0%b0%d1%81%d1%82%d1%8c-%d0%b4%d0%b5%d0%b9%d1%81%d1%82%d0%b2%d0%b8%d1%8f"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Раздел фиксирует разрешенные значения &lt;code&gt;field_type&lt;/code&gt; для пользовательских полей.&lt;/li&gt;
&lt;li&gt;Для всех типов полей параметр &lt;code&gt;required&lt;/code&gt; настраиваемый (&lt;code&gt;true | false&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Значения по умолчанию настраиваются там, где это поддерживается типом поля.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="разрешенные-типы-полей"&gt;Разрешенные типы полей&lt;a class="anchor" href="#%d1%80%d0%b0%d0%b7%d1%80%d0%b5%d1%88%d0%b5%d0%bd%d0%bd%d1%8b%d0%b5-%d1%82%d0%b8%d0%bf%d1%8b-%d0%bf%d0%be%d0%bb%d0%b5%d0%b9"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;text&lt;/code&gt; - короткий текст.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Валидация: &lt;code&gt;min_length&lt;/code&gt; (опционально), &lt;code&gt;max_length&lt;/code&gt; (опционально), &lt;code&gt;pattern&lt;/code&gt; (опционально), &lt;code&gt;trim_on_save&lt;/code&gt; (опционально).&lt;/li&gt;
&lt;li&gt;По умолчанию: &lt;code&gt;default_value&lt;/code&gt; (опциональная строка).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;long_text&lt;/code&gt; - длинный многострочный текст.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Валидация: &lt;code&gt;min_length&lt;/code&gt; (опционально), &lt;code&gt;max_length&lt;/code&gt; (опционально), &lt;code&gt;trim_on_save&lt;/code&gt; (опционально).&lt;/li&gt;
&lt;li&gt;По умолчанию: &lt;code&gt;default_value&lt;/code&gt; (опциональная строка).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;boolean&lt;/code&gt; - логическое значение true/false.&lt;/p&gt;</description></item><item><title>Теги</title><link>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/tags/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/tags/</guid><description>&lt;h1 id="теги"&gt;Теги&lt;a class="anchor" href="#%d1%82%d0%b5%d0%b3%d0%b8"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="место-в-модели"&gt;Место в модели&lt;a class="anchor" href="#%d0%bc%d0%b5%d1%81%d1%82%d0%be-%d0%b2-%d0%bc%d0%be%d0%b4%d0%b5%d0%bb%d0%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Tag&lt;/code&gt; является отдельной сущностью уровня библиотеки и НЕ является &lt;code&gt;field_type&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Записи контента связываются с тегами через ассоциацию many-to-many.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="сущность-tag"&gt;Сущность Tag&lt;a class="anchor" href="#%d1%81%d1%83%d1%89%d0%bd%d0%be%d1%81%d1%82%d1%8c-tag"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt; (&lt;code&gt;system&lt;/code&gt;) - неизменяемый идентификатор тега.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;library_id&lt;/code&gt; (&lt;code&gt;system&lt;/code&gt;) - библиотека-владелец.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;key&lt;/code&gt; (&lt;code&gt;system&lt;/code&gt; или managed) - стабильный внутренний ключ.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;label&lt;/code&gt; (&lt;code&gt;user_editable&lt;/code&gt;) - отображаемое пользователю имя тега.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;color&lt;/code&gt; (&lt;code&gt;user_editable&lt;/code&gt;, optional) - визуальный цветовой маркер.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;icon&lt;/code&gt; (&lt;code&gt;user_editable&lt;/code&gt;, optional) - визуальный икон-маркер.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;created_at&lt;/code&gt; (&lt;code&gt;system&lt;/code&gt;) - момент создания.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;updated_at&lt;/code&gt; (&lt;code&gt;system&lt;/code&gt;) - момент обновления.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="связь-с-контентом"&gt;Связь с контентом&lt;a class="anchor" href="#%d1%81%d0%b2%d1%8f%d0%b7%d1%8c-%d1%81-%d0%ba%d0%be%d0%bd%d1%82%d0%b5%d0%bd%d1%82%d0%be%d0%bc"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Связь контента с тегами ДОЛЖНА поддерживать несколько тегов на одну запись.&lt;/li&gt;
&lt;li&gt;Core ДОЛЖЕН поддерживать назначение существующих тегов записям и снятие тегов с записей.&lt;/li&gt;
&lt;li&gt;Core РЕКОМЕНДУЕТСЯ поддерживать создание тега и его назначение в рамках одной логической операции.&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%80%d0%b5%d0%b4%d0%b0%d0%ba%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d1%8f"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Переименование тега обновляет &lt;code&gt;label&lt;/code&gt; без переписывания записей контента.&lt;/li&gt;
&lt;li&gt;Удаление тега ДОЛЖНО удалять связи с контентом, но НЕ ДОЛЖНО удалять контент.&lt;/li&gt;
&lt;li&gt;Объединение тегов МОЖЕТ поддерживаться и ДОЛЖНО сохранять связи с контентом.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="importexport-и-синхронизация"&gt;Import/Export и синхронизация&lt;a class="anchor" href="#importexport-%d0%b8-%d1%81%d0%b8%d0%bd%d1%85%d1%80%d0%be%d0%bd%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%8f"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&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/storage-model/library-model/library-actions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/library-actions/</guid><description>&lt;h1 id="действия-библиотеки"&gt;Действия библиотеки&lt;a class="anchor" href="#%d0%b4%d0%b5%d0%b9%d1%81%d1%82%d0%b2%d0%b8%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;/h1&gt;
&lt;h2 id="область-действия"&gt;Область действия&lt;a class="anchor" href="#%d0%be%d0%b1%d0%bb%d0%b0%d1%81%d1%82%d1%8c-%d0%b4%d0%b5%d0%b9%d1%81%d1%82%d0%b2%d0%b8%d1%8f"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Действия определяют baseline операций для записей библиотеки и тегов библиотеки.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="действия-для-записей"&gt;Действия для записей&lt;a class="anchor" href="#%d0%b4%d0%b5%d0%b9%d1%81%d1%82%d0%b2%d0%b8%d1%8f-%d0%b4%d0%bb%d1%8f-%d0%b7%d0%b0%d0%bf%d0%b8%d1%81%d0%b5%d0%b9"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;create&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Начинается с выбора &lt;code&gt;content_type&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Core автоматически заполняет системные поля (&lt;code&gt;id&lt;/code&gt;, &lt;code&gt;library_id&lt;/code&gt;, &lt;code&gt;created_at&lt;/code&gt;, &lt;code&gt;updated_at&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Core устанавливает &lt;code&gt;status=inbox&lt;/code&gt; и пустой &lt;code&gt;priority&lt;/code&gt; по умолчанию.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;edit&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Обновляет пользовательские поля.&lt;/li&gt;
&lt;li&gt;Обновляет &lt;code&gt;updated_at&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;set-subtype&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Устанавливает или очищает &lt;code&gt;content_subtype&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;НЕ ДОЛЖЕН менять &lt;code&gt;content_type&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Обновляет &lt;code&gt;updated_at&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;set-status&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Устанавливает &lt;code&gt;status&lt;/code&gt; из разрешенного набора.&lt;/li&gt;
&lt;li&gt;Переходы свободные (без жесткой state-machine).&lt;/li&gt;
&lt;li&gt;ДОЛЖЕН обновлять &lt;code&gt;status_changed_at&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;НЕ ДОЛЖЕН обновлять &lt;code&gt;updated_at&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;set-priority&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Действия схемы</title><link>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/schema-actions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/schema-actions/</guid><description>&lt;h1 id="действия-схемы"&gt;Действия схемы&lt;a class="anchor" href="#%d0%b4%d0%b5%d0%b9%d1%81%d1%82%d0%b2%d0%b8%d1%8f-%d1%81%d1%85%d0%b5%d0%bc%d1%8b"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="область-действия"&gt;Область действия&lt;a class="anchor" href="#%d0%be%d0%b1%d0%bb%d0%b0%d1%81%d1%82%d1%8c-%d0%b4%d0%b5%d0%b9%d1%81%d1%82%d0%b2%d0%b8%d1%8f"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Действия определяют lifecycle-операции для library-scoped сущностей схемы: пользовательские типы, пользовательские подтипы и пользовательские поля.&lt;/li&gt;
&lt;li&gt;Сущности схемы используют внутренние стабильные &lt;code&gt;key&lt;/code&gt;, уникальные в рамках одной библиотеки.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="действия-для-типов"&gt;Действия для типов&lt;a class="anchor" href="#%d0%b4%d0%b5%d0%b9%d1%81%d1%82%d0%b2%d0%b8%d1%8f-%d0%b4%d0%bb%d1%8f-%d1%82%d0%b8%d0%bf%d0%be%d0%b2"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;create-type&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Создает пользовательский тип контента в текущей библиотеке.&lt;/li&gt;
&lt;li&gt;Внутренний &lt;code&gt;key&lt;/code&gt; ДОЛЖЕН быть уникальным в библиотеке.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;edit-type&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Обновляет редактируемые свойства типа.&lt;/li&gt;
&lt;li&gt;Внутренний &lt;code&gt;key&lt;/code&gt; ДОЛЖЕН оставаться неизменяемым.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;archive-type&lt;/code&gt; / &lt;code&gt;unarchive-type&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Отключает/включает тип для активного использования в новых записях.&lt;/li&gt;
&lt;li&gt;Существующие записи с этим типом остаются валидными.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;delete-type&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Пресеты</title><link>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/search-presets/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/search-presets/</guid><description>&lt;h1 id="пресеты"&gt;Пресеты&lt;a class="anchor" href="#%d0%bf%d1%80%d0%b5%d1%81%d0%b5%d1%82%d1%8b"&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;&lt;code&gt;Preset&lt;/code&gt; — это сохраненное определение поиска в scope библиотеки.&lt;/li&gt;
&lt;li&gt;Preset хранит только условия поиска.&lt;/li&gt;
&lt;li&gt;Preset НЕ ДОЛЖЕН хранить сортировку и layout отображаемых полей.&lt;/li&gt;
&lt;li&gt;Preset МОЖЕТ быть вложенным через &lt;code&gt;parent_preset_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Preset МОЖЕТ задавать &lt;code&gt;inherit_query&lt;/code&gt; (&lt;code&gt;true|false&lt;/code&gt;) для наследования запроса родителя.&lt;/li&gt;
&lt;li&gt;Preset МОЖЕТ включать визуальные метаданные (&lt;code&gt;color&lt;/code&gt;, &lt;code&gt;icon&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="операции"&gt;Операции&lt;a class="anchor" href="#%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create-preset&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update-preset&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rename-preset&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete-preset&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run-preset&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%b8%d0%b5%d1%80%d0%b0%d1%80%d1%85%d0%b8%d0%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Циклы в иерархии пресетов запрещены.&lt;/li&gt;
&lt;li&gt;Если &lt;code&gt;inherit_query=true&lt;/code&gt;, итоговый запрос объединяется с запросом родителя через baseline-композицию &lt;code&gt;AND&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Если &lt;code&gt;inherit_query=false&lt;/code&gt;, родительская связь является только организационной.&lt;/li&gt;
&lt;li&gt;При удалении родительского пресета дочерние пресеты РЕКОМЕНДУЕТСЯ переносить на корневой уровень.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="управление-пользователем"&gt;Управление пользователем&lt;a class="anchor" href="#%d1%83%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d0%b5%d0%bc"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Пользователь может задавать и менять названия пресетов.&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/storage-model/library-model/collections/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/collections/</guid><description>&lt;h1 id="коллекции"&gt;Коллекции&lt;a class="anchor" href="#%d0%ba%d0%be%d0%bb%d0%bb%d0%b5%d0%ba%d1%86%d0%b8%d0%b8"&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;&lt;code&gt;Collection&lt;/code&gt; — ручная группировка записей в scope библиотеки.&lt;/li&gt;
&lt;li&gt;Collection НЕ хранит условия поиска.&lt;/li&gt;
&lt;li&gt;Одна запись контента МОЖЕТ входить в несколько коллекций.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="поля-collection"&gt;Поля Collection&lt;a class="anchor" href="#%d0%bf%d0%be%d0%bb%d1%8f-collection"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt; (&lt;code&gt;system&lt;/code&gt;) - неизменяемый идентификатор коллекции.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;library_id&lt;/code&gt; (&lt;code&gt;system&lt;/code&gt;) - библиотека-владелец.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt; (&lt;code&gt;user_editable&lt;/code&gt;) - название коллекции.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;description&lt;/code&gt; (&lt;code&gt;user_editable&lt;/code&gt;, optional) - описание коллекции.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;color&lt;/code&gt; (&lt;code&gt;user_editable&lt;/code&gt;, optional) - визуальный цветовой маркер.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;icon&lt;/code&gt; (&lt;code&gt;user_editable&lt;/code&gt;, optional) - визуальный икон-маркер.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;parent_collection_id&lt;/code&gt; (&lt;code&gt;user_editable&lt;/code&gt;, optional) - родительская коллекция для иерархии.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;created_at&lt;/code&gt; (&lt;code&gt;system&lt;/code&gt;) - момент создания.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;updated_at&lt;/code&gt; (&lt;code&gt;system&lt;/code&gt;) - момент обновления.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="операции"&gt;Операции&lt;a class="anchor" href="#%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create-collection&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rename-collection&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete-collection&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;add-to-collection&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;remove-from-collection&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reorder-collections&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%b8%d0%b5%d1%80%d0%b0%d1%80%d1%85%d0%b8%d0%b8"&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;/ul&gt;</description></item><item><title>Поведение поиска</title><link>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/search-behavior/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/search-behavior/</guid><description>&lt;h1 id="поведение-поиска"&gt;Поведение поиска&lt;a class="anchor" href="#%d0%bf%d0%be%d0%b2%d0%b5%d0%b4%d0%b5%d0%bd%d0%b8%d0%b5-%d0%bf%d0%be%d0%b8%d1%81%d0%ba%d0%b0"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="базовое-правило"&gt;Базовое правило&lt;a class="anchor" href="#%d0%b1%d0%b0%d0%b7%d0%be%d0%b2%d0%be%d0%b5-%d0%bf%d1%80%d0%b0%d0%b2%d0%b8%d0%bb%d0%be"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Search&lt;/code&gt; и &lt;code&gt;Preset&lt;/code&gt; ДОЛЖНЫ использовать один и тот же query-движок и одинаковую семантику.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="search-vs-preset"&gt;Search vs Preset&lt;a class="anchor" href="#search-vs-preset"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Search&lt;/code&gt; по умолчанию является временным (ephemeral) и не сохраняется, пока пользователь явно его не сохранит.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Preset&lt;/code&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%b8%d0%b7%d0%bc%d0%b5%d1%80%d0%b5%d0%bd%d0%b8%d1%8f-%d0%bf%d0%be%d0%b8%d1%81%d0%ba%d0%b0"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Поиск ДОЛЖЕН поддерживать структурные условия по &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;priority&lt;/code&gt;, &lt;code&gt;rating&lt;/code&gt;, &lt;code&gt;recommendation&lt;/code&gt;, &lt;code&gt;favorite&lt;/code&gt;, &lt;code&gt;archived&lt;/code&gt;, &lt;code&gt;content_type&lt;/code&gt;, &lt;code&gt;content_subtype&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Lifecycle библиотеки</title><link>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/library-lifecycle/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rekeeply.github.io/spec/ru/core-api/storage-model/library-model/library-lifecycle/</guid><description>&lt;h1 id="lifecycle-библиотеки"&gt;Lifecycle библиотеки&lt;a class="anchor" href="#lifecycle-%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="атрибуты-библиотеки"&gt;Атрибуты библиотеки&lt;a class="anchor" href="#%d0%b0%d1%82%d1%80%d0%b8%d0%b1%d1%83%d1%82%d1%8b-%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;id&lt;/code&gt; - уникальный неизменяемый идентификатор.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;name&lt;/code&gt; - редактируемое название библиотеки.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;icon&lt;/code&gt; - редактируемый визуальный маркер.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="lifecycle-операции"&gt;Lifecycle-операции&lt;a class="anchor" href="#lifecycle-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;create-library&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;rename-library&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Обновляет только &lt;code&gt;name&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt; остается неизменяемым.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;update-library-icon&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Обновляет только &lt;code&gt;icon&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;archive-library&lt;/code&gt; / &lt;code&gt;unarchive-library&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Архивная библиотека НЕ ДОЛЖНА выбираться как активная до восстановления.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;delete-library&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hard delete требует явного подтверждения.&lt;/li&gt;
&lt;li&gt;Перед удалением система РЕКОМЕНДУЕТСЯ показывать сводку объема связанных данных.&lt;/li&gt;
&lt;li&gt;Если удаляемая библиотека активна:
&lt;ul&gt;
&lt;li&gt;активная библиотека переключается на fallback при наличии;&lt;/li&gt;
&lt;li&gt;иначе активная библиотека очищается до следующего выбора/создания.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="инварианты"&gt;Инварианты&lt;a class="anchor" href="#%d0%b8%d0%bd%d0%b2%d0%b0%d1%80%d0%b8%d0%b0%d0%bd%d1%82%d1%8b"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Lifecycle-операции являются account-scoped.&lt;/li&gt;
&lt;li&gt;Cross-account lifecycle-операции запрещены.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt; библиотеки стабилен и не переиспользуется в рамках одного account scope.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>