- abortableSleep used Bun.sleep which vitest fake timers do not intercept;
switch to setTimeout via Promise.withResolvers so vi.useFakeTimers() +
vi.advanceTimersByTime() work correctly in the polling loop tests
- getCurrentHeadSha() and GhRunWatchTool session cwd used a hardcoded
/work/pi path; replace with import.meta.dir so the tests resolve the
real repo HEAD on any machine
- add timeout-minutes: 30 to the CI test job as a safety net against
future hangs blocking release runs