v2026.09.25.003: OS end of life by build and edition, with Microsoft's dates - #4
Open
cdburgess75 wants to merge 1 commit into
Open
cdburgess75 wants to merge 1 commit into
cdburgess75 wants to merge 1 commit into
Conversation
…s dates The Assessment Engine looked up os_eol by build number only, one date per build, and several dates were years past Microsoft's: 19045 (Windows 10 22H2) read 2030-10-14 for 2025-10-14; 22621 and 22631 read 2027 and 2028; 26100 read 2029-10-14. One date per build cannot be right either: Home/Pro and Enterprise/Education end on different days, and 14393, 17763, 19044 and 26100 are also LTSB/LTSC or Windows Server. New Get-OsEolDate takes the edition family from Win32_OperatingSystem .Caption (Home/Pro, Enterprise/Education, LTSB/LTSC, IoT LTSC, Server) and holds every date from Microsoft Learn. A caption it cannot place gets a date only when it holds for every edition the machine could be; otherwise 'Unknown', which is not scored (ADR 0009). os_eol keeps its three forms. Windows 10 ESU does not extend end of life (new ADR 0010). Scoring change: more devices take the OS EOL -20 (Windows 10 22H2, Windows 11 22H2, 11 23H2 Home/Pro, older GA releases, Server 23H2). New tests/Test-OsEol.ps1; Test-EngineScope and Test-DeviceIdentity load the new function, and EngineScope adds a same-build Pro/LTSC pair. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR is stacked on #3, which is stacked on #2, which is stacked on #1. Its base is
fix/password-length-unknown, so the diff shows only this change.mainbefore merging it.The bug
The Assessment Engine looked up
os_eolby build number only, with one date per build. That value is printed in customer reports (bf/report.py) and on the device page. Since #2 it also drives the -20.The dates were wrong. These are checked against Microsoft Learn; the sources are below.
Unknown)Bold dates have passed, and the old table showed them as supported. 7601, 10586 and 20348 were already right.
Sources. All are on Microsoft Learn:
learn.microsoft.com/lifecycle/products/<product>, for retired versions, LTSB/LTSC and Server;How the dates were verified.
Changes
Get-OsEolDate -Caption -Build.ConvertTo-BiosDate, testable the same way.$os.Caption, tested in this order:Server;LTSB/LTSC, split byIoT;Pro,HomeorSE;EnterpriseorEducation.os_eolisUnknown, which costs nothing.$osNameand$osBuild. Theos_eolstrings are byte-for-byte the same three forms, so Battlefield needs no change.CONTEXT.mdentry for "OS End of Life" record the ESU decision below.Decision: ESU-covered Windows 10 is end of life (ADR 0010)
A Windows 10 22H2 device reports
END OF LIFE (since 2025-10-14)and takes the -20, whether or not it is enrolled in ESU. This was already how the table treated Windows 7, Server 2008 R2 and Server 2012/R2, which all had ESU. My reasons:slmgr /dlvwith ESU activation IDs for commercial MAK activation.Fleet impact: more devices take the -20
I could not count devices. The Battlefield database is only reachable on the server, and I did not use its credentials from here. Below is who flips, and when, followed by a read-only query that gives the per-device answer. The query is checked against the PowerShell; see Tests.
From the first run of this version (the old table said "Supported until"):
Unknownand never scored.Then by calendar, with no new release:
Relief compared with the old table. On 2026-10-13 the old table would have ended every 19044 device. Enterprise LTSC 2021 now runs to 2027-01-12, and IoT LTSC 2021 to 2032-01-13.
Everything else only changes its date. This includes Server 2016/2019/2022/2025 and all builds that were already end of life.
The -20 is a measurement correction. Nothing changed on the endpoints, but the drop will show on the dashboard trend line, in the D/F attention flag and in any customer scorecard. It lands in the same place as #2's drop, so explain both before a scorecard goes out. As in #2,
bf/alerts.pynever readsos_eolor the score, so no new alerts or emails.The impact query (read-only)
os_eolunder the old table and the new one. It uses the storedosfield, which is"<Caption> (Build <n>)".changecolumn readsnewly EOL (-20),no longer EOL (+20),date changes, verdict sameorunchanged.score_beforeis the stack without this PR andscore_afteris with it, each with its grade. v2026.09.25.002: an unknown password length is not scored or reported as 0 #3's password change is not modeled; it can only raise scores.as_ofdefaults to today. Run it once with the day you expect to ship, and once withdate '2026-10-14'to see the 24H2 wave.familycolumn. Every 14393/17763/19044/26100 device should have the family you know it to be.Get-OsEolDateexpects.SELECT change, family, build, count(*) FROM (...) q GROUP BY 1, 2, 3 ORDER BY 1, 2, 3.SQL (tables generated from
ShellKnight.ps1)Tests
New
tests/Test-OsEol.ps1, in the style ofTest-EngineScope.ps1:os_eollines and the -20 rule verbatim, under StrictMode 2, with the clock pinned either side of 2026-10-13 and 2026-11-10. It asserts:os_eolstring;END OF LIFEappears exactly when the -20 applies (bf/report.py's test);Changes to #2's tests:
Test-EngineScope.ps1:Test-EngineScope.ps1andTest-DeviceIdentity.ps1load the new function. Without it the engine aborts, andDeviceIdentitycaught exactly that before I added it.Results:
Test-OsEolstops at once, becauseGet-OsEolDatedoesn't exist there.Promatched as a substring (so "Professionnel" becomes Pro)The impact query was executed, not just written.
schema.sqland all migrations.as_ofdates. That gave 6,642 verdicts, compared against the real PowerShell: this branch'sGet-OsEolDateand engine lines, and v2026.09.25.002: an unknown password length is not scored or reported as 0 #3's head's old table.Before merging: one real run
Run this in an elevated Windows PowerShell 5.1. The best box is Windows 10 22H2 Pro or Windows 11 23H2 Pro, which flips. If the fleet has an LTSC or Server 2016/2019 box, run it there as well, to confirm its caption places it correctly. RLG-JANE-PC or RLG-DCFS also cover #1.
When it finishes, check the newest
C:\ProgramData\ShellKnight\Logs\ShellKnight_*.log:Assessment Engine skipped,Device identity skippedorPassword policy skippedline.OSandOS EOLagree with the table above for that edition. For example, Windows 10 Pro (Build 19045) showsEND OF LIFE (since 2025-10-14).SECURITY GRADEincludes the -20 exactly whenOS EOLsays END OF LIFE, and anOS EOL:warning line appears above it.C:\ProgramData\ShellKnight\JSON\*.json,os_eolmatches the log andversionisv2026.09.25.003.Battlefield push OK - run_id: <n>.Then remove the test task with
schtasks /delete /tn SK-Test /f. UpdateLATEST_SK_VERSIONinbattlefield.envwhen this ships.Left alone (follow-ups)
templates/machine.htmlshowsOS end of life {{ rep.os_eol }}wheneveros_eolis set, includingSupported until ...andUnknown.fleet.htmlprints(EOL Supported until ...)the same way. The pill should key offEND OF LIFE, asbf/report.pydoes. This is outside this repo.OperatingSystemSKUinstead of the caption. It is documented and not localized. It is the next step if non-English devices appear; the impact query'sfamilycolumn will show them.os_eolisUnknownand there is no penalty.🤖 Generated with Claude Code