Сессия 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 |
проверка слов и подсказки на тестовом наборе |
Чего не делать
- Не трогать зону сессии B (
shell/,services/,mockups/,deploy/, CI, корневые файлы, библию) — только запросы во «Входящие»B-log.md. - Не подключать зависимости вне классов 0–1 политики. Крейты попадают
в
THIRD_PARTY.mdавтоматически изCargo.lock(после добавления —python3 scripts/third_party.pyи коммит трёх сгенерированных файлов); копии и порты чужого кода, C/C++ и данные — запросом B дляthird_party.toml. - Не писать в зеркала
meridian-oss— только читать. - Не строить ничего крупного на GX10.
Как проверять
cargo fmt --all --check,
cargo clippy --workspace -- -D warnings,
cargo test --workspace; для стенда — curl
снаружи и браузер (1440 и 375 px). Итог каждой задачи — запись в
A-log.md, слияние в main по протоколу.