HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Windows Update Windows UpdateWindows AutopatchWUfB ReportsIntuneDiagnostic DataCompliance ReportingWindows 11Update Compliance

Your Autopatch report says Up to Date and the device disagrees: reconciling cloud update reporting against on-device truth

IA
Imran Awan
23 August 2026

The report says Up to Date. The engineer sitting in front of the device says it is not. One of them is wrong, and the argument usually gets settled by whoever is more senior rather than by whoever is right.

Both can be telling the truth. A cloud update report is not a live view of a device. It is a view of a batch, built from a snapshot, assembled from a diagnostic-data upload, produced by a device that had to be enrolled, reachable, configured for data collection and awake at the right moment. Every one of those is a documented dependency, and every one of them is a place where the report and the machine can legitimately diverge.

None of that is a bug. It is the architecture. Once you know what the report is actually derived from, "the portal is wrong" stops being a complaint and becomes a diagnosis with a procedure attached.

This post is about that procedure. Not what Autopatch is, and not how to configure it - just the reconciliation discipline: what the cloud report is built from, which prerequisites have to be true for a device to appear correctly in it, what Microsoft publishes about latency, and which on-device evidence overrides the report when the two disagree.

The short version

Autopatch and Windows Update for Business reports are built from Windows diagnostic data plus Intune, not from a live query against the device. Microsoft publishes the numbers: data "typically uploads from enrolled devices every hour", it is "processed in batches", "the maximum end-to-end latency is approximately four hours", and the status report itself is "refreshed every four hours". Autopatch readiness checks run once a day, remediated devices take "up to 24 hours" to move back to Ready, and a brand-new tenant takes "up to 48 hours" before devices appear registered at all. So a report can be confidently, correctly, four-to-forty-eight hours wrong. On top of that, the report only carries client-level detail if diagnostic data is configured at Required or higher, the device is Entra joined or hybrid joined, and a set of named endpoints is reachable. On the lab device the effective diagnostic-data value is not stored under the name most scripts look for, the documented "must also be running" service wlidsvc was stopped, and AllowDeviceNameInDiagnosticData was absent - three quiet reasons a device shows up wrong or nameless. The on-device evidence that overrides all of it: CurrentBuild plus UBR from the registry (not OSVersion, which reports revision .0), the component-store package inventory (415 packages on this device, against Get-HotFix's 4 rows), and the Windows Update agent's own session history (153 entries, 52 of them failures). Read those three in that order before you touch the update stack.

The problem: the report is a snapshot of a snapshot

The disagreement arrives in two directions, and they need different treatment.

In the first direction the portal is green and the device is behind. Somebody runs a scan by hand, finds a missing security update, and now your compliance number is a fiction. In the second direction the portal is red and the device is fine. Somebody spends a morning rebuilding an update stack that was never broken.

The second one is more expensive, because the "fix" destroys the evidence. Once you have cleared SoftwareDistribution, the agent's scan cache and its history of what it was offered are gone, and you can no longer prove which side was lying.

What you seeWhat people assumeWhat is often actually true
Portal: Up to Date. Device: patch missing.The report is broken.The report is showing the last successful upload, which predates the patch. Documented end-to-end latency is up to about four hours; the report refreshes on a four-hour cycle of its own.
Portal: Not up to Date. Device: fully patched.The device failed to install.The device installed fine but has not reported since. Nothing in the pipeline retroactively corrects an old row.
Portal: In Progress, for days.Something is stuck.Documented behaviour: "Devices that are Up to Date remain with the In Progress status until either the current monthly cumulative update is applied, or an alert is received."
Device is in the report with no name.Reporting bug.AllowDeviceNameInDiagnosticData is not set. Microsoft: "Device names don't appear in Windows Update for Business reports unless you individually opt in devices by using a policy."
Service State / Client State columns are empty.Data loss.Documented: those columns "are supplemental and might not display for all devices".
Device is not in the report at all.Deleted / broken agent.Registration latency (up to 48 hours in a new tenant), an unsupported join type, or no Intune check-in in the last 28 days.

Before any of that can be argued, you need a build number both sides agree on. This is where most reconciliations fall over on the first step, because Windows will hand you three different answers depending on which API you ask.

Three ways to ask "what build is this?" - real output, one device, same second
# Captured read-only on a live Windows 11 Enterprise corporate device, 2026-08-23. [Environment]::OSVersion.Version = 10.0.26200.0 Win32_OperatingSystem.Version = 10.0.26200 Win32_OperatingSystem.BuildNumber = 26200 Win32_OperatingSystem.Caption = Microsoft Windows 11 Enterprise CurrentBuild.UBR (registry) = 26200.9168 DisplayVersion (registry) = 25H2 ProductName (registry) = Windows 10 Enterprise BuildLabEx (registry) = 26100.1.amd64fre.ge_release.240331-1435 ReleaseId (registry) = 2009 InstallDate = 2025-03-15 17:58:24 # Read the first line again. OSVersion reports the revision as .0 - ALWAYS. # A compliance script built on [Environment]::OSVersion can never see a patch level. # Win32_OperatingSystem does not carry the UBR either. Only the registry does. # ProductName still says "Windows 10". ReleaseId is frozen at 2009 (Win10 20H2). # BuildLabEx is a 26100 (24H2) lab string on a 26200 (25H2) build: forensic proof # this device was INSTALLED as 24H2 in March 2025 and moved up later.

Six values on one machine, four of which will mislead a script. The report's Current version column is documented as "The current version or build number of the device" - so the only on-device value you can legally compare it against is CurrentBuild joined to UBR.

Gotcha: the UBR alone is not unique across releases. On this device the August 2026 cumulative update produced build 26200.9168 on 25H2 - but the same KB lands as 26100.9168 on 24H2. Identical UBR, different build. A compliance check written as UBR -ge 9168 without also pinning CurrentBuild will pass a 24H2 device against a 25H2 baseline and report it green. That is a real, reproducible way to manufacture the exact disagreement this post is about, from your own script.

Why it happens: what the cloud report is actually made of

Microsoft is explicit about the data source. For the Autopatch quality and feature update reports: "The data source for these reports is Windows diagnostic data and Microsoft Intune." For Windows Update for Business reports: it "uses Windows diagnostic data", routed into a Log Analytics workspace you own.

That single sentence is the whole story. The report is not asking your device anything. Your device pushed something, some time ago, through a telemetry pipeline, and the report is rendering a processed batch of that.

The chain, component by component

There are only a handful of moving parts, and each has a name you can check on the device.

Binary / componentRole in the reporting chainWhere it lives (verified on 26200.9168)
DeviceCensus.exeCollects the device inventory that the reports are largely built from. Microsoft's own endpoint table says it "must run on a regular cadence and contact this endpoint in order to receive most information for Windows Update for Business reports".C:\Windows\System32\DeviceCensus.exe - version 10.0.26100.9168, FileDescription "Device Census", 153,056 bytes
diagtrack.dllThe Connected User Experiences and Telemetry component. Hosts the upload machinery; the service is DiagTrack.C:\Windows\System32\diagtrack.dll - version 10.0.26100.1, FileDescription "Microsoft Windows Diagnostics Tracking"
wuaueng.dllThe Windows Update agent engine itself - the thing that actually knows what was offered, downloaded and installed. Loaded by wuauserv, which runs as svchost.exe -k netsvcs -p under LocalSystem.C:\Windows\System32\wuaueng.dll - version 1509.2607.1012.0
wuapi.dllThe Windows Update client API. This is the COM surface behind Microsoft.Update.Session, and therefore behind the agent's own session history.C:\Windows\System32\wuapi.dll - version 1509.2607.1012.0, "Windows Update Client API"
usosvc.dllUpdate Session Orchestrator service - schedules and drives scan/download/install sessions.C:\Windows\System32\usosvc.dll - version 10.0.26100.8737
MoUsoCoreWorker.exeThe orchestrator's worker process. Shows up in update history as the client MoUpdateOrchestrator.C:\Windows\UUS\amd64\MoUsoCoreWorker.exe - version 1509.2607.1012.0. Note the path: not System32.
Context: look at the version numbers in that table. The OS is 10.0.26200.9168. The census binary is 10.0.26100.9168. The telemetry DLL is 10.0.26100.1. The orchestrator service DLL is 10.0.26100.8737. The update agent and its API are 1509.2607.1012.0 - a completely different numbering scheme, because the agent ships in the Unified Update Stack and is serviced independently of the OS build. Four version streams in one reporting path. That is why "the agent is out of date" is almost never a conclusion you can reach by eyeballing a version string, and why the report's build number and the agent's own opinion are produced by components that were not shipped together.

The documented latency, in one table

Do not guess at these and do not let anyone else guess either. Microsoft publishes them.

StageDocumented figureWhat it means when the report disagrees
Device to service upload"The data typically uploads from enrolled devices every hour."A change made 20 minutes ago is very unlikely to be in the pipeline yet.
Service-side processing"the data is processed in batches before being made available"There is no incremental trickle. You wait for a batch.
End-to-end"The maximum end-to-end latency is approximately four hours."Four hours is the honest floor for "let it settle before I investigate".
Quality update status report refresh"The data in this report is refreshed every four hours with data received by your Windows Autopatch managed devices. The last refreshed on date/time can be seen at the top of the page."Read that timestamp first, every time. It is the report telling you how stale it is.
Post-registration readiness checksAgents "collect device readiness statuses when it runs (once a day)".A readiness verdict can be up to a day old regardless of the four-hour data refresh.
Return to Ready after remediation"Once devices are remediated, it can take up to 24 hours to appear in the Ready tab."Fixing a device does not clear the flag on the next refresh.
New tenant registration"it will take up to 48 hours for devices to appear as registered"An absent device in week one is not necessarily a broken device.
Intune communication windowDevices that "didn't communicate with the Microsoft Intune service in the last 28 days" are marked Not Ready.A laptop in a drawer for a month will go Not Ready on its own.

Notice that these do not stack neatly. A device can be inside the four-hour data window and still be carrying a readiness verdict computed 23 hours ago, from an agent run that happened before the change you made. There is no single "refresh" that resolves everything at once.

The prerequisites that decide whether a device reports at all

This is the part that turns "the portal is wrong" into a fixable finding. Microsoft splits the data into two tiers, and the split is the reason a device can appear in the report while telling you almost nothing:

So the service always knows what it intended for a device. It only knows what the device actually did if diagnostic data is configured. A device with broken data collection does not vanish from the report - it sits there displaying the service's intention as though it were the device's state. That is the single most misleading thing a cloud update report can do.

The documented requirements to get the client side populated:

That last one deserves its own list, because it is where a locked-down proxy quietly breaks reporting without breaking patching. From the WUfB reports prerequisites:

EndpointDocumented function
*v10c.events.data.microsoft.com (eu-v10c... in the EU Data Boundary)"Connected User Experience and Diagnostic component endpoint... DeviceCensus.exe must run on a regular cadence and contact this endpoint in order to receive most information for Windows Update for Business reports."
settings-win.data.microsoft.com"Used by Windows components and applications to dynamically update their configuration. Required for Windows Update functionality."
adl.windows.com"Required for Windows Update functionality."
login.live.com"This endpoint facilitates your Microsoft account access and is required to create the primary identifier we use for devices. Without this service, devices aren't visible in the solution. The Microsoft Account Sign-in Assistant service must also be running (wlidsvc)."
umwatsonc.events.data.microsoft.comWindows Error Reporting - "used to provide more advanced error reporting if certain Feature Update deployment failures occur."
oca.telemetry.microsoft.comOnline Crash Analysis.

Autopatch adds its own list on top - mmdcustomer.microsoft.com, mmdls.microsoft.com, devicelistenerprod.microsoft.com, login.windows.net, device.autopatch.microsoft.com, services.autopatch.microsoft.com, payloadprod*.blob.core.windows.net and *.webpubsub.azure.com - plus the blunt requirement that "The proxy or firewall must support TLS 1.2."

And Autopatch actively tests reachability rather than assuming it. The documented internet connectivity readiness check "uses the PingReply class. Windows Autopatch tries to ping at least three different Microsoft's public URLs two times each, to confirm that ping results aren't coming from the device's cache." A readiness failure there is a network verdict, not a patching verdict.

How to verify: the reconciliation procedure, in order

Watch out: the reflex sequence here - stop wuauserv, rename SoftwareDistribution, run sfc /scannow, force a scan - destroys the evidence you need and does not touch the reporting pipeline at all. Worse, the tool people reach for first is booby-trapped: Get-WindowsUpdateLog -ForceFlush stops the Update Orchestrator and Windows Update services in order to flush their ETW buffers. Running it as your opening move terminates the live session you were trying to inspect. Read state first, in the order below, and touch nothing until step 8.

Step 1 - Read the report's own staleness before you read its verdict

The Quality update status report prints a "last refreshed on" date and time at the top of the page. Write it down. If the change you are investigating happened after that timestamp, you are done - the report is not wrong, it is old, and the documented refresh cycle is four hours.

While you are there, add the optional columns that turn a verdict into evidence: Intune last check-in time, Service State, Service Substate, Client State, Client Substate, Hex Error Code and Quality update Installed Time. If the client-side columns are blank while the service-side ones are populated, you already know the answer: this device is not reporting client data, and everything you are looking at is the service's intention.

Step 2 - Establish the on-device build authority

Take CurrentBuild and UBR from HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion and treat them as the only legitimate comparand for the report's Current version column. Do not use OSVersion, do not use ProductName, do not use ReleaseId. The console block in the previous section shows exactly why.

Step 3 - Ask whether the device is even capable of reporting

This is the step almost nobody does, and it is the one that most often ends the investigation. Check the diagnostic-data configuration, and check it by value name rather than by key existence.

Diagnostic-data policy surface - real values, identifiers redacted
# HKLM\SOFTWARE\Policies\Microsoft\Windows\DataCollection KEY: HKLM:\SOFTWARE\Policies\Microsoft\Windows\DataCollection Exists=True ValueCount=4 SubKeyCount=0 AllowTelemetry = <not present> AllowTelemetry_PolicyManager = 3 AllowDeviceNameInDiagnosticData = <not present> DisableOneSettingsDownloads = <not present> DisableEnterpriseAuthProxy = 1 CommercialId = <redacted GUID> # HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection KEY: ...\CurrentVersion\Policies\DataCollection Exists=True ValueCount=0 SubKeyCount=1 AllowTelemetry = <not present> # HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\System AllowTelemetry_ProviderSet = 1 AllowTelemetry_WinningProvider = <provider GUID A> AllowBuildPreview = 2 AllowMicrosoftManagedDesktopProcessing = 0 LimitEnhancedDiagnosticDataWindowsAnalytics = 0 # note: no plain 'AllowTelemetry' value here either # Services DiagTrack Running Automatic "Connected User Experiences and Telemetry" svchost.exe -k utcsvc -p / LocalSystem wlidsvc Stopped Manual "Microsoft Account Sign-in Assistant"

Three things in that block will break a naive prerequisite check.

First, the value name. Microsoft's Policy CSP documents the Group Policy registry key for AllowTelemetry as Software\Policies\Microsoft\Windows\DataCollection, which is exactly where this device is configured - but the value on disk is AllowTelemetry_PolicyManager, and plain AllowTelemetry is absent from all three of the obvious locations. A script that tests for AllowTelemetry concludes "diagnostic data unconfigured" on a device where it is set to 3. Per Microsoft's own value table, 3 is Optional (Full) - two levels above the Required minimum. The device is over-configured and the check reports it as unconfigured.

Second, AllowDeviceNameInDiagnosticData is not present, and its documented default is 0 (Disabled). This device would appear in WUfB reports without a name. If your triage starts by searching the report for a hostname, you will not find this machine, and you will conclude it is not reporting - when in fact it is reporting anonymously.

Third, wlidsvc was Stopped at capture time with StartType Manual, against documentation that says "The Microsoft Account Sign-in Assistant service must also be running (wlidsvc)" and that without login.live.com "devices aren't visible in the solution". It is a trigger-start service so it may well start on demand - but "must be running" and "was not running" is exactly the kind of gap you want on the record before you start blaming the update stack.

Gotcha: AllowMicrosoftManagedDesktopProcessing = 0 looks like the smoking gun. It is not. Microsoft documents it as deprecated: "This policy is deprecated and will only work on Windows 10 version 1809. Setting this policy will have no effect for other supported versions of Windows", with allowed values of only 0 (Disabled, the default) and 32 (Allowed). On Windows 11 it is inert. Chasing it costs you an afternoon. The same trap applies to DisableEnterpriseAuthProxy = 1, which is genuinely load-bearing but is also the value Defender for Endpoint requires - Microsoft states plainly that user proxy authentication "relies on the DisableEnterpriseAuthProxy registry key set to 0, while Microsoft Defender for Endpoint requires it to be set to 1." You may not be able to have both; know which trade-off your tenant made before calling it a fault.

Here is the surface worth having in a runbook. Shared parent key:

HKLM\SOFTWARE\Policies\Microsoft\Windows\DataCollection
ValueMeaningWhat to look for
AllowTelemetryDiagnostic data level. Documented values: 0 off/Security, 1 Required/Basic (default), 2 Enhanced, 3 Optional/Full.Anything below 1 means no client data in the reports. Absence does not mean unconfigured - see the next row.
AllowTelemetry_PolicyManagerThe value actually written on this device when the setting arrives via the Policy CSP rather than classic Group Policy.Measured here as 3. Test for both names and report which one you found.
AllowDeviceNameInDiagnosticDataOpt-in for sending the device name. Documented default 0 = Disabled.Absent or 0 means the device appears in the report unnamed. Set to 1 if you ever want to search by hostname.
DisableOneSettingsDownloadsBlocks the services configuration (OneSettings) download.If present and enabled, expect "some of the client data to be incorrect or missing in reports".
DisableEnterpriseAuthProxyControls whether the telemetry client uses the signed-in user's context for proxy authentication.1 here. Required by Defender for Endpoint, incompatible with user proxy authentication for diagnostic data.
CommercialIdTenant workspace identifier used by the commercial data pipeline.Present is good. Its absence on a tenant that expects reporting is worth a look.

Step 4 - Prove the census actually ran and the upload actually left

Diagnostic data configuration being correct is not the same as data having been sent. Both are checkable, and neither requires a single change to the device.

Census task and telemetry upload timestamps - measured read-only
# The two scheduled tasks that run DeviceCensus.exe (action verified on-device): TASK: Device EXEC: %windir%\system32\devicecensus.exe SystemCxt TASK: Device User EXEC: %windir%\system32\devicecensus.exe UserCxt TASK: Device STATE=Ready LASTRUN=2026-08-23 10:33:43 RESULT=0 NEXT=2026-08-24 03:17:23 TASK: Device User STATE=Ready LASTRUN=2026-08-22 18:25:41 RESULT=0 NEXT=<none> # HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Diagnostics\DiagTrack # FILETIME values, decoded. NOT documented by Microsoft - treat as corroborating, # never as an authority. But they are real and they are timestamped. LastSuccessfulUploadTime -> 2026-08-23 10:47:30 UTC LastSuccessfulNormalUploadTime -> 2026-08-23 10:47:30 UTC LastSuccessfulRealtimeUploadTime -> 2026-08-23 10:03:09 UTC LastSuccessfulCostDeferredUploadTime -> 2026-08-23 10:42:40 UTC LastConnectivityHeartBeatTime -> 2026-08-23 09:26:56 UTC HttpRequestCount = 101510 TriggerCount = 1046804 NOW -> 2026-08-23 10:48:52 UTC # Read the gap: a successful upload 82 seconds before the capture, and a census # run 15 minutes before that, exit code 0. This device IS talking. So if the # report still disagrees, the problem is latency or scope - not collection.

The census task is the piece Microsoft names directly in the endpoint table, so LastRunTime plus LastTaskResult = 0 is the strongest cheap evidence that the inventory half of the pipeline is alive. Note that Device User has no next run time - it is trigger-driven, so a stale timestamp there is not automatically a fault.

Context: the DiagTrack counters are not in any Microsoft reference, so do not build alerting on them. They are useful for one specific job: separating "this device has never uploaded" from "this device uploaded fine, the report is just behind". That distinction is the difference between a network ticket and a cup of tea. It is also consistent with something Microsoft does document as part of Required diagnostic data - "Quality metrics that help provide an understanding about how the Connected User Experiences and diagnostic data component is functioning, including % of uploaded events, dropped events, blocked events, and the last upload time."

Step 5 - Confirm the device is in the service you are reading

Reading an Autopatch report and diagnosing a device that was never registered with Autopatch is a surprisingly common way to lose a day. There is an on-device footprint for this. Microsoft documents that the post-registration readiness checks are "powered by the Microsoft Cloud Managed Desktop Extension. It's installed right after devices are successfully registered with Windows Autopatch", and that it writes its results to a specific path.

Is this device Autopatch-registered? Enrolment footprint, measured
# The documented Autopatch readiness-result path: ABSENT : C:\ProgramData\Microsoft\CMDExtension ABSENT : C:\ProgramData\Microsoft\CMDExtension\Plugins\DeviceReadinessPlugin\Logs\DRCResults.json.log # So this lab device is Intune-managed with Windows Update client policies, # NOT registered with Autopatch. Absence of the extension is the answer. IntuneManagementExtension Running Automatic # HKLM\SOFTWARE\Microsoft\Enrollments - 37 GUID-named subkeys, ProviderIDs: ProviderID=MS DM Server EnrollmentState=1 EnrollmentType=6 ProviderID=WMI_Bridge_SCCM_Server EnrollmentState=1 EnrollmentType=12 ProviderID=Microsoft Device Management EnrollmentState=1 EnrollmentType=26 ProviderID=Local Authority EnrollmentState=1 EnrollmentType=28 ProviderID=Deploy Authority EnrollmentState=1 EnrollmentType=30 ProviderID=Cloud Authority EnrollmentState=1 EnrollmentType=31 # dsregcmd /status, booleans only: AzureAdJoined : YES DomainJoined : YES EnterpriseJoined : NO # AzureAdJoined + DomainJoined = hybrid joined, which IS a supported join type. # Entra-REGISTERED-only devices are documented as unsupported for WUfB reports.

That single absent folder is a complete answer to "why is this device's Autopatch readiness status odd" - it has no Autopatch client-side component at all. Check it before you check anything else about readiness.

Step 6 - Read the package inventory, not the hotfix list

Now to the on-device truth that overrides the report. The instinct is Get-HotFix. The instinct is wrong, and Microsoft says so in the class documentation.

Get-HotFix versus the real package inventory - same device, same minute
# Get-HotFix (wraps Win32_QuickFixEngineering) ROWS: 4 HotFixID Description InstalledOn -------- ----------- ----------- KB5121003 Security Update 8/20/2026 KB5120708 Update 8/20/2026 KB5123304 Security Update 8/19/2026 KB5054156 Update 2/4/2026 # Get-WindowsPackage -Online, grouped by state, SAME device: Superseded 199 Installed 121 Staged 95 TOTAL PACKAGES: 415 # Now the part that matters. How many packages are named after a KB? count of Package_for_KB* packages: 1 Installed Package_for_KB5054156~31bf3856ad364e35~amd64~~26100.6717.1.4 # The cumulative update is NOT named after its KB. It is a RollupFix: Staged Package_for_RollupFix~31bf3856ad364e35~amd64~~26100.1742.1.10 Superseded Package_for_RollupFix~31bf3856ad364e35~amd64~~26100.8655.1.20 Superseded Package_for_RollupFix~31bf3856ad364e35~amd64~~26100.8875.1.28 Installed Package_for_RollupFix~31bf3856ad364e35~amd64~~26100.9168.1.19 Installed Package_for_ServicingStack_9156~31bf3856ad364e35~amd64~~26100.9156.1.0 # The registry key that Win32_QuickFixEngineering's own MappingStrings point at: ABSENT: HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix

Four rows against 415 packages. This is not a fault - it is documented behaviour, and the wording is unambiguous: "This class returns only the updates supplied by Component Based Servicing (CBS). These updates are not listed in the registry. Updates supplied by Microsoft Windows Installer (MSI) or the Windows update site are not returned by Win32_QuickFixEngineering." The class documentation also warns that "an enumeration of this class can result in duplicates", and that InstalledOn "may use different formats" including a raw 64-bit FILETIME hex value.

Two details from that block are worth pulling out because they change how you write a compliance check.

The first is the naming. Exactly one package on this entire device is named after a KB, and it is KB5054156 - the Windows 11 25H2 enablement package. The August cumulative update is not Package_for_KB5121003; it is Package_for_RollupFix~...~26100.9168.1.19, and the servicing stack update is Package_for_ServicingStack_9156. A script that greps the package inventory for KB numbers will conclude the device has no cumulative updates installed. It has four generations of them, in a visible supersedence ladder: 1742 Staged, 8655 and 8875 Superseded, 9168 Installed.

The second is that the RollupFix version reads 26100.9168 while the OS reads 26200.9168. That is the 25H2 enablement-package model showing through: the servicing payload is still 24H2-family, and the release identity comes from the enablement package. If you are diffing package versions against build numbers, expect that offset and do not treat it as drift.

Tip: for "is the current cumulative update on this device", the cheapest reliable check is not a KB lookup at all. It is: does the single Installed Package_for_RollupFix entry carry the same revision as UBR? On this device, 26100.9168.1.19 against UBR = 9168. One comparison, no KB names, no Get-HotFix, and it survives the fact that Microsoft renames and repackages cumulative updates every few years.

Step 7 - Read the agent's own session history

The Windows Update agent keeps its own record of every operation it performed, reachable through the COM surface in wuapi.dll. This is the closest thing to a confession you will get, and it is entirely read-only: create a Microsoft.Update.Session, get an update searcher, call GetTotalHistoryCount(), then QueryHistory().

Windows Update agent session history - full census, read-only
# $s = New-Object -ComObject Microsoft.Update.Session # $r = $s.CreateUpdateSearcher(); $r.GetTotalHistoryCount(); $r.QueryHistory(0,$n) TOTAL HISTORY ENTRIES: 153 ResultCode Count # 2=Succeeded 4=Failed 5=Aborted ---------- ----- 2 99 4 52 5 2 ClientApplicationID Count ------------------- ----- MoUpdateOrchestrator 105 Acquisition;setup-StartProductInstallWithOptionsAsync 41 Device Driver Retrieval Client 5 Acquisition;StoreInstaller-Codex Installer-... 2 # Recent successes, MoUpdateOrchestrator: 8/19/2026 5:37:57 PM | Result=2 | 2026-08 Security Update (KB5121003) (26200.9168) 8/19/2026 3:50:21 PM | Result=2 | 2026-08 .NET Framework Security Update (KB5120708) 8/19/2026 4:02:40 PM | Result=2 | 2026-08 .NET 8.0.30 Security Update for x64 Client (KB5122104) # The failures. Note the retry storm: 8/20/2026 8:21:25 AM | Result=4 | HR=0x80240016 | Samsung Firmware Driver Update 8/20/2026 8:21:32 AM | Result=2 | HR=0x00000000 | Samsung Firmware Driver Update <- 7s later, OK 7/24/2026 4:38:57 AM | Result=4 | HR=0x80240034 | 2026-07 .NET 8.0.29 SU (KB5104032) 7/22/2026 4:05:37 PM | Result=4 | HR=0x80240034 | 2026-07 Security Update (KB5101650) (26200.8875) ... 2/18/2026 11:22:24 AM | Result=4 | HR=0x80240034 | 2026-01 Security Update (KB5074109) (26200.7623) # 44 separate 0x80240034 failures on KB5074109 across 18-24 Feb. Same update. OLDEST ENTRY: 2/18/2026 11:22:24 AM

Fifty-two failures out of 153 entries, on a device whose current state is clean and which any report would call compliant. That is what a normal fleet device looks like on the inside, and it is exactly the information a status column cannot carry.

Three things to take from it. The Samsung driver pair is a genuine transient - failed at 08:21:25, succeeded at 08:21:32 - and 0x80240016 tells you why in plain language. The KB5074109 block is a real 44-attempt download retry storm over six days. And the ClientApplicationID column matters: only 105 of the 153 entries came from MoUpdateOrchestrator. Forty-three came from Store and app acquisition clients. "153 update history entries" is not 153 OS patches, and a script that counts history rows as patch attempts will be wrong by about a third.

Decode the codes rather than pasting them into a search engine. Microsoft's error reference gives the constant names:

CodeConstantDocumented description
0x80240034WU_E_DOWNLOAD_FAILED"Update failed to download." - a transport problem, not an install problem. The retry storm above is a download loop.
0x80240016WU_E_INSTALL_NOT_ALLOWED"Operation tried to install while another installation was in progress or the system was pending a mandatory restart." Self-clearing, as the 7-second retry shows.
0x8024000BWU_E_CALL_CANCELLED"Operation was canceled." Both Aborted entries on this device.
0x80244022WU_E_PT_HTTP_STATUS_SERVICE_UNAVAIL"Same as HTTP status 503 - the service is temporarily overloaded." A service-side condition; nothing on the device to fix.
0x80240438not enumeratedObserved 24 times in real Event 25 entries on this device but not listed in Microsoft's published error reference. Do not assert a meaning for it.

Step 8 - Read the event log last, and know what it cannot tell you

The operational channel is the weakest of the three on-device sources, and it is the one most people start with. Here is why that ordering is wrong.

Microsoft-Windows-WindowsUpdateClient/Operational - full-channel census
RECORDS = 2176 NEWEST = 2026-08-23 10:42:29 OLDEST = 2026-03-12 15:58:54 # the channel wraps at ~5.4 months Event ID census (whole channel): Event 26 : 1815 Event 41 : 335 Event 25 : 24 Event 31 : 2 Event 17 / 18 / 19 / 20 / 21 / 22 / 27 / 43 / 44 : 0 # Every single Event 26 message, normalised by replacing digits with N: Count Message ----- ------- 1815 Windows Update successfully found N updates. # ONE message shape, 1815 times. Real consecutive samples: 2026-08-23 10:42:29 :: Windows Update successfully found 0 updates. 2026-08-23 10:42:22 :: Windows Update successfully found 0 updates. 2026-08-23 10:35:16 :: Windows Update successfully found 1 updates. 2026-08-22 18:32:59 :: Windows Update successfully found 35 updates.

Event 26 is the single most over-trusted line in Windows patching, and this census is why. A fully patched device emits "found 0 updates". A device excluded by a stale version pin emits the identical line. So does a device pointed at the wrong service. Seven seconds apart on this machine it reported 0, and minutes earlier it reported 1, and the day before it reported 35 - because different scan calls target different services and different criteria. The number is a property of the query, not of the device's compliance.

Note also what is absent. Events 19, 20, 43 and 44 have zero occurrences in the entire channel. If your detection logic looks for "Installation Successful" as Event 19, on this device it will never fire - not because installs are failing, but because this channel simply is not emitting that ID. Build detection on what you have measured in your own estate, not on an event-ID list from a blog post.

Channel: Microsoft-Windows-WindowsUpdateClient/Operational. Every message string below was read off the live device.

Event IDMessage (as emitted on 26200.9168)What it tells you
25"Windows Update failed to check for updates with error 0x80240438." / "...with error 0x80244022."A scan failed and the code is in the message. This is the only one of the four that is unambiguously actionable. 24 occurrences here.
26"Windows Update successfully found N updates."A scan completed. Nothing more. Not a compliance signal, not a patch-level signal. 1815 occurrences, one message shape.
31"Windows Update failed to download an update."Download stage failure. Pair it with the matching 0x8024xxxx from the agent's session history to get the reason.
41"An update was downloaded."Content arrived. It does not mean the update installed, and it does not mean a reboot is pending. 335 occurrences.

For install-stage evidence you have to leave this channel. The Setup log carries the servicing side - on this device, Event 2 ("Package <name> was successfully changed to the Staged state") appears 1301 times and Event 1 1197 times, alongside Event 4 ("A reboot is necessary before package <KB> can be changed to the Installed state") eight times. That is where "staged but not installed" becomes visible, and it is a different log to the one everyone opens.

The fix: decide which side is authoritative for which question

The fix is not making the portal agree with the device. It is deciding, once, in writing, which side answers which question - and then only ever comparing like with like.

QuestionAuthoritative sourceHow to read itKnown lie
What is installed right now?The deviceCurrentBuild + UBR from the registry, corroborated by the single Installed Package_for_RollupFix revision.Get-HotFix (4 of 415), OSVersion (revision always .0), ProductName ("Windows 10").
What did the service intend for this device?The reportService State / Service Substate, deployment ring, pause status. Available "for all devices" with no data-collection prerequisite.Reading it as the device's actual state. It is the intention.
What did the device actually do?The report's client columns, or the deviceClient State / Client Substate / Hex Error Code - but only if diagnostic data is configured. Otherwise the agent's session history.Blank client columns read as "nothing happened". They are documented as supplemental.
When did the service last hear from this device?The reportIntune last check-in time, plus the report's own "last refreshed on" stamp.Assuming the two are the same clock. They are not.
Why did it fail?The deviceAgent session history HResult, then Event 25/31, then CBS.log for the servicing stage.Neither side's status column carries a cause.
Is the device capable of reporting?The deviceDiagnostic data value, census task result, upload timestamps, join type, extension footprint.Presence in the report is not evidence of reportability.

Remediate in dependency order

  1. Fix reportability before you fix patching. Diagnostic data at Required or higher, checking for both value names. Add AllowDeviceNameInDiagnosticData = 1 if you want to search by hostname. Confirm the endpoint list is allowed through the proxy - especially *v10c.events.data.microsoft.com, which the census binary needs, and login.live.com, without which "devices aren't visible in the solution". Confirm TLS 1.2 support on the proxy.
  2. Fix the policy source conflict. Autopatch's readiness checks include a documented check for "Windows update policies managed via Group Policy Object (GPO)", and the verdict is blunt: "Windows Autopatch doesn't support Windows update policies managed via GPOs. Windows update must be managed via Microsoft Intune." That is checkable on the device, and on this one it is genuinely split.
  3. Re-run the census, then wait one documented latency window. Not five minutes. Four hours for the data, up to 24 for a readiness verdict.
  4. Only now touch the update stack - and only if the on-device evidence from steps 6 and 7 actually shows a failure.

Step 2 needs its own look, because the lab device is a textbook case. Shared parent keys:

HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate (GPO-style)
HKLM\SOFTWARE\Microsoft\PolicyManager\current\device\Update (MDM / Policy CSP)
ValueMeaningWhat to look for
TargetReleaseVersion (Policies key)Enables the release pin.1 on this device.
TargetReleaseVersionInfo (Policies key)The pinned release.24H2 on this device - while DisplayVersion reads 25H2. The pin has been overtaken.
TargetReleaseVersion (PolicyManager)The MDM-sourced equivalent.Empty, with TargetReleaseVersion_LastWrite = 1. It was written once and is now blank.
FeatureUpdateEnrolled / QualityUpdateEnrolledWhich update workloads the service has taken over.1 and 0 respectively here - feature updates managed, quality updates not. A split like this is exactly how a report can be right about one and silent about the other.
DeferQualityUpdatesPeriodInDaysQuality deferral.7. A device inside its deferral window is not late, and should not be read as non-compliant.
ConfigureDeadlineForQualityUpdatesEnforcement deadline.30. The gap between deferral and deadline is your legitimate "amber" window.
*_WinningProviderWhich management authority won the conflict for that setting.Two different provider GUIDs on this device - the enrolment flags were written by one authority, the deferral and pause settings by another. This is the registry telling you a policy conflict exists.

The pin is the whole disagreement in miniature. Policy says stay on 24H2. The device is on 25H2, having been moved there in February 2026 by KB5054156, the 25H2 enablement package. The pin did not fail; it was simply overtaken, and Intune documents the reason it cannot pull the device back: "Feature update policies don't downgrade devices."

Now consider how that renders in a report. Compliance is evaluated against what the service has offered and what the device reported installing. It is entirely possible for a device to show Up to Date while running a release its own policy says it should not be on. Nothing in the status column is lying. It is just answering a different question to the one you thought you asked.

Tip: make the reconciliation a single artefact rather than a memory exercise. One read-only script per device that emits eight fields - CurrentBuild.UBR, DisplayVersion, the Installed Package_for_RollupFix revision, the diagnostic-data value and which name it was found under, the census task LastRunTime and LastTaskResult, the DiagTrack last-upload timestamp, the count of non-success entries in the agent's session history, and TargetReleaseVersionInfo. Ship it centrally. When someone next says "the portal is wrong", you paste eight lines instead of arguing. Every one of those fields is readable without stopping a service, clearing a cache, or changing a single value.

Proof it worked: a reconciled device, measured

Here is what agreement actually looks like, assembled from the read-only captures above on one real machine.

Reconciliation sheet - one device, all values measured read-only
# ---------- IDENTITY (the comparand) ---------- CurrentBuild.UBR 26200.9168 DisplayVersion 25H2 Installed Package_for_RollupFix 26100.9168.1.19 # revision matches UBR Installed ServicingStack 26100.9156.1.0 # KB5123304 Enablement package KB5054156 (Installed, 2026-02-04) # ---------- REPORTABILITY ---------- Diagnostic data 3 (Optional/Full) via AllowTelemetry_PolicyManager # plain 'AllowTelemetry' NOT present - record the name you found AllowDeviceNameInDiagnosticData <absent> -> device reports WITHOUT a name DiagTrack service Running / Automatic wlidsvc Stopped / Manual # documented as "must also be running" DeviceCensus task 'Device' LASTRUN 10:33:43 RESULT 0 DiagTrack last upload 10:47:30 UTC # capture at 10:48:52 UTC Join type AzureAdJoined=YES + DomainJoined=YES = hybrid (supported) Autopatch CMD Extension ABSENT -> NOT Autopatch-registered # ---------- WHAT THE DEVICE DID ---------- Package inventory 415 total: 199 Superseded / 121 Installed / 95 Staged Get-HotFix 4 rows # CBS-only, by design Agent session history 153 entries: 99 ok / 52 failed / 2 aborted Last MoUpdateOrchestrator OK KB5121003 (26200.9168) @ 2026-08-19 17:37:57 Operational channel 2176 records: 26 x1815, 41 x335, 25 x24, 31 x2 Pending-reboot markers all False (CBS RebootPending, WU RebootRequired, PendingFileRenameOperations) # ---------- KNOWN, LEGITIMATE DISAGREEMENT ---------- Policy TargetReleaseVersionInfo 24H2 vs installed 25H2 # pin overtaken PolicyManager TargetReleaseVersion <empty>, LastWrite=1 FeatureUpdateEnrolled=1 / QualityUpdateEnrolled=0 # split workloads

Read the top block first. The revision in the single Installed Package_for_RollupFix entry is 9168, and UBR is 9168, and the agent's last successful orchestrator entry names KB5121003 (26200.9168). Three independent sources, one number. That is what "the device is patched" looks like when it is proven rather than asserted, and it does not depend on the cloud at all.

Then read the reportability block. Diagnostic data is above the documented minimum, the census ran clean 15 minutes before capture, and telemetry uploaded successfully 82 seconds before capture. This device is capable of reporting and has recently reported. If the report still showed the wrong build, the residual explanation is latency - and the documented window is four hours, not four minutes.

Then read the disagreement block, which is the part worth keeping. Two of those three lines will make a report and a device look like they contradict each other, and neither is a fault:

The discipline is small and it holds. Read the report's staleness before its verdict. Read the device's build from the registry, never from OSVersion. Establish whether the device can report before deciding whether it did. Prefer the package inventory and the agent's own history over the hotfix list and the event log. And when the two sides still disagree after all that, check the clock before you check the update stack - because four hours of latency looks exactly like a broken device, right up until you know it is four hours.

References

Every measured value in this post was captured read-only from a single live Windows 11 Enterprise device on build 26200.9168 (25H2) on 23 August 2026. Nothing was cleared, reset, stopped or repaired to produce them - which is rather the point.

Was this post helpful?
React below — no account needed
Share this post
LinkedIn X / Twitter Reddit Bluesky

More from EndpointWeekly

Windows Update
Proving a hotpatch actually applied: the build number is the…
In August 2026 the hotpatch put Windows 11 25H2 on build 26200.9106 and the LCU put it on…
Windows Update
One read-only PowerShell collector for Windows patching failures…
Test-Path and value checks return confidently wrong patching verdicts on real devices.…
Windows Update
Delivery Optimization says it is peering and your WAN link says…
DO falls back to the CDN silently, with no error and no Event Viewer channel to read.…