You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
UncleanExit: Previous session ended without a clean exit (native crash) after ~480s on v1.29.3 #20
UncleanExit: Previous session ended without a clean exit (native crash) after ~480s on v1.29.3
File "app:///out/main/memoryHost.js", line 111, in recordUncleanExit
const err = new Error(
File "app:///out/main/index.js", line 11181, in Object.report
File "app:///out/main/index.js", line 101, in initCrashWatch
if (reported) d.report(reported);
File "app:///out/main/index.js", line 11164
Auto-triage attempted but tests failed under the candidate fix. Human review needed. Log: C:\Users\DavidEngelhart\AppData\Local\termpolis\auto-triage\run-20260721-163423.log
Fixed in v1.32.2 — this was a false positive in the crash detector, not a crash.
The session it reported ran healthily for ~480s and then ended. There was no accompanying native crash report, because there was no native crash. What actually happened is that the app was shut down by something other than its own quit path.
crashWatch writes a marker at boot and clears it on before-quit. That covers the exits we initiate — the user closing the window, Cmd/Alt+F4, app.quit(). It does not cover the exits the OS initiates:
a Windows session end (shutdown / restart / log off / taskkill)
a POSIX termination signal (SIGTERM, SIGINT, SIGHUP)
In both cases the process dies with the marker still on disk, and the next launch reads it and reports a phantom native crash.
Fix (c477566, 54ea1cd):
installCleanExitGuards() in src/main/crashWatch.ts marks a clean exit for an OS session end and for each termination signal.
Signal handlers also call app.quit() explicitly: registering a process.on(SIGxxx) listener replaces Node's default terminate-on-signal, so without it the app would keep running after a kill/taskkill. Quitting through the normal path also keeps before-quit teardown intact.
⚠️session-end is a BrowserWindow event, not an app event (app.on('session-end') doesn't even typecheck). The window is recreated on macOS activate, so the handler re-attaches on every window creation — that detail is what 54ea1cd fixes.
A SIGKILL still can't be caught, and a real native crash still leaves the marker set — those are supposed to be reported and the tests pin that behaviour explicitly. What's gone is the reporting of ordinary OS-initiated shutdowns.
A crash detector that cries wolf is worse than no crash detector, because it trains you to ignore the real ones.
Activity
codedev-david commentedon Jul 21, 2026
Auto-triage attempted but tests failed under the candidate fix. Human review needed. Log:
C:\Users\DavidEngelhart\AppData\Local\termpolis\auto-triage\run-20260721-163423.logv1.32.2 — stop filing environmental non-crashes as production bugs
fix(crashWatch): session-end is a BrowserWindow event, not an app one
codedev-david commentedon Jul 25, 2026
Fixed in v1.32.2 — this was a false positive in the crash detector, not a crash.
The session it reported ran healthily for ~480s and then ended. There was no accompanying native crash report, because there was no native crash. What actually happened is that the app was shut down by something other than its own quit path.
crashWatchwrites a marker at boot and clears it onbefore-quit. That covers the exits we initiate — the user closing the window, Cmd/Alt+F4,app.quit(). It does not cover the exits the OS initiates:taskkill)SIGTERM,SIGINT,SIGHUP)In both cases the process dies with the marker still on disk, and the next launch reads it and reports a phantom native crash.
Fix (
c477566,54ea1cd):installCleanExitGuards()insrc/main/crashWatch.tsmarks a clean exit for an OS session end and for each termination signal.app.quit()explicitly: registering aprocess.on(SIGxxx)listener replaces Node's default terminate-on-signal, so without it the app would keep running after akill/taskkill. Quitting through the normal path also keepsbefore-quitteardown intact.session-endis aBrowserWindowevent, not anappevent (app.on('session-end')doesn't even typecheck). The window is recreated on macOSactivate, so the handler re-attaches on every window creation — that detail is what54ea1cdfixes.A
SIGKILLstill can't be caught, and a real native crash still leaves the marker set — those are supposed to be reported and the tests pin that behaviour explicitly. What's gone is the reporting of ordinary OS-initiated shutdowns.A crash detector that cries wolf is worse than no crash detector, because it trains you to ignore the real ones.