From 2bdce7e2cdccbd094386612b8c9067346515a9ac Mon Sep 17 00:00:00 2001 From: Oliver Kieselbach Date: Thu, 26 Feb 2026 18:39:46 +0100 Subject: [PATCH] HelloDetector fix and Changelog/Known-Issues Updates --- .../Monitoring/Collectors/HelloDetector.cs | 12 ++++----- .../app/changelog/page.tsx | 25 +++++++++++-------- .../app/dashboard/page.tsx | 2 +- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/Agent/AutopilotMonitor.Agent.Core/Monitoring/Collectors/HelloDetector.cs b/src/Agent/AutopilotMonitor.Agent.Core/Monitoring/Collectors/HelloDetector.cs index 4a964c95..705dd629 100644 --- a/src/Agent/AutopilotMonitor.Agent.Core/Monitoring/Collectors/HelloDetector.cs +++ b/src/Agent/AutopilotMonitor.Agent.Core/Monitoring/Collectors/HelloDetector.cs @@ -376,12 +376,10 @@ namespace AutopilotMonitor.Agent.Core.Monitoring.Collectors if (!TrackedEventIds.Contains(eventId)) return; - var description = record.FormatDescription() ?? $"Event ID {eventId}"; ProcessHelloEvent( eventId, record.TimeCreated ?? DateTime.UtcNow, record.ProviderName ?? "", - description, isBackfill: false); } catch (Exception ex) @@ -390,7 +388,7 @@ namespace AutopilotMonitor.Agent.Core.Monitoring.Collectors } } - private void ProcessHelloEvent(int eventId, DateTime timestamp, string providerName, string description, bool isBackfill) + private void ProcessHelloEvent(int eventId, DateTime timestamp, string providerName, bool isBackfill) { string eventType; EventSeverity severity; @@ -448,11 +446,13 @@ namespace AutopilotMonitor.Agent.Core.Monitoring.Collectors return; } + // We only need the event ID and provider for tracking purposes. + // The full description can contain sensitive data (e.g. server responses with key IDs, UPNs, tokens). var data = new Dictionary { { "windowsEventId", eventId }, { "providerName", providerName ?? "" }, - { "description", description ?? "" } + { "description", "truncated" } }; if (isBackfill) @@ -851,7 +851,6 @@ namespace AutopilotMonitor.Agent.Core.Monitoring.Collectors DateTime latestTimestamp = DateTime.MinValue; int? latestEventId = null; string latestProvider = string.Empty; - string latestDescription = null; for (EventRecord record = reader.ReadEvent(); record != null; record = reader.ReadEvent()) { @@ -868,14 +867,13 @@ namespace AutopilotMonitor.Agent.Core.Monitoring.Collectors latestTimestamp = timestamp; latestEventId = eventId; latestProvider = record.ProviderName ?? ""; - latestDescription = record.FormatDescription() ?? $"Event ID {eventId}"; } } if (latestEventId.HasValue) { _logger.Info($"Backfill found recent Hello terminal event: EventID {latestEventId.Value} at {latestTimestamp:O}"); - ProcessHelloEvent(latestEventId.Value, latestTimestamp == DateTime.MinValue ? DateTime.UtcNow : latestTimestamp, latestProvider, latestDescription, isBackfill: true); + ProcessHelloEvent(latestEventId.Value, latestTimestamp == DateTime.MinValue ? DateTime.UtcNow : latestTimestamp, latestProvider, isBackfill: true); } else { diff --git a/src/Web/autopilot-monitor-web/app/changelog/page.tsx b/src/Web/autopilot-monitor-web/app/changelog/page.tsx index fe1844c9..cecac656 100644 --- a/src/Web/autopilot-monitor-web/app/changelog/page.tsx +++ b/src/Web/autopilot-monitor-web/app/changelog/page.tsx @@ -34,13 +34,26 @@ export default function ChangelogPage() {

+ {/* Known Issues */} +
+

Known Issues

+
    +
  • + ⚠ + + Event Timeline — only tested with Entra-only, user-driven Autopilot (no WhiteGlove, ESP with “wait for all apps” only, no Device Preparation, no hybrid scenario). There is code to handle some of these scenarios but they are untested. If you'd like to share logs for any of these scenarios, that would be greatly appreciated. + +
  • +
+
+ {/* Entries — newest first */}
- 2026-02-26 + 2026-02-26 - 10:15 CET Architecture @@ -51,15 +64,7 @@ export default function ChangelogPage() {

The way live session events reach the dashboard timeline was fundamentally - reworked. Previously, SignalR pushed full event payloads directly into the - UI — which could cause silent gaps if a message was dropped or arrived - out of order. Events are now fetched directly from storage on each signal, - making Table Storage the single source of truth. The timeline always reflects - what is actually stored, ordering and completeness are guaranteed, and - phase grouping is computed at render time rather than at receipt time - (eliminating a race condition when session metadata wasn't yet available). - A 30-second catch-up fetch was also added as a safety net for sessions - with degraded SignalR connectivity. + reworked. This should make the timeline more reliable and accurate.

diff --git a/src/Web/autopilot-monitor-web/app/dashboard/page.tsx b/src/Web/autopilot-monitor-web/app/dashboard/page.tsx index a72081c5..8bdc0653 100644 --- a/src/Web/autopilot-monitor-web/app/dashboard/page.tsx +++ b/src/Web/autopilot-monitor-web/app/dashboard/page.tsx @@ -509,7 +509,7 @@ export default function Home() { href="/changelog" className="underline font-medium hover:text-blue-600 dark:hover:text-blue-200" > - Private Preview Changelog + Private Preview Changelog/Known Issues .{" "} Feedback or bug report?{" "}