Skip to content

Backstop: exit early when there is nothing to undo - #108

Merged
krishhgg merged 1 commit into
krishhgg:mainfrom
salvcy:perf/backstop-idle-fast-path
Oct 17, 2026
Merged

krishhgg merged 1 commit into
krishhgg:mainfrom
salvcy:perf/backstop-idle-fast-path

Conversation

@salvcy

@salvcy salvcy commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

What this fixes

The recovery agent runs backstop.sh every 60 seconds, all day, whether or not Insomnia is in use. The app never removes state.json, so after your first session every one of those runs takes the lock and checks a clean journal key by key with plutil, just to find out there is nothing to do.

On my MacBook that is 38 processes and about 106 ms of CPU, every minute.

The change

When there is no session.json and state.json is exactly the clean journal the app writes, the script now exits 0 right away: before the lock, without starting a process.

Idle run Processes CPU
Before 38 ~106 ms
After 0 ~2 ms

The agent's own sh and codesign check come on top in both cases. I measured by tracing the script with bash -x in a throwaway INSOMNIA_HOME and timing 30 runs.

Everything else takes the full run exactly as before: any other journal (even one extra key, or the same keys in another order), any session.json, and --force.

Why skipping the lock is safe

The app publishes both files with a single rename, so a read never sees half a file. And when those two files say "no session, nothing journaled", there is nothing to undo whichever side of a transaction the read lands on. The full run would wait for the lock and then exit 0 from the same files.

It also skips tighten. install.sh (which runs with --force) and every non-idle run still do it.

Tests

Three new tests in RecoveryScriptTests. They hold the recovery lock and check that the idle run still returns 0, while every near miss waits for the lock and exits 75. They fail on main.

swift test on this branch: 1,237 tests, 0 failures, 13 skipped (no tmux on this Mac). /bin/bash -n passes under 3.2. I don't have ShellCheck here, so CI is the first lint.

On a real Mac

MacBook (Apple silicon), macOS 27.0.1 (26A434), installed with scripts/install.sh:

  • I started a session, extended it and ended it by hand, then ran a 5-minute session to its timer end. Both times state.json came back byte for byte as the clean journal.
  • After each, the installed script exited 0 with no process started. During the session it took the full run (28 processes, exit 0), as before.
  • launchctl print showed 11 runs of the agent with last exit code 0, and the backstop wrote nothing to insomnia.log.

The build I installed was this branch plus #93, #102, #61, #74, #101 and #68, because I need #93 to use the app on macOS 27. So its backstop.sh also carries #102's change. Not tried on macOS 26.

RetriggerView in GreptileConfidence Score: 5/5

The PR appears safe to merge; no actionable issues were found.

Summary

backstop.sh now exits before taking the lock when no session exists and the journal exactly matches the app's clean output.

  • Idle recovery runs now exit before taking the lock.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[Backstop starts] --> B{Not forced, no session, regular journal?}
  B -- No --> E[Take recovery lock]
  B -- Yes --> C[Read journal with shell builtin]
  C --> D{Exact clean tokens and no NUL?}
  D -- Yes --> F[Exit 0 without changes]
  D -- No --> E
  E --> G[Run existing recovery checks]
Loading

Reviews (3) · Last reviewed commit: "Backstop: exit early when there is nothi..." · Reviewed by Greptile

@salvcy
salvcy force-pushed the perf/backstop-idle-fast-path branch from f5a2765 to f1a3394 Compare October 13, 2026 04:43
@salvcy
salvcy marked this pull request as ready for review October 13, 2026 05:04
launchd runs backstop.sh every 60 s. The app never removes state.json, so
after the first session every run between sessions takes the lock and
checks a clean journal key by key with plutil: 38 processes and about
106 ms of CPU each time, on a MacBook with macOS 27.0.1.

With no session.json and a state.json that is exactly the clean journal
the app writes, the script now exits 0 before the lock, without starting
a process (about 2 ms). Any other journal, any session.json and --force
take the full run as before.
@salvcy
salvcy force-pushed the perf/backstop-idle-fast-path branch from f1a3394 to 3dfc607 Compare October 13, 2026 14:35
@salvcy

salvcy commented Oct 13, 2026

Copy link
Copy Markdown
Contributor Author

Real-Mac evidence for 3dfc607

Build

A clean checkout of the head commit, nothing else applied, installed with ./scripts/install.sh.

$ git rev-parse HEAD
3dfc607e18f9e35a2cb065dbb076dc88b9e5924a
$ git status --short

git status --short printed nothing. The installed backstop.sh is byte for byte scripts/backstop.sh at that commit, and the LaunchAgent pins cdhash H"a17c18ac6a1af7a2c8580c007baa6d652ae2389e".

Mac

$ sw_vers
ProductName:		macOS
ProductVersion:		27.0.1
BuildVersion:		26A434
$ sysctl -n hw.model
Mac17,9
$ sysctl -n machdep.cpu.brand_string
Apple M5 Pro

On battery (41% down to 37%), lid open, on a desk. Log times are UTC. The pmset samples are local time (CDT, five hours behind).

Checks

1. The recovery agent between sessions (the item this PR adds): pass

A 60 s session ended on its timer at 15:07:51Z. That left no session.json and the app's clean journal. Over the next 3 min 23 s launchd ran the agent 4 times, each exiting 0. The backstop wrote nothing to the log and state.json did not change. A traced run of the installed script started no programs.

Raw output
$ ls session.json
~/Library/Application Support/Insomnia/session.json: No such file or directory
$ cat state.json
{
  "appNapOverrides" : [

  ],
  "dockerFrozen" : false,
  "frozenProcesses" : [

  ],
  "lowPowerSetByUs" : false,
  "savedAudioOutputs" : [

  ],
  "sleepDisabledByUs" : false
}
state.json is the app's clean journal byte for byte: yes
 SleepDisabled		0
 powermode            0
$ idle window opens
15:08:23Z
	runs = 31
	last exit code = 0
