Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
335 commits
Select commit Hold shift + click to select a range
1cf6ebe
v1.8.4: Run the Locations sidebar check outside demo mode
SteveTheKiller Oct 21, 2026
d4abc32
v1.8.4: Translate the Locations sidebar and Saved scans strings
SteveTheKiller Oct 21, 2026
450c359
v1.8.4: Restore dialog icons, classic bevels and compact fields
SteveTheKiller Oct 21, 2026
6167199
v1.8.4: Complete the 98SE input bevels
SteveTheKiller Oct 21, 2026
3213105
v1.8.4: Keep pasted text inside the bracketed-paste frame
SteveTheKiller Oct 21, 2026
608d996
v1.8.4: Resolve the KillerFamily.Controls namespace in the WPF test h…
SteveTheKiller Oct 21, 2026
45c7c23
v1.8.4: Coalesce topology and services redraws while a scan streams r…
SteveTheKiller Oct 21, 2026
b7b77a9
v1.8.4: Repair three UI checks that normal CI never ran
SteveTheKiller Oct 21, 2026
17205dd
v1.8.4: Make topology devices reachable from the keyboard and screen …
SteveTheKiller Oct 21, 2026
980d239
v1.8.4: Run every deterministic focused suite and the module contract…
SteveTheKiller Oct 21, 2026
da89db8
v1.8.4: Add /skip and -Skip to the command line and PowerShell module
SteveTheKiller Oct 21, 2026
5851e4a
v1.8.4: Keep full MAC addresses visible in the device table
SteveTheKiller Oct 21, 2026
fb5a3e7
v1.8.4: Give device name lookups a time budget and a bound
SteveTheKiller Oct 21, 2026
bbc8c3a
v1.8.4: Write terminal input off the UI thread
SteveTheKiller Oct 21, 2026
6760759
v1.8.4: Follow the app language in column headers and HTML reports
SteveTheKiller Oct 21, 2026
40473a9
v1.8.4: Clear a nullable warning in the Location checks
SteveTheKiller Oct 21, 2026
25254c0
v1.8.4: Let the engine bind a scan to one adapter for on-link targets
SteveTheKiller Oct 21, 2026
3010fe2
v1.8.4: Choose the scan adapter in Scan settings and keep it with sav…
SteveTheKiller Oct 21, 2026
827b70c
v1.8.4: Add /adapter and -Adapter to the command line and PowerShell …
SteveTheKiller Oct 21, 2026
4bb7c09
v1.8.4: Translate the network adapter strings and record binding in t…
SteveTheKiller Oct 21, 2026
92b8ce0
v1.8.4: Let a bound scan reach targets Windows routes through its ada…
SteveTheKiller Oct 21, 2026
329cc4a
v1.8.4: Measure the 98SE checkbox well in the radio centering check
SteveTheKiller Oct 21, 2026
c14bbe2
v1.8.4: Show the evidence and confidence behind each device type
SteveTheKiller Oct 21, 2026
19611a5
v1.8.4: List each way into a device and what it answered
SteveTheKiller Oct 21, 2026
d36df04
v1.8.4: Accept the memory test's start line under a UTF-8 console
SteveTheKiller Oct 21, 2026
4af91da
v1.8.4: Follow gradient themes on the shortcuts card edge, add headin…
SteveTheKiller Oct 21, 2026
17a47d2
v1.8.4: Report an unusable Locations catalog or import instead of cra…
SteveTheKiller Oct 21, 2026
88b77be
v1.8.4: Send bound pings asynchronously so silent hosts hold no threads
SteveTheKiller Oct 21, 2026
3295282
v1.8.4: Return recognition and access evidence from the PowerShell mo…
SteveTheKiller Oct 21, 2026
3e94d47
v1.8.4: Clear results when changing Location and save the chosen adapter
SteveTheKiller Oct 21, 2026
1439dc1
Light theme: darker gray chrome around lighter fields (family)
SteveTheKiller Oct 21, 2026
8194d57
v1.8.4: Name the app in the changelog heading
SteveTheKiller Oct 21, 2026
8ac2fbf
v1.8.4: Darken menus and bars in Dark, Decay, Ectoplasm, Malaise and …
SteveTheKiller Oct 21, 2026
982e7cf
v1.8.4: Soften pane borders in Blood, Greed and Cyanotic, raise them …
SteveTheKiller Oct 21, 2026
9499ed9
v1.8.4: Show film grain on Light and other non-Black themes again
SteveTheKiller Oct 21, 2026
721ee6f
v1.8.4: Keep redirects off print ports and bound probes on their adapter
SteveTheKiller Oct 21, 2026
55d36e5
v1.8.4: Quote module arguments the Windows way and run suites from sp…
SteveTheKiller Oct 21, 2026
e2b093c
v1.8.4: Roll back failed Location changes and keep unsaved history on…
SteveTheKiller Oct 21, 2026
ba6cd47
v1.8.4: Tidy the Location banner, menus, import, topology keys and te…
SteveTheKiller Oct 21, 2026
72682aa
Light theme: shades of gray with nothing white (family)
SteveTheKiller Oct 21, 2026
7113992
v1.8.4: Raise wordmarks and headings with a subtle bevel, restore the…
SteveTheKiller Oct 22, 2026
e8f915d
v1.8.4: Make theme menu hover rows reach the right edge with the same…
SteveTheKiller Oct 22, 2026
97bdc0d
v1.8.4: Make the topology diagram one Tab stop and test refused termi…
SteveTheKiller Oct 22, 2026
ab8eda3
v1.8.4: In 98SE, long paths in the file dialog keep clear of the rece…
SteveTheKiller Oct 22, 2026
b7541a2
Dark/Red hover fills a step deeper with white text so the label clear…
SteveTheKiller Oct 22, 2026
8b2db0f
v1.8.4: Run the unelevated self-update helper from its command line i…
SteveTheKiller Oct 22, 2026
1d81529
v1.8.4: Hovered menu and list items show their text in the theme accent
SteveTheKiller Oct 22, 2026
34afc60
v1.8.4: Match 98SE menu highlights to the selected accent
SteveTheKiller Oct 22, 2026
7a45104
Light title bar matches the gray around it again
SteveTheKiller Oct 22, 2026
adcc160
v1.8.4: Keep 98SE Yellow menu highlights yellow with dark text
SteveTheKiller Oct 22, 2026
ea0e94f
Light dim and footer text darken to stay readable on the darker gray
SteveTheKiller Oct 22, 2026
15bfbdd
v1.4.0: Close X and Dark red accent text pass contrast
SteveTheKiller Oct 22, 2026
ea81d71
v1.8.4: Sync translated Store listings before submission
SteveTheKiller Oct 22, 2026
c56b7ee
v1.8.4: Website grain matches KillerTools with a Film Grain switch; t…
SteveTheKiller Oct 22, 2026
9d12114
v1.8.4: Translate shared website carousel accessibility labels
SteveTheKiller Oct 22, 2026
5475a9e
v1.8.4: Feature carousel edges match KillerPDF: a thin border with ac…
SteveTheKiller Oct 22, 2026
5833141
v1.8.4: Keep About content side gutters at eight pixels
SteveTheKiller Oct 23, 2026
f460fe7
v1.8.4: Add shortcut hint visibility setting
SteveTheKiller Oct 23, 2026
df08568
v1.8.4: Match Black headers and fixed theme tab accents
SteveTheKiller Oct 23, 2026
9a38a26
v1.8.4: Arrange About settings in two columns
SteveTheKiller Oct 23, 2026
a8a2fb2
v1.8.4: Reduce Black theme grain brightness
SteveTheKiller Oct 23, 2026
03c0c7b
v1.8.4: Add contribution guidelines
SteveTheKiller Oct 23, 2026
6c5ac35
v1.8.4: Keep file picker listings responsive and bounded
SteveTheKiller Oct 23, 2026
d423ead
v1.8.4: Bold the default system menu item, as Windows does
SteveTheKiller Oct 24, 2026
1e53195
v1.8.4: Give Dark text fields a deeper background
SteveTheKiller Oct 24, 2026
3abe81d
v1.8.4: Move task records outside the repository
SteveTheKiller Oct 25, 2026
54e2e9c
v1.8.4: Name Cloudflare challenges and show what a rejected speed tes…
SteveTheKiller Oct 26, 2026
f6bca6b
v1.8.4: Record the Locations migration check against real install data
SteveTheKiller Oct 26, 2026
9e1e88e
v1.8.4: Let the speed test, saved scans and history rail buttons be d…
SteveTheKiller Oct 26, 2026
aa928c5
Raise Black theme grain to 0.14
SteveTheKiller Oct 26, 2026
30476f6
Raise Black theme grain to 0.20
SteveTheKiller Oct 26, 2026
65d3db0
Set Black theme grain to 0.18
SteveTheKiller Oct 26, 2026
3811717
Lower Light theme grain to 0.30
SteveTheKiller Oct 26, 2026
e0cbb28
Keep pane shadows under the app zoom with the family UnclippedGrid
SteveTheKiller Oct 26, 2026
02be4c0
v1.9.0: Rename the open release to 1.9.0 and update System.Text.Json …
SteveTheKiller Oct 26, 2026
743f796
v1.9.0: Verify publisher, product and version on every update path an…
SteveTheKiller Oct 26, 2026
6924a1e
v1.9.0: Start arp, mstsc, ping and ssh by their System32 paths and ke…
SteveTheKiller Oct 26, 2026
50ad277
v1.9.0: Cap vendor downloads, refuse HTTPS downgrades and bound devic…
SteveTheKiller Oct 26, 2026
d962c10
v1.9.0: Bind the terminal's private prompt and speed-test marks to a …
SteveTheKiller Oct 26, 2026
97f3af1
v1.9.0: Keep the settings, history and Locations save locks in the se…
SteveTheKiller Oct 26, 2026
bfb56f6
v1.9.0: Verify release assets, pin komac and pass tags as data in the…
SteveTheKiller Oct 26, 2026
a88ef4e
v1.9.0: Attribute mDNS names and services only to the device the reco…
SteveTheKiller Oct 26, 2026
3a712e7
v1.9.0: Skip manuf blocks the vendor lookup cannot key instead of tru…
SteveTheKiller Oct 26, 2026
363fe0f
v1.9.0: Leave broadcast and multicast ARP rows out of discovered devices
SteveTheKiller Oct 26, 2026
08df99a
v1.9.0: Skip an adapter without a usable mask instead of abandoning l…
SteveTheKiller Oct 26, 2026
5aa0653
v1.9.0: Read TLS certificates on port 5001 in a normal scan
SteveTheKiller Oct 26, 2026
93e1b98
v1.9.0: Ignore a loaded-latency failure that lands after its phase ha…
SteveTheKiller Oct 26, 2026
12f33b6
v1.9.0: Observe the connect and receive tasks that lose a probe's tim…
SteveTheKiller Oct 26, 2026
605a49b
v1.9.0: Uninstall past other users' copies and copies without registr…
SteveTheKiller Oct 26, 2026
70df289
v1.9.0: Route elevated per-user copies to their own update helper and…
SteveTheKiller Oct 26, 2026
efa437d
v1.9.0: Clear backups left by upgrades over a running copy on the nex…
SteveTheKiller Oct 26, 2026
2f84351
v1.9.0: Confirm a machine uninstall before elevating
SteveTheKiller Oct 26, 2026
c3d00af
v1.9.0: Reopen KillerScan after a failed elevated update and stop lea…
SteveTheKiller Oct 26, 2026
cd70345
v1.9.0: Bundle the source after the README release commit so the zip …
SteveTheKiller Oct 26, 2026
6f86c65
v1.9.0: Let an engine package repair change only package metadata in …
SteveTheKiller Oct 26, 2026
68e8d10
v1.9.0: Document the Constrained Language Mode limit and the reworked…
SteveTheKiller Oct 26, 2026
938d591
v1.9.0: Point the loopback speed-test check at the engine's namespace…
SteveTheKiller Oct 26, 2026
ddf87ea
v1.9.0: Keep command-line errors on screen when only the output is re…
SteveTheKiller Oct 26, 2026
4c9a319
v1.9.0: Start watching when Diagnose opens a card on an idle Network …
SteveTheKiller Oct 26, 2026
abdb05a
v1.9.0: Consume colon sub-parameter sequences and erase hidden column…
SteveTheKiller Oct 26, 2026
441b99b
v1.9.0: Sweep prompt palette files left by closed KillerScan runs
SteveTheKiller Oct 26, 2026
696943c
v1.9.0: Cache terminal row offsets for screen readers instead of rebu…
SteveTheKiller Oct 26, 2026
0c3e27b
v1.9.0: Serialize writers of one preference file within the process
SteveTheKiller Oct 26, 2026
c083f83
v1.9.0: Move a tab off a Location deleted elsewhere instead of recrea…
SteveTheKiller Oct 26, 2026
75d6dd7
v1.9.0: Name the unreadable file when a preference save is refused
SteveTheKiller Oct 26, 2026
0be648a
v1.9.0: Coalesce topology rebuilds during resizes
SteveTheKiller Oct 26, 2026
13a6224
v1.9.0: Announce refused history settings and focus the field to fix
SteveTheKiller Oct 26, 2026
e7ca9bd
v1.9.0: Close the site's language menu with Escape and return focus t…
SteveTheKiller Oct 26, 2026
b209c26
Build the app test runner with the solution so it is never stale
SteveTheKiller Oct 26, 2026
a95375e
Add a theme value dump for comparing theme refactors
SteveTheKiller Oct 26, 2026
434f665
v1.9.0: Take the family theme engine, control styles and palettes fro…
SteveTheKiller Oct 26, 2026
2b0260a
v1.9.0: Use the family Malaise panes and Sepulchre selection
SteveTheKiller Oct 26, 2026
7e541db
Sync ten small kit files with the KillerUI template
SteveTheKiller Oct 26, 2026
49ee93e
Sync the button, caption and Malaise changes from KillerUI, take Grid…
SteveTheKiller Oct 26, 2026
f0dd258
Permanent view tabs, scan bar in the title bar, saved scans merged in…
SteveTheKiller Oct 26, 2026
601e47d
Reconcile the file dialog group, LocaleManager and ShellServices with…
SteveTheKiller Oct 27, 2026
cb5abbb
Themes: theme-toned button text, Ectoplasm yellow menu hover, cream G…
SteveTheKiller Oct 27, 2026
1243d2e
Cream selection and buttons on the RGB themes, orange untrusted dot o…
SteveTheKiller Oct 27, 2026
4dac2e9
Take the kit's flyout placement, AppScale, SystemMenu, SidebarSide an…
SteveTheKiller Oct 27, 2026
7d6ed8b
Theme and language menus always open in the pane corner; the view tab…
SteveTheKiller Oct 27, 2026
e15a3e2
Take the kit's About core and update pair; vendor database rows, demo…
SteveTheKiller Oct 27, 2026
73a5883
Save to an existing Location with an optional scan name, named scans …
SteveTheKiller Oct 27, 2026
5859dc8
Locations sidebar as a tree: each Location expands to its scans, whic…
SteveTheKiller Oct 27, 2026
5e35040
Location icons: picked beside the name in New and Rename Location, sh…
SteveTheKiller Oct 27, 2026
6235e00
Locations tree rows are single lines like KillerShell's folder tree: …
SteveTheKiller Oct 27, 2026
2cc1887
Scan is the big accent button, Edit Location with name, icon and note…
SteveTheKiller Oct 27, 2026
0816db9
New Location is a standard button; Scan is the one big accent button
SteveTheKiller Oct 27, 2026
b7510f7
Trim the Scan button's padding; New Location matches the sidebar's ot…
SteveTheKiller Oct 27, 2026
233ced9
Saved scans per Location (named targets, several per Location) in the…
SteveTheKiller Oct 27, 2026
0c5b562
Save scan has its own title instead of borrowing Rename scan
SteveTheKiller Oct 27, 2026
89851b4
Drag a saved scan onto another Location to move it
SteveTheKiller Oct 27, 2026
670fcf5
Name prompts are 300px wide, 380 with notes
SteveTheKiller Oct 27, 2026
d7efa88
Saved scans rename inline in the tree, and a nicknamed scan shows its…
SteveTheKiller Oct 27, 2026
1e3234a
Inline scan rename: Enter and Esc reach the box, and the box uses the…
SteveTheKiller Oct 27, 2026
13772ce
Fix the inline rename box style being set twice
SteveTheKiller Oct 27, 2026
2e0d420
Locations learn a gateway only from a saved scan; clear the ones lear…
SteveTheKiller Oct 27, 2026
4c9f6eb
Edit Location shows the router (gateway MAC) the Location is recogniz…
SteveTheKiller Oct 27, 2026
76ad545
Remove the title-bar Location button (Locations live in the sidebar);…
SteveTheKiller Oct 27, 2026
707a3bf
Save always works: in a Location it saves the scan there, unsaved it …
SteveTheKiller Oct 27, 2026
22666a5
Sync OutlineButton and BareButton from KillerUI (fixes the scan bar r…
SteveTheKiller Oct 27, 2026
a2208c1
Migrate earlier versions' scan profiles into saved scans inside one S…
SteveTheKiller Oct 27, 2026
b96c1a9
The migrated Saved scans Location never learns a router
SteveTheKiller Oct 27, 2026
49d420b
Saved scans is a holding Location: nothing new saved or dragged in, S…
SteveTheKiller Oct 27, 2026
61ca358
Kit sync with KillerUI's push-ups: DialogChrome, FileDialog, FolderTr…
SteveTheKiller Oct 27, 2026
83a3a14
Kit sync with KillerUI: ConfirmDialog takes the family frame (install…
SteveTheKiller Oct 27, 2026
fc02c0c
Install prompt shows the all-users note under the box again, through …
SteveTheKiller Oct 27, 2026
770efc8
Take KillerUI's ConfirmDialog: Enter answers OK and Esc answers Cancel
SteveTheKiller Oct 27, 2026
7e7ed63
Take KillerUI's portable update stack fixes
SteveTheKiller Oct 27, 2026
0995b19
Take KillerUI's file picker safeguards: Accept cannot fire twice, and…
SteveTheKiller Oct 27, 2026
a2dab31
Take KillerUI's CommandLinePath: only a fully qualified PATH entry ca…
SteveTheKiller Oct 27, 2026
8f97f05
Take KillerUI's dialog caption and picker list names
SteveTheKiller Oct 27, 2026
b0d72b1
Take KillerUI's hardened update stack: in-helper signature checks, pi…
SteveTheKiller Oct 27, 2026
9feacd4
Take KillerUI's ExecutableDeployment, which names System itself
SteveTheKiller Oct 27, 2026
3bfd516
Keep PrimaryButton captions sharp: the stroke moves to a copy under t…
SteveTheKiller Oct 27, 2026
72c3690
File picker resolves typed C:name and \name paths against the folder …
SteveTheKiller Oct 27, 2026
1e22b1a
Landing page film grain loads from disk too: tile paths are relative …
SteveTheKiller Oct 27, 2026
7e5f355
Sync the KillerUI update stack fixes: the installer helper keeps a fa…
SteveTheKiller Oct 27, 2026
f855494
Black theme grain matches the apps' 0.18: new highlights tile, with s…
SteveTheKiller Oct 27, 2026
73718fc
v1.9.0: Keep hover tooltips clear of large pointers
SteveTheKiller Oct 27, 2026
2f43df4
File picker stops folder listing when a close starts, not after the fade
SteveTheKiller Oct 27, 2026
af1118e
Install KillerMCP with winget install killermcp
SteveTheKiller Oct 27, 2026
596ece4
Menus and submenus scroll when taller than the screen
SteveTheKiller Oct 27, 2026
ed3ca88
Sync the KillerUI tray Exit, High Contrast menu hover and file picker…
SteveTheKiller Oct 27, 2026
7b42859
Sync the KillerUI system menu hooks for an app's own menu style and rows
SteveTheKiller Oct 27, 2026
2ebcffc
Sync the KillerUI tray robustness: the window stays in view when the …
SteveTheKiller Oct 27, 2026
b4e2d52
Sync the KillerUI chrome and status hooks: FilterWindowMessage for an…
SteveTheKiller Oct 27, 2026
31bd4f3
Sync the KillerUI locale, chrome and language fixes: dates and number…
SteveTheKiller Oct 27, 2026
b46e64a
Sync the KillerUI update stack: opt-in direct installer mode and the …
SteveTheKiller Oct 27, 2026
7488f47
Sync the KillerUI UpdateService: the checksum line rule moves into Ch…
SteveTheKiller Oct 27, 2026
f7bda6a
Sync the KillerUI release identity: updates follow the publisher's su…
SteveTheKiller Oct 27, 2026
790a7fb
Parse check hands the helper script to PowerShell through a temp file…
SteveTheKiller Oct 27, 2026
f6664d7
Take KillerUI's Malaise #303638 document pane and 98SE light title-ba…
SteveTheKiller Oct 28, 2026
84241f2
Take KillerUI's CloseToTray exit fixes, saved-theme guard, replace pr…
SteveTheKiller Oct 28, 2026
1fdebea
Sync the KillerUI tray menu placement: Tray menu opens from the point…
SteveTheKiller Oct 28, 2026
51c8799
Take KillerUI's grain binding, weakly held flyout pane and canceled-s…
SteveTheKiller Oct 28, 2026
3720c4f
Release Sync no longer reports WinGet missing when GitHub is throttling
SteveTheKiller Oct 28, 2026
dcff65e
Locations are picked from the scan bar, and the sidebar lists them flat
SteveTheKiller Oct 28, 2026
8297efe
Shorter README: features as short bullets, speed-test internals moved…
SteveTheKiller Oct 28, 2026
1fb7461
Adapter preference test sets up its Location through LocationService,…
SteveTheKiller Oct 29, 2026
33a9e98
HTML reports carry their own logo, so opening one contacts nothing (U…
SteveTheKiller Oct 29, 2026
06d62e1
Per-monitor DPI awareness through the family app manifest
SteveTheKiller Oct 29, 2026
b5a25d9
Topology spaces by its widest card, and the keyboard map has arrow keys
SteveTheKiller Oct 29, 2026
f40de42
UI suites follow the 2026-10-26 layout: icon-only Scan settings, tab-…
SteveTheKiller Oct 29, 2026
71dbd10
History menu test checks the KillerUI flyout anchor rule
SteveTheKiller Oct 29, 2026
f233501
Locations list draws its rows in the theme's text color
SteveTheKiller Oct 29, 2026
f643aa6
Fixes from the 1.9.0 fix-diff review: saved-scan rename, pending hist…
SteveTheKiller Oct 29, 2026
1022eb8
Take KillerUI's update publication fix (DEP-001, DEP-002) and test th…
SteveTheKiller Oct 29, 2026
0584702
Review fixes: keep results on network change, leave deleted Locations…
SteveTheKiller Oct 29, 2026
47ed410
Review fixes: save the on-screen Unassigned run, export off the UI th…
SteveTheKiller Oct 29, 2026
bef83d0
Location.cs doc comments match the code: no orphaned summaries, delet…
SteveTheKiller Oct 29, 2026
79492af
Low-severity review fixes: topology single build and theme re-measure…
SteveTheKiller Oct 29, 2026
9a48aae
Full adversarial review fixes: engine parsing and classification, ter…
SteveTheKiller Oct 29, 2026
4275feb
Take KillerUI's dialog caption fix: title bars blend into the dialog …
SteveTheKiller Oct 29, 2026
b3b022f
Changelog: dialog title bars match the rest of the dialog
SteveTheKiller Oct 29, 2026
9693e9d
Release Sync no longer reports WinGet missing when GitHub is throttling
SteveTheKiller Oct 28, 2026
ff13bdf
Release Sync counts a first WinGet submission as pending, not failed
SteveTheKiller Oct 29, 2026
477f9d0
Release Sync counts a first WinGet submission as pending, not failed
SteveTheKiller Oct 29, 2026
550d1b8
Remove a stray carriage return from line 41 of the Greed and Cyanotic…
SteveTheKiller Oct 29, 2026
1cfd0a3
v1.9.0: Save results moves a run only after every write lands, refuse…
SteveTheKiller Oct 31, 2026
9f42485
v1.9.0: Saved-scan rename reaches the file, History Retry repeats the…
SteveTheKiller Oct 31, 2026
fcc500b
v1.9.0: Import lists a Location last, delete finishes or changes noth…
SteveTheKiller Oct 31, 2026
fc74e93
v1.9.0: mDNS services follow their SRV and A records to the right host
SteveTheKiller Oct 31, 2026
cba70fb
v1.9.0: A Location learns only the router of the adapter its saved sc…
SteveTheKiller Oct 31, 2026
df41070
v1.9.0: History compares a run only with runs on the same network, by…
SteveTheKiller Oct 31, 2026
3453f5c
v1.9.0: A fresh install stays Temporary by decision, says when a scan…
SteveTheKiller Oct 31, 2026
52117bf
v1.9.0: Translate the Save results and Temporary scan messages
SteveTheKiller Oct 31, 2026
292dc46
v1.9.0: Reconcile with origin/main, whose changes are already here
SteveTheKiller Oct 31, 2026
990ada3
v1.9.0: Repair review fixes: results with no run, deleted destination…
SteveTheKiller Oct 31, 2026
b4624e3
v1.9.0: Announce a scan's final status, offer Save results for stoppe…
SteveTheKiller Oct 31, 2026
c0ae2d3
v1.9.0: Note that cloned PCs can share an adapter ID
SteveTheKiller Oct 31, 2026
f1a1d35
v1.9.0: Restore full pane glow and hover styling on landing pages
SteveTheKiller Oct 31, 2026
5619598
v1.9.0: Say to start the registered uninstall directly, not through cmd
SteveTheKiller Oct 31, 2026
47fa6d1
v1.9.0: The uninstall that finishes clears helpers left by refused ones
SteveTheKiller Oct 31, 2026
9a7a5dc
v1.9.0: Keep the stale uninstall helper cleanup with the only code th…
SteveTheKiller Oct 31, 2026
d7b3faf
v1.9.0: Elevated update helpers reopen the app after any early failur…
SteveTheKiller Oct 31, 2026
9e44797
v1.9.0: killerscan locations lists saved Locations without changing a…
SteveTheKiller Oct 31, 2026
135d624
v1.9.0: A value of uiscan no longer opens the app; uiscan is a comman…
SteveTheKiller Oct 31, 2026
90a40a4
v1.9.0: Portable updates hold the verified image until relaunch, and …
SteveTheKiller Oct 31, 2026
acfdfe1
v1.9.0: Refresh actions recheck the selected adapter before probing
SteveTheKiller Oct 31, 2026
15f640f
v1.9.0: Saved scan selection preserves the chosen scan depth
SteveTheKiller Oct 31, 2026
d81d1c8
v1.9.0: The update helper launcher stays well inside the Windows comm…
SteveTheKiller Oct 31, 2026
6cb2543
v1.9.0: CLI CSV includes recognition and access evidence
SteveTheKiller Oct 31, 2026
34c1e36
v1.9.0: CLI 98SE reports select the existing report palette
SteveTheKiller Oct 31, 2026
eb4ccd5
v1.9.0: Help distinguishes saved scans from read-only Location probes
SteveTheKiller Oct 31, 2026
ed9763d
v1.9.0: Shared profile transactions coordinate across Windows sessions
SteveTheKiller Oct 31, 2026
2feb5c8
v1.9.0: All-users uninstall safely quotes its nested helper
SteveTheKiller Oct 31, 2026
b00a9bc
v1.9.0: Focused regression suites report successful execution
SteveTheKiller Oct 31, 2026
82f092f
v1.9.0: Deployment help matches current helper and publisher behavior
SteveTheKiller Oct 31, 2026
6cc75b6
v1.9.0: Refused session ends clear the tray icon, file pickers load s…
SteveTheKiller Oct 31, 2026
11663d7
v1.9.0: Tooltips keep their text when shortcut hints are off
SteveTheKiller Oct 31, 2026
1f969f1
v1.9.0: Uninstall can list update leftovers
SteveTheKiller Oct 31, 2026
6de9635
v1.9.0: Correct the update helper launch regression expectation
SteveTheKiller Nov 1, 2026
bf82416
v1.9.0: Add family sidebar placement and repair accessibility transit…
SteveTheKiller Nov 1, 2026
5314cc0
v1.9.0: Save updated device and export screenshots
SteveTheKiller Nov 1, 2026
ae44e7d
v1.9.0: Populate demo Locations instead of the legacy profile-only pi…
SteveTheKiller Nov 1, 2026
77b3af9
v1.9.0: Save terminal and Locations screenshots
SteveTheKiller Nov 1, 2026
ca4a9af
v1.9.0: Save Keep Alive, Services and shortcuts screenshots
SteveTheKiller Nov 1, 2026
18b2818
v1.9.0: Restore classic caption symbols and correct topology menu coo…
SteveTheKiller Nov 1, 2026
bfb6318
v1.9.0: Match original Windows 98 caption proportions and toolbar pla…
SteveTheKiller Nov 1, 2026
90995b8
v1.9.0: Save the final 98SE screenshot
SteveTheKiller Nov 1, 2026
4f6c42c
v1.9.0: Update translated screenshot captions and correct product doc…
SteveTheKiller Nov 1, 2026
f697348
v1.9.0: prepare November 1 release and final gallery checks
SteveTheKiller Nov 1, 2026
d8d8b8d
v1.9.0: fix nullable warnings in tab shadows and sidebar tests
SteveTheKiller Nov 1, 2026
c0dbd20
v1.9.0: site and README release info
SteveTheKiller Nov 1, 2026
bb1a384
v1.9.0: repair package checksum decoding and runner HTTP fixture setup
SteveTheKiller Nov 1, 2026
3385023
Merge upstream 1.9.0 while retaining fork Home Assistant advice
MrCodeLabs Nov 2, 2026
76cff0e
Keep native classification authoritative when updating fork metadata
MrCodeLabs Nov 2, 2026
44a52bd
Set isolated CI data after the runner starts
MrCodeLabs Nov 2, 2026
2fee93d
Use child PowerShell exit codes for CI test script results
MrCodeLabs Nov 2, 2026
1e7999c
Complete HA menu icons and keep desktop-token validation off hosted r…
MrCodeLabs Nov 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
23 changes: 2 additions & 21 deletions .github/CI.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Pull request CI

The local workflow `workflows/pr-build-test.yml` restores and builds the application and runs the
existing regression suites on GitHub-hosted Windows 2025. The fork's PR #8 run passed on
20 October 2026. Logs and test results are retained for seven days.
existing regression suites on GitHub-hosted Windows 2025. Publication is separately authorized;
these local definitions have not run on GitHub. Logs and test results are retained for seven days.
Official checkout, setup-dotnet, and upload-artifact actions are pinned to immutable commit hashes.

It uses only `pull_request`, `contents: read`, and checkout with persisted credentials disabled.
Expand All @@ -14,22 +14,3 @@ The engine console runner runs on both net48 and net10.0. The speed-test console
net48 with local fixtures only, without --worker or --internet. They use dotnet run because they
are executable regression suites. Isolated WPF checks are distinct from interactive UI automation.
The build SDK is .NET 10; the application and desktop runner continue targeting net48.

## Release-channel verification

`workflows/release-sync.yml` checks the upstream publisher's GitHub release, Chocolatey and
WinGet channels. Its `verify` job runs only in `SteveTheKiller/KillerScan`, for both scheduled
and manual invocations. Development forks intentionally skip this job, even if they have
their own releases: the configured marketplace identifiers belong to the upstream publisher.
This does not disable `pr-build-test.yml` or change any publishing workflow.

On 23 October 2026, investigation found eleven scheduled failures in the fork after the
upstream sync: the fork has no published releases, so `/releases/latest` returned HTTP 404.
The script previously continued to an empty release tag and obscured the original error.
The job guard prevents the inapplicable fork check; failed release API calls now stop with
an explicit metadata-fetch error. Missing releases in the publisher's repository remain failures.

Validation: actionlint and PowerShell syntax checks, plus isolated release-lookup cases
(latest, explicit version, API failure and invalid tag). The patched workflow must reach
the fork's default branch before scheduled runs use the guard. Old failed runs remain in
history; rerunning their old revisions does not test this fix. No package was published.
40 changes: 37 additions & 3 deletions .github/workflows/chocolatey-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,56 @@ on:
description: 'Release tag (e.g. v1.0.0)'
required: true

# Nothing here writes to the repository; the token is read-only and not left in the checkout.
permissions:
contents: read

jobs:
push:
# A prerelease is not published to Chocolatey. The manual retry path still runs.
if: >-
github.repository == 'SteveTheKiller/KillerScan' &&
(github.event_name == 'workflow_dispatch' || !github.event.release.prerelease)
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
# The released tag's nuspec and install script, also for a manual retry of an older tag.
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event.release.tag_name || github.event.inputs.tag }}
persist-credentials: false

- name: Build and push Chocolatey package
shell: pwsh
env:
CHOCO_API_KEY: ${{ secrets.CHOCOLATEY_API_KEY }}
# Event values reach the script as data, never as script text.
EVENT_NAME: ${{ github.event_name }}
INPUT_TAG: ${{ github.event.inputs.tag }}
RELEASE_TAG: ${{ github.event.release.tag_name }}
run: |
$releaseTag = if ("${{ github.event_name }}" -eq "workflow_dispatch") { "${{ github.event.inputs.tag }}" } else { "${{ github.event.release.tag_name }}" }
$releaseTag = if ($env:EVENT_NAME -eq 'workflow_dispatch') { $env:INPUT_TAG } else { $env:RELEASE_TAG }
if ($releaseTag -notmatch '^v\d+\.\d+\.\d+$') { throw "Release tag '$releaseTag' is not vMAJOR.MINOR.PATCH." }
$version = $releaseTag.TrimStart('v')
$exeUrl = "https://github.com/SteveTheKiller/KillerScan/releases/download/$releaseTag/KillerScan.exe"
$base = "https://github.com/SteveTheKiller/KillerScan/releases/download/$releaseTag"
$exeUrl = "$base/KillerScan.exe"

# Download release EXE and compute hash
Write-Host "Downloading $exeUrl..."
Invoke-WebRequest -Uri $exeUrl -OutFile "$env:RUNNER_TEMP\KillerScan.exe"
$hash = (Get-FileHash "$env:RUNNER_TEMP\KillerScan.exe" -Algorithm SHA256).Hash
Write-Host "SHA256: $hash"

# The package pins whatever was downloaded, so check it is the release release.ps1 built:
# the published checksum and a valid signature from the release certificate.
$sums = (Invoke-WebRequest -Uri "$base/SHA256SUMS.txt" -UseBasicParsing).Content
if ($sums -is [byte[]]) { $sums = [Text.Encoding]::UTF8.GetString($sums) }
$listed = [regex]::Match($sums, '(?m)^KillerScan\.exe\s+([0-9A-Fa-f]{64})\s*$').Groups[1].Value
if ($listed -ne $hash) { throw "KillerScan.exe does not match SHA256SUMS.txt (listed '$listed', downloaded $hash)." }
$signature = Get-AuthenticodeSignature "$env:RUNNER_TEMP\KillerScan.exe"
if ($signature.Status -ne 'Valid' -or $signature.SignerCertificate.GetNameInfo([Security.Cryptography.X509Certificates.X509NameType]::SimpleName, $false) -ne 'Open Source Developer Stephen Riley') {
throw "KillerScan.exe is not validly signed by the release certificate ($($signature.Status), $($signature.SignerCertificate.Subject))."
}

# Stamp version and hash into package files
$nuspec = "choco\killerscan.nuspec"
$install = "choco\tools\chocolateyInstall.ps1"
Expand Down Expand Up @@ -99,6 +128,7 @@ jobs:
$feed = "https://community.chocolatey.org/api/v2/Packages(Id='killerscan',Version='$env:CHOCO_VERSION')"
$repushed = $false
$pendingSinceRepush = $false
$lastKnownState = ''
$deadline = (Get-Date).AddMinutes(160)
while ((Get-Date) -lt $deadline) {
Start-Sleep -Seconds 300
Expand All @@ -109,6 +139,7 @@ jobs:
continue
}
$state = [regex]::Match($entry, '<d:PackageValidationResultStatus>(\w+)</d:PackageValidationResultStatus>').Groups[1].Value
if ($state) { $lastKnownState = $state }
Write-Host "$(Get-Date -Format HH:mm:ss) validation: $(if ($state) { $state } else { 'not shown' })"
if ($state -like 'Pass*') { exit 0 }
if ($repushed -and $state -and $state -notlike 'Fail*') { $pendingSinceRepush = $true }
Expand All @@ -122,6 +153,9 @@ jobs:
throw "Chocolatey validation failed twice. See $page"
}
}
if ($lastKnownState -like 'Fail*') {
throw "Chocolatey validation remained failed after re-push. See $page"
}
# Chocolatey's queue often takes longer than this. The package is already pushed, so a
# validation that is still pending is a warning, not a failed release.
Write-Host "::warning::Chocolatey validation was still pending after 160 minutes. The package was pushed. See $page"
Expand Down
30 changes: 24 additions & 6 deletions .github/workflows/nuget-engine-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ concurrency:
jobs:
publish:
if: >-
(github.event_name == 'release' && !github.event.release.prerelease) ||
(github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main')
github.repository == 'SteveTheKiller/KillerScan' &&
((github.event_name == 'release' && !github.event.release.prerelease) || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/main'))
# Windows, so the net48 build and its regression run sit beside net10.0.
runs-on: windows-latest
permissions:
Expand All @@ -41,7 +41,7 @@ jobs:
GH_TOKEN: ${{ github.token }}

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0

Expand All @@ -62,6 +62,22 @@ jobs:
if ($LASTEXITCODE -ne 0) { throw 'Repair commit must be on main.' }
git diff --exit-code $tag $source -- Engine Resources/oui.txt ':!Engine/KillerScan.Engine.csproj' ':!Engine/README.md' ':!Engine/icon.png'
if ($LASTEXITCODE -ne 0) { throw 'Engine code differs from the released source.' }
# The project file decides what is compiled and which dependency versions ship, so only
# its package metadata may change in a repair. Everything else must match the tag.
$metadata = 'Title', 'Authors', 'Copyright', 'Description', 'PackageTags', 'PackageProjectUrl',
'RepositoryUrl', 'RepositoryType', 'PackageReleaseNotes'
function Get-BuildShape([string]$ref) {
[xml]$project = (git show "$($ref):Engine/KillerScan.Engine.csproj") -join "`n"
if ($LASTEXITCODE -ne 0) { throw "The engine project is missing at $ref." }
foreach ($name in $metadata) {
foreach ($node in @($project.SelectNodes("/Project/PropertyGroup/$name"))) { [void]$node.ParentNode.RemoveChild($node) }
}
foreach ($node in @($project.SelectNodes('//comment()'))) { [void]$node.ParentNode.RemoveChild($node) }
$project.OuterXml
}
if ((Get-BuildShape $tag) -ne (Get-BuildShape $source)) {
throw 'The engine project differs from the released source beyond package metadata.'
}
}
git checkout --detach $source
if ($LASTEXITCODE -ne 0) { throw 'Release source checkout failed.' }
Expand All @@ -73,7 +89,7 @@ jobs:
}
"version=$version" >> $env:GITHUB_OUTPUT

