docs: truth sweep — index + component GAPS reconciled with shipped state (Health 0.3.0 merged both apps, OtOpcUa LocalDb Phase 2 executed, Auth 0.1.5, Secrets 0.2.3/0.3.0)

Claude-Session: https://claude.ai/code/session_014WNM4vjoVksyyBraTXSZE1
This commit is contained in:
Joseph Doherty
2026-08-07 02:00:58 -04:00
parent 1a7bff6a19
commit 537a4f524d
23 changed files with 304 additions and 261 deletions
+7 -7
View File
@@ -17,13 +17,13 @@ specs and analyses that *drive* changes made in the individual repos.
| Component | Status | Applies to | Goal | Folder |
|---|---|---|---|---|
| Auth (login / identity / authz) | Draft | OtOpcUa, MxAccessGateway, ScadaBridge | Path to shared code (`ZB.MOM.WW.Auth`) | [`auth/`](auth/) |
| UI Theme (layout / tokens / components) | Draft | OtOpcUa, MxAccessGateway, ScadaBridge | Path to shared code (`ZB.MOM.WW.Theme`) | [`ui-theme/`](ui-theme/) |
| Health (readiness / liveness / active-node) | Draft | OtOpcUa, MxAccessGateway, ScadaBridge | Shared `ZB.MOM.WW.Health` lib (3 packages) | [`health/`](health/) |
| Observability (metrics / traces / logs) | Draft | OtOpcUa, MxAccessGateway, ScadaBridge | Shared `ZB.MOM.WW.Telemetry` lib (2 packages) | [`observability/`](observability/) |
| Config + validation (options / startup validation) | Draft | OtOpcUa, MxAccessGateway, ScadaBridge | Shared `ZB.MOM.WW.Configuration` lib (1 package) | [`configuration/`](configuration/) |
| Audit (event model + writer seam) | Draft | OtOpcUa, MxAccessGateway, ScadaBridge | Path to shared code (`ZB.MOM.WW.Audit`) | [`audit/`](audit/) |
| Secrets (encrypted store + `${secret:}` resolution) | Built + reference-consumer adopted | OtOpcUa, MxAccessGateway, ScadaBridge | Shared `ZB.MOM.WW.Secrets` lib (3 packages + CLI) | [`secrets/`](secrets/) |
| Auth (login / identity / authz) | Adopted | OtOpcUa, MxAccessGateway, ScadaBridge | Path to shared code (`ZB.MOM.WW.Auth`) | [`auth/`](auth/) |
| UI Theme (layout / tokens / components) | Adopted | OtOpcUa, MxAccessGateway, ScadaBridge | Path to shared code (`ZB.MOM.WW.Theme`) | [`ui-theme/`](ui-theme/) |
| Health (readiness / liveness / active-node) | Adopted | OtOpcUa, MxAccessGateway, ScadaBridge | Shared `ZB.MOM.WW.Health` lib (3 packages) | [`health/`](health/) |
| Observability (metrics / traces / logs) | Adopted | OtOpcUa, MxAccessGateway, ScadaBridge | Shared `ZB.MOM.WW.Telemetry` lib (2 packages) | [`observability/`](observability/) |
| Config + validation (options / startup validation) | Adopted | OtOpcUa, MxAccessGateway, ScadaBridge | Shared `ZB.MOM.WW.Configuration` lib (1 package) | [`configuration/`](configuration/) |
| Audit (event model + writer seam) | Adopted | OtOpcUa, MxAccessGateway, ScadaBridge | Path to shared code (`ZB.MOM.WW.Audit`) | [`audit/`](audit/) |
| Secrets (encrypted store + `${secret:}` resolution) | Adopted (all four apps pin `0.2.3`) | OtOpcUa, MxAccessGateway, ScadaBridge | Shared `ZB.MOM.WW.Secrets` lib (5 packages + CLI) | [`secrets/`](secrets/) |
> Add a row when you start normalizing a new component. Status: `Draft` → `Reviewed` → `Adopting` → `Converged`.
+16 -10
View File
@@ -14,18 +14,24 @@ reach the shared `ZB.MOM.WW.Auth` library. Status legend: ⛔ gap · 🟡 partia
> resolve `2.1.12`; **HistorianGateway was never exposed** (already resolved `3.50.3` via another
> dependency), so its bump is consistency-only. ScadaBridge's `0.1.3`→`0.1.5` jump crosses the
> `0.1.4` `ExpiresUtc` change, but that was additive — no source changes were needed and its
> suites match baseline exactly (Security 181, InboundAPI 269). **OtOpcUa stays at `0.1.1`** and
> was never exposed: it takes no `ApiKeys`/SQLite dependency.
> suites match baseline exactly (Security 181, InboundAPI 269). **OtOpcUa stayed at `0.1.1`** at
> the time and was never exposed (it takes no `ApiKeys`/SQLite dependency) — it then bumped
> `0.1.1`→`0.1.5` on 2026-07-20 for family alignment (`1adaa2fc`, PR #484, on `origin/master`).
>
> ⚠️ **Caveat:** HistorianGateway's bump could NOT be test-verified — a pre-existing, unrelated
> `AngleSharp` NU1902 error blocks its test project under `TreatWarningsAsErrors` (ScadaBridge's
> `CentralUI.Tests` has the same break). Both confirmed present on clean trees beforehand.
> ⚠️ **Caveat — RESOLVED 2026-07-19:** HistorianGateway's bump could NOT be test-verified at the
> time — a pre-existing, unrelated `AngleSharp` NU1902 error blocked its test project under
> `TreatWarningsAsErrors` (ScadaBridge's `CentralUI.Tests` had the same break; both confirmed
> present on clean trees beforehand). The HG blocker was fixed by HG commit `6bc005d`
> ("fix(tests): pin AngleSharp 1.5.2 — clear GHSA-pgww-w46g-26qg NU1902 build break"), after which
> the suite runs (854 pass; see the scadaproj `CLAUDE.md` index Secrets narrative).
>
> **Current state (verified 2026-07-18):** feed carries `0.1.0`–`0.1.5`; consumer pins are
> OtOpcUa `0.1.1`, ScadaBridge `0.1.3`, MxAccessGateway `0.1.4`, **HistorianGateway `0.1.4`**
> (a fourth consumer this file predates, taking all four packages). OtOpcUa is three minors
> behind — it does not get the `0.1.4` API-key-expiry enforcement. Library suite: **215 passing,
> 1 skipped**, green 2026-07-18.
> **Current state (re-verified 2026-08-07 against each repo's `Directory.Packages.props`):** feed
> carries `0.1.0`–`0.1.5`; **all four consumers pin `0.1.5`** — mxaccessgw `e107019`, ScadaBridge
> `50d79ed1`, HistorianGateway `df211ee` (all 2026-07-18), OtOpcUa `1adaa2fc` (2026-07-20).
> (The previous snapshot here — OtOpcUa `0.1.1` / ScadaBridge `0.1.3` / MxAccessGateway `0.1.4` /
> HistorianGateway `0.1.4` — predated the same-day bumps recorded in the banner above and
> contradicted it.) HistorianGateway is a fourth consumer this file predates, taking all four
> packages. Library suite: **215 passing, 1 skipped**, green 2026-07-18.
>
> **✅ ADOPTED 2026-06-02 (local-only).** The full backlog (#1–#8) was implemented across all three apps on each repo's
> **`feat/adopt-zb-auth`** branch — committed + spec/code-reviewed, then **merged to each repo's local default
+6
View File
@@ -15,6 +15,12 @@ wired for ScadaBridge Cluster/HealthMonitoring, and assorted hardening).
Status legend: ⛔ gap · 🟡 partial · ✅ matches.
> **Note (reconciled 2026-08-07):** the divergence tables below are the **pre-adoption 2026-06-01
> snapshot**. In particular, cells reading OtOpcUa "⛔ n/a (no validators)" describe the state
> *before* adoption — as the header above records, OtOpcUa gained net-new `Ldap`/`OpcUa` validators
> (via `OptionsValidatorBase` + `AddValidatedOptions`) in the adoption pass, so those cells and the
> "OtOpcUa has **no validators at all**" prose are historical, not current. Gaps B3/A1/W3 are closed.
## Divergence vs spec
### §1 `IValidateOptions` base — failure accumulation (everyone hand-rolls it)
+6 -3
View File
@@ -12,9 +12,12 @@ reach the shared `ZB.MOM.WW.Telemetry` library. Status legend: ⛔ gap · 🟡 p
>
> **The `⛔ not set` divergence tables below are the pre-adoption 2026-06-01 snapshot** — the §1
> Resource-attribute gaps they describe are what `AddZbTelemetry` closed. Read them as the
> historical case for the library, not as current state. Deferred items noted at the time
> (MxGateway `ms`→`s` + Meter rename, ScadaBridge app instruments + Site-node HTTP/1.1 metrics
> listener, OTLP wiring) were **not** re-verified in this pass.
> historical case for the library, not as current state. The items deferred at adoption time
> (MxGateway `ms`→`s` + Meter rename, ScadaBridge app instruments + Site-node `:8084` metrics
> listener, OTLP opt-in wiring) were **all subsequently executed the same day** — see the
> "Follow-ons — DONE 2026-06-01" table at the bottom of this file, which this banner previously
> contradicted (reconciled 2026-08-07). Only the operational items under "Still open" there
> (deploying an OTel collector; further ScadaBridge instruments) remain.
## Divergence vs spec
+15 -8
View File
@@ -19,10 +19,12 @@ construction).
fix. Verified: the shipped `.nuspec` declares `SQLitePCLRaw.lib.e_sqlite3 >= 2.1.12` as a direct
dependency, so **consumers get the patched native lib without needing their own pin**, and a
fresh consumer restoring `0.1.3` scans clean.
- **All four apps are still pinned at `0.1.2`** — they get neither KEK rotation nor the security
fix until bumped.
- **All four apps are pinned to `0.1.2`** — OtOpcUa, MxAccessGateway, ScadaBridge take
`Secrets` + `.Abstractions` + `.Ui`; HistorianGateway takes `Secrets` + `.Ui`.
- **All four apps now pin `0.2.3`, pushed 2026-07-19** (superseding the "still pinned at `0.1.2`"
claim that stood here — corrected 2026-08-07; the 0.1.2→0.2.1 bump and the 0.2.2/0.2.3 rollout
are recorded below and in the scadaproj `CLAUDE.md` index). OtOpcUa, MxAccessGateway, ScadaBridge
take `Secrets` + `.Abstractions` + `.Ui`; HistorianGateway takes `Secrets` + `.Ui`.
- **`0.3.0` (2026-07-19) ships in the `secret` CLI tool only** (interactive operator console); the
four apps deliberately stay on the `0.2.3` libraries — the 0.3.0 delta has no app-side surface.
- **G-7 clustered replication is BUILT (2026-07-18, lib `0.2.0`) — both options, not just one.**
The plan scoped Option A (shared SQL store) and deferred Option B (Akka) to phase 2; the build
covers **both**, as two new packages:
@@ -50,8 +52,10 @@ construction).
### Open
- ✅ **All four apps bumped `0.1.2` → `0.2.1`** (2026-07-18), each on a local `feat/secrets-0.2.0`
branch, **not pushed**. HistorianGateway `bb9d923`, MxAccessGateway `b021e29`, OtOpcUa `1ccc237c`,
ScadaBridge `0083ce35`.
branch (HistorianGateway `bb9d923`, MxAccessGateway `b021e29`, OtOpcUa `1ccc237c`,
ScadaBridge `0083ce35`). *Superseded 2026-07-19:* the branches were carried forward through the
`0.2.2`/`0.2.3` fixes and **all four apps landed on `0.2.3`, merged and pushed** (the "not
pushed" note above described the interim 0.2.1 state only — corrected 2026-08-07).
- **Correction:** the bump was originally justified as closing GHSA-2m69-gcr7-jv3q in all four
apps. Measured against the `0.1.2` baseline in every repo, **all four already resolved the
patched `SQLitePCLRaw.lib.e_sqlite3 2.1.12`** — two via their own pins, two transitively via
@@ -270,8 +274,11 @@ evidence it is correct. When a reviewer names a mechanism, probe the mechanism.
operator runbook — full suite green (82+15, 0 regressions) + end-to-end CLI smoke, adversarial
crypto review PASS with a review-caught TOCTOU closed via compare-and-swap. G-7's SQL-store-vs-Akka
fork is resolved (build the shared SQL-Server `ISecretStore`; Akka replicator deferred phase-2)
with a design doc + executable plan + `.tasks.json`, **no code built**. See the G-7/G-8 backlog
entries below. Not yet committed/pushed (awaiting go-ahead).
with a design doc + executable plan + `.tasks.json`, **no code built at that point**. See the
G-7/G-8 backlog entries below. *(Corrected 2026-08-07: the trailing "Not yet committed/pushed
(awaiting go-ahead)" note was stale — G-8 + the G-7 plan ARE committed and pushed on `main` @
`d82d345`, as the Current-state section above already records; G-7 was subsequently BUILT
2026-07-18 at lib `0.2.0`, both replication options.)*
## Design + implementation plans (2026-07-16)