state.json mtime 10:07:51 local  size 180
5fe63cfa26224e96
$ idle window closes
15:11:46Z
	runs = 35
	last exit code = 0
state.json mtime 10:07:51 local  size 180
5fe63cfa26224e96
$ lines in insomnia.log after the session end (15:07:51Z)
(end)
$ /bin/bash -x backstop.sh, external programs started
exit=0  programs=0  last line: + exit 0

2. Normal end at the deadline: pass, twice

Sessions of 60 s at 14:37:49Z and 15:06:56Z both ended on their timers. SleepDisabled read 1 during each and 0 after.

Raw output
2026-10-13T14:37:49Z [info] insomnia: session started until 2026-10-13T14:38:44Z (60s requested)
2026-10-13T14:37:49Z [info] insomnia: lid observer started (lid open)
2026-10-13T14:37:49Z [error] insomnia: notification authorization failed: Notifications are not allowed for this application
2026-10-13T14:37:49Z [info] insomnia: notification authorization denied
2026-10-13T14:37:49Z [info] insomnia: power monitor started (battery 41%, on battery, thermal nominal)
2026-10-13T14:37:49Z [info] insomnia: throttled browsers: Google Chrome
2026-10-13T14:37:49Z [info] insomnia: wifi interface en0
2026-10-13T14:37:49Z [info] insomnia: network failover started (wifi en0)
2026-10-13T14:38:44Z [info] insomnia: session end (timer)
2026-10-13T14:38:44Z [info] insomnia: sleep restored
2026-10-13T14:38:44Z [info] insomnia: notify: Session ended - Time is up. Sleep is back to normal.
...
2026-10-13T15:06:56Z [info] insomnia: session started until 2026-10-13T15:07:50Z (60s requested)
2026-10-13T15:06:56Z [info] insomnia: lid observer started (lid open)
2026-10-13T15:06:56Z [error] insomnia: notification authorization failed: Notifications are not allowed for this application
2026-10-13T15:06:56Z [info] insomnia: notification authorization denied
2026-10-13T15:06:56Z [info] insomnia: power monitor started (battery 38%, on battery, thermal nominal)
2026-10-13T15:06:56Z [info] insomnia: throttled browsers: Google Chrome
2026-10-13T15:06:56Z [info] insomnia: wifi interface en0
2026-10-13T15:06:56Z [info] insomnia: network failover started (wifi en0)
2026-10-13T15:06:56Z [info] insomnia: low power mode on
2026-10-13T15:06:56Z [info] insomnia: notify: Low Power Mode on - Battery at 38%, below the 40% floor.
2026-10-13T15:07:51Z [info] insomnia: session end (timer)
2026-10-13T15:07:51Z [info] insomnia: sleep restored
2026-10-13T15:07:51Z [info] insomnia: low power mode cleared
2026-10-13T15:07:51Z [info] insomnia: notify: Session ended - Time is up. Sleep is back to normal.

pmset samples, changes only (local time):
09:36:12  SleepDisabled 0  powermode 0
09:37:47  SleepDisabled 1  powermode 0
09:38:48  SleepDisabled 0  powermode 0
09:39:08  SleepDisabled 1  powermode 0
09:42:30  SleepDisabled 0  powermode 0
10:06:51  SleepDisabled 1  powermode 0
10:06:56  SleepDisabled 1  powermode 1
10:07:11  SleepDisabled 1  powermode 2
10:07:16  SleepDisabled 1  powermode 0
10:07:51  SleepDisabled 0  powermode 0

3. Force-quit, then recovery by the agent at the deadline: pass

A 180 s session started at 14:39:12Z. I ran kill -9 on the app at 14:39:29Z. The deadline was 14:42:06Z. The agent restored sleep at 14:42:26Z and cleared the journal, and the next sample read SleepDisabled 0.

Raw output
UTC 2026-10-13T14:39:29Z
local 09:39:29 CDT
$ cat session.json
{
  "endsAt" : "2026-10-13T14:42:06Z",
  "extensions" : [

  ],
  "startedAt" : "2026-10-13T14:39:06Z"
}
$ cat state.json
{
  "appNapOverrides" : [

  ],
  "dockerFrozen" : false,
  "frozenProcesses" : [

  ],
  "lowPowerSetByUs" : false,
  "savedAudioOutputs" : [

  ],
  "sleepDisabledByUs" : true
}
$ pmset -g | grep SleepDisabled
 SleepDisabled		1
$ launchctl print ... (before force-quit)
	runs = 3
	last exit code = 0
	run interval = 60 seconds
$ pgrep -x Insomnia
14356
14356 Tue Oct 13 09:37:27 2026     ~/Applications/Insomnia.app/Contents/MacOS/Insomnia
$ kill -9 14356   # 14:39:29Z
kill exit status 0
$ pgrep -x Insomnia (after)
(no process)

2026-10-13T14:39:12Z [info] insomnia: session started until 2026-10-13T14:42:06Z (180s requested)
2026-10-13T14:39:12Z [info] insomnia: lid observer started (lid open)
2026-10-13T14:39:12Z [info] insomnia: power monitor started (battery 41%, on battery, thermal nominal)
2026-10-13T14:39:12Z [info] insomnia: throttled browsers: Google Chrome
2026-10-13T14:39:12Z [info] insomnia: wifi interface en0
2026-10-13T14:39:12Z [info] insomnia: network failover started (wifi en0)
2026-10-13T14:42:25Z [info] backstop: session expired (endsAt=2026-10-13T14:42:06Z); restoring from journal
2026-10-13T14:42:26Z [info] backstop: pmset -a disablesleep 0 ok
2026-10-13T14:42:26Z [info] backstop: journal cleared

UTC 14:42:48Z
$ ls session.json
~/Library/Application Support/Insomnia/session.json: No such file or directory
$ cat state.json   (as the backstop published it)
{"appNapOverrides":[],"dockerFrozen":false,"lowPowerSetByUs":false,"sleepDisabledByUs":false,"savedAudioOutputs":[],"frozenProcesses":[]}
$ launchctl print | grep
	runs = 6
	last exit code = 0
