HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links Subscribe free
← Back to Blog
Windows Update Windows UpdateSupersedenceDISMComponent StorePatch ComplianceCBSPowerShellWindows 11

The KB installed fine and is still being offered: supersedence, and why 'applicable' is a separate field

IA
Imran Awan
23 August 2026

KB5121003 installed on a Wednesday evening. The device took its reboot. On Thursday morning Windows Update offered KB5121003 again.

Nothing failed. There is no error code to look up. The history says the installation succeeded, the build number moved, and the offer is still sitting there — while a compliance dashboard reports the same device as missing the same KB.

This is the failure mode with no error message, which is why it wastes more hours than most of the ones that have one. And almost every response starts by destroying the evidence.

The short version

"Installed" and "applicable" are two different fields, and Microsoft documents them separately. A package version in the component store carries one of eight DismPackageFeatureState values — Installed, Superseded, Staged and five more — while an independent boolean called Applicable says whether it applies to the image at all. On the machine I measured the store held 199 Superseded, 121 Installed and 95 Staged packages, and a Superseded cumulative update reported Applicable : True. Get-HotFix returned four rows. The update agent never consults your list of installed KBs: it evaluates an IsInstalled applicability rule shipped in the update's own metadata. And the KB number is not in the package name — on this 25H2 device, build 26200.9168, zero of 415 packages carry 26200 and 411 carry 26100.

The problem: the update succeeded and the offer came back

The symptom arrives in four costumes, and they are not the same problem.

The first is the honest one. Settings shows the update under Update history as installed and simultaneously shows it as available. Both statements are true at the same moment, and understanding why is most of the work.

The second is a reporting disagreement: your compliance tool says the KB is missing on a device whose build already contains that KB's fixes. Nothing is wrong with the device; something is wrong with the question the tool asked.

The third is a KB superseded months ago, still appearing as required in a WSUS or Configuration Manager view — still in the catalog because supersedence is a lifecycle stage, not a deletion.

The fourth is the genuinely broken one: an update that installs, gets offered, installs again, and loops. That one is real, and you cannot distinguish it from the other three without reading the store.

The four reflexes, and what each one costs you

Search for this symptom and you will be told to do one of four things immediately. Every one removes information you have not read yet.

Reinstall the MSU from the catalog. This tells you nothing about why the offer persisted, and if the reason was a pending reboot you have queued a second copy of work that was already staged.

Uninstall it and put it back. On a modern cumulative update this is not available in the form people imagine, and Microsoft's own wording on that is below.

Delete SoftwareDistribution. That datastore is the record of what the agent evaluated and when. Deleting it forces a full scan, which re-offers everything the rules say is missing — including the exact KB you are investigating. You have removed the evidence and reproduced the symptom.

Run component store cleanup to "get rid of the superseded packages." This is the worst one.

Watch out: DISM /Cleanup-Image /StartComponentCleanup /ResetBase is documented to remove all superseded versions of every component in the store, and to make the updates currently installed permanently un-uninstallable. Those superseded rows are the supersedence chain — the primary evidence for this investigation. Running /ResetBase mid-diagnosis deletes the history you were about to read and forecloses the rollback you might need. It is a maintenance operation, not a troubleshooting step.

Before touching anything, four questions need answers, and each one has a different source of truth:

  1. What build is this device on, and which release does that build belong to?
  2. Which package versions exist in the store, and in which state is each one?
  3. Does the servicing stack consider the package applicable — a separate field from its state?
  4. What did the agent record, and does its timeline agree with the servicing stack's?

Why it happens: three questions that look like one

"Is this KB installed?" feels like one question with a yes or no answer. It is at least three questions, answered by three subsystems that store their answers in three places, in three different vocabularies.

Question one: installed is a package state, not a fact about a KB

The component store does not track KBs. It tracks package identities, and each identity carries a state. Microsoft enumerates exactly eight in the DISM API.

DismPackageFeatureStateValueDocumented meaning
DismStateNotPresent0The package or feature is not present.
DismStateUninstallPending1An uninstall process for the package or feature is pending. Additional processes are pending and must be completed before the package or feature is successfully uninstalled.
DismStateStaged2The package or feature is staged.
DismStateRemoved3Metadata about the package or feature has been added to the system, but the package or feature is not present.
DismStateInstalled4The package or feature is installed.
DismStateInstallPending5The install process for the package or feature is pending. Additional processes are pending and must be completed before the package or feature is successfully installed.
DismStateSuperseded6The package or feature has been superseded by a more recent package or feature.
DismStatePartiallyInstalled7The package or feature is partially installed. Some parts of the package or feature have not been installed.

