Files
lmxopcua/followup.md
Joseph Doherty 2d07d716dc Recover stashed driver-gaps work from pre-v2-mxgw-merge working tree
Captures uncommitted work that lived in the working tree on
v2-mxgw-integration but was orthogonal to the migration. Stashed
during the v2-mxgw merge to master (2026-04-30) and replanted here on
a feature branch off master so it's git-visible rather than living in
the stash list.

Two distinct buckets:

1. Tracked fixture/config refinements (10 files, ~36 lines):
   - scripts/e2e/test-opcuaclient.ps1
   - src/ZB.MOM.WW.OtOpcUa.Admin/appsettings.json
   - 5 docker-compose.yml under tests/.../IntegrationTests/Docker/
     (AbCip, Modbus, OpcUaClient, S7)
   - 4 fixture .cs files (AbServerFixture, ModbusSimulatorFixture,
     OpcPlcFixture, Snap7ServerFixture)

2. Untracked driver-gaps queue artifacts (~8000 lines):
   - docs/plans/{abcip,ablegacy,focas,opcuaclient,s7,twincat}-plan.md
     — per-driver gap plans
   - docs/featuregaps.md — cross-cutting analysis
   - docs/v2/focas-deployment.md, docs/v2/implementation/focas-simulator-plan.md
   - followup.md — auto/driver-gaps queue follow-ups
   - scripts/queue/ — PR-queue automation tooling (12 files including
     pr-manifest.yaml at 1473 lines)

This commit is a snapshot for recoverability — review and split into
focused PRs (or discard) before merging anywhere downstream.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 08:28:01 -04:00

6.4 KiB
Raw Blame History

