Skip to content

test(cua-driver): converge Rust desktop E2E contracts - #2161

Closed
f-trycua wants to merge 311 commits into
mainfrom
codex/link-e2e-videos
Closed

test(cua-driver): converge Rust desktop E2E contracts#2161
f-trycua wants to merge 311 commits into
mainfrom
codex/link-e2e-videos

Conversation

@f-trycua

@f-trycua f-trycua commented Jul 10, 2026

Copy link
Copy Markdown
Collaborator

Why

The desktop suites mixed unit checks, shell-generated summaries, one-off guards, and GUI behavior tests. Missing cells could disappear, setup failures could produce reduced green runs, and a successful tool response could be mistaken for input delivery.

This PR makes the Rust harnesses the source of truth for desktop behavior. Repo-local applications expose observable state, and every action must prove either its external effect or an exact structured refusal. Background actions also prove that they did not steal focus, raise the target, move the real cursor, or leak input.

Canonical test model

  • Unit and protocol tests stay desktop-independent and video-free.
  • Electron and Tauri share one 36-cell catalog per app. macOS also runs a native WKWebView host.
  • Native harness owners use the same typed result and evidence contract.
  • AX/PX targeting and foreground/background delivery are dimensions of each action.
  • Focus, z-order, cursor, leaked-input, capture, and desktop-scope checks attach to the actions that need them.
  • Contributors run all; CI partitions shared, native, and capture work only as internal jobs.

Each result records platform, display server, harness, action, targeting, delivery, scope, backend route, expected and observed behavior, independent oracles, duration, and evidence. The reporter rejects missing, duplicate, undeclared, contradictory, or evidence-less rows.

Driver and harness fixes

Evidence and reporting

  • Added source, fixture, accessibility, capture, GUI-session, and playable-video preflights.
  • Resolves one immutable source SHA per workflow and records it in every summary and environment record.
  • Added a physically foreground, fully occluding sentinel for background actions.
  • Requires an allowed structured refusal plus clean desktop-side-effect observations.
  • Records a full-desktop MP4 for each canonical cell and before/after evidence for targeted actions.
  • Added a compact coverage grid and artifact-linked row for each cell.
  • Isolated process-global recording hook phases so parallel unit tests cannot consume another test's before/after capture.

Linux

  • Replaced X11 false-success paths with foreground XTest delivery, semantic background delivery where proven, and exact refusals elsewhere.
  • Added generic ext_foreign_toplevel_list_v1 discovery, native wlroots capture and recording, stable window identity, compositor-aware geometry, and strict session preflights.
  • Added GNOME WinRects geometry and activation plus persistent portal/libei input with revocable grants.
  • Preserves 64-bit Wayland identities, resolves connection-local toplevel IDs by stable process and title data, and reconstructs renderer origins for targeted PX input.
  • Packages libxkbcommon, portal/libei support, the nested compositor, and source-owned Rust tests through Nix.
  • Restored the optional cua-compositor as a separate experimental environment with a versioned acknowledged protocol, PID targeting, exact resource errors, focus and z-order observation, scene geometry queries, direct pointer and keyboard routes, and typed evidence.
  • Makes nested pointer hit-testing target-subtree-local so an occluding sentinel cannot intercept a background action. Renderer child surfaces reuse their bound pointer resource or fall back to the owning root.
  • Keeps standard Wayland and the private nested route separate in result metadata and public documentation.

Windows

  • Restored occluded Electron AX/PX single-left clicks through the proven background-safe PostMessage route.
  • Proved occluded Electron child-window delivery; unsupported Chromium gestures retain exact refusals.
  • Corrected foreground PX activation and renderer keyboard targeting.
  • Added canonical WPF and WebView2 PX background-left-click rows with fixture-owned state and desktop-side-effect oracles.
  • Added WPF background combo selection and an exact WPF background-drag refusal.
  • Made start_minimized fail closed before spawning when Windows cannot guarantee no activation.
  • Reports minimized windows truthfully, filters them from on_screen_only, and restores them through the existing bring_to_front tool.

macOS

  • Restored PX background left-click delivery through AX hit-testing for Electron, Tauri, and AppKit without focus changes.
  • Fixed the first-character loss in foreground PX typing.
  • Converts silent background scroll and drag no-effects into exact background_unavailable refusals.
  • Added the native WKWebView host to the complete shared catalog.
  • Added AppKit scroll, right/double click, slider drag, and background-drag contracts.
  • Added SwiftUI background AX click/value rows and foreground popover state verification.
  • Fixed desktop-scope HID delivery, fixture stability, per-connection daemon sessions, and structured refusal propagation.
  • Preserves the installed app's TCC identity during local installation.

