> Перевод даётся для удобства чтения. Нормативным является английский оригинал. # MMAS-Interchange - формат обмена Мета-Вселенной (MUIF) **Спецификация Мета-Вселенной** **Идентификатор документа:** MU-V2-ARCH-009 **Название:** Формат обмена Мета-Вселенной (MUIF) и Смысловой отпечаток **Класс документа:** нормативный **Версия:** 2.0 (черновик) **Статус:** рабочий черновик **Нормативные ссылки:** [MMAS-Core](../02-architecture/MMAS-Core.md), [Versioning](../02-architecture/Versioning.md), [Naming-Conventions](../02-architecture/Naming-Conventions.md), RFC 8785 (JSON Canonicalization Scheme), RFC 2119 **Информативные ссылки:** [Validation](../02-architecture/Validation.md), [MMAS-Package](../02-architecture/MMAS-Package.md), [Extension-Model](../02-architecture/Extension-Model.md) **Копирайт:** © Orkestron.AI **Лицензия:** Apache-2.0 --- # 1. Назначение Этот документ определяет **формат обмена Мета-Вселенной (MUIF)** - каноническую машиночитаемую сериализацию мета-модели - и точный **алгоритм канонизации**, применяемый для вычисления воспроизводимого **Смыслового отпечатка**. MUIF - конкретное лицо абстрактной модели, определённой в [MMAS-Core](../02-architecture/MMAS-Core.md). Это базовый артефакт, от которого зависят валидация, упаковка, миграция, предварительные проверки федерации и инструменты: без единой канонической формы Смысловой отпечаток, на который ссылается вся спецификация, не был бы воспроизводим между реализациями, а слова «ИИ-нативный» и «машиночитаемый» остались бы заявлениями, а не фактами. --- # 2. Область действия Этот документ задаёт: - модель документа MUIF и её сериализацию (JSON, с допустимым YAML); - определения JSON Schema для каждого примитива и для манифеста; - разделение **смыслового** и **несмыслового** содержимого; - алгоритм канонизации и Смысловой отпечаток. Он не определяет транспорт (см. [MUFP](../03-federation/MUFP.md)), а также упаковку и подписание (см. [MMAS-Package](../02-architecture/MMAS-Package.md)). --- # 3. Модель документа MUIF Документ MUIF кодирует **иерархию композиции** MMAS: ```text Meta-Model (manifest) ├── Bundles ── Layers ├── Objects ── Properties ├── Relationships ├── Events ├── Contracts └── Projections ``` Точкой входа является **манифест**. Каждый примитив несёт дискриминатор `muifType` (`Object`, `Relationship`, `Event`, `Contract`, `Projection`). Нормативные JSON-схемы (Draft 2020-12) лежат в [`/schemas`](../schemas/): | Схема | Примитив | |--------|-----------| | `manifest.schema.json` | Точка входа пакета Мета-Модели | | `object.schema.json` | Объект | | `relationship.schema.json` | Связь | | `event.schema.json` | Событие | | `contract.schema.json` | Контракт | | `projection.schema.json` | Проекция | | `common.schema.json` | Общие определения (CSN, идентификатор, происхождение, …) | Документ MUIF ОБЯЗАН проходить проверку по `manifest.schema.json` (который ссылается на остальные). --- # 4. Сериализация - Каноническая сериализация - **JSON** (RFC 8259) в UTF-8. - **YAML** 1.2 МОЖЕТ использоваться при создании; он ОБЯЗАН без потерь преобразовываться в модель JSON. Смысловой отпечаток определён над моделью JSON, поэтому выбор JSON или YAML НЕ ДОЛЖЕН влиять на отпечаток. - Идентификаторы и канонические смысловые имена следуют [Naming-Conventions](../02-architecture/Naming-Conventions.md). --- # 5. Смысловое и несмысловое содержимое Смысловой отпечаток вычисляется только по **смысловому ядру**. Следующее является **несмысловым** и ОБЯЗАНО исключаться из канонизации: - ключи объектов: `displayName`, `description`, `documentation`, `comment`, `label`, `labels`, `ui`, `assertedAt`, `assertionTime`, `generatedAt`, `lastModified`, `fingerprint`, `examples`, `$schema`, `$comment`; - любой ключ, начинающийся с `_` или с `x-ui`. Обоснование: изменение человеческой метки, описания, отметки времени записи или самозаявленного отпечатка НЕ ДОЛЖНО менять смысл модели и, следовательно, НЕ ДОЛЖНО менять её отпечаток. Каждая схема помечает такие поля как **NON-SEMANTIC** в своём описании. --- # 6. Алгоритм канонизации Для данного документа MUIF каноническая форма получается так. 1. **Разобрать** документ в абстрактное значение (объект / массив / строка / число / логическое / null). 2. **Спроецировать на смысловое ядро.** Рекурсивно удалить каждый несмысловой ключ (раздел 5). Удалить ключи, значение которых равно `null`, пустому объекту или пустому массиву: *отсутствие* и *пустота* считаются эквивалентными. 3. **Нормализовать значения.** - Строки ОБЯЗАНЫ нормализоваться в Unicode **NFC**. - **Ключи объектов** ОБЯЗАНЫ сортироваться по возрастанию кодовых точек Unicode (порядковое сравнение). - **Массивы ОБЯЗАНЫ трактоваться как множества**: каждый элемент канонизируется, затем элементы сортируются порядковым сравнением их канонических строк. (Последовательности, где важен порядок, в базовой модели v1.0 не используются; будущая редакция МОЖЕТ ввести явную пометку упорядоченного массива - см. «Дальнейшие направления».) - Целые числа ОБЯЗАНЫ выводиться в кратчайшей десятичной форме без ведущих нулей и без ведущего `+`. Прочие числа следуют форматированию чисел по RFC 8785 (JSON Canonicalization Scheme). 4. **Сериализовать** нормализованное дерево в канонический JSON: UTF-8, отсортированные ключи, без незначащих пробелов, экранирование строк JSON по RFC 8785. 5. **Хешировать.** Вычислить `SHA-256` по UTF-8-байтам канонического JSON. **Смысловой отпечаток** таков: ```text sha256: ``` Два документа MUIF с одинаковым смысловым ядром ОБЯЗАНЫ давать одинаковый отпечаток независимо от формата сериализации, порядка ключей, порядка элементов массива-множества, пробелов и несмысловых полей. --- # 7. Разобранный пример Референсный пример [`/examples/minimal-person`](../examples/minimal-person/) содержит одну и ту же модель в двух очень разных сериализациях (`person.muif.json` и намеренно переставленный `person.variant.json` с дополнительными несмысловыми полями). Оба дают одинаковый отпечаток: ```text sha256:a628b2afb96dc673f7e2f9161569e573fc70892d10a6997fad7aaa14b04a639d ``` Это проверяется референсным инструментом [`mu-fingerprint`](../tools/): ```text mu-fingerprint examples/minimal-person/person.muif.json mu-fingerprint examples/minimal-person/person.variant.json # → identical sha256:a628b2af...b04a639d ``` --- # 8. Соответствие Документ **соответствует MUIF**, когда: - он проходит проверку по `manifest.schema.json` и по схемам, на которые тот ссылается; - каждый примитив объявляет свой `muifType`, `id` и обязательные поля; - его Смысловой отпечаток, когда он самозаявлен в `metaModel.fingerprint`, равен значению, вычисленному алгоритмом канонизации из раздела 6. Мета-модель ОБЯЗАНА быть передаваемой в MUIF, чтобы заявлять соответствие MMAS на уровне **A4 Проверенная** или выше (см. [MMAS-Conformance](../02-architecture/MMAS-Conformance.md)). --- # 9. Архитектурные инварианты - Смысловой отпечаток ОБЯЗАН вычисляться только по смысловому ядру. - Отпечаток ОБЯЗАН быть независимым от сериализации, порядка ключей, порядка множеств, пробелов и несмысловых полей. - Изменение смысла ОБЯЗАНО менять отпечаток; изменение форматирования или меток НЕ ДОЛЖНО. - `metaModel.fingerprint` ОБЯЗАНО исключаться из собственного вычисления. --- # Дальнейшие направления - **Полное соответствие RFC 8785** для всех форм чисел и набор тестовых векторов соответствия для канонизации (питает набор смысловых тестов). - **Пометка упорядоченных массивов** для редких случаев, когда порядок элементов смыслово значим. - **Подписанные MUIF / SDP**: отсоединённые подписи над каноническими байтами, делающие возможным Смысловой пакет распространения (см. [MMAS-Package](../02-architecture/MMAS-Package.md)). - Формальная **мета-модель MMAS** (грамматика), из которой генерируются схемы. --- # Заключение > Модель значит одно и то же независимо от того, как она записана. MUIF делает это точным: одна каноническая форма, один отпечаток, чтобы две системы могли убедиться, что говорят ровно об одном и том же смысле, ещё до обмена хотя бы одним фактом.