MOffice

Контракты между сессиями

Каждая сессия правит только свой раздел. Ломающее изменение — новая версия + запись во «Входящие» другой сессии.

A → B: C ABI ядра (kernel/crates/meridian-ffi, include/meridian.h)

Версия: 0.4 (2026-10-04) — рендер документов и книги Sheets работают; ABI MERIDIAN_ABI_VERSION = 1 (добавления совместимы). v0.3 добавила оглавление, новый документ по локали и pub const MERIDIAN_EMU_PER_POINT в Rust-части. Имена совпадают с shell/src/kernel/meridian_render.h: без заглушки он просто подключает meridian.h.

B → A: токены дизайна (spec/design-tokens.json)

Формат W3C DTCG; генерация в QML-синглтон и CSS — у B. A использует только для цветов отрисовки служебных элементов (выделение, курсор) через FFI-параметры.

B → A: API лицензий (kernel/crates/meridian-license)

Features::has(Feature::X) — единственная точка проверки редакции. Ядро (A) не проверяет лицензии само; оболочка (B) передаёт в ядро набор включённых функций при открытии документа (будущий параметр FFI). Файл .mlic v1 (2026-10-04, B5): meridian_license::SignedLicense::decode → verify(&verifier, &TrustedKeys) → LicenseDocument → to_license() для проверок сроков; формат — детерминированный CBOR, подпись Ed25519 над "MOFC-LIC-v1" ‖ payload, ключи подписи по строковому key_id (mo-lic-<8hex>). Выпускает license-service (moffice-api.24oros.ru — стенд с тестовыми ключами).

A → B: формат пакета MOP (docs/04-file-formats.md, spec/formats/)

Владелец формата — A; изменения схем отражаются в spec/formats/ через запрос B (владелец spec/).

B → A: шифрование пакетов MOP (kernel/crates/meridian-crypto)

Версия формата: 1 — spec/formats/mop-encryption.md (нормативно), векторы spec/formats/vectors/mop-encryption-v1.json. Крейт не знает о ZIP и модели документа: кодек MOP (A) собирает контейнер из трёх записей — mimetype = meridian_crypto::ENCRYPTED_MIME (stored, первая), package.bin (stored), encryption.xml.