Joseph Doherty
4da2d62b9a
fix(historian): stamp a positive StorageRateMs on provisioned tags
...
v2-ci / build (pull_request) Successful in 4m7s
v2-ci / unit-tests (pull_request) Failing after 10m50s
GatewayTagProvisioner built HistorianTagDefinition without a StorageRateMs, so
the proto uint32 defaulted to 0. The gateway's EnsureTags maps StorageRateMs
straight to the AVEVA SDK's storageRateMs, which requires a positive value —
0 makes the SDK throw ArgumentOutOfRangeException ('Storage rate must be > 0 ms'),
so EVERY historized-tag auto-provision (the deploy-time IHistorianProvisioning
hook) silently failed at the gateway with failed=N.
Stamp DefaultStorageRateMs=1000 (matches the gateway's own live provisioner
convention; quantized 1000/5000/10000). Add a regression unit test asserting the
definition carries a positive rate, and set StorageRateMs on the live-suite's
inline definitions so the retype probe reaches a real EnsureTags.
Found via the R2-06 live gate against a real 0.2.0 gateway + AVEVA historian:
with this fixed, Float/Int2/UInt2/Int4/UInt4/Double all provision and the live
suite goes 3/6 -> 5/6. (Int1/Boolean remains blocked by the gateway histsdk's
ProtocolEvidenceMissingException for Int1 — a gateway-side type-support gap, not
this bug.)
Gateway driver unit 103/103.
2026-07-13 19:29:49 -04:00
Joseph Doherty
56ddf45e1c
chore(core): flatten Historian sub-namespace to Core.Abstractions root
...
v2-ci / build (pull_request) Successful in 4m32s
v2-ci / unit-tests (pull_request) Failing after 10m2s
Four continuous-historization types (IHistorizationOutbox, HistorizationOutboxEntry,
IHistorianValueWriter/HistorizationValue, HistorizationCommitMode) drifted into a
ZB.MOM.WW.OtOpcUa.Core.Abstractions.Historian sub-namespace while the other six files
in the same folder correctly use the root namespace. This violated decision #59 's
flat-public-surface rule and left InterfaceIndependenceTests.AllPublicTypes_LiveInRootNamespace
red on master (pre-existing, predates round-2 remediation).
Move all four to the root namespace and drop/retarget the now-redundant
'using ...Core.Abstractions.Historian;' in the ~11 consumers. No behavioral change.
Verified: Core.Abstractions.Tests 129/129 (was 128/129), Runtime.Tests Historian+DI 72/72,
Gateway driver unit 102/102, full solution build 0 errors.
2026-07-13 18:29:01 -04:00
Joseph Doherty
31c982008b
Merge R2-09 Driver fleet batch (arch-review round 2) [PR #437 ]
...
v2-ci / build (push) Successful in 3m51s
v2-ci / unit-tests (push) Failing after 9m22s
Findings 05/STAB-3/4/5/8/12/16/17 + CONV-4 + onError (6 sub-batches, 29 tasks):
Modbus desync teardown, AbCip runtime lock, FOCAS concurrent caches, new
ConnectionBackoff + PollGroupEngine v2 (S7 poll fork deleted onto it, reconciled
with R2-01), fleet connect throttles, ResolveHost via resolver, TwinCAT replay
hardening. 29/29 tasks. S7 254/254 verified post-merge; build clean.
2026-07-13 12:48:12 -04:00
Joseph Doherty
6ee74d26fc
docs(r2-09): record execution deviations; clear CS8604 nullable warning in the 5 PollErrorHealthTests
v2-ci / build (pull_request) Successful in 3m32s
v2-ci / unit-tests (pull_request) Failing after 9m27s
2026-07-13 12:45:50 -04:00
Joseph Doherty
502a327f25
fix(twincat): probe recycle honors cancellation — no uncancellable gate wait (05/STAB-12 compounded part); B6 complete (TwinCAT suite 189 green)
2026-07-13 12:43:06 -04:00
Joseph Doherty
082ee99b6b
fix(twincat): retract the fresh ADS notification when unsubscribe raced the replay (05/STAB-17)
2026-07-13 12:39:39 -04:00
Joseph Doherty
de29759643
fix(twincat): retry failed replay intents on the next successful probe tick (05/STAB-16)
2026-07-13 12:37:20 -04:00
Joseph Doherty
4f16620948
test(twincat): failing repro for STAB-16 silent replay failure
2026-07-13 12:33:35 -04:00
Joseph Doherty
e69d3b3b0f
fix(modbus): equipment tags carry unitId; ResolveHost keys per-unit via the resolver (CONV-4)
2026-07-13 12:29:13 -04:00
Joseph Doherty
04fa2f5cb2
Merge R2-07 Surgical pure-adds (arch-review round 2) [PR #436 ]
...
v2-ci / build (push) Successful in 3m19s
v2-ci / unit-tests (push) Failing after 8m13s
Finding 03/P1: surgical in-place address-space adds/removals skip full rebuilds
(AddressSpaceChangeClassifier default-closed to Rebuild). 3 new
ISurgicalAddressSpaceSink remove members, guard-first + forwarded through
DeferredAddressSpaceSink (F10b inertness net green). T5/T6/T12/T14 over-the-wire +
docker-dev gates deferred. Auto-merged OtOpcUaNodeManager.cs with R2-08; verified
OpcUaServer.Tests 341/341 + forwarding guard 3/3. Build clean.
2026-07-13 12:27:59 -04:00
Joseph Doherty
9262dd25b7
fix(drivers): ResolveHost resolves equipment-tag refs via EquipmentTagRefResolver — per-host breaker isolation (CONV-4)
2026-07-13 12:26:42 -04:00
Joseph Doherty
ded0595ca7
test+docs: mixed-deploy survival, STATUS/P1 close-out (R2-07 T14)
v2-ci / build (pull_request) Successful in 4m3s
v2-ci / unit-tests (pull_request) Failing after 9m47s
2026-07-13 12:24:50 -04:00
Joseph Doherty
8a7701db3f
test(drivers): failing repro for CONV-4 equipment-tag ResolveHost mis-keying
2026-07-13 12:23:43 -04:00
Joseph Doherty
e2b47638ec
feat(opcua): surgical mixed add+remove deploys (R2-07 T13)
2026-07-13 12:22:45 -04:00
Joseph Doherty
86742ad8cb
fix(abcip): throttle evict-recreate Forward-Open attempts per device (05/STAB-8)
2026-07-13 12:20:10 -04:00
Joseph Doherty
f4ea834fac
test(opcua): subscription-survival on pure-remove + live-verify note (R2-07 T12)
2026-07-13 12:19:36 -04:00
Joseph Doherty
3cebfae417
feat(opcuaserver): process-wide HistoryRead batch limiter — flood degrades to BadTooManyOperations, not pool exhaustion (03/S3)
2026-07-13 12:18:35 -04:00
Joseph Doherty
502d7650d0
feat(opcua): surgical pure-remove deploys — scoped teardown, no full rebuild (R2-07 T11)
2026-07-13 12:18:08 -04:00
Joseph Doherty
e54af9b948
fix(focas): per-device connect-attempt backoff across the three loops (05/STAB-8)
2026-07-13 12:16:31 -04:00
Joseph Doherty
888cf86655
feat(opcuaserver): per-request HistoryRead deadline — hung backends surface BadTimeout (03/S3)
2026-07-13 12:13:38 -04:00
Joseph Doherty
962afed241
fix(twincat): per-device connect-attempt backoff, probe-driven recovery (05/STAB-8)
2026-07-13 12:13:23 -04:00
Joseph Doherty
8c365da754
feat(opcuaserver): bounded per-node parallel HistoryRead within a batch (03/S3)
2026-07-13 12:09:53 -04:00
Joseph Doherty
14003ab9b8
feat(opcua): surgical RemoveVariableNode with NodeDeleted model-change (R2-07 T8)
2026-07-13 12:09:14 -04:00
Joseph Doherty
85ef74ea86
refactor(s7): retire the bespoke poll fork onto PollGroupEngine v2 (CONV-1; fixes PERF-3 + STAB-6-S7; deletes the fork's bare-OCE poll-death — cross-ref plan R2-01)
2026-07-13 12:07:39 -04:00
Joseph Doherty
438004e371
feat(commons): add surgical remove members to ISurgicalAddressSpaceSink + deferred forwarding (guard-verified) (R2-07 T7)
2026-07-13 12:07:01 -04:00
Joseph Doherty
0d879363f8
test(s7): failing guards for the poll-fork retirement (PERF-3, STAB-6)
2026-07-13 12:05:08 -04:00
Joseph Doherty
304442dba4
feat(runtime): ServerHistorian HistoryRead parallelism/limiter/deadline knobs + node-manager wiring (03/S3)
2026-07-13 12:03:27 -04:00
Joseph Doherty
d5c6609cdf
test(opcuaserver): red repro — HistoryRead serves a batch strictly sequentially (03/S3)
2026-07-13 12:01:47 -04:00
Joseph Doherty
376233b92c
test(opcua): over-the-wire subscription-survival on pure-add deploy (R2-07 T5)
2026-07-13 12:01:23 -04:00
Joseph Doherty
62a49779ac
test(host): unreachable-directory activation fails bounded; document the SDK impersonation threading contract (03/S2)
2026-07-13 12:00:35 -04:00
Joseph Doherty
b494d09d9b
fix(drivers): wire PollGroupEngine onError->health + 30s poll backoff (05/STAB-9) [twincat,focas]
2026-07-13 11:59:49 -04:00
Joseph Doherty
e6280cb1da
feat(runtime): announce added nodes after the materialise passes on non-rebuild applies (R2-07 T4b)
2026-07-13 11:58:40 -04:00
Joseph Doherty
9213c037b0
fix(drivers): wire PollGroupEngine onError->health + 30s poll backoff (05/STAB-9) [modbus,abcip,ablegacy]
2026-07-13 11:57:25 -04:00
Joseph Doherty
0c785415a2
feat(host): LDAP directory-outage circuit — fail-fast denial during sustained outage (03/S2)
2026-07-13 11:56:45 -04:00
Joseph Doherty
21abe42a90
feat(host): hard wall-clock bound + bounded concurrency on OPC UA LDAP authentication (03/S2)
2026-07-13 11:52:10 -04:00
Joseph Doherty
ca6530c7f5
feat(core): PollGroupEngine v2 — failure backoff + caller-token-filtered OCE exit (CONV-1/STAB-8; STAB-14-class engine guard)
2026-07-13 11:51:50 -04:00
Joseph Doherty
a86d9f65bf
feat(opcua): make MaterialiseAlarmCondition idempotent for same-kind re-applies (R2-07 T4a)
2026-07-13 11:50:14 -04:00
Joseph Doherty
b8cf3cce0b
feat(core): ConnectionBackoff primitive — shared capped-exponential backoff + attempt throttle (05/STAB-8; seam for R2-01 S7 wiring)
2026-07-13 11:48:49 -04:00
Joseph Doherty
9dbc363ef0
feat(opcua): announce pure-add nodes via Part 3 NodeAdded model-change (R2-07 T3)
2026-07-13 11:48:02 -04:00
Joseph Doherty
0d717e4785
feat(opcua): route AddressSpaceApplier through the classifier — pure-add deploys no longer rebuild (R2-07 T2)
2026-07-13 11:46:24 -04:00
Joseph Doherty
bb8386d126
test(focas): failing repro for STAB-5 cross-thread Dictionary mutation
2026-07-13 11:46:12 -04:00
Joseph Doherty
32f248c93d
test(abcip): failing repro for STAB-4 unserialized shared-handle ops
2026-07-13 11:40:17 -04:00
Joseph Doherty
0d5cb89d48
feat(security): LdapAuthResult.IsSystemFailure distinguishes directory outage from credential deny (03/S2)
2026-07-13 11:39:35 -04:00
Joseph Doherty
09faa05f06
feat(security): LDAP auth timeout/concurrency/outage-circuit options; project ConnectionTimeoutMs into the shared library (03/S2)
2026-07-13 11:38:37 -04:00
Joseph Doherty
bb226f45ed
feat(opcua): add AddressSpaceChangeClassifier — typed delta classification for the applier (R2-07 T1)
2026-07-13 11:38:30 -04:00
Joseph Doherty
ce6d9e21d3
test(host): red repro — LDAP authenticator has no wall-clock bound on session activation (03/S2)
2026-07-13 11:36:32 -04:00
Joseph Doherty
141c143586
test(modbus): failing repro for STAB-3 timeout/framing stream desync
2026-07-13 11:35:20 -04:00
Joseph Doherty
1a698cbb97
Merge R2-11 TagConfig consolidation (arch-review round 2) [PR #434 ]
...
v2-ci / build (push) Successful in 3m55s
v2-ci / unit-tests (push) Failing after 8m14s
Findings 01/C-1, 01/P-1 (single TagConfigIntent.Parse in Commons, 4 copies
delegate, parse-once) + 05 CONV-2/UNDER-1/UNDER-6 (shared strict TagConfigJson
readers, per-driver Inspect() + writable key, FOCAS capability pre-flight,
Modbus probe timeoutMs, deploy-gate Warn|Error). Phase C runtime-strict flip
deferred. T22/T24 deferred. Auto-merged AddressSpaceApplier.cs + DriverHostActor.cs
with R2-04/R2-10; verified OpcUaServer.Tests 286/286 + Runtime.Tests 396/396.
Build clean.
2026-07-13 11:29:32 -04:00
Joseph Doherty
4449baac69
feat(adminui): writable checkbox in driver-typed tag editors (R2-11, 05/UNDER-6)
...
Models gain an optional bool? Writable (absent stays omitted; explicit false round-trips,
unknown keys preserved); the six editors gain a Writable checkbox (FOCAS disabled+read-only
hint). 9 model round-trip tests green. docker-dev /run verify of one editor deferred-live.
2026-07-13 11:22:12 -04:00
Joseph Doherty
d62b140ccd
Merge R2-04 Failure-visibility trio (arch-review round 2) [PR #433 ]
...
v2-ci / build (push) Successful in 3m48s
v2-ci / unit-tests (push) Failing after 9m14s
Findings 01/S-1 (AddressSpaceApplyOutcome failure field + apply.failed logging,
no optimistic success), 06/S-1 (Galaxy write fails closed -> BadCommunicationError
+ #5 revert, no knowingly-lost raw Write), 03/S4 (PrimaryGatePolicy default-deny
unknown-role-multi-driver on all gates + scripted-alarm emit gate). T13/T15 (2-node
live gates) deferred -- T15 is the behavior-affecting S4 live gate, must run in heavy
pass. Clean merge, build clean.
2026-07-13 11:19:24 -04:00