11 KiB
Release Manual Smoke Checklist
Run this checklist on every release-cut. Sign-off lives in the release PR description (paste the checklist with checked items + the sign-off block at the bottom). Owns OS-level surfaces that drivers cannot assert — everything else is automated under WDIO, Vitest, or Rust integration tests (see Testing Strategy).
This is the only acceptable substitute for a 🚫 row in TEST-COVERAGE-MATRIX.md. If a feature has neither automated coverage nor an entry on this checklist, treat it as untested and open a coverage gap.
How to use
- Build the release artifact for each platform you ship.
- On a clean machine (or fresh user account), walk through
## Per-release smokethen the section for the active release line. - Tick each box only after you have verified the expected outcome with your own eyes.
- Paste the completed checklist + sign-off block into the release PR description.
- Any item that is genuinely not applicable for this release: mark
N/Awith a one-line reason; do not silently skip. - If
release-staging.ymlwas dispatched withskip_e2e=true, record the reason and link the most recent relevant green pretest evidence in the PR notes (unit/rust and E2E as applicable). That override is for operator recovery, not the default release path.
Per-release smoke
Applies to every release, all platforms.
Public installer script
scripts/install.shdownloads the latest asset on a proxy/VPN network — From a clean checkout, runbash scripts/install.sh --dry-run --verbose, then run the publiccurl -fsSL https://raw.githubusercontent.com/tinyhumansai/openhuman/main/scripts/install.sh | bashflow on one macOS or Linux host. Expected: release metadata resolves, the asset downloads successfully, and transient GitHub/CDN HTTP/2 failures retry over HTTP/1.1 instead of surfacingcurl: (16) Error in the HTTP2 framing layer.
macOS
- Gatekeeper accepts the signed
.appon first launch — Double-click the.appfrom a fresh download (Quarantine attribute set). Expected: app opens without"OpenHuman" cannot be opened because the developer cannot be verifieddialog. If it appears, the build is unsigned or the notarization stapler is missing. codesign --verify --deep --strict <path-to-OpenHuman.app>exits 0 — Run from terminal. Expected: no output, exit 0. Anycode object is not signed at allorinvalid signatureoutput blocks the release.- DMG drag-to-Applications flow works — Mount the
.dmg, dragOpenHuman.appto theApplicationsalias. Expected: copy completes; eject succeeds; first launch from/Applicationsdoes not re-prompt Gatekeeper. - Accessibility permission prompt fires on first agent run — Trigger an agent action that uses Accessibility (e.g. window-control skill). Expected: macOS prompts
OpenHuman would like to control this computer using accessibility features. Granting it allows the action; denying it surfaces a clear in-app fallback. - Input Monitoring prompt fires on first hotkey use — Press the registered global hotkey for the first time. Expected:
Input Monitoringprompt; granting it makes the hotkey trigger; denying it does not crash the app. - Screen Recording prompt fires on first screen-share — Use the screen-share skill or
getDisplayMediashim. Expected:Screen Recordingprompt; granted → picker shows windows + screens; denied → in-app message explaining the requirement. - Meet "Present" surfaces the Chrome screen-picker (regression watch — see #2636) — Open the Google Meet webview account, join a meeting, and click
Present now. Expected: Chromium's native screen-picker UI appears (Entire screen / Window / Chrome tab tabs) andgetDisplayMediaonly resolves after the user picks a source. Hard fail mode: capture starts immediately with no picker — that meansdisplayCapturewas re-granted viaBrowser.grantPermissionsand bypassed Chromium's transient-activation gate. - Slack huddle screen-share surfaces the Chrome screen-picker (regression watch — see #2636) — Open the Slack webview account, start or join a huddle, and click the screen-share button. Expected: same Chromium native screen-picker as Meet; capture only begins after a deliberate user selection. Hard fail mode: huddle begins broadcasting immediately with no picker prompt.
- Microphone prompt fires on first voice capture — Start a voice session. Expected: standard mic prompt; granted → capture begins; denied → fallback message, no panic.
- Bluetooth prompt fires on first Gmeet call (regression watch — see #1288) — Open the Google Meet webview account and join a meeting from a fresh install. Expected: macOS prompts
OpenHuman would like to use Bluetooththe first time the device picker enumerates audio peripherals; granted → AirPods/headsets appear in the picker; denied → fallback to built-in mic, no crash. Hard fail mode (key absent) is a SIGABRT before the prompt can render. - Location prompt does not crash on Gmeet room-finder probe — If Gmeet surfaces nearby-room suggestions, the first probe should trigger
OpenHuman would like to use your current location; granting or denying must NOT crash the app. (Probe path is webview-driven; only verify the no-crash invariant here.) - File picker does not crash on Documents/Downloads/Desktop selections — From an embedded app (Slack, Discord, Telegram), trigger a file upload and pick a file from
Documents,Downloads, andDesktopin turn. Expected: macOS promptsOpenHuman would like to access files in your <Folder> folderthe first time per folder; deny + retry must not crash.
Windows
- SmartScreen does not block install — Run the installer from a fresh download. Expected: SmartScreen passes (signed binary). If
Windows protected your PCappears, the EV signature is missing or the reputation has not built up — escalate before shipping. - Installer creates Start Menu + Desktop shortcuts — Defaults preserved. Expected: both shortcuts launch the app.
- App registers
openhuman://URL scheme — From a browser, click anopenhuman://oauth/success?...link. Expected: OS prompts to open in OpenHuman; clicking through delivers the deep link.
Linux
- Public
install.shprefers the.debpath on clean Ubuntu 24.04 — Runcurl -fsSL https://raw.githubusercontent.com/tinyhumansai/openhuman/main/scripts/install.sh | bashon a host withapt-getanddpkg. Expected: the script resolvesOpenHuman_*_amd64.deborOpenHuman_*_arm64.deb, installs it withapt-get, and launch does not fail on missing CEF runtime libraries such aslibgbm.so.1. .deband/or.AppImageinstall on a clean Ubuntu 22.04 —sudo apt-get install -y --no-install-recommends ./OpenHuman_*.deborchmod +x OpenHuman_*.AppImage && ./OpenHuman_*.AppImage. Expected: no missing-dependency errors; app launches..AppImagelaunches on a clean Ubuntu 24.04 host without a sibling extracted tree — Run the downloaded AppImage directly from an empty directory. Expected: noInterpreter not found!error;sharunfinds its bundled dynamic linker and the app reaches the first window.- OS-native notification toasts fire — Trigger a notification from inside the app (e.g. memory captured, agent finished). Expected: a libnotify-style toast appears outside the app window. (CI Linux sees only Xvfb; this surface verifies on a real desktop.)
- Headless supervisor update stages without self-exit — On a Linux service deployment with
[update] restart_strategy = "supervisor"andrpc_mutations_enabled = false, stage a new core binary through the documented operator flow. Expected: the running process stays up until the supervisor restart, the staged binary is present on disk, andsystemctl restart openhuman(or equivalent) picks up the new version.
Cross-platform
- First launch flow completes for a brand-new user — Fresh OS user account, no
~/.openhumandirectory. Walk through onboarding to first agent reply. Expected: no crashes, no permission deadlocks, no stale-config errors. - Auto-update download + relaunch succeeds — Install the previous release, point the updater feed at this release, trigger an update check. Expected: download completes, relaunch installs the new binary, version string in
Settings > Aboutmatches the release tag. - GitHub Release notes are AI-generated from the previous release tag — Before publishing the draft production release, inspect the GitHub Release body. Expected: notes start with a thematic H1 title, include high-level highlight sections with PR links and contributor thanks, omit a separate pull-request dump, include new-contributor thanks only when applicable, and the full compare URL is previous release tag → current release tag.
- Logging out + logging back in preserves nothing private — Sign out, sign in as a different user. Expected: no leaked memory, threads, or skill state from the previous session (regression watch — see #900).
memory_treemigrates WAL→TRUNCATE on upgrade with memory intact — Install a previous (WAL-era) build, use it enough to populate memory so achunks.db-wal/-shmpair exists under~/.openhuman/.../workspace/memory_tree/, then upgrade to this build. Expected on first launch:PRAGMA journal_modeonchunks.dbreportstruncate, the-wal/-shmside-files are gone, previously-captured memories still surface in recall, and noFailed to initialize memory_tree schemaerrors appear.
Active release line
If multiple stable release lines are in flight (security backports, LTS), add a sub-section per line and check the same boxes for each. As of writing,
0.52.xis the only active line — older minor versions are end-of-life. Fold this section to suit when more release lines exist.
0.52.x — current
- OAuth gate respects
VITE_MINIMUM_SUPPORTED_APP_VERSION(per Release Policy) — Set the variable to a value above this build's version, build, attempt OAuth from the older binary. Expected: gate blocks the deep link; opensVITE_LATEST_APP_DOWNLOAD_URL. - Gmail connect succeeds on a fresh install from
releases/latest— Per release-policy step 4. Expected: token exchange completes, inbox lists in-app.
Sign-off
Release: vX.Y.Z
Tester: @<github-handle>
Date: YYYY-MM-DD
Platforms tested: [macOS arm64] [macOS x64] [Windows] [Linux .deb] [Linux .AppImage]
Notes:
Paste the filled block into the release PR description before tagging.