Cleanup

  • Removed the synthetic calculator fixture and duplicate calculator tests.
  • Removed old guard, modality, delivery, and legacy shared owners after mapping useful assertions into typed action rows.
  • Removed shell and PowerShell behavioral inference from Cargo output.
  • Keeps software-dependent checks such as LibreOffice outside canonical all.
  • Added libs/cua-driver/docs/action-support.md, an evidence journal, and the public Platform Support reference.\n- Split the validation model into How Cua Driver Is Validated, covering source-built harnesses, independent oracles, retained evidence, and maintainer-triggered release validation.\n- Added a cross-OS Platform Roadmap that separates evidence gaps, engineering work, experimental environments, and hard OS boundaries without promising dates.

Validation

  • Linux X11: run 29194456173 passed all 108 declared outcomes: 71 delivered, 37 exact refusals, 0 failures, 0 skips.
  • Linux Sway native and capture: run 29195551765 passed native GTK 31/31 and capture/scope 5/5, with playable per-cell video.
  • Linux Sway shared: run 29199656600 passed 29/36 Electron rows, up from 23/36. Focused run 29200827296 then passed all 9/9 Electron PX-background rows at the replacement source. The same 9 Tauri rows remained environment-limited by the hosted DRM/EGL setup.
  • Nested compositor: run 29197643541 passed native GTK 31/31; run 29197887387 passed capture/scope 5/5 with exact LinuxCuaCompositorInject metadata. Full shared run 29199596935 passed 26/36 Electron rows before focused repairs. Run 29200462634 then passed 7/9 occluded PX-background rows. Dedicated scroll run 29200854535 remained red, so the environment stays experimental.
  • GNOME: a representative GNOME 46 session passed 31 native GTK rows, 3 capture contracts, and 2 desktop-scope contracts.
  • KDE: Plasma 6 reached session startup, GTK AT-SPI discovery, generic discovery, and portal-interface preflight. No KDE behavioral matrix is accepted.
  • Packaging and unit gates: Nix source run 29200852035 passed at a78f525a. Linux unit, distribution, docs, script, Windows compile, and the local 35-test testkit suite are green.
  • Windows: run 29166454913 passed all 113 typed rows: 92 delivered, 21 exact refusals, 0 failures, 0 skips.
  • macOS: the complete local matrix passed all 130 declared rows: 124 delivered, 6 exact refusals, 0 failures, 0 skips.

Remaining explicit gaps

  • Standard Wayland cannot route arbitrary raw focus-bound pointer or keyboard input to an occluded, unfocused surface. Unsupported paths return exact structured refusals.
  • Sway Electron still lacks foreground AX right click, foreground AX double click, and foreground AX/PX hotkey delivery.
  • Hosted Sway cannot expose a representative Tauri/WebKitGTK renderer accessibility tree without DRM/EGL. The native frame can exist while the renderer tree is absent.
  • The nested cua-compositor remains experimental. Renderer left/double click, one AX right-click timeout, and renderer scroll are not stable across focused runs. Unicode text and a canonical parallel-drag row remain unproven.
  • KDE lacks a target-addressable KWin activation adapter and an accepted behavioral matrix.
  • GNOME and KDE portal-backed MP4 parity, representative shared renderer runs, and real-Xorg MPX/uinput evidence remain open.
  • SwiftUI transient-panel AX enumeration, Windows elevated-integrity refusal coverage, and several native control combinations remain unproven.

@github-actions

Copy link
Copy Markdown
Contributor

📦 Publishable packages changed

  • cua-driver-rs

Add release:<service> labels to auto-release on merge (+ optional bump:minor or bump:major, default is patch).
Or add no-release to skip.

4 similar comments
@github-actions

Copy link
Copy Markdown
Contributor

📦 Publishable packages changed

  • cua-driver-rs

Add release:<service> labels to auto-release on merge (+ optional bump:minor or bump:major, default is patch).
Or add no-release to skip.

@github-actions

Copy link
Copy Markdown
Contributor

📦 Publishable packages changed

  • cua-driver-rs

Add release:<service> labels to auto-release on merge (+ optional bump:minor or bump:major, default is patch).
Or add no-release to skip.

