Oliver Kieselbach 6937ff73b8 fix(v2): start drain pump at Start() step 3b instead of after collector boot
Symptom: Web UI showed register-session, then ~6.7s of silence, then a wall of
~100 events at once — visibly different from V1's streaming feel. Confirmed
on session 3808befb-…: agent_started enqueued at 18:20:20.5, first
BackendTelemetryUploader flush at 18:20:27.2 with firstId=0 lastId=99 (a
full default 100-item batch).

Root cause: the periodic drain pump was started at Start() step 15, after
collector hosts had spun up. Steps 4-14 do meaningful synchronous work —
gather-rule compile, Hello event-log subscriptions, PowerShell runspace open
in DeliveryOptimizationCollector, ipinfo.io GeoLocation, analyzer scheduling —
which on a constrained VM kept the calling thread (or the ThreadPool) busy
for ~6.7s. During that window the spool accumulated 100 startup signals,
saturating the batchSize cap. Even though immediate-flush wakeups did fire
correctly, they only set a TaskCompletionSource that nobody was awaiting yet.

Fix: move the drain pump start to step 3b, directly after the spool and the
immediate-flush bridge are wired (step 3 + 3a). The pump's loop only
references _spool / _transport (both built at step 3) and the wakeup TCS
(step 3a) — no collector-state, classifier-state, or ingress dependency —
so an early start is safe. An empty Peek returns OK(0) without an HTTP
round-trip, so a pump tick that races ahead of any enqueue is a no-op.

With the pump live from step 3b onward, the very first immediate-flush
wakeup (e.g. agent_started in onIngressReady at step 13b) sets the TCS and
the drain loop's WhenAny returns within milliseconds, then DrainAllAsync's
peek-flush-peek loop drains whatever the spool has accumulated up to that
moment in tight ~100-item batches.

Tests: V2.Core 732/732 green; no behaviour-coupling on the old step 15
position. Solution build 0/0.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 22:06:42 +02:00
2026-04-22 19:36:19 +02:00
2026-03-17 18:24:01 +01:00
2026-03-26 07:02:33 +01:00
2026-04-04 19:17:01 +02:00

Autopilot Monitor

Advanced monitoring and troubleshooting solution for Windows Autopilot deployments. Gain full visibility into every enrollment session with a detailed event timeline, fleet health dashboards, and session reporting. Define custom analysis rules to automatically detect issues and gather rules to collect targeted evidence. Retrieve diagnostics packages on demand, configure agent settings like auto-reboot behavior and automatic timezone adjustment — all managed centrally from the web dashboard.

Private Preview

Autopilot Monitor is currently running as a Private Preview. Visit autopilotmonitor.com to request access and learn more.

Overview

Autopilot Monitor provides real-time tracking, intelligent diagnostics, and automated troubleshooting for Windows Autopilot enrollment processes. It consists of:

  • Bootstrap Script — PowerShell script deployed via Intune that starts monitoring early in the enrollment process
  • Monitoring Agent — Lightweight .NET application that collects telemetry and evidence during enrollment
  • Backend API — Azure Functions-based ingestion and processing pipeline
  • Web Dashboard — Next.js application for real-time monitoring and fleet analytics

Architecture

For detailed information about the system architecture, components, and data flow, see Architecture Documentation.

Documentation

Full documentation is available at autopilotmonitor.com/docs

License

This project uses a split licensing model:

  • MIT License — Agent (src/Agent/) and Shared library (src/Shared/) — unrestricted use on end-user devices
  • AGPL-3.0 — Backend (src/Backend/), Web Dashboard (src/Web/), and MCP Server (src/McpServer/) — server-side components remain open source

See LICENSE for full details.

S
Description
Windows Autopilot & Intune enrollment monitoring: live session timelines, fleet health, diagnostics, and an MCP server for AI-assisted troubleshooting.
Readme AGPL-3.0 60 MiB
Languages
C# 72.7%
TypeScript 25.7%
PowerShell 1%
JavaScript 0.5%