MOffice

Сессия A «Ядро»: бриф

Прочитать перед началом: docs/sessions/README.md (протокол — обязательно), docs/00-foundation.md (разделы 4, 6, 10–12), docs/03-architecture.md (крейты ядра), docs/algorithms/kernel-core.md, docs/11-open-source-reuse.md (что берём), docs/research/oss-formats-sheets-data.md и docs/research/oss-text-render-lingo-math.md, план фазы 0 — docs/08-roadmap.md раздел 3.0 (эпики E0.1–E0.3). Ветка phase0/kernel. Журнал — docs/sessions/A-log.md. Стенд — meridian-lab.24oros.ru (порт 18301).

Цель

К концу фазы 0 ядро на Rust открывает реальные docx и xlsx, раскладывает и рендерит страницы в PNG и PDF, считает формулы на форке IronCalc, а качество измеряется на корпусе. Оболочка (сессия B) получает это через стабильный C ABI.

Задачи по порядку

№ Задача Результат и критерий готовности
A1 Форк IronCalc → kernel/crates/meridian-calc. Взять код из зеркала meridian-oss/IronCalc (MIT OR Apache-2.0) копией в наш крейт с файлом NOTICE и заголовками «основано на IronCalc»; текущий мини-парсер сохранить как тесты или заменить. Спайк «IronCalc против formualizer» (зеркало meridian-oss/formualizer): граф зависимостей, инкрементальный и многопоточный пересчёт крейт собирается, тесты IronCalc проходят; отчёт docs/research/spikes/A-calc.md с замерами и решением (ADR); покрытие каталога функций docs/apps/sheets.md — таблицей
A2 Корпус: tools/corpus-tool (Rust CLI): загрузка и манифест 1 000 файлов только из разрешённых источников (GovDocs1 — общественное достояние, тестовые файлы Apache POI и pdf.js — Apache-2.0), сами файлы — в tests/corpus/private/ (вне git), в git — манифест с лицензиями и хэшами; команда stats (частоты элементов OOXML) манифест ≥ 1 000 файлов; corpus-tool stats работает; веха M0.3
A3 Текстовое ядро: meridian-text (есть), новый meridian-layout — harfrust + skrifa/read-fonts + fontique + icu_segmenter, перенос Кнута–Пласса из typst (crates/typst-layout/src/inline/linebreak*, Apache-2.0, с NOTICE), переносы — форк hypher; единицы — целые EMU (meridian-core::units) раскладка абзацев с жадным и Кнут–Пласс режимами; юнит-тесты; бенчмарк абзаца
A4 Кодек docx (минимум) kernel/crates/codec-ooxml: секции, абзацы, прогоны, стили с наследованием, таблицы (простые), картинки inline; на quick-xml + zip открывает ≥ 90 % docx корпуса без паники; фаззинг-цель
A5 Рендер: meridian-render — список отображения → tiny-skia (CPU) → PNG; экспорт PDF через krilla (PDF/A-2b) 100 docx корпуса → PNG и PDF; сравнение с эталоном (PDF из Word, если есть в корпусе; иначе — ручная разметка): ≥ 60 % страниц с SSIM ≥ 0,95 к вехе M0.4
A6 Контракт FFI для оболочки: функции из docs/sessions/CONTRACTS.md (open, page_count, render_page в RGBA, export_pdf) в meridian-ffi + include/meridian.h; пример на C в тестах B может вызвать рендер страницы из Qt; запись во «Входящие» B о готовности
A7 Стенд meridian-lab: статический отчёт лаборатории — галерея «эталон / наш рендер / разница» по корпусу, таблица покрытия функций, бенчмарки; deploy/ для стенда держать в tools/lab-site/ (своя зона), выкладка на sagr в /opt/projects/meridian-lab, порт 18301, поддомен meridian-lab.24oros.ru (маршрут Traefik + строка в HAProxy на VPS) страница отвечает 200 снаружи, проверена в браузере 1440 и 375 px; запись в /opt/CHANGELOG.md
A8 Спайки по отчёту (по одному файлу docs/research/spikes/A-*.md с замерами): pdfium-render и hayro на PDF корпуса; harfrust против системного шейпинга; libmypaint — FFI или порт решения записаны как предложения в библию (в журнал)
A9 (если останется время) meridian-spell, фаза A: Hunspell-совместимый движок для ru_RU (только SFX) и en_US проверка слов и подсказки на тестовом наборе

Чего не делать

Как проверять

cargo fmt --all --check, cargo clippy --workspace -- -D warnings, cargo test --workspace; для стенда — curl снаружи и браузер (1440 и 375 px). Итог каждой задачи — запись в A-log.md, слияние в main по протоколу.