@github-actions

Copy link
Copy Markdown
Contributor

📦 Publishable packages changed

  • cua-driver-rs

Add release:<service> labels to auto-release on merge (+ optional bump:minor or bump:major, default is patch).
Or add no-release to skip.

@github-actions

Copy link
Copy Markdown
Contributor

📦 Publishable packages changed

  • cua-driver-rs

Add release:<service> labels to auto-release on merge (+ optional bump:minor or bump:major, default is patch).
Or add no-release to skip.

@f-trycua

Copy link
Copy Markdown
Collaborator Author

Convergence landing update: Windows (conv2 2/7) landed as #2180 at 88f88e1b. Exact-source canonical run 29211506624 passed all 114 typed rows (93 delivered, 21 exact refusals, 0 failures/skips) with per-row trajectories and MP4 evidence.

@f-trycua

Copy link
Copy Markdown
Collaborator Author

Convergence landing update: Linux X11 + Wayland (combined conv2 4-5/7) landed as #2182 at 51a8e259. Exact-source X11 run 29213365684 and Sway run 29213349962 each passed the same 108 typed rows (71 delivered, 37 exact refusals, 0 failures/skips), with row-owned trajectory and MP4 evidence.

@f-trycua

Copy link
Copy Markdown
Collaborator Author

Convergence landing update: macOS (conv2 3/7) landed as #2183 at 1d0ff7cc. The exact-source logged-in macOS run at 448d052f passed all 133 typed rows with owned per-cell MP4 and trajectory evidence. The canonical lane includes the repo-local Electron, Tauri, WKWebView, AppKit, and SwiftUI harnesses plus supporting typed Calculator/TextEdit checks.

@f-trycua

Copy link
Copy Markdown
Collaborator Author

Convergence landing update: Nix consolidation (conv2 6/7) landed as #2184 at 5abbd802. Exact-source run 29213921494 passed compositor build, driver package, and Rust unit checks. The optional nested diagnostic 29213925639 kept cua-compositor experimental: capture/scope passed 5/5; native GTK behavior passed 31/31 but strict evidence reporting found missing background state captures; shared Electron passed 17/36 and exposed 19 renderer/sentinel/oracle failures.

@f-trycua

Copy link
Copy Markdown
Collaborator Author

Final convergence landing and parity audit

The #2161 tree has been re-landed as reviewable replacement PRs and sidecars. This draft is now a frozen forensic source, not a merge candidate.

Landing map

Theme Landed PR Merge commit
Docker cleanup sidecar #2177 8cfdd416
TypeScript tooling sidecar #2178 dd0102eb
Typed E2E/evidence foundation #2179 107915af
Shared fixture journal correction #2181 2df3fbd
Windows convergence #2180 88f88e1b
macOS convergence #2183 1d0ff7cc
Linux X11 + Sway convergence #2182 51a8e259
Nix/source-gate consolidation #2184 5abbd802
Docs, release wiring, and obsolete-fixture cleanup #2185 d39b377d

Audit result

  • Frozen source: a42fbd81a4df816517c670b6f63ab693ef559378
  • Final main: d39b377de51eec5a4247ab7b86ce5884bed05ff8
  • Sidecar preservation diff: 0 paths. Docker and TypeScript path sets match the intended frozen state.
  • Allowlisted residual diff: 56 paths, all intentionally newer/adapted and listed below. Every other allowlisted path matches the frozen tree byte-for-byte.
  • Cargo.lock: normalized cargo tree --workspace --locked output is identical between frozen and landed trees; only worktree paths differed before normalization.
  • Lume references: regenerated from current source and both identify 0.3.15.
  • Coverage invariant: every original delta path is owned by the convergence allowlist, a sidecar, or the two generator-adapted Lume references; 0 paths are unclassified.

Adaptation ledger

