Files
scadaproj/ZB.MOM.WW.GalaxyRepository/CLAUDE.md
T

3.8 KiB

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<T>, 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/ (.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 (§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).