$ bash -x backstop.sh | count of external programs (a manual idle run on the journal the backstop left)
exit=0  execs=41

UTC 14:43:39Z  relaunched
15695 Insomnia
2026-10-13T14:43:36Z [info] insomnia: launched
2026-10-13T14:43:36Z [info] insomnia: reconcile: no session, nothing to restore
state.json after relaunch:
{"appNapOverrides":[],"dockerFrozen":false,"lowPowerSetByUs":false,"sleepDisabledByUs":false,"savedAudioOutputs":[],"frozenProcesses":[]}

One limit this run showed

When the agent does the undo itself, it republishes state.json with the keys in plutil's order, not the app's. The early exit only matches the app's order. So from that recovery until the next session started (14:42:26Z to 15:06:56Z) each idle run took the full path: 41 programs in a traced run, exit 0. launchd ran it about once a minute in that stretch (the run count went from 6 to 30), always exit 0, with nothing logged. The next session start rewrote the journal, and the early exit applied again (check 1).

I kept the match exact on purpose. If you would rather it accept the keys in any order, I can do that.

Also seen, not part of this change

During the third session Insomnia switched Low Power Mode on at the 40% floor (battery was at 38%). I then changed the energy mode by hand, which is the powermode 1, 2, 0 in the samples between 10:07:06 and 10:07:16 local. At the end the app logged "low power mode cleared".

Not run

  • Repeated Quit, and a retry after a failed recovery.
  • Reboot or login with an active or dirty journal.
  • Unreadable session.json, resuming a frozen process, App Nap, and a sudo pmset left running.
  • Anything with the lid closed.
  • macOS 26.

Each of the recovery cases above has a session.json or a journal with something in it, so the new block is skipped. RecoveryScriptTests covers that boundary.

pmset -g log | grep -E ' (Sleep|Wake|DarkWake) ' has no lines between 09:36 and 10:12 local, so the Mac did not sleep during the run.

insomnia.log for the whole run
2026-10-13T14:37:28Z [info] insomnia: startup lid state open
2026-10-13T14:37:28Z [info] insomnia: startup battery 41%
2026-10-13T14:37:28Z [info] insomnia: startup thermal state nominal
2026-10-13T14:37:28Z [info] insomnia: launched
2026-10-13T14:37:28Z [info] insomnia: wifi interface en0
2026-10-13T14:37:28Z [info] insomnia: reconcile: no session, nothing to restore
2026-10-13T14:37:49Z [info] insomnia: session started until 2026-10-13T14:38:44Z (60s requested)
2026-10-13T14:37:49Z [info] insomnia: lid observer started (lid open)
2026-10-13T14:37:49Z [error] insomnia: notification authorization failed: Notifications are not allowed for this application
2026-10-13T14:37:49Z [info] insomnia: notification authorization denied
2026-10-13T14:37:49Z [info] insomnia: power monitor started (battery 41%, on battery, thermal nominal)
2026-10-13T14:37:49Z [info] insomnia: throttled browsers: Google Chrome
2026-10-13T14:37:49Z [info] insomnia: wifi interface en0
2026-10-13T14:37:49Z [info] insomnia: network failover started (wifi en0)
2026-10-13T14:38:44Z [info] insomnia: session end (timer)
2026-10-13T14:38:44Z [info] insomnia: sleep restored
2026-10-13T14:38:44Z [info] insomnia: notify: Session ended - Time is up. Sleep is back to normal.
2026-10-13T14:39:12Z [info] insomnia: session started until 2026-10-13T14:42:06Z (180s requested)
2026-10-13T14:39:12Z [info] insomnia: lid observer started (lid open)
2026-10-13T14:39:12Z [info] insomnia: power monitor started (battery 41%, on battery, thermal nominal)
2026-10-13T14:39:12Z [info] insomnia: throttled browsers: Google Chrome
2026-10-13T14:39:12Z [info] insomnia: wifi interface en0
2026-10-13T14:39:12Z [info] insomnia: network failover started (wifi en0)
2026-10-13T14:42:25Z [info] backstop: session expired (endsAt=2026-10-13T14:42:06Z); restoring from journal
2026-10-13T14:42:26Z [info] backstop: pmset -a disablesleep 0 ok
2026-10-13T14:42:26Z [info] backstop: journal cleared
2026-10-13T14:43:36Z [info] insomnia: startup lid state open
2026-10-13T14:43:36Z [info] insomnia: startup battery 40%
2026-10-13T14:43:36Z [info] insomnia: startup thermal state nominal
2026-10-13T14:43:36Z [info] insomnia: launched
2026-10-13T14:43:36Z [info] insomnia: wifi interface en0
2026-10-13T14:43:36Z [info] insomnia: reconcile: no session, nothing to restore
2026-10-13T15:06:56Z [info] insomnia: session started until 2026-10-13T15:07:50Z (60s requested)
2026-10-13T15:06:56Z [info] insomnia: lid observer started (lid open)
2026-10-13T15:06:56Z [error] insomnia: notification authorization failed: Notifications are not allowed for this application
2026-10-13T15:06:56Z [info] insomnia: notification authorization denied
2026-10-13T15:06:56Z [info] insomnia: power monitor started (battery 38%, on battery, thermal nominal)
2026-10-13T15:06:56Z [info] insomnia: throttled browsers: Google Chrome
2026-10-13T15:06:56Z [info] insomnia: wifi interface en0
2026-10-13T15:06:56Z [info] insomnia: network failover started (wifi en0)
2026-10-13T15:06:56Z [info] insomnia: low power mode on
2026-10-13T15:06:56Z [info] insomnia: notify: Low Power Mode on - Battery at 38%, below the 40% floor.
2026-10-13T15:07:51Z [info] insomnia: session end (timer)
2026-10-13T15:07:51Z [info] insomnia: sleep restored
2026-10-13T15:07:51Z [info] insomnia: low power mode cleared
2026-10-13T15:07:51Z [info] insomnia: notify: Session ended - Time is up. Sleep is back to normal.
All pmset samples (427, every 5 s, sampler from CONTRIBUTING.md)
09:36:12
 SleepDisabled		0
 powermode            0