Read what Staged and Superseded actually say. Staged gets one sentence that restates its own name — the documentation genuinely does not explain it, which is why practitioners guess. Superseded says only that a newer version exists. Neither says the package is broken, absent, unneeded, or safe to remove.

Three of the eight states account for the whole inventory on the machine I measured — Windows 11 Enterprise, DisplayVersion 25H2, build 26200.9168, read read-only in one pass:

Windows PowerShell — package state census (real output)
# Read-only. Groups the whole component store inventory by state. PS> Get-WindowsPackage -Online | Group-Object PackageState | Select-Object Name, Count | Format-Table -AutoSize Name Count ---- ----- Superseded 199 Installed 121 Staged 95 # 415 package versions tracked. Now the same device, asked the way # most compliance tooling asks: PS> (Get-HotFix).Count 4

Four hundred and fifteen against four, and neither tool is broken. Win32_QuickFixEngineering, which is what Get-HotFix reads, states its own scope: it "returns only the updates supplied by Component Based Servicing (CBS)". It is a history list with no state column, so it cannot tell you something is superseded — it has no concept of supersedence.

Context: a package identity is family~publisher-key~architecture~language~version. Supersedence applies per identity, so a single component can hold many versions at once — and the architecture and language segments multiply them. One Feature on Demand on this device held eighteen rows: four architecture and language variants across four build versions, plus two single-version variants. When somebody says "199 superseded packages" they are usually imagining 199 old cumulative updates. It is nothing of the sort.

Broken down by release type, the 199 resolve into something far less dramatic:

ReleaseTypeSupersededInstalledStaged
OnDemandPack (Features on Demand)17610888
FeaturePack1442
LanguagePack444
Update320
SecurityUpdate221
Foundation010

Eighty-eight percent of the superseded rows are Feature on Demand payloads, whose metadata every cumulative update revises. Only two superseded rows in the whole store are Windows cumulative updates; the three Update rows are .NET Framework rollups. The scary number was churn in a part of the store nobody was worried about.

One family shows the mechanism at full depth: Microsoft-Windows-FodMetadataServicing-Desktop-Metadata-Package held fourteen Superseded, one Staged and one Installed — sixteen versions of one component, one per servicing event since the image was built. That is a healthy chain.

Question two: superseded does not mean gone, and it does not mean unneeded

On the device, supersedence is a state. On the management plane it is a lifecycle stage with a timer attached, and the two are routinely confused.

Configuration Manager's supersedence rules decide when a superseded update expires — a separate event from being superseded. Microsoft's note on the setting is precise and easy to misread: the "Months to wait before a superseded update is expired" value "is based on the creation date of the superseding update", not on the date the older update was published. Until that timer elapses and the update is declined, it stays in the catalog the client evaluates. And Microsoft's justification for declining them is performance, not correctness: "Declining updates that Configuration Manager marks as superseded further minimizes the catalogs and improves performance."

So a superseded update reported as required is not automatically an error: either the newer update is not approved, the older one has not expired, or the client still evaluates it as needed. Three root causes, one symptom.

Question three: applicable is a separate documented field

When DISM returns detailed information about a package it fills a DismPackageInfo structure, and that structure carries both a state and an applicability flag as independent members:

DismPackageInfo.PackageState

"A DismPackageFeatureState enumeration value" — one of the eight states above.

DismPackageInfo.Applicable

"TRUE if the package is applicable to the image, otherwise FALSE."

Two fields, same object, no stated relationship between them. And on the measured device they genuinely disagree with each other's implications — the July cumulative update, sitting in Superseded, reports Applicable : True. So does the August one that superseded it. Being superseded did not make the older package inapplicable; it made it older. "Is this installed?" and "does this apply?" have never been the same query, and a script that answers one while claiming to have answered the other is wrong by construction.

Gotcha: the standard advice for this symptom is to set the Windows Update Agent's IncludePotentiallySupersededUpdates property so superseded updates appear in search results. Read the reference page before you write that code. Microsoft's note is one line: this property "is no longer supported in Windows 10, version 1709 (build 16299), and later OS releases." On a 26200 build the lever does not exist. Advice written for Windows 7 is still being copied into 2026 runbooks.

