Vague safety claims are unfalsifiable, so here is the full set of conditions and how each is read.
On battery. StayGreen queries the system power status and pauses when the AC line status reports running on battery. There is a subtlety worth mentioning: the app registers for the power-source change notification, but it treats that notification only as a prompt to re-read the authoritative system power status rather than trusting the payload it arrives with, because that payload proved unreliable in practice. The pause reason is recorded as on battery.
Battery Saver on. A separate notification reports Battery Saver state, and when it is on the hold pauses. This fires independently of the AC state — Battery Saver on while plugged in still pauses, because the user or the system has explicitly asked the machine to conserve, and overriding that would be presumptuous. There is a test covering exactly this case.
Lid closed with no monitors. The lid notification is cross-checked against the active monitor count, and only a closed lid with zero monitors pauses. Docked to an external display, the session continues.
The desktop guard. If Windows reports that the system has no battery, all three rules are disabled. Laptop safety logic on a desktop would only produce spurious pauses.
Unknown states never pause. If the AC state has not been determined, that is not treated as being on battery. Defaulting to a pause on missing information would make the app unpredictable on hardware that reports oddly.
A pause is not an off, and that distinction is the whole design. Pausing enters a separate state that remembers you asked to be awake. When the condition clears the hold resumes without intervention. Compare the alternative: a tool that switches off on the first pause leaves you with a machine that silently stopped an hour ago. The tray icon carries this — one colour for holding, another for paused, another for off — so the state is visible without opening the window.
And one thing that is explicitly not detected: temperature. StayGreen reads no thermal state and has no throttling logic. An earlier version displayed a "thermal" pause label for a cause it never actually detected; that was removed, and the app now carries regression tests asserting the interface never claims thermal pausing. If you read that claim about this app anywhere, it is wrong. The three conditions above are the complete list.