09:36:17
 SleepDisabled		0
 powermode            0
09:36:22
 SleepDisabled		0
 powermode            0
09:36:27
 SleepDisabled		0
 powermode            0
09:36:32
 SleepDisabled		0
 powermode            0
09:36:37
 SleepDisabled		0
 powermode            0
09:36:42
 SleepDisabled		0
 powermode            0
09:36:47
 SleepDisabled		0
 powermode            0
09:36:52
 SleepDisabled		0
 powermode            0
09:36:57
 SleepDisabled		0
 powermode            0
09:37:02
 SleepDisabled		0
 powermode            0
09:37:07
 SleepDisabled		0
 powermode            0
09:37:12
 SleepDisabled		0
 powermode            0
09:37:17
 SleepDisabled		0
 powermode            0
09:37:22
 SleepDisabled		0
 powermode            0
09:37:27
 SleepDisabled		0
 powermode            0
09:37:32
 SleepDisabled		0
 powermode            0
09:37:37
 SleepDisabled		0
 powermode            0
09:37:42
 SleepDisabled		0
 powermode            0
09:37:47
 SleepDisabled		1
 powermode            0
09:37:53
 SleepDisabled		1
 powermode            0
09:37:58
 SleepDisabled		1
 powermode            0
09:38:03
 SleepDisabled		1
 powermode            0
09:38:08
 SleepDisabled		1
 powermode            0
09:38:13
 SleepDisabled		1
 powermode            0
09:38:18
 SleepDisabled		1
 powermode            0
09:38:23
 SleepDisabled		1
 powermode            0
09:38:28
 SleepDisabled		1
 powermode            0
09:38:33
 SleepDisabled		1
 powermode            0
09:38:38
 SleepDisabled		1
 powermode            0
09:38:43
 SleepDisabled		1
 powermode            0
09:38:48
 SleepDisabled		0
 powermode            0
09:38:53
 SleepDisabled		0
 powermode            0
09:38:58
 SleepDisabled		0
 powermode            0
09:39:03
 SleepDisabled		0
 powermode            0
09:39:08
 SleepDisabled		1
 powermode            0
09:39:13
 SleepDisabled		1
 powermode            0
09:39:18
 SleepDisabled		1
 powermode            0
09:39:23
 SleepDisabled		1
 powermode            0
09:39:28
 SleepDisabled		1
 powermode            0
09:39:33
 SleepDisabled		1
 powermode            0
09:39:38
 SleepDisabled		1
 powermode            0
09:39:43
 SleepDisabled		1
 powermode            0
09:39:48
 SleepDisabled		1
 powermode            0
09:39:53
 SleepDisabled		1
 powermode            0
09:39:58
 SleepDisabled		1
 powermode            0
09:40:04
 SleepDisabled		1
 powermode            0
09:40:09
 SleepDisabled		1
 powermode            0
09:40:14
 SleepDisabled		1
 powermode            0
09:40:19
 SleepDisabled		1
 powermode            0
09:40:24
 SleepDisabled		1
 powermode            0
09:40:29
 SleepDisabled		1
 powermode            0
09:40:34
 SleepDisabled		1
 powermode            0
09:40:39
 SleepDisabled		1
 powermode            0
09:40:44
 SleepDisabled		1
 powermode            0
09:40:49
 SleepDisabled		1
 powermode            0
09:40:54
 SleepDisabled		1
 powermode            0
09:40:59
 SleepDisabled		1
 powermode            0
09:41:04
 SleepDisabled		1
 powermode            0
09:41:09
 SleepDisabled		1
 powermode            0
09:41:14
 SleepDisabled		1
 powermode            0
09:41:19
 SleepDisabled		1
 powermode            0
09:41:24
 SleepDisabled		1
 powermode            0
09:41:29
 SleepDisabled		1
 powermode            0
09:41:34
 SleepDisabled		1
 powermode            0
09:41:39
 SleepDisabled		1
 powermode            0
09:41:44
 SleepDisabled		1
 powermode            0
09:41:49
 SleepDisabled		1
 powermode            0
09:41:54
 SleepDisabled		1
 powermode            0
09:41:59
 SleepDisabled		1
 powermode            0
09:42:04
 SleepDisabled		1
 powermode            0
09:42:10
 SleepDisabled		1
 powermode            0
09:42:15
 SleepDisabled		1
 powermode            0
09:42:20
 SleepDisabled		1
 powermode            0
09:42:25
 SleepDisabled		1
 powermode            0
09:42:30
 SleepDisabled		0
 powermode            0
09:42:35
 SleepDisabled		0
 powermode            0
09:42:40
 SleepDisabled		0
 powermode            0
09:42:45
 SleepDisabled		0
 powermode            0
09:42:50
 SleepDisabled		0
 powermode            0
09:42:55
 SleepDisabled		0
 powermode            0
09:43:00
 SleepDisabled		0
 powermode            0
09:43:05
 SleepDisabled		0
 powermode            0
09:43:10
 SleepDisabled		0
 powermode            0
09:43:15
 SleepDisabled		0
 powermode            0
09:43:20
 SleepDisabled		0
 powermode            0
09:43:25
 SleepDisabled		0
 powermode            0
09:43:30
 SleepDisabled		0
 powermode            0
09:43:35
 SleepDisabled		0
 powermode            0
09:43:40
 SleepDisabled		0
 powermode            0
09:43:45
 SleepDisabled		0
 powermode            0
09:43:50
 SleepDisabled		0
 powermode            0
09:43:55
 SleepDisabled		0
 powermode            0
09:44:00
 SleepDisabled		0
 powermode            0
09:44:05
 SleepDisabled		0
 powermode            0
09:44:10
 SleepDisabled		0
 powermode            0
09:44:16
 SleepDisabled		0
 powermode            0
