38 KiB
38 KiB
Что нового в Ordinis
Список значимых обновлений продукта на понятном языке. Технических подробностей нет — для них есть внутренний CHANGELOG с привязкой к коммитам.
Обновления приходят на твой сервер автоматически при следующем deploy.
2.52.0 (2026-06-05)
✨ Новые возможности
- Удаление справочника одной кнопкой — в правой info-панели редактора справочника появилась danger-кнопка «Удалить справочник…» (видна только пользователям с ролью admin). При клике — модальное окно с предупреждением о cascade: будут удалены ВСЕ записи, drafts, schema-drafts и история версий. Если на справочник ссылается другой через
x-references— backend возвращает 409 со списком зависимостей, в модалке появляется дополнительная кнопка «Удалить force» (на случай если зависимый справочник нужно поправить отдельно). Cascade на уровне БД через FKON DELETE CASCADE(миграция 0030). Audit log + outbox event «DefinitionDeleted» пишутся ДО удаления — consumers downstream (геопортал, Альтум) получают snapshot final state для инвалидации кэша.
2.51.2 (2026-06-04)
🐛 Исправления
- FK reference: целевое поле — выпадающий список вместо free-form ввода — в Schema Builder при настройке поля как FK (x-references) раньше «Целевое поле» был обычным input с placeholder
code. Можно было ввести любое имя — UI не проверял существование. На staging получили 6 broken FK где target field =code, а в реальных схемах поляcodeне было (естьdesignator,name, etc). При создании записи backend искал по несуществующему полю и возвращал 422x_references_target_not_found. Теперь target field — Select из реальной схемы целевого справочника (businessKey + все scalar non-localized поля). При смене целевого справочника поле сбрасывается наbusinessKey(universal identifier). Если в существующей схеме FK указывает на несуществующее поле — Builder показывает красное предупреждение «Поле … отсутствует в схеме …».
2.51.1 (2026-06-02)
🐛 Исправления
- Админ теперь может self-approve собственный draft — раньше в Reviews при открытии своего pending draft через «Мои» кнопки Approve/Reject были скрыты, виден только Withdraw, даже для пользователей с ролью
ordinis:admin. Backend в v2.46 уже пропускал админский override, но фронт не давал кликнуть. ТеперьuseIsAdmin()с tail-match (admin/ordinis:admin/*-admin/*_admin/*:admin) определяет роль и снимает блокировку UI для всех admin-эквивалентных ролей. В audit log пишется отдельная запись «Admin self-approve override» для compliance trail.
2.51.0 (2026-06-02)
✨ Новые возможности
- Полная ширина на больших экранах — раньше контент в админке ограничивался шириной 1280px и был центрирован. На мониторах 1920+px по краям оставалось много пустого места. Убрали ограничение — теперь страницы записей справочника, schema editor и audit log используют всю доступную ширину (полезной ширины +33% на 1920px мониторе). Reviews/Settings text-heavy страницы остаются ограниченными (читаемость).
2.50.0 (2026-06-02)
✨ Новые возможности
- Колонки таблицы — лишние спрятаны по умолчанию — info-dense справочники (spacecraft с 13 полями, ground_station с 10+) переполняли таблицу и приводили к горизонтальному скроллу. Теперь из коробки видны только businessKey, name, scope, validFrom + первые 2 дополнительных scalar поля. Остальные доступны через меню «Колонки» (включил один раз — выбор сохранится в localStorage per справочник).
🐛 Исправления
- Sticky header + sticky pagination — при вертикальной прокрутке длинного списка записей шапка таблицы (с фильтрами и стрелками сортировки) и кнопки навигации страниц больше не уезжают, они зафиксированы. Не приходится листать вверх/вниз чтобы переключить страницу или отсортировать.
- Существующие пользователи получают новые defaults — те, кто хоть раз открывал таблицу до этой версии, имели пустое значение
hiddenв localStorage и продолжали видеть все 13 колонок. Добавили схему версии_v: 2— старые записи переинициализируются с правильными default-hidden настройками, сортировка preserve.
2.49.0 (2026-06-02)
✨ Новые возможности
- Все поля схемы доступны как колонки таблицы — раньше в меню «Колонки» попадали только enum и FK-поля справочника. Все остальные scalar-поля (string, number, integer, boolean, date), которые отображаются в drawer редактирования, в таблице выбрать было нельзя. Теперь pool колонок == поля редактирования (1:1).
🐛 Исправления
- Массовый approve больше не падает с 500 — при выборе нескольких черновиков и нажатии «Approve all» одновременные запросы конфликтовали в Postgres (
SERIALIZABLEisolation, SSI canceled-as-pivot). Один из approve выдавал 500, остальные проходили. Добавили retry с exponential backoff (50/100/200ms + jitter) дляCannotAcquireLockException— теперь Postgres conflict разрешается прозрачно за 1-3 попытки.
2.48.0 (2026-06-02)
✨ Новые возможности
- Drawer записи: широкий режим по умолчанию на десктопе — раньше при открытии записи drawer всегда стартовал в узком режиме (520px), на 1920px мониторе с info-dense схемами приходилось каждый раз вручную нажимать кнопку расширения. Теперь при viewport ≥ 1024px drawer открывается в широком режиме (880px) по умолчанию. На мобильных — узкий (520px, полная ширина anyway). Выбор пользователя (явный toggle) побеждает viewport и сохраняется в localStorage.
🐛 Исправления
- Bundle importer не откатывает user-published schema — раньше при рестарте writer'а сравнение
bundle.schemaVersion != db.schemaVersionсрабатывало в обе стороны: если пользователь опубликовал через UI новую версию схемы (например1.1.0), а в bundle manifest осталась1.0.0, writer на следующем restart перезаписывал DB обратно к старой. Теперь используется semver-aware compare — обновление применяется ТОЛЬКО если bundle строго новее DB. User-published changes сохраняются.
2.47.0 (2026-06-02)
✨ Новые возможности
- Таблица справочника — сортировка по колонкам и выбор колонок — клик по любому заголовку колонки сортирует по asc → desc → none (NULL-значения всегда в конце). Сортировка numeric-aware (
BK-2 < BK-10 < BK-100для бизнес-ключей). Меню «Колонки» позволяет скрыть/показать любую колонку кроме businessKey (primary identifier). Выбор сохраняется в localStorage per справочник.
2.46.1 (2026-06-02)
🐛 Исправления
- Admin self-approve разблокирован на уровне БД — в v2.46.0 backend разрешил админу approve собственный draft, но DB CHECK constraint (от старой defense-in-depth) всё равно блокировал INSERT/UPDATE → 500. Constraint убран миграцией 0029. Защита теперь только на Java-уровне через
WorkflowRoles.isAdmin().
2.46.0 (2026-06-02)
✨ Новые возможности
- Админ может self-approve drafts — для small teams без выделенных reviewer'ов админ (роль
ordinis:adminили любой tail-match*:admin/*-admin/*_admin) теперь может approve собственный draft. Backend пропускает self_approve_forbidden проверку, в audit log пишется запись «Admin self-approve override: draft=… maker=… reviewer=… (same)» для compliance.
2.45.3 (2026-06-02)
🛡️ Безопасность
- Backend контейнеры запускаются как non-root — все три backend сервиса (writer, read-api, projection-writer) теперь работают под UID 10001 вместо root. Защита от container escape если злоумышленник захватит JVM.
.envфайлы добавлены в.gitignore— whitelist для.env.example/.env.template/.env.sample. Защита от случайного коммита credentials.- Actuator endpoints — public scope сужен — раньше permitAll() на весь
/actuator/**экспонировал potentially sensitive endpoints (env, beans, mappings) для anonymous browse. Теперь permitAll только дляhealth/info/prometheus, остальное denyAll. Defense-in-depth черезMANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDEenv override.
2.36.0 (2026-05-17)
✨ Новые возможности
- Тихие часы — на странице «Уведомления» (
/me/notifications/preferences) можно включить окно, например 22:00–08:00 МСК, когда email и express-сообщения не отправляются. Внутренние уведомления в шапке (bell badge) остаются доступны. Часовой пояс выбирается из 12 российских зон + UTC. Окна через полночь поддерживаются.
2.35.0 (2026-05-17)
✨ Новые возможности
- Bundle hygiene v2 (для интеграторов справочников) — каталог справочников теперь поставляется с
manifest.yaml(явный список + метаданные) и ed25519-подписью. Защита от подмены файлов и явный контракт версии для CUOD-handoff. Документация:docs/integration/bundle-format-spec.mdиdocs/user-guide/bundle-authoring.md.
2.34.0 – 2.34.1 (2026-05-16)
✨ Новые возможности
- ✨ AI: добавить поле — в редакторе схемы справочника появилась кнопка «AI: добавить поле». Опиши идею простыми словами («email контакт», «дата запуска», «частотный диапазон в МГц») — LLM сгенерирует валидное JSON Schema поле. Можно принять, отредактировать или попросить другой вариант. Работает на shared Vortex (
vortex.nstart.cloud, модельqwen2.5:7b). Включается через helmai.enabled. Rate-limit 30 запросов/мин на IP, circuit breaker на падения.
🐛 Исправления
- AI endpoint возвращал 500 после деплоя — nginx роутил
/api/v1/ai/*через generic fall-through на read-api. Добавлено явное правило к writer (тот же паттерн что для/drafts,/me,/admin).
2.33.0 (2026-05-16)
✨ Новые возможности
- Шаблоны схем при создании справочника — в окне «Создать справочник», вкладка Schema, появилась grid из 6 готовых шаблонов: Чистая, Космический аппарат, Наземная станция, Антенна, Частотный диапазон, Оператор. Один клик — форма заполнена типовыми полями ДЗЗ-домена. Экономит время на повторяющихся типах объектов.
2.32.0 (2026-05-16)
✨ Новые возможности
- Метка «Запланировано» в таблице записей — если у записи есть будущая версия (с датой validFrom в будущем), в строке таблицы появляется badge. Видно сразу, не открывая запись.
2.31.0 – 2.31.5 (2026-05-15 – 2026-05-16)
✨ Новые возможности
- Phase B-2 уведомления — матрица 4×3 — на странице «Уведомления» появилась таблица: 4 события (отправлено на ревью / одобрено / отклонено / отозвано) × 3 канала (email / express / telegram). Можно отключить email при approve, оставить email при reject — гранулярно. Express и Telegram пока с пометкой «Скоро» (preferences хранятся для opt-in заранее).
- TimeTravel — окно в будущее — слайдер истории дотягивается до реальной максимальной даты словаря, включая запланированные версии. Раньше был зажат в «сегодня». К подписям границ добавлен год.
- Banner и индикатор запланированных записей — над таблицей записей показывается количество future-версий + ближайшая дата ввода. Понятно, что прилетит в следующий квартал.
🐛 Исправления
- Smart Search возвращал 0 результатов — фильтр scope передавался строчными буквами (
'public'), а в БД хранится'PUBLIC'(CHECK constraint UPPERCASE из миграций 0008/0009). Bug жил 5 месяцев. Теперь поиск работает для всех ролей. - Версия в шапке показывала «none» —
/versionвозвращал тег без значения, потому что build на main без git-тега. Теперь подхватывает тег из helm chart (напримерv2.31.2), парсит SHA-суффикс и форматирует. - Журнал аудита — 13 типов action — раньше многие типы (DRAFT_PUBLISHED, REVIEWER_ASSIGNED и др.) показывались как enum-имя. Теперь все 13 — русские названия.
- «Действует с» в редакторе — поле было пустым в create-режиме, выглядело как баг. Теперь предзаполнено текущим временем (
now()). - QA P3/P4 пакет — 7 косметических багов (i18n, layouts, labels).
♻️ Под капотом
- CI — Alpine mirror стабилизирован — после drift между Nexus v3.23 APKINDEX и реальными файлами release-jobs ломались на каждом auto-bump. Pinned
node:22-alpine3.20+apk updateпередadd+ sed swap наrepo.nstart.cloud. Auto-bump теперь работает без ручного вмешательства. Runbook DevOps:docs-internal/ops/nexus-alpine-mirror.md.
2.30.0 – 2.30.1 (2026-05-15)
✨ Новые возможности
- Phase B-2 backend — per-event-type granular preferences API + миграция данных (подготовка к UI-матрице из v2.31).
🐛 Исправления
- Sidebar для PUBLIC users — outbox / audit / webhooks скрыты (раньше показывали ссылки, при клике — 403).
- TimeTravel slider — extend до now + 30 дней или future marks (улучшено окончательно в v2.31).
2.29.0 – 2.29.1 (2026-05-15)
✨ Новые возможности
- Webhook text-wrap для chat-bot receivers — Mattermost
@WebhookBotтеперь корректно получает payload (receiver требует{"text":"..."}иначе «неизвестный webhook»). Включается в admin-ui на странице подписки (host allowlist + textWrapHosts).
🐛 Исправления
- Bell badge glyph — счётчик уведомлений в шапке обрезался по верху. Теперь полностью виден.
2.28.0 – 2.28.2 (2026-05-15)
✨ Новые возможности
- Phase B уведомления — backend + UI — per-user channel preferences (email / express / telegram), страница
/me/notifications/preferences.
🐛 Исправления
- Email уведомления не уходили вообще — race между OutboxPoller и dispatcher. Окончательное решение: drop
@ModifyingизtryClaim+EmailChannelкак@Bean, не@Component. Critical fix. - HTTP status code —
ResponseStatusExceptionтеперь возвращает корректный код (раньше всё было 500). - User-Agent webhook — установлен
ordinis-alerts(match Webhook Bot subscription). - Actuator — Redis health indicator отключён в writer (не нужен, шумел в
/actuator/health).
2.27.0 – 2.27.13 (2026-05-14 – 2026-05-15)
✨ Новые возможности
- Полный цикл уведомлений по schema-draft — после approve/reject автор получает toast (немедленно) + email (через outbox) + bell badge в шапке. Закрывает TODO 7 design-doc'а.
🐛 Исправления
- Согласования — Mine tab для анонимов — раньше показывал raw AxiosError, теперь dedicated empty state с sign-in CTA.
- Sidebar — 403 spam в консоли — outbox/webhook badge polling гейтятся на INTERNAL scope. Анонимам не дёргаем.
/drafts/activeтеперь 200 + null для PUBLIC scope (вместо 404 → нет шума в консоли).- QueryErrorState везде — все routes теперь используют friendly error UI вместо raw AxiosError dump.
- 44×44 px touch targets — кнопки достижимы на mobile.
- Em-dash fallback в UserCell — пустые actor'ы показывают «—» вместо raw UUID.
- Routing /api/v1/me/* — закрыт 500 на
/me/notifications(тот же паттерн что для/ai,/drafts). - Defensive /me/notifications — wrap DB ops в try/catch с panic-level логированием.
2.26.0 – 2.26.1 (2026-05-14)
✨ Новые возможности
- «Мои» tab в Согласованиях — maker self-tracking со status-фильтром. Видишь свои поданные draft'ы и их текущий статус в одном месте.
2.25.0 – 2.25.1 (2026-05-14)
✨ Новые возможности
- Approval UX — inline draft CTA + reviewer diff summary — ревьюер видит сжатый diff в drawer'е, автор получает inline-кнопку «Открыть draft» прямо из таблицы записей.
2.24.0 (2026-05-14)
✨ Новые возможности
- Audit + outbox для record-draft lifecycle — каждое изменение draft пишется в журнал аудита + outbox event для подписчиков webhook.
🐛 Исправления
- Approval — закрыты 2 bypass paths (security audit findings).
- Non-breaking schema changes — теперь применяются inline без полного draft workflow.
- DictionaryEditorDialog — Save блокируется когда нужен draft workflow (раньше silently сохранял).
2.23.0 – 2.23.1 (2026-05-14)
✨ Новые возможности
- UUID → имя пользователя через Keycloak — Phase 1 (persistent DB cache) + Phase 2 (on-demand Keycloak lookup). Везде где раньше торчал UUID actor'а (changelog, events, history, audit), теперь видно имя через UserCell.
2.22.0 – 2.22.1 (2026-05-14)
✨ Новые возможности
- Per-dictionary approvalMinRole (Phase 2) — у каждого справочника свой минимальный role для approve. Reviewer с меньшей ролью видит draft, но не может approve.
- Закрытие записей через draft —
close/bulk-closeидут через workflow, когда у справочникаapprovalRequired=true. - Scope-gated audit / outbox endpoints — INTERNAL/RESTRICTED scopes гейтят доступ к админ-эндпоинтам.
/admin/users/{sub}/display— endpoint для UserCell.
2.21.0 (2026-05-13)
✨ Новые возможности
- Auto-route create/edit через draft — когда у справочника
approvalRequired=true, любое создание/редактирование записи автоматически создаёт draft в workflow.
2.20.0 (2026-05-13)
✨ Новые возможности
- Schema drafts в «Мои черновики» — теперь там видны не только record drafts, но и schema drafts.
2.19.0 – 2.19.2 (2026-05-13)
✨ Новые возможности
- Sidebar /reviews — role-based visibility — пункт меню «Согласования» показывается только пользователям с reviewer-ролью.
🐛 Исправления
- Чтение ролей из access_token, не id_token — sidebar /reviews был скрыт у reviewer'ов из-за неправильного источника roles claim.
- Webhook scope_filter — Hibernate ordinal mapping bug + UI toggle для активации подписки.
2.18.0 (2026-05-13)
✨ Новые возможности
- WorkflowRoles — configurable claim path + ordinis:admin super-role — admin теперь bypass'ит все role-checks (для troubleshooting + emergency edits).
2.17.0 (2026-05-13)
✨ Новые возможности
- Phase 1d — backend role enforcement для workflow — backend сам проверяет роль на approve/reject (раньше доверяли UI). Closing security gap.
2.16.0 – 2.16.4 (2026-05-12 – 2026-05-13)
✨ Новые возможности
- «Что нового» button в шапке — кнопка открывает modal с этим самым changelog'ом.
🐛 Исправления
- 404 вместо 500 — несуществующий endpoint теперь возвращает 404 (NoResource / NoHandler exceptions properly mapped).
- Кнопки в schema draft drawer — RU labels + flow row layout.
- Sidebar badges — Outbox + Webhooks теперь с реальными счётчиками; audit scope label уточнён.
- Schema draft — автор display + gate «Отозвать» — кнопка только у maker'а draft'а.
- CI release — убран
[skip ci]из semantic-release commit'ов (auto-bump pipeline теперь запускается).
2.15.0 (2026-05-12)
✨ Новые возможности
- «Что нового» — первая версия + state.md — wiring под changelog story (полноценный modal добавлен в v2.16.0).
🐛 Исправления
- Swagger UI на staging — доступно всегда для exploration; на prod env-flagged.
- Docs build context — copy operator/reviewer/changelog директорий в docker image.
2.14.0 (2026-05-12)
✨ Новые возможности
- График доставки webhook'ов — на странице webhook-подписки теперь видно историю доставок за последние 24 часа или 7 дней. Можно навести курсор на любой столбик и увидеть, сколько было успешных доставок, retry, и сколько ушло в DLQ.
2.13.0 (2026-05-12)
✨ Новые возможности
- Поиск в фильтре типов событий — у webhook event-type фильтра появилось поле поиска. Можно набрать «Record» и увидеть только относящиеся типы событий, вместо ручного скроллинга через все 11.
- Выбор диапазона дат — в журнале аудита вместо двух отдельных полей «с» и «по» теперь один календарь, в котором можно отметить начало и конец периода. Удобнее и компактнее.
2.12.0 (2026-05-12)
✨ Новые возможности
- Подсветка активной секции в редакторе записи — когда в редакторе записи прокручиваешь форму, соответствующий «таб» в верхней панели подсвечивается синим. Удобно, чтобы не теряться в длинных формах.
2.11.0 (2026-05-12)
✨ Новые возможности
- TimeTravel — реальные данные на момент — во вкладках «Записи на момент» и «Структура и поля» в окне TimeTravel теперь видны фактические данные, а не заглушка «backend pending». Можно посмотреть, как выглядел справочник в любую дату из истории.
2.10.0 (2026-05-12)
✨ Новые возможности
- Что изменилось — вкладка с реальными изменениями — в окне TimeTravel вкладка «Что изменилось» теперь показывает фактический diff между версиями (добавленные поля, изменённые типы, удалённые свойства), а не пустую заглушку.
🐛 Исправления
- Понятные сообщения об ошибках — вместо технического «AxiosError: Request failed with status code 503» теперь видишь нормальное «Сервер временно недоступен» с кнопкой «Повторить». Это работает для всех ошибок 4xx/5xx и проблем с сетью.
2.9.0 (2026-05-12)
✨ Новые возможности
- Статистика webhook-подписок — на странице подписки появились карточки со счётчиками: в очереди, retry, доставлено, в DLQ + общий процент успешных доставок. Видно с одного взгляда, насколько здоров твой webhook.
2.8.0 (2026-05-12)
✨ Новые возможности
- Редактор схемы прямо в окне создания draft'а — больше не нужно открывать отдельную форму. Окно «Создать schema draft» теперь содержит полноценный JSON-редактор (Monaco) с подсветкой синтаксиса и проверкой схемы налету.
- Согласования — отдельные вкладки — в разделе «Согласования» (
/reviews) появились вкладки «Записи» и «Схемы» со счётчиками. Auto-switch на ту вкладку, где есть что согласовать. - Редактирование draft'а без пересоздания — если ревьюер запросил изменения, можешь поправить schema draft inline, без удаления и создания нового. Изменения автоматически возвращают draft в статус «На доработке у автора».
- Фильтр типов webhook-событий — вместо ввода CSV-строкой теперь multi-select с 11 известными типами событий (
RecordCreated,SchemaDraftPublishedи др.).
2.7.0 (2026-05-12)
✨ Новые возможности
- Schema workflow Phase 1c — окно создания schema draft, расширение раздела согласований, контроль прав доступа.
2.6.0 (2026-05-12)
✨ Новые возможности
- Боковая панель schema draft с действиями — drawer показывает текущий статус draft'а и контекстные кнопки: отправить на ревью, approve, request changes, reject, publish, withdraw, edit. Видишь только те действия, которые доступны на текущем шаге.
2.5.0 (2026-05-12)
✨ Новые возможности
- Вкладка «История версий» — теперь показывает реальный timeline изменений с иконками по типу события и кнопкой «Сравнить» — открывает модальное окно с before/after JSON. Раньше там была заглушка.
2.4.0 (2026-05-12)
✨ Новые возможности
- Полное сравнение версий схемы — endpoint позволяет получить before/after любой пары версий схемы для конкретной записи (используется кнопкой «Сравнить» в History tab'е).
🐛 Исправления
- Слайдер TimeTravel — пометки дат больше не наезжают друг на друга при близких версиях.
- Кнопки в редакторе записи — кнопка «JSON» теперь видна явно (раньше скрывалась как иконка). Если у записи всего одна версия, показывается подсказка вместо disabled кнопок.
2.3.0-2.0.0 (2026-05-12)
Большой релиз-волна: backend endpoints для полного timeline истории, schema workflow API (8 endpoints с maker-checker согласованием), Diff endpoint, тёмная тема. Подробности — в полном CHANGELOG.