From a6c41617196b50132a62f9735401aa8558fe38a4 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Thu, 8 Oct 2026 09:10:46 -0400 Subject: [PATCH] docs(history): OtOpcUa hardware-available issue sweep #593-#625 --- .claude/skills/sister-project-history/otopcua.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.claude/skills/sister-project-history/otopcua.md b/.claude/skills/sister-project-history/otopcua.md index 74c809e..cc83648 100644 --- a/.claude/skills/sister-project-history/otopcua.md +++ b/.claude/skills/sister-project-history/otopcua.md @@ -64,3 +64,17 @@ AddRoute of the dev Mac (`oee-tagdump-mac`, `10.181.206.245.1.1`) on the two tes unknown keys (#576), Client CLI ack/confirm/shelve/enable/disable target the condition node (previously nonexistent ids), plus native-transport hardening (#564-#583). Residuals needing hardware: native wide-struct fragmented writes, mixed STRING/array MSP packing and CIP-level close codes on a real controller. +- **Hardware-available issue sweep #593-#625 (2026-10-08, OtOpcUa `master` `3baa332d..d898262c`).** Every issue reachable on the + sims/docker-dev worked through parallel worktree agents, six adversarial review rounds, fixture runs (AbCip ControlLogix incl. a + 200-cycle native lease soak, AbLegacy 13/13, opc-plc, Postgres) and a docker-dev live pass. **ScadaBridge-visible:** + (1) **#610 server-side array writes** — array nodes are now writable where the driver can write the whole array (Modbus within + `maxRegistersPerWrite`, S7 non-Bool/non-wide types, OpcUaClient, Galaxy with a declared `arrayLength`); a numeric CLR list of + another element type (ScadaBridge's `int[]`/`double[]`) is converted element-wise, and the whole write is refused + `BadTypeMismatch` (nothing sent) if any element is out of range, fractional-to-integer or NaN; wrong length ⇒ `BadTypeMismatch`, + `IndexRange` ⇒ `BadWriteNotSupported`; an array to a scalar node is refused only on Modbus/S7. (2) MQTT writes encode the birth's + own Sparkplug datatype; unsupported birth types (Array/DataSet/Template) and `Reference` tags now return **`BadNotSupported`** + (was `BadNotWritable`). (3) Native-alarm ack on a non-Primary node is refused Bad; a commented re-ack is stored as AddComment. + (4) Surgically-added **raw** nodes are now announced (model-change events), so no re-browse is needed. (5) The alarm-history drain + is now also gated on the passive half of a replicating LocalDb pair (no more duplicate historian rows). Also: #609 removed drivers no + longer keep republishing resilience/health telemetry; FetchAndCache serving from `central-2` live-gated with central-1 down + (#619.3). Left open: #600/#601/#606/#613/#619/#622 partials; hardware-only #592/#611/#612/#614-#616.