09:44:21
 SleepDisabled		0
 powermode            0
09:44:26
 SleepDisabled		0
 powermode            0
09:44:31
 SleepDisabled		0
 powermode            0
09:44:36
 SleepDisabled		0
 powermode            0
09:44:41
 SleepDisabled		0
 powermode            0
09:44:46
 SleepDisabled		0
 powermode            0
09:44:51
 SleepDisabled		0
 powermode            0
09:44:56
 SleepDisabled		0
 powermode            0
09:45:01
 SleepDisabled		0
 powermode            0
09:45:06
 SleepDisabled		0
 powermode            0
09:45:11
 SleepDisabled		0
 powermode            0
09:45:16
 SleepDisabled		0
 powermode            0
09:45:21
 SleepDisabled		0
 powermode            0
09:45:26
 SleepDisabled		0
 powermode            0
09:45:31
 SleepDisabled		0
 powermode            0
09:45:36
 SleepDisabled		0
 powermode            0
09:45:41
 SleepDisabled		0
 powermode            0
09:45:46
 SleepDisabled		0
 powermode            0
09:45:51
 SleepDisabled		0
 powermode            0
09:45:56
 SleepDisabled		0
 powermode            0
09:46:01
 SleepDisabled		0
 powermode            0
09:46:06
 SleepDisabled		0
 powermode            0
09:46:11
 SleepDisabled		0
 powermode            0
09:46:16
 SleepDisabled		0
 powermode            0
09:46:21
 SleepDisabled		0
 powermode            0
09:46:27
 SleepDisabled		0
 powermode            0
09:46:32
 SleepDisabled		0
 powermode            0
09:46:37
 SleepDisabled		0
 powermode            0
09:46:42
 SleepDisabled		0
 powermode            0
09:46:47
 SleepDisabled		0
 powermode            0
09:46:52
 SleepDisabled		0
 powermode            0
09:46:57
 SleepDisabled		0
 powermode            0
09:47:02
 SleepDisabled		0
 powermode            0
09:47:07
 SleepDisabled		0
 powermode            0
09:47:12
 SleepDisabled		0
 powermode            0
09:47:17
 SleepDisabled		0
 powermode            0
09:47:22
 SleepDisabled		0
 powermode            0
09:47:27
 SleepDisabled		0
 powermode            0
09:47:32
 SleepDisabled		0
 powermode            0
09:47:37
 SleepDisabled		0
 powermode            0
09:47:42
 SleepDisabled		0
 powermode            0
09:47:47
 SleepDisabled		0
 powermode            0
09:47:52
 SleepDisabled		0
 powermode            0
09:47:57
 SleepDisabled		0
 powermode            0
09:48:02
 SleepDisabled		0
 powermode            0
09:48:07
 SleepDisabled		0
 powermode            0
09:48:12
 SleepDisabled		0
 powermode            0
09:48:17
 SleepDisabled		0
 powermode            0
09:48:22
 SleepDisabled		0
 powermode            0
09:48:27
 SleepDisabled		0
 powermode            0
09:48:32
 SleepDisabled		0
 powermode            0
09:48:38
 SleepDisabled		0
 powermode            0
09:48:43
 SleepDisabled		0
 powermode            0
09:48:48
 SleepDisabled		0
 powermode            0
09:48:53
 SleepDisabled		0
 powermode            0
09:48:58
 SleepDisabled		0
 powermode            0
09:49:03
 SleepDisabled		0
 powermode            0
09:49:08
 SleepDisabled		0
 powermode            0
09:49:13
 SleepDisabled		0
 powermode            0
09:49:18
 SleepDisabled		0
 powermode            0
09:49:23
 SleepDisabled		0
 powermode            0
09:49:28
 SleepDisabled		0
 powermode            0
09:49:33
 SleepDisabled		0
 powermode            0
09:49:38
 SleepDisabled		0
 powermode            0
09:49:43
 SleepDisabled		0
 powermode            0
09:49:48
 SleepDisabled		0
 powermode            0
09:49:53
 SleepDisabled		0
 powermode            0
09:49:58
 SleepDisabled		0
 powermode            0
09:50:03
 SleepDisabled		0
 powermode            0
09:50:08
 SleepDisabled		0
 powermode            0
09:50:13
 SleepDisabled		0
 powermode            0
09:50:18
 SleepDisabled		0
 powermode            0
09:50:23
 SleepDisabled		0
 powermode            0
09:50:28
 SleepDisabled		0
 powermode            0
09:50:33
 SleepDisabled		0
 powermode            0
09:50:38
 SleepDisabled		0
 powermode            0
09:50:43
 SleepDisabled		0
 powermode            0
09:50:48
 SleepDisabled		0
 powermode            0
09:50:54
 SleepDisabled		0
 powermode            0
09:50:59
 SleepDisabled		0
 powermode            0
09:51:04
 SleepDisabled		0
 powermode            0
09:51:09
 SleepDisabled		0
 powermode            0
09:51:14
 SleepDisabled		0
 powermode            0
09:51:19
 SleepDisabled		0
 powermode            0
09:51:24
 SleepDisabled		0
 powermode            0
09:51:29
 SleepDisabled		0
 powermode            0
09:51:34
 SleepDisabled		0
 powermode            0
09:51:39
 SleepDisabled		0
 powermode            0
09:51:44
 SleepDisabled		0
 powermode            0
09:51:49
 SleepDisabled		0
 powermode            0
09:51:54
 SleepDisabled		0
 powermode            0
09:51:59
 SleepDisabled		0
 powermode            0
09:52:04
 SleepDisabled		0
 powermode            0
09:52:09
 SleepDisabled		0
 powermode            0
09:52:14
 SleepDisabled		0
 powermode            0
09:52:19
 SleepDisabled		0
 powermode            0
09:52:24
 SleepDisabled		0
 powermode            0
09:52:29
 SleepDisabled		0
 powermode            0
09:52:34
 SleepDisabled		0
 powermode            0
09:52:39
 SleepDisabled		0
 powermode            0