Path Owner Exact reason
.github/scripts/tests/test_cua_driver_release_wiring.py #2185 (d39b377d) Release reminder now requires exact-SHA Windows, macOS, X11, and Sway validation and tests that wiring.
.github/workflows/ci-nix-linux.yml #2184 (5abbd802) Final Nix source/package gate and explicitly experimental nested-compositor wiring replace the snapshot's bespoke Nix/GIF test shape.
.github/workflows/ci-release-reminder.yml #2185 (d39b377d) Release reminder now requires exact-SHA Windows, macOS, X11, and Sway validation and tests that wiring.
.github/workflows/e2e-rust-linux-wayland.yml #2184 (5abbd802) Final Nix source/package gate and explicitly experimental nested-compositor wiring replace the snapshot's bespoke Nix/GIF test shape.
Development.md #2185 (d39b377d) Current monorepo contributor map and canonical cua-driver validation entry points replace stale snapshot guidance.
docs/content/docs/concepts/how-cua-driver-is-validated.mdx #2185 (d39b377d) Current accepted baselines, capability boundaries, contributor commands, evidence rules, and historical/execution status supersede snapshot wording.
docs/content/docs/concepts/how-lume-expands-macos-disks.mdx #2174 (cda10a4f) Newer main documentation for safe Lume disk expansion; absent from the frozen snapshot and retained.
docs/content/docs/concepts/meta.json #2185 (d39b377d) Hand-composed navigation retains both current-main concepts and the new cua-driver validation explanation.
docs/content/docs/reference/cua-driver/development.mdx #2185 (d39b377d) Current accepted baselines, capability boundaries, contributor commands, evidence rules, and historical/execution status supersede snapshot wording.
docs/content/docs/reference/cua-driver/limits.mdx #2185 (d39b377d) Current accepted baselines, capability boundaries, contributor commands, evidence rules, and historical/execution status supersede snapshot wording.
docs/content/docs/reference/cua-driver/platform-roadmap.mdx #2185 (d39b377d) Current accepted baselines, capability boundaries, contributor commands, evidence rules, and historical/execution status supersede snapshot wording.
docs/content/docs/reference/cua-driver/platform-support.mdx #2185 (d39b377d) Current accepted baselines, capability boundaries, contributor commands, evidence rules, and historical/execution status supersede snapshot wording.
flake.nix #2184 (5abbd802) Final Nix source/package gate and explicitly experimental nested-compositor wiring replace the snapshot's bespoke Nix/GIF test shape.
libs/cua-driver/docs/action-support.md #2185 (d39b377d) Current accepted baselines, capability boundaries, contributor commands, evidence rules, and historical/execution status supersede snapshot wording.
libs/cua-driver/docs/e2e-ci-reporting.md #2185 (d39b377d) Current accepted baselines, capability boundaries, contributor commands, evidence rules, and historical/execution status supersede snapshot wording.
libs/cua-driver/docs/e2e-convergence-journal.md #2185 (d39b377d) Current accepted baselines, capability boundaries, contributor commands, evidence rules, and historical/execution status supersede snapshot wording.
libs/cua-driver/docs/e2e-results-summary-design.md #2185 (d39b377d) Current accepted baselines, capability boundaries, contributor commands, evidence rules, and historical/execution status supersede snapshot wording.
libs/cua-driver/docs/linux-support-completion-plan.md #2185 (d39b377d) Current accepted baselines, capability boundaries, contributor commands, evidence rules, and historical/execution status supersede snapshot wording.
libs/cua-driver/docs/pr-2161-landing-plan.md #2185 (d39b377d) Current accepted baselines, capability boundaries, contributor commands, evidence rules, and historical/execution status supersede snapshot wording.
libs/cua-driver/docs/test-harness-convergence-plan.md #2185 (d39b377d) Current accepted baselines, capability boundaries, contributor commands, evidence rules, and historical/execution status supersede snapshot wording.
libs/cua-driver/docs/test-harnesses-guide.md #2185 (d39b377d) Current accepted baselines, capability boundaries, contributor commands, evidence rules, and historical/execution status supersede snapshot wording.
libs/cua-driver/docs/test-matrix.md #2185 (d39b377d) Current accepted baselines, capability boundaries, contributor commands, evidence rules, and historical/execution status supersede snapshot wording.
libs/cua-driver/rust/Cargo.lock #2182 (51a8e259) Regenerated during Linux landing; normalized locked Cargo dependency trees are identical.
libs/cua-driver/rust/crates/cua-driver-core/src/cdp.rs #2179 (107915af) Equivalent standard-library and recording-owner cleanup retained from the reviewed foundation extraction.
libs/cua-driver/rust/crates/cua-driver-core/src/recording.rs #2179 (107915af) Equivalent standard-library and recording-owner cleanup retained from the reviewed foundation extraction.
libs/cua-driver/rust/crates/cua-driver-core/src/recording_tools.rs #2179 (107915af) Equivalent standard-library and recording-owner cleanup retained from the reviewed foundation extraction.
libs/cua-driver/rust/crates/cua-driver-testkit/src/bin/cua-e2e-report.rs #2179 (107915af) Reporter gained a real help contract used by contributor and CI validation.
libs/cua-driver/rust/crates/cua-driver-testkit/src/e2e.rs #2180 (88f88e1b) Strict evidence validation gained the narrow, tested Windows minimized-window restore classification while still failing unsuccessful restores.
libs/cua-driver/rust/crates/cua-driver-testkit/src/journal.rs #2179 (107915af) Fixture journal socket handling and request writes were hardened without changing the external oracle.
libs/cua-driver/rust/crates/cua-driver-testkit/src/sentinel.rs #2183 (1d0ff7cc) Final cross-platform sentinel posture and observation behavior used by the accepted matrices.
libs/cua-driver/rust/crates/cua-driver/tests/capture_contract_test.rs #2183 (1d0ff7cc) Expanded typed capture contracts and current exact evidence requirements.
libs/cua-driver/rust/crates/cua-driver/tests/cross_platform_behavior_test.rs #2182 (51a8e259) Final X11/Sway renderer identity, geometry, wheel, and external-journal behavior validated by both 108-row Linux runs.
libs/cua-driver/rust/crates/cua-driver/tests/installed_app_launch_macos_test.rs #2183 (1d0ff7cc) Calculator/TextEdit checks are typed supporting rows in the canonical logged-in macOS lane with stable TCC identity.
libs/cua-driver/rust/crates/cua-driver/tests/installed_app_textedit_macos_test.rs #2183 (1d0ff7cc) Calculator/TextEdit checks are typed supporting rows in the canonical logged-in macOS lane with stable TCC identity.
libs/cua-driver/rust/crates/cua-driver/tests/launch_windows_test.rs #2180 (88f88e1b) Final minimized-launch refusal and successful restore contract with external state evidence.
libs/cua-driver/rust/crates/cua-driver/tests/protocol_schema_test.rs #2180 (88f88e1b) Consolidated current cross-platform schema assertions replace duplicated snapshot declarations.
libs/cua-driver/rust/crates/platform-linux/Cargo.toml #2182 (51a8e259) Post-snapshot Linux fixes for AT-SPI, authoritative Sway identity/geometry, renderer targeting, capture, health reporting, and exact refusals.
libs/cua-driver/rust/crates/platform-linux/protocol/virtual-keyboard-unstable-v1.xml #2182 (51a8e259) Retained live virtual-keyboard implementation files still consumed by the Wayland backend; the frozen deletion was not replayed.
libs/cua-driver/rust/crates/platform-linux/src/atspi/native.rs #2182 (51a8e259) Post-snapshot Linux fixes for AT-SPI, authoritative Sway identity/geometry, renderer targeting, capture, health reporting, and exact refusals.
libs/cua-driver/rust/crates/platform-linux/src/health_report.rs #2182 (51a8e259) Post-snapshot Linux fixes for AT-SPI, authoritative Sway identity/geometry, renderer targeting, capture, health reporting, and exact refusals.
libs/cua-driver/rust/crates/platform-linux/src/lib.rs #2182 (51a8e259) Post-snapshot Linux fixes for AT-SPI, authoritative Sway identity/geometry, renderer targeting, capture, health reporting, and exact refusals.
libs/cua-driver/rust/crates/platform-linux/src/overlay.rs #2182 (51a8e259) Post-snapshot Linux fixes for AT-SPI, authoritative Sway identity/geometry, renderer targeting, capture, health reporting, and exact refusals.
libs/cua-driver/rust/crates/platform-linux/src/tools/impl_.rs #2182 (51a8e259) Post-snapshot Linux fixes for AT-SPI, authoritative Sway identity/geometry, renderer targeting, capture, health reporting, and exact refusals.
libs/cua-driver/rust/crates/platform-linux/src/tools/stubs.rs #2182 (51a8e259) Post-snapshot Linux fixes for AT-SPI, authoritative Sway identity/geometry, renderer targeting, capture, health reporting, and exact refusals.
libs/cua-driver/rust/crates/platform-linux/src/wayland/mod.rs #2182 (51a8e259) Post-snapshot Linux fixes for AT-SPI, authoritative Sway identity/geometry, renderer targeting, capture, health reporting, and exact refusals.
libs/cua-driver/rust/crates/platform-linux/src/wayland/sway_ipc.rs #2182 (51a8e259) Post-snapshot Linux fixes for AT-SPI, authoritative Sway identity/geometry, renderer targeting, capture, health reporting, and exact refusals.
libs/cua-driver/rust/crates/platform-linux/src/wayland/virtual_keyboard.rs #2182 (51a8e259) Retained live virtual-keyboard implementation files still consumed by the Wayland backend; the frozen deletion was not replayed.
libs/cua-driver/rust/crates/platform-windows/src/capture.rs #2180 (88f88e1b) Post-snapshot Windows minimized/off-screen capture truth and proven background delivery/refusal routes.
libs/cua-driver/rust/crates/platform-windows/src/tools/impl_.rs #2180 (88f88e1b) Post-snapshot Windows minimized/off-screen capture truth and proven background delivery/refusal routes.
libs/cua-driver/tests/fixtures/smoke/macos.sh #2183 (1d0ff7cc) Final stable-TCC install smoke and selector-free 133-row macOS runner.
nix/cua-driver/README.md #2184 (5abbd802) Final Nix source/package gate and explicitly experimental nested-compositor wiring replace the snapshot's bespoke Nix/GIF test shape.
nix/cua-driver/compositor/cua_compositor_patch.py #2184 (5abbd802) Final Nix source/package gate and explicitly experimental nested-compositor wiring replace the snapshot's bespoke Nix/GIF test shape.
nix/cua-driver/package.nix #2184 (5abbd802) Final Nix source/package gate and explicitly experimental nested-compositor wiring replace the snapshot's bespoke Nix/GIF test shape.
scripts/ci/README.md #2185 (d39b377d) Current accepted baselines, capability boundaries, contributor commands, evidence rules, and historical/execution status supersede snapshot wording.
scripts/ci/linux/run-rust-e2e-wayland.sh #2182 (51a8e259) Final selector-free Sway runner used by the accepted exact-source 108-row lane.
scripts/ci/macos/run-rust-e2e.sh #2183 (1d0ff7cc) Final stable-TCC install smoke and selector-free 133-row macOS runner.
docs/content/docs/reference/lume/cli-reference.mdx #2185 (d39b377d) Regenerated from current Lume 0.3.15 source; the frozen 0.3.14 bytes were intentionally not replayed.
docs/content/docs/reference/lume/http-api.mdx #2185 (d39b377d) Regenerated from current Lume 0.3.15 source; the frozen 0.3.14 bytes were intentionally not replayed.

