v0.9.54 β π The Mac wallpaper stops crawling, and no PR ships blind
π The Mac wallpaper stops crawling, and no PR ships blind
Fixed β macOS: the world ran at 2 fps while it was in plain sight
The office throttles the wallpaper to 2 fps when something is covering it, so it stops
spending GPU on a picture nobody can see. On macOS that throttle could latch on while
the wallpaper was fully visible: the agents crawled in slow motion, restarting didn't
help, and deleting the flag file by hand didn't either β it was rewritten a second later.
Two independent causes, both found on their own hardware and fixed by
@kmmao in #43:
1 Β· The Dock was matched by its localized name. The monitor skips the Dock's
full-screen window β it covers the screen without hiding anything β by comparing the
window's owner name against the literal "Dock". But that key carries the localized
process name: on a Chinese system it reads η¨εΊε, the comparison never matches, and the
Dock's own layer 20, alpha 1.0, 100 % window is counted as an app covering the whole
screen on every poll. The flag could never clear. English installs were unaffected,
which is why it survived the original benchmark. It's now matched by bundle id
(com.apple.dock), which no language changes.
2 Β· Occlusion was judged on the primary display. Coverage was only ever measured
against CGMainDisplayID(). With two monitors the world often lives on the secondary
one, where a fullscreen app on the primary hides nothing β and throttled it anyway. The
monitor now finds the world's own desktop-level window, picks the display it overlaps
most, and runs both the coverage check and display-sleep against that display.
Measured on macOS 26.4 / M4 Pro / zh-Hans / two displays, with the screen layout identical
before and after β only the monitor's judgement changed:
| throttle flag | fps | |
|---|---|---|
| before | written every poll, never clears | 2.0 |
| after | stays clear | 25β30 |
The optimisation itself is intact: a real fullscreen app covering the wallpaper's display,
and display sleep, still drop it to 2 fps. Single-monitor English installs behave exactly
as they did.
Follow-up in the same release: the monitor's doc comment described a check the code had
stopped doing long ago (>= 95 % of the main screen, at a layer above the wallpaper) β
it now says what actually runs. And building the window list had to move ahead of the
sleep check, so a null list would have reported "visible" where it used to report
"asleep"; that one path now falls back to the main display's sleep state rather than
guessing the machine is awake.
Changed β every pull request now gets a build signal
This repo had no CI on pull requests. A community PR arrived with nothing telling
anyone whether it even compiled, and the worst case is exactly the one above: a build on
Windows or Linux parses #[cfg(target_os = "macos")] code but never type-checks it,
and that module can't be cross-checked from a Windows machine at all β its FFI
dependencies need a C toolchain and the macOS SDK. #43 had to be verified by hand, by
pushing it to a throwaway branch with a temporary macOS workflow.
.github/workflows/ci.yml now runs on every pull request, every push to main, and on
demand:
- the shell built on Windows, macOS and Linux β
build, notcheck, because the shell
is mostly FFI and a wrong framework or symbol name type-checks perfectly and only falls
over at link time β plus the macOS wallpaper shim, which ships as its own dylib - the daemon test suite on Node 20 and 22
meetings.test.js is excluded: it drives a real agent conversation and needs a brain CI
doesn't have, and a suite that is red on arrival teaches everyone to ignore it. Run it
locally with npm run test:meetings. RELEASING.md now names the same command the CI
runs, so a release is never held to a weaker bar than a pull request.
Docs
docs/guide/plugins.md gained a second worked /cmd example β Scar Board's update,
which locks a record's identity and recall history on edit, refuses an unknown id instead
of silently creating one, and writes atomically. It's the pattern to copy for any plugin
that edits records it also appends to.
Upgrading: your office shows a π banner β click it, or run bagidea update. The
wallpaper fix is in the shell binary, so it arrives with this release's assets, not from
source alone.
Thanks: @kmmao for a bug report that arrived with two root
causes, a reproduction and a measurement.