09:52:44
 SleepDisabled		0
 powermode            0
09:52:49
 SleepDisabled		0
 powermode            0
09:52:54
 SleepDisabled		0
 powermode            0
09:53:00
 SleepDisabled		0
 powermode            0
09:53:05
 SleepDisabled		0
 powermode            0
09:53:10
 SleepDisabled		0
 powermode            0
09:53:15
 SleepDisabled		0
 powermode            0
09:53:20
 SleepDisabled		0
 powermode            0
09:53:25
 SleepDisabled		0
 powermode            0
09:53:30
 SleepDisabled		0
 powermode            0
09:53:35
 SleepDisabled		0
 powermode            0
09:53:40
 SleepDisabled		0
 powermode            0
09:53:45
 SleepDisabled		0
 powermode            0
09:53:50
 SleepDisabled		0
 powermode            0
09:53:55
 SleepDisabled		0
 powermode            0
09:54:00
 SleepDisabled		0
 powermode            0
09:54:05
 SleepDisabled		0
 powermode            0
09:54:10
 SleepDisabled		0
 powermode            0
09:54:15
 SleepDisabled		0
 powermode            0
09:54:20
 SleepDisabled		0
 powermode            0
09:54:25
 SleepDisabled		0
 powermode            0
09:54:30
 SleepDisabled		0
 powermode            0
09:54:35
 SleepDisabled		0
 powermode            0
09:54:40
 SleepDisabled		0
 powermode            0
09:54:45
 SleepDisabled		0
 powermode            0
09:54:50
 SleepDisabled		0
 powermode            0
09:54:55
 SleepDisabled		0
 powermode            0
09:55:01
 SleepDisabled		0
 powermode            0
09:55:06
 SleepDisabled		0
 powermode            0
09:55:11
 SleepDisabled		0
 powermode            0
09:55:16
 SleepDisabled		0
 powermode            0
09:55:21
 SleepDisabled		0
 powermode            0
09:55:26
 SleepDisabled		0
 powermode            0
09:55:31
 SleepDisabled		0
 powermode            0
09:55:36
 SleepDisabled		0
 powermode            0
09:55:41
 SleepDisabled		0
 powermode            0
09:55:46
 SleepDisabled		0
 powermode            0
09:55:51
 SleepDisabled		0
 powermode            0
09:55:56
 SleepDisabled		0
 powermode            0
09:56:01
 SleepDisabled		0
 powermode            0
09:56:06
 SleepDisabled		0
 powermode            0
09:56:11
 SleepDisabled		0
 powermode            0
09:56:16
 SleepDisabled		0
 powermode            0
09:56:21
 SleepDisabled		0
 powermode            0
09:56:26
 SleepDisabled		0
 powermode            0
09:56:31
 SleepDisabled		0
 powermode            0
09:56:36
 SleepDisabled		0
 powermode            0
09:56:41
 SleepDisabled		0
 powermode            0
09:56:46
 SleepDisabled		0
 powermode            0
09:56:51
 SleepDisabled		0
 powermode            0
09:56:56
 SleepDisabled		0
 powermode            0
09:57:01
 SleepDisabled		0
 powermode            0
09:57:06
 SleepDisabled		0
 powermode            0
09:57:12
 SleepDisabled		0
 powermode            0
09:57:17
 SleepDisabled		0
 powermode            0
09:57:22
 SleepDisabled		0
 powermode            0
09:57:27
 SleepDisabled		0
 powermode            0
09:57:32
 SleepDisabled		0
 powermode            0
09:57:37
 SleepDisabled		0
 powermode            0
09:57:42
 SleepDisabled		0
 powermode            0
09:57:47
 SleepDisabled		0
 powermode            0
09:57:52
 SleepDisabled		0
 powermode            0
09:57:57
 SleepDisabled		0
 powermode            0
09:58:02
 SleepDisabled		0
 powermode            0
09:58:07
 SleepDisabled		0
 powermode            0
09:58:12
 SleepDisabled		0
 powermode            0
09:58:17
 SleepDisabled		0
 powermode            0
09:58:22
 SleepDisabled		0
 powermode            0
09:58:27
 SleepDisabled		0
 powermode            0
09:58:32
 SleepDisabled		0
 powermode            0
09:58:37
 SleepDisabled		0
 powermode            0
09:58:42
 SleepDisabled		0
 powermode            0
09:58:47
 SleepDisabled		0
 powermode            0
09:58:52
 SleepDisabled		0
 powermode            0
09:58:57
 SleepDisabled		0
 powermode            0
09:59:02
 SleepDisabled		0
 powermode            0
09:59:07
 SleepDisabled		0
 powermode            0
09:59:12
 SleepDisabled		0
 powermode            0
09:59:17
 SleepDisabled		0
 powermode            0
09:59:22
 SleepDisabled		0
 powermode            0
09:59:28
 SleepDisabled		0
 powermode            0
09:59:33
 SleepDisabled		0
 powermode            0
09:59:38
 SleepDisabled		0
 powermode            0
09:59:43
 SleepDisabled		0
 powermode            0
09:59:48
 SleepDisabled		0
 powermode            0
09:59:53
 SleepDisabled		0
 powermode            0
09:59:58
 SleepDisabled		0
 powermode            0
10:00:03
 SleepDisabled		0
 powermode            0
10:00:08
 SleepDisabled		0
 powermode            0
10:00:13
 SleepDisabled		0
 powermode            0
10:00:18
 SleepDisabled		0
 powermode            0
10:00:23
 SleepDisabled		0
 powermode            0
10:00:28
 SleepDisabled		0
 powermode            0
10:00:33
 SleepDisabled		0
 powermode            0
10:00:38
 SleepDisabled		0
 powermode            0
10:00:43
 SleepDisabled		0
 powermode            0
10:00:48
 SleepDisabled		0
 powermode            0
10:00:53
 SleepDisabled		0
 powermode            0
10:00:58
 SleepDisabled		0
 powermode            0
