Files
scadaproj/components/secrets
Joseph Doherty 46523db2bd docs(secrets): close scadaproj#4 — central shared SQL store + failover shipped
Program closeout: scadaproj#4 CLOSED (comment issuecomment-5751) — ScadaBridge's
central pair now runs ONE shared SQL-Server store in Grpc mode (0.5.0
FallbackEndpoints, 0.5.1 virgin-DB migrator race fix; ScadaBridge @ e697477c),
live-gated PASS 5/5 + re-drill. The pre-Serilog container-wedge defect the gate
reproduced twice is filed as ScadaBridge#34 (pre-existing, out of program scope).

- clustered-secrets.md: central pair = one shared SQL store (connstr literal/env,
  never ${secret:}); rewrap = ONE central run + both nodes of each site pair;
  FallbackEndpoints same-store-only rule; 0.5.1 minimum for central pairs
- components/secrets/GAPS.md: resolution section appended; stale wait-on-#4 struck
- CLAUDE.md Secrets row: #4 CLOSED, family 0.5.1, gate + residual recorded
- tasks.json: all 6 tasks completed

Claude-Session: https://claude.ai/code/session_014WNM4vjoVksyyBraTXSZE1
2026-08-07 11:43:53 -04:00
..

Secrets (encrypted secret store + ${secret:} resolution)

Normalizes how the family stores and consumes secrets — SQL/login passwords, API-key HMAC peppers, LDAP bind passwords, connection strings, TLS material — which are handled ad-hoc and inconsistently across the three apps today (Data-Protection-encrypted connection strings in ScadaBridge; peppers/passwords in environment variables; LDAP passwords in appsettings).

The goal is the shared ZB.MOM.WW.Secrets library: AES-256-GCM envelope encryption at rest, a pluggable master-key provider and store, an audited ISecretResolver + ${secret:name} config expander for app runtime, and a Blazor /admin/secrets management UI. The library is built, published (0.1.2), and live-proven via its reference consumer; per-app adoption is the tracked follow-on.

Status

State
Library Built + published — ZB.MOM.WW.Secrets{,.Abstractions,.Ui} 0.1.2 on the dohertj2-gitea feed; .Cli in-repo (not packed); .Akka replicator deferred (design only)
Reference consumer HistorianGateway — adopted + live-proven (2026-07-16): historian password sourced via ${secret:}, authenticated read against the real wonder historian
Three sister apps Not yet adopted — see per-app current-state + GAPS

Per-project current state

Project Today (baseline) Doc
OtOpcUa (code-verified baseline) current-state/otopcua/CURRENT-STATE.md
MxAccessGateway (code-verified baseline) current-state/mxaccessgw/CURRENT-STATE.md
ScadaBridge (code-verified baseline) current-state/scadabridge/CURRENT-STATE.md

Not applicable as a fourth adopter row but the exemplar: HistorianGateway already consumes the lib — its wiring is the template the three apps follow (see the shared-contract "Consumer wiring" section).