Claude-Session: https://claude.ai/code/session_01GT67AEHd2Acv1YPwGfXEoV
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 optionalIOptionsctor parameter onGalaxyHierarchyCache); the projected-Stale entry is memoized per source entry. - 005:
WatchDeployEventssubscribers never see a non-increasingSequence. - 006: container-building tests for
AddZbGalaxyRepository. - 007:
System.Security.Cryptography.Pkcspinned at 9.0.21 (clears NU1902/NU1903 for consumers). - 008: empty
SnapshotCachePathdisables 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.BrowseChildrenandDiscoverHierarchyreturn them as navigation-only nodes — attributes stripped, only the path to an allowed object listed, siblings still hidden. Behaviour change for consumers: a scopedDiscoverHierarchynow includes those ancestors (GalaxyHierarchyQueryResult.NavigationAncestorCountsays how many);WatchDeployEventsstill counts allowed objects only. Semantics documented onIGalaxyBrowseScopeProvider.
Index history (migrated from the scadaproj root CLAUDE.md)
Moved verbatim out of the scadaproj root
CLAUDE.mdon 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).