10:01:03
 SleepDisabled		0
 powermode            0
10:01:08
 SleepDisabled		0
 powermode            0
10:01:13
 SleepDisabled		0
 powermode            0
10:01:18
 SleepDisabled		0
 powermode            0
10:01:23
 SleepDisabled		0
 powermode            0
10:01:28
 SleepDisabled		0
 powermode            0
10:01:33
 SleepDisabled		0
 powermode            0
10:01:39
 SleepDisabled		0
 powermode            0
10:01:44
 SleepDisabled		0
 powermode            0
10:01:49
 SleepDisabled		0
 powermode            0
10:01:54
 SleepDisabled		0
 powermode            0
10:01:59
 SleepDisabled		0
 powermode            0
10:02:04
 SleepDisabled		0
 powermode            0
10:02:09
 SleepDisabled		0
 powermode            0
10:02:14
 SleepDisabled		0
 powermode            0
10:02:19
 SleepDisabled		0
 powermode            0
10:02:24
 SleepDisabled		0
 powermode            0
10:02:29
 SleepDisabled		0
 powermode            0
10:02:34
 SleepDisabled		0
 powermode            0
10:02:39
 SleepDisabled		0
 powermode            0
10:02:44
 SleepDisabled		0
 powermode            0
10:02:49
 SleepDisabled		0
 powermode            0
10:02:54
 SleepDisabled		0
 powermode            0
10:02:59
 SleepDisabled		0
 powermode            0
10:03:04
 SleepDisabled		0
 powermode            0
10:03:09
 SleepDisabled		0
 powermode            0
10:03:14
 SleepDisabled		0
 powermode            0
10:03:19
 SleepDisabled		0
 powermode            0
10:03:24
 SleepDisabled		0
 powermode            0
10:03:29
 SleepDisabled		0
 powermode            0
10:03:34
 SleepDisabled		0
 powermode            0
10:03:39
 SleepDisabled		0
 powermode            0
10:03:44
 SleepDisabled		0
 powermode            0
10:03:50
 SleepDisabled		0
 powermode            0
10:03:55
 SleepDisabled		0
 powermode            0
10:04:00
 SleepDisabled		0
 powermode            0
10:04:05
 SleepDisabled		0
 powermode            0
10:04:10
 SleepDisabled		0
 powermode            0
10:04:15
 SleepDisabled		0
 powermode            0
10:04:20
 SleepDisabled		0
 powermode            0
10:04:25
 SleepDisabled		0
 powermode            0
10:04:30
 SleepDisabled		0
 powermode            0
10:04:35
 SleepDisabled		0
 powermode            0
10:04:40
 SleepDisabled		0
 powermode            0
10:04:45
 SleepDisabled		0
 powermode            0
10:04:50
 SleepDisabled		0
 powermode            0
10:04:55
 SleepDisabled		0
 powermode            0
10:05:00
 SleepDisabled		0
 powermode            0
10:05:05
 SleepDisabled		0
 powermode            0
10:05:10
 SleepDisabled		0
 powermode            0
10:05:15
 SleepDisabled		0
 powermode            0
10:05:20
 SleepDisabled		0
 powermode            0
10:05:25
 SleepDisabled		0
 powermode            0
10:05:30
 SleepDisabled		0
 powermode            0
10:05:35
 SleepDisabled		0
 powermode            0
10:05:40
 SleepDisabled		0
 powermode            0
10:05:45
 SleepDisabled		0
 powermode            0
10:05:50
 SleepDisabled		0
 powermode            0
10:05:55
 SleepDisabled		0
 powermode            0
10:06:01
 SleepDisabled		0
 powermode            0
10:06:06
 SleepDisabled		0
 powermode            0
10:06:11
 SleepDisabled		0
 powermode            0
10:06:16
 SleepDisabled		0
 powermode            0
10:06:21
 SleepDisabled		0
 powermode            0
10:06:26
 SleepDisabled		0
 powermode            0
10:06:31
 SleepDisabled		0
 powermode            0
10:06:36
 SleepDisabled		0
 powermode            0
10:06:41
 SleepDisabled		0
 powermode            0
10:06:46
 SleepDisabled		0
 powermode            0
10:06:51
 SleepDisabled		1
 powermode            0
10:06:56
 SleepDisabled		1
 powermode            1
10:07:01
 SleepDisabled		1
 powermode            1
10:07:06
 SleepDisabled		1
 powermode            1
10:07:11
 SleepDisabled		1
 powermode            2
10:07:16
 SleepDisabled		1
 powermode            0
10:07:21
 SleepDisabled		1
 powermode            0
10:07:26
 SleepDisabled		1
 powermode            0
10:07:31
 SleepDisabled		1
 powermode            0
10:07:36
 SleepDisabled		1
 powermode            0
10:07:41
 SleepDisabled		1
 powermode            0
10:07:46
 SleepDisabled		1
 powermode            0
10:07:51
 SleepDisabled		0
 powermode            0
10:07:56
 SleepDisabled		0
 powermode            0
10:08:01
 SleepDisabled		0
 powermode            0
10:08:06
 SleepDisabled		0
 powermode            0
10:08:12
 SleepDisabled		0
 powermode            0
10:08:17
 SleepDisabled		0
 powermode            0
10:08:22
 SleepDisabled		0
 powermode            0
10:08:27
 SleepDisabled		0
 powermode            0
10:08:32
 SleepDisabled		0
 powermode            0
10:08:37
 SleepDisabled		0
 powermode            0
10:08:42
 SleepDisabled		0
 powermode            0
10:08:47
 SleepDisabled		0
 powermode            0
10:08:52
 SleepDisabled		0
 powermode            0
10:08:57
 SleepDisabled		0
 powermode            0
10:09:02
 SleepDisabled		0
 powermode            0
10:09:07
 SleepDisabled		0
 powermode            0
10:09:12
 SleepDisabled		0
 powermode            0
10:09:17
 SleepDisabled		0
 powermode            0
10:09:22
 SleepDisabled		0
 powermode            0
