Runtime Smoke Checklist
Run these checks in a nested Hyprland session or another disposable compositor session before publishing a release.
scripts/run-nested.sh launches a disposable nested session with a fresh user-owned build under ${XDG_CACHE_HOME:-$HOME/.cache}/hyprexpo.
scripts/dev-watch.sh rebuilds and relaunches that session on source changes.
For the issue #85 fixture, run:
HYPREXPO_DEV_LAYOUT=scrolling ./scripts/run-nested.shThis explicit mode creates right/left/down/up native scrolling workspaces, a mixed-layout row, a three-column workspace with a multi-target column and an offscreen target, plus floating, grouped, fullscreen, and pinned cases. The default without HYPREXPO_DEV_LAYOUT remains the unchanged grid fixture.
The complete exact-ABI automated gate is:
./scripts/validate-scrolling-overview.sh --all \
--evidence .planning/quick/260828-w7w-implement-issue-85-provide-a-niri-like-o/260828-w7w-05-RUNTIME-EVIDENCE.mdThis command is reusable after merge. Before publishing issue #85 specifically, append --issue-85-publication-check to also require the approved feature branch, base, linear Lore history, and absent remote branch/PR.
Nested test binds:
F10for overviewSUPER+Returnfor a terminalSUPER+1..9for workspacesSUPER+SHIFT+1..9to move a windowSUPER+Qto close a windowSUPER+SHIFT+Qto exit
Checklist
Load the locally built plugin and confirm no API/hash mismatch is reported.
Toggle overview on and off with
hyprexpo:expo, toggle.Cancel overview with the configured
cancel_keyand confirm the workspace does not change.Move keyboard focus with
hyprexpo:kb_focus, then select withhyprexpo:kb_confirm.Select by pointer or touch near the outside edges of the monitor.
Confirm current, hover, focus, label, and border styling render as configured.
Open two or more windows on one workspace, open overview, press on a visible window preview, drag across the move threshold, and confirm the under-pointer drag proxy appears.
Drag that window preview over another valid workspace tile and confirm a positional landing proxy appears inside the hovered target tile.
Move the pointer within the target tile and between target tiles; confirm the landing proxy tracks the pointer position, preserves the original grab offset, and disappears when hovering the source or an invalid target.
Release on a target workspace and confirm the window still moves through the existing safe workspace move behavior. This release is not yet a positional layout insertion.
In Lua config, register distinct
expoandcancelgestures (for example, four-finger up and four-finger down). With the overview closed, begin the cancel gesture and confirm it remains closed.In grid mode, complete the expo gesture and confirm its existing open/select behavior is unchanged. In scrolling mode, confirm both expo-close and cancel swipes keep the opening workspace, then verify pointer selection and keyboard confirmation commit the chosen target separately.
From the workspace where the overview opened, hover a different tile and make a partial cancel swipe. Confirm the animation returns to the same still-open overview and the origin workspace has not changed.
Repeat with a completed cancel swipe. Confirm the overview closes onto the origin workspace rather than the hovered tile.
Open from the origin workspace, hover another tile, begin an expo close, and release below the completion threshold so the overview restores. Without changing the hovered tile, complete cancel and confirm its animation retargets the origin and closes there. Repeat open/completed-cancel once more to catch stale swipe state, then inspect the nested compositor log for crashes, assertions, API/hash mismatches, and stale-callback errors.
Open or create a Picture-in-Picture-like pinned window. In the nested session, one practical path is to focus a test window and run
hyprctl dispatch pinfrom a terminal.With the default
plugin:hyprexpo:show_pinned_windows = 0, open overview and confirm the pinned window is not rendered into every workspace preview tile.Set
plugin:hyprexpo:show_pinned_windows = 1, reload or apply the keyword, reopen overview, and confirm pinned windows render in previews again for users who opt in.Set
plugin:hyprexpo:show_pinned_windows = 0again, close overview, and confirm the pinned window is still visible and pinned in the normal Hyprland session.Unload or reload the plugin after closing overview and confirm no stale render pass callback crashes the session.
Enable
dynamic_grid = 1, then test with 1, 2, 3, and 5 non-empty, non-special workspaces. Confirm the overview contains exactly those workspaces without padded empty tiles.Confirm every preview preserves the monitor aspect ratio. For 3 and 5 workspaces, confirm the partial final row is independently centered.
Set
label_pos = top_right, choose a visiblelabel_size, and toggleshow_workspace_names. Confirm every label remains inside its corresponding tile.Toggle
wallpaper_bgand reopen the overview. Confirm the wallpaper changes only the background and does not move or resize tiles.Toggle
mru_sortand confirm the current workspace moves to the first tile only when enabled. Togglefill_gapswith non-contiguous workspace IDs and confirm missing IDs are added only when enabled.With only one active workspace, complete and cancel a swipe. Confirm the overview exits cleanly without a crash or invalid animation state.
With
dynamic_grid = 1, leave the current workspace empty and open a window on a neighboring workspace. Open and close withhyprexpo:expo, toggle; confirm the current workspace does not change.With
dynamic_grid = 1andfill_gaps = 1, create distant workspace IDs (for example 1 and 5000). Open the overview; confirm it rejects gap expansion, remains responsive, and shows only the sparse workspaces.With
dynamic_grid = 1, setlabel_enable = 0, thenlabel_show = never, and set modernborder_color_current/border_color_hovervalues. Confirm labels stay hidden and the modern border colors win over legacy highlight values.In scrolling mode, prove hover enter/change/clear, click, threshold drag, real wheel pan, every positional drop zone, cross-workspace and mixed fallback moves, terminal next-empty creation, outside/no-op release, and rollback diagnostics.
Cancel touch pending, pan, and drag states. Confirm no selection/drop, no stuck consumption or proxy, and immediate mouse/touch reacquisition.
Capture topology before and after map/unmap/move/reload/close/unload cycles; confirm offset/order/width/size equality where no mutation was requested.
Repeat on rotated/fractional output settings, then launch the default grid fixture and confirm its appearance, selection, drag, cancel, and close paths.
WARNING
The public site and docs should not claim full release readiness until this runtime smoke gate has been completed for the intended release artifact.