From 50f81a156dbd1b3499b63728e48b1b914039ae16 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Sat, 18 Apr 2026 00:46:23 -0400 Subject: [PATCH] =?UTF-8?q?Doc=20=E2=80=94=20PR=201=20body=20for=20Gitea?= =?UTF-8?q?=20web=20UI=20paste-in.=20PR=20title=20+=20summary=20+=20test?= =?UTF-8?q?=20matrix=20+=20reviewer=20test=20plan=20+=20follow-up=20tracki?= =?UTF-8?q?ng.=20Source=20phase-1-configuration=20=E2=86=92=20target=20v2;?= =?UTF-8?q?=20URL=20https://gitea.dohertylan.com/dohertj2/lmxopcua/pulls/n?= =?UTF-8?q?ew/phase-1-configuration.=20No=20gh/tea=20CLI=20on=20this=20box?= =?UTF-8?q?,=20so=20the=20body=20is=20staged=20here=20for=20the=20operator?= =?UTF-8?q?=20to=20paste=20into=20the=20Gitea=20web=20UI=20rather=20than?= =?UTF-8?q?=20auto-created=20via=20API.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/v2/implementation/pr-1-body.md | 80 +++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 docs/v2/implementation/pr-1-body.md diff --git a/docs/v2/implementation/pr-1-body.md b/docs/v2/implementation/pr-1-body.md new file mode 100644 index 0000000..4e78fec --- /dev/null +++ b/docs/v2/implementation/pr-1-body.md @@ -0,0 +1,80 @@ +# PR 1 — Phase 1 + Phase 2 A/B/C → v2 + +**Source**: `phase-1-configuration` (commits `980ea51..7403b92`, 11 commits) +**Target**: `v2` +**URL**: https://gitea.dohertylan.com/dohertj2/lmxopcua/pulls/new/phase-1-configuration + +## Summary + +- **Phase 1 complete** — Configuration project with 16 entities + 3 EF migrations + (InitialSchema + 8 stored procs + AuthorizationGrants), Core + Server + full Admin UI + (Blazor Server with cluster CRUD, draft → diff → publish → rollback, equipment with + OPC 40010, UNS, namespaces, drivers, ACLs, reservations, audit), LDAP via GLAuth + (`localhost:3893`), SignalR real-time fleet status + alerts. +- **Phase 2 Streams A + B + C feature-complete** — full IPC contract surface + (Galaxy.Shared, netstandard2.0, MessagePack), Galaxy.Host with real Win32 STA pump, + ACL + caller-SID + per-process-secret IPC, Galaxy-specific MemoryWatchdog + + RecyclePolicy + PostMortemMmf + MxAccessHandle, three `IGalaxyBackend` + implementations (Stub / DbBacked / **MxAccess** — real ArchestrA.MxAccess.dll + reference, x86, smoke-tested live against `LMXProxyServer`), Galaxy.Proxy with all + 9 capability interfaces (`IDriver` / `ITagDiscovery` / `IReadable` / `IWritable` / + `ISubscribable` / `IAlarmSource` / `IHistoryProvider` / `IRediscoverable` / + `IHostConnectivityProbe`) + supervisor (Backoff + CircuitBreaker + + HeartbeatMonitor). +- **Phase 2 Stream D non-destructive deliverables** — appsettings.json → DriverConfig + migration script, two-service Windows installer scripts, process-spawn cross-FX + parity test, Stream D removal procedure doc with both Option A (rewrite 494 v1 + tests) and Option B (archive + new v2 E2E suite) spelled out step-by-step. + +## What's NOT in this PR + +- Legacy `OtOpcUa.Host` deletion (Stream D.1) — reserved for a follow-up PR after + Option B's E2E suite is green. The 494 v1 tests still pass against the unchanged + legacy Host. +- Live-Galaxy parity validation (Stream E) — needs the iterative debug cycle the + removal-procedure doc describes. + +## Tests + +**964 pass / 1 pre-existing Phase 0 baseline failure**, across 14 test projects: + +| Project | Pass | Notes | +|---|---:|---| +| Core.Abstractions.Tests | 24 | | +| Configuration.Tests | 42 | incl. 7 schema compliance, 8 stored-proc, 3 SQL-role auth, 13 validator, 6 LiteDB cache, 5 generation-applier | +| Core.Tests | 4 | DriverHost lifecycle | +| Server.Tests | 2 | NodeBootstrap + LiteDB cache fallback | +| Admin.Tests | 21 | incl. 5 RoleMapper, 6 LdapAuth, 3 LiveLdap, 2 FleetStatusPoller, 2 services-integration | +| Driver.Galaxy.Shared.Tests | 6 | Round-trip + framing | +| Driver.Galaxy.Host.Tests | 30 | incl. 5 GalaxyRepository live ZB, 3 live MXAccess COM, 5 EndToEndIpc, 2 IpcHandshake, 4 MemoryWatchdog, 3 RecyclePolicy, 3 PostMortemMmf, 3 StaPump, 2 service-installer dry-run | +| Driver.Galaxy.Proxy.Tests | 10 | 9 unit + 1 process-spawn parity | +| Client.Shared.Tests | 131 | unchanged | +| Client.UI.Tests | 98 | unchanged | +| Client.CLI.Tests | 51 / 1 fail | pre-existing baseline failure | +| Historian.Aveva.Tests | 41 | unchanged | +| IntegrationTests (net48) | 6 | unchanged — v1 parity baseline | +| **OtOpcUa.Tests (net48)** | **494** | **unchanged — v1 parity baseline** | + +## Test plan for reviewers + +- [ ] `dotnet build ZB.MOM.WW.OtOpcUa.slnx` succeeds with no warnings beyond the + known NuGetAuditSuppress + xUnit1051 warnings +- [ ] `dotnet test ZB.MOM.WW.OtOpcUa.slnx` shows the same 964/1 result +- [ ] `Get-Service aaGR, aaBootstrap` reports Running on the merger's box +- [ ] `docker ps --filter name=otopcua-mssql` shows the SQL container Up +- [ ] Admin UI boots (`dotnet run --project src/ZB.MOM.WW.OtOpcUa.Admin`); home page + renders at http://localhost:5123/; LDAP sign-in with GLAuth `readonly` / + `readonly123` succeeds +- [ ] Migration script dry-run: `powershell -File + scripts/migration/Migrate-AppSettings-To-DriverConfig.ps1 -DryRun` produces + a well-formed DriverConfig JSON +- [ ] Spot-read three commit messages to confirm the deferred-with-rationale items + are explicitly documented (`549cd36`, `a7126ba`, `7403b92` are the most + recent and most detailed) + +## Follow-up tracking + +PR 2 (next session) will execute Stream D Option B — archive `OtOpcUa.Tests` as +`OtOpcUa.Tests.v1Archive`, build the new `OtOpcUa.Driver.Galaxy.E2E` test project, +delete legacy `OtOpcUa.Host`, and run the parity-validation cycle. See +`docs/v2/implementation/stream-d-removal-procedure.md`.