How the agent actually decides: a rule, not a lookup

The Windows Update Agent's default search criteria is exactly this, and it is documented as the default:

WUA default search criteria (IUpdateSearcher::Search)( IsInstalled = 0 and IsHidden = 0 )

It looks like a database query against a list of installed KBs. It is not. Microsoft's own terminology table for the Windows Update scan gives the game away in two entries. A detector update is "a special update that contains IsInstalled applicability rule only and no payload", used for prerequisite evaluation. A category update is "a special detectoid that has an IsInstalled rule that is always true".

IsInstalled is a rule, shipped inside the update's metadata, evaluated against the live device. It can test file versions, registry values, installed packages, or anything else the publisher encoded. The corresponding property on the update object is documented with a careful qualifier that most people skip: it "indicates whether the update is installed on a computer when the search is performed".

That single design decision explains the whole symptom. An update is offered when its rule evaluates false. If the rule keys on a file version that a rollback reverted, on a component that a particular language or architecture child never received, or on a state the device only reaches after a restart, then the KB is installed according to your inventory and not installed according to the rule. Both answers are correct, to different questions.

Applicability also decides what work is even planned: "When an update is applicable, the 'Arbiter' and metadata are downloaded... the Arbiter will gather details from the device, and compare that with the downloaded metadata to create an 'action list'." That list tells "the installation agent (such as CBS or Setup)" what to do. Applicability comes first; the servicing stack only sees its consequences.

One KB is several packages, and the KB number is almost nowhere

The device's August update is a combined package. The KB article says so in Microsoft's standard wording — "Microsoft combines the latest servicing stack update (SSU) for your operating system with the latest cumulative update (LCU)" — and names its passenger explicitly: KB5121003 "Includes KB5123304 (Build 26100.9156), which improves the reliability of the Windows update installation process." That build matched the servicing stack the device had actually loaded, 10.0.26100.9156, exactly.

One KB number, two packages, two install times, two states to check. Mapping the store's cumulative-update family back to KB numbers gave this:

Package versionStateDescription fieldInstallClient
Package_for_RollupFix~...~26100.1742.1.10StagedFix for KB5043080DISM Package Manager Provider
Package_for_RollupFix~...~26100.8655.1.20SupersededFix for KB5094126UpdateAgentLCU
Package_for_RollupFix~...~26100.8875.1.28SupersededFix for KB5101650UpdateAgentLCU
Package_for_RollupFix~...~26100.9168.1.19InstalledFix for KB5121003UpdateAgentLCU
Package_for_ServicingStack_9156~...~26100.9156.1.0InstalledFix for ServicingStack 10.0.26100.9156UpdateAgentLCU

Three things in that table matter more than they look. The KB number lives in the Description field and in a SupportInformation URL — never in the package name. Grep package names for a KB number and you will find nothing, on a device where that KB is definitively installed.

The servicing stack package does not carry a KB number at all; its description reads "Fix for ServicingStack 10.0.26100.9156". The only place the string KB5123304 appears on this device is the Setup event log.

And the oldest entry, Staged, was installed by "DISM Package Manager Provider" with no install time recorded — it went into the image offline at build time, which is exactly why it sits in Staged rather than Superseded. That is KB5043080, the base cumulative update for the original 24H2 image.

26100.1742
Staged
26100.8655
Superseded
26100.8875
Superseded
26100.9168
Installed

Removal is where the "just reinstall it" reflex hits a documented wall. The standard cumulative-update article says removing the LCU requires "the DISM/Remove-Package command line option"; that "Running Windows Update Standalone Installer (wusa.exe) with the /uninstall switch on the combined package will not work because the combined package contains the SSU"; and, flatly, "You cannot remove the SSU from the system after installation." The uninstall-and-reinstall cycle people reach for does not exist for a modern LCU, and combined delivery has been the norm since February 2021 on Windows 10 version 2004 and later.

The UBR trap: same UBR, different build

Now the part that breaks compliance scripts silently. KB5121003's own title is "August 11, 2026—KB5121003 (OS Builds 26200.9168 and 26100.9168)". One KB, one UBR, two builds: 26200.9168 on 25H2 and 26100.9168 on 24H2. Not a one-off: KB5094126 shipped as 26200.8655 and 26100.8655, KB5101650 as 26200.8875 and 26100.8875 — three consecutive months, same pattern.

