HelloDetector fix and Changelog/Known-Issues Updates

This commit is contained in:
Oliver Kieselbach
2026-02-26 18:39:46 +01:00
parent 646eb68d7b
commit 2bdce7e2cd
3 changed files with 21 additions and 18 deletions
@@ -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<string, object>
{
{ "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
{
@@ -34,13 +34,26 @@ export default function ChangelogPage() {
</p>
</div>
{/* Known Issues */}
<div className="mb-10 pb-8 border-b border-gray-100">
<h2 className="text-sm font-semibold text-gray-900 mb-3 uppercase tracking-wider">Known Issues</h2>
<ul className="space-y-2">
<li className="flex gap-2 text-sm text-gray-600 leading-relaxed">
<span className="mt-0.5 text-yellow-500 flex-shrink-0">⚠</span>
<span>
<span className="font-medium text-gray-800">Event Timeline</span> — only tested with Entra-only, user-driven Autopilot (no WhiteGlove, ESP with &ldquo;wait for all apps&rdquo; only, no Device Preparation, no hybrid scenario). There is code to handle some of these scenarios but they are untested. If you&apos;d like to share logs for any of these scenarios, that would be greatly appreciated.
</span>
</li>
</ul>
</div>
{/* Entries — newest first */}
<div className="space-y-10">
<div>
<div className="flex items-center gap-3 mb-3">
<span className="text-xs font-mono font-semibold text-gray-400 uppercase tracking-wider">
2026-02-26
2026-02-26 - 10:15 CET
</span>
<span className="inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-blue-100 text-blue-800">
Architecture
@@ -51,15 +64,7 @@ export default function ChangelogPage() {
</h2>
<p className="text-sm text-gray-600 leading-relaxed">
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&apos;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.
</p>
</div>
@@ -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
</Link>
.{" "}
Feedback or bug report?{" "}