Publishes the three ZB.MOM.WW.LocalDb packages to the Gitea feed (restore-verified from a scratch consumer) and adds the build/push.sh the other shared libs already have. The status prose across CLAUDE.md, README.md and components/*/GAPS.md had drifted from reality, so it was re-derived from the feed listing and the actual PackageReferences + registration calls on each consumer's default branch rather than from prior claims. Five claims were false: Health "not yet adopted" (all four apps wire MapZbHealth), GalaxyRepository's mxaccessgw adoption "a follow-on" (its Server wires AddZbGalaxyRepository), Configuration "not yet pushed", Secrets G-8 "not yet committed", and Theme pinned at 0.2.0 (all four are on 0.3.1). Every doc also said "three apps" while HistorianGateway is a fourth consumer of seven libs, and all eight libraries' test counts were stale (re-ran each suite; all green). Surfaces one previously unrecorded gap: Secrets source is at 0.1.3 with KEK rotation committed, but the feed tops out at 0.1.2, so no app can consume rotation until it is published. Health and observability divergence tables are labelled historical, not re-verified — the libraries are proven wired, but per-app probe coverage vs spec was not re-walked. Claude-Session: https://claude.ai/code/session_01BL2Vu1ESDQ9SCN4gVKkdts
UI Theme (layout / tokens / components)
Second normalized component. Goal: path to shared code — converge the three sister
projects onto a common "Technical-Light" design system, realized as the ZB.MOM.WW.Theme
Razor Class Library.
- The one target:
spec/SPEC.md - Design tokens reference:
spec/DESIGN-TOKENS.md - The shared library:
shared-contract/ZB.MOM.WW.Theme.md - Divergences + backlog:
GAPS.md - Current state, per project:
current-state/
Why UI theme is a strong candidate
All three sister apps share a Blazor SSR + Bootstrap 5 UI stack and each ships a
hand-copied 379-line theme.css (the "Technical-Light" design system: IBM Plex
@font-face, :root design tokens, status palette, typography helpers). The three
copies are byte-for-byte identical except for three lines — the @font-face src:
URL prefix differs per app deployment convention. IBM Plex .woff2 fonts are likewise
vendored three times into each app's wwwroot/fonts/. This is the textbook drift
situation: a shared design system already beginning to diverge, with a latent font-path
bug in one app (OtOpcUa) that goes unnoticed because browsers fall back to system fonts.
Status by project
| Project | Surface | Layout today | Adoption status |
|---|---|---|---|
| OtOpcUa | ZB.MOM.WW.OtOpcUa.AdminUI |
Side rail (NavSidebar.razor) + theme.css + IBM Plex |
Not started |
| MxAccessGateway | ZB.MOM.WW.MxGateway.Server Dashboard |
Sidebar (nav.sidebar) + theme.css + IBM Plex |
Not started |
| ScadaBridge | ZB.MOM.WW.ScadaBridge.Host + .CentralUI (RCL) |
Own MainLayout + NavMenu (nav.sidebar) + theme.css + IBM Plex |
Not started |
See each project's current-state/<project>/CURRENT-STATE.md for the
code-verified detail and its adoption plan.
Normalized vs. left per-project
Normalized (extracted into the RCL ZB.MOM.WW.Theme): design tokens + IBM Plex
fonts, the canonical side-rail shell (ThemeShell + BrandBar + NavRailItem +
NavRailSection), and the four widgets (StatusPill, LoginCard, TechButton,
TechCard, TechField). One RCL, one package, one version.
Left per-project (NOT extracted): each app's site.css residual page layout, its
page/route content, and app-specific scoped .razor.css (e.g. ScadaBridge's
MultiSelectDropdown, TreeView, Audit/*). The kit owns the chrome and tokens, not
the app's domain screens.