So a compliance rule of UBR -ge 9168 without also pinning CurrentBuild passes a 24H2 device against a 25H2 baseline. Both report 9168. They are different operating system releases with different support end dates, and only the build number distinguishes them.

The reason is that 24H2 and 25H2 share a servicing branch; 25H2 arrives as an enablement package that switches on code already present. On the measured device that package is still in the store as Package_for_KB5054156~...~26100.6717.1.4, Installed, applied on 4 February 2026 — and even the package that made this device 25H2 is versioned 26100.

Which gives the cleanest measurement in this article. Of 415 package versions on a device whose CurrentBuild is 26200: zero contain 26200, and 411 contain 26100.

Watch out: the registry corroborates it and then adds a second trap. BuildLabEx on this 26200 device reads 26100.1.amd64fre.ge_release.240331-1435 — a 24H2 lab string, forensic proof the machine was installed as 24H2 and moved up. ProductName reads "Windows 10 Enterprise" on Windows 11, and ReleaseId is frozen at 2009. Any detection keyed on ProductName, ReleaseId or BuildLabEx is reading a value Microsoft stopped maintaining. Use CurrentBuild plus UBR, together, with DisplayVersion for the release name.

The binaries that answer each question

Separate stacks answer these questions, versioned independently of each other and of the OS. Every version below was read off the measured device.

BinaryRoleLocation and measured version
wuapi.dll"Windows Update Client API" — the COM surface that exposes IUpdateSearcher, IUpdate and the search criteria. Every applicability answer comes through here.C:\Windows\System32, version 1509.2607.1012.0
wuaueng.dll"Windows Update Agent" — the engine itself, loaded as the ServiceDll for wuauserv. Evaluates the applicability rules.C:\Windows\System32, version 1509.2607.1012.0
MoUsoCoreWorker.exe"MoUSO Core Worker Process" — the orchestrator worker. Not in System32; it ships in the Unified Update Stack, serviced separately from the OS build.C:\Windows\UUS\amd64, version 1509.2607.1012.0
DismApi.dll"DISM API Framework" — source of the PackageState and Applicable values. The DISM enumerations are documented against this DLL.C:\Windows\System32, version 10.0.26100.8457
TrustedInstaller.exe"Windows Modules Installer" — the service that performs the state transitions, with CbsApi.dll ("Component Based Servicing API DLL") beside it.C:\Windows\servicing, version 10.0.26100.7019
CbsCore.dllThe servicing stack core, loaded by name in CBS.log. Not in System32 — it lives in the versioned WinSxS servicing-stack component directory, alongside TiWorker.exe.C:\Windows\WinSxS\amd64_microsoft-windows-servicingstack-*_10.0.26100.9156_*

Note the four version families on one machine: the agent at 1509.2607.1012.0, DISM at 10.0.26100.8457, the servicing stack at 10.0.26100.9156, the OS at 10.0.26200.9168. "Is the device up to date" has no single answer here either.

How to verify: read state, applicability and history separately

Seven steps, in this order, all read-only. Do not skip to step four because you already know the build.

Step 1: establish the build identity, not the KB

Everything downstream depends on knowing which release you are on, and all the values live under one key.

Parent key for every value in the table belowHKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
ValueMeaningWhat to look for
CurrentBuildThe OS build. 26100 is 24H2, 26200 is 25H2.Never compare UBR without this. It is the only value that separates the two releases.
UBRUpdate Build Revision — the fourth part of the version, moved by the monthly cumulative update.Identical across 24H2 and 25H2 for the same KB. On its own it proves nothing.
DisplayVersionThe marketing release name, e.g. 25H2.The value to report to humans. Present from Windows 10 21H2 onwards.
ProductNameLegacy product string.Reads "Windows 10 Enterprise" on Windows 11. Anything keying on this for OS detection silently fails.
ReleaseIdLegacy release identifier.Frozen at 2009. Useless for version detection; do not read it.
BuildLabExThe lab string of the build that laid the image down.Forensically useful, currently misleading: it stays at the original install branch after an enablement-package upgrade.
Windows PowerShell — build identity (real output)
PS> Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' | Select-Object CurrentBuild, UBR, DisplayVersion, ProductName, BuildLabEx CurrentBuild : 26200 UBR : 9168 DisplayVersion : 25H2 ProductName : Windows 10 Enterprise BuildLabEx : 26100.1.amd64fre.ge_release.240331-1435 # 26200.9168 = 25H2 with the August 2026 LCU. Note ProductName says # "Windows 10" and BuildLabEx says 26100 - both are correct and both # will break a script that trusts them.

