MOffice

Открытый код для Mail, Notes, Forms, MOffice Script, Sync и поиска (исследование, 2026-10-04)

Область: MOffice Mail (почта, календарь, контакты), MOffice Notes, MOffice Forms, MOffice Script, MOffice Sync, полнотекстовый поиск, диктовка (FlyType). Классы лицензий — docs/12-license-policy.md. Источники данных: docs/research/oss-verified.tsv (проверка 2026-10-04), клоны из BRIEF.md, плюс новые неглубокие клоны в scratchpad (outlook-pst-rs, calcard, libdav) и запросы к crates.io/GitHub — такие строки помечены «(проверено 2026-10-04)». Пути к клонам (временные, только чтение): $S = /private/tmp/claude-501/-Users-amoros-MeridianOffice-/40d8f24c-fbfc-4943-a28d-8a3d2c115276/scratchpad/oss-src/, $P = …/scratchpad/pim/src/ (тот же scratchpad).

1. Выводы (топ-10)

Методика экономии: в docs/08-roadmap.md нет оценок по эпикам, поэтому базой служит «сделать самим» той же командой (фазы 5–7; ориентир — 1 чел.-мес. на 1,5–2,5 тыс. строк кода парсеров/протоколов с тестами и фаззингом) минус работа по встраиванию. Для сравнения: работы фазы 5 — ≈21 FTE × 12 мес. ≈ 250 чел.-мес., фазы 6 — ≈240.

№ Что берём Лицензия (класс) Куда в MOffice Экономия, чел.-мес.
1 outlook-pst + compressed-rtf (Microsoft, Rust, ≈15,4 тыс. строк: NDB/LTP/Messaging, ANSI и Unicode) вместо своего парсера [MS-PST] MIT (1) codecs/mail/pst, msg 5
2 calcard (Stalwart): iCalendar + vCard чтение/запись, раскрытие RRULE, зоны Windows→IANA, JSCalendar/JSContact Apache-2.0 OR MIT (1) codecs/{ical,vcard}, календарь Mail 4,5
3 FlyType (свой): правила «полировки» диктовки RU/EN, маршрутизатор облако/локально, протокол контекста + схема сервиса STT MIT, владелец (★) диктовка в Write/Notes/Mail, Cloud 4
4 imap-codec + imap-next (типизированный кодек IMAP, sans-I/O) MIT OR Apache-2.0 (1) mail-core::imap 3,5
5 y-sweet (сервер Yjs/Yrs на Rust, хранение в S3/ФС) как основа CRDT-части cloud-service MIT (1) MOffice Sync, фаза 6 3,5
6 mail-parser + mail-builder (MIME, mbox, Maildir, нормализация темы на ≈30 языках) Apache-2.0 OR MIT (1) codecs/mail/mime, mail-core 3
7 libdav (CalDAV/CardDAV, обнаружение по RFC 6764, sync-collection) ISC (1) mail-core::dav 2,75
8 WASM-плагины (wasmtime + Extism) вместо нативных плагинов Rust/C++ через C ABI Apache-2.0 WITH LLVM-exception / BSD-3-Clause (1) Script SDK, фаза 7 2
9 Набор для VBA: ovba (чтение vbaProject.bin), грамматика VB6 из grammars-v4, семантика из ViperMonkey/oletools MIT / MIT / BSD-2-Clause (1) транслятор VBA v1/v2 2
10 ink-stroke-modeler (порт на Rust, с фильтром Калмана) + perfect-freehand (контур штриха) Apache-2.0 / MIT (1) перо Notes и Paint 2

Ещё ≈7,5 чел.-мес. дают SurveyJS survey-library как образец схемы и выражений Forms (1,5), mail-auth (1,5), tree-sitter для подсветки (1), один движок поиска tantivy вместо пары FTS5 + tantivy (1), RustCrypto cms для S/MIME (1), автонастройка из email-lib (0,75), lettre для SMTP (0,75). Итого ≈40 чел.-мес. (≈8 % работ фаз 5–6). Если владелец одобрит MPL-2.0 для onenote_parser — ещё ≈6 (раздел 4).

Главные находки по лицензиям (менять документы проекта):

  1. В docs/apps/mail.md OpenPGP идёт через sequoia-openpgp — это LGPL-2.0-or-later (класс 2). Замена — rPGP (pgp, MIT OR Apache-2.0, 6,6 млн загрузок); класс 2 больше не нужен.
  2. ammonia 4.x, css-inline и lol_html транзитивно тянут cssparser и selectors — MPL-2.0 (проверено 2026-10-04 по зависимостям на crates.io). В component-map.md ammonia указан как класс 1 — это неточно. Решение: свой санитайзер поверх html5ever (MIT OR Apache-2.0) со своим фильтром inline-CSS.
  3. Запрещены (класс 3), хотя выглядят удобными: sieve-rs (AGPL-3.0-only), evalexpr (AGPL-3.0-only), minicaldav (GPL-3.0-or-later), модели Silero (CC BY-NC-SA 4.0 — их использует сайдкар пунктуации FlyType), SurveyJS Creator/Dashboard/PDF (коммерческая лицензия). Условно (класс 2): fast-dav-rs (LGPL-3.0).
  4. Технические ограничения, которых нет в библии: в QuickJS-ng нет API отладчика и нет Intl (quickjs.h, docs/docs/es_features.md в клоне); в Yrs 0.28 нет операции перемещения элементов массива (Notes рассчитывает на move для порядка страниц).

2. Таблицы по подобластям

Обозначения: ★ — звёзды GitHub, «загр.» — загрузки crates.io, «изм.» — последний коммит/выпуск. Стратегии: adopt, fork, port, reference, avoid (см. BRIEF). «Эк.» — экономия, чел.-мес. Данные без пометки взяты из oss-verified.tsv; строки с новыми кандидатами проверены 2026-10-04 (crates.io API, GitHub API, файлы LICENSE в клонах).

2.1 Mail: почта, календарь, контакты

