docs: reconcile alarms-over-gateway banner with audited source #419

Closed
dohertj2 wants to merge 1 commits from docs/alarms-plan-banner-reconcile into master
Owner

Summary

The docs/plans/alarms-over-gateway.md banner claimed All 19 PRs merged while the same block warned that worker-side alarm subscription is blocked. An audit of both repos on 2026-05-01 found the banner overstated reality on four merged PRs and asked for an architectural decision that had actually been resolved on 2026-04-30.

What the audit found

Functional end-to-end (verified against source): B.1 / B.2 / B.3 / B.4 / B.5 / C.2 / D.1 script / E.1–E.7.

Merged-but-inert scaffolds (gated on worker AlarmClient wiring):

  • A.2MxAccessAlarmEventSink.Attach is a no-op (mxaccessgw repo).
  • A.3 / A.4MxAccessGatewayService RPC handlers route through NotWiredAlarmRpcDispatcher (Ack returns OK with worker dispatch pending dev-rig wiring diagnostic; Query yields empty stream).
  • C.1SdkAlarmHistorianWriteBackend.WriteBatchAsync returns RetryPlease for every event with a placeholder log; live aahClientManaged SDK call site pinned during D.1 dev-rig smoke.

Architectural decision RESOLVED 2026-04-30 (recorded in mxaccessgw MxAccessAlarmEventSink.cs xmldoc): the worker hosts aaAlarmManagedClient.AlarmClient (x86 net48 — same bitness as the existing MxAccess COM consumer) alongside the COM consumer, sharing the STA + WM_APP message pump. The earlier AVEVA SDK is x64-only concern proved wrong against the deployed assemblies. Discovered API surface: RegisterConsumer, Subscribe, GetStatistics, GetAlarmExtendedRec, AlarmAckByGUID. What remains is wiring PRs in the worker, not architectural choice.

D.1 smoke artifact (docs/plans/artifacts/d1-rollout-YYYY-MM-DD.md) not yet captured — directory does not exist.

Doc-only change

The banner is the only file touched. The plan body and design record are preserved verbatim.

Test plan

  • Read the new banner top-to-bottom — every claim resolves against the source tree referenced.
  • Confirm the four inert-scaffold call-outs name files / classes that exist on master in their respective repos.

🤖 Generated with Claude Code

## Summary The `docs/plans/alarms-over-gateway.md` banner claimed *All 19 PRs merged* while the same block warned that worker-side alarm subscription is blocked. An audit of both repos on 2026-05-01 found the banner overstated reality on four merged PRs and asked for an architectural decision that had actually been resolved on 2026-04-30. ## What the audit found **Functional end-to-end (verified against source):** B.1 / B.2 / B.3 / B.4 / B.5 / C.2 / D.1 script / E.1–E.7. **Merged-but-inert scaffolds (gated on worker AlarmClient wiring):** - **A.2** — `MxAccessAlarmEventSink.Attach` is a no-op (`mxaccessgw` repo). - **A.3 / A.4** — `MxAccessGatewayService` RPC handlers route through `NotWiredAlarmRpcDispatcher` (Ack returns OK with *worker dispatch pending dev-rig wiring* diagnostic; Query yields empty stream). - **C.1** — `SdkAlarmHistorianWriteBackend.WriteBatchAsync` returns `RetryPlease` for every event with a placeholder log; live `aahClientManaged` SDK call site pinned during D.1 dev-rig smoke. **Architectural decision RESOLVED 2026-04-30** (recorded in `mxaccessgw` `MxAccessAlarmEventSink.cs` xmldoc): the worker hosts `aaAlarmManagedClient.AlarmClient` (x86 net48 — same bitness as the existing MxAccess COM consumer) alongside the COM consumer, sharing the STA + WM_APP message pump. The earlier *AVEVA SDK is x64-only* concern proved wrong against the deployed assemblies. Discovered API surface: `RegisterConsumer`, `Subscribe`, `GetStatistics`, `GetAlarmExtendedRec`, `AlarmAckByGUID`. What remains is wiring PRs in the worker, not architectural choice. **D.1 smoke artifact** (`docs/plans/artifacts/d1-rollout-YYYY-MM-DD.md`) not yet captured — directory does not exist. ## Doc-only change The banner is the only file touched. The plan body and design record are preserved verbatim. ## Test plan - [ ] Read the new banner top-to-bottom — every claim resolves against the source tree referenced. - [ ] Confirm the four inert-scaffold call-outs name files / classes that exist on master in their respective repos. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
dohertj2 added 1 commit 2026-05-01 06:34:03 -04:00
The 'All 19 PRs merged' banner contradicted the warning paragraph in
the same block and overstated reality against the source tree. Audit
of the lmxopcua + mxaccessgw repos on 2026-05-01 found:

