A browse-subtree scope such as Plant/LineA/* filtered out Plant and Plant/LineA, so scoped lazy browse from the root was empty and DiscoverHierarchy returned orphans. Out-of-scope ancestors of an allowed object are now returned as navigation-only containers: attributes stripped, child_has_children = true, and only their children on the path to an allowed object are listed (siblings stay hidden). DiscoverHierarchy reports them in GalaxyHierarchyQueryResult.NavigationAncestorCount; WatchDeployEvents subtracts it so its scoped counts stay allowed-objects-only. - tests: ScopedAncestorBrowseTests; deploy-event scope test updated - IGalaxyBrowseScopeProvider documents the semantics; CLAUDE.md 0.2.1 notes - code-reviews: GalaxyRepository-002 Resolved; README regenerated Claude-Session: https://claude.ai/code/session_01GT67AEHd2Acv1YPwGfXEoV
3.2 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.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 adoption is a tracked follow-on — once adopted, mxaccessgw's inline Galaxy browse code is replaced
by the shared lib (the galaxy_repository.v1 wire contract is already identical, so OtOpcUa and ScadaBridge
clients are unaffected). Build/test from ZB.MOM.WW.GalaxyRepository/: dotnet test.
Consumer matrix: HistorianGateway (initial); mxaccessgw (follow-on adoption).