Подобласть Кандидат SPDX (класс) ★ / загр. Изм. Яз. Что даёт MOffice Стратегия Сами пишем / риски Эк.
MIME mail-parser Apache-2.0 OR MIT (1) 459 / 4,0 млн 2026-10-02 Rust разбор MIME, RFC 2047/2231, однобайтовые кодировки (CJK — через encoding_rs), mbox и Maildir, html→text, превью adopt TNEF, секции IMAP; в клоне 1.0.0, на crates.io 0.11.9 3
MIME mail-builder Apache-2.0 OR MIT (1) 83 / 1,4 млн 2026-09-28 Rust сборка писем, вложения, кодирование заголовков adopt format=flowed, черновики в 3
MIME mailparse 0BSD (0) — / 14,6 млн 2026-09-06 Rust простой парсер без обязательств reference терпимость к мусору ниже (не проверено) —
IMAP imap-codec + imap-next MIT OR Apache-2.0 (1) — / 125 тыс., 59 тыс. 2026-07-19 Rust полный типизированный кодек IMAP, sans-I/O, фаззинг adopt синхронизация (QRESYNC, pending_ops); 2.0 пока alpha 3,5
IMAP async-imap MIT OR Apache-2.0 (1) 148 / 1,75 млн 2026-09-30 Rust зрелый клиент (на нём Delta Chat) запасной поддержка QRESYNC (не проверено) —
IMAP imap-client, rust-imap MIT; Apache-2.0/MIT (1) — / 59 тыс.; 582 / 2,2 млн 2026-05; 2025-02 Rust высокоуровневый клиент; синхронный клиент reference; avoid imap 2.4 почти не развивается —
SMTP lettre MIT (1) 2267 / 19,5 млн 2026-09-09 Rust SMTP, STARTTLS/implicit TLS, XOAUTH2, отправка готовых байт adopt очередь outbox, DSN, BDAT (не проверено) 0,75
SMTP mail-send Apache-2.0 OR MIT (1) 275 / 547 тыс. 2026-08-18 Rust SMTP + подпись DKIM запасной только tokio + rustls —
Аутентификация писем mail-auth Apache-2.0 OR MIT (1) 128 / 519 тыс. 2026-09-28 Rust проверка DKIM, ARC, SPF, DMARC для антифишинга adopt DNS-запросы к домену отправителя раскрывают факт обработки письма — по умолчанию доверять Authentication-Results 1,5
Автонастройка email-lib email/src/autoconfig (≈1 тыс. строк) MIT (1) 44 / 98 тыс. 2026-03-01 Rust ISP → .well-known → ISPDB онлайн → MX → TXT → SRV (RFC 6186) fork модуля убрать http без TLS, своя база, Autodiscover v2 0,75
Автонастройка thunderbird/autoconfig (ISPDB) MPL-2.0 (2) 94 2026-09-24 XML база провайдеров только онлайн-запрос данные не встраивать (раздел 4) —
DNS, OAuth hickory-resolver, oauth2 (+ oauth-lib pimalaya, MIT) MIT OR Apache-2.0 (1) — / 83,8 млн; 54,9 млн 2026-09; 2025-01 Rust SRV/MX/TXT; Authorization Code + PKCE, loopback adopt регистрация клиентов Google (CASA), Microsoft — организационный риск —
iCalendar, vCard, RRULE calcard Apache-2.0 OR MIT (1) 75 / 59 тыс. 2026-09-30 Rust ics/vcf чтение и запись, раскрытие RRULE, зоны Windows→IANA, JSCalendar/JSContact adopt описание правила по-русски, round-trip X-, логика iTIP 4,5
RRULE rust-rrule (rrule) MIT OR Apache-2.0 (1) 94 / 1,3 млн 2025-04-20 Rust ≈6 тыс. строк тестов (примеры RFC 5545, регрессии) reference, порт тестов развитие замедлилось (17 мес.) в 4,5
iCalendar icalendar MIT/Apache-2.0 (1) 190 / 905 тыс. 2026-09-29 Rust генерация и разбор без раскрытия RRULE запасной — —
vCard vcard4, vobject, vcard_parser MIT OR Apache-2.0; MIT; MIT (1) — / 53, 43, 28 тыс. 2026-02…05 Rust разбор vCard 4 (RFC 6350) reference (сверка) vCard 2.1 с QP — проверить в calcard —
iCalendar ical.js, libical, ical (архив) MPL-2.0; LGPL/MPL (2); Apache-2.0 1179; 366 — JS; C; Rust — avoid есть замена класса 1 —
CalDAV/CardDAV libdav ISC (1) — / 49 тыс. 2026-10-02 Rust клиент CalDAV/CardDAV, RFC 6764 (SRV, TXT, .well-known), sync-collection (RFC 6578) adopt free-busy-query, планирование iTIP, особенности Google/iCloud 2,75
CalDAV kitchen-fridge, caldav-utils MIT (1) — / 3,6 тыс.; 14 тыс. 2022-01; 2023-08 Rust — avoid заброшены —
CalDAV fast-dav-rs; minicaldav LGPL-3.0 (2); GPL-3.0-or-later (3) — / 3,3 тыс.; 32 тыс. 2026-09; 2023-07 Rust — avoid раздел 4–5 —
JMAP (P2) jmap-client Apache-2.0 OR MIT (1) — / 83 тыс. 2026-09-28 Rust клиент JMAP (RFC 8620/8621) adopt в P2 — ≈1 при P2
OpenPGP rPGP (pgp) MIT OR Apache-2.0 (1) 1078 / 6,6 млн 2026-10-03 Rust ключи, подпись и шифрование RFC 4880/9580 adopt PGP/MIME (RFC 3156), Autocrypt, WKD — свои (образец — pgp-lib pimalaya) снят класс 2
OpenPGP sequoia-openpgp LGPL-2.0-or-later (2) 455 / 1,9 млн 2026-07-09 Rust — avoid сейчас записан в mail.md —
S/MIME RustCrypto formats: cms, x509-cert, pkcs12 Apache-2.0 OR MIT (1) — / 13,5 млн (cms) 2026-01…07 Rust CMS SignedData/EnvelopedData, X.509, PKCS#12 adopt cms 0.3 — pre-release; цепочки через ОС (rustls-platform-verifier, MIT OR Apache-2.0) 1
S/MIME rust-openssl + OpenSSL 3 Apache-2.0 (1) — / 414 млн 2026-06-12 Rust/C проверенная временем S/MIME запасной крупная C-зависимость —
HTML html5ever MIT OR Apache-2.0 (1) — / 116,7 млн 2026-09-14 Rust DOM-разбор писем для санитайзера adopt свой allowlist и фильтр CSS —
HTML ammonia 4.x; css-inline; lol_html MIT OR Apache-2.0; MIT; BSD-3-Clause, но все → cssparser/selectors MPL-2.0 (2) 679 / 17,5 млн 2026-10 Rust готовый санитайзер, инлайн CSS, потоковая правка reference (раздел 4) ammonia 3.x — без cssparser —
Антифишинг linkify, publicsuffix, unicode-security MIT OR Apache-2.0 (1) — / 4,1; 65,8; 15 млн 2024–2026 Rust ссылки в тексте, регистрируемый домен, гомоглифы (UTS #39) adopt — —
Антиспам свой байес (Graham 2002; Robinson, χ²) — — — — уже описан в mail.md 5.7 own токенизатор RU/EN —
Антиспам rspamd; bayespam Apache-2.0; MIT (1) 2536; — / 52 тыс. 2026-09; 2025-10 C/Lua; Rust признаки и правила; минимальный байес reference rspamd — серверный, не встраивать —
Цепочки JWZ (jwz.org) + thread_name() из mail-parser алгоритм; Apache-2.0 OR MIT — — — алгоритм уже в mail.md 5.2; префиксы тем на ≈30 языках own + adopt добавить «Пересл:» —
PST outlook-pst + compressed-rtf MIT (1) 36 / 175 тыс., 75 тыс. 2026-09-30 Rust PST ANSI/Unicode: NDB, LTP (PC/TC), папки, письма, вложения, именованные свойства; [MS-OXRTFCP] adopt MAPI→MIME/VEVENT/vCard, HTML из RTF ([MS-OXRTFEX]), повторения ([MS-OXOCAL]); OST 2013+ нет 5
MSG msg_parser; свой на cfb MIT (1) 10 / 303 тыс.; — / 68 млн 2026-05; 2026-09 Rust .msg ([MS-OXMSG]) reference; own типы свойств — из outlook-pst в 5
PST libpff LGPL-3.0 (2) 368 2026-09-17 C — avoid убрать запасной путь FFI из mail.md —
TNEF tnef MIT OR Apache-2.0 (1) — / 8 тыс. 2019-08 Rust базовый разбор winmail.dat reference свой по [MS-OXTNEF] —
mbox, Maildir mail-parser src/mailbox/{mbox,maildir}.rs; mbox-reader Apache-2.0 OR MIT; MIT/Apache-2.0 (1) — 2026-10; 2019 Rust потоковое чтение adopt (mail-parser) варианты mboxrd/mboxcl2 — проверить —

2.2 Notes

Кандидат SPDX (класс) ★ / загр. Изм. Яз. Что даёт MOffice Стратегия Сами пишем / риски Эк.
ink-stroke-modeler Apache-2.0 (1) 141 2026-08-02 C++ (≈4,1 тыс. строк, absl) сглаживание, давление/наклон, Kalman-предсказание, подавление петель port на Rust подбор параметров под Wacom и Apple Pencil 1,5
ink-stroke-modeler-rs MIT OR Apache-2.0 (1) — / 16 тыс. 2025-05-01 Rust «неофициальная частичная» переписка reference, старт порта неполнота в 1,5
perfect-freehand MIT (1) 5748 2026-04-13 TS контур штриха переменной ширины (как в Excalidraw) port (≈500 строк) — 0,5
Excalidraw, Lorien MIT (1) 133 тыс.; 6,8 тыс. 2026-09; 2025-09 TS; GDScript модель элементов, привязки, бесконечный холст, формат штрихов reference — —
tantivy MIT (1) 16,2 тыс. / 19,2 млн 2026-09-08 Rust индекс страниц, OCR, рукописи adopt см. 2.6 —
onenote.rs (onenote_parser 2.0) MPL-2.0 (2) 86 / 23 тыс. 2026-08-06 Rust (≈18,8 тыс. строк) .one, .onetoc2 (десктоп и OneDrive/FSSHTTP), штрихи, формулы, таблицы, вложения, теги решение владельца .onepkg через cab (MIT) 6 при одобрении
evernote2md MIT (1) 1113 2026-09-25 Go ENML→Markdown, ресурсы по MD5 reference свой ENEX на quick-xml (MIT) 0,3
Rnote, Xournal++; Joplin, Logseq, AppFlowy GPL-3.0, GPL-2.0; AGPL-3.0 (3) — — — — avoid только как пользователь —

2.3 Forms

Кандидат SPDX (класс) ★ / загр. Изм. Яз. Что даёт MOffice Стратегия Сами пишем / риски Эк.
survey-library MIT (1) 4888 2026-10-02 TS JSON-схема ≈20 типов вопросов, выражения visibleIf/enableIf/requiredIf, вычисляемые значения, валидаторы reference + порт выражений + импорт JSON SurveyJS runtime на Rust 1,5
survey-creator, survey-analytics, survey-pdf коммерческая EULA Devsoft Baltic (3/4) 1282 2026-09 TS — avoid проверено 2026-10-04 по LICENSE —
formio.js; react-jsonschema-form; jsonforms MIT; Apache-2.0; MIT (1) 2086; 15,9 тыс.; 2744 2026-09…10 JS/TS схема компонентов с JSON Logic; JSON Schema + uiSchema; правила SHOW/HIDE reference — —
jsonschema MIT (1) — / 97 млн 2026-10-02 Rust проверка JSON-представления формы и манифестов .mxt adopt — —
Выражения: meridian-calc (IronCalc); datalogic-rs; cel-interpreter MIT OR Apache-2.0; Apache-2.0; MIT (1) — / 190 тыс.; 874 тыс. 2026-10; 2025-07 Rust условия и вычисления на формулах Sheets; JSON Logic; CEL adopt (calc); запасные evalexpr — AGPL-3.0-only (3) —
formbricks, ohmyform AGPL-3.0 и др. (3) 13 тыс.; 2,9 тыс. — TS — avoid — —

2.4 MOffice Script

Кандидат SPDX (класс) ★ / загр. Изм. Яз. Что даёт MOffice Стратегия Сами пишем / риски Эк.
QuickJS-ng 0.17 MIT (1) 3852 2026-10-02 C (quickjs.c ≈65 тыс. строк) ES2023+, лимиты памяти и стека, прерывание, модули, test262 в CI adopt нет отладчика и Intl в плане
rquickjs 0.14 MIT (1) 1026 / 4,8 млн 2026-09-28 Rust (≈27,7 тыс.) безопасные обёртки, классы-макросы, загрузчики модулей, байткод, async adopt API 0.x меняется —
Boa Unlicense OR MIT (0) 7577 / 5,2 млн 2026-10-03 Rust движок без C запасной скорость ниже QuickJS (не проверено) —
oxc 0.152 MIT (1) 22,9 тыс. / 1,6 млн 2026-09-29 Rust стирание типов TS → ES2022, парсер для анализатора, isolated declarations adopt API 0.x —
swc Apache-2.0 (1) 34,2 тыс. / 6,6 млн 2026-10-02 Rust то же запасной крупнее —
tree-sitter 0.27 + tree-sitter-typescript 0.23.2, javascript, highlight MIT (1) 27 тыс. / 42,7 млн 2026-09-27 Rust/C инкрементальная подсветка, свёртка, структура в QML-редакторе adopt ABI грамматик с ядром 0.27 — проверить 1
Monaco, CodeMirror MIT (1) 46,8 тыс.; 7,8 тыс. — JS — avoid требуют WebView —
wasmtime 49 Apache-2.0 WITH LLVM-exception (1) 18,7 тыс. / 38,4 млн 2026-10-02 Rust песочница: лимиты памяти, fuel/epoch-прерывание, WASI с выданными каталогами adopt размер (Cranelift) в 2
Extism 1.30 BSD-3-Clause (1) 5770 / 731 тыс. 2026-09-02 Rust API плагинов поверх wasmtime, PDK для Rust/JS/Go/Python/C# и др. adopt — 2
wasmi; wasmer MIT OR Apache-2.0; MIT (1) — / 24 млн; 21,1 тыс. 2026-09 Rust лёгкий интерпретатор; альтернативный рантайм запасной — —
PyO3 + CPython 3.12 MIT OR Apache-2.0; PSF-2.0 (1) 16,2 тыс. / 266 млн 2026-09-30 Rust/C Python-плагин в отдельном процессе adopt сборка CPython — раздел 4 —
RustPython MIT (1) — / 41 тыс. 2026-10-02 Rust — avoid слабая совместимость с колёсами —
ovba 0.7 MIT (1) 11 / 22 тыс. 2024-12-30 Rust vbaProject.bin: распаковка [MS-OVBA], поток dir, исходники модулей adopt + форк мало сопровождающих в 2
oletools (olevba) BSD-2-Clause/MIT (1) 3422 2026-02-14 Python извлечение VBA, подозрительные ключевые слова, p-code port эвристик — —
ViperMonkey BSD-2-Clause, кроме thirdparty/ (1) 1128 2024-07-10 Python эмулятор VBA: грамматика pyparsing, семантика встроенных функций reference + port функций в vba-compat развитие остановлено —
grammars-v4 VB6 MIT (1) — — ANTLR грамматика VB6 (≈ VBA) reference для своего парсера по [MS-VBAL] — —
Rubberduck GPL-3.0 (3) — — C# — avoid — —

2.5 Совместное редактирование (MOffice Sync)

Кандидат SPDX (класс) ★ / загр. Изм. Яз. Что даёт MOffice Стратегия Сами пишем / риски Эк.
Yrs 0.28 MIT (1) 2160 / 3,8 млн 2026-09-30 Rust (≈40,6 тыс.) Text/XmlText с атрибутами, Map, Array, UndoManager с origins, StickyIndex, awareness, протокол sync, weak links adopt нет move; снимки и GC в плане
Loro 1.16 MIT (1) 6171 / 765 тыс. 2026-09-28 Rust MovableList, MovableTree, rich text, undo, снимки пилот для дерева Notes/Draw два CRDT в продукте — избегать —
Automerge MIT (1) 6633 / 663 тыс. 2026-09-30 Rust JSON-CRDT, marks (Peritext) reference нет встроенного undo —
diamond-types ISC (1) 1840 / 49 тыс. 2026-09-02 Rust Eg-walker, только текст reference крейт 1.0.0 от 2022-08 —
y-octo MIT (1) — / 59 тыс. 2026-09-22 Rust вторая реализация Yjs-совместимого CRDT (AFFiNE) reference — —
y-sweet (y-sweet-core) MIT (1) 1018 / 25 тыс. 2025-12-04 Rust сервер протокола Yjs, хранение в S3/ФС, токены доступа fork развитие замедлилось; роли commenter/viewer — свои 3,5
Hocuspocus MIT (1) 2611 2026-10-02 TS хуки аутентификации и хранения, Redis, webhooks reference — —
yrs-kvstore; y-sync (архив) MIT (1) — / 1,1 млн 2024-07; 2023-11 Rust слой хранения; старый протокол (теперь yrs::sync) reference; avoid — —

2.6 Полнотекстовый поиск и диктовка

Кандидат SPDX (класс) ★ / загр. Изм. Что даёт MOffice Стратегия Риски Эк.
tantivy 0.26 MIT (1) 16,2 тыс. / 19,2 млн 2026-09-08 единый индекс Mail/Notes/Hub, фразы, нечёткий поиск, фасеты adopt — 1
rust-stemmers MIT/BSD-3-Clause (1) — / 35,2 млн 2019-11 стемминг Snowball ru/en и ещё ≈15 языков adopt не развивается, но стабилен —
lindera; whatlang MIT (1) — / 2,5 млн; 3,6 млн 2026-09; 2025-10 токенизация CJK; определение языка документа adopt словари lindera — проверить —
SQLite FTS5 Public Domain (0) — — префиксные подсказки имён и адресов adopt (узко) второй индекс не нужен —
Meilisearch; rsmorphy BUSL-1.1 + MIT (3); MIT/Apache-2.0, словари OpenCorpora (не проверено) 59,5 тыс.; — — — avoid — —
FlyType flytype-core, flytype-protocol MIT, владелец (★) — 2026-08 правила полировки диктовки, маршрутизатор, контекст курсора own (перенос) — 4
whisper-rs + whisper.cpp + модели Whisper Unlicense (0) + MIT (1) — / 1,4 млн 2026-03-12 офлайн-распознавание на трёх ОС, пунктуация «из коробки» adopt размер моделей —
WhisperKit (argmax) MIT (1) — — офлайн на macOS (уже в FlyType) adopt (macOS) — —
sherpa-rs + sherpa-onnx MIT + Apache-2.0 (не проверено) — / 92 тыс. 2025-10 потоковые модели ONNX запасной — —
Модели Silero (TE — пунктуация) CC BY-NC-SA 4.0 (3) — — — avoid используется в punct-sidecar FlyType —

3. Глубокие разборы

3.1 Почтовый стек

Итоговая сборка mail-core (все зависимости класса 0–1):

mail-core
├── imap      imap-codec + imap-next (кодек, sans-I/O) → наш движок синхронизации (mail.md 5.1)
├── smtp      lettre (отправка готовых байт) ← mail-builder (сборка) ← rPGP / cms (подпись, шифрование)
├── mime      mail-parser (+ mbox, Maildir, thread_name) → свой TNEF
├── auth      mail-auth (DKIM/ARC/SPF/DMARC) для индикаторов антифишинга
├── dav       libdav (CalDAV/CardDAV, RFC 6764) → calcard (ics/vcf, RRULE, зоны)
├── discover  форк autoconfig из email-lib + своя база провайдеров + hickory-resolver
├── import    outlook-pst + compressed-rtf (PST), cfb (MSG), mail-parser (mbox/Maildir)
└── safe-html html5ever + свой allowlist и фильтр CSS

Stalwart: mail-parser, mail-builder, mail-send, mail-auth (все Apache-2.0 OR MIT; берём по MIT). Клон $S/stalwartlabs_mail-parser (коммит 2026-10-02, ≈23,6 тыс. строк, тексты лицензий в LICENSES/):

IMAP. Два зрелых пути: async-imap (MIT OR Apache-2.0, 1,75 млн загрузок, основа Delta Chat) и imap-codec + imap-next (MIT OR Apache-2.0; полностью типизированный кодек, sans-I/O, фаззинг). Рекомендуем второй: sans-I/O ложится на наш движок синхронизации с pending_ops (mail.md 5.1), а типизированные ответы (VANISHED (EARLIER), MODSEQ) снижают риск ошибок на «кривых» серверах. Риск: ветка 2.0 — alpha; наличие CONDSTORE/QRESYNC в кодеке нужно подтвердить по коду (не проверено). pimalaya email-lib использует как раз imap-client поверх imap-next ($S/pimalaya_core/email/Cargo.toml, email/src/imap/mod.rs, 1359 строк) — живой пример встраивания.

pimalaya/core ($S/pimalaya_core, коммит 2026-03-01, все крейты MIT, © soywod 2022–2024). Крейты: email-lib 0.27 (бэкенды IMAP, Maildir, Notmuch, SMTP, sendmail; фичи autoconfig, sync, thread, watch, oauth2, pgp), mml-lib 1.1 (язык шаблонов писем MML из Emacs), pgp-lib 1.0 (обёртка rPGP с поиском ключей WKD и keyserver), oauth-lib 2.0, keyring-lib, secret-lib, http-lib, time-lib, process-lib, rip-starttls, buf-stream, shellexpand-utils, email-macros, email-testing-server, email-tests. CalDAV/CardDAV в core нет (в клоне их нет; у pimalaya это отдельные проекты — не проверялись). Что брать:

Файлы в клоне Объём Что даёт Решение
email/src/autoconfig/{mod,config,dns}.rs 1039 строк порядок: autoconfig.<домен> → <домен>/.well-known → ISPDB онлайн → MX → TXT mailconf → SRV fork; убрать http без TLS, добавить свою базу и Autodiscover v2
oauth/src/* 415 строк Authorization Code + PKCE, loopback-редирект, обновление токена образец для mail-core::oauth поверх oauth2
pgp/src/* 1204 строки WKD (z-base-32 + SHA-1), keyserver поверх rPGP port идей WKD
email/src/email/message/template/reply/mod.rs 1427 строк шаблоны ответа и цитирования reference
email/src/email/sync/{patch,hunk,report}.rs ≈2,9 тыс. строк двусторонняя синхронизация IMAP↔︎Maildir reference для офлайн-кэша
email/src/email/envelope/thread/* 773 строки цепочки через IMAP THREAD + petgraph не JWZ — не брать
email-testing-server 243 строки тестовый сервер не брать: git-зависимость на stalwartlabs/mail-server v0.9.0 (AGPL-3.0)
фича notmuch — libnotmuch не включать: libnotmuch под GPL-3.0 (по памяти, не проверено)

iCalendar, RRULE, vCard: calcard вместо пары icalendar + rrule. Клон $P/calcard (2026-09-30, версия 0.4.0, LICENSES/{Apache-2.0,MIT}.txt): src/icalendar/{parser,writer,builder,timezone,dates}.rs, src/vcard/{parser,writer}.rs (≈25 тыс. строк вместе с datecalc), src/datecalc/recurrence.rs (6217 строк) — движок RFC 5545, портированный из bttf Эндрю Галланта (заголовок SPDX: Unlicense OR MIT), src/datecalc/error.rs — из rust-rrule (Apache-2.0 OR MIT). Даёт ровно то, что требуют mail.md 5.3 и 6.1: терпимый разбор, неоднозначные часы по RFC 5545 §3.3.5, COUNT с бюджетом итераций, зоны Windows (timezone.rs) и встроенную tzdb (фича tzdb-bundle). Дополнительно JSCalendar/JSContact (пригодятся для JMAP в P2). Сами пишем: описание правила по-русски, iTIP/iMIP-логику (REQUEST/REPLY/COUNTER, SEQUENCE), кэш экземпляров ±2 года. rust-rrule ($S/fmeringdal_rust-rrule, MIT OR Apache-2.0, 15,9 тыс. строк, последний коммит 2025-04-20) — источник тестов: rrule/src/tests/{rfc_tests,rrule, regression,daylight_saving}.rs (≈6 тыс. строк, 39 + 173 теста) переносим в корпус «2 000 RRULE» (mail.md 8.1). Для vCard: calcard (2.1/3.0/4.0); vcard4 (MIT OR Apache-2.0) — для перекрёстной сверки.

CalDAV/CardDAV: libdav. Клон $P/libdav (2026-10-02, ISC, ≈10 тыс. строк): src/sd.rs — обнаружение по RFC 6764 (SRV, TXT path=, /.well-known/caldav), src/dav/{propfind,find_collections,put_resource}.rs, src/caldav/*, src/carddav/*, src/names.rs (свойства RFC 6578 sync-collection, RFC 6638 scheduling). Сами пишем: free-busy-query (RFC 4791 §7.10), отправку приглашений через Schedule-Outbox, обходы особенностей Google и iCloud. Риск: DNS в libdav сделан на крейте domain (NLnet Labs, лицензия не проверялась), у нас — hickory; две DNS-библиотеки допустимы. Не брать: minicaldav (GPL-3.0-or-later), fast-dav-rs (LGPL-3.0).

Автонастройка без встраивания ISPDB (MPL-2.0). Порядок для мастера аккаунта: (1) своя база ≈40 провайдеров (Gmail, Outlook.com/Microsoft 365, Яндекс, Mail.ru, iCloud, Yahoo, GMX, Fastmail, Rambler, Zoho…) — составляем сами по официальной документации провайдеров (факты о серверах и портах не охраняются; XML-файлы ISPDB не копируем), храним в mail-core/providers.toml, обновляем через MOffice Update; (2) https://autoconfig.<домен>/… и https://<домен>/.well-known/autoconfig/… (http без TLS — только с предупреждением: ответ можно подменить); (3) DNS SRV по RFC 6186 и RFC 8314 (_submissions._tcp, _imaps._tcp); (4) Autodiscover v2 (P1); (5) эвристика по MX; (6) по явному согласию — онлайн-запрос к autoconfig.thunderbird.net (домен пользователя уходит в Mozilla; условия сервиса для сторонних клиентов не проверены); (7) ручной ввод. Кандидат класса 1 для своей базы — providers.xml из K-9 Mail/Thunderbird for Android (Apache-2.0 — не проверено).

OpenPGP и S/MIME. rPGP (pgp, MIT OR Apache-2.0, 6,6 млн загрузок, выпуск 2026-10-03) заменяет sequoia-openpgp (LGPL-2.0-or-later) из mail.md 2.2. Над ним пишем сами (≈1 чел.-мес.): PGP/MIME (RFC 3156), Autocrypt 1.1 (заголовки, gossip, «предпочитать шифрование»), WKD и hkps по образцу pimalaya/core/pgp. Код Delta Chat (MPL-2.0) — только чтение как референс Autocrypt. S/MIME: RustCrypto cms (SignedData/EnvelopedData), x509-cert, pkcs12 (импорт .p12), проверка цепочки с EKU emailProtection — через API ОС (SecTrust, CertGetCertificateChain) и свой код для Linux; запасной путь — openssl (Apache-2.0). Риск: cms 0.3 — pre-release.

Санитайзер HTML. ammonia 4.x тянет cssparser (MPL-2.0), поэтому пишем свой фильтр: html5ever → дерево → allowlist тегов/атрибутов из mail.md 5.6 → атрибут style и блоки <style> разбираем своим токенизатором деклараций CSS (≈400 строк по CSS Syntax Level 3) с allowlist свойств; ссылки — linkify, проверка доменов — publicsuffix, гомоглифы — unicode-security (все MIT OR Apache-2.0). ammonia 3.x (без cssparser) — референс.

Антиспам и цепочки — свои. Байес по Graham («A Plan for Spam», 2002) и Robinson (χ²-комбинирование, 2003) уже описан в mail.md 5.7; rspamd (Apache-2.0) — источник идей признаков (не встраиваем), bayespam (MIT) — минимальный образец. Цепочки — JWZ по описанию на jwz.org (mail.md 5.2) + thread_name() из mail-parser.

PST, MSG, mbox. Клон $P/outlook-pst-rs (Microsoft, MIT, коммит 2026-09-14; README называет его реализацией [MS-PST] «чистой комнаты», совместимой с mspst32.dll): crates/pst/src/ndb/{header,root,page,block,node_id,block_id}.rs (заголовки ANSI и Unicode, B-деревья NBT/BBT, блоки XBLOCK/SLBLOCK), src/ltp/{heap,tree,prop_context,table_context, prop_type}.rs (HN, BTH, PC, TC), src/messaging/{store,folder,message,attachment,named_prop,search}.rs, src/encode/{permute,cyclic}.rs, src/crc.rs; crates/compressed-rtf — [MS-OXRTFCP]. Только чтение (плюс восстановление AMap). Это закрывает слои NDB/LTP/Messaging из mail.md 6.3; наш слой «Преобразование» (≈2 чел.-мес.): MAPI → MIME (PidTagTransportMessageHeaders, тела HTML/RTF/текст, кодовые страницы), HTML из RTF по [MS-OXRTFEX], встречи → VEVENT (PidLidAppointmentRecur → RRULE по [MS-OXOCAL]), контакты → vCard, задачи → VTODO. OST 2013+ (страницы 4 КБ) библиотека не читает — оставляем R*. MSG: тот же слой свойств поверх cfb (MIT) по [MS-OXMSG]; msg_parser (MIT, 10★) — только сверка. Запасной путь через libpff (LGPL-3.0) из mail.md 9 больше не нужен.

3.2 Notes: перо, поиск, импорт OneNote/Evernote, холст

Перо: ink-stroke-modeler → порт на Rust. Клон $S/google_ink-stroke-modeler (Apache-2.0, коммит 2026-08-02): публичный API — ink_stroke_modeler/{stroke_modeler,params,types}.{h,cc}; ядро — internal/wobble_smoother.cc (подавление дрожания), internal/position_modeler.cc (модель «пружины с массой» — перо тянет кончик), internal/stylus_state_modeler.cc (давление, наклон, ориентация по проекции на сглаженную линию), internal/loop_contraction_mitigation_modeler.cc (убирает «петли» на резких поворотах), internal/prediction/{kalman_predictor,stroke_end_predictor}.cc + kalman_filter/. Всего ≈4,1 тыс. строк C++ без тестов, зависимость — Abseil. Тащить C++ и Abseil в сборку ради 4 тыс. строк невыгодно: порт на Rust в notes-model::ink ≈1 чел.-мес. (стартовая точка — ink-stroke-modeler-rs, MIT OR Apache-2.0, «частичная переписка»), в заголовках файлов — «основано на ink-stroke-modeler, © Google LLC, Apache-2.0», в NOTICE — текст Apache. Что меняется в notes.md 5.3: шаги 1 (One-Euro) и 6 (линейная экстраполяция) заменяются моделятором с Kalman-предсказанием; RDP-прореживание и тайловый кэш остаются нашими; построение контура — по алгоритму perfect-freehand (MIT, Стив Руиз: streamline, thinning, сужение концов; ≈500 строк TS → Rust) или текущим offset-путём из notes.md. Тот же модуль использует Paint (стабилизатор кисти) — общий крейт.

Поиск: tantivy. Индекс по схеме notes.md 4.6 и mail.md 5.10 (один индекс на профиль, поле kind). Токенизатор meridian_ru_en = SimpleTokenizer → LowerCaser → стеммер Snowball (rust-stemmers, MIT/BSD-3-Clause) по языку поля, язык документа — whatlang (MIT); для CJK — lindera (MIT). Нечёткий поиск — FuzzyTermQuery (расстояние 1–2), транслит — отдельное поле. Морфологию «как у pymorphy» не берём: rsmorphy использует словари OpenCorpora (по памяти — CC BY-SA, не проверено) — для встраиваемых данных это класс 3.

OneNote. Клон $S/msiemens_onenote.rs (MPL-2.0, onenote_parser 2.0, коммит 2026-08-06, ≈18,8 тыс. строк): crates/parser/src/onestore/{desktop,fsshttpb,shared} — контейнер [MS-ONESTORE] в двух упаковках (файл десктопа и загрузка из OneDrive, FSSHTTP), src/one/property_set/* — 33 типа узлов [MS-ONE] (page_node, outline_*, rich_text_node, ink_*, table_*, image_node, embedded_file_*, math_inline_object, note_tag_*), src/onenote/* — удобный API (книжка → разделы → страницы → контуры, штрихи, таблицы). Не пишет файлы и не распаковывает .onepkg (это CAB — крейт cab, MIT). Объём своего парсера той же полноты — 6–7 чел.-мес. Варианты — в разделе 4.

Evernote ENEX — свой парсер. ENEX — XML: <en-export> → <note> (title, content в CDATA с ENML, created, updated, tag, note-attributes), <resource> (data base64, mime, resource-attributes/file-name, recognition); в ENML — <en-media hash="MD5">, <en-todo checked>, <en-crypt>. Реализация на quick-xml (MIT)

Холст. Excalidraw (MIT, 133 тыс. ★) — референс модели элементов (привязки стрелок к фигурам, группы, рамки) и порядка элементов по дробным индексам (fractional-indexing, по памяти — не проверено по коду), что совпадает с рекомендацией для CRDT в 3.5. Lorien (MIT, Godot) — референс бесконечного холста и формата штрихов. tldraw — запрещён (лицензия с водяным знаком). Своя работа остаётся прежней: раскладка контейнеров, автосдвиг, лассо (notes.md 5.1–5.4).

3.3 Forms: схема вопросов и логика

Что брать из SurveyJS. Только survey-library (Form Library, MIT, 4888★, коммит 2026-10-02). Конструктор (survey-creator), сводки (survey-analytics) и PDF (survey-pdf) — под коммерческой EULA Devsoft Baltic (проверено 2026-10-04 по файлам LICENSE): не подключать и не копировать. Ценность survey-library для нас — отработанная за 10 лет JSON-схема и язык условий; код рендера (React/Angular/Vue) не нужен.

Соответствие типов forms.md 2.1 и SurveyJS (по документации SurveyJS, по коду не сверялось):

MOffice SurveyJS MOffice SurveyJS
short-text (+ email/phone/url/number) text (inputType) likert, matrix matrix, matrixdropdown, matrixdynamic
long-text comment ranking ranking
single-choice, multi-choice radiogroup, checkbox (showOtherItem, showNoneItem) signature signaturepad
dropdown dropdown, tagbox section, description panel, html
scale, rating, nps rating (rateMin/rateMax, звёзды) consent, yes-no boolean
date, time, datetime, number text с inputType file file
page-break pages[] вычисляемое поле (P1) expression, calculatedValues

Логика. Условия SurveyJS (visibleIf, enableIf, requiredIf, триггеры complete/skip/setvalue) — выражения вида {age} >= 18 and {q3} anyof ['a','b'] с функциями iif, age, sum, today и др. В MOffice forms.md 2.2 уже решил: условия и вычисляемые поля — на движке формул Sheets (meridian-calc на базе IronCalc, MIT OR Apache-2.0); ссылки {qN} становятся переменными формулы, функции SurveyJS отображаются на формулы (iif → IF, age → DATEDIF(…;TODAY();"Y")). Так выражения проверяются тем же кодом на десктопе, в WASM-рантайме веба и на сервере. Ветвление по страницам — своя модель правил перехода с проверкой графа (forms.md 5.1). Запасные движки выражений класса 1 — datalogic-rs (JSON Logic, Apache-2.0) и cel-interpreter (MIT); evalexpr — AGPL-3.0-only, запрещён.

JSON Schema и формы расширений. formio.js (MIT) хранит условия как JSON Logic, react-jsonschema-form (Apache-2.0) и jsonforms (MIT) строят формы из JSON Schema + uiSchema (правила SHOW/HIDE). Для опросов это слабее модели SurveyJS, но для диалогов настроек расширений MOffice Script (03-architecture.md §9.3, «декларативная JSON-форма») формат «JSON Schema + uiSchema» — привычный стандарт: предлагаем его подмножество с рендером на QML-компонентах Forms. Проверка — крейт jsonschema (MIT).

Рекомендация. Своя модель .mfx (XML, forms.md 4.2) + JSON-представление с именами свойств, близкими к SurveyJS (visibleIf, requiredIf, choices, validators); импорт JSON SurveyJS в .mfx — P1 (≈0,5 чел.-мес., открывает миграцию с SurveyJS и конвертеров Google Forms). Экономия ≈1,5 чел.-мес. — проектирование схемы, набор типов и тест-кейсы логики берём готовыми.

3.4 MOffice Script: движок, TypeScript, подсветка, песочница, Python, VBA

Встраивание QuickJS-ng через rquickjs (клоны $S/quickjs-ng_quickjs — MIT, 0.17.0, коммит 2026-10-02; $S/DelSkayn_rquickjs — MIT, 0.14.0, ≈27,7 тыс. строк). Схема из 03-architecture.md §9.5 реализуется штатными средствами (проверено по коду):

Требование Чем закрывается Где в клоне
память 64–256 МБ, стек 1 МБ Runtime::set_memory_limit, set_max_stack_size, set_gc_threshold, memory_usage() rquickjs/core/src/runtime/base.rs:158–200; quickjs.h:515–521
«скрипт не отвечает» через 5 с Runtime::set_interrupt_handler — замыкание вызывается движком периодически, true бросает неперехватываемое исключение runtime/base.rs:120–127; JS_SetInterruptHandler в quickjs.h:1191
модули только из пакета .mxt Runtime::set_loader(resolver, loader); свои Resolver/Loader читают только ZIP пакета; встроенный модуль meridian — ModuleLoader::with_module core/src/loader/{builtin_resolver,module_loader,bundle,compile}.rs
без eval/Function в продакшене контекст собирается из выбранных intrinsics (ContextBuilder); надёжнее — грузить только байткод, скомпилированный при установке, и удалять глобальные eval/Function core/src/context/builder.rs:59–88
Promise ↔︎ async Rust, поток вне UI AsyncRuntime/AsyncContext, idle(), execute_pending_job() core/src/runtime/{async,base}.rs
прокси-объекты API (Range, Cell) макросы #[rquickjs::class], #[rquickjs::methods] macro/, пример examples/class-methods

Два пробела, которых нет в библии: (1) отладчика в QuickJS-ng нет — в quickjs.h нет API точек останова и шагов, а 03-architecture.md §9.5 рассчитывает на «QuickJS-ng debug API». Варианты: свой патч движка (форк MIT допустим; хук по таблице номеров строк) — 1,5–2 чел.-мес.; движок Boa (Unlicense OR MIT, класс 0) — наличие отладки не проверено. (2) Intl не поддерживается (docs/docs/es_features.md: «unlikely … will ever support Intl») — даём meridian.intl поверх ICU4X (числа, даты, сортировка) ≈0,5 чел.-мес.

TypeScript: oxc, а не swc. 03-architecture.md §9.5 выбрал oxc (MIT), а 08-roadmap.md E1.9 говорит о «встроенном swc-подмножестве» — расхождение, предлагаем закрепить oxc: oxc_parser → oxc_semantic → oxc_transformer (стирание типов, цель ES2022) → oxc_codegen (с source map для стеков ошибок); oxc_isolated_declarations генерирует .d.ts для пакетов магазина; тот же парсер — основа лёгкого анализатора автодополнения. Риск — API 0.x (0.152): закрепить версию, обновлять раз в квартал.

Подсветка без WebView: tree-sitter. tree-sitter 0.27 + грамматики tree-sitter-typescript 0.23.2 (TS и TSX), tree-sitter-javascript, при Python-плагине — tree-sitter-python, и tree-sitter-highlight (все MIT). Схема в QML-редакторе: на каждую правку — tree.edit() и инкрементальный parser.parse(text, Some(&old_tree)), запросы highlights.scm → спаны → токены темы MDS; locals.scm/tags.scm — структура и переход к определению. Monaco и CodeMirror не годятся — требуют WebView, который 03-architecture.md §9.3 запрещает. Риск: совместимость ABI грамматик (выпуск 2024-11) с ядром 0.27 — проверить на прототипе.

Песочница плагинов: WASM вместо C ABI. 08-roadmap.md E7.5 планирует «плагины на Rust/C++ (ABI через C, подписанные)» — это нативный код без изоляции. Предлагаем основным путём WASM: wasmtime (Apache-2.0 WITH LLVM-exception) даёт лимиты памяти (StoreLimits), времени (fuel или epoch-прерывание) и WASI с доступом только к выданным каталогам (соответствует праву files.path:<glob>); Extism (BSD-3-Clause) добавляет готовый плагин-API (манифест с лимитами памяти, таймаутом, разрешёнными хостами и путями) и PDK для Rust, Go, C, JS, Python и др. Хост-функции = подмножество meridian.* с проверкой прав §9.4. wasmi (MIT OR Apache-2.0) — лёгкий интерпретатор без JIT для маленьких плагинов. Нативный C ABI оставить только для подписанных Enterprise-модулей (ГОСТ через КриптоПро). Экономия ≈2 чел.-мес.: не нужен свой песочный процесс с IPC для нативных плагинов и свой PDK.

Python (опционально). PyO3 (MIT OR Apache-2.0) встраивает CPython 3.12 (PSF-2.0, класс 1) в процесс meridian-python-host (§9.8). Сборку python-build-standalone, указанную в архитектуре, публикуют под MPL-2.0 (скрипты и патчи; проверено 2026-10-04) — см. раздел 4. RustPython (MIT) не подходит: колёса с C-расширениями не работают.

VBA. Извлечение: ovba (MIT, проверено по LICENSE 2026-10-04) читает vbaProject.bin — CFB, распаковка [MS-OVBA], поток dir, исходники модулей; держим форк (11★, мало сопровождающих). Эвристики «опасных» макросов при открытии .docm/.xlsm (AutoOpen, Shell, CreateObject, Declare) — порт таблиц ключевых слов из olevba (oletools, BSD-2-Clause). Транслятор VBA → TS (03-architecture.md §9.7): грамматика — по открытой спецификации [MS-VBAL] с проверкой на грамматике VB6 из antlr/grammars-v4 (ProLeap, MIT — проверено по заголовку VisualBasic6Parser.g4); семантика встроенных функций (Mid, InStr, Format, DateAdd, Like и т.п.) для библиотеки vba-compat — по ViperMonkey (BSD-2-Clause по заголовку vipermonkey/vmonkey.py, кроме папки thirdparty/; развитие остановлено в 2024). Rubberduck (лучший парсер VBA, GPL-3.0) — запрещён.

3.5 CRDT и сервер синхронизации

Числа производительности — из открытого набора dmonad/crdt-benchmarks (README, проверено 2026-10-04): версии yjs 13.6.11, ywasm 0.9.3 (Yrs в WASM), loro 0.10.1, automerge 2.1.10; Node 20.5, Intel i5-8400. Версии старые, автор набора — создатель Yjs; для решения нужен свой замер на прототипе I21. B4 — реальная запись набора статьи (≈260 тыс. правок, по одной на транзакцию).

Критерий Yrs (Yjs) Loro Automerge diamond-types
Лицензия, зрелость MIT; 0.28, 3,8 млн загрузок; экосистема Yjs 22,9 тыс. ★ MIT; 1.16, формат стабилен с 1.0; 765 тыс. загрузок MIT; 663 тыс. загрузок; 6,6 тыс. ★ ISC; крейт 1.0.0 от 2022-08, репозиторий живой; исследовательский
Размер истории, B4 docSize 159 929 Б (Yjs и ywasm) 258 228 Б 129 116 Б нет в наборе (статья Eg-walker заявляет компактность — не проверено)
Время B4, применение по одной правке Yjs 5,7 с; ywasm 28,7 с 3,1 с 14,3 с нет в наборе
Загрузка документа B4 parseTime Yjs 39 мс; ywasm 16 мс 13 мс (со снимком) 1 805 мс —
B4 × 100: время / размер Yjs 609 с / 16,0 МБ; ywasm 2 830 с / 16,0 МБ 310 с / 25,8 МБ не выполнен —
Undo «только своих» правок да: UndoManager с tracked origins (yrs/src/undo.rs, 2225 строк) да (UndoManager) нет, делает приложение нет
Rich text да: Text::format, insert_embed (types/text.rs:301–372), XmlText да: стили со смыслом Peritext да: marks (Peritext) нет, только текст
Перемещение элементов и узлов нет (в types/array.rs нет move) да: MovableList, MovableTree нет нет
Протокол и сервер sync v1 + awareness в yrs/src/sync/{protocol,awareness}.rs; y-sweet, Hocuspocus, y-websocket свой automerge-repo (JS) нет
Прочее weak links/цитаты (types/weak.rs), StickyIndex для курсоров снимки с быстрой загрузкой JSON-модель алгоритм Eg-walker

Рекомендация: оставить Yrs (как в библии и 03-architecture.md §5). Довод — не скорость, а экосистема и уже спроектированная архитектура: undo по origins (§5.3), XmlText для абзацев Write, awareness и протокол, готовые серверы, будущий веб-просмотрщик на Yjs. Слабое место — нет move: notes.md 5.8 предполагает «Y.Array с переупорядочиванием через move» для порядка страниц, а Draw/Slides двигают фигуры между группами. Решение без второго CRDT: порядок — дробные индексы (строковый ключ порядка в Map, как в Figma и, по памяти, в Excalidraw); перенос узла между родителями — поле parent с детерминированным разрешением циклов по алгоритму Kleppmann et al. («A highly-available move operation for replicated trees», 2021) — ≈1 чел.-мес. в meridian-history. Loro держать запасным: пилот в I21 только если дерево Notes/Draw на Yrs окажется тяжёлым; два CRDT в одном продукте не вводить. Automerge и diamond-types — референсы.

Сервер: форк y-sweet, идеи Hocuspocus. y-sweet (MIT, Rust, 1018★) — сервер протокола Yjs с хранением снимков и обновлений в S3 или на диске, токенами доступа к документу и ядром без ввода-вывода (y-sweet-core), то есть ровно CRDT-часть cloud-service из 03-architecture.md §5.7. Дописываем: роли commenter/viewer с проверкой затронутых корневых типов в каждом Update, CBOR-заголовки кадров, журнал doc_updates в PostgreSQL, Rebase для базовых снимков Sheets, горизонтальное масштабирование через Redis pub/sub (идея расширения Redis из Hocuspocus). Hocuspocus (MIT, Node.js, 2611★) — референс хуков onAuthenticate, onLoadDocument, onStoreDocument с отложенной записью, onChange и webhooks; код не берём (другой язык). Риск: последний коммит y-sweet — 2025-12-04 (развитие замедлилось), поэтому именно форк, а не зависимость. Экономия ≈3,5 чел.-мес.

3.6 Собственный код владельца: FlyType и voice-agent

FlyType (~/Mac1amoros/FlyType, MIT © 2026 FlyType, выпуск v1.18.1). Это гибрид: нативные клиенты (macOS на Swift с WhisperKit офлайн; Windows с системным распознаванием офлайн; Android, iOS), бэкенд на Go (шлюз WSS/REST, STT-сайдкар Whisper/Groq, «полировка» с LLM), Hub на Next.js. Rust-часть небольшая, но это эталон правил:

Крейт / файл Объём Что внутри Что переносим в MOffice
crates/flytype-core/src/polish/* ≈1,5 тыс. строк детерминированная цепочка без LLM: эхо STT → «галлюцинации» Whisper на тишине → сниппеты → словарь → слова-паразиты → самоисправления («нет, то есть…») → форматирование → пунктуация по паузам сегментов → пунктуация с учётом текста до и после курсора → исправление опечаток целиком, в крейт meridian-dictation (fork в монорепозиторий)
crates/flytype-core/src/engine/{mod,router}.rs 241 строка трейт DictationEngine, resolve_engine(RouterInput{mode, online, authenticated, subscription_ok}) → облако или локально целиком; subscription_ok = функция редакции из MOffice License
crates/flytype-core/src/audio/mod.rs 83 строки PCM S16LE, 16 кГц, моно; проверка чанков целиком
crates/flytype-protocol/src/{context,messages,error}.rs ≈370 строк DictationContext: AppContext (приложение, категория), TextboxContext (до курсора, выделение, после), WritingStyle (Casual/Formal/Code/Excited), словарь; сообщения REST/WSS контекст — из модели документа; протокол — для онлайн-диктовки через MOffice Cloud (фаза 6)
crates/flytype-ffi 201 строка C ABI (staticlib) для Swift не нужен (cxx-qt)
punct-sidecar (Python) — пунктуация моделью Silero TE через torch.hub не переносить: модели Silero — CC BY-NC-SA 4.0 (проверено 2026-10-04 по LICENSE snakers4/silero-models), класс 3

Как это ложится на MOffice: (1) Write/Notes/Mail → «Диктовка» — TextboxContext заполняется точно из модели документа (абзац до и после каретки, выделение), а не через Accessibility, как в FlyType; категория — write/notes/ mail; стиль — Formal для писем и официальных документов. (2) Офлайн на трёх ОС — whisper.cpp (MIT) через whisper-rs (Unlicense, 1,4 млн загрузок) и модели Whisper (MIT); на macOS — WhisperKit (MIT, уже в FlyType). Пунктуацию Whisper ставит сам, правила polish/punctuation.rs и pause.rs доводят её — замена Silero не нужна. (3) Расшифровка аудио в Notes — запись → Whisper с таймкодами сегментов → абзацы по паузам (pause.rs) → страница с аудиовложением и привязкой «время → абзац» (как аудиозаметки OneNote); диаризация — P2. (4) Онлайн — сервис диктовки в MOffice Cloud по протоколу flytype-protocol либо вход в аккаунт FlyType — решение владельца (бизнес). Экономия ≈4 чел.-мес.: ≈2 — правила и тесты, отлаженные на реальной диктовке RU/EN, ≈2 — готовая схема сервиса и протокола.

voice-agent (~/Mac1amoros/voice-agent, Python, ≈6,5 тыс. строк, файла лицензии нет — собственный код владельца). Код не переносим (другой язык, зависимости на облачные сервисы), берём проверенные идеи для MOffice Assist (фаза 7) и Mail:

  1. Журнал внешних действий (effect_outbox.py): у каждого внешнего сервиса — свой идемпотентный адаптер; после неоднозначного сетевого сбоя действие получает статус unknown и сверяется, а не повторяется вслепую. Применить к очереди отправки Mail (mail.md 5.9 повторяет отправку при сетевой ошибке — риск дублей; перед повтором искать письмо в «Отправленных» по Message-ID) и к действиям Assist (письмо, событие).
  2. Одно ядро для GUI, CLI и MCP с общими схемами инструментов и правами; ролевые пресеты задают максимальный набор возможностей → профили Assist поверх прав MOffice Script (§9.4).
  3. Бюджеты токенов и денег (ставки, суточный лимит) → политика Assist для организаций.
  4. Отмена задачи с отбрасыванием поздних событий, потоковый ответ как черновик, оценка результата пользователем («да / нет с причиной / пропустить») → метрика качества Assist.
  5. Голосовой цикл: запись → STT → ответ → озвучивание с перебиванием (energy-VAD, pre-roll), учёт фактически прослушанной части ответа → голосовой режим Assist (P2).
  6. MCP-мост (13 инструментов через loopback API, без секретов; ожидание задачи с таймаутом без отмены) → предложение: MOffice как MCP-сервер для внешних агентов (документы, почта, календарь) в рамках прав (фаза 7). Не переносить: edge-tts (по памяти LGPL-3.0 — не проверено; к тому же неофициальный сервис Microsoft), распознавание Google через SpeechRecognition (неофициальный ключ).

4. Класс 2 — решения владельца с альтернативами

№ Компонент (лицензия) Зачем был бы нужен Альтернативы класса 0–1 Рекомендация
1 onenote_parser / onenote.rs (MPL-2.0) импорт .one/.onetoc2 в Notes (P1, R*) (а) свой парсер по [MS-ONESTORE]/[MS-ONE] — 6–7 чел.-мес.; (б) импорт облачных книжек через Microsoft Graph (страницы как HTML; нужен OAuth и сеть); (в) перенести .one на 3.x Одобрить как немодифицированную зависимость в песочном процессе кодеков: копилефт MPL — пофайловый, наш код не затрагивает; обязанности — сообщить, где взять исходники MPL-файлов, и публиковать правки только этих файлов (вносить их в upstream). При отказе — (б) в 3.0 и (а) в 3.x
2 cssparser, selectors (MPL-2.0) — транзитивно через ammonia 4.x, css-inline, lol_html санитайзер HTML писем, перенос <style> в inline свой фильтр inline-CSS поверх html5ever (≈0,5 чел.-мес.); ammonia 3.x без cssparser Не брать, писать своё: объём мал, а санитайзер — граница безопасности, которую лучше владеть целиком
3 Thunderbird ISPDB (MPL-2.0, данные) автонастройка почтовых аккаунтов своя база ≈40 провайдеров по документации провайдеров; DNS SRV (RFC 6186); autoconfig.<домен>; providers.xml K-9 (Apache-2.0 — не проверено) Данные не встраивать; онлайн-запрос к autoconfig.thunderbird.net — только по согласию пользователя, записью в реестре (это обращение к сервису, а не распространение данных)
4 python-build-standalone (MPL-2.0: скрипты и патчи CPython) сборка CPython для Python-плагина (03-architecture.md §9.8) свои скрипты сборки CPython из исходников PSF; на Windows — официальный embeddable-архив python.org (PSF) Своя сборка (≈0,5 чел.-мес.); PBS — только как пример конфигурации, патчи не копировать
5 Qt WebEngine (LGPL-3.0/GPL-3.0 + Chromium) «полный рендер» HTML-писем по кнопке (mail.md 5.6) собственный рендер (основной путь) + «Открыть во внешнем браузере» Решить вместе с вопросом Qt в фазе 0; до решения — внешний браузер
6 libpff/pffexport (LGPL-3.0) эталон сверки PST в CI и запасной FFI (mail.md 6.3, 9) outlook-pst (MIT); эталон — выгрузка из настоящего Outlook на ферме Windows VM (08-roadmap.md 1.3) FFI убрать; для CI достаточно Outlook-эталонов, решение по pffexport не требуется
7 sequoia-openpgp, sequoia-autocrypt (LGPL-2.0-or-later) OpenPGP (mail.md 2.2) rPGP (pgp, MIT OR Apache-2.0) Заменить в mail.md; решение не требуется
8 fast-dav-rs (LGPL-3.0), ical.js (MPL-2.0), libical (LGPL/MPL) CalDAV, iCalendar libdav (ISC), calcard (Apache-2.0 OR MIT) Не нужны
9 Delta Chat core (MPL-2.0) образец Autocrypt поверх rPGP спецификация Autocrypt 1.1 Только чтение как референс, код не копировать

5. Запрещено (класс 3) и замены

Проект Лицензия Где возникает соблазн Замена
sieve-rs (Stalwart) AGPL-3.0-only (проверено 2026-10-04) перевод правил Mail в Sieve (mail.md 5.11) свой генератор и разборщик подмножества RFC 5228 (≈0,5 чел.-мес.)
Stalwart mail-server, в т.ч. через email-testing-server из pimalaya AGPL-3.0 / собственная тестовый IMAP/SMTP/JMAP-сервер в CI — только внешний Docker-контейнер как «чёрный ящик» без линковки (нужна оговорка в политике, раздел 7); Dovecot и Radicale — так же
minicaldav GPL-3.0-or-later CalDAV-клиент libdav (ISC)
evalexpr AGPL-3.0-only (проверено 2026-10-04) выражения Forms и правил формулы meridian-calc; datalogic-rs (Apache-2.0); cel-interpreter (MIT)
Модели Silero (TE, STT, TTS кроме базовых CIS-TTS) CC BY-NC-SA 4.0 / CC BY-NC (проверено 2026-10-04) пунктуация диктовки (punct-sidecar FlyType) Whisper (MIT) + правила flytype-core
SurveyJS Creator, Dashboard (survey-analytics), PDF Generator (survey-pdf) коммерческая EULA Devsoft Baltic конструктор, сводки, PDF-формы свой конструктор на QML, сводка на MOffice Chart, PDF AcroForm через кодек PDF
formbricks, ohmyform AGPL-3.0 (+ CC BY-NC у formbricks) веб-опросы Forms + MOffice Cloud
Joplin, Logseq, AppFlowy AGPL-3.0 заметки только сверка UX как пользователь
Rnote, Xournal++ GPL-3.0, GPL-2.0 перо и рукописный холст ink-stroke-modeler (порт), perfect-freehand
tldraw собственная лицензия с водяным знаком бесконечный холст Excalidraw (MIT) как референс
Meilisearch BUSL-1.1 + MIT поиск tantivy
Rubberduck VBA GPL-3.0 парсер VBA [MS-VBAL] + грамматика VB6 (MIT) + ViperMonkey (BSD-2-Clause)
libnotmuch (фича notmuch в email-lib) GPL-3.0 (по памяти — не проверено) индекс Maildir фичу не включать; индекс — tantivy
Словари OpenCorpora (через rsmorphy) CC BY-SA (по памяти — не проверено) морфология русского стемминг Snowball (rust-stemmers)

6. Что переносим кодом

Правило атрибуции (12-license-policy.md): MIT/BSD/ISC — копирайт и текст лицензии в «О программе → Лицензии» и NOTICE; Apache-2.0 — то же плюс перенос upstream-файла NOTICE (если есть) и пометка изменений в изменённых файлах; при порте — заголовок «основано на <проект>, © <автор>, » в каждом файле; двойные лицензии Apache-2.0 OR MIT берём по MIT. Unlicense и 0BSD обязательств не дают.

Источник (лицензия) Что берём Куда в MOffice Способ NOTICE / заголовок
outlook-pst, compressed-rtf (MIT) крейты crates/pst, crates/compressed-rtf целиком codecs/mail/pst, codecs/mail/msg adopt (версия закреплена) © Microsoft Corporation, MIT
mail-parser, mail-builder (Apache-2.0 OR MIT) разбор MIME, mbox/Maildir, thread_name(); сборка писем codecs/mail/mime, mail-core adopt © Stalwart Labs LLC, MIT
mail-auth, mail-send (Apache-2.0 OR MIT) проверка DKIM/ARC/SPF/DMARC; запасной SMTP mail-core::auth adopt © Stalwart Labs LLC, MIT
lettre (MIT) SMTP-транспорт mail-core::smtp adopt © авторы lettre, MIT
imap-codec, imap-next (MIT OR Apache-2.0) кодек и потоки протокола IMAP mail-core::imap adopt © авторы imap-codec, MIT
calcard (Apache-2.0 OR MIT), внутри — код bttf (Unlicense OR MIT) и rust-rrule (Apache-2.0 OR MIT) iCalendar, vCard, RRULE, зоны codecs/{ical,vcard}, pim-store adopt © Stalwart Labs LLC; © Andrew Gallant; © Fredrik Meringdal, Ralph Bisschops — MIT
rust-rrule (MIT OR Apache-2.0) тесты rrule/src/tests/*.rs корпус RRULE в tests/ port тестов © Fredrik Meringdal и др., MIT
libdav (ISC) клиент CalDAV/CardDAV, обнаружение RFC 6764 mail-core::dav adopt © Hugo Osvaldo Barrera, ISC
email-lib autoconfig, oauth-lib, pgp-lib (MIT) email/src/autoconfig/* (1039 строк); идеи loopback/PKCE и WKD mail-core::{discover,oauth}, meridian-crypto::openpgp fork модуля / port идей © soywod (Clément Douin), MIT
rPGP pgp (MIT OR Apache-2.0) OpenPGP meridian-crypto::openpgp adopt © авторы rPGP, MIT
RustCrypto cms, x509-cert, pkcs12 (Apache-2.0 OR MIT) CMS, X.509, PKCS#12 meridian-crypto::smime adopt © RustCrypto Developers, MIT
html5ever, linkify, publicsuffix, unicode-security, hickory-resolver, oauth2 (MIT OR Apache-2.0) разбор HTML, ссылки, домены, гомоглифы, DNS, OAuth codecs/html, mail-core adopt по каждому крейту, MIT
ink-stroke-modeler (Apache-2.0) ink_stroke_modeler/** без тестов, ≈4,1 тыс. строк C++ notes-model::ink (общий с Paint) port на Rust (старт — ink-stroke-modeler-rs, MIT OR Apache-2.0) «основано на ink-stroke-modeler, © Google LLC, Apache-2.0» + текст Apache в NOTICE
perfect-freehand (MIT) алгоритм getStroke (≈500 строк TS) scene::ink_outline port © Stephen Ruiz Ltd, MIT
quick-xml, cab (MIT) разбор XML ENEX; распаковка .onepkg codecs/{enex,onenote} adopt MIT
onenote.rs onenote_parser (MPL-2.0) — только при одобрении крейт crates/parser без изменений codecs/onenote в песочном процессе adopt как есть MPL-2.0: ссылка на исходники в «О программе»; правки — только upstream
tantivy, rust-stemmers, lindera, whatlang (MIT; MIT/BSD-3-Clause) индекс, стемминг, CJK, язык search adopt MIT; для стеммеров — также BSD-3 Snowball
survey-library (MIT) имена и семантика свойств схемы, грамматика выражений для импорта forms-model::{schema,import_surveyjs} reference + port разбора выражений © Devsoft Baltic OÜ, MIT
jsonschema (MIT) проверка JSON forms-model, meridian-script::manifest adopt MIT
QuickJS-ng (MIT), rquickjs (MIT) движок JS и обёртки meridian-script adopt; патч отладчика — в своём форке © Fabrice Bellard, Charlie Gordon, Ben Noordhuis; © авторы rquickjs — MIT
oxc (MIT) oxc_parser, oxc_semantic, oxc_transformer, oxc_codegen, oxc_isolated_declarations meridian-script::ts adopt © авторы oxc, MIT
tree-sitter + грамматики TS/JS/Python + highlight (MIT) разбор и подсветка shell/editor adopt MIT
wasmtime (Apache-2.0 WITH LLVM-exception), Extism (BSD-3-Clause) рантайм и API плагинов meridian-plugins adopt Apache-2.0 + NOTICE; BSD-3
PyO3 (MIT OR Apache-2.0) + CPython (PSF-2.0) встроенный Python meridian-python-host adopt; сборка CPython — своя MIT; PSF License Agreement
ovba (MIT) чтение vbaProject.bin codecs/ooxml/vba adopt + форк © Tim Weis, MIT
oletools/olevba, ViperMonkey (BSD-2-Clause) таблицы опасных ключевых слов; семантика функций VBA codecs/ooxml/vba::scan, script/vba-compat port © Philippe Lagadec, BSD-2-Clause
grammars-v4 VisualBasic6 (MIT) грамматика VB6 для сверки script/vba-translator (тесты парсера) reference © Ulrich Wolffgang (ProLeap), MIT
Yrs (MIT) CRDT meridian-history, meridian-sync adopt MIT
y-sweet, y-sweet-core (MIT) сервер протокола Yjs, хранение в S3/ФС, токены services/cloud-service/sync fork © Jamsocket (Drifting in Space), MIT
whisper-rs (Unlicense), whisper.cpp и модели Whisper (MIT), WhisperKit (MIT, macOS) офлайн-распознавание meridian-dictation::local adopt MIT (whisper.cpp, OpenAI Whisper, argmax)
FlyType flytype-core, flytype-protocol (MIT, владелец) правила полировки, маршрутизатор, аудио, контекст meridian-dictation fork в монорепозиторий собственный код владельца — можно перелицензировать

7. Предложения в библию и план

Лицензионные правки (обязательные):

  1. docs/apps/mail.md 2.2: OpenPGP — rPGP (pgp, MIT OR Apache-2.0) вместо sequoia-openpgp (LGPL-2.0-or-later); PGP/MIME, Autocrypt, WKD — свои поверх rPGP.
  2. docs/research/component-map.md, строка Mail: ammonia 4.x — не класс 1 (тянет cssparser/selectors, MPL-2.0); санитайзер — свой на html5ever. Заменить icalendar + rrule на calcard, добавить imap-codec/imap-next (async-imap — запасной), libdav, RustCrypto cms; строку «Форматы / PST» — outlook-pst (MIT, adopt) вместо «свой по [MS-PST]».
  3. docs/12-license-policy.md §6 «Модели ИИ»: явно записать Whisper (MIT) — разрешён, модели Silero (CC BY-NC / BY-NC-SA) — запрещены; добавить оговорку (решение владельца): сторонние серверы класса 2–3 (Stalwart, Dovecot) допустимы в CI только как внешние контейнеры без линковки и распространения.
  4. docs/12-license-policy.md §5: cargo deny проверяет и транзитивные зависимости; MPL-2.0 — только через exceptions с записью в реестре (сразу поймает cssparser и подобное).
  5. docs/apps/mail.md 6.3 и 9: убрать запасной путь FFI к libpff (LGPL-3.0); сверка PST — с выгрузкой настоящего Outlook на ферме Windows VM.

Технические правки: 6. 03-architecture.md §9.5: в QuickJS-ng нет API отладчика и нет Intl. Добавить задачи: патч отладчика в своём форке движка (1,5–2 чел.-мес., к Script API 1.0 в релизе 1.6) и модуль meridian.intl на ICU4X (0,5 чел.-мес.). 7. 08-roadmap.md E1.9: «встроенное swc-подмножество» заменить на oxc — как уже решено в 03-architecture.md §9.5. 8. 08-roadmap.md E7.5 и 03-architecture.md §9: основной путь нативных плагинов — WASM (wasmtime + Extism) с лимитами и правами §9.4; C ABI — только для подписанных Enterprise-модулей (ГОСТ). Экономия ≈2 чел.-мес. 9. 03-architecture.md §9.8: CPython собирать своими скриптами из исходников PSF (python-build-standalone — MPL-2.0), на Windows — официальный embeddable-архив. 10. docs/apps/notes.md 5.8 и 03-architecture.md §5.1: в Yrs нет move. Порядок страниц и блоков — дробные индексы в Map; перенос узлов дерева — алгоритм Kleppmann et al. (2021) в meridian-history (≈1 чел.-мес., добавить в E6.1); Loro — запасной пилот в I21. 11. 08-roadmap.md E5.1 говорит «FTS5 с ICU-токенизатором», а mail.md 5.10 и notes.md 5.5 — tantivy. Предложение: один движок tantivy для Hub/Mail/Notes (токенизатор meridian_ru_en на Snowball), FTS5 — только префиксные подсказки имён и адресов. 12. docs/apps/notes.md 5.3: шаги 1 (One-Euro) и 6 (линейная экстраполяция) заменить моделятором ink-stroke-modeler с Kalman-предсказанием; контур — алгоритм perfect-freehand; модуль общий с Paint. 13. docs/apps/mail.md 2.1: порядок автонастройки — своя база провайдеров → домен по https → DNS SRV (RFC 6186, 8314) → Autodiscover v2 → MX → ISPDB онлайн только по согласию → ручной ввод. 14. docs/apps/mail.md 5.9: для неоднозначных сбоев отправки — статус unknown и сверка по Message-ID в «Отправленных» перед повтором (идея effect_outbox.py из voice-agent). 15. docs/apps/mail.md 2.1 и 6.2: JMAP (P2) становится дешёвым — jmap-client (Apache-2.0 OR MIT), ≈1 чел.-мес. 16. docs/apps/forms.md 2.2: закрепить, что условия и вычисления — формулы meridian-calc; добавить импорт JSON SurveyJS (P1); формы настроек расширений (03-architecture.md §9.3) — подмножество «JSON Schema + uiSchema». 17. 00-foundation.md §2.2: добавить подмодуль MOffice Dictation (в составе Lingo или Assist): правила FlyType, Whisper офлайн на трёх ОС, онлайн через Cloud; функции «Диктовка» в Write/Notes/Mail и «Расшифровать аудио» в Notes. 18. 08-roadmap.md: снизить оценки — E5.6 (кодеки PIM) на ≈12,5 чел.-мес. (outlook-pst, calcard, mail-parser), E5.3 (протоколы Mail) на ≈9 (imap-codec, libdav, mail-auth, lettre, автонастройка), E6.2 на ≈3,5 (y-sweet); риск «собственный парсер PST» в 3.5 понизить с «средней» до «низкой» вероятности. 19. Фаза 7 (Assist): MCP-сервер MOffice для внешних агентов в рамках прав MOffice Script, бюджеты токенов, журнал внешних действий и оценка результатов — по опыту voice-agent.

8. Непроверенное

  1. imap-codec/imap-next: наличие CONDSTORE/QRESYNC, COMPRESS=DEFLATE, NOTIFY — по коду не проверялось; async-imap — поддержка QRESYNC.
  2. outlook-pst: качество на корпусе из 200 реальных PST, скорость на файлах 5 ГБ, OST — оценено по README и структуре кода, не запускалось.
  3. calcard: round-trip неизвестных свойств X-, vCard 2.1 с quoted-printable; libdav: лицензия DNS-крейта domain, работа с CalDAV Google и iCloud.
  4. Бенчмарки CRDT — по старым версиям (loro 0.10, automerge 2.1, ywasm 0.9); для Loro 1.x, Automerge 3 и diamond-types свежих данных нет; нужен замер на прототипе I21.
  5. y-sweet: активность после 2025-12-04 и поддержка ролей «только чтение» — не проверены.
  6. QuickJS-ng: готовые форки с отладчиком не искались; наличие отладки в Boa не проверено; запрет eval при загрузке только байткода — проверить на прототипе.
  7. tree-sitter-typescript 0.23.2 и ядро tree-sitter 0.27 — совместимость ABI не проверена.
  8. Extism и wasmtime: параметры манифеста лимитов (память, таймаут, хосты, пути) описаны по документации, не по коду.
  9. SurveyJS: таблица соответствия типов и грамматика выражений — по документации, репозиторий не клонировался.
  10. Excalidraw и дробные индексы, схема шифрования <en-crypt> в ENEX — по памяти и открытым описаниям.
  11. Лицензии по памяти, без проверки в этой сессии: whisper.cpp (MIT), sherpa-onnx (Apache-2.0), edge-tts (LGPL-3.0), libnotmuch (GPL-3.0), словари OpenCorpora (CC BY-SA), providers.xml K-9 Mail (Apache-2.0); условия использования autoconfig.thunderbird.net сторонними клиентами.
  12. rPGP: независимые аудиты безопасности не проверялись; RustCrypto cms 0.3 — pre-release, стабильность API.
  13. lettre: BDAT/CHUNKING и DSN; ovba: защищённые VBA-проекты и p-code.
  14. pimalaya: отдельные проекты CalDAV/CardDAV (вне core) не изучались.
  15. Все оценки экономии в чел.-мес. — экспертные (объём кода источника и состав команды), не измерения; 08-roadmap.md не содержит оценок по эпикам.