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