Step 2: census the store by state before looking at any single package

The census tells you whether this is a healthy store with normal churn or something genuinely unusual. Cross-tabulate against release type — that is what turns a frightening number into a boring one.

Windows PowerShell — state by release type (real output, truncated)
PS> Get-WindowsPackage -Online | Group-Object ReleaseType, PackageState | Sort-Object Count -Descending | Select-Object Name, Count Name Count ---- ----- OnDemandPack, Superseded 176 OnDemandPack, Installed 108 OnDemandPack, Staged 88 FeaturePack, Superseded 14 FeaturePack, Installed 4 LanguagePack, Staged 4 Update, Superseded 3 SecurityUpdate, Superseded 2 SecurityUpdate, Installed 2 Foundation, Installed 1 # 176 of the 199 superseded rows are Features on Demand. Only two are # cumulative updates. The alarming total was FoD metadata churn.

Step 3: read the chain for the family you actually care about

Filter to the cumulative-update family and the servicing stack. Five rows give the OS's whole servicing history.

Windows PowerShell — the supersedence chain (real output)
PS> Get-WindowsPackage -Online | Where-Object { $_.PackageName -match 'RollupFix|ServicingStack' } | Sort-Object PackageName | Format-Table PackageState, PackageName -AutoSize PackageState PackageName ------------ ----------- 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 # Not one 26200 anywhere, on a 26200.9168 device. Searching these # names for "26200" or for a KB number returns nothing.

Step 4: ask the package whether it is applicable

Passing -PackageName switches DISM to the detailed object, where Applicable, Description, InstallClient and SupportInformation appear. This step answers the question in the title.

Windows PowerShell — installed vs superseded, both applicable (real output)
PS> Get-WindowsPackage -Online -PackageName ` 'Package_for_RollupFix~31bf3856ad364e35~amd64~~26100.9168.1.19' Applicable : True Description : Fix for KB5121003 InstallClient : UpdateAgentLCU InstallPackageName : Package_for_RollupFix~...~26100.9168.1.19.mum RestartRequired : Possible SupportInformation : https://support.microsoft.com/help/5121003 PackageState : Installed ReleaseType : SecurityUpdate InstallTime : 8/20/2026 8:12:53 AM # Now the one it superseded, last month's cumulative update: PS> Get-WindowsPackage -Online -PackageName ` 'Package_for_RollupFix~31bf3856ad364e35~amd64~~26100.8875.1.28' | Select-Object PackageState, Applicable, Description, InstallTime PackageState : Superseded Applicable : True Description : Fix for KB5101650 InstallTime : 7/24/2026 4:31:18 AM # Superseded AND applicable. Two independent fields, exactly as the # DismPackageInfo structure documents them.

Two other fields matter. RestartRequired : Possible is the documented DismRestartPossible value — "this package or feature might require a restart", neither a yes nor a no. And InstallClient names who did the work.

Step 5: ask the servicing stack for the state transitions

The Setup event log records every state change by name with the KB number, and it is the only place on the device that names the servicing stack update. Microsoft publishes no event-ID catalog for this provider, so the table below is built from measured entries.

