Joseph Doherty
83e9ffd27a
fix(alarms): SDK timed-unshelve timer is a no-op; commented re-ack comment is durable ( #597 )
...
Review R1 M2: since #597 the SDK timer fires at real expiry, and OnTimedUnshelve routed an operator-style
Unshelve by 'system' from both pair nodes, pre-empting the engine's AutoUnshelve. The engine owns expiry,
so the callback now routes nothing. Integration test: an engine stand-in that acts on a routed Unshelve and
expires late, plus a wrapped OnTimedUnshelve (positive control: the SDK timer fired).
Review R1 m1: Part9StateMachine.ApplyAcknowledge records a commented re-ack as AddComment (persisted and
replicated) instead of a NoOp; an uncommented re-ack is still a no-op.
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 07:47:28 -04:00
Joseph Doherty
8a9bf23048
fix(telemetry): release a removed driver's resilience tracker state so the publisher stops re-emitting it ( #609 )
...
Review R1 M1: StopChild evicted the hub cache, but DriverResilienceStatusPublisherService re-emits the
tracker every tick. IDriverCapabilityInvokerFactory.Release (default no-op) now invalidates the pipeline
builder + status tracker; the host calls it before Evict. Test runs a publisher tick after removal, with a
neighbour instance as positive control.
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 07:47:13 -04:00
Joseph Doherty
b176469b43
Merge #621(node manager): Utils.Log* → injected ILogger; last CS0618 suppressions removed
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 07:20:00 -04:00
Joseph Doherty
8d5e456ce1
refactor(opcua): node manager logs through injected ILogger, drop CS0618 suppressions ( #621 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 07:19:47 -04:00
Joseph Doherty
ca0f1e7735
Merge #597/#599: real UnshelveTime, commented re-ack reports, native ack refused off-Primary, /alerts ack-path test; surgically-added raw nodes announced, equipment-with-references removal keeps references severed; Backing* parity guard
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 07:12:59 -04:00
Joseph Doherty
bd63810645
fix(alarms): native ack refused off-Primary, commented re-ack reported, real UnshelveTime ( #597 )
...
- Native-condition Acknowledge on a non-Primary node returns BadInvalidState (nothing
routed/applied/reported) via NativeAlarmAckPrimaryGate, fed from
IDriverPrimaryRoleSource by OtOpcUaServerHostedService.
- A re-ack carrying a comment reports one comment event (Acked/Confirmed unchanged).
- TimedShelve applies its requested duration and the scripted projection carries
UnshelveAtUtc, so ShelvingState/UnshelveTime counts down instead of ~24.8 days.
- Native re-ack still routed to the driver (deliberate: documented retry path), pinned.
- AdminUI /alerts client ack/shelve path test; docs/AlarmTracking.md decisions incl.
accepted SDK EventsMonitored residual (item 6).
- Also #599/03/S20: RemoveEquipmentSubtree severs inverse Organizes edges.
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 07:12:29 -04:00
Joseph Doherty
0bd3ec00e4
fix(address-space): announce surgically-added raw nodes; equipment-with-references removal stays surgical ( #599 )
...
- AnnounceAddedNodes raises NodeAdded in the Raw realm for the existing parents of
added raw containers/tags (ComputeRawAddAnnouncements); Uns side unchanged.
- ApplyPureRemove removes UNS reference variables BEFORE the equipment subtree, so a
reference the subtree's id-prefix scope reaches no longer ratchets to a full rebuild
(03/P5). A NotSubsumed filter was not used: in production a reference NodeId is
Area/Line/Equipment/Name, outside the subtree scope, so filtering would leak it.
The matching RemoveEquipmentSubtree severing (03/S20) is in the node-manager commit.
- UnsReferenceBackingParityTests: reflection guard discovering the classifier's surgical
raw-tag whitelist and requiring a same-typed mirror field (03/U11).
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 07:12:29 -04:00
Joseph Doherty
5a5f9b22c9
Merge #622/#621/#606: OpcUaClient driver wire tests against the in-process server; SDK telemetry ctors in driver/browser; TreatWarningsAsErrors on the last 4 src projects
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 07:10:55 -04:00
Joseph Doherty
cb838d4ae1
test(abcip): scale the lease-soak budget with AB_LEASE_SOAK_CYCLES ( #593 )
...
200 cycles against ab_server pass (3m19s); a fixed 120s budget timed out above ~100 cycles.
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 07:10:55 -04:00
Joseph Doherty
2b8b5fbdb2
test(opcua-client): wire-level driver tests against the in-process server; retire scaffold headers ( #622 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 07:07:55 -04:00
Joseph Doherty
e9e35baa70
Merge #600.1/#603: provision changed-to-historized tags; retire dormant VirtualTagEngine; cache ScriptSandbox references; one LocalDb replication predicate for registration and drain gate
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 07:01:41 -04:00
Joseph Doherty
93e381561b
Merge #601(malformed)/#609: malformed artifact bytes are no answer on boot/restore; telemetry snapshot eviction on driver removal
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 07:01:32 -04:00
Joseph Doherty
75c66c16ef
Merge #625 : deferred code-review findings resolved or ruled (S7.Cli verdict, browser CP release, Cluster member events, Sql Detach hoist, docs)
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 07:01:32 -04:00
Joseph Doherty
80ed056d41
Merge #602(S7)/#610.2: S7 connect backoff, write-path worst-state-wins, Volatile health, factory logging, driver-side array writes
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 07:01:32 -04:00
Joseph Doherty
3fb6549209
fix(review): resolve deferred code-review findings; S7.Cli verdict, browser CP release, MemberLeft/Exited/Downed, Sql Detach hoist ( #625 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:59:53 -04:00
Joseph Doherty
82372f1672
fix(s7): connect backoff, worst-state write health, Volatile health, array writes ( #602 , #610 )
...
STAB-21 ConnectionBackoff in EnsureConnectedAsync; STAB-22 write-pass accumulator with a
write-side Faulted that a clean read does not erase; _health on the Volatile idiom;
S7-016 contiguous array write (Bool arrays stay refused).
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:59:29 -04:00
Joseph Doherty
439752d3b8
feat(adminui): S7 tag editor rejects wide-type and writable-Bool arrays at author time ( #610 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:59:29 -04:00
Joseph Doherty
e3cb2dd591
fix(s7): thread ILoggerFactory into the S7 driver factory ( #602 CONV-3)
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:59:29 -04:00
Joseph Doherty
b007d450d8
chore(build): OpcUaClient driver/browser on ITelemetryContext ctors, TreatWarningsAsErrors on remaining src projects ( #621 #606 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:59:25 -04:00
Joseph Doherty
6a5e804eca
Merge #593/#594: Ab.Transport offline/simulator test gaps, libplctag BadParam per-tag path, fixture suites skip when absent
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:58:44 -04:00
Joseph Doherty
7e36842556
test(abcip): ab_server soak of ConnectionLease.ReleaseInBackground; fixture docs ( #579 , #593 , #594 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:58:25 -04:00
Joseph Doherty
4f6231fa40
refactor(localdb): one replication predicate shared by table registration and the alarm drain gate ( #603 )
...
The drain gate counted SyncListenPort; a port with no ApiKey shares nothing (fail-closed
passive endpoint), and an ApiKey-only passive node shares its queue but was never gated.
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:56:00 -04:00
Joseph Doherty
db10e9d2e3
Merge #604 : AdminUI stale-open guards on 5 modals, ValidationSummary, API-key delete confirm, ErrorBoundary
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:55:40 -04:00
Joseph Doherty
d3bca7afd4
fix(adminui): stale-open guards, validation summaries, key-delete confirm, error boundary ( #604 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:55:23 -04:00
Joseph Doherty
9b159025f7
Merge #598/#621(client): AddComment API + CLI comment, Galaxy-era fallback reads removed, CLI test serialization, Client.Shared on async SDK APIs
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:54:22 -04:00
Joseph Doherty
48bd266e19
feat(client): AddComment + comment CLI, drop Galaxy-era alarm fallback, serialize CLI tests ( #598 ); Client.Shared off obsolete sync SDK APIs ( #621 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:54:01 -04:00
Joseph Doherty
0fb194a096
Merge #608/#602/#596: stale WaveC TODOs resolved, FOCAS/TwinCAT factory logging, Modbus health asymmetry documented, AbCip browsePageDelayMs field, Device1 by-design
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:53:59 -04:00
Joseph Doherty
53247a056a
fix(runtime): malformed artifact bytes on boot/restore are no answer ( #601 ); evict telemetry snapshots on driver removal ( #609 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:53:45 -04:00
Joseph Doherty
9c39f2b6c4
fix(drivers): ILoggerFactory on FOCAS+TwinCAT factories; replace stale TODO(v3 WaveC); AbCip browsePageDelayMs form field; document Device1 + Modbus health ( #608 #602 #596 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:53:38 -04:00
Joseph Doherty
a6192159fe
Merge #618/#617/#620: fatal-log + exit on fail-start; ns=0 boot warning corrected; Health.Akka role match documented as accepted residual
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:53:12 -04:00
Joseph Doherty
413bc5c04f
fix(host): fatal-log, flush and exit non-zero when the host fails to start ( #618 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:52:54 -04:00
Joseph Doherty
ba3d882897
Merge #605 : Galaxy gateway seam hardening (advise-failure unmark, derived historian health, duplicate attributeRef surfaced, bounded subscribe-once read)
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:52:49 -04:00
Joseph Doherty
6a6ac9a11f
fix(abcip): libplctag ErrorBadParam at tag create is a per-tag config error, no device backoff ( #570 , #593 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:52:47 -04:00
Joseph Doherty
0544287f26
docs(plans): auto/driver-gaps branch ledger — 92 issues classified ( #607 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:52:41 -04:00
Joseph Doherty
1b37b2f2b0
perf(scripting): cache ScriptSandbox BCL + pinned metadata references ( #603 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:52:35 -04:00
Joseph Doherty
7c4c7f9653
fix(galaxy): seam hardening - advise unmark on throw, dup attributeRef surfaced, bounded subscribe-once read; delete dormant historian connection probe ( #605 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:52:21 -04:00
Joseph Doherty
33d72edcd0
Merge #613 slice: MTConnect authoring-time DataType advisory + ignored-DeviceName warning
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:52:08 -04:00
Joseph Doherty
b78c7ff9db
feat(mtconnect): authoring DataType warning + loud ignored-DeviceName warning ( #613 slice)
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:51:40 -04:00
Joseph Doherty
a8703c6afe
refactor(virtualtags): retire dormant VirtualTagEngine/Source/Definition + TimerTriggerScheduler ( #603 )
...
TimerTriggerScheduler was welded to the engine and has no production consumer.
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:51:22 -04:00
Joseph Doherty
21267750c7
test(ab-transport): blocked-write timeout fault path via a stream seam ( #565 , #593 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:50:40 -04:00
Joseph Doherty
7e91c37a52
test(opcuaclient-browser): skip live browse tests when opc-plc is unreachable; move out of unit project ( #594 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:48:34 -04:00
Joseph Doherty
792510c0eb
Merge #595/#606: OTOPCUA0001 error under src/, scoped NoWarn in driver test projects, global.json
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:48:15 -04:00
Joseph Doherty
7aa7758864
build: scoped OTOPCUA0001 NoWarn in 13 test projects, error under src/, pin SDK via global.json ( #595 #606 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:47:40 -04:00
Joseph Doherty
b37e9613f7
test(ab): default AB matrices to one profile when unset; PLC-5/status-bit refusal fixture tests ( #594 , #593 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:45:51 -04:00
Joseph Doherty
dc54b883eb
fix(historian): provision tags whose historization flips on or historian name changes ( #600 )
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 06:45:48 -04:00
Joseph Doherty
3baa332d6b
Merge: over-the-wire test of the shared client's alarm method calls against the in-process server
...
v2-ci / build (push) Successful in 4m36s
v2-ci / unit-tests (push) Failing after 19m50s
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 01:49:44 -04:00
Joseph Doherty
d66269a99b
test(client): over-the-wire alarm method calls against the in-process server
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 01:49:32 -04:00
Joseph Doherty
d978573fb2
Merge #591 : FOCAS duplicate-sibling tests wait for the first axis pass, not the bootstrap stamp
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 01:35:41 -04:00
Joseph Doherty
159f30dcd0
test(focas): wait for the first full poll, not the bootstrap stamp, before reading ( #591 )
...
LastFixedPollUtc is stamped by the fixed-tree bootstrap before any axis snapshot
is published, so under load Each_duplicate_axis_reads_its_own_position could read
inside that window and get BadNodeIdUnknown. The helper now waits for the last
axis slot plus the servo/spindle caches. 45/45 green under 14-core yes load.
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 01:35:25 -04:00
Joseph Doherty
3803df0433
Merge #587/#588: one condition event per method-driven transition (native: Ack/AddComment only); model-change + audit events gated per session on i=2253 when ACL is on
...
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
2026-10-08 01:23:20 -04:00