feat(foundry): close the operational map data loop

This commit is contained in:
Codex
2026-07-20 20:45:05 +03:00
parent aac44d057f
commit a02c3ff3dd
44 changed files with 4158 additions and 811 deletions
+36 -6
View File
@@ -5,7 +5,7 @@
## Границы ответственности
- Page Template владеет компоновкой страницы, Inspector, Toolbar, Assistant entry point, слотами данных и системными действиями.
- Map Scene Fixture задаёт минимальный проверочный набор пространственных сущностей и состояний.
- Empty Map Scene Fixture проверяет shell без каких-либо shipped domain-объектов.
- Application Manifest фиксирует экземпляр страницы, выбранный Design Profile и feature visibility.
- Platform capability binding связывает слоты шаблона с scoped data products через Foundry runtime BFF.
- Renderer adapter преобразует provider-neutral scene в Cesium или другой поддерживаемый renderer.
@@ -26,14 +26,30 @@ Engine/NDC остаётся средой создания и исполнени
- selection;
- ready/loading/empty/stale/error/offline states.
Размеры и внешний вид разновидностей сущностей задаются ссылками на `styleProfiles`. Это позволяет одному доменному типу иметь разные подтверждённые варианты, не создавая новый renderer-specific тип.
Размеры и внешний вид разновидностей сущностей задаются ссылками на
`styleProfiles`. Для live entity-stream Application page хранит отдельные
versioned `presentationProfiles`, а binding выбирает один из них через
`presentationProfileId`. Это позволяет одному доменному типу иметь разные
подтверждённые варианты, не создавая новый renderer-specific тип.
Канонический moving-object профиль находится в
`registry/map-presentation-profiles.json`. Он задаёт универсальную геометрию
таргета, плашку подписи, LOD и два пользовательских status facets: связь и
движение. Для текущего Gelios binding значения и подписи повторяют официальный
статусный набор: `Онлайн`, `Офлайн`, `В движении`, `Стоят`. Position
quality и freshness остаются внутренними фактами качества и не дублируют
пользовательские фильтры. Классы, фильтры, счётчики и sort order читают один
profile; renderer не содержит provider-specific условий.
Кнопка `Объекты` открывает вверх текстовый dropdown из Application bindings. Выбор строки открывает или фокусирует отдельное canonical `WorkspaceWindow`, а его универсальное содержимое строится из presentation profile/facets. Несколько binding-окон могут быть открыты одновременно; stable identity всегда `bindingId`, поэтому пользовательское переименование не ломает сохранённый layout.
Facet-фильтры поддерживают мультивыбор: OR внутри одного facet и AND между facets. Missing facet означает отсутствие ограничения, а явно пустой список — ноль совпадений. Отжатие последнего chip не включает `Все`; `Все` включается и выключается только явным кликом. Переключение фильтра не двигает камеру, обзор выполняется отдельным действием.
## Acceptance fixtures
- `registry/fixtures/map/map-operational-v0.1.json` — минимальная рабочая сцена с сеткой, транспортом, станциями, маршрутом, железнодорожным путём, зоной и selection.
- `registry/fixtures/map/map-empty-offline-v0.1.json` — отсутствие provider/live data без разрушения shell и управляющих действий.
Fixtures малы и детерминированы. Большие геоданные, tile cache, credentials и реальные streaming snapshots в репозиторий гайдлайнов не входят.
Page/Visual/Application previews не содержат shipped domain fixtures. Объекты появляются только из declared Application bindings. Большие геоданные, tile cache, credentials и реальные streaming snapshots в репозиторий гайдлайнов не входят.
## Sandbox credit overlay
@@ -41,7 +57,7 @@ Fixtures малы и детерминированы. Большие геодан
## Cesium adapter 1.143
Текущий reference adapter использует CesiumJS `1.143.0`. Он загружается отдельным lazy chunk только при открытии Map Page и преобразует fixture в реальные Cesium entities: points, labels, routes, tracks, zones и selection. Без настроенного ion gateway используется development fallback `WGS84 globe + OpenStreetMap imagery`.
Текущий reference adapter использует CesiumJS `1.143.0`. Он загружается отдельным lazy chunk только при открытии Map Page и преобразует только declared Application bindings в реальные Cesium entities. Пустая Map Page не содержит domain entities.
Server-side runtime contract:
@@ -82,7 +98,8 @@ Runtime tile cache не является исходным кодом и не х
## Live data-product runtime
`Map Page` хранит только provider-neutral binding: `dataProductId`, approved
semantic types, field projection и `slotId` (`points` для live point entities).
semantic types, field projection, `presentationProfileId` и `slotId` (`points`
для live point entities).
При открытии Application page browser делает same-origin запрос к Foundry:
```text
@@ -94,6 +111,9 @@ runtime. При первом exact consumer apply Foundry генерирует t
передаёт EDP только его digest в запросе с отдельной service-подписью; EDP сам
разрешает unique active writer scope и fail-closed отклоняет ambiguity. Legacy
root-owned deployment directory используется только как совместимый fallback.
При смене versioned Data Product Foundry создаёт successor reader generation,
bootstrap-ит новый snapshot и только затем отзывает predecessor; существующий
grant никогда не переписывается другим request hash внутри одного поколения.
Browser, manifest и Cesium adapter не получают provider
endpoint, tenant/connection scope, reader token или raw provider payload.
Сначала server-owned Foundry consumer коммитит snapshot, затем применяет patch
@@ -104,3 +124,13 @@ history route (`from/to/resolution/sourceIds/cursor`) через тот же BFF
занимает общую L2 execution queue. Renderer держит отдельный `CustomDataSource`
на binding и обновляет stable entity id без пересоздания viewer. Sampling и
retention остаются политикой Data Plane, а не Map Template.
`fleet.positions.current.v2@2.0.0` является первым state-aware moving-object
контрактом. Пользовательский status contract ограничен
`availability_state=online|offline` и `motion_state=moving|stationary`;
границы берутся из настроек объекта Gelios (`lostConnectionTimeValue` и
`minimumMovementSpeed`), а не из придуманных Foundry thresholds. Технические
`position_state`, `freshness_state` и `state_policy_version` могут оставаться в
факте для quality/diagnostics, но не образуют дополнительные UI-фильтры. Цвет,
геометрия таргета, label и порядок фильтров остаются в Foundry presentation
profile.