Skip to content

Commit 1bd9ec0

Browse files
committed
docs: update CHANGELOG and ROADMAP after research-driven implementation pass (13 items shipped)
1 parent 42fdfef commit 1bd9ec0

2 files changed

Lines changed: 15 additions & 93 deletions

File tree

CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,21 @@ All notable changes to DeepPurge will be documented in this file.
2323
### Dependencies
2424
- New: `Microsoft.Toolkit.Uwp.Notifications 7.1.3` — Windows 10/11 toast notifications.
2525

26+
### Research-driven additions (competitive analysis pass)
27+
- **Leftover signature database** — embedded JSON database with 50 application profiles (Chrome, Firefox, Adobe, Steam, etc.) for known leftover paths. Signature-matched leftovers are flagged as Safe confidence before heuristic matching runs.
28+
- **Administrator Protection (SMAA) readiness**`UserIdentity` helper resolves the real interactive user's SID and LocalAppData even when running under Windows 11 SMAA elevation. InstalledProgramScanner and DataPaths use the real user's paths.
29+
- **SafetyGuard path-traversal hardening** — paths containing `..` segments are rejected before normalization. 5 new test cases for traversal patterns.
30+
- **Backup file validation**`BackupManager` now validates registry backup content (non-empty, starts with `Windows Registry Editor Version 5.00`). Truncated backups log a warning instead of silently passing.
31+
- **True disk footprint**`InstalledProgram.ActualSizeBytes` computed by walking InstallLocation + AppData + ProgramData paths in parallel. Falls back to registry's EstimatedSizeKB.
32+
- **Hash caching for duplicate finder** — persistent JSON cache keyed by (path, size, mtime). Second scans of the same directories are near-instant.
33+
- **Configurable uninstall timeout** — default increased from 10 to 30 minutes. Settable via `UninstallEngine.UninstallerTimeout` and CLI `--timeout` flag.
34+
- **Winget JSON output**`PackageManagerScanner` tries `winget list --output json` first, falls back to fixed-width table parsing for older winget versions.
35+
- **Orphaned Package Cache scanner**`JunkFilesCleaner` scans `C:\ProgramData\Package Cache\` and flags entries whose parent product is no longer installed.
36+
- **USB device history cleaner** — new trace category in `EvidenceRemover` for USBSTOR registry entries and SetupAPI logs.
37+
- **Free space wipe**`SecureDelete.WipeFreeSpaceAsync()` fills unallocated disk space with random data. Auto-detects SSD vs HDD via WMI MediaType.
38+
- **Recently-installed highlighting** — programs installed in the last 7 days get an accent-colored left border in the Programs DataGrid.
39+
- **IconExtractor WPF decoupling** — moved from Core to App. `InstalledProgram.Icon` changed to `object?`. Core.csproj no longer has `UseWPF=true`.
40+
2641
### Fixed
2742
- `deeppurgecli doctor` now includes suggested fixes for actionable warning/failure paths, including missing system tools, inaccessible registry/shell roots, and unwritable data folders.
2843

ROADMAP.md

Lines changed: 0 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -5,45 +5,8 @@ Blocked items live in `Roadmap_Blocked.md`.
55

66
## Research-Driven Additions
77

8-
### P0 — Trust, reliability, safety
9-
10-
- [ ] P0 — **Leftover signature database**
11-
Why: Uninstalr 2026 benchmark shows most tools find <65% of leftovers. A curated JSON database of known leftover paths per application is the single highest-ROI accuracy improvement.
12-
Evidence: Uninstalr benchmark (BCU 61.3%, Revo Pro 63.1%); Revo's commercial "Logs Database" is their key differentiator; BCU issue #913.
13-
Touches: `Core/Registry/RegistryLeftoverScanner.cs`, `Core/FileSystem/FileLeftoverScanner.cs`, new `Core/Data/LeftoverSignatures.json`
14-
Acceptance: Leftover scanner consults signature DB before heuristic matching. Ship with signatures for top 50 commonly-installed programs.
15-
Complexity: M
16-
17-
- [ ] P0 — **Administrator Protection (SMAA) readiness**
18-
Why: Windows 11 SMAA elevation maps HKCU to a system-managed account, not the real user. InstalledProgramScanner reads HKCU and will return wrong results. DataPaths resolves %LocalAppData% to the SMAA profile.
19-
Evidence: Microsoft developer blog (May 2025); temporarily disabled in retail but will re-enable.
20-
Touches: `Core/Registry/InstalledProgramScanner.cs`, `Core/App/DataPaths.cs`, `Core/Startup/AutorunScanner.cs`, `Core/Privacy/EvidenceRemover.cs`
21-
Acceptance: When running elevated with SMAA active, program list and user data paths resolve to the real user, not the SMAA account. Detect via `WindowsIdentity` token comparison.
22-
Complexity: M
23-
24-
- [ ] P0 — **SafetyGuard path-traversal hardening**
25-
Why: `IsPathSafeToDelete()` normalizes via `Path.GetFullPath()` but doesn't reject `..` segments before normalization. Junction-point edge cases could bypass protection.
26-
Evidence: Code review of `Core/Safety/SafetyGuard.cs`; defensive coding best practice.
27-
Touches: `Core/Safety/SafetyGuard.cs`
28-
Acceptance: Paths containing `..` are rejected before normalization. Add test cases for junction-point traversal patterns.
29-
Complexity: S
30-
31-
- [ ] P0 — **Backup file validation**
32-
Why: `BackupManager.BackupRegistryKey()` only checks reg.exe exit code, not that the .reg file is non-empty and parseable. A truncated backup silently passes.
33-
Evidence: Code review of `Core/Safety/BackupManager.cs`.
34-
Touches: `Core/Safety/BackupManager.cs`
35-
Acceptance: After export, verify file exists, size > 0, and first line matches `Windows Registry Editor Version 5.00`. Log warning on validation failure.
36-
Complexity: S
37-
388
### P1 — High value, competitive differentiation
399

40-
- [ ] P1 — **True disk footprint per program**
41-
Why: Registry `EstimatedSizeKB` is often wildly inaccurate (Adobe showing 20GB for a 3GB install). Users need real numbers.
42-
Evidence: Microsoft Q&A; HN discussion on per-program disk usage; BCU doesn't address this either.
43-
Touches: `Core/Models/InstalledProgram.cs`, `Core/Registry/InstalledProgramScanner.cs`
44-
Acceptance: New `ActualSizeBytes` property computed by walking InstallLocation + AppData + ProgramData paths. Falls back to EstimatedSizeKB when paths are unavailable. Displayed in GUI as a separate column.
45-
Complexity: M
46-
4710
- [ ] P1 — **Orphaned artifact scanner (services, tasks, firewall rules, PATH)**
4811
Why: Uninstalled programs leave orphaned services, scheduled tasks, firewall rules, and PATH entries. No OSS tool covers all four systematically.
4912
Evidence: Community reports of orphaned scheduled tasks ("task image is corrupt"); BCU #890 (shell extension detection gap); forum complaints about orphaned update-checker services.
@@ -65,13 +28,6 @@ Blocked items live in `Roadmap_Blocked.md`.
6528
Acceptance: All `[DllImport]` declarations replaced by CsWin32-generated equivalents. NativeMethods.txt lists each API. Build clean with no hand-rolled structs.
6629
Complexity: L
6730

68-
- [ ] P1 — **Hash caching for duplicate finder**
69-
Why: Full-profile duplicate scans are expensive. Czkawka caches file hashes to disk with (path, size, mtime) for invalidation — second scans are near-instant.
70-
Evidence: Czkawka architecture (31.5k stars); most-upvoted feature pattern in disk-analysis tools.
71-
Touches: `Core/FileSystem/DuplicateFinder.cs`, `Core/App/DataPaths.cs` (cache directory)
72-
Acceptance: Hash cache persisted as JSON in DataPaths. Cache hit when path+size+mtime match. Second scan of same directory completes in <5% of first scan time.
73-
Complexity: S
74-
7531
- [ ] P1 — **Velopack auto-updater**
7632
Why: Current UpdateChecker only detects updates — user must manually download. Velopack provides delta auto-updates from GitHub Releases with PerMachine install mode.
7733
Evidence: Velopack 1.2.0 docs; DriverStoreExplorer ships self-update with SHA256 verification.
@@ -102,57 +58,15 @@ Blocked items live in `Roadmap_Blocked.md`.
10258
Acceptance: Verify tests for MainViewModel state transitions, GridExporter CSV/JSON output, ProgramExporter formats. Snapshot diffs caught in CI.
10359
Complexity: S
10460

105-
- [ ] P2 — **Winget JSON output migration**
106-
Why: `ParseWingetTable()` relies on fixed-width column detection which breaks silently on format changes. Winget 1.8+ supports `--output json`.
107-
Evidence: Code review of `Core/Packages/PackageManagerScanner.cs`; winget CLI docs.
108-
Touches: `Core/Packages/PackageManagerScanner.cs`
109-
Acceptance: Use `winget list --output json` when available (probe version first). Fall back to table parsing for older winget. Add test with sample JSON output.
110-
Complexity: S
111-
112-
- [ ] P2 — **Configurable uninstall timeout**
113-
Why: 10-minute hardcoded timeout fails for Visual Studio, Oracle, and enterprise MSIs.
114-
Evidence: Code review of `Core/Uninstall/UninstallEngine.cs`; enterprise installer behavior.
115-
Touches: `Core/Uninstall/UninstallEngine.cs`, `Core/Safety/DeleteOptions.cs` or settings
116-
Acceptance: Default timeout 30 minutes. Configurable per-program via settings or CLI flag (`--timeout`).
117-
Complexity: S
118-
11961
- [ ] P2 — **System Slimming module**
12062
Why: Wise's unique curated checklist of removable Windows components (wallpapers, sample media, IME packs, help files) with per-item sizes.
12163
Evidence: Wise Program Uninstaller feature; Sophia-Script implements similar tweaks.
12264
Touches: New `Core/Cleaning/SystemSlimmer.cs`, `App/ViewModels/MainViewModel.Extensions.cs`, `App/Views/MainWindow.xaml`
12365
Acceptance: New sidebar panel with checkboxes for ~15 removable Windows components. Each shows current size. Delete through SafetyGuard with dry-run support.
12466
Complexity: S
12567

126-
- [ ] P2 — **Package Cache cleaner**
127-
Why: `C:\ProgramData\Package Cache\` accumulates GBs of orphaned installer caches for uninstalled products.
128-
Evidence: BCU issue #877; user complaints about Package Cache consuming disk.
129-
Touches: `Core/FileSystem/JunkFilesCleaner.cs`
130-
Acceptance: JunkFilesCleaner scans Package Cache for entries whose parent product is uninstalled (cross-reference with installed programs). Show reclaimable size.
131-
Complexity: S
132-
133-
- [ ] P2 — **Free space wipe**
134-
Why: PrivaZer's key feature. Single-pass or multi-pass overwrite of unallocated disk space to prevent forensic recovery of deleted files.
135-
Evidence: PrivaZer feature page; CCleaner Drive Wiper (1/3/7/35 passes).
136-
Touches: `Core/Safety/SecureDelete.cs`
137-
Acceptance: New `WipeFreeSpace(string drivePath)` method. Auto-detects SSD (uses TRIM discard) vs HDD (fills free space with random data then deletes). Progress reporting via IProgress.
138-
Complexity: M
139-
140-
- [ ] P2 — **USB device history cleaner**
141-
Why: USBSTOR registry keys, SetupAPI logs, and device manager traces persist indefinitely. Privacy-conscious users want these cleared.
142-
Evidence: PrivaZer feature; 100+ trace types in PrivaZer vs ~30 in DeepPurge's EvidenceRemover.
143-
Touches: `Core/Privacy/EvidenceRemover.cs`
144-
Acceptance: New trace category for USB history. Cleans HKLM\SYSTEM\CurrentControlSet\Enum\USBSTOR, SetupAPI.dev.log, MountedDevices entries. SafetyGuard validated.
145-
Complexity: S
146-
14768
### P3 — Polish, differentiation
14869

149-
- [ ] P3 — **Recently-modified program highlighting**
150-
Why: Geek Uninstaller's visual cue for newly installed/modified programs. Helps users spot new installs.
151-
Evidence: Geek Uninstaller UX; date-based row styling.
152-
Touches: `App/Views/MainWindow.xaml` (DataGrid row style trigger)
153-
Acceptance: Programs installed/modified within the last 7 days get a subtle accent-colored left border or background tint.
154-
Complexity: S
155-
15670
- [ ] P3 — **Health dashboard**
15771
Why: CCleaner/IObit pattern. Aggregate system hygiene score across Leftovers, Privacy, Disk Space, Startup Impact. One-click remediation entry point.
15872
Evidence: CCleaner Health Check; IObit Software Health (7-point analysis).
@@ -174,13 +88,6 @@ Blocked items live in `Roadmap_Blocked.md`.
17488
Acceptance: Steam (libraryfolders.vdf), Epic (LauncherInstalled.dat), GOG (Galaxy DB) apps appear in the unified programs list with platform badges.
17589
Complexity: M
17690

177-
- [ ] P3 — **IconExtractor WPF decoupling**
178-
Why: Core references WPF solely for IconExtractor's `ImageSource` return type. Prevents non-WPF consumers from using Core.
179-
Evidence: ARCHITECTURE.md notes this as a known coupling; code review confirms single WPF dependency point.
180-
Touches: `Core/Icons/IconExtractor.cs`, `App/ViewModels/MainViewModel.cs`
181-
Acceptance: IconExtractor returns `byte[]` (PNG). App layer converts to `BitmapImage`. Core.csproj drops `UseWPF=true`.
182-
Complexity: S
183-
18491
## Ideas / not committed
18592

18693
Things worth considering but not on a timeline:

0 commit comments

Comments
 (0)