feat(streaming): carry AckTime on DebugAlarmStateDto (21) (ScadaBridge#84)

The live AlarmStateUpdate already carried ack_time (24) but the Debug View
snapshot DTO did not, so snapshot-seeded alarm rows showed a null ack time
until the next live update. Additive google.protobuf.Timestamp ack_time = 21
(absent => null, including from a pre-#84 site), vendored C# regenerated with
docker/regen-proto.sh sitecommand, mapped both ways in SiteCommandDtoMapper.
The native golden sample now sets AckTime (the computed one leaves it null),
so the round-trip golden pins both the present and the absent decode.

Claude-Session: https://claude.ai/code/session_01GT67AEHd2Acv1YPwGfXEoV
This commit is contained in:
Joseph Doherty
2026-11-09 12:45:21 -05:00
parent 03de3dcc14
commit d36825633b
5 changed files with 282 additions and 210 deletions
@@ -290,7 +290,11 @@ internal static class SiteCommandSamples
IsMesReportable = true
};
/// <summary>A mirrored native alarm: every native enrichment field populated, <c>Condition</c> explicit.</summary>
/// <summary>
/// A mirrored native alarm: every native enrichment field populated, <c>Condition</c> explicit.
/// Carries an ack time so the golden pins <c>DebugAlarmStateDto</c> field 21 (Gitea #84); the
/// computed sample leaves it null, pinning the absent-means-null decode.
/// </summary>
private static AlarmStateChanged NativeAlarm() =>
new("Site1.Pump1", "Tank01.Level.HiHi", AlarmState.Active, 850, T2)
{
@@ -304,6 +308,7 @@ internal static class SiteCommandSamples
OperatorUser = "multi-role",
OperatorComment = "ack'd at panel",
OriginalRaiseTime = T1,
AckTime = T2,
CurrentValue = "91.2",
LimitValue = "90.0",
NativeSourceCanonicalName = "Tank01.TankAlarms",