# ZB.MOM.WW.GalaxyRepository Shared Galaxy object-hierarchy SQL browse + `galaxy_repository.v1` gRPC service for the **ZB.MOM.WW SCADA family** (consumed by HistorianGateway and mxaccessgw). Build/test from this directory: `dotnet test`. ## 0.2.2 (2026-11-09, UNPUBLISHED) Version bumped in `Directory.Build.props`, not packed or pushed. P3 review fixes (scadaproj#47): - 003: parent cycles are broken at the lowest gobject id so their members stay browsable. - 004: Stale threshold is `max(5 min, 3 x DashboardRefreshIntervalSeconds)` (new optional `IOptions` ctor parameter on `GalaxyHierarchyCache`); the projected-Stale entry is memoized per source entry. - 005: `WatchDeployEvents` subscribers never see a non-increasing `Sequence`. - 006: container-building tests for `AddZbGalaxyRepository`. - 007: `System.Security.Cryptography.Pkcs` pinned at 9.0.21 (clears NU1902/NU1903 for consumers). - 008: empty `SnapshotCachePath` disables persistence (documented + logged once). ## 0.2.1 (2026-11-09, UNPUBLISHED) Version bumped in `Directory.Build.props`, not packed or pushed; consumers stay on `0.2.0`. - GalaxyRepository-001 (scadaproj#41): the per-cache-entry filter memos of both projectors are now `ProjectionMemo`, capped at 64 signatures (FIFO; an evicted signature is recomputed, same answer). - GalaxyRepository-002 (scadaproj#42): a browse-subtree scope (`Plant/LineA/*`) no longer hides the allowed subtree's ancestors. `BrowseChildren` and `DiscoverHierarchy` return them as **navigation-only** nodes — attributes stripped, only the path to an allowed object listed, siblings still hidden. **Behaviour change for consumers:** a scoped `DiscoverHierarchy` now includes those ancestors (`GalaxyHierarchyQueryResult.NavigationAncestorCount` says how many); `WatchDeployEvents` still counts allowed objects only. Semantics documented on `IGalaxyBrowseScopeProvider`. ## Index history (migrated from the scadaproj root CLAUDE.md) > Moved verbatim out of the scadaproj root `CLAUDE.md` on 2026-09-03 so it loads only when needed. **This file is now the authoritative place for this history — append new entries here and keep the root index row short.** ### Narrative The Galaxy Repository component normalizes the **Galaxy object-hierarchy SQL browse + reusable gRPC service** that was previously embedded in `mxaccessgw`. Shared = canonical `galaxy_repository.v1` proto (wire-compatible with `mxaccessgw`'s existing contract so OtOpcUa's `GalaxyRepositoryClient` is unaffected), the SQL browse provider (`HierarchySql` / `AttributesSql` validated reverse-engineered queries), in-memory hierarchy cache + snapshot + deploy-poll refresh `BackgroundService`, `GalaxyHierarchyProjector`, and `AddZbGalaxyRepository` / `MapZbGalaxyRepository` DI extension. Left per-consumer = section path, subtree auth filtering, and any app-specific paging defaults. The shared library is **built and lives in this repo** at [`ZB.MOM.WW.GalaxyRepository/`](ZB.MOM.WW.GalaxyRepository/) (.NET 10; single package `ZB.MOM.WW.GalaxyRepository`; `dotnet pack` → 1 nupkg @ 0.1.0, **published to the Gitea NuGet feed** `gitea.dohertylan.com/api/packages/dohertj2/nuget`). The design doc is at [`docs/plans/2026-06-23-historian-gateway-design.md`](docs/plans/2026-06-23-historian-gateway-design.md) (§10, component 1). **Consumed by HistorianGateway** as a `PackageReference` from that Gitea feed, pinned at `0.2.0` (originally a cross-repo `ProjectReference` to this scadaproj tree; switched to the feed package 2026-06-24; bumped `0.1.0` → `0.2.0` 2026-06-25). **mxaccessgw has adopted it** (its Server calls `AddZbGalaxyRepository` / `MapZbGalaxyRepository`; the `galaxy_repository.v1` wire contract is identical, so OtOpcUa and ScadaBridge clients are unaffected). Build/test from `ZB.MOM.WW.GalaxyRepository/`: `dotnet test`. Consumer matrix: HistorianGateway (initial); mxaccessgw (adopted, 0.2.0).