Журнал сессии B
Входящие (запросы другой сессии)
2026-10-05 от C: 1) клавиши Delete, F2 (и F4) в
KeyCodeиmeridian_ui::Key; 2) диалог «Открыть» Write — вmeridian-uiс фильтром (расширения + подпись) и режимом «Сохранить как»; 3) цвета приложений изcolor.apps.<app>вtokens.rsгенератором; строка проui/meridian-sheetsв README. — сделано B: все четыре (см. запись 2026-10-05 ниже).2026-10-04 от A: прошу внести в third_party.toml данные
meridian-segment(scope "product", link "data"): списки слов ICU 77.1 thaidict, khmerdict (Unicode-3.0), laodict (BSD-2-Clause AND Unicode-3.0), burmesedict (BSD-3-Clause AND Unicode-3.0) из icu4c/source/data/brkitr/dictionaries; notice — kernel/crates/meridian-segment/NOTICE и data/LICENSE-*.txt. — сделано B: одна запись «ICU: словари деления на слова» (класс 1, link = data), NOTICE и все пять текстов лицензий подключены; THIRD_PARTY, NOTICE и SBOM перегенерированы.2026-10-04, от A (A1): копии стороннего кода для NOTICE/THIRD_PARTY — IronCalc 0.8.3 (github.com/ironcalc/IronCalc, коммит
9b1ae3f, MIT OR Apache-2.0, применяем MIT; © 2023 EqualTo GmbH, Nicolás Hatcher):kernel/crates/meridian-calc/(NOTICE,licenses/) иkernel/crates/meridian-calc-xlsx/(NOTICE,licenses/); данные локалей — из Unicode CLDR (Unicode-3.0). Новые крейты через Cargo.lock: serde, ryu, chrono, chrono-tz, bitcode, csv, statrs, rand 0.8, regex, zip 0.6.6, quick-xml 0.42, thiserror 1, itertools 0.12, serde_json; dev: uuid; только wasm32: js-sys, wasm-bindgen, regex-lite. Проверено: все 87 внешних пакетов — классы 0–1. — сделано B2: три записи вthird_party.toml(две копии IronCalc с NOTICE и текстом MIT, данные Unicode CLDR с текстом Unicode-3.0 изdocs/legal/licenses/); генератор принимает список файловnotice.2026-10-04, от A: крейты форка объявляют
rust-version = "1.87"(в коде IronCalcis_multiple_of); если CI проверяет MSRV поworkspace.package.rust-version = 1.85— подними, пожалуйста, до 1.87. — сделано B2:workspace.package.rust-version = "1.87".2026-10-04, от A:
kernel/spikes/calc-bench— отдельный cargo-проект со своим[workspace]и Cargo.lock (formualizer по git из зеркала meridian-oss); в продукт не входит, глобыmembersего не задевают. — принято (корневойcargo denyего не проверяет; при переносе чего-либо в продукт — обычный порядок).2026-10-04, от A: в карту владения (README §2) прошу добавить
scripts/gx10_llm.pyиkernel/spikes/— зона A (помощник черновиков на моделях GX10 и стенды замеров спайков); помощником может пользоваться и B. — сделано B2: карта владения дополнена; там жеdocs/03-architecture.md— общий (разделы о ядре правит A).2026-10-04, от A (A2/A3): для
third_party.toml— копии и данные, которых не видит cargo:kernel/crates/meridian-hyph/— форк hypher 0.1.8 (github.com/typst/hypher, коммитd81cc50, MIT OR Apache-2.0, применяем MIT; © Laurenz Mädje), NOTICE иlicenses/в папке; шаблоныpatterns/hyph-*.tex— 46 языков, лицензии по языкам в NOTICE крейта (MIT, LPPL-1.2+/1.3, BSD-3-Clause, Unlicense, FSF All-Permissive; hu и sk исключены);kernel/crates/meridian-layout/src/linebreak.rs— фрагмент typst (crates/typst-layout/src/inline/linebreak.rs, коммитe58a63a, Apache-2.0, © The Typst Project Developers), текст лицензии —licenses/LICENSE-APACHE-typst, NOTICE крейта;kernel/fonts/— Liberation 2.1.5 (Sans/Serif — 4 начертания, Mono Regular; OFL-1.1, RFN Liberation/Arimo/Tinos/ Cousine) и Carlito Regular/Bold (OFL-1.1, RFN Carlito), тексты лицензий рядом, README;- тестовый корпус (
tests/corpus/manifest.tsv) в продукт не входит — только для сведения: GovDocs1 (PD), Apache POI/Tika/ODF Toolkit/pdf.js (Apache-2.0). Новые крейты (из Cargo.lock): harfrust, read-fonts 0.43, icu_segmenter 2, unicode-bidi, sha2, cfb, criterion (dev). — сделано B5: вthird_party.toml— hypher (NOTICE + MIT), шаблоны hyph-utf8 (MIT AND LPPL-1.3c AND BSD-3-Clause AND Unlicense AND FSFAP; генератор знает LPPL-1.2/1.3 и FSFAP как класс 1 по политике §1), фрагмент typst (NOTICE + Apache-2.0), Liberation 2.1.5 и Carlito (OFL-1.1 с текстами лицензий); корпус в продукт не входит — не вносился.
2026-10-04, от A: по желанию — рецепты в
justfile:corpus=cargo run --release -p corpus-tool -- fetch && … scan && … audit,bench-layout=cargo bench -p meridian-layout --bench paragraph. — сделано B5: рецептыjust corpus-fetch(имяcorpusзанято снимочными тестами) иjust bench-layout.2026-10-04, от A (A4): ночной фаззинг в CI —
kernel/fuzz(cargo-fuzz, своё пространство с[workspace], в корневой workspace не входит; libfuzzer-sys — только инструмент). Предлагаю задание nightly:cargo +nightly install cargo-fuzzиcargo +nightly fuzz run --fuzz-dir kernel/fuzz docx tests/corpus/fuzz-seeds/docx -- -max_total_time=3600, артефакты падений — в выгрузку задания. Новые крейты:meridian-text-model,codec-ooxml(только внутренние зависимости и zip/quick-xml). — сделано B8:.github/workflows/fuzz-nightly.yml— по расписанию (03:17 МСК) и вручную, целиdocx(60 мин, затравка копируется во временный корпус),headerиopenизmeridian-crypto(по 20 мин), при падении — артефакт с входом; локально то же —just fuzz docx 300(старый нерабочий рецептfuzzзаменён). Команды проверены пробными прогонами. Новые крейты A приняты:scripts/third_party.py --checkзелёный. Напоминание: раннеры Forgejo пока на GX10 (блокер B1), поэтому задание заработает после решения владельца о раннере на sagr.2026-10-04, от A: A6 в main — рендер через
meridian.hготов, имена совпадают сshell/src/kernel/meridian_render.h(проверено: заголовок оболочки безMERIDIAN_KERNEL_STUBкомпилируется сmeridian.h). Можно выключать заглушку. Детали: страницы с нуля;scale0…100 пикс/пт;stride≥ w×4; добавленыmeridian_doc_export_pdfиMERIDIAN_E_PANIC(−5); шрифты вшиты в библиотеку. Контракт —CONTRACTS.md«A → B: C ABI» v0.2. — сделано B4 (см. запись B4 ниже): заглушка выключена по умолчанию, настоящий docx в окне, снимки обновлены.2026-10-04, от A: просьба о зеркалах в
meridian-oss(для A8/A9 и фазы 1; правило — чужое только из зеркал):- словари правописания с разрешительными лицензиями — ru_RU (А.
Лебедев, BSD; из репозитория словарей LibreOffice
dictionaries/ru_RU), en_US/en_GB/en_CA/en_AU (SCOWL / wordlist.aspell.net), по библии ещё pl, nl, tr — для полных тестовmeridian-spell; 2)pdfium-render(MIT/Apache) и сборки pdfium (bblanchon/pdfium-binaries, BSD-3/Apache) — чтобы довести сравнение hayro и pdfium вdocs/research/spikes/A-pdf.md(сейчас pdfium не измерен). Если что-то из этого требует решения владельца — передай ему, пожалуйста. — сделано B (2026-10-04): зеркалаmeridian-oss/dictionaries(LibreOffice/dictionaries, ≈ 290 МБ: ru_RU, en, pl_PL, nl_NL, tr_TR — брать только разрешительные по README папок),meridian-oss/scowl(en-wl/wordlist, ветка v2),meridian-oss/pdfium-render(MIT/Apache-2.0),meridian-oss/pdfium-binaries(сценарии; бинарники — в релизах GitHub, в зеркало не копируются). Приватные, обновление 24 ч; место на GX10 проверено (свободно 158 ГБ, зеркала ≈ 360 МБ).
- словари правописания с разрешительными лицензиями — ru_RU (А.
Лебедев, BSD; из репозитория словарей LibreOffice
2026-10-04, от A:
meridian-fontв main — свой разбор шрифтов для оболочки вместо skrifa/read-fonts:Face::parse(Arc<Vec<u8>>, index),metrics()(upem, hhea, OS/2 win, вес, fsSelection, macStyle),family(),glyph_index(char),covers(char),advance(glyph),lsb(glyph),kern(left, right)(таблицаkernформата 0),outline(glyph, &mut impl Pen)— пероmove_to/line_to/quad_to/cubic_to/closeв единицах шрифта (Y вверх);has_table,table_bytes. Проверено на 183 шрифтах против skrifa. Пока только TrueType (glyf); CFF и пары GPOS — следующими шагами (сообщу).2026-10-04, от A:
meridian-font: пары GPOS и CFF (по просьбе B).kern(left, right)теперь как у HarfBuzz: если в GPOS есть признакkern— сумма поправок PairPos (форматы 1 и 2, правило типа 2 и расширение типа 9; письменности latn/cyrl/grek/DFLT), иначе таблицаkern(заголовки Microsoft и Apple, форматы 0/2/3). Новыйgpos_pair(left, right)— только GPOS. Сигнатуры, которыми пользуется оболочка, не менялись. Сверка с harfrust: 224 шрифта (комплект ядра, Inter ×4, 209 системных macOS), 7,1 млн пар латиницы/кириллицы/греческого — сумма продвижений пары совпала везде; у Inter-Regular 12 441 пара с кернингом.outlineрисует и CFF (кубические кривые черезcubic_to). FFI рисует прямо в буфер оболочки (PixmapMut, при stride = w×4), эллипс —PathBuilder::from_oval.2026-10-04, от A: просьба внести в
third_party.tomlданные Microsoft USE (дляscripts/third_party.py): путьkernel/crates/meridian-shape/src/use_tables.rsиsrc/vowel_tables.rs(производные данные: категории USE и запрещённые последовательности гласных), источник — каталогsrc/ms-useHarfBuzz 12.3.0 (IndicSyllabicCategory-Additional.txt, IndicPositionalCategory-Additional.txt, IndicShapingInvalidCluster.txt), SPDXMIT, Copyright (c) Microsoft Corporation, текст лицензии —kernel/crates/meridian-shape/LICENSE-MS-USE.txt, уведомление —kernel/crates/meridian-shape/NOTICE. Код шейпера свой, harfrust — только эталон в тестах. — сделано B: запись вthird_party.toml(link = data, класс 1, NOTICE и текст лицензии MIT подключены); THIRD_PARTY, NOTICE и SBOM перегенерированы.
Предложения в библию
пока пусто
Записи
- 2026-10-04 — журнал создан координатором; сессия ещё не запускалась.
- 2026-10-04 — B1 «CI и сборка» сделано (ветка
phase0/platform).scripts/third_party.py:THIRD_PARTY.md,NOTICE, SBOMsbom.cdx.json(CycloneDX 1.6) изcargo metadata/Cargo.lock(корень и будущийservices/),third_party.toml(то, чего cargo не видит: Qt, образы, сайт, инструменты) и реестраoss-verified.json(сверка класса). Разделяет поставку и сборку (build-, dev-зависимости и процедурные макросы в NOTICE не идут), для «A OR B» берёт лицензию низшего класса и только её текст, извлекает строки Copyright.--checkпадает при устаревших файлах, классе 3 в продукте/сервисах и классах 2/4 без решения владельца. Проверено на тестовом проекте с serde/cc/itoa.deny.toml:allow-wildcard-paths(path-зависимости внутренних крейтов),unused-allowed-license = "allow";cargo deny check— зелёный (advisories, bans, licenses, sources)..github/workflows/ci.yml: cargo-deny обязателен (убранcontinue-on-error), шагthird_party.py --check, новое задание «mockups + docs site» (check_mockups, pandoc 3.5, сборка сайта как артефакт).justfile:ci(весь набор протокола),third-party,deny,mockups,docs-site(исправлен путь),deploy-site.- Корневой
Cargo.toml:members += "tools/*",exclude = ["services"](сервисы — отдельное пространство);tools/keygen— выпуск/разбор/проверка ключейMRDN-…(секрет вне git), основа для подписи.mlicв B5. - Сайт: страница «Лицензии открытого ПО»
/licenses/генерируется изTHIRD_PARTY.md+NOTICE(+NOTICE.txt,sbom.cdx.jsonдля скачивания), пункт меню «Лицензии». - Протокол §2/§3/§6, бриф A и политика лицензий §5 приведены к генератору; во «Входящие» A — пожелания к FFI и порядок работы с зависимостями.
- Блокер (решение владельца): раннеры Forgejo Actions
на repobase стоят на GX10 (там ничего не строим), поэтому
.github/workflows/ci.ymlна repobase сейчас не исполняется. Свой раннер на sagr (контейнер без Docker-сокета и привилегий) не поднят — действие заблокировано защитой как создание поверхности удалённого выполнения кода; нужно решение владельца. До тех пор проверка —just ciперед каждым слиянием (зелёный).
- 2026-10-04 — B2 «Шифрование
meridian-crypto» сделано.- Перенос из PasswordSafe (
crypto.rs,vault/envelope.rs, веткаwip/snapshot-2026-10-04, только чтение): DEK, обёрнутый ключами от пароля и от кода восстановления; Argon2id; AES-256-GCM; сравнение за постоянное время; zeroize. - Исправления брифа: HKDF (K_data, K_mac, KEK —
отдельные ключи под своими метками; выход Argon2id и DEK напрямую не
используются); MAC на весь файл (HMAC-SHA256 по
канонической форме заголовка с SHA-256 всего
package.bin, размером и числом чанков; не зависит от форматирования XML); потоковое AES-256-GCM (STREAM: префикс 7 байт ‖ u32(i) ‖ флаг последнего, чанки 4 КиБ–64 МиБ, по умолчанию 4 МиБ, постоянная память); Argon2id по RFC 9106 (вторая рекомендация по умолчанию, пределы чтения против DoS, запрет слабых параметров при записи, NFC пароля). - Модули:
kdf,keys,stream,header(строгий разборencryption.xmlна quick-xml: пространство имён, порядок, лимиты, без DTD),envelope(seal/open/unlock/open_with_keys/change_password, код восстановления 160 бит). - Тесты: эталонные векторы RFC 9106 (Argon2id), RFC 5869 (HKDF),
McGrew–Viega 13/14 (AES-256-GCM); границы чанков,
перестановка/усечение/дописывание/порча; три вектора формата
spec/formats/vectors/mop-encryption-v1.json, совпадающие байт в байт с независимой реализацией на Python (tests/reference/mop_reference.py); 8 000 детерминированных мутаций заголовка и шифротекста на stable (tests/robustness.rs). - Фаззинг (
kernel/crates/meridian-crypto/fuzz, cargo-fuzz 0.13, nightly, затравка — векторы):header(разбор + свойство «разбор → XML → разбор = тождество») — 17,5 млн прогонов за 5 мин;open(испорченные заголовок иpackage.binпри известных ключах, свойство «изменённый заголовок не проходит MAC») — 25,9 млн прогонов за 5 мин; сбоев и нарушений свойств нет. Запуск:cargo +nightly fuzz run header -- -max_total_time=300в каталоге крейта. - Документы: сочетание командной палитры приведено к решению 1 библии
(
Ctrl+Shift+P/⌘⇧P,Alt+Q) в дизайн-системе (§5.1, 5.6, 6.5, словарь), Hub, Notes, Mail, Base, Forms. - Спецификация
spec/formats/mop-encryption.md(нормативная, v1); контракт для кодека —CONTRACTS.md; во «Входящие» A — запрос привести04-file-formats.md§2.16 к спецификации. - Синхронизация: запросы A из «Входящих» выполнены (выше); предложения
A перенесены в библию §11 и план (E2.2); в плане исправлено сочетание
палитры (E1.5:
Ctrl+Shift+P, решение 1).
- Перенос из PasswordSafe (
- 2026-10-04 — B3 «Оболочка Qt» сделано (веха M0.5);
заодно заготовка B4 (холст на контракте рендера).
- Qt 6.8.3 LTS поставлен без sudo через aqtinstall в
~/Qt/6.8.3/macos(только базовые модули LGPL-набора). scripts/gen_shell_assets.py: токены →shell/mds/Mds.qml+ 13 типизированных группshell/mds/tokens/*.qml, спрайт → 70 иконокshell/mds/icons/*.svg(в спрайт добавлено 30 глифов: режимы просмотра, панели, тема, Assist…);--checkвjust ciи CI.shell/: модульMeridian.Mds(15 компонентов каркаса), модульMeridian.Shell(окно, лента Write на 8 вкладок, холст, панели, backstage, командная палитра), C++ —DocumentStore(вкладки, синглтон черезcreate()),PageImageProvider(рендер страниц в пуле потоков под DPR),IconProvider, оформление окна macOS (прозрачный нативный заголовок), режим снимков--screenshot/--theme/--size/--scene. Лента — своя, адаптивная (сворачивание групп по приоритету, эластичная галерея стилей).qmllint— без предупреждений.- Холст рисует страницы через контракт
shell/src/kernel/meridian_render.h(пожелания B а–д к FFI A); до A6 — заглушкаmeridian_render_stub.cpp, честно подписанная в строке состояния; версия ядра — из настоящегоmeridian-ffi. - Обход: macOS SDK 27 не содержит
AGL.framework, а CMake-конфиг Qt 6.8.3 его линкует — вshell/CMakeLists.txtзаранее объявлена цельWrapOpenGL::WrapOpenGLбез AGL. - Страница сайта «Живая оболочка»
(
docs/shell/live-shell.md): снимки светлой и тёмной темы, палитры, backstage и узкого окна; пункт меню; рецептjust shell-shots. Сборки никому не распространяются (решение № 36). - Дальше: B4 — при выходе A6 выключить заглушку; стиль QQC2
«Meridian», шрифты Inter/Carlito в комплекте (запись в
third_party.toml), своя полоса заголовка (CSD) для Windows/Linux.
- Qt 6.8.3 LTS поставлен без sudo через aqtinstall в
- 2026-10-04 — B4 «Связь с ядром»: заготовка готова, ждёт
A6. Холст оболочки рисует страницы через контракт
shell/src/kernel/meridian_render.h(open/new/page_count/page_size/render_page RGBA premultiplied/last_error); до выхода функций вmeridian-ffiих реализует заглушка (CMakeMERIDIAN_KERNEL_STUB=ON). Сессия A (2026-10-04): A6 — после A4 (docx) и A5 (рендер). Когда A6 будет в main: выключить заглушку, подключить настоящийmeridian.h, открыть реальный docx из корпуса, снимок на «Живую оболочку», записи в журналы A и B. - 2026-10-04 — B5 «Сервисы лицензий и аккаунтов» сделано,
проверено онлайн.
meridian-license: детерминированный CBOR (cbor.rs, примеры RFC 8949 в тестах) и файл.mlicv1 поdocs/10-licensing-accounts.md§5 (mlic.rs: контейнер, payload, подпись Ed25519 над"MRDN-LIC-v1" ‖ payload, RFC 3339,to_license());TrustedKeys— по строковомуkey_id.services/— отдельное пространство (свой Cargo.lock, MSRV 1.94 из-за sqlx 0.9):meridian-svc(ошибки API по спецификации, ULID, секреты из файлов, PostgreSQL с повторами, лимиты),license-service(healthz, time, signing-keys, activate с MAC до БД, правом по ключу, устройством, «2 из 3», исчерпанием мест, выпуском.mlic; validate; deactivate;import-batch),id-service(перенос FlyType: Argon2id, JWT EdDSA + JWKS, refresh с ротацией и отзывом сессии при повторе, me, sessions, logout, аудит). У каждого сервиса своя таблица учёта миграций и своя база.tools/keygen:secret,batch(файл для импорта, 0600),inspect-license(разбор и проверка подписи ed25519-dalek).- Стенд
https://meridian-api.24oros.ru(sagr,/opt/projects/meridian-api, compose-p meridian-api): образ наscratchсо статическими musl-бинарниками, PostgreSQL 16 (базыmeridian_id,meridian_license), шлюз nginx на192.168.1.90:18302, маршрут Traefiksagr-meridian-api-direct.yaml, строка в/etc/haproxy/sagr-domains.lstна VPS (бэкапsagr-domains.lst.before-meridian-api-20261004T0222Z,haproxy -cок, reload). Секреты созданы на сервере, не печатались; тестовая партия 900 (Pro, perpetual, 2 места, 20 ключей) —secrets/test-keys.txtтолько у root. - Проверено снаружи:
/,/healthz,/healthz/id,/v1/signing-keys,/v1/time, JWKS — 200, неизвестный метод — 404 JSON, сертификат Let's Encrypt (до 2027-01-02); сквозной тестservices/tests/e2e.py --base https://meridian-api.24oros.ru— 30/30, в т. ч. активация тестовым ключом и проверка подписи выданного.mlicкрейтом ядра. Локально тот же тест — 30/30. - Не сделано: проверка страницы стенда в браузере 1440/375 (вызов браузера прервался) — первым шагом следующей сессии.
- Упрощения фазы 0 —
services/README.md(подпись устройства, Idempotency-Key, CRL, подписки через аккаунт).
- 2026-10-04 — B7 «Запрос коммерческой Qt» сделано:
docs/legal/qt-quote-request.md(письмо в Qt Sales на английском- разбор). Важно владельцу: по открытым источникам с марта 2022 Qt Group закрыла коммерческие продукты и платную поддержку для России — вероятен отказ; варианты А–Г в документе (рекомендуется отправить запрос и получить официальный ответ; план Б — LGPL по чек-листу, требует отдельного решения из-за решения № 35).
- 2026-10-04 — B6 «Юридические документы» — в работе:
готовы
docs/legal/trademark-check.md(риск: в США знаки «MERIDIAN» для ПО, в т. ч. документооборот; РФ — нужен поиск поверенного по ФИПС, классы 9/42) иdocs/legal/eula.md(черновик v0.1). Осталось: политика обработки ПДн по 152-ФЗ (privacy-policy.md), публичная оферта (offer.md), раздел NOTICE/«О программе» в EULA уже есть (п. 9); выложить на сайт с пометкой «требует проверки юристом». - 2026-10-04 — B6 «Юридические документы»: черновики
готовы (все — «ЧЕРНОВИК — требует проверки юристом»).
docs/legal/privacy-policy.md— политика обработки ПДн по 152-ФЗ: оператор ИП Орос А.М. (реквизиты-заполнители), таблица «цель → субъекты → данные → основание ст. 6 → срок» (лицензии, Meridian ID, покупки, 54-ФЗ, поддержка, организации по поручению, облако и Assist на будущее, телеметрия и рассылки — только по согласию), отпечаток устройства — солёные хэши, локализация в РФ (ч. 5 ст. 18), без трансграничной передачи, сроки и уничтожение за 30 дней, получатели (хостинг, ЮKassa/CloudPayments, ОФД, почта, банк), права ст. 14–17 с ответом за 10 рабочих дней, меры защиты (ПП № 1119, приказ ФСТЭК № 21), утечки — 24/72 ч, cookie только необходимые; список вопросов юристу.docs/legal/pdn-consent.md— отдельный текст согласия (с 01.09.2025 согласие не включается в другие документы) и отдельные согласия на телеметрию и рассылки (consents.kind).docs/legal/offer.md— публичная оферта (ст. 435–438, 1235, 1286 ГК): предмет — простая лицензия по EULA, акцепт оплатой, заказ и оплата через ЮKassa, расчёты по счёту для юрлиц, НДС-оговорка тремя вариантами на выбор, чеки 54-ФЗ на каждую оплату/списание/возврат, автопродление только по отдельной незаранее отмеченной отметке, напоминания за 30/7 дней, отключение в один клик, возврат 14 дней (≤ 2 активаций) за 10 дней, реквизиты-заполнители.- EULA: ссылки на политику и оферту.
docs/10-licensing-accounts.mdприведён к библии (решение 12): Home — 5 устройств (было 3), вечная лицензия — 12 мес. функциональных обновлений + 5 лет обновлений безопасности (было «бессрочно»). - Сайт: на главной — раздел «Юридические документы» (черновики); CSS документов на телефоне: широкие таблицы прокручиваются внутри себя (минимальная ширина ячеек), меню — одна прокручиваемая строка, панель не закреплена.
- Стенд API: страница
deploy/meridian-api/www/index.htmlпроверена в браузере — 1440 px: без прокрутки, статусы живые (license/id «работает», ключmo-lic-…); 375 px: таблица методов была шире экрана (прокрутка внутри рамки) — на узком экране строки стали карточками (метод + адрес, ниже назначение).
- 2026-10-04 — Стенд meridian-api: перевыкладка и надёжность
выкладки (Tailscale SSH к sagr снова работает).
- В
/opt/CHANGELOG.mdдописана пропущенная запись о выкладке B5 и запись о перевыкладке. - Найдено при выкладке: шлюз nginx «запоминал» IP сервисов при старте
— после пересоздания контейнеров отдавал 502 (≈2 мин, снято перезапуском
своего шлюза). Исправлено:
resolver 127.0.0.11и адреса сервисов в переменных (deploy/meridian-api/nginx.conf);nginx.confкопируетсяrsync --inplace(смонтирован по inode) и после выкладки проверяетсяnginx -tи перечитываетсяnginx -s reload. - Каждая выкладка пересоздавала сервисы: (1) в контекст сборки
попадала вся папка
deploy/meridian-api; (2) compose ставил на образ метку сервиса — два сервиса собирали один тег с разными ID; (3) даже сборка из кэша давала новый ID. Теперь в контекст идёт только Dockerfile, собирает образ только license-service, тег образа — хэш исходников (.envна сервере,.env.prev— точка отката), сборка пропускается, если образ уже есть. Проверено: повторная выкладка — «сборка пропущена», контейнеры не перезапускаются. - Сквозной тест упал 29/30 («2 из 3»): счётчик израсходованных
тестовых ключей жил в рабочей копии, новый worktree взял ключ с
устройством прошлого прогона. Счётчик перенесён на сервер
(
secrets/e2e-used); повтор — 30/30. - Снаружи:
/,/healthz,/healthz/id,/v1/signing-keys,/v1/time, JWKS — 200; браузер 1440 и 375 px — без прокрутки вбок, статусы «работает», таблица методов на телефоне — карточки.
- В
- 2026-10-04 — B8 «Сайт документации»: выложен и проверен
онлайн (main
0773ff0).bash deploy/deploy-sagr.sh; снаружи 200:/,/docs/legal/*(EULA, оферта, политика, согласие, знак, запрос Qt), «Живая оболочка»,/licenses/,NOTICE.txt, журналы A и B; браузер 1440 и 375 px — без прокрутки вбок на 9 страницах, все изображения загружаются (6/6 на «Живой оболочке»). Запись в/opt/CHANGELOG.md.- Предложения A в библию: новых нет (три прежних перенесены в B2 и отмечены в A-log).
- «Входящие»: ночной фаззинг — сделано (см. выше).
- B4: A6 (FFI рендера) в main ещё нет — заглушка контракта остаётся;
проверено
git log origin/main,origin/phase0/kernel.
- 2026-10-04 — B4 «Связь с ядром» сделано: оболочка
рисует страницы настоящим ядром (A6, FFI v0.2).
shell/CMakeLists.txt:MERIDIAN_KERNEL_STUBпо умолчаниюOFF(заглушка — только для отладки интерфейса), к ядру добавлены системные библиотекиiconv(macOS) иrt(Linux) — поmeridian-ffi/tests/c_example.rs.- Проверено: чистая сборка
just build-shell(Qt 6.8.3), открыты реальные docx GovDocs1 (общественное достояние):420596.docx— 7 страниц (жирный, по ширине, рамки, подчёркивание),605378.docx— 2 страницы (табуляции с заполнителями); новый документ — пустая A4 из ядра; строка состояния «Стр. 1 из N · Ядро 0.1.0» без пометки заглушки. - Найдено и исправлено в оболочке: в узком окне вкладки обрезались и активная уходила за край — теперь сжимаются как в браузере (активная держит имя); в сжатой вкладке подпись больше не вылезает наружу; вкладка «Заголовки» навигации подписывала страницы «Раздел N» — теперь честно «Страница N» (оглавления в FFI нет — запрос во «Входящих» A).
- Снимки «Живой оболочки» (
just shell-shots) — с настоящими документами изdocs/shell/samples/(+ снимок нового документа); страницаdocs/shell/live-shell.mdобновлена.
- 2026-10-04 — Своя оболочка без Qt — решение владельца № 39 и
прототип («Нам нужно сделать такую же оболочку и использовать
свою оболочку»).
- Анализ вариантов и план —
docs/research/own-shell.md(Qt коммерческая/LGPL, Slint, GTK, Flutter, Tauri, egui, iced, Xilem, GPUI → свой набор на «кирпичах» класса 0–1); решение записано в библию (§4, §6, §11, §12 № 39; № 14 и № 36 помечены «заменено»),docs/13-owner-decisions.md(№ 4),docs/03-architecture.md(схема слоёв, §15.1),README.md, карта владения (ui/— B);docs/legal/qt-quote-request.md— «не отправлять». ui/meridian-ui— свой набор компонентов: токены MDS (генераторgen_shell_assets.pyтеперь выдаёт и Rust:tokens.rs,icons_gen.rs, тени), растрpaint.rsна tiny-skia (обрезка без масок для прямоугольников, построчное копирование страниц), текстtext.rsна harfrust + skrifa (вшитый Inter 4.1, подстановка недостающих символов, синтетический курсив, кэши, «…», перенос), свой разбор SVG-иконок с дугами (svg.rs), ввод в немедленном режиме (ui.rs), компоненты MDS (widgets.rs) — копииshell/mds/components/*.qml. В спрайт добавлена иконкаhighlighter.ui/meridian-write— окно Write: заголовок с вкладками и палитрой, лента 8 вкладок с адаптивным сворачиванием (переносRibbonPage.relayout()), холст со страницами ядра через тот же C ABImeridian-ffi(фоновый рендер в 2–4 потоках), линейка, «Навигация» (страницы, миниатюры), «Стили», строка состояния с масштабом, палитра команд, backstage, списки шрифта/кегля; окно — winit (без Adwaita-рамки: она тянула заброшенныйttf-parser), кадр — softbuffer, «Открыть» — rfd; безоконный режим--screenshotи дымовой--quit-after/--dump-frame.- Проверено: 39 тестов (19 + 8 + 12 сквозных щелчками
и клавишами); сходство с Qt-снимками SSIM 0.968–0.996; кадр 2880×1800 на
CPU 8,7 мс (было 27 — профиль
sample, три оптимизации); настоящее окно macOS (тема из системы, Retina, 13 кадров, ошибок ядра 0); Linux x86_64 на sagr в контейнере — сборка 2 мин, 39 тестов, clippy чистый, кадр = macOS на 99,92 % пикселей;cargo deny— всё ok; Inter — вthird_party.toml;just ciзелёный. - Тесты нашли и исправлено: результат щелчка был виден кадром позже
(теперь после события — ещё один кадр);
mutподcfg(macos)давал предупреждение на Linux. - Сайт: страница «Своя оболочка»
(
docs/shell/native-shell.md, 9 снимков + Linux), пункт меню, главная; Qt-страница — «Qt-прототип». Рецепты:just native-build|native-run|native-shots|native-bench|native-smoke. - Дальше (оценки в own-shell.md §5): AccessKit, IME и буфер обмена —
вместе с моделью правки (фаза 1), GPU-путь, своя рамка окна на
Windows/Linux; после паритета удалить
shell/(Qt).
- Анализ вариантов и план —
- 2026-10-04 — FFI v0.3 в своей оболочке;
third_party.tomlпо просьбе A.ui/meridian-write: оглавление ядра (meridian_doc_outline_*) во вкладке «Заголовки» — отступ по уровню, текущий раздел по прокрутке, переход щелчком, прокрутка списка колесом (без заголовков — список страниц); новые документы —meridian_doc_new_locale("ru-RU")(A4, поля Word); константа EMU — изmeridian-ffi. Пример с заголовкамиdocs/shell/samples/406729.docx(GovDocs1, общественное достояние); снимокnative-outline.pngна странице «Своя оболочка».- Тесты: 43 (новые — A4 для ru-RU и Letter для en-US, оглавление
реального docx, переход по заголовку и прокрутка списка, A4 у новых
документов). Старый тест переходов переписан на миниатюры: у
420596.docxпоявился один пункт оглавления (абзац уровня 4), и вкладка «Заголовки» теперь показывает его, а не страницы. third_party.toml(просьба A, «весь код свой» в ядре): удалены записи «hypher (копия в meridian-hyph)» и «typst (фрагмент разрыва строк)»; запись о данных — «hyph-utf8 / tex-hyphen: шаблоны переносов» (url hyphenation.org, NOTICE крейта). NOTICE/SBOM перегенерированы.- Вопрос владельцу (передан сессией A): «весь код свой — чужие решения не подключать, а переписывать» — касается ли это и своей оболочки (winit, softbuffer, tiny-skia, harfrust/skrifa, rfd)? До ответа оболочка остаётся на этих крейтах класса 0–1.
- 2026-10-04 — «Весь код свой» в оболочке (решение № 40;
владелец подтвердил B напрямую: «переписать всё»).
- Договорённость с A: растеризатор (шаг 6 плана ядра) — B, крейт
kernel/crates/meridian-raster(зона B, карта владения); OpenType/шейпер (шаги 7–8,meridian-font) — A; платформенный слой и диалоги — B. - Свой диалог «Открыть» (CM-01) вместо
rfd: места, путь, список «Имя/Тип/Изменён/Размер», сведения, фильтр, клавиши; «Недавние» сеанса; −41 сторонний крейт. meridian-raster: пути (линии, квадратичные и кубические кривые), сглаженная заливка non-zero/even-odd (16 подстрок × 1/256 px, середина — массивом разностей), обводка (сегменты, стыки round/bevel/miter, концы butt/round/square — объединение non-zero), маски, картинки (сдвиг — построчно, иначе аффинно nearest/bilinear), source-over на premultiplied, PNG на своём DEFLATE и CRC-32meridian-archive. 17 тестов. Оболочка переведена: кадры против tiny-skia — SSIM 0,9999, кадр 2880×1800 — 7,2 мс (было 8,7). Детерминизм — целые и базовые f32 (без FMA и SIMD). Ядро переводит A.- Библия: решение № 40, §4 (оболочка, шейпинг), §11 (пометка), §11.1 —
предложения A8 (шейпинг, PDF, кисти) перенесены с поправкой на № 40, в
A-log отмечено.
own-shell.md§8 — план и состояние. - Дальше: свой платформенный слой (macOS Cocoa → Windows Win32 → Linux
X11/Wayland) вместо winit/softbuffer; текст — на
meridian-font, когда A выпустит API.
- Договорённость с A: растеризатор (шаг 6 плана ядра) — B, крейт
- 2026-10-04 — Свой платформенный слой
ui/meridian-platformвместо winit/softbuffer (решение № 40).- Общий API: окно, события (мышь, колесо, клавиши по физическому положению + текст, перетаскивание файлов, тема, закрытие, будильник), вывод кадра RGBA, курсор, перетаскивание и разворот окна, отступ под кнопки ОС, номер окна.
- macOS — AppKit/CoreGraphics через objc runtime (класс
MeridianView, CGImage вdrawRect:, libdispatch для будильника, меню «Выйти» ⌘Q, отступ — от кнопки «увеличить»); Linux — X11 через dlopen Xlib (без рамки WM, EWMH, XPutImage, keysym → Unicode с кириллицей и группой раскладки, Xft.dpi, сокеты + poll); Windows — Win32/GDI (свой заголовок WM_NCCALCSIZE, SetDIBitsToDevice, Per-Monitor V2 DPI, тема из реестра, WM_DROPFILES, отложенное перетаскивание без повторного входа). Зависимостей у крейта нет. - Проверено: macOS — настоящее окно, снимок системой
(
screencapture -l <id>); Linux — Xvfb на sagr: щелчкиxdotool(вкладка «Вид» → «Тёмная»), палитра Ctrl+Shift+P, набор латиницей и кириллицей с «ё», Enter, дымовой выход; Windows —cargo checkиclippy -D warningsдля x86_64-pc-windows-gnu (запуска нет — нет машины с Windows). clippy чистый для трёх ОС. −55 сторонних крейтов (winit, softbuffer и их зависимости). - Найдено и исправлено: гонка дымового режима (будильник срабатывал на 8 999 мс из 9 000) — срок теперь общий.
meridian-rasterпо просьбе A:PixmapMut::from_bytes(рисование в чужой буфер без копии, тест на побайтное равенство) иPathBuilder::from_oval/push_oval; 18 тестов.
- 2026-10-04 — Текст оболочки на своём
meridian-fontвместо harfrust/skrifa (решение № 40, последний чужой крейтui/meridian-ui).text.rs: шрифт —meridian_font::Face(метрики из hhea/OS/2,glyph_index,advance,kern), контуры глифов — черезmeridian_font::Penпрямо вmeridian_raster::PathBuilder. Подстановка недостающих символов, синтетический курсив, кэши, усечение «…» и перенос — без изменений.- Проверено: 19 тестов
meridian-ui, 15 сквозныхmeridian-write; кадры против harfrust/skrifa — SSIM светлая 0,9995, палитра 0,9985, «Открыть» 0,9990, оглавление 0,9962; кадр 2880×1800 — 8,0 мс (медиана). - Осталось: кернинг Inter хранится только в GPOS — ждём GPOS PairPos в
meridian-font(запрос A); сейчас пары без кернинга, разница — доли пикселя (видно по SSIM).harfrustещё приходит в оболочку через раскладку ядра (meridian-layout, зона A). - Дополнение: A выпустила пары GPOS (
f8312e2),kern()теперь даёт кернинг Inter. Код оболочки не менялся; кадры против harfrust/skrifa: светлая 0,9999, палитра 1,0000, «Открыть» 1,0000, оглавление 0,9999 (без кернинга было 0,9961–0,9994); кадр 7,4 мс. Снимки пересняты.
- 2026-10-04 — Свой CI-раннер на sagr (блокер B1, решение
владельца «ставь раннер на sagr»).
deploy/ci-runner/: образ (Rust 1.97.1 + rustfmt/clippy, cargo-deny 0.20.2, just 1.58.0, python3, pandoc, forgejo-runner 12.13.2), compose без Docker-сокета и привилегий (cap_drop: ALL, uid 1001, 8 CPU, 24 ГБ, 4096 процессов, без портов),deploy-runner.sh(rsync → сборка на sagr → однократная регистрация с токеном через stdin → запуск). Меткаmeridian-linux, одно задание за раз, кэши cargo и сборки в томе..forgejo/workflows/ci.yml: своя выборка коммита по токену задания (без Node иactions/checkout) иjust ci..github/workflowsForgejo теперь не исполняет — это описание матрицы трёх ОС на будущее.- Проверено: образ собран на sagr за 3 мин; полный
just ciв нём с теми же пределами — зелёный, 6 мин 18 с с холодного кэша. Ждёт токен регистрации от владельца (/root/secrets/forgejo-runner-token): выпустить его автоматически нельзя — доступ к админке repobase.ru у сессии закрыт. - Запущен по поручению владельца: токен выпущен командой Forgejo
(
forgejo actions generate-runner-token --scope forge/MeridianOffice) и передан на sagr без вывода; раннерsagr-meridianзарегистрирован. Первый прогон через Forgejo — задания 2785 (main) и 2787 (phase0/platform), коммит27bc4f1: success за ~4 мин, 85 наборов тестов. Блокер B1 снят: проверка коммитов автоматическая. - Найдено и исправлено: repobase.ru временами отвечает медленно
(задание 2782 не смогло отправить журнал) — таймауты раннера увеличены;
токен задания был виден в аргументах
git— теперь передаётся черезGIT_CONFIG_*. - Дальше: ночной фаззинг (
fuzz-nightly.yml) перенести в.forgejo/workflows(нужен nightly-toolchain в образе).
- 2026-10-04 — Фокус с клавиатуры в своей оболочке
(own-shell.md §5).
Interaction: фокусируемые области (hit_focusable; всеclick_area, закрытие вкладки документа, строки диалога «Открыть»), Tab/Shift+Tab по кругу в порядке прошлого кадра, Enter и пробел — щелчок по элементу в фокусе (пробел не попадает в набранный текст), Ctrl+Tab оставлен приложению;block()(модальный слой) обрезает список — фокус не уходит под палитру, всплывающее окно, backstage и диалог; щелчок мышью прячет рамку; исчезнувший элемент теряет фокус.- Рамка —
Ui::focus_ring()поверх кадра: токеныborderWidth.focusиfocusOffset(2 px), цвет акцента. - Проверено: 2 новых модульных теста (
meridian-ui— 21) и 2 сквозных (meridian-write— 17): Tab до вкладки «Вид», рамка в пикселях кадра, Shift+Tab, Enter открывает вкладку, щелчок прячет рамку; фокус замкнут в палитре. Снимокnative-focus.png(сцена--scene focus, вjust native-shots). own-shell.md§5 приведён к решению № 40: доступность, IME, буфер обмена, GPU, меню и шрифты — своим кодом (вместо AccessKit, arboard, wgpu/vello, muda, fontique).
- 2026-10-04 — Ночной фаззинг на своём раннере:
.forgejo/workflows/fuzz-nightly.yml(03:17 МСК и вручную; цели docx 60 мин, header и open по 20, по очереди), в образе раннера —nightly-2026-10-03и cargo-fuzz 0.13.2; корпус копится между ночами в/data/fuzz/corpus, входы падений — в/data/fuzz/crashes/<дата>-<цель>, итоги — вresults.txt. Проверено в образе на sagr теми же командами по 60 с: docx — 890 тыс. прогонов, header — 5,1 млн, падений нет. - 2026-10-04 —
third_party.py: неотгружаемые члены рабочего пространства (NOT_SHIPPED: tools/corpus-tool, tools/keygen, tools/lab-site, kernel/oracles/*) — их собственные зависимости считаются разработкой, а не продуктом. В продукте 226 сторонних компонентов вместо 241: ушли, в частности, tiny-skia и png (только corpus-tool), ed25519-dalek и sha2 (keygen, corpus-tool). Спорное (tools/meridian-convert) остаётся продуктом — переучёт безопаснее недоучёта. По договорённости с A перед переездом IronCalc в kernel/oracles/. - 2026-10-04 — Подсказки клавиш Alt и изменение размера окна
за края (own-shell.md §5).
meridian-platform: новая клавишаKeyCode::Alt— одиночное нажатие Alt (Windows: ещё F10; системное меню окна не открывается); X11 — KeyRelease иXkbSetDetectableAutoRepeat(удержание не даёт ложных нажатий); на macOS не выдаётся (там так не принято). X11: изменение размера за полосу у края (6 px, углы 12) — курсоры сторон и углов,_NET_WM_MOVERESIZEс направлением; курсоры X кэшируются (раньше создавались на каждом кадре — утечка).Interaction: подписи элементов (name/name_of— для подсказок, тестов и будущего моста доступности; ставят все кнопки, переключатели, поля, карточки, вкладки),focusables(),activate_id()(щелчок из кода в этом кадре),pointer_pressed().meridian-write/src/keytips.rs: коды по подписям без повторов, двухбуквенные при нехватке букв (ни один код не начинает другой), латиница → ЙЦУКЕН по положению клавиш; вapp.rs— уровни «вкладки» и «команды», Esc — назад (сначала сбрасывает первую букву), щелчок мышью закрывает; значки на нижнем крае элементов.- Проверено: 3 модульных теста кодов, 2 сквозных (Alt → «b» → «Вид» →
код «Тёмная» → тёмная тема; Esc и повторный Alt; двухбуквенные коды на
«Главной», «Найти»), 1 модульный тест краёв окна; X11 под Xvfb + Openbox
на sagr: Alt и «b» по-настоящему через
xdotool, удержание Alt; правый край 1440 → 1620 px, угол −147 × −97 px, щелчок после изменения размера доходит до оболочки. clippy для macOS, Linux и Windows чистый; снимкиnative-keytips.png,x11-keytips.png,x11-resize.png.
- 2026-10-04 — Свои кнопки окна на Windows и Linux.
meridian-platform:minimize(),is_maximized(),has_native_buttons()(macOS —miniaturize:/isZoomed, системные кнопки; Windows —ShowWindow/IsZoomed; X11 —XIconifyWindow, развёрнутость — по нашим запросам_NET_WM_STATE). Оболочка рисует справа в заголовке «Свернуть», «Развернуть/Восстановить», «Закрыть» (46 px, красная при наведении), запросы окнуminimize/close_window; безоконный режим переносит все запросы окна из кадра с событием. Проверено: сквозной тест (место, подписи, красная «Закрыть», запросы, значок «Восстановить»); X11 под Openbox — развернуть 1800×1200, восстановить 1440×900, свернутьIsUnMappedи обратно, закрыть — выход с кодом 0 через 8 с. Найдено: до этого на Windows и Linux окно нельзя было ни свернуть, ни закрыть мышью — заголовок свой, рамки оконного менеджера нет. - 2026-10-04 — Всплывающие подсказки.
Interaction: часы кадраnow_ms(окно — от запуска, безоконный режим — свои),hovered_for()(элемент под указателем и сколько мс; после нажатия молчит, пока указатель не уйдёт).app.rs: плашка с названием и сочетанием клавиш (только работающие: палитра, новый, открыть, закрыть, лента, стили) после 600 мс, у края окна — сверху;Requests::redraw_in_ms— окно ставит один поток-таймер на будильнике. Человеческие подписи кнопок-глифов и иконок («Полужирный», «Маркеры», «По центру», «Шрифт», «Свернуть ленту», «Новый документ», «Закрыть документ/панель») — для подсказок, кодов Alt и доступности. Проверено: модульный тест времени наведения, сквозной — нет сразу, есть через 600 мс, щелчок прячет; снимокnative-tooltip.png. Найдено: подпись, поставленная доicon_button, перебивалась именем иконки — подписи ставятся после элемента. - 2026-10-04 — Меню macOS своим кодом.
meridian-platform:Config::menus(меню → пункты: своиAction{id, title, key, shift}, стандартныеStandardItem— о программе, скрыть, выйти, отменить/повторить, вырезать/копировать/ вставить/выделить всё, свернуть, масштабировать),Event::Menu(id),Window::perform_menu(id)(черезperformActionForItemAtIndex:из главной очереди — без повторного входа в обработчик); на Windows/Linux меню нет.meridian-write/src/menu.rs: «Meridian Write», «Файл», «Правка», «Вид», «Окно», номер →Cmd; новая командаCmd::Palette;--menu N— дымовая проверка. Проверено на настоящем окне:MERIDIAN_DUMP_MENU=1— пять меню из объектов NSMenu с ⌘/⇧/⌥;--menu 21— тёмная тема (заголовок#1F2228),--menu 10— палитра. Найдено и исправлено: в палитре на macOS сочетания были «Ctrl+N» — теперь знаками ОС (key_label: ⌘N, ⇧⌘P, ⌃F1). - 2026-10-04 — Стрелки при видимой рамке фокуса.
Interaction::move_focus_dir: ближайший фокусируемый элемент в сторону стрелки, сначала среди того же ряда (←/→ — пересечение по высоте, ↑/↓ — по ширине), оценка — по ходу плюс двойное поперёк; без рамки стрелки остаются приложению (палитра, диалог «Открыть»). Проверено: модульный тест на сетке 3 × 2 (края, ряды), сквозной — «Вид» → «Скрипты» → назад → «Рецензирование», вниз — в команды ленты. Найдено: без предпочтения ряда «влево» от «Вид» уходило в кнопку ленты (у «Рецензирования» центр далеко из-за длинной подписи). - 2026-10-04 — Буфер обмена своим кодом.
meridian-platform:Window::clipboard_text()/set_clipboard_text()— macOS (NSPasteboard; для проверок — именованный изMERIDIAN_PASTEBOARD; меню «Вырезать/Копировать/Вставить/Выделить всё» приходят оболочке клавишами с ⌘ черезcut:/copy:/paste:/selectAll:представления), Windows (OpenClipboard,CF_UNICODETEXT,GlobalAlloc), X11 (XConvertSelection+ ожидание SelectionNotify до 1 с; владение CLIPBOARD иserve_selection— ответы TARGETS/UTF8_STRING/STRING; INCR не поддержан). Оболочка:Interaction::paste(окно кладёт текст при ⌘V/Ctrl+V),Requests::copy_text; палитра — вставка (переводы строк → пробелы), диалог «Открыть» — вставленный путь (кавычки,file://) к папке/файлу, ⌘C/Ctrl+C — путь выделенного. Проверено: сквозной тест; X11 под Xvfb сxclipв обе стороны и TARGETS; macOS — чтение =pbpaste, круг на именованном буфере; clippy для трёх ОС. - 2026-10-04 — Анимации по токенам.
gen_shell_assets.pyвыдаёт вtokens.rsмодулиduration(мс) иeasing(cubic-bezier);meridian-ui/src/anim.rs— решение кривой делением пополам, переходы поId, первый вызов без анимации, смена цели — с текущего значения;Interaction::animate/animating,reduce_motion. Оболочка: полоска вкладок ленты (base,standard), появление палитры (fast,out), задержка подсказки изtooltipDelay; пока идёт переход —redraw_in_ms = 16. Платформа:prefers_reduced_motion()(macOSaccessibilityDisplayShouldReduceMotion, WindowsSPI_GETCLIENTAREAANIMATION, X11 — нет общей настройки). Проверено: 2 модульных теста, сквозной, настоящее окно (5 кадров анимации, затем покой). Попутно: описание крейтаmeridian-uiещё называло tiny-skia, harfrust и winit — исправлено. - 2026-10-04 — Печать и экспорт в PDF.
KernelDoc::export_pdf(FFImeridian_doc_export_pdf); оболочка:Cmd::Print(⌘P/Ctrl+P, палитра, меню «Файл», backstage «Печать») — PDF во временную папку иRequests::print;Cmd::ExportPdf— backstage «Экспорт» (PDF рядом с документом, новый — в «Документы»; «Копировать путь»). Платформаprint_pdf: macOS — PDFKit (подгружается при печати),printOperationForPrintInfo:scalingMode:autoRotate:, лист у окна; для проверокMERIDIAN_PRINT_TO— задание «сохранить» в файл; Linux —lp -t; Windows —ShellExecuteW("print"). Флаг--print. Проверено: сквозной тест; macOS — печать системой в файл, 7/7 страниц (Quartz), первая страница совпадает; Linux — CUPS + cups-pdf в контейнере на sagr: без принтера — «No default destination», с принтером — 7 страниц. Найдено: ключ словаря печати — значение константыNSPrintJobSavingURL(«NSJobSavingURL»), а не её имя. - 2026-10-04 —
meridian-cryptoбез quick-xml и base64 (по предложению A, решение № 40). Разборencryption.xml— на дереве своегоmeridian-xmlс прежней строгостью: DTD, инструкции обработки и CDATA отвергаются заранее, обрыв документа (meridian-xml его прощает) — ошибка, порядок m:data → m:key-encryptors → m:mac, без текста, без повторов и пространств имён у атрибутов, пределы прежние. Base64 — свой модульb64(RFC 4648, строгий: выравнивание, нулевые лишние биты). Проверено: векторы RFC 4648 §10, тест строгости дополнен 11 случаями (лишний закрывающий тег, обрыв корня, PI, CDATA, текст, несвязанный префикс, повтор и префикс атрибута, порядок, неканонический base64); фаззинг header на sagr. NFC пароля —meridian_unicode::nfc(A,45b3739, NormalizationTest 17.0 без расхождений) вместоunicode-normalization. Сторонним вmeridian-cryptoостался только RustCrypto — по решению владельца № 5. Фаззинг на sagr в образе раннера по 120 с: header — 15,3 млн прогонов, open — 7,06 млн, падений нет. - 2026-10-04 — Редкие письменности в интерфейсе — из системных
шрифтов.
text.rs:enable_system_fallback(dirs)(папки ОС —system_font_dirs()), список .ttf/.otf/.ttc один раз, файлы лениво: сначала по подсказке письменности символа (script_hints: CJK, кана, хангыль, армянский, грузинский, иврит, арабский, деванагари, тайский), затем по общему порядку (широкий охват, обычное начертание вперёд); в коллекции — начертание ближе к насыщенности 400 и не курсив; кэш по символу (и «не найдено»), пределы 512 МБ / 64 МБ на файл / 250 начертаний. Окно включает подстановку сразу (MERIDIAN_NO_SYSTEM_FONTS— выключить), безоконные снимки — только с--system-fonts. Примерcargo run -p meridian-ui --example font_fallbackназывает шрифт для каждого символа. Проверено: модульный тест на подменной папке (ленивое чтение, кэш, битый файл, символ без шрифта); macOS — семь письменностей, 5 прочитанных файлов. Найдено и исправлено: первым находился жирный Noto Sans Armenian (первое начертание коллекции) и для иероглифа читалось 110 файлов — отсюда подсказки письменности и выбор начертания. - 2026-10-04 — Доступность: мост NSAccessibility
(macOS).
meridian-ui: роли (Role::Button/Tab/ListItem,set_role), группы порядка обхода (focus_group: заголовок 0, лента 1, навигация 2, документ 3, стили 4, строка состояния 5, слои 6 — Tab и экранные чтецы идут в смысловом порядке, внутри группы — порядок рисования),access_nodes()— подписанные фокусируемые элементы с ролью, рамкой и фокусом. Подписаны все кнопки-иконки (масштаб, режимы просмотра, галерея стилей, поле палитры, строки палитры и диалога «Открыть»).meridian-platform:AccessNode,update_accessibility(macOS —MeridianAXElement⊂NSAccessibilityElement: роль, подпись, идентификатор, рамка в координатах представления, фокус; представление —AXGroupсaccessibilityChildren,NSAccessibilityPostNotification(AXLayoutChanged)),Event::AccessibilityPress(accessibilityPerformPress); окно передаёт дерево только при изменении. Проверено: модульный (группы, роли, фокус) и сквозной тесты; настоящее окно —--ax-dump(71 элемент из объектов Cocoa),--ax-press "Вид"открывает вкладку. Найдено и исправлено:setNeedsDisplay:изнутриdrawRect:AppKit сбрасывал — повторный кадр после щелчка, меняющего состояние посреди кадра, не рисовался до следующего события; теперь запрос ставится из главной очереди. - 2026-10-04 —
meridian-cryptoна своих примитивахmeridian-cipher(A,c22b35f) — сторонних крейтов нет. AES-256-GCM, HMAC-SHA256, HKDF, SHA-256, Argon2id, ГСЧ ОС, сравнение за постоянное время — изmeridian-cipher;zeroize→ свой модульsecret(Wipe,Zeroizing; без unsafe: строка стирается черезinto_bytes),SecretKeyстирает себя вDrop. Проверено: эталонные векторы MOP v1 — побайтово (файл не изменился), RFC 5869/9106 и McGrew–Viega на новых примитивах, все тесты крейта;meridian-cipherоптимизируется в dev (тесты снова < 1 с). Замер (M5 Max, release): Argon2id 89–117 мс против 74–80 у RustCrypto — нормально; AES-256-GCM 16 МБ/с против 3,1–3,3 ГБ/с (узкое место — побитовый S-блок, 17 МБ/с; GHASH 130 МБ/с). Шифрование в интерфейсе пока не вызывается; до включения — аппаратный путь (std::arch), запрос A отправлен. Найдено:Aes256::encrypt_blocksпаникует на срезе больше 4 блоков в release — сообщено A. Дополнение: A сделала аппаратный путь (abaecd5); замер B на M5 Max — 2,4–2,6 ГБ/с (RustCrypto 3,1), побайтово то же; паникаencrypt_blocksисправлена. - 2026-10-04 — Переименование «Meridian Office» → «MOffice»,
этап 1 (решения владельца № 41–43; передано сессией «Анализ приложения и
план работ» и исходной сессией B, слова владельца: «переименуй на
MOffice, делай»). Скрипт по всей зоне B (121 файл, 1 222
замены): «Meridian Office»/«Меридиан Офис» → «MOffice», «MeridianScript»
→ «MOffice Script», отдельное слово «Meridian» → «MOffice» (приложения,
модули, MDS, Glyphs, MOP, ID…). Не тронуты: идентификаторы
(
meridian-*,MERIDIAN_*,MeridianView,LicenseRef-Meridian-EULA,X-Meridian-*, URN, MIME,MRDN-, домены, репозиторий), пути данных программы (Application Support/Meridian Office,%LOCALAPPDATA%\Meridian, ключ политик) — этап 2; кириллическое «Меридиан» в примерах данных макетов («Проект Меридиан», тема «Меридиан», ООО «Меридиан Софт»); журналы сессий; зона A (kernel/,tools/); privacy-policy и offer (исходная B,8794093). Вручную: библия §1 (имя и прежнее рабочее название), §5.1 (знак «M»-глобус, словесный знак, риск смешения), §12 и журнал решений — № 41–43;trademark-check.md— раздел «MOffice» с беглой проверкой (точного совпадения нет; близки «МойОфис/MyOffice», MobiOffice, MS Office) и требованием поиска поверенного по ФИПС/ВОИС в классах 9 и 42. Перегенерированы токены и иконки, THIRD_PARTY/NOTICE/SBOM, снимки оболочки. Найдено при проверке: правило сначала давало «MOffice Office» перед двоеточием и превращало вымышленное «ООО «Меридиан-Юг»» в «MOffice-Юг» — исправлено до записи. - 2026-10-04 — IME на macOS.
MeridianView—NSTextInputClient(протокол добавляется классу при регистрации): нажатия без ⌘/Ctrl — черезinterpretKeyEvents:(пока есть черновик — и Enter, стрелки, Backspace),insertText:→Key { text },setMarkedText:/unmarkText→Event::ImePreedit,firstRectForCharacterRange:— поле ввода оболочки в координатах экрана (set_ime_area),doCommandBySelector:→ обычная клавиша. Оболочка:Interaction::preedit, палитра рисует черновик подчёркнутым,Requests::ime_area. Проверено: сквозной тест; настоящее окно--text-input "にほん|日本|ab тест"→ «日本ab тест» (весь путь через систему ввода, включая синтетические NSEvent), черновик без подтверждения виден (native-ime.png). Windows (IMM32/TSF) и X11 (XIM) — дальше. - 2026-10-04 — XIM на Linux.
x11.rs:setlocale(LC_CTYPE, ""),XSetLocaleModifiers(""),XOpenIM+XCreateIC(стиль «без черновика у курсора» — IME рисует своё окно),XFilterEventдля каждого события, текст —Xutf8LookupString, фокус контекста — поFocusIn/FocusOut; без метода ввода — прежняя таблица keysym. Проверено под Xvfb на sagr: us intl «мёртвые» клавиши → «éáü», ru → «тёмн». - 2026-10-04 — CI: в Forgejo — только итог.
repobase.ru по таймауту не принимал многомегабайтный вывод cargo
(
UpdateLog deadline_exceeded, задания висели до отмены). Теперь полный журнал пишется на sagr (data/ci-logs/<номер>-<коммит>.log), в Forgejo — строкиtest result/ci:, при ошибке — последние 300 строк. - 2026-10-04 — Шрифты по решению № 43 в
third_party.toml(запрос A,211dc3e): Caladea и Gelasio — новые записи (OFL-1.1, 4 начертания, коммиты источников, начала SHA-256 — сверены), Carlito Italic/BoldItalic и Liberation Mono Bold/Italic/BoldItalic — дополнения к существующим записям; THIRD_PARTY, NOTICE, SBOM перегенерированы. - 2026-10-04 — Этап 2 переименования (решение № 44; владелец
подтвердил сессии B напрямую).
- Ключи
MRDN-→MOFC-: префикс и меткиMOFC-KEY-v1,MOFC-KEY-FP-v1,MOFC-LIC-v1(подпись.mlic),MOFC-TIME-v1(подпись времени); старый префикс — ошибка «the MRDN- prefix is retired…». Векторы спецификации §5 пересчитаны той же реализацией (ключи, MAC28, отпечатки, промежуточные HMAC), 23 тестаmeridian-licenseзелёные. - URN
urn:moffice:<app>:1, MIMEapplication/vnd.moffice.*вspec/formats, документах,meridian-crypto(пространство имён заголовка и MIME зашифрованного пакета) иmlic.rs; эталонные векторы MOP v1 пересозданы и подтверждены независимой реализацией на Python (mop_reference.py: 3/3). - Домены:
moffice.24oros.ru,moffice-api.24oros.ru— строки в/etc/haproxy/sagr-domains.lstна VPS (резервная копия,haproxy -c, reload), маршруты Traefik на оба имени (прежние адреса работают); ссылки,PUBLIC_URLи скрипты — на новые. Пути данных программы — «MOffice» (Application Support/MOffice,%LOCALAPPDATA%\MOffice,/etc/moffice, ключ политик, ADMX, профиль MDMcom.moffice.*, сокет брокера). - Кодовое имя остаётся: крейты, C ABI, репозиторий,
meridian-oss, образыghcr.io/meridian-office/*. - Карта владения: дорожка C (
ui/meridian-sheets/,C-log.md,plan/). - Выкладка и проверка: стенд API пересобран, тестовая партия 901 — 20
ключей
MOFC-(старыеMRDN-отложены в резервные файлы на сервере); снаружи 200:moffice.24oros.ru,meridian-office.24oros.ru,moffice-api…/healthz,meridian-api…/healthz,/v1/time(подпись),/.well-known/jwks.json; сертификат Let's Encrypt для новых имён выпущен; сквозной тест API наmoffice-api.24oros.ru— 29 проверок, 0 ошибок. Найдено и исправлено: контекст сборки стенда не включалkernel/oracles/иui/*/(члены рабочего пространства после переезда IronCalc) — образ не собирался.
- Ключи
- 2026-10-05 — запросы C для Sheets:
- Клавиши
Delete,F2,F4вmeridian_platform::KeyCodeиmeridian_ui::Keyна трёх ОС (macOS 0x75/0x78/0x76, Win32 VK_DELETE/VK_F2/VK_F4, X11 Delete/KP_Delete/F2/F4); Write передаёт их интерфейсу. - Диалог «Открыть» перенесён в
meridian_ui::filedialog:Options::open/save(заголовок, буква значка,Filter { label, exts }, режим),Outcome::Save(путь). В «Сохранить как» — поле имени (набор, Backspace, Delete очищает, вставка пути переходит в папку), расширение фильтра дописывается, существующий файл заменяется только по второму нажатию, в «Недавние» сохранить нельзя; ошибки показываются внизу и при непустом списке. Write вызывает его с фильтром .docx; сцена--scene save-dialogдля проверки вида. Тесты: фильтр, сохранение. tokens.rs:AppColors(шкала 50…900 и акценты светлой и тёмной тем по правилу MdsAppColor),tokens::apps::*для всех 14 приложений иPalette::with_app(&apps::SHEETS, dark); тест — для Write палитра не меняется.- README: строка про
meridian-platformиui/meridian-sheets, устаревшие tiny-skia/harfrust заменены своими.
- Клавиши
- 2026-10-05 — доступность Linux: AT-SPI 2 через свой
D-Bus:
meridian-platform/src/dbus.rs— свой клиент D-Bus: адресаunix:path/unix:abstract(с %-экранированием), вход EXTERNAL по uid, Hello, сообщения little-endian (вызов, ответ, ошибка, сигнал), все типы, массивы, структуры, словари, variant; пределы размера и вложенности; кодированиеHelloсверено с эталонными байтами.atspi.rs— мост: адрес уorg.a11y.Bus.GetAddress,Socket.Embedв реестр, поток ответов; объекты приложение → окно → элементы (кнопка 43, вкладка 37, строка списка 32) с Accessible, Component, Action, Application, Cache (GetItems);DoAction→Event::AccessibilityPressчерез будильник; сигналы children-changed, property-change:accessible-name, state-changed:focused/active, window:activate/deactivate. Окно X11 сообщает своё место на экране (XTranslateCoordinates) и фокус ОС.NO_AT_BRIDGE=1выключает мост.- Проверено на sagr под Xvfb с at-spi-bus-launcher и
at-spi2-registryd, клиент — pyatspi (libatspi, как у Orca): приложение
«MOffice Write», окно «активно», 51 элемент (37 кнопок, 14 вкладок) с
верными рамками, попадание по точке,
doActionна «Вставке» открывает её (17 add / 14 remove), Tab →state-changed:focused;--ax-dump(75 элементов) и--ax-press "Вид"— через шину. Тесты: 5 для D-Bus, 3 для моста (на macOS и Linux).
Продолжение в новой сессии (2026-10-04)
Состояние на момент передачи: B1, B2, B3, B5, B7 — сделаны и слиты в main; B4 — заготовка, ждёт A6; B6 — в работе. Порядок дальше:
- Браузерная проверка
https://meridian-api.24oros.ru/на 1440 и 375 px (страница стенда, живые статусы). - B6:
docs/legal/privacy-policy.md(152-ФЗ: оператор ИП Орос А.М., цели, категории, локализация в РФ, сроки, права субъекта, согласия, телеметрия только по согласию; опора —docs/10-licensing-accounts.md§8.8–8.9, §13) иdocs/legal/offer.md(публичная оферта: ст. 435–437 ГК, предмет — лицензия по EULA, оплата, чеки 54-ФЗ, автопродление с явным согласием, возвраты, реквизиты-заполнители); пометка «требует проверки юристом»; на сайт. - B8: пересобрать и выложить сайт (
just deploy-site), проверить 1440/375; страницы «Живая оболочка», «Лицензии», юридические черновики, журналы; перенести новые предложения A из A-log в библию. - B4 — по готовности A6 (см. выше).
- Решения владельца, которые ждём: Qt (после ответа Qt Sales), свой CI-раннер на sagr (блокер B1), поиск знака поверенным.
- 2026-10-04 — B5: браузерная проверка стенда закрыта
(исходная сессия B): https://meridian-api.24oros.ru/
во встроенном браузере — 1440 × 900 и 375 × 812 без горизонтальной
прокрутки (scrollWidth = clientWidth), живые статусы license-service и
id-service «работает», ключ подписи
mo-lic-a5896b0b(Ed25519, primary) отображается, тёмная тема.