10:09:27
 SleepDisabled		0
 powermode            0
10:09:32
 SleepDisabled		0
 powermode            0
10:09:37
 SleepDisabled		0
 powermode            0
10:09:42
 SleepDisabled		0
 powermode            0
10:09:47
 SleepDisabled		0
 powermode            0
10:09:52
 SleepDisabled		0
 powermode            0
10:09:57
 SleepDisabled		0
 powermode            0
10:10:02
 SleepDisabled		0
 powermode            0
10:10:07
 SleepDisabled		0
 powermode            0
10:10:12
 SleepDisabled		0
 powermode            0
10:10:18
 SleepDisabled		0
 powermode            0
10:10:23
 SleepDisabled		0
 powermode            0
10:10:28
 SleepDisabled		0
 powermode            0
10:10:33
 SleepDisabled		0
 powermode            0
10:10:38
 SleepDisabled		0
 powermode            0
10:10:43
 SleepDisabled		0
 powermode            0
10:10:48
 SleepDisabled		0
 powermode            0
10:10:53
 SleepDisabled		0
 powermode            0
10:10:58
 SleepDisabled		0
 powermode            0
10:11:03
 SleepDisabled		0
 powermode            0
10:11:08
 SleepDisabled		0
 powermode            0
10:11:13
 SleepDisabled		0
 powermode            0
10:11:18
 SleepDisabled		0
 powermode            0
10:11:23
 SleepDisabled		0
 powermode            0
10:11:28
 SleepDisabled		0
 powermode            0
10:11:33
 SleepDisabled		0
 powermode            0
10:11:38
 SleepDisabled		0
 powermode            0
10:11:43
 SleepDisabled		0
 powermode            0
10:11:48
 SleepDisabled		0
 powermode            0
10:11:53
 SleepDisabled		0
 powermode            0
10:11:58
 SleepDisabled		0
 powermode            0

SergeiNikolenko added a commit to SergeiNikolenko/Insomnia that referenced this pull request Oct 16, 2026
@krishhgg

Copy link
Copy Markdown
Owner

@greptileai please review this PR.

@krishhgg

krishhgg commented Oct 17, 2026 •

Copy link
Copy Markdown
Owner

End-to-end test in two VMs

The early exit works on macOS 26.6.2 and 27.0. Between sessions, a recovery agent run started 41 programs on main and 0 with this PR. Crash recovery still works the same. One case keeps main's cost: right after the agent itself recovers a crashed session, its runs still start 41 programs, until the app's next session ends.

Setup

Two Tart VMs on the maintainer's Mac mini, main (b6a7499) against this PR's head (3dfc607):

  • macOS 27.0 (26A428): each version built and installed from source with scripts/install.sh (Xcode 27).
  • macOS 26.6.2 (25G83): each version installed with scripts/install.sh --app, from a bundle built from the same commit in the macOS 27 VM. This VM has only the Command Line Tools, which can't build the app.

Sessions were started from the menu bar with a mouse click. After each step below, the script ran the installed backstop.sh once with launchd's environment (env -i, launchd's PATH) and counted every program it started with dtrace (proc:::exec-success in its process tree, leaving out env and its own bash).

Results

Step macOS 26.6.2, main macOS 26.6.2, PR macOS 27.0, main macOS 27.0, PR
Idle, after a 1 minute session ended on its timer 41 0 41 0
Idle, 130 s later (two more agent runs) 41 0 41 0
App force-quit (kill -9) mid-session; agent at the deadline recovered recovered recovered recovered
Idle, right after that recovery 41 41 41 41
Idle, after the next session ended from the app 41 0 41 0

The 41 on main are plutil ×33, chmod ×5, mkdir, lockf and head. Every backstop.sh run exited 0, and launchd showed last exit code 0 for the agent throughout.

The recovery looked the same in all four runs:

backstop: session expired (endsAt=2026-10-17T07:20:35Z); restoring from journal
backstop: pmset -a disablesleep 0 ok
backstop: journal cleared

The case that stays at 41

The early exit needs no session.json and a state.json that matches the app's clean journal exactly. The journal the agent writes after its own recovery doesn't match, so each run takes the full path until the app writes a clean journal at the end of its next session. That is the same cost as main, so it's not a regression. It does mean a Mac whose app crashed keeps the old cost until the next session.

Rerun on macOS 27.0.1

The macOS 27 VM was updated to 27.0.1 (26A434), the newest release, and these runs were repeated with the same commits and scripts. The results match 27.0. The macOS 26 VM stays on 26.6.2, the version GitHub's hosted macOS 26 runner uses.

Step macOS 27.0.1, main macOS 27.0.1, PR
Idle, after a 1 minute session ended on its timer 41 0
Idle, 130 s later (two more agent runs) 41 0
App force-quit (kill -9) mid-session; agent at the deadline recovered recovered
Idle, right after that recovery 41 41
Idle, after the next session ended from the app 41 0

Every backstop.sh run exited 0. The program lists are in pr-108 and the run log is run-lab27.log.

Not covered

  • Real hardware, and lid or battery steps.
  • Long idle stretches. Each idle row is one run; the 130 s wait covered two agent runs that weren't traced.
  • Time per run. dtrace counted programs only.

Per-run dtrace output is in pr-108, with one file per row and version. Run logs are in logs (run-tahoe-lab.log for macOS 26.6.2, run-lab27.log for macOS 27.0) and the scripts in scripts (t108.sh, lib.sh).

🤖 Generated with Claude Code

@krishhgg krishhgg added the accepted The owner accepted this pull request; merge-gate/accepted reads it. Only the owner adds it. label Oct 17, 2026
@krishhgg
krishhgg marked this pull request as draft October 17, 2026 20:15
@krishhgg
krishhgg marked this pull request as ready for review October 17, 2026 20:15
@krishhgg
krishhgg merged commit 76e517d into krishhgg:main Oct 17, 2026
24 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

accepted The owner accepted this pull request; merge-gate/accepted reads it. Only the owner adds it.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants