fix(webviews): contain harness setup hover to action button

Merged
TE
9d ago
+85-1

What changed

Removes the hover background from harness setup rows, whose action button is the only click target. The surrounding row remains unfilled when the pointer is over its blank area. Primary Install and Sign in actions now have an explicit accent hover fill, preserving their resting appearance.

Leo exact words (2026-10-28): “clicking around, starting up a new workspace, a new tab, a new chat. How ergonomic is that? Are the things properly exposed? Are we covering the edge cases for when, you know, something isn’t going right, if there’s recovery, whatever, stuff like that.”

Standing rule: “A hover or press highlight covers only the control it belongs to, never the whole row around a small control.”

Validation

  • Final head: 319e00358040ec6b1abd5fd43c01497eb0bf932e; implementation base: 1f0f687b2f32a9f506e19e7f683e8362fd3da6b2.
  • Independent Codex Astra high/fast exact-head source review: SHIP (session 01a184a8-6400-75e3-9e33-22f8f7386453).
  • scripts/web-lint.sh, python3 scripts/cmux-next/prepush-gate.py, git diff --check, and browser-test lane import checks pass.
  • Final focused run 40781155380 passed on the exact final head, attempt 1.
  • The rendered regression covers the actual HarnessesScreen in light/dark themes, neutral/blue accents, primary Install/Sign in and ordinary actions, blank-row hover, button hover, and pointer exit. Its fixture has no automatic play.
  • Gallery health health (0) failed on the final head at run 40781148818, job 123142854466. The same health (0) shard failed on the implementation base at run 40774164763, job 123118946005, with the same failed step and generic exit-code-1 annotation; this is a base red, not caused by this PR.

Before / after captures

Actual whole-host CUA captures were reviewed at the final head in light and dark modes. The public crops contain only the HarnessesScreen. Blank-row pointer rest leaves the row background unchanged; moving onto Install/Sign in changes only the button fill. Measured samples are recorded in the private handoff metadata.

Light row before and after
Dark row before and after
Light primary rest and hover before and after
Dark primary rest and hover before and after

Current landing blocker

The final-head react-apps-base-check (1) rerun still fails on attempt 2 job 123220786905: test/composer-location-strip.test.ts times out at 120 seconds, and test/agent-pane-attach-huge-files.test.ts fails its .mov 300 MB, .bin 2 GB, and .mp4 500 MB cases. Attempt 2 reproduces the failed attempt 1 result. These tests pass on the base in run 40783304241 shard 2. The timed-out run is not a base-red excuse. The diff changes only HarnessesScreen.gallery.tsx, harnesses.css, and harnesses-hover.test.ts, so no changed path overlaps either failure. Landing is held on this named head-only CI blocker pending the owning web CI/test recovery.

Scope

Harness setup action hover only. Related Needs You and Passwords changes remain outside this PR pending live ownership checks. No native Settings HarnessesCard changes.

Changelog

Fixed: contain Harnesses setup hover feedback to the actual action button.

Agent session: agent session