Accepted behavioral evidence remains linked on the replacement PRs: Windows 114/114, macOS 133/133, Linux X11 108/108, and Linux Sway 108/108. Nix source/package checks are green; the private nested compositor remains explicitly experimental with its exact diagnostic failures recorded on #2184.

Closing #2161 as closed, not merged. The codex/link-e2e-videos branch remains preserved through at least 2026-08-11 and until the first post-landing cua-driver release validates cleanly.

@f-trycua

Copy link
Copy Markdown
Collaborator Author

Post-merge audit correction

A second independent audit, led by Claude Opus 4.8 and verified against the true base (fb5bc192), frozen head (a42fbd81), and landed stack (d39b377d), confirmed the path-level landing and found one shared-file test-coverage omission.

protocol_schema_test.rs had become Windows-centric during the split: Linux was excluded, macOS delivery/scope assertions were reduced, and Linux's unique set_agent_cursor_motion applied-value test was dropped. The prior adaptation-ledger description of this row as an intentional cross-platform consolidation was therefore incorrect. Driver implementation and the accepted Windows/macOS/X11/Sway E2E matrices were unaffected.

The correction landed in #2189 as 2bbbb11a:

  • restored delivery-mode schema assertions across Linux, macOS, and Windows
  • restored macOS click-scope and Linux/Windows capture-scope contracts
  • restored Linux cursor-motion applied-value assertions
  • made Windows unit CI execute the protocol schema contract instead of compiling it only
  • recorded the correction in the historical landing plan

Validation is green: Linux unit, Windows unit, Nix source/package/unit, docs, and the local macOS protocol test.

Final split-parity verdict after #2189: COMPLETE WITH INTENTIONAL DIVERGENCES. Every original delta path remains accounted for; sidecars, dependency parity, platform behavior, typed evidence, trajectories/video links, CI/release wiring, and documented Wayland limitations were preserved or strengthened.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants