diff --git a/CLAUDE.md b/CLAUDE.md index 3244f490..d846470a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1130,6 +1130,16 @@ host logger factory (wired in `DriverFactoryBootstrap`; the FOCAS and TwinCAT fa - **MTConnect (#627/#628):** TIME_SERIES reads as a variable-length `double[]` (Float64 only); a count disagreeing with `sampleCount` is `BadDecodingError`. One MTConnect driver = one agent client = at most one `/raw` Device (`MTConnectMultipleDevices` deploy error; `RawTreeService.CreateDeviceAsync` refuses a second). +- **MTConnect CONDITION alarms (#626):** a CONDITION raw tag is a native Part 9 condition only when its `TagConfig` + carries the standard `alarm` object (opt-in — alarm tags leave the value subscription, so auto-promotion would break + existing String tags). Normal→inactive, Warning→500, Fault→800; one condition per DataItem showing the most severe + active nativeCode (ties: ordinal nativeCode, then type); ack is server-side only. ⚠️ UNAVAILABLE never clears: an + active condition stays active+acked with a quality-only `BadNoCommunication` (same as #481 transport loss). The + driver dedups against what the server was last TOLD (level+nativeCode+nativeSeverity+qualifier — not text), records + only while a handler is attached, and clears that record when the subscribed alarm SET changes (a rebuild recreates + the nodes inactive) but not on a reconnect of the same set — a replayed `/current` must never re-raise (un-ack). + `AlarmEventArgs` gained optional `OpcUaSeverity` (exact Part 9 severity) and `QualityStatusCode`; a quality-only + event goes out as `AlarmQualityUpdate` per node and never through the snapshot projection. - **Driver removal (#609):** removing a driver releases its capability-invoker pipelines and resilience tracker, *then* evicts its telemetry snapshots. ⚠️ Both are **tombstoned**, not just cleared: the removed child stops asynchronously and its in-flight subscribe/connect still completes through the invoker (and