- uses: actions/setup-dotnet@v4
- uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: '10.0.x'

Expand All @@ -82,6 +98,8 @@ jobs:

- name: Test
run: |
# The hosted image includes IIS, which can reserve the loopback HTTP fixture's port.
Get-Service W3SVC, WAS -ErrorAction SilentlyContinue | Stop-Service -Force -ErrorAction Stop
dotnet build tests/KillerScan.Engine.Tests/KillerScan.Engine.Tests.csproj -c Release --no-restore
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
foreach ($tfm in 'net48', 'net10.0') {
Expand All @@ -93,15 +111,15 @@ jobs:
run: dotnet pack Engine/KillerScan.Engine.csproj -c Release -o artifacts/nuget

- name: Preserve packages
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: engine-${{ steps.release.outputs.version }}
path: artifacts/nuget/*
if-no-files-found: error

- name: Sign in to NuGet
id: nuget-login
uses: NuGet/login@v1
uses: NuGet/login@8d196754b4036150537f80ac539e15c2f1028841 # v1.2.0
with:
user: StevetheKiller

Expand Down
46 changes: 34 additions & 12 deletions .github/workflows/pr-build-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,26 +26,33 @@ jobs:
project: KillerScan.csproj
mode: build
framework: ''
suite: ''
- name: engine-net48
project: tests/KillerScan.Engine.Tests/KillerScan.Engine.Tests.csproj
mode: console
framework: 'net48'
suite: engine
- name: engine-net10
project: tests/KillerScan.Engine.Tests/KillerScan.Engine.Tests.csproj
mode: console
framework: 'net10.0'
suite: engine
- name: speed-test-fixtures
project: tests/SpeedTest.Tests/SpeedTest.Tests.csproj
mode: console
framework: 'net48'
suite: app
name: ${{ matrix.name }}
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5
- uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: '10.0.x'
- name: Isolate fork test data
run: |
"KILLERSCAN_DATA_ROOT=$env:RUNNER_TEMP\KillerScan-ci-data" >> $env:GITHUB_ENV
- name: Restore and build
env:
PROJECT: ${{ matrix.project }}
Expand All @@ -59,28 +66,43 @@ jobs:
if ($env:FRAMEWORK) { $buildArgs += @('--framework', $env:FRAMEWORK) }
& dotnet @buildArgs 2>&1 | Tee-Object ci-results/build.log
if ($LASTEXITCODE -ne 0) { throw 'Build failed. See build.log.' }
- name: Run tests
if: matrix.mode == 'test'
env:
PROJECT: ${{ matrix.project }}
run: |
# WPF FontCache requires WINDIR even for isolated resource tests.
if (!$env:WINDIR) { $env:WINDIR = $env:SYSTEMROOT }
dotnet test $env:PROJECT --no-build --no-restore --configuration Release --logger 'trx;LogFileName=tests.trx' --results-directory ci-results --verbosity normal 2>&1 | Tee-Object ci-results/test.log
if ($LASTEXITCODE -ne 0) { throw 'Tests failed. See test.log and tests.trx.' }
- name: Run console regression checks
if: matrix.mode == 'console'
env:
PROJECT: ${{ matrix.project }}
FRAMEWORK: ${{ matrix.framework }}
run: |
if (!$env:WINDIR) { $env:WINDIR = $env:SYSTEMROOT }
Get-Service W3SVC, WAS -ErrorAction SilentlyContinue | Stop-Service -Force -ErrorAction Stop
# No --worker or --internet: SpeedTest uses local fixtures only.
dotnet run --project $env:PROJECT --framework $env:FRAMEWORK --configuration Release --no-build --no-restore 2>&1 | Tee-Object ci-results/console.log
if ($LASTEXITCODE -ne 0) { throw 'Regression checks failed. See console.log.' }
# The runners' flag-only groups. tests/suites.json lists every flag, and the script fails
# when a runner gains one that is not listed, so a new suite cannot go unrun.
- name: Run focused regression suites
if: matrix.suite != ''
env:
SUITE: ${{ matrix.suite }}
FRAMEWORK: ${{ matrix.framework }}
run: |
if (!$env:WINDIR) { $env:WINDIR = $env:SYSTEMROOT }
pwsh -NoProfile -NonInteractive -File ./tests/Run-FocusedSuites.ps1 -Suite $env:SUITE -Framework $env:FRAMEWORK -Configuration Release 2>&1 | Tee-Object ci-results/focused.log
if ($LASTEXITCODE -ne 0) { throw 'Focused suites failed. See focused.log.' }
- name: Check the suite inventory and the PowerShell module contract
if: matrix.name == 'application'
run: |
pwsh -NoProfile -NonInteractive -File ./tests/Release.Tests/PackageChecksum.Tests.ps1
if ($LASTEXITCODE -ne 0) { throw 'Package checksum response contract failed.' }
pwsh -NoProfile -NonInteractive -File ./tests/Run-FocusedSuites.ps1 -CheckOnly
if ($LASTEXITCODE -ne 0) { throw 'tests/suites.json does not match the test runners.' }
$exe = 'bin/Release/net48/KillerScan.exe'
pwsh -NoProfile -File tests/Module/ModuleContract.ps1 -Exe $exe 2>&1 | Tee-Object ci-results/module-pwsh.log
if ($LASTEXITCODE -ne 0) { throw 'Module contract failed on PowerShell 7. See module-pwsh.log.' }
powershell -NoProfile -ExecutionPolicy Bypass -File tests/Module/ModuleContract.ps1 -Exe $exe 2>&1 | Tee-Object ci-results/module-desktop.log
if ($LASTEXITCODE -ne 0) { throw 'Module contract failed on Windows PowerShell 5.1. See module-desktop.log.' }
- name: Retain failure diagnostics and test results
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: ci-${{ matrix.name }}
path: ci-results/
Expand Down
Loading