Модель Raw#

Назначение#

  • Raw выделен в отдельный домен, потому что часть пользовательских данных должна храниться в неструктурированном виде до последующей обработки.
  • Raw обеспечивает быстрый capture без обязательной классификации и без немедленного размещения в Library.

Контракт#

  • Реализация core ДОЛЖНА включать Raw как домен хранения уровня аккаунта для неструктурированного capture.
  • Raw ДОЛЖЕН поддерживать быстрое сохранение без выбора активной библиотеки.
  • Raw ДОЛЖЕН поддерживать разбор и отложенную обработку сохраненных элементов.
  • Элементы Raw ДОЛЖНЫ поддерживать явный последующий перенос в Library.

Поддерживаемые payload-типы#

  • Raw ДОЛЖЕН поддерживать payload-типы text, link, mixed.
  • Raw МОЖЕТ поддерживать file_ref как reference-only payload.
  • Типы image, video, audio не входят в обязательный baseline scope.

Модель хранения Raw Item#

  • Хранение ДОЛЖНО быть ориентировано на typed-columns-first для горячих read-path.
  • Реализация НЕ ДОЛЖНА опираться на JSON-only хранение для горячих list/filter-path.
  • Каждый RawItem ДОЛЖЕН содержать: id, account_id, payload_type, status, created_at, updated_at.
  • Реализация ДОЛЖНА/РЕКОМЕНДУЕТСЯ хранить легкие поля для быстрых списков (title_preview, source/type/status).

Каналы записи (capture)#

  • Raw ДОЛЖЕН принимать capture из ручного ввода и буфера обмена/paste.
  • Raw ДОЛЖЕН/МОЖЕТ принимать external share/import при поддержке клиентом/рантаймом.
  • Capture НЕ ДОЛЖЕН зависеть от сетевой доступности.

Обогащение метаданными#

  • Для link metadata enrichment МОЖЕТ выполняться асинхронно после capture.
  • Ошибки получения метаданных НЕ ДОЛЖНЫ блокировать завершение capture.
  • Если метаданные недоступны, реализация ДОЛЖНА использовать детерминированный fallback-preview.

Lifecycle и операции#

  • Реализация ДОЛЖНА поддерживать состояния, эквивалентные new | triaged | promoted | archived.
  • Реализация ДОЛЖНА поддерживать list и смену статусов для triage.
  • Реализация ДОЛЖНА поддерживать явную операцию promote из Raw в Library.

Требования к promote-flow#

  • promote ДОЛЖЕН валидировать, что target_library_id принадлежит тому же account_id.
  • promote ДОЛЖЕН быть идемпотентным для одного RawItem и НЕ ДОЛЖЕН создавать дубли при retry.
  • promote ДОЛЖЕН сохранять связь с созданной сущностью библиотеки (promoted_content_id или эквивалент origin-link).

Mapping-правила promote#

  • Raw:text

    • Целевой тип по умолчанию: misc (или тип, явно выбранный пользователем).
    • title маппится из raw-заголовка при наличии; fallback использует preview/начало текста.
    • summary маппится из текстового payload.
  • Raw:link

    • Целевой тип по умолчанию: resource с подтипом по умолчанию site.
    • title маппится из metadata title; fallback использует host/URL.
    • source_url маппится из URL ссылки.
    • summary может маппиться из metadata description при наличии.
  • Raw:mixed

    • Целевой тип по умолчанию: misc (или тип, явно выбранный пользователем).
    • title маппится по правилам текстового payload.
    • summary маппится из текстовой части mixed payload.
    • Если ссылка одна, она может маппиться в source_url; дополнительные ссылки сохраняются в связанных notes/attachments.
  • Raw:file_ref

    • Целевой тип по умолчанию: resource с подтипом по умолчанию document.
    • title маппится из имени файла или basename uri.
    • Ссылка на файл маппится в dataset вложений (uri, name, mime, size при наличии).

Итоговое состояние promote#

  • Успешный promote ДОЛЖЕН устанавливать RawItem.status в promoted.
  • Успешный promote ДОЛЖЕН устанавливать или сохранять promoted_content_id.
  • Повторный promote для того же RawItem ДОЛЖЕН возвращать существующую связь и НЕ ДОЛЖЕН создавать дубликаты контента.

Scope синхронизации#

  • Raw относится к account-scoped уровню и ДОЛЖЕН синхронизироваться между устройствами при включенном sync-режиме.
  • Синхронизация Raw ДОЛЖНА быть асинхронной и НЕ ДОЛЖНА блокировать локальные оффлайн-операции.
  • Передача данных sync ДОЛЖНА выполняться по защищенному каналу.

Инварианты#

  • Cross-account доступ к Raw в одной активной сессии ДОЛЖЕН отклоняться.
  • Операции записи ДОЛЖНЫ отклоняться, пока сессия заблокирована.
  • Перенос в библиотеку вне границ активного аккаунта ДОЛЖЕН отклоняться.