Launcher drawer and route source checkpoint
This checkpoint starts the final gesture session behind k230-touch-launcher --serve; the existing no-argument launcher remains the rollback menu. The persistent process leaves its layer surface unmapped while idle. k230-touch-launcher --surface drawer|shade|settings sends a bounded request through a mode-0600 socket in the session runtime directory. A successful helper exit means the persistent process accepted and submitted the mapping request, not that a frame reached the panel. The mapped surface uses the k230-shell-drawer namespace agreed with the card compositor owner. It draws no fake application cards: the live deck remains owned by Sway. The drawer itself lists installed desktop entries continuously with names and existing artwork, without Previous/Next pagination or a permanent footer. This route is not yet selected as the normal image session.
The drawer touch model tracks scroll displacement while a finger moves, preserves sampled velocity until release, bounds its offset and flick velocity, stops coasting on a new contact without launching, and cancels tap on a scroll, long press, second contact or Back. A long press opens a cancellable context sheet. Scrolled row artwork and hit regions are clipped to the list viewport. The route listener accepts requests without a blocking read inside the Wayland loop. On an actual app selection, the client unmaps its surface, waits asynchronously with a 1.2-second bound for card_shell back to leave the live deck, then launches the chosen app; Cancel simply unmaps the drawer. This is host/source evidence only. The compositor’s deck-to-drawer gesture command, Settings and notification data consumers, complete scene synchronization, actual Wayland mapping test, cross-build, installed image and real-finger proof remain open. No OpenSpec task is checked by this partial checkpoint.
Host checks from this source tree:
python3 tests/test_shell_gestures.py
PASS: drawer-drag, flick-stop, finger-coast, cancel-below-threshold, tap-launch,
hold-cue, move-cancel, back-cancel, second-contact
python3 tests/test_shell_routes.py --case route-socket
PASS: production launcher compiled; route client receives a positive
local acknowledgement, rejects unknown routes, and fails closed
when the private route socket is unavailable.
python3 tests/test_launcher_navigation.py
PASS: 3 existing rollback navigation/client checks.
python3 tests/test_shell_icons.py --case theme --case missing --case cache-bound --case notification-icon --case private-no-identity
PASS: 5 existing icon/privacy checks.
These tests do not run a compositor. They do not prove drawer movement on glass, layer z-order, scene presentation, keyboard ownership, or the user-visible final route.