Event log channel for every row belowSetup   (provider: Microsoft-Windows-Servicing)
Event IDMessage observedWhat it tells you
1"Initiating changes for package KB5121003. Current state is Staged. Target state is Installed. Client id: UpdateAgentLCU."The intended transition, both endpoints, and which client asked. The single most useful line in the log.
2"Package KB5121003 was successfully changed to the Installed state."The transition completed. Pair it with the matching Event 1 — an Event 1 with no Event 2 is an incomplete transition.
4"A reboot is necessary before package KB5121003 can be changed to the Installed state."The gate. Until the restart happens the package is not Installed, whatever the update history says.
1013"Initiating system store corruption detection and repair. Detection Only: 1, Automatically Triggered: 0."A store scan started. Detection Only: 1 distinguishes /ScanHealth from /RestoreHealth.
1014"System store corruption detection and repair has completed. Status: 0x0, Total instances of corruption found: 0..."The result. Pairs with 1013; the counts are the verdict, not the presence of the event.
Windows PowerShell — Setup log, the KB pair end to end (real output)
PS> Get-WinEvent -LogName Setup -MaxEvents 400 | Where-Object { $_.Message -match '5121003|5123304' } | Sort-Object TimeCreated 8/19/2026 4:54:26 PM Id=1 Initiating changes for package KB5123304. Current state is Absent. Target state is Staged. Client id: UpdateAgentLCU. 8/19/2026 4:54:55 PM Id=2 Package KB5123304 was successfully changed to the Staged state. 8/19/2026 6:25:22 PM Id=1 Initiating changes for package KB5123304. Current state is Staged. Target state is Installed. 8/19/2026 6:25:28 PM Id=2 Package KB5123304 was successfully changed to the Installed state. 8/19/2026 6:26:05 PM Id=1 Initiating changes for package KB5121003. Current state is Absent. Target state is Staged. 8/19/2026 6:30:53 PM Id=2 Package KB5121003 was successfully changed to the Staged state. 8/19/2026 6:31:09 PM Id=1 Initiating changes for package KB5121003. Current state is Staged. Target state is Installed. 8/19/2026 6:37:47 PM Id=4 A reboot is necessary before package KB5121003 can be changed to the Installed state. 8/20/2026 9:14:13 AM Id=2 Package KB5121003 was successfully changed to the Installed state. # Read the gap: 6:37 PM to 9:14 AM. For fourteen and a half hours the # package was Staged, not Installed. Any scan in that window evaluates # against a device where the LCU is not installed - and offers it again.

There is the answer, in the log, with timestamps. The servicing stack processed the SSU first through its own Absent to Staged to Installed sequence, then the LCU — exactly what combined-package delivery is documented to do. The LCU then hit the reboot gate and sat in Staged overnight.

Step 6: ask the agent what it recorded

QueryHistory reads the local datastore and triggers no scan, so it is safe to run first. The integers are documented enumerations: ResultCode 2 is orcSucceeded, 4 is orcFailed; Operation 1 is installation.

Windows PowerShell — WUA history, no network scan (real output)
PS> $s = New-Object -ComObject Microsoft.Update.Session PS> $se = $s.CreateUpdateSearcher() PS> $se.GetTotalHistoryCount() 153 PS> $se.QueryHistory(0,5) | Format-Table Date, ResultCode, Operation, Title 8/20/2026 8:21:32 AM 2 1 Samsung Firmware Driver Update (1.0.0.2) 8/20/2026 8:21:25 AM 4 1 Samsung Firmware Driver Update (1.0.0.2) 8/19/2026 5:37:57 PM 2 1 2026-08 Security Update (KB5121003) (26200.9168) 8/19/2026 4:02:40 PM 2 1 2026-08 .NET 8.0.30 Security Update for x64 Client 8/19/2026 3:51:44 PM 2 1 PowerShell v7.6.5 (x64) # Two things. The same driver appears twice, seven seconds apart: failed # then succeeded. That is what a genuine re-offer looks like in history. # And the title says 26200.9168 while the package name says 26100.9168.

Step 7: land on a root cause

What you observedReadingAction
Package Installed, Applicable : True, build at or above the floor, no Event 4 outstandingNothing is wrong. The offer you saw was pre-reboot, or a stale scan result.Re-scan and confirm the offer is gone. Change nothing.
Package Staged, an Event 1 targeting Installed, an Event 4 present, no matching Event 2The transition is gated on a restart. The KB is legitimately not installed yet.Reboot. Do not reinstall — the payload is already staged.
Package Installed and the same KB still offered after a clean scanThe offer is probably a different revision or a different child of the bundle, not the same package.Compare the update's revision and title, not its KB number.
An older package is Superseded and still reported as required by a management toolDevice-side supersedence and server-side expiry are different timers.Fix the supersedence and approval rules on the server. The device is fine.
Build at the floor but the report says the KB is missingThe compliance rule compared UBR without pinning CurrentBuild, or matched on KB presence.Fix the rule. Compare the build and UBR pair.
Repeated Event 1 with no Event 2, or PartiallyInstalledA genuine servicing failure. Now you have a real fault to chase.Move to CBS.log for that session and work the actual error.

The fix: pin the build, not the KB

In four of the six rows above, the fix is not on the device. That is the honest conclusion of this diagnostic, and why the diagnostic comes first.

The highest-value change is to stop asking whether a KB is present and start asking whether the build is at or above a floor. A cumulative update is cumulative: if the build is at the floor, the fixes are in, whatever your KB list says.

