Task #224 close — AB Legacy PCCC fixture: AB_LEGACY_TRUST_WIRE opt-in #202

Merged
dohertj2 merged 1 commits from task-224-close-ablegacy-fixture into v2 2026-04-21 04:19:51 -04:00
Owner

ab_server's PCCC dispatcher is a confirmed upstream gap (verified 2026-04-21, zero --debug=5 request logs). Previous behavior ran tests + they all failed when Docker was up. New behavior: gate on AB_LEGACY_TRUST_WIRE=1 — operators with real hardware / RSEmulate set it, Docker ab_server runs stay skipped with an upstream-gap message.

Matrix

Endpoint reachable? TRUST_WIRE? Result
No Skip (unreachable)
Yes No Skip (ab_server PCCC gap)
Yes 1 / true Run

Docs refreshed to confirm the gap + name the three resolution paths (upstream fix / RSEmulate golden-box / task #222 lab rig).

Test plan

  • Unit suite: 96 passed / 0 failed.
  • Integration suite: Docker down → 2 skipped; Docker up no TRUST_WIRE → 2 skipped; Docker up + TRUST_WIRE=1 → 4 run + 4 fail BadCommunicationError as expected.
ab_server's PCCC dispatcher is a confirmed upstream gap (verified 2026-04-21, zero --debug=5 request logs). Previous behavior ran tests + they all failed when Docker was up. New behavior: gate on AB_LEGACY_TRUST_WIRE=1 — operators with real hardware / RSEmulate set it, Docker ab_server runs stay skipped with an upstream-gap message. ## Matrix | Endpoint reachable? | TRUST_WIRE? | Result | |---|---|---| | No | — | Skip (unreachable) | | Yes | No | Skip (ab_server PCCC gap) | | Yes | 1 / true | Run | Docs refreshed to confirm the gap + name the three resolution paths (upstream fix / RSEmulate golden-box / task #222 lab rig). ## Test plan - Unit suite: 96 passed / 0 failed. - Integration suite: Docker down → 2 skipped; Docker up no TRUST_WIRE → 2 skipped; Docker up + TRUST_WIRE=1 → 4 run + 4 fail BadCommunicationError as expected.
dohertj2 added 1 commit 2026-04-21 04:19:38 -04:00
The ab_server Docker simulator accepts TCP at :44818 when started with
--plc=SLC500 but its PCCC dispatcher is a confirmed upstream gap
(verified 2026-04-21 with --debug=5: zero request logs when libplctag
issues a read, every read surfaces BadCommunicationError 0x80050000).

Previous behavior — when Docker was up, the three smoke tests ran and
all failed on every integration-host run. Noise, not signal.

New behavior — AbLegacyServerFixture gates on a new env var
AB_LEGACY_TRUST_WIRE:

  Endpoint reachable? | TRUST_WIRE set? | Result
  --------------------+-----------------+------------------------------
  No                  | —               | Skip ("not reachable")
  Yes                 | No              | Skip ("ab_server PCCC gap")
  Yes                 | 1 / true        | Run

The fixture's new skip reason explicitly names the upstream gap + the
resolution paths (upstream bug / RSEmulate golden-box / real hardware
via task #222 lab rig). Operators with a real SLC 5/05 / MicroLogix
1100/1400 / PLC-5 or an Emulate box set AB_LEGACY_ENDPOINT + TRUST_WIRE
and the smoke tests round-trip cleanly.

Updated docs:
  - tests/.../Docker/README.md — new env-var table + three-case gate matrix
  - Known limitations section refreshed to "confirmed upstream gap"

Verified locally:
  - Docker down: 2 skipped.
  - Docker up + TRUST_WIRE unset: 2 skipped (upstream-gap message).
  - Docker up + TRUST_WIRE=1: 4 run, 4 fail BadCommunicationError (ab_server gap as expected).
  - Unit suite: 96 passed / 0 failed (regression-clean).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
dohertj2 merged commit b644b26310 into v2 2026-04-21 04:19:51 -04:00
dohertj2 referenced this issue from a commit 2026-04-30 08:21:26 -04:00
Doc refresh (task #206) — Client.CLI + Client.UI brand flip + new top-level docs/README.md index. Client.CLI.md: replaced stale LmxOpcUa-OPC UA-server references with OtOpcUa throughout the overview + sample output + applicationUri examples (opc.tcp://localhost:4840/OtOpcUa, urn:localhost:OtOpcUa:instanceN); confirmed against src/ZB.MOM.WW.OtOpcUa.Server/Program.cs:69-71 which sets the live endpoint url + application uri to those exact values. Added a driver-agnostic note in the overview — the CLI is reachable against every shipped driver surface because the OPC UA endpoint abstracts them all. Kept the `lmxopcua-cli` executable name + the `{LocalAppData}/LmxOpcUaClient/pki/` PKI folder name AS-IS because those are real filesystem-level residuals the code still uses (Program.cs SetExecutableName + OpcUaClientService.cs:428) — flipping them requires migration shims so existing dev boxes don't lose their trusted-cert store; added explicit doc text explaining the residual + why it persists so future readers aren't confused. Fixed the sample connect-output "Server: LmxOpcUa" to "Server: OtOpcUa Server" matching the live ApplicationName in OpcUaServerOptions.cs:39. Client.UI.md: replaced the 4 LmxOpcUa references — overview one-liner, status-bar mock (now reads "OtOpcUa Server" matching the server's reported ApplicationName), endpoint-url example, settings persistence path. Same residual-explanation note added under the LmxOpcUaClient/settings.json path pointing at the Client.Shared session-factory literal at OpcUaClientService.cs:428. docs/README.md is new — a top-level index distinguishing the two documentation tiers (current reference at docs/*.md vs implementation history + design notes at docs/v2/*.md). Every current-reference doc gets a one-line role description in a section table (Architecture + data-path / Drivers / Operational / Client tooling / Requirements) so a new reader picking up the repo finds their way in without having to grep file names. Cross-link calls out that load-bearing references from top-level docs (plan.md decisions, admin-ui.md, acl-design.md, config-db-schema.md, driver-specs.md, dev-environment.md, test-data-sources.md) live under v2/. Notes up front that the project was renamed LmxOpcUa → OtOpcUa and that any remaining LmxOpcUa-string in paths is a deliberate residual with a migration follow-up, so readers don't chase phantom bugs. Four parallel doc-refresh agents currently working on the rest of docs/*.md (task #202 core architecture, #203 driver docs split, #204 operational, #205 requirements) — those commits will land on separate worktree branches + get folded in together once complete; this index already lists the docs they'll produce (drivers/README.md, drivers/Galaxy.md, drivers/Galaxy-Repository.md) so the final merge just has the content showing up where the index already points.
Sign in to join this conversation.