91e75e620b
CI: cua-driver distro-compat matrix / debian:12 (glibc 2.36) (push) Has been cancelled
CI: SPDX Headers / Check SPDX headers (warn-only) (push) Has been cancelled
CD: Docs MCP Server / build (linux/amd64) (push) Has been cancelled
CD: Docs MCP Server / build (linux/arm64) (push) Has been cancelled
CD: Docs MCP Server / merge (push) Has been cancelled
CI: cua-driver distro-compat matrix / Resolve release version (push) Has been cancelled
CI: cua-driver distro-compat matrix / fedora:41 (glibc 2.40) (push) Has been cancelled
CI: cua-driver distro-compat matrix / rockylinux:9 (glibc 2.34) (push) Has been cancelled
CI: cua-driver distro-compat matrix / ubuntu:22.04 (glibc 2.35) (push) Has been cancelled
CI: cua-driver distro-compat matrix / ubuntu:24.04 (glibc 2.39) (push) Has been cancelled
CI: cua-driver distro-compat matrix / Distro compat summary (push) Has been cancelled
CI: Rust Linux unit / Rust Linux unit and compile (push) Has been cancelled
CI: Rust Windows unit / Rust Windows unit and compile (push) Has been cancelled
CI: Nix Linux Rust source / Nix / compositor build (push) Has been cancelled
CI: Nix Linux Rust source / Nix / driver package (push) Has been cancelled
CI: Nix Linux Rust source / Nix / Rust unit tests (push) Has been cancelled
90 lines
8.9 KiB
Markdown
90 lines
8.9 KiB
Markdown
# Desktop action support
|
|
|
|
This ledger records the canonical Rust harness contracts for Windows, macOS,
|
|
and Linux. It is derived from typed `CaseSpec` rows and accepted E2E evidence,
|
|
not from a successful driver response alone.
|
|
|
|
- **Delivered** means a fixture-owned state change was observed.
|
|
- **Refused** means the exact structured refusal code and all required desktop
|
|
side-effect oracles passed.
|
|
- **Gap** means unsupported or not yet proven. A missing row is never evidence
|
|
that an action is impossible.
|
|
|
|
AX and PX describe how the target is selected. They do not require the same
|
|
delivery backend: a PX target may be hit-tested and delivered through AX/UIA
|
|
when that is the background-safe route.
|
|
|
|
## Accepted baselines
|
|
|
|
| Environment | Exact source | Accepted evidence |
|
|
| --- | --- | --- |
|
|
| Windows/Win32 | `6d7f02e4` | Run `29211506624`: 114/114 rows, 93 delivered and 21 exact refusals |
|
|
| macOS/Quartz | `448d052f` | Logged-in local matrix: 133/133 rows with owned per-cell MP4 evidence |
|
|
| Linux/X11 | `72083bb4` | Run `29213365684`: 108/108 rows, 71 delivered and 37 exact refusals |
|
|
| Linux/Sway | `72083bb4` | Run `29213349962`: 108/108 rows, 71 delivered and 37 exact refusals |
|
|
|
|
## Shared web harnesses
|
|
|
|
Foreground rows listed here are delivered for both AX and PX.
|
|
|
|
| OS | Harness | Background delivered | Background refused |
|
|
| --- | --- | --- | --- |
|
|
| Windows | Electron | left click and child window AX/PX | right click and double click AX/PX, plus drag PX: `background_occluded`; type text, press key, hotkey, and scroll AX/PX plus editor save AX: `background_unavailable`; `start_minimized` launch: `background_unavailable` when Windows denies the foreground lock, with no process spawned |
|
|
| Windows | Tauri | left/right/double click AX/PX, type text AX/PX, press key AX/PX, child window AX/PX, scroll AX, editor save AX | hotkey AX/PX and scroll PX: `background_unavailable`; drag PX: `background_occluded` |
|
|
| macOS | Electron | left/right/double click AX/PX, type text AX/PX, press key AX/PX, hotkey AX/PX, child window AX/PX, editor save AX | scroll AX/PX and drag PX: `background_unavailable` |
|
|
| macOS | Tauri | left/right/double click AX/PX, type text AX/PX, press key AX/PX, hotkey AX/PX, scroll AX/PX, child window AX/PX, editor save AX | drag PX: `background_unavailable` |
|
|
| macOS | WKWebView | left/right/double click AX/PX, type text AX/PX, press key AX/PX, hotkey AX/PX, scroll AX/PX, child window AX/PX, editor save AX | drag PX: `background_unavailable` |
|
|
| Linux X11 | Electron | Background AX left click and child-window actions deliver with strict focus, z-order, cursor, and input-leak oracles | Background PX left click, AX/PX right and double click, PX child window and drag, AX/PX keyboard and scroll, and AX editor save return exact `background_unavailable` |
|
|
| Linux X11 | Tauri | Background AX/PX left click and child-window actions deliver with strict focus, z-order, cursor, and input-leak oracles | Other background pointer, keyboard, scroll, drag, and editor-save shapes return exact `background_unavailable` |
|
|
| Linux Sway | Electron | The full 36-cell catalog has accepted fixture-owned evidence; safe semantic and compositor routes deliver | Focus-bound and raw background shapes without a target-addressed route return their declared exact refusal |
|
|
| Linux Sway | Tauri | The full 36-cell WebKitGTK catalog has accepted fixture-owned evidence, including live compositor geometry and roleless WebProcess targeting | Focus-bound and raw background shapes without a target-addressed route return their declared exact refusal |
|
|
|
|
All shared background rows require fixture state, focus, z-order, cursor, and
|
|
no-leaked-input evidence. Foreground rows require fixture state and retain a
|
|
video plus before/after turn evidence.
|
|
|
|
## Native Windows
|
|
|
|
| Harness | Proven contracts | Refusals and gaps |
|
|
| --- | --- | --- |
|
|
| WPF | Native AX controls; background combo selection, left click, and value changes; PX background left click through UIA hit-testing; foreground pointer gestures | Background F5 and PX drag are `background_unavailable`. Additional PX gesture rows remain unproven. |
|
|
| WinUI3 | Current UIA control, value, selection, popup, and slider rows | Background right/double-click refusal behavior and broader PX coverage remain unproven. |
|
|
| WebView2 | CDP page operations; native PX background left click through UIA hit-testing | Native keyboard and broader pointer cells remain unproven outside the shared Tauri/Electron hosts. |
|
|
|
|
`background_uipi_blocked` is a production refusal code with no canonical
|
|
elevated fixture today. It must not be counted as covered until a controlled
|
|
integrity-level harness can exercise it.
|
|
|
|
## Native macOS
|
|
|
|
| Harness | Proven contracts | Refusals and gaps |
|
|
| --- | --- | --- |
|
|
| AppKit | AX tree/capture; AX background left click, set value, and type text; PX background left/right/double click; PX foreground right/double click and slider drag; AX foreground/background scroll; desktop PX foreground left click | PX background slider drag returns exact `background_unavailable`. Native press key, hotkey, AX-addressed right/double click, and broader control combinations remain unproven. |
|
|
| SwiftUI | AX tree/capture; AX background left click and set value; foreground popover-trigger activation | The fixture proves `popover_open=true`, but the transient panel remains absent from targeted AX enumeration. Other native pointer and keyboard combinations remain unproven. |
|
|
| WKWebView | Full 36-cell shared-web catalog through the dedicated repo-local native host | PX background drag returns exact `background_unavailable`; the other 35 shared cells deliver. Native host-specific controls are outside this fixture. |
|
|
|
|
## Native Linux
|
|
|
|
Linux is recorded per display server and compositor because Wayland protocols
|
|
are capabilities, not one uniform API.
|
|
|
|
| Environment | Proven contracts | Refusals and gaps |
|
|
| --- | --- | --- |
|
|
| X11/Openbox | Exact run `29213365684` passed all 108 declared outcomes: 71 deliveries and 37 exact refusals. GTK3 AT-SPI actions and values, foreground XTest pointer/keyboard routes, capture, desktop scope, and the complete Electron/Tauri catalog all reached fixture-owned oracles. | Xvfb does not prove the real-Xorg MPX/uinput background pointer route. Toolkits that reject XSendEvent retain exact refusals. |
|
|
| Sway/wlroots | Exact run `29213349962` passed the same 108 outcomes as X11: 71 deliveries and 37 exact refusals. The complete Electron, Tauri, GTK3, capture, and desktop-scope catalogs use live Sway identity/geometry and external fixture oracles. | Stock Wayland cannot target raw focus-bound input at an occluded surface. Those rows retain exact refusals; another wlroots compositor is not assumed equivalent until a material divergence is reported and tested. |
|
|
| GNOME/Mutter | A real GNOME 46 Wayland run passed the full GTK3 matrix, 31/31. The WinRects helper supplies stable window ids, frame and buffer geometry, stacking, verified activation, stage capture, and the compositor cursor. AT-SPI handles semantic actions; persistent portal/libei sessions deliver foreground PX click, right/double click, drag, scroll, type, key, and hotkey. Background rows either deliver through AT-SPI with focus and leak guards or return the declared exact refusal. | The helper requires installation plus one Shell-session restart. Without it, target-bound foreground input refuses. Portal video and a shared Electron/Tauri GNOME run remain open. |
|
|
| KDE/KWin | A Plasma 6 session reached GTK AT-SPI discovery, generic toplevel discovery, and portal-interface preflight. Portal input is compiled into release binaries. | No behavioral matrix is accepted. A target-addressable KWin activation adapter is not implemented, so foreground portal/libei input refuses instead of injecting into the wrong focused app. |
|
|
| Nested `cua-compositor` | The optional backend owns its nested session and is covered by typed shared, native, and capture catalogs. Run `29197643541` passed native GTK3 31/31; run `29197887387` passed capture/scope 5/5. Full shared run `29199596935` passed 26/36 Electron rows before the occluded-subtree and wheel-frame repairs. | The lane remains experimental. The accepted full shared run still has 10 failures; focused replacement runs reduce that set but do not promote the environment. Unicode text and a canonical parallel-drag row remain unproven. This private route is not evidence of a stock-Wayland capability. |
|
|
|
|
PX background left-click rows may resolve the screen point to an actionable
|
|
AT-SPI node. Such a pass proves the public PX-addressed behavior and its desktop
|
|
side effects, but it does not prove raw pixel delivery to canvases or games.
|
|
|
|
## Maintenance rule
|
|
|
|
Update this document only when a typed row is added, removed, or changes
|
|
contract and an empirical run supports the change. Keep unsupported delivery
|
|
as an exact refusal where the driver can determine it before dispatch. When an
|
|
OS API reports success but offers no effect read-back, retain a visible gap
|
|
rather than inventing a fixture-specific refusal in production code.
|