Tip: express the floor as a tuple and compare it as one. For August 2026 that is (26200, 9168) for 25H2 and (26100, 9168) for 24H2, read from CurrentBuild and UBR. A rule that tests UBR -ge 9168 alone passes a 24H2 device against a 25H2 baseline, because both report 9168. A rule that tests only CurrentBuild -eq 26200 flags every correctly-pinned 24H2 device forever. Use DisplayVersion to pick which floor applies, then compare both numbers.

Second: when a reboot is pending, reboot. Event 4 is not a warning, it is an instruction — the package cannot reach Installed without it. Reinstalling the MSU at that point queues duplicate work and buys you a longer restart.

Third: never run wusa /uninstall against a modern cumulative update. As quoted above, it "will not work because the combined package contains the SSU", removal requires DISM /Remove-Package, and the SSU cannot be removed at all. That is a one-way door.

Fourth: leave the superseded rows alone while investigating — they are the chain. Reclaiming the store is a separate scheduled decision, and /ResetBase permanently removes your ability to uninstall the updates currently installed.

Fifth, for management-plane cases: fix the supersedence and approval rules on the server, not the client — and remember the expiry timer counts from the creation date of the superseding update.

Proof it worked: one KB pair through every lens

Everything below was measured on the same device in one sitting. The point of assembling it is that the sources disagree in ways that are entirely explainable once you know what each one records.

SourceWhat it says about KB5121003
Registry build identityCurrentBuild 26200, UBR 9168, DisplayVersion 25H2 — the August LCU is in.
Component store, basic objectPackage_for_RollupFix~...~26100.9168.1.19, state Installed, release type SecurityUpdate. No KB number in the name.
Component store, detailed objectApplicable : True, Description : Fix for KB5121003, InstallClient : UpdateAgentLCU, InstallTime : 8/20/2026 8:12:53 AM.
Setup event logAbsent to Staged at 6:26 PM on the 19th, reboot gate at 6:37 PM, Installed at 9:14:13 AM on the 20th.
WUA historyOne row, ResultCode 2, dated 8/19/2026 5:37:57 PM, titled "2026-08 Security Update (KB5121003) (26200.9168)".
Get-HotFixOne row, KB5121003, Security Update, 8/20/2026 12:00:00 AM — date only, no time, no state.

Now line up the clocks, where the "installed" claim comes apart. The WUA history recorded success for KB5121003 at 5:37:57 PM. The Setup log recorded "a reboot is necessary before package KB5121003 can be changed to the Installed state" at 6:37:47 PM. The device sits at UTC+1 in August. Correct for the offset and those are the same moment, ten seconds apart.

The update agent stamped "installation succeeded" at the instant the servicing stack said the package could not reach the Installed state yet. Both are accurate, recording different events: the agent that its work was handed over and accepted, the stack that the transition was not finished. Every "installed but still offered" report I have chased lives in that gap.

The same offset shows up in DISM, and there it contradicts the documentation. The servicing stack update's InstallTime reads 5:25:28 PM; the Setup log records it reaching the Installed state at 6:25:28 PM. Identical seconds, exactly one hour apart, on a UTC+1 device. Microsoft's reference for that field says "this field is local time, based on the servicing host computer." Measured, it behaves as UTC. The cumulative update shows the same pattern: InstallTime 8:12:53 AM against a Setup event at 9:14:13 AM.

Context: if you correlate DISM install times against event-log timestamps without normalising, every package will appear to have been installed an hour before the servicing stack touched it, and in winter it will appear correct. That is a bug that shows up twice a year and gets blamed on the update. Normalise to UTC on both sides before comparing anything.

Finally, the Get-HotFix row for KB5121003 reads 8/20/2026 12:00:00 AM. The real transition was 9:14:13 AM. No time component, no state column — which is why four rows coexist with 415 packages on one machine, and why it can never answer an applicability question.

None of these sources is lying. They answer different questions: which build am I on, which package versions exist and in what state, does this package apply, what did the agent do, which CBS updates have history entries. The failure was only ever treating one answer as all five.

References

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

More from EndpointWeekly

Windows Update
Get-HotFix is lying to your patch report: it only sees CBS…
Get-HotFix returned 4 rows on a device tracking 415 servicing packages. Microsoft…
Windows Update
Error 0x800f081f is not a verdict: find the missing payload in…
CBS_E_SOURCE_MISSING means servicing wanted a payload and could not find it - not that…
Windows Update
The Windows patching triage decision tree: which log, which key,…
Route each patching symptom to the one evidence source that answers it. Then learn the…