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:
@@ -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
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user