feat: zoicware AI parity easy wins + one-click Recommended gaming preset#25
Merged
Conversation
…ns only
Adds the easy-win zoicware items that fit our existing pattern (registry
toggle, service disable) without crossing into the drastic ones we
deliberately skipped (TrustedInstaller manipulation, CBS package removal,
IntegratedServicesRegionPolicySet.json patching, voiceaccess.exe deletion,
custom Windows Update blocker package, modern-app replacement).
Four new monitored AI policy toggles:
- SettingsSearchAiMonitor (ai.settingssearch)
HKCU\SOFTWARE\Policies\Microsoft\Windows\Explorer\DisableSearchBoxSuggestions=1
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\TaskbarCompanion=0
Hides AI search suggestions + the floating Copilot taskbar companion
widget. Indexing itself is untouched.
- AiActionsMonitor (ai.actions)
HKLM\SYSTEM\ControlSet001\Control\FeatureManagement\Overrides\8\
1853569164\EnabledState=1
4098520719\EnabledState=1
Disables right-click AI Actions surface via the documented
FeatureManagement override hive (same feature IDs zoicware uses).
- InputInsightsMonitor (ai.inputinsights)
HKCU\Software\Microsoft\InputPersonalization\RestrictImplicitTextCollection=1
HKCU\Software\Microsoft\input\Settings\InsightsEnabled=0
Per-user opt-out of typing-data harvesting.
- OfficeCopilotMonitor (ai.office)
HKCU\Software\Microsoft\Office\16.0\{Word,Excel}\Options\EnableCopilot=0
HKCU\Software\Microsoft\Office\16.0\OneNote\Options\Copilot\CopilotEnabled=0
HKLM\SOFTWARE\Policies\Microsoft\office\16.0\common\ai\training\general\disabletraining=1
Disables Copilot ribbon + model-training opt-out. ReadCurrent returns
null if Office isn't installed -- no-op on Office-less machines.
Four existing monitors extended with the additional zoicware keys:
- CopilotMonitor: blanks HKCU\...\Shell\BrandedKey\AppAumid (kills the
Win+C launch alias) + sets HKCU\...\BackgroundAccessApplications\
Microsoft.Copilot_8wekyb3d8bbwe\DisabledByUser=1 so the package can't
background-launch even if the UWP is still installed.
- RecallMonitor: adds HKLM\...\WindowsAI\TurnOffSavingSnapshots=1 as a
third disable knob (some Windows builds respect this but not the older
AllowRecallEnablement).
- EdgeAiMonitor: adds HKLM\...\Edge\ComposeInlineEnabled=0 and
AllowBrowsingWithCopilot=0 to cover the in-page Compose box and the
broader "browse with Copilot" workflow.
- NotepadPaintAiMonitor: adds HKCU\...\Applets\Paint\View\
IsSignedUpForTargetingService=0 (opts out of Paint experiment targeting)
and HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Paint\
DisableImageCreator=1 (machine-wide Paint policy so the disable holds
across user accounts and new Paint experiments).
ServiceCatalog adds AarSvc (Agent Activation Runtime Service), the per-user
agent runtime backing Copilot voice and certain shell AI surfaces. Fits the
existing service tab pattern; users would disable it alongside WSAIFabricSvc
after flipping the AI policy toggles. We disable the template service
definition (not sc.exe delete like zoicware) so the change is reversible
via Set-Service.
All defaults remain Windows-friendly: DesiredOn=true and Monitor=false on
every new pref, so existing config.json loads with zero behavior change.
SettingDocs gets Mechanism / VerifyCommand / ApplyCommand entries for every
new id; SettingDocsCatalog gets full rich-doc entries (What / Why /
HowItHelps / Scenarios / Recommended / Risks / ReversibleVia) so the in-app
Learn more expander and docs/SETTINGS-REFERENCE.md surface them the same
way as the original AI toggles. README updated to list the new toggles in
the Windows AI feature blurb.
Items deliberately not added (with rationale):
- AI Voice Effects (HKLM audio registry) -- requires TrustedInstaller
ownership change to write the audio key. Too invasive.
- Voice Access disable -- requires deleting voiceaccess.exe via
TrustedInstaller. Accessibility tool + file deletion = no.
- Gaming Copilot disable -- zoicware modifies profileDataSettings.txt in
the Game Bar package folder. JSON-in-app-data is fragile across updates.
- Photos AI flags -- live in Settings.dat binary blob. Reading/writing
LocalSettings.dat is undocumented and breaks across major Photos updates.
- HKCR\.copilot deletion -- global file extension change, blast radius
larger than the benefit.
- sc.exe delete WSAIFabricSvc / sc.exe delete AarSvc -- we Disable
startup type instead (reversible via Set-Service).
- LastConfiguration key deletion -- can break Windows AI initialization
on subsequent OS updates.
Tests: 133/133 passing (was 108). New tests cover GlobalPreferences having
all 9 AI toggles, every new settingId has Mechanism/Verify/Apply entries,
extended monitors list the new keys in their mechanism doc, AarSvc is in
ServiceCatalog. Catalog<->doc consistency test still passes after
regenerating SETTINGS-REFERENCE.md.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
| } | ||
| return !allDisabled; | ||
| } | ||
| catch { return null; } |
| bool off = restrict == 1 && insights == 0; | ||
| return !off; | ||
| } | ||
| catch { return null; } |
| ikey.SetValue(InputSettingsVal, 0, RegistryValueKind.DWord); | ||
| } | ||
| } | ||
| catch { } |
| ikey.SetValue(InputSettingsVal, 0, RegistryValueKind.DWord); | ||
| } | ||
| } | ||
| catch { } |
| } | ||
| } | ||
| catch { /* HKCU writes shouldn't fail; swallow to keep apply pass alive */ } | ||
| catch { /* HKCU writes shouldn't fail; HKLM may UAC-fail and we swallow to keep the batch alive */ } |
| else | ||
| ElevatedRegistry.SetHklmDword(TrainingKey, TrainingVal, 1); | ||
| } | ||
| catch { } |
| else | ||
| ElevatedRegistry.SetHklmDword(TrainingKey, TrainingVal, 1); | ||
| } | ||
| catch { } |
| bool off = disable == 1 && companion == 0; | ||
| return !off; | ||
| } | ||
| catch { return null; } |
| advanced.SetValue(TaskbarCompanionVal, 0, RegistryValueKind.DWord); | ||
| } | ||
| } | ||
| catch { } |
| advanced.SetValue(TaskbarCompanionVal, 0, RegistryValueKind.DWord); | ||
| } | ||
| } | ||
| catch { } |
Adds a "Apply recommended" button at the top of the General tab that
stages GamerGuardian's gaming-optimized preset across every setting it
knows about. One click = full setup: Want = recommended, Monitor on,
Auto-apply silently on.
Idempotent: re-running after a future GamerGuardian update that adds new
preset-managed settings only stages the deltas; everything already in the
recommended state is reported as "already correct" and skipped. Run-twice
returns SettingsChanged=0.
Scope (in the preset):
- 10 global gaming toggles (Game Mode, Game DVR off, HAGS, VRR,
System Responsiveness gaming, Network Throttling disabled, USB
Selective Suspend disabled, Games Task Profile boosted, Mouse
Precision off, Fullscreen Optimizations on)
- 9 Windows AI toggles (all off: Copilot, Recall, Click-to-Do, Edge AI,
Notepad/Paint AI, Settings Search AI, AI Actions, Input Insights,
Office Copilot)
- Power plan: High Performance (only if the well-known GUID is installed
locally; custom plans are left alone)
- Every service with a ServiceDefinition.RecommendedTarget set
- Per-display HDR + RefreshRate (Maximum) -- AutoApply pinned on
Explicitly NOT in the preset (with rationale):
- Memory Integrity / VBS: security toggle; some anti-cheat needs it on.
Users flip it individually if they want.
- UWP AI app removal (Microsoft.Copilot etc.): irreversible without the
Microsoft Store. The policy toggle is enough to silence Copilot.
- Display resolution: too display-specific to push a default.
UX: clicking the button mutates the draft (not the live config -- same
staged-apply pattern), bumps _pendingCount so Save&close doesn't
short-circuit, rebuilds the row collections so every tab reflects the
preset, then pops a summary dialog with the counts. Each change is logged
to changes.log via the standard ChangeLogger.LogPreferenceChange with
source="preset" so the audit trail is complete.
Tests: 10 new tests cover fresh-config full-apply, AI toggles all turn off,
MemoryIntegrity not touched, idempotence, partial-state minimal-delta,
service targets honored, multi-display HDR+refresh, null draft throws,
UWP removal stays opt-in, ChangeDescriptions matches SettingsChanged count.
143/143 passing (was 133).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment on lines
+82
to
+91
| foreach (var def in ServiceCatalog.All) | ||
| { | ||
| if (def.RecommendedTarget is not { } target) continue; | ||
| if (!draft.Services.TryGetValue(def.Name, out var pref) || pref is null) | ||
| { | ||
| pref = new ServicePref(); | ||
| draft.Services[def.Name] = pref; | ||
| } | ||
| Count(SetService(pref, $"Service: {def.DisplayName}", target, changes)); | ||
| } |
| private static IDictionary<Guid, string> SafeListPlans() | ||
| { | ||
| try { return Monitors.PowerPlanMonitor.ListAvailablePlans(); } | ||
| catch { return new Dictionary<Guid, string>(); } |
Comment on lines
+960
to
+965
| catch (Exception ex) | ||
| { | ||
| System.Windows.MessageBox.Show(this, "Recommended preset failed: " + ex.Message, | ||
| "GamerGuardian", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); | ||
| return; | ||
| } |
Comment on lines
+105
to
+113
| foreach (var def in ServiceCatalog.All) | ||
| { | ||
| if (def.RecommendedTarget is not { } target) continue; | ||
| Assert.True(cfg.Services.ContainsKey(def.Name), $"Missing service pref entry: {def.Name}"); | ||
| var pref = cfg.Services[def.Name]; | ||
| Assert.Equal(target, pref.Desired); | ||
| Assert.True(pref.Monitor); | ||
| Assert.True(pref.AutoApply); | ||
| } |
| foreach (var def in ServiceCatalog.All) | ||
| { | ||
| if (def.RecommendedTarget is not { } target) continue; | ||
| Assert.True(cfg.Services.ContainsKey(def.Name), $"Missing service pref entry: {def.Name}"); |
Comment on lines
+153
to
+160
| foreach (var pkg in WindowsAiAppCatalog.All) | ||
| { | ||
| if (cfg.WindowsAiApps.TryGetValue(pkg.PackageName, out var pref)) | ||
| { | ||
| Assert.False(pref.DesiredRemoved, | ||
| $"Preset should never auto-stage UWP removal for {pkg.PackageName}"); | ||
| } | ||
| } |
…ion header
Three bugs surfaced by a user report on the v0.1.39 dev build:
1. The "Search box AI suggestions + taskbar companion" toggle had
Auto-apply silently ticked, yet the drift popup kept firing every
tick. Root cause: SettingsSearchAiMonitor.ReadCurrent used strict
AND on (DisableSearchBoxSuggestions == 1 AND TaskbarCompanion == 0),
but verifying on the user's machine showed:
HKCU\...\Policies\...\Explorer\DisableSearchBoxSuggestions = 1
HKCU\...\Advanced\TaskbarCompanion = VALUE MISSING
Explorer apparently ignores the non-standard TaskbarCompanion value
name and never persists it. ReadCurrent kept reporting "on" because
`companion == 0` was false (companion was null). Verify failed every
tick -> 15-min backoff -> drift item promoted to the notification
queue every cycle. Fix: treat companion as off when null OR 0; only
companion == 1 counts as "still on". The primary DisableSearchBox-
Suggestions value remains the authoritative signal.
2. The notification window's header was hard-coded "Display settings
have drifted" -- a holdover from when only HDR/Refresh were
monitored. With Windows AI, services, and global gaming all in the
monitor list, the message was actively wrong for most drifts.
Replaced with NotificationHeader.For(report) that picks a category-
appropriate header based on the drift items' DisplayKey (global
gaming / Windows AI / Windows service / Display / mixed-count
fallback). Extracted into Services/NotificationHeader.cs so it can
be unit-tested without standing up a WPF window.
3. MonitorService.TickAsync had a spurious `_store.Save(config)` after
the CheckDrift loop. Nothing in the tick mutates config, so the save
was a no-op -- except it raced with the user clicking Apply in
Settings: if the user's save landed between MonitorService's Load
and Save, MonitorService's save overwrote the user's prefs (silently
dropping any newly-added AppConfig properties, e.g. the v0.1.39
Windows AI prefs that don't exist in stale snapshots). This is why
the user's config.json showed zero AI prefs even after they clicked
Apply Recommended + Apply. Removed the save with a comment.
Tests: 10 new NotificationHeader tests cover empty/null report, single
category labeling (AI, service, display, global), pluralization, mixed-
category fallback, unknown-category graceful fallback. The fix to
SettingsSearchAi.ReadCurrent is verified manually against the user's
known-broken state -- a unit test would need registry mocking we don't
currently have. 153/153 passing (was 143). Release + Debug builds clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 tasks
fix: silent-apply popup + race-write + notification header
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.
Two-commit feature stack.
5dbe9a1 — closer parity with zoicware/RemoveWindowsAI
4 new monitored AI policy toggles + 4 existing monitors extended + AarSvc service. See commit body for the full registry-key list and the rationale for everything we deliberately skipped (TrustedInstaller, CBS surgery, file deletion, etc.).
a279aac — one-click Recommended gaming preset
New button at the top of the General tab. One click stages GamerGuardian's gaming preset across every setting it knows about: sets the recommended Want value, turns Monitor on, turns Auto-apply silently on. Idempotent — re-running after a future update only stages the new deltas; everything already in the recommended state is reported as "already correct" and skipped.
Preset scope:
Deliberately NOT in the preset: Memory Integrity (security tradeoff), UWP AI app removal (irreversible without the Store), display resolution (too display-specific).
Each preset-induced change is logged to changes.log via ChangeLogger.LogPreferenceChange with source="preset".
Test plan
main)🤖 Generated with Claude Code