diff --git a/CLAUDE.md b/CLAUDE.md index 5fa1c12..bc4ee67 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,11 +6,12 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co `scadaproj` is primarily an umbrella/index workspace that aggregates a family of related SCADA / OT / Wonderware / OPC UA "sister projects" that live as **sibling -directories under `~/Desktop/`**. It now also **hosts four pieces of source itself** — +directories under `~/Desktop/`**. It now also **hosts five pieces of source itself** — the shared [`ZB.MOM.WW.Auth/`](ZB.MOM.WW.Auth/) library, the shared [`ZB.MOM.WW.Theme/`](ZB.MOM.WW.Theme/) UI kit, the shared -[`ZB.MOM.WW.Health/`](ZB.MOM.WW.Health/) health-check library, and the shared -[`ZB.MOM.WW.Telemetry/`](ZB.MOM.WW.Telemetry/) observability library — all the realized output of their +[`ZB.MOM.WW.Health/`](ZB.MOM.WW.Health/) health-check library, the shared +[`ZB.MOM.WW.Telemetry/`](ZB.MOM.WW.Telemetry/) observability library, and the shared +[`ZB.MOM.WW.Configuration/`](ZB.MOM.WW.Configuration/) config-validation library — all the realized output of their respective component normalizations (see [Component normalization](#component-normalization)). The point of this file is to give a high-level scan of each sister project — its purpose, location, stack, and primary commands — so a fresh Claude Code session can orient across @@ -123,6 +124,7 @@ each project's **code-verified current state**, and the **gaps** between. See | UI Theme (layout / tokens / components) | Built (lib `0.1.0`) | Shared `ZB.MOM.WW.Theme` RCL | [`components/ui-theme/`](components/ui-theme/) | [`ZB.MOM.WW.Theme/`](ZB.MOM.WW.Theme/) | | Health (readiness / liveness / active-node) | Built (lib `0.1.0`) | Shared `ZB.MOM.WW.Health` lib | [`components/health/`](components/health/) | [`ZB.MOM.WW.Health/`](ZB.MOM.WW.Health/) | | Observability (metrics / traces / logs) | Built (lib `0.1.0`) | Shared `ZB.MOM.WW.Telemetry` lib + `.Serilog` | [`components/observability/`](components/observability/) | [`ZB.MOM.WW.Telemetry/`](ZB.MOM.WW.Telemetry/) | +| Config + validation (options / startup validation) | Built (lib `0.1.0`) | Shared `ZB.MOM.WW.Configuration` lib | [`components/configuration/`](components/configuration/) | [`ZB.MOM.WW.Configuration/`](ZB.MOM.WW.Configuration/) | | Audit (event model + writer seam) | Built (lib `0.1.0`) | Shared `ZB.MOM.WW.Audit` lib | [`components/audit/`](components/audit/) | [`ZB.MOM.WW.Audit/`](ZB.MOM.WW.Audit/) | The auth component is fully populated: a normalized [`spec`](components/auth/spec/SPEC.md), a @@ -187,6 +189,25 @@ follow-on, tracked in [`components/observability/GAPS.md`](components/observabil Build/test from `ZB.MOM.WW.Telemetry/`: `dotnet test`. Consumer matrix: all three apps consume both packages after adoption (OtOpcUa, MxGateway Server, ScadaBridge Host + any instrumented project). +The configuration component is fully populated: a normalized [`spec`](components/configuration/spec/SPEC.md), a +[`shared-contract`](components/configuration/shared-contract/ZB.MOM.WW.Configuration.md), three +[`current-state`](components/configuration/current-state/) docs, and an adoption [`GAPS`](components/configuration/GAPS.md) +backlog. Shared = the `IValidateOptions` failure-accumulation base (`OptionsValidatorBase`) + +reusable rule primitives (`ValidationBuilder`: port / host:port / required / positive-duration / one-of / +min-count) + `AddValidatedOptions()` (bind + validate + `ValidateOnStart`) + the +pre-host `ConfigPreflight` aggregator (generalizes ScadaBridge's `StartupValidator`, byte-compatible +message); left per-project = each app's options classes + domain rules, and OtOpcUa's runtime +draft/snapshot validation. + +The shared library is **built and lives in this repo** at [`ZB.MOM.WW.Configuration/`](ZB.MOM.WW.Configuration/) +(.NET 10; single package `ZB.MOM.WW.Configuration`; 27 tests; `dotnet pack` → 1 nupkg @ 0.1.0). +The implementation plan is at +[`docs/plans/2026-06-01-zb-mom-ww-configuration-shared-library.md`](docs/plans/2026-06-01-zb-mom-ww-configuration-shared-library.md). +**Not yet adopted** by the three apps — that's the follow-on tracked in [`components/configuration/GAPS.md`](components/configuration/GAPS.md). +Build/test from `ZB.MOM.WW.Configuration/`: `dotnet test`. Consumer matrix: all three apps consume the +single package; ScadaBridge is the heaviest adopter (per-module validators + `StartupValidator` → +`ConfigPreflight`); OtOpcUa adoption is additive (it has no `IValidateOptions` usage today). + The audit component is fully populated: a normalized [`spec`](components/audit/spec/SPEC.md), an [`event-model`](components/audit/spec/EVENT-MODEL.md) reference, a [`shared-contract`](components/audit/shared-contract/ZB.MOM.WW.Audit.md), three diff --git a/components/README.md b/components/README.md index b8103bd..4966f13 100644 --- a/components/README.md +++ b/components/README.md @@ -21,6 +21,7 @@ specs and analyses that *drive* changes made in the individual repos. | 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/) | > Add a row when you start normalizing a new component. Status: `Draft` → `Reviewed` → `Adopting` → `Converged`. diff --git a/upcoming.md b/upcoming.md index 3d8ee86..746f8b9 100644 --- a/upcoming.md +++ b/upcoming.md @@ -77,8 +77,7 @@ cross-repo interop checks, distinct from the others. family is being delivered as `ZB.MOM.WW.Telemetry.Serilog` by the health/observability normalization pass ([`components/health/`](components/health/)), not as a standalone `ZB.MOM.WW.Logging` lib — a separate Logging candidate is not expected. -- **Config validation conventions:** all three use IOptions + `IValidateOptions` + `ValidateOnStart`; - a shared validation base + startup-validation helper is reusable and pairs with the Auth options pattern. +- ~~**Config validation conventions:**~~ **Done** — `ZB.MOM.WW.Configuration` built @ 0.1.0 (1 package, 27 tests): `OptionsValidatorBase` + `ValidationBuilder` primitives + `AddValidatedOptions` (`ValidateOnStart`) + pre-host `ConfigPreflight` (generalizes ScadaBridge's `StartupValidator`). Design: [`components/configuration/`](components/configuration/); implementation: [`../ZB.MOM.WW.Configuration/`](../ZB.MOM.WW.Configuration/). Adoption tracked in [`components/configuration/GAPS.md`](components/configuration/GAPS.md). ## Skip / defer - **Result/error primitives** — trivially shareable but low-stakes and bikeshed-prone.