fix(historian): record the real status code and typed values; backend-supported kinds gate capture

The recorder now appends the typed HistorianValue and the mux's own StatusCode instead of a
double + hard-coded Good, and drops any kind not in the backend's SupportedKinds (resolved
optionally from IHistorianBackendProvider; absent => {Double, Int64, Boolean}, today's behaviour).
RecorderStatus.DroppedNonNumeric -> DroppedUnsupportedKind; GoodQuality const removed; stale
"mux carries no quality" remarks rewritten (comms-loss node stamps are not historized).

Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
This commit is contained in:
Joseph Doherty
2026-10-09 12:49:05 -04:00
parent ff7c6c531a
commit 04b882f5c6
5 changed files with 326 additions and 54 deletions
@@ -13,7 +13,7 @@ namespace ZB.MOM.WW.OtOpcUa.Runtime.Historian;
/// thread on the actor mailbox. The outbox exposes both gauge sources cheaply and
/// non-blockingly — <see cref="IHistorizationOutbox.CountAsync"/> completes synchronously (it
/// just reads an in-memory FIFO count) and <see cref="IHistorizationOutbox.DroppedCount"/> is a
/// plain property. The recorder's other counters (TotalRecorded / DroppedNonNumeric /
/// plain property. The recorder's other counters (TotalRecorded / DroppedUnsupportedKind /
/// OutboxAppendFailures) remain available via its <c>GetStatus</c> Ask for a health hook, but are
/// not surfaced as gauges here (Ask-in-gauge is the awkward path the plan calls out).
/// </para>