Replaces the placeholder "configure an API key per gateway.md" with
the actual commands that worked end-to-end on this dev box:
- Build both halves (Worker x86 net48, Server net10)
- apikey init-db + apikey create-key with the seven scopes the parity
test exercises (session:*, invoke:*, events:read, metadata:read)
- Three env-var overrides at server startup — capturing real lessons
learned standing the rig up:
* Kestrel__Endpoints__Http__Url = http://localhost:5120
* Kestrel__Endpoints__Http__Protocols = Http2 (gRPC needs h2c on
plain HTTP — without this flag the client gets HTTP_1_1_REQUIRED)
* MxGateway__Worker__ExecutablePath = absolute path to the built
worker (appsettings.json's relative path drops \net48 and the
server can't resolve it)
- Note that workers spawn lazily on first OpenSession, not at server
startup — so port-listening is necessary but not sufficient
evidence the gateway is healthy.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Calls out the single-platform constraint on this dev box and the
graccess-cli at C:\Users\dohertj2\Desktop\graccess as the way to
configure the rest of the parity-rig Galaxy shape:
- ScanState probe parity (multi-platform) is deferred to a customer
rig — not feasible on this dev box. PR 7.2 gate accepts
"n/a, deferred" on those rows because PR 4.7's unit tests already
pin the state-decoder + member-tracking logic.
- Per-row provisioning recipes for the five ⚙-scriptable rows:
FreeAccess/Operate UDA, Configure/Tune UDA, value-change source
(recommend external write-loop over template surgery), $Alarm*
extension, History extension. All against a reserved
OtOpcUaParityTest sandbox UDO so plant-relevant objects stay
untouched.
- Trailing deploy + Galaxy.Host restart so MxAccess picks up the
change before re-running the matrix.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Walks through standing up both Galaxy backends side-by-side against a
single live Galaxy:
- Conceptual layout (two MxAccess sessions on distinct ClientNames so
they don't evict each other)
- What's already on the dev box (AVEVA + OtOpcUaGalaxyHost service)
- mxaccessgw build + run + config (API key, ClientName)
- The three OTOPCUA_PARITY_* env vars the harness reads
- HarnessShapeTests as the two-line truth-teller for "did both halves
resolve"
- Galaxy-shape coverage matrix mapping each scenario to what's needed
for it to assert (rather than skip)
- Soak run recipes, including the compressed-tag fallback when the dev
Galaxy doesn't have 50k attributes
- Troubleshooting for the four common SkipReasons
- Three further gates before PR 7.2 lands (matrix green, soak data,
pilot flip)
Explicitly drops the stale "use a non-elevated shell" precondition —
the legacy Galaxy.Host pipe ACL accepts elevated and non-elevated
dohertj2 alike (resolved 2026-04-24).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>