- 17 of 19 PRs merged. Four merged PRs ship inert scaffolds:
  - A.2: MxAccessAlarmEventSink.Attach is a no-op.
  - A.3 / A.4: NotWiredAlarmRpcDispatcher returns OK-with-diagnostic
    for AcknowledgeAlarm and an empty stream for QueryActiveAlarms.
  - C.1: SdkAlarmHistorianWriteBackend.WriteBatchAsync returns
    RetryPlease for every event with a placeholder log.
- The architectural decision the warning paragraph asks the operator
  to make was already resolved 2026-04-30. MxAccessAlarmEventSink.cs
  in mxaccessgw records that aaAlarmManagedClient.AlarmClient is x86
  net48 (same bitness as the worker), and pins the discovered API
  surface (RegisterConsumer / Subscribe / GetStatistics /
  GetAlarmExtendedRec / AlarmAckByGUID). What remains is wiring PRs
  in the worker, not architectural choice.
- D.1 smoke artifact (docs/plans/artifacts/d1-rollout-YYYY-MM-DD.md)
  not yet captured; directory does not exist.

Banner rewritten to split functional-end-to-end vs merged-but-inert
PRs explicitly so future readers don't have to reconcile the doc
against the source tree themselves.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Author
Owner

Superseded — closing.

This docs reconciliation (opened 2026-05-01) has been overtaken by the #420 closure work. docs/plans/alarms-over-gateway.md was rewritten in PR #467 (merged 2026-07-15, master 97e06b47) with a "FINAL RECONCILIATION 2026-07-15" banner that reflects the current audited state, and this branch now conflicts with master on the same lines (mergeable: false).

Every merged-but-inert scaffold this PR flagged has since been resolved:

  • A.2 / A.3 / A.4 — worker-side AlarmClient wiring landed; NotWiredAlarmRpcDispatcher retired (mxaccessgw WnWrapAlarmConsumer + FailoverAlarmConsumer + AlarmDispatcher + AlarmCommandHandler; lmxopcua GalaxyDriver : IAlarmSource feed + ack). Tracked/closed in #420.
  • C.1 — the SdkAlarmHistorianWriteBackend / Wonderware sidecar path was retired entirely; alarm-history now writes via GatewayAlarmHistorianWriter (HistorianGateway SendEvent), live-verified 2026-07-15 (R2-06/R2-08).

Merging this would resurrect the old "blocked / dispatch pending" language that #467 deliberately corrected. Closing as superseded; no changes lost.

Superseded — closing. This docs reconciliation (opened 2026-05-01) has been overtaken by the #420 closure work. `docs/plans/alarms-over-gateway.md` was rewritten in PR #467 (merged 2026-07-15, master `97e06b47`) with a "FINAL RECONCILIATION 2026-07-15" banner that reflects the *current* audited state, and this branch now conflicts with master on the same lines (`mergeable: false`). Every merged-but-inert scaffold this PR flagged has since been resolved: - **A.2 / A.3 / A.4** — worker-side AlarmClient wiring landed; `NotWiredAlarmRpcDispatcher` retired (mxaccessgw `WnWrapAlarmConsumer` + `FailoverAlarmConsumer` + `AlarmDispatcher` + `AlarmCommandHandler`; lmxopcua `GalaxyDriver : IAlarmSource` feed + ack). Tracked/closed in #420. - **C.1** — the `SdkAlarmHistorianWriteBackend` / Wonderware sidecar path was retired entirely; alarm-history now writes via `GatewayAlarmHistorianWriter` (HistorianGateway `SendEvent`), live-verified 2026-07-15 (R2-06/R2-08). Merging this would resurrect the old "blocked / dispatch pending" language that #467 deliberately corrected. Closing as superseded; no changes lost.
dohertj2 closed this pull request 2026-07-15 15:35:27 -04:00

Pull request closed

Sign in to join this conversation.