What to verify
A macOS upkeep pass (2026-08-06) fixed a set of dev-harness assumptions that only broke off-Linux. Every change was verified on macOS 15.6.1 / Apple Silicon — full ladder green, just test-all 7/7 — but none of it has run on a Linux/GNOME checkout, and all of it touches the shared harness rather than the macOS backend.
The risk isn't subtle behaviour: it's that a Linux dev's just setup or just test-all stops working.
What changed
| change |
file |
Linux risk |
uv venv skipped when $VIRTUAL_ENV is set |
Justfile (setup-linux, setup-macos) |
a Linux dev without flox still gets ./.venv; a Linux dev with an active venv now installs into it instead of creating ./.venv — intended, but changes where packages land |
install_evdev_source.sh gets PYTHON="${VIRTUAL_ENV:-.venv}/bin/python" |
Justfile |
the aarch64 source-build path is Linux-only and was not exercised at all |
./.venv/bin prepended to PATH only when it exists |
Justfile (test-all) |
should be a no-op on a normal Linux checkout |
pyright --pythonpath "$(command -v python)" |
Justfile (test-all) |
with ./.venv present, [tool.pyright] venv still wins — expected to behave exactly as before, but unconfirmed |
pyright added to the [dev] extra |
pyproject.toml |
first just setup-linux after this pulls a new dep (wraps node) |
# pyright: ignore[reportMissingImports] on the evdev import |
daemon/deckd/input.py |
with evdev installed, confirm the ignore doesn't itself become a warning |
e2e daemon runs with DECKD_FAKE_INPUT=1 |
client/playwright.config.ts, daemon/deckd/__main__.py (_build_sinks) |
the Linux suite previously relied on the PYTHONPATH=scripts/no-evdev shadow; both are now in play and the shadow must stay redundant, not conflicting |
e2e daemon runs with --no-focus |
client/playwright.config.ts |
on GNOME the daemon previously watched real desktop focus during e2e; specs that implicitly depended on that would now fail |
| chromium lookup falls back to Playwright's managed browser |
client/e2e/find-chromium.mjs |
the nix-store path must still win on nix — it's checked first, but confirm no accidental fallback |
e2e daemon binary falls back to deckd on PATH |
client/playwright.config.ts |
.venv/bin/deckd must still be preferred where it exists |
Acceptance criteria
On a Linux/GNOME checkout (nix/flox or plain, note which):
Notes
Nothing here changes daemon behaviour at runtime; _build_sinks() is a pure extraction of the previous inline sink selection plus the new DECKD_FAKE_INPUT short-circuit (covered by tests in tests/test_input.py). If a step fails, the fix is likely a one-liner in the Justfile — file it as a follow-up rather than reverting the set.
What to verify
A macOS upkeep pass (2026-08-06) fixed a set of dev-harness assumptions that only broke off-Linux. Every change was verified on macOS 15.6.1 / Apple Silicon — full ladder green,
just test-all7/7 — but none of it has run on a Linux/GNOME checkout, and all of it touches the shared harness rather than the macOS backend.The risk isn't subtle behaviour: it's that a Linux dev's
just setuporjust test-allstops working.What changed
uv venvskipped when$VIRTUAL_ENVis setJustfile(setup-linux,setup-macos)./.venv; a Linux dev with an active venv now installs into it instead of creating./.venv— intended, but changes where packages landinstall_evdev_source.shgetsPYTHON="${VIRTUAL_ENV:-.venv}/bin/python"Justfile./.venv/binprepended to PATH only when it existsJustfile(test-all)pyright --pythonpath "$(command -v python)"Justfile(test-all)./.venvpresent,[tool.pyright] venvstill wins — expected to behave exactly as before, but unconfirmedpyrightadded to the[dev]extrapyproject.tomljust setup-linuxafter this pulls a new dep (wraps node)# pyright: ignore[reportMissingImports]on theevdevimportdaemon/deckd/input.pyDECKD_FAKE_INPUT=1client/playwright.config.ts,daemon/deckd/__main__.py(_build_sinks)PYTHONPATH=scripts/no-evdevshadow; both are now in play and the shadow must stay redundant, not conflicting--no-focusclient/playwright.config.tsclient/e2e/find-chromium.mjsdeckdon PATHclient/playwright.config.ts.venv/bin/deckdmust still be preferred where it existsAcceptance criteria
On a Linux/GNOME checkout (nix/flox or plain, note which):
just setupcompletes and lands packages where you expect (which deckd,python -c "import evdev"where the extra applies).just test-allpasses all 7 steps.pyright) resolves third-party imports — noreportMissingImportsstorm — and theevdevignore comment produces no new warning on a box where evdev is installed.npm run test:e2epasses, andclient/e2e/.daemon.logshowsDECKD_FAKE_INPUT set; input is logged, not injected— i.e. no keystroke reached your desktop during the run./nix/store/*-playwright-chromium/*/chromebinary, not a downloaded one.just dev/just dev-daemon-lanstill work normally (the sink and focus changes must not leak into non-test runs —DECKD_FAKE_INPUTunset means real injection).just setup-linuxstill source-builds python-evdev viascripts/install_evdev_source.sh.Notes
Nothing here changes daemon behaviour at runtime;
_build_sinks()is a pure extraction of the previous inline sink selection plus the newDECKD_FAKE_INPUTshort-circuit (covered by tests intests/test_input.py). If a step fails, the fix is likely a one-liner in theJustfile— file it as a follow-up rather than reverting the set.