release.yml already builds on runs-on: windows. Add a job after build-windows that installs the fresh NSIS bundle silently, starts tauri-driver (+ msedgedriver matching the runner's WebView2), and runs a WebdriverIO/Playwright-over-CDP smoke against the running app:
boots to the login page, logs into a CI Synapse (see cinny's CI e2e issue) or a stubbed session, opens a room, sends a message (web layer inside the shell);
matrix: deep link while running → navigates (#8); while minimised to tray → reveals + navigates;
set_global_hotkeys round-trip: invoke the command, synthesise a key with SendInput via PowerShell, assert the lotus-global-hotkey DOM event (#2);
tray state commands (set_tray_unread, DND) return without error; set_badge_count/thumbbar commands don't panic (#4, #7);
update-ready path (#6) with a mocked updater endpoint.
Toast appearance and Focus Assist cannot be asserted headlessly — keep #13/#18 as manual. Budget: about a day; most of it is the driver/WebView2 plumbing on the runner.
`release.yml` already builds on `runs-on: windows`. Add a job after `build-windows` that installs the fresh NSIS bundle silently, starts `tauri-driver` (+ `msedgedriver` matching the runner's WebView2), and runs a WebdriverIO/Playwright-over-CDP smoke against the running app:
- boots to the login page, logs into a CI Synapse (see cinny's CI e2e issue) or a stubbed session, opens a room, sends a message (web layer inside the shell);
- `matrix:` deep link while running → navigates (#8); while minimised to tray → reveals + navigates;
- `set_global_hotkeys` round-trip: invoke the command, synthesise a key with `SendInput` via PowerShell, assert the `lotus-global-hotkey` DOM event (#2);
- tray state commands (`set_tray_unread`, DND) return without error; `set_badge_count`/thumbbar commands don't panic (#4, #7);
- update-ready path (#6) with a mocked updater endpoint.
Toast *appearance* and Focus Assist cannot be asserted headlessly — keep #13/#18 as manual. Budget: about a day; most of it is the driver/WebView2 plumbing on the runner.
jared
added this to the Desktop 2026-Q4 milestone 2026-09-18 21:41:08 -04:00
**Progress** (2026-10-21): the Windows smoke workflow passes on the `windows` runner (runs 2796 and 2797). It now covers:
- install;
- boot to the login screen;
- the local server;
- microphone permission for the app and not for a foreign page;
- the call page on its own origin and isolated;
- the keychain round trip;
- **an update over the running app** (PR #42).
Still to add from the plan above:
- the `matrix:` deep link while running and while minimised to tray (#8);
- the `set_global_hotkeys` round trip with `SendInput` (#2);
- tray, badge and thumbbar commands (#4, #7);
- the update-ready path with a mocked feed (#6).
The windows runner has no interactive desktop (likely act_runner as a service, in session 0), so window visibility and hotkey injection are reported n/a there.
Still to add: tray, badge and thumbbar commands (#4, #7), and the update-ready path with a mocked feed (#6).
**Progress** (PR #43, run 2812, 11/11):
- deep links while hidden and while minimised (#8, delivery and un-minimise);
- the global hotkey round trip (#2);
- an interactive-desktop check.
The `windows` runner has **no interactive desktop** (likely act_runner as a service, in session 0), so window visibility and hotkey injection are reported n/a there.
Still to add: tray, badge and thumbbar commands (#4, #7), and the update-ready path with a mocked feed (#6).
the tray, badge, taskbar, thumbbar and media-control commands are exercised and reset;
the 10 shell-only ones are n/a on the desktop-less runner, and the app survives them.
What's left:
the update-ready path with a mocked feed (#6) needs a way to point the installed app at a test update feed;
the visibility, hotkey and tray checks only get checked properly once the windows runner runs inside a logged-in desktop session.
**Progress** (PR #44, run 2816: 12/12):
- the tray, badge, taskbar, thumbbar and media-control commands are exercised and reset;
- the 10 shell-only ones are n/a on the desktop-less runner, and the app survives them.
**What's left:**
- the update-ready path with a mocked feed (#6) needs a way to point the installed app at a test update feed;
- the visibility, hotkey and tray checks only get checked properly once the `windows` runner runs inside a logged-in desktop session.
Reboot. The VM should log itself in, and the runner should show online in Gitea (Site Administration → Runners).
Rerun the Windows smoke workflow. The "interactive desktop" line should pass, and the global-hotkey, visibility and tray checks should run for real instead of saying n/a.
That would close the automated part of #2 and #19.
Rollback:Set-Service <name> -StartupType Automatic; Start-Service <name>, delete the scheduled task, and run Autologon64.exe again to turn auto-logon off.
**Giving the `windows` runner an interactive desktop: needs about 10 minutes at the VM 148 console.**
The owner approved this on 2026-10-25. I couldn't do it remotely:
- VM 148 (`windows-vm` on large1) has no QEMU guest agent;
- it has no address visible from the host;
- auto-logon needs the Windows account's password stored inside Windows.
The steps assume act_runner runs as a Windows **service**, which puts it in session 0. That's why the visibility, hotkey and tray checks say "n/a".
**0. Optional: enable the guest agent first,** so these changes can be made from Proxmox next time.
- On large1: `qm set 148 --agent enabled=1`.
- In the VM: install the virtio guest tools (they include `qemu-ga`), then reboot the VM.
**1. Find the service and its command line** (PowerShell as admin):
```powershell
Get-CimInstance Win32_Service | Where-Object { $_.PathName -match 'act_runner' } | Select-Object Name, StartName, PathName
```
**2. Auto-logon** for the account the runner should use. Sysinternals Autologon stores the password encrypted in LSA, not in plain text in the registry:
```powershell
.\Autologon64.exe <user> <computer-or-domain> <password> /accepteula
```
**3. Keep the session usable.** A locked desktop blocks injected keys and window activation:
```powershell
powercfg /change standby-timeout-ac 0
powercfg /change monitor-timeout-ac 0
reg add "HKCU\Control Panel\Desktop" /v ScreenSaveActive /t REG_SZ /d 0 /f
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\Personalization" /v NoLockScreen /t REG_DWORD /d 1 /f
```
**4. Move the runner from the service to a logon task.** Use the service's command line from step 1:
```powershell
Stop-Service <name>; Set-Service <name> -StartupType Disabled
Set-Content C:\act_runner\start.cmd "cd /d C:\act_runner`r`nact_runner.exe daemon --config config.yaml"
schtasks /Create /TN "act_runner (desktop session)" /SC ONLOGON /RU <user> /RL HIGHEST /TR "C:\act_runner\start.cmd"
```
**5. Check:**
- Reboot. The VM should log itself in, and the runner should show **online** in Gitea (Site Administration → Runners).
- Rerun the Windows smoke workflow. The "interactive desktop" line should pass, and the global-hotkey, visibility and tray checks should run for real instead of saying n/a.
- That would close the automated part of #2 and #19.
**Rollback:** `Set-Service <name> -StartupType Automatic; Start-Service <name>`, delete the scheduled task, and run `Autologon64.exe` again to turn auto-logon off.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
release.ymlalready builds onruns-on: windows. Add a job afterbuild-windowsthat installs the fresh NSIS bundle silently, startstauri-driver(+msedgedrivermatching the runner's WebView2), and runs a WebdriverIO/Playwright-over-CDP smoke against the running app:matrix:deep link while running → navigates (#8); while minimised to tray → reveals + navigates;set_global_hotkeysround-trip: invoke the command, synthesise a key withSendInputvia PowerShell, assert thelotus-global-hotkeyDOM event (#2);set_tray_unread, DND) return without error;set_badge_count/thumbbar commands don't panic (#4, #7);Toast appearance and Focus Assist cannot be asserted headlessly — keep #13/#18 as manual. Budget: about a day; most of it is the driver/WebView2 plumbing on the runner.
Progress (2026-10-21): the Windows smoke workflow passes on the
windowsrunner (runs 2796 and 2797). It now covers:Still to add from the plan above:
matrix:deep link while running and while minimised to tray (#8);set_global_hotkeysround trip withSendInput(#2);Progress (PR #43, run 2812, 11/11):
The
windowsrunner has no interactive desktop (likely act_runner as a service, in session 0), so window visibility and hotkey injection are reported n/a there.Still to add: tray, badge and thumbbar commands (#4, #7), and the update-ready path with a mocked feed (#6).
Progress (PR #44, run 2816: 12/12):
What's left:
windowsrunner runs inside a logged-in desktop session.Giving the
windowsrunner an interactive desktop: needs about 10 minutes at the VM 148 console.The owner approved this on 2026-10-25. I couldn't do it remotely:
windows-vmon large1) has no QEMU guest agent;The steps assume act_runner runs as a Windows service, which puts it in session 0. That's why the visibility, hotkey and tray checks say "n/a".
0. Optional: enable the guest agent first, so these changes can be made from Proxmox next time.
qm set 148 --agent enabled=1.qemu-ga), then reboot the VM.1. Find the service and its command line (PowerShell as admin):
2. Auto-logon for the account the runner should use. Sysinternals Autologon stores the password encrypted in LSA, not in plain text in the registry:
3. Keep the session usable. A locked desktop blocks injected keys and window activation:
4. Move the runner from the service to a logon task. Use the service's command line from step 1:
5. Check:
Rollback:
Set-Service <name> -StartupType Automatic; Start-Service <name>, delete the scheduled task, and runAutologon64.exeagain to turn auto-logon off.🤖 Generated with Claude Code