MOffice

Отчёт сессии B «Платформа» по фазе 0 (задачи B1–B8)

Составлен исходной сессией B 2026-10-04 по состоянию main 8794093 и журналу docs/sessions/B-log.md. Подробности каждой задачи и даты — в журнале; здесь — сводка: что сделано, как устроено, как проверено, что осталось. Продукт переименован в MOffice (решение владельца № 41, этап 1 — видимые имена; этап 2 — внутреннее кодовое имя meridian в крейтах, C ABI, URN, MIME, префиксе ключей MRDN-, доменах — только по отдельному слову владельца).

1. Сводка

№ Задача Состояние Где проверено
B1 CI, just ci, генератор THIRD_PARTY.md/NOTICE/SBOM, страница лицензий сделано just ci зелёный; сайт /licenses/ — 200, 1440/375 px
B2 Шифрование meridian-crypto (формат spec/formats/mop-encryption.md) сделано векторы RFC; Python-эталон байт в байт; фаззинг 43 млн прогонов без сбоев
B3 Оболочка Qt 6.8 (окно Write, лента, палитра, темы) сделано, веха M0.5 снимки на «Живой оболочке»; qmllint без предупреждений
B4 Холст на настоящем рендере ядра (FFI A6) сделано продолжающей сессией журнал B, запись «B4 сделано»
B5 license-service и id-service, стенд moffice-api.24oros.ru сделано e2e 30/30 снаружи; браузер 1440 и 375 px
B6 Юридические черновики: EULA, политика ПДн, оферта, согласие, товарный знак сделано (черновики) все помечены «требует проверки юристом»
B7 Запрос коммерческой лицензии Qt сделано, текст у владельца —
B8 Сайт документации сделано продолжающей сессией журнал B, запись «B8 выложен и проверен онлайн»
№ 41 Переименование в MOffice, этап 1 (видимые имена, зоны A и B) сделано, выложено заголовки сайтов «MOffice — проектная документация», «MOffice API — стенд»

2. Как устроено (описания)

2.1 Реестр стороннего ПО (B1) — scripts/third_party.py

Источники: cargo metadata корня и services/ (граф зависимостей), Cargo.lock (SHA-256), third_party.toml (то, чего не видит cargo: копии кода, шрифты, образы, инструменты), docs/research/oss-verified.json (сверка класса). Алгоритм: замыкание графа отдельно по runtime/build/dev (процедурные макросы — сборка, не поставка); класс SPDX-выражения — «OR» берёт низший класс, «AND» — высший; тексты лицензий берутся только для выбранной альтернативы; строки Copyright извлекаются без шаблонных фраз. --check падает при устаревших файлах, классе 3 в продукте и классах 2/4 без решения владельца.

2.2 Шифрование документов (B2) — meridian-crypto, формат MOP v1

Случайный ключ файла DEK → HKDF-SHA256 выводит отдельные ключи данных и MAC заголовка (исправление относительно PasswordSafe: выход Argon2id и DEK напрямую не используются). Пароль: NFC → Argon2id (RFC 9106, вторая рекомендация, пределы чтения против DoS) → HKDF → KEK, обёртка DEK в AES-256-GCM. Данные — конструкция STREAM: чанки AES-256-GCM, nonce = префикс ‖ номер ‖ флаг последнего (защита от перестановки, усечения, дописывания). «MAC на весь файл» — HMAC-SHA256 по канонической форме заголовка, куда входит SHA-256 всего package.bin.

2.3 Оболочка (B3/B4) — shell/

Токены spec/design-tokens.json → scripts/gen_shell_assets.py → типизированный синглтон Mds.qml и группы tokens/*.qml (проверяются qmllint и qmlcachegen). Лента — своя на QML: группы сворачиваются по приоритету, галерея стилей эластичная. Страницы рисуются в пуле потоков под реальный devicePixelRatio через контракт shell/src/kernel/meridian_render.h; переключение «заглушка ↔︎ ядро» — одна опция CMake MERIDIAN_KERNEL_STUB.

2.4 Лицензии и аккаунты (B5)

Файл .mlic v1 (meridian-license/src/mlic.rs): детерминированный CBOR, подпись Ed25519 над "MOFC-LIC-v1" ‖ payload, строковые key_id. license-service: MAC ключа проверяется до БД; право создаётся при первой активации; устройство узнаётся по отпечатку или «2 из 3» компонентов; при нехватке мест — KEY_EXHAUSTED. id-service (перенос сервера FlyType): Argon2id, access-JWT EdDSA с публичным JWKS, непрозрачные refresh-токены (в БД — только SHA-256), ротация при каждом обновлении, повтор использованного токена отзывает сессию.

3. Комментарии в коде

Все новые модули сессии B начинаются с описания назначения на русском и английском, ключевые функции и неочевидные решения прокомментированы двуязычно (подсчёт по main, строки комментариев / из них двуязычных):

Каталог Комментариев Двуязычных строк
kernel/crates/meridian-crypto/src 377 174
kernel/crates/meridian-license/src 474 321
services/common/src 59 32
services/license-service/src 47 13
services/id-service/src 39 11
shell/src 90 15
shell/mds/components + shell/qml 96 31
scripts 74 76

«Двуязычные» — строки вида «текст по-русски / english» в одной строке; в остальных случаях пара строк RU и EN идёт подряд.

4. Проверки (что и с каким результатом)

Проверка Результат
just ci перед каждым слиянием (fmt, clippy -D warnings, тесты, cargo deny корня и сервисов, реестр, ресурсы оболочки, макеты, сборка сайта) зелёный, последний раз — main 8794093
Модульные тесты корня 3 373 теста, 0 ошибок
Модульные тесты сервисов 5 тестов, 0 ошибок (+ сквозной тест ниже)
Векторы шифрования MOP vs независимая реализация на Python (cryptography, argon2-cffi) 3 из 3 байт в байт
Фаззинг header и open (cargo-fuzz, по 5 мин) 17,5 и 25,9 млн прогонов, сбоев нет
Сквозной тест API services/tests/e2e.py локально и через https://moffice-api.24oros.ru 30/30 и 30/30
Подпись выданного .mlic кодом ядра (meridian-keygen inspect-license) верна
Страница стенда API в браузере 1440 × 900 и 375 × 812 без прокрутки вбок, статусы «работает»
Сайт документации: «Лицензии», «Живая оболочка», спецификация шифрования 200, 1440 и 375 px без прокрутки вбок
Снимки оболочки (светлая, тёмная, палитра, backstage, узкое окно 1024 px) сняты с настоящего окна Qt
После переименования: оба сайта в браузере (1440 и 375 px) без прокрутки вбок; заголовки с MOffice; статусы сервисов «работает»; «Meridian Office» на главной — только в пометке о прежнем названии

5. Что осталось и чьё решение нужно

  1. Этап 2 переименования (крейты meridian-*, meridian.h, URN, MIME, MRDN-, домены) — только по отдельному слову владельца; без него не выполняется.
  2. Лицензия Qt — ждём ответа Qt Sales на запрос docs/legal/qt-quote-request.md; вероятен отказ из-за ограничения продаж в Россию с 2022 года, варианты А–Г — в документе.
  3. CI на repobase — раннеры стоят на GX10, где собирать нельзя; свой раннер на sagr заблокирован защитой — нужно решение владельца.
  4. Товарный знак MOffice — поиск патентного поверенного (ФИПС, ВОИС; классы 9 и 42), см. docs/legal/trademark-check.md.
  5. Юридические черновики — проверка юристом перед публикацией.