Joseph Doherty
d3081a659f
feat(historian-gateway): GatewayAlarmHistorianWriter — SendEvent + gRPC->outcome mapping
...
Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
2026-06-26 17:27:03 -04:00
Joseph Doherty
555bd477f1
feat(historian-gateway): FasterLog historization outbox (PerEntry/Periodic, drop-oldest)
...
Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
2026-06-26 17:20:06 -04:00
Joseph Doherty
1a6eb7efe6
test(historian-gateway): cover MaxTieClusterOverfetch warning + refresh AddServerHistorian doc
...
Addresses Task 9 review: add the enabled+nonpositive MaxTieClusterOverfetch warning
test; update the AddServerHistorian XML doc to describe the gateway-backed data source
(the alarm-path Wonderware doc stays until T13).
Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
2026-06-26 17:09:45 -04:00
Joseph Doherty
36f7c3c5bf
feat(historian-gateway): read cutover — AddServerHistorian builds GatewayHistorianDataSource
...
Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
2026-06-26 17:07:59 -04:00
Joseph Doherty
1d5fa8230e
fix(historian-gateway): Dispose() delegates to DisposeAsync() + sync-dispose test
...
Addresses T7/T8/T11 code-review minors: route the sync dispose through DisposeAsync
so a double Dispose()+DisposeAsync() stays a no-op; cover the sync path.
Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
2026-06-26 16:54:23 -04:00
Joseph Doherty
718f1fdad2
feat(historian-gateway): reshape ServerHistorianOptions to gateway form (Endpoint/ApiKey/Tls)
...
Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
2026-06-26 16:52:56 -04:00
Joseph Doherty
35aace7fdf
feat(historian-gateway): ReadEventsAsync alarm-history via gateway ReadEvents (+ truncation signal)
...
Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
2026-06-26 16:47:04 -04:00
Joseph Doherty
0a540d9f09
feat(historian-gateway): GetHealthSnapshot via Probe/GetConnectionStatus (counter discipline)
...
Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
2026-06-26 16:45:40 -04:00
Joseph Doherty
1e93b2ebfb
feat(historian-gateway): GatewayHistorianDataSource read paths (raw/processed/at-time)
...
Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
2026-06-26 16:44:48 -04:00
Joseph Doherty
c51ca2276b
fix(historian-gateway): seam maxEvents XML doc + driver Platforms + ValueTask in fake
...
Addresses Task 1 code-review: document that ReadEventsAsync.maxEvents is enforced
client-side (no server cap in the wire contract); add Platforms=AnyCPU;x64 to match
sibling drivers; use ValueTask.CompletedTask in FakeHistorianGatewayClient.
Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
2026-06-26 16:35:08 -04:00
Joseph Doherty
a96e85f0e4
feat(historian-gateway): AlarmHistorianEvent->HistorianEvent mapper (SendEvent properties)
...
Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
2026-06-26 16:32:38 -04:00
Joseph Doherty
a54c7a9366
feat(historian-gateway): HistorianEvent->HistoricalEvent mapper (+ clamped severity)
...
Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
2026-06-26 16:32:38 -04:00
Joseph Doherty
c7296d7458
feat(historian-gateway): sample/aggregate->DataValueSnapshot + quality mapper (Wonderware parity)
...
Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
2026-06-26 16:32:38 -04:00
Joseph Doherty
3226b87818
feat(historian-gateway): DriverDataType->HistorianDataType mapper + write-gap fallbacks (matrix-guarded)
...
Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
2026-06-26 16:32:38 -04:00
Joseph Doherty
c822a6b196
feat(historian-gateway): HistoryAggregateType->RetrievalMode mapper (matrix-guarded)
...
Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
2026-06-26 16:32:38 -04:00
Joseph Doherty
a98fc46d26
feat(historian-gateway): scaffold Gateway driver project + consume client package
...
Claude-Session: https://claude.ai/code/session_012SDSQ3AcaXqPcBtDESBRii
2026-06-26 16:18:50 -04:00
Joseph Doherty
04159fd716
test(otopcua): ConfigComposer->ParseComposition DeviceHost round-trip (follow-up E)
2026-06-26 15:39:40 -04:00
Joseph Doherty
0074f37a64
test(otopcua): tighten multi-device collapse assertion + clear warn-state on removal (follow-up E)
2026-06-26 15:16:59 -04:00
Joseph Doherty
50f08635ec
feat(otopcua): multi-device-per-driver FixedTree partition (follow-up E)
2026-06-26 15:00:11 -04:00
Joseph Doherty
51721df563
refactor(otopcua): extract authored-only send helper + empty-authored dropped-path test (follow-up D)
2026-06-26 14:44:26 -04:00
Joseph Doherty
05c820795a
perf(otopcua): one SetDesiredSubscriptions per driver per redeploy (follow-up D)
2026-06-26 14:30:16 -04:00
Joseph Doherty
cde16063d9
test(otopcua): negative + convergence coverage for rebind re-trigger (follow-up C)
2026-06-26 14:18:01 -04:00
Joseph Doherty
533671487e
feat(otopcua): re-trigger discovery on config-unchanged rebind (follow-up C)
2026-06-26 14:06:50 -04:00
Joseph Doherty
adcd7b57c1
feat(otopcua): driver-level equipment resolution + per-equipment discovered-plan cache (follow-up E)
2026-06-26 13:33:21 -04:00
Joseph Doherty
cb7ce7f171
feat(otopcua): EquipmentNode carries DriverInstanceId/DeviceId/DeviceHost (follow-up E projection)
2026-06-26 13:07:31 -04:00
Joseph Doherty
e7d5ebe956
fix(otopcua): cancel pending rediscover timer on TriggerRediscovery + test hardening (follow-up C)
2026-06-26 12:57:08 -04:00
Joseph Doherty
f7358bf4fd
feat(otopcua): DriverInstanceActor.TriggerRediscovery message (follow-up C)
2026-06-26 12:45:26 -04:00
Joseph Doherty
a1a655e6c9
test(otopcua): Once re-discovery reruns one pass per reconnect + comment tidy (follow-up B)
2026-06-26 12:38:52 -04:00
Joseph Doherty
ce34816a50
feat(otopcua): DriverInstanceActor honors RediscoverPolicy (Never/Once/UntilStable) (follow-up B)
2026-06-26 12:32:28 -04:00
Joseph Doherty
efbdaf853c
feat(otopcua): set Modbus/S7/Galaxy re-discovery policy to Once + Once-branch test (follow-up B)
2026-06-26 12:26:28 -04:00
Joseph Doherty
a378b572af
feat(otopcua): add ITagDiscovery.RediscoverPolicy + per-driver assignments (follow-up B)
2026-06-26 12:18:44 -04:00
Joseph Doherty
c2c368dcec
feat(otopcua): make FixedTree re-discovery per-pass timeout injectable (follow-up A)
2026-06-26 12:12:47 -04:00
Joseph Doherty
25ccd25b6b
test(otopcua): assert exact discovered NodeId in the e2e
2026-06-26 09:04:26 -04:00
Joseph Doherty
5104540e32
test(otopcua): cover discovered-node rebind drop + clarify re-apply scope
2026-06-26 09:01:01 -04:00
Joseph Doherty
1aa13ebd27
test(otopcua): end-to-end discovered-node injection + value flow
2026-06-26 08:46:28 -04:00
Joseph Doherty
0788bad145
feat(otopcua): re-inject discovered nodes after address-space rebuild
2026-06-26 08:36:52 -04:00
Joseph Doherty
b1e4fba792
fix(otopcua): skip redundant discovered-node re-apply + guard tests
2026-06-26 08:28:42 -04:00
Joseph Doherty
21298ec1b2
fix(otopcua): resume discovery on actor context + bound/harden re-discovery
2026-06-26 08:19:12 -04:00
Joseph Doherty
b9b8d3d389
feat(otopcua): inject discovered nodes into the equipment projection on connect
2026-06-26 07:59:01 -04:00
Joseph Doherty
cf6b1abf4c
feat(otopcua): re-run driver discovery on reconnect
2026-06-26 07:44:28 -04:00
Joseph Doherty
51634cca38
feat(otopcua): driver-instance post-connect bounded re-discovery
2026-06-26 07:40:24 -04:00
Joseph Doherty
34fc304712
fix(otopcua): guard discovered-injection equipment id + cover deferred forwarding
2026-06-26 07:27:09 -04:00
Joseph Doherty
ccf93fc029
feat(otopcua): OpcUaPublishActor handles discovered-node materialisation
2026-06-26 07:24:22 -04:00
Joseph Doherty
598cdfad5a
feat(otopcua): applier pass to materialise discovered nodes idempotently
2026-06-26 07:16:36 -04:00
Joseph Doherty
f8406d348c
fix(otopcua): report NodeAdded model-change outside the node Lock
2026-06-26 07:06:43 -04:00
Joseph Doherty
93f7586590
fix(otopcua): guard root-level discovered var parent + tighten mapper
2026-06-26 06:59:34 -04:00
Joseph Doherty
33b0e639a5
feat(otopcua): GeneralModelChangeEvent(NodeAdded) for runtime node adds
2026-06-26 06:55:52 -04:00
Joseph Doherty
d7a0da5ea1
feat(otopcua): map discovered nodes under an equipment subfolder
2026-06-26 06:47:18 -04:00
Joseph Doherty
da55c6913d
feat(otopcua): capturing address-space builder for driver discovery
2026-06-26 06:39:18 -04:00
Joseph Doherty
235b8b8e6d
fix(focas): serialize per-device wire I/O + bound reads; tolerate AdminUI config formats
...
Equipment tags were stuck at Bad_WaitingForInitialData on the deployed driver: the equipment poll, fixed-tree loop, probe and recycle shared one FOCAS/2 socket with no serialization, and the steady-state read had no timeout — concurrent reads collided and a stalled read hung forever, never overwriting the node's initial-data seed.
- SynchronizedFocasClient: per-device SemaphoreSlim gate + per-call timeout around every wire op (Connect/Probe gated, not double-bounded); wired in EnsureConnectedAsync. ReadAsync/WriteAsync map a per-call timeout to BadCommunicationError instead of rethrowing.
- FlexibleStringConverter on FOCAS config Series: the AdminUI persists the enum as a number ("series":6); accept number-or-string instead of throwing -> stub.
- FocasHostAddress.TryParse tolerates a scheme-less {ip}[:{port}] (AdminUI hostAddress form); canonical focas:// unchanged, malformed schemes still rejected.
247 FOCAS tests green; each fix has a regression test. Live-validated on wonder-app-vd03 (tags read Good).
2026-06-26 05:59:54 -04:00