v2 mxgw migration — Phase 1+2+3.1 wiring (7 PRs)
Foundational PRs from lmx_mxgw_impl.md, all green. Bodies only — DI/wiring
deferred to PR 1+2.W (combined wire-up) and PR 3.W.
PR 1.1 — IHistorianDataSource lifted to Core.Abstractions/Historian/
Reuses existing DataValueSnapshot + HistoricalEvent shapes; sidecar (PR
3.4) translates byte-quality → uint StatusCode internally.
PR 1.2 — IHistoryRouter + HistoryRouter on the server
Longest-prefix-match resolution, case-insensitive, ObjectDisposed-guarded,
swallow-on-shutdown disposal of misbehaving sources.
PR 1.3 — DriverNodeManager.HistoryRead* dispatch through IHistoryRouter
Per-tag resolution with LegacyDriverHistoryAdapter wrapping
`_driver as IHistoryProvider` so existing tests + drivers keep working
until PR 7.2 retires the fallback.
PR 2.1 — AlarmConditionInfo extended with five sub-attribute refs
InAlarmRef / PriorityRef / DescAttrNameRef / AckedRef / AckMsgWriteRef.
Optional defaulted parameters preserve all existing 3-arg call sites.
PR 2.2 — AlarmConditionService state machine in Server/Alarms/
Driver-agnostic port of GalaxyAlarmTracker. Sub-attribute refs come from
AlarmConditionInfo, values arrive as DataValueSnapshot, ack writes route
through IAlarmAcknowledger. State machine preserves Active/Acknowledged/
Inactive transitions, Acked-on-active reset, post-disposal silence.
PR 2.3 — DriverNodeManager wires AlarmConditionService
MarkAsAlarmCondition registers each alarm-bearing variable with the
service; DriverWritableAcknowledger routes ack-message writes through
the driver's IWritable + CapabilityInvoker. Service-raised transitions
route via OnAlarmServiceTransition → matching ConditionSink. Legacy
IAlarmSource path unchanged for null service.
PR 3.1 — Driver.Historian.Wonderware shell project (net48 x86)
Console host shell + smoke test; SDK references + code lift come in
PR 3.2.
Tests: 9 (PR 1.1) + 5 (PR 2.1) + 10 (PR 1.2) + 19 (PR 2.2) + 1 (PR 3.1)
all pass. Existing AlarmSubscribeIntegrationTests + HistoryReadIntegrationTests
unchanged.
Plan + audit docs (lmx_backend.md, lmx_mxgw.md, lmx_mxgw_impl.md)
included so parallel subagent worktrees can read them.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>