Follow-ups from auto/driver-gaps queue (PRs #225#316, 92 merged)

Captured 2026-04-26 after the plan-execution queue drained. Organised by category.

Wrapper / library-version-blocked (waiting on upstream)

Driver PR Blocker Resolution path
AbCip abcip-3.1 libplctag.NET 1.5.2 doesn't expose connection_size Reflection fallback ships; remove when wrapper publishes the property
AbCip abcip-3.2 libplctag.NET 1.5.x has no public instance-ID knob Wire stays Symbolic regardless of mode; flip when wrapper exposes it
AbCip abcip-3.3 libplctag.NET wire-level multi-service-packet bundling not exposed Planner ships correct; runtime currently issues N reads. Switch when wrapper bundles
S7 s7-e1 S7netplus 0.20 has no public ReadSzlAsync (request builder is internal) Parser tested + cached; BadNotSupported until S7netplus exposes it or we add raw S7comm SZL-PDU helper
S7 s7-e2 S7netplus 0.20 doesn't expose SendPassword IS7PlcAuthGate reflection probe; logs warning, no exception. Flip when library exposes it
TwinCAT twincat-2.2 Bulk Sum path stays on symbolic Phase-2 perf sweep follow-up to switch bulk to handle-based
TwinCAT twincat-5.1 Beckhoff doesn't ship a managed TcEventLogger wrapper Gate seam ships; production AdsTwinCATAlarmGate binary decoder against ADSIGRP_TCEVENTLOG_ALARMS is the next chunk of work

Fixture / simulator gaps

focas-mock simulator doesn't exist

  • Blocks integration tests for: f3a (alarm history ring-buffer + mock_patch_alarmhistory), f4b (mock_set_unlock_state, mock_get_last_write), f4c (pmc_wrpmcrng handler), f4d (cnc_wrunlockparam + mock_set_password), f5a (mock_simulate_cycle_completion).
  • No FOCAS IntegrationTests project exists yet — it needs to be created when the mock lands.

opc-plc fixture upgrades

  • opcuaclient-10: TriggerModelChangeAsync is a stub. Live HTTP-driven model-change verification deferred. Tests use an inject seam.
  • opcuaclient-11: opc-plc-rc Docker fixture session-open assertion (gated OPCUACLIENT_TOPOLOGY_TRIGGER_CMD / OPCUA_RC_SIM).
  • opcuaclient-12: opc-plc --alm fixture run for HistoryRead Events (waiting for fixture image upgrade).
  • opcuaclient-13: opc-plc historian-sim wire-level sweep for the 25 new aggregates (only ~5 likely honoured today).
  • opcuaclient-14: Two-container failover smoke against opc-plc + opc-plc-secondary on the live fixture.

AbCip HSBY paired-fixture

  • abcip-5.1/5.2: hsby-mux Python sidecar is a stub; the patched ab_server image and live role-flip integration test are gated until that stabilises.

AbLegacy auto-demote fixture

  • ablegacy-12: slc500-faulty is a commented compose placeholder; tests use the 127.0.0.1:1 ECONNREFUSED trick. Real refusing-proxy fixture is follow-up.

TCBSD TwinCAT project

  • twincat-2.1, 3.1, 3.2, 4.1, 5.1 added new fixture stub files that need to be imported into the actual TwinCAT XAE project before [TwinCATFact] integration tests can exercise them:
    • PLC/GVLs/GVL_Perf.TcGVL + PLC/POUs/FB_PerfChurn.TcPOU (twincat-2.1)
    • PLC/DUTs/ST_NestedFlags.TcDUT, ST_RecursiveCap.TcDUT, ST_AlarmRecord.TcDUT (twincat-4.1)
    • PLC/GVLs/GVL_Plant.TcGVL extensions (twincat-4.1)
    • PLC/GVLs/GVL_Alarms.TcGVL + PLC/POUs/FB_AlarmHarness.TcPOU (twincat-5.1)

Snap7 round-trip tests

  • s7-d1 (TIA CSV), s7-d2 (UDT fan-out), s7-d3 (instance-DB), s7-c1 (negotiated PDU), s7-c3 (scan groups), s7-c4 (deadband) integration tests are build-only until run against the live Snap7 fixture.

Live-firmware / hardware verification

  • s7-c2 — hardened S7-1500 with non-PG TSAP modes (gated --with-real-plc).
  • s7-c5 — hardened PLC with PUT/GET disabled (currently only Snap7 happy-path tested).
  • s7-f — manual checklist: toggle Optimized block access in TIA + Track 3 OPC UA bridge verification.
  • ablegacy-13 — DH+ via real 1756-DHRIO + PLC-5. No Docker fixture possible.
  • twincat-2.1 perf-tierDriver_sum_read_1000_tags_beats_loop_baseline_by_5x gated TWINCAT_PERF=1.
  • twincat-2.3 — symbol-version online-change drill (TWINCAT_MANUAL_ONLINE_CHANGE=1).
  • focas-f4b/c/d — live CNC parameter / macro / PMC writes + password-protected CNC.

Cross-driver / ecosystem

  • opcuaclient-12 — Galaxy A&E projection currently keeps the fixed-field ReadEventsAsync(sourceName, ...) overload; richer SelectClause-aware projection on the Galaxy A&E log is best-effort future work.
  • per-driver plan files don't exist — opcuaclient-12 cross-driver IHistoryProvider heads-up went into doc-comments instead. If anyone adds per-driver plan files later, the heads-up note belongs in each.

Pre-existing red-build issues (NOT touched, will block solution-level CI)

  • NU1902 OpenTelemetry warning-as-error in Admin — predates the queue.
  • Server/Phase7/DriverSubscriptionBridge.cs cref ambiguity — predates the queue.

Both must be fixed before solution-level CI can pass on the merged-up task-galaxy-e2e.

Integration-branch merge

  • auto/driver-gaps has 92 stacked PRs vs task-galaxy-e2e. Final merge needs a careful single review — likely staged or one big PR — and will collide with whatever has landed on task-galaxy-e2e in parallel.

Plan-vs-reality deltas (informational; nothing to chase)

  • focas-f4a/b/c/d — Plan referenced doc lines that had already been removed in prior evolution (FOCAS.md "intentionally returns BadNotWritable" callout; FOCAS-Test-Fixture.md alarms-not-covered caveat).
  • opcuaclient-12 — Repo has no per-driver plan files for abcip / ablegacy / s7 / twincat — heads-up went into IHistoryProvider doc-comments instead.
  • twincat-4.1docs/v3/twincat-backlog.md doesn't exist; UDT-gap-removal item N/A.

Highest-leverage cleanup once upstream catches up

When the upstream library bumps, these reflection / BadNotSupported paths simplify to direct calls:

  • abcip-3.1: remove reflection fallback in LibplctagTagRuntime.TrySetIntAttribute(connection_size, ...).
  • abcip-3.2: remove LibplctagTagRuntime.TrySetLogicalAddressing reflection.
  • abcip-3.3: switch MultiPacket runtime from N-reads to true wire-bundle.
  • s7-e1: replace S7NetSzlReader.ReadAsync returning null with real Plc.ReadSzlAsync.
  • s7-e2: replace ReflectionS7PlcAuthGate warning path with direct Plc.SendPasswordAsync call.
  • twincat-5.1: ship AdsTwinCATAlarmGate binary decoder.