Repository navigation
fix: review findings before 0.4.9 - #67
Merged
Merged
Conversation
… next The run screen cleared `aborting` only when it was drawn without a run going, which never happens: follow_run moves to the results as soon as a run has ended. After one Abort, every later run in the session showed "Stopping and putting the card back..." instead of the button. follow_run now forgets the Abort when it follows a new run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tock
- All in one: every way out after the card was touched now ends at stock
and says so ("-- card at stock" / "-- reset to stock FAILED"), as the fan
step already did. The overclock failing, its save failing, an Abort in
step 2 or 3 and an unreadable profile all used to leave the window to
claim "The card is back at stock." without checking.
- An Abort in All in one step 2 now shows the calm "Stopped" page instead
of a red fault with a request for a problem report.
- An aborted driver retest whose reset to stock failed says so, instead of
only "You stopped the test."
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- "Close that program, then click Apply saved tune" shows only when that tune can be applied here (same card and driver), and without administrator rights it says to restart as administrator first. - During the app's own run the offsets under test read as what the run is testing, not as "Set by another program". - A link in a log line gets a line of its own, as on the Results page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tray and log: - Tray Re-apply and Revert show their balloon again after the session's note list is full (100 notes): a counter, not the list's size, tells whether they noted something. - The several-GPU refusal at logon is no longer listed twice in the log. - The dead WM_COMMAND cases for the tray commands are gone; tray_menu handles them itself since TPM_RETURNCMD. Security (from the pre-0.4.9 review): - An elevated copy outside Program Files restarts itself (after an update or a driver fault) through a UAC prompt instead of passing its rights on silently: in the folder the zip was unpacked to, any program of the user could have swapped the exe. - pdh.dll and bcrypt.dll are delay-loaded like the other non-KnownDLLs, so they resolve from System32 only. The link options both executables share are in one target, gao_exe_link. - An update unpacks only gao.exe and GpuAutoOptimizer.exe from the zip. Cleanup: - Removed stock_point_for (no caller), kIconStop (unused) and two tests that checked a literal against itself and std::function. - One kTrayWindowClass for gao and the tray app; gao --curve-flatten uses kAlreadyRunning; --optimize parses its preset with preset_from_name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The previous commit restarted such a copy through "runas", but Windows does not ask again when the process asking is already elevated: the new copy got the rights silently, as before. Now a copy that is elevated and not in Program Files does not start itself again at all: - after an update it says "Updated to version X. Close GPU Auto Optimizer and start it again to use it." and keeps running; - after a driver library fault it writes that to boot.log and closes. The copy in Program Files (the one apply-at-logon runs) and unelevated copies restart as before. Also: an aborted retest whose reset failed but whose earlier tune was put back no longer shows the red "FAILED" line next to "Your saved tune is on the card again", and the em dash in a CMakeLists.txt comment is restored. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The WinHTTP timeouts are per call, so a connection that keeps sending a few bytes at a time could hold an update, and with it Exit and the restart after a driver fault, for as long as it liked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hooks - saved_tune_for() replaces the three copies of load + decide_boot + decision_text in --apply, the window's Apply and the undervolt on the saved tune. - own_exe() and runas_self() replace five hand-written GetModuleFileNameW calls and two runas blocks. - The CLI runs share cli_hooks() and after_tune(). - Objectives::power is gone: it was true wherever it was read. - The About page names api.github.com, the host the app contacts. - docs/development.md states when an elevated copy does not restart. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 of 2 tasks
This was referenced Nov 4, 2026
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.
Why
Before 0.4.9 the changes since v0.4.8 (#62, #65, #66) got a correctness review, the updater and elevation got a security review, and the whole repo got an over-engineering audit. This PR fixes what they found that is safe to fix without a hardware test. A second review of this branch found that the first restart fix did not work (an elevated process gets no UAC prompt for "runas"); the last commit replaces it.
What
Bugs (all in code that is not released yet)
follow_runnow forgets the Abort when it follows a new run. Test added.Security
pdh.dllandbcrypt.dllare delay-loaded like the other non-KnownDLLs, so they resolve from System32 only (checked withdumpbin /dependents). Both executables share onegao_exe_linktarget for these link options.gao.exeandGpuAutoOptimizer.exe.Cleanup
stock_point_for(no caller),kIconStop, the dead trayWM_COMMANDcases, and two tests that checked a literal against itself andstd::function.kTrayWindowClass;--curve-flattenuseskAlreadyRunning;--optimizeparses its preset withpreset_from_name.Not in this PR
run_optimizeandrun_undervoltcopy (their crash paths have drifted): it needs adxcap -forcetdrcheck under both runs.Tests
cmake --workflow --preset ci: builds with/W4 /WX; core_tests and app_tests pass.gao --statusandGpuAutoOptimizer.exe --demostart (delay-loaded DLLs resolve).Added after the first review round
saved_tune_for()for--apply, the window's Apply and the undervolt on the saved tune; oneown_exe()/runas_self(); shared CLI hooks;Objectives::powerremoved (audit 4, 8, 9, 10).api.github.com;docs/development.mdstates when an elevated copy does not restart.🤖 Generated with Claude Code