Skip to content

Windows parity: in-window dark jump palette matching macOS (#776) - #788

Merged
coneilen merged 3 commits into
mainfrom
coneilen-microsoft-jump-palette-parity
Oct 14, 2026
Merged

coneilen merged 3 commits into
mainfrom
coneilen-microsoft-jump-palette-parity

Conversation

@coneilen

@coneilen coneilen commented Oct 14, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Rebuild Jump to loop as a contained dark palette below the toolbar, with a magnifier, search cue, esc hint, and two-line typed/stated project results. Main and Composite are labelled correctly.

Refs #776. Parity partial. Both acceptance boxes are implemented and shown for the paired eight-row reference. Exact-head CI integration passed, including registered-project startup and the updated palette UIA assertions. Broader visual/accessibility residuals remain; do not close the issue or promote the ledger from this PR.

Changes

  • Clamp 460px palette geometry to the client area below the toolbar and above the footer, with DPI scaling and restored focus after modal teardown.
  • Keep native EDIT/LISTBOX controls, LBS_HASSTRINGS and overflow scrolling. Draw 42px title/context rows, type bars and state dots; expose no-match feedback through native STATIC text.
  • Retain ranking, wrapped Up/Down, Enter, Escape and double-click. Own result strings across daemon refreshes and insert UTF-16 surrogate pairs atomically; incomplete scalars cannot trigger Enter acceptance.
  • Only JumpPalette.zig and the coordinator-approved jump assertion block changed. Existing test-root registration is retained.

Approved gate changes (all positive counts, bounds, Return dismissal and destination checks retained):

Before After
Search loops label Jump to loop
A: title → project → Goal → succeeded Exact UIA loop A\nGoal · DONE · UIA project
C: title → project → Timed → awaitingInput Exact UIA loop C\nTimed · NEEDS YOU · Jump fixture
B: title → project → Proactive → running Exactly one UIA loop B\nComposite · RUNNING · UIA project

ValidationRunner.Tests.ps1 has no matching palette markers to update; its source-contract run passed.

Test plan

Commands below ran from graphcode-windows after loading C:\gct\e\environment.ps1. Logs and retained failed attempts are under C:\gcs\e.

RED: & $env:GRAPHCODE_ZIG0152 test src\JumpPalette.zig -target x86_64-windows-msvc -lc -luser32 -lgdi32 "-I$env:GRAPHCODE_WINGHOSTTY_ROOT\include" --cache-dir C:\gcs\e\zig-cache --global-cache-dir C:\gcs\e\zig-global --test-filter "palette parity" -> 0 passed; 2 failed: expected Main, found Turn; expected 42, found 19 (red.log).
GREEN: & $env:GRAPHCODE_ZIG0152 test src\JumpPalette.zig -target x86_64-windows-msvc -lc -luser32 -lgdi32 "-I$env:GRAPHCODE_WINGHOSTTY_ROOT\include" --cache-dir C:\gcs\e\zig-cache --global-cache-dir C:\gcs\e\zig-global --test-filter "palette parity" -> All 6 tests passed (green-complete-palette.log).
REGRESSION: & $env:GRAPHCODE_ZIG0152 test src\JumpPalette.zig -target x86_64-windows-msvc -lc -luser32 -lgdi32 "-I$env:GRAPHCODE_WINGHOSTTY_ROOT\include" --cache-dir C:\gcs\e\zig-cache --global-cache-dir C:\gcs\e\zig-global -> All 15 tests passed (regression-complete-palette.log).

Command / gate Result and limit
Pinned Zig build -Doptimize=ReleaseSafe -Dwinghostty-dir=C:\gcp\e\winghostty --cache-dir C:\gcs\e\app-cache --global-cache-dir C:\gcs\e\zig-global --prefix C:\gcs\e\app Pass; build-complete-palette.log is empty, so build success is also recorded by the tool exit status and exact executable hash below.
pwsh -NoProfile -File Tools\windows\Tests\ValidationRunner.Tests.ps1 Pass, 384 protocol cases; non-fatal controlled teardown warnings. Static only, not execution of the new jump assertions.
pwsh -NoProfile -File Tools\windows\validate.ps1 -Task windows-shell -SkipTrayLive -ShellPart unit -ShellValidationRoot C:\gcs\e\v Pass via test-runner agent: 55/55 sections, 58 sources, 79 positive Zig-root completions summing 4358 repeated test executions; final App root 1178, five isolation tests, exit 0. This began before later palette fixes; the final 15-test root covers those.
pwsh -NoProfile -File Tools\windows\validate.ps1 -Task windows-shell -SkipTrayLive -ShellPart integration -ShellValidationRoot C:\gc-e -SwiftExecutable $env:GRAPHCODE_SWIFT633 Failed twice, both at ScrubbedShellStartup.Live.Tests.ps1:250: registered-project did not show the registered daemon project row. No transient/product/host attribution established. Both passed isolation, Swift products, two provider builds, shell smoke/stress and concurrent daemon handoff. Both had 19 requests/responses, no unanswered requests and reconnect evidence.
Gates after local startup failure NotExecuted locally: production wire round-trip, later tray contracts, full live UIA gate including updated palette assertions. Physical tray interaction intentionally skipped. These downstream gates ran successfully in exact-head CI.
Exact-head CI run 38516067509, integration job 115695091870 Success at head d560395fff060fdd513de9f80b49158b8b603004: SCRUBBED_SHELL_STARTUP: PASS; executed=5, including registered-project, then the native UIA live gate. Palette evidence had 3 contextual results, one filtered Composite/RUNNING result and Return destination UIA loop B.
pwsh -NoProfile -File C:\gcs\e\capture-palette.ps1 -Root C:\gcs\e\final8 Pass, 8 rows, 96 DPI, production shell with synthetic repository-derived stub; injected WM_KEYDOWN Up/Down/Escape.
Same capture with -Root C:\gcs\e\final12 -RowCount 12 Pass; native UIA ScrollPattern was acquired, VerticallyScrollable and positive scroll advance required, then reset. Not physical input or full AT conformance.
pwsh -NoProfile -File Tools\tdd\Test-TddEvidence.ps1 -BodyPath C:\gcs\e\pr-body-publish.md Pass.

Failed attempts retained, not folded into green: shared locked-profile preflight failures (no tests ran; owned-profile retry passed); test-edit compile error; two invalid single-row scrollbar harness assertions (ten-row overflow harness passed); four capture-peer harness failures before the repository-derived peer; visually found missing cue banner (fixed and recaptured); Swift duplicate-module cache-alias compiler assertion (owned old cache retained, consistent-root rebuild passed). Native supplementary REDs reproduced DanglingSurrogateHalf closing the palette and premature Enter during an incomplete scalar; both GREENs pass. These are native-message tests, not physical typing or glyph proof.

The short C:\gc-e junction was coordinator-prescribed and removed after validation. The repeated local startup failure is attributed to the local environment (short-root junction or concurrent sessions); CI passes the same case. The exact-head CI integration job is the authoritative live regression evidence: run 38516067509 / job 115695091870, conclusion success. The precise local mechanism remains unproven. Failed validation roots were cleaned by the runner, so their per-process log files are unavailable; complete emitted output is retained in regression-integration-live1.log/live2.log.

Paired visual evidence

macOS reference Windows before Windows after Acceptance shown
750-jump-palette@1x-srgb.png beta26 tg722c-invoke-loop-jump.png final8/after-jump-palette-safe.png Contained dark palette, magnifier/search/esc, Main/Composite, two lines, type bars and IDLE/DONE/STOPPED dots
Same reference Same beta26 capture final8/after-neighbour-canvas-safe.png and after-escape-canvas-safe.png Open/then-Escape leaves the canvas unchanged except title-bar activation; not a controlled baseline comparison

macOS is 1440×900pt @1x-sRGB; Windows is a 1440×940 outer window at 100%. Safe images crop only 8px side/bottom and 2px top borders to remove unrelated desktop slivers. Originals are retained. Fresh capture directories and capture-provenance.json contain source/binary/image SHA-256 and UTC timestamps. Source: C221CD56B67BACA737513C22091DDD9C271E712FF2A934CE6AEFAE562E38EF74; binary: C0D183A7710B71BE7C858524BC4DC05B01DB3B9B0861BB81AA4EB99C2398142B.

The fixture vocabulary matches; Windows retains model order rather than macOS attention-first order. Fixture states are seeded, not live transitions. Beta26 has different surrounding layout/window dimensions. Rendered paired screenshots, neighboring surfaces and overflow capture include all six uploaded images and their limits.

Not verified / remaining differences

  • Physical keyboard/mouse, assistive-technology conformance, mixed-monitor DPI, visually captured no-match and other states. The full native UIA gate passed in exact-head CI; this is not physical input or visual parity proof.
  • Clean-machine Windows Sandbox/package installation; these are host captures. Real persistence/provider-backed workspaces and full application parity.
  • More than eight results expose a light native scrollbar inside the dark palette. Scrolling works, but this remains a visual deviation. Minor dot anti-aliasing, cue brightness, border/shadow and typography differences remain.
  • macOS dims the canvas behind the palette; Windows does not.
  • macOS anchors the palette lower, at the canvas centre; Windows anchors it below the toolbar as requested by this issue.
  • macOS orders results attention-first; Windows retains its existing model order.
  • macOS make test / make check: unchanged shipping platform, unavailable on this host.

Rubber-duck review

Claude Sonnet 5.5 opened the actual logs and every cited paired/neighbor/safe image. Final verdict: no blocking code/evidence defects; source freshness, fresh capture provenance and privacy crop findings resolved. Main/Composite, in-window palette, two-line context/type bars and open/Escape neighbor behavior accepted for the reference scenario; broader states and overflow visual fidelity remain partial.

Responses: corrected RED limits and row-order/baseline wording; restored native overflow scrolling; preserved WM_CREATE error; clipped child overpainting; owned all strings and checked every allocation failure. No-match is native accessible text. Malformed/orphan UTF-16 is explicitly rejected rather than silently replaced by an empty query; an incomplete scalar blocks acceptance until completion or Escape. Hidden native Unicode tests cover valid pair delivery; malformed clipboard/focus-loss composition remains unverified. Geometry/keyboard/ownership tests were added during GREEN/regression, not observed RED on the original implementation. No visual criterion is claimed from unit/UIA alone.

Checklist

  • I have read the Contributing Guidelines
  • I have signed off my commits (git commit -s) per the DCO
  • Tests pass locally (make test)
  • Code follows the existing style (make check)
  • I added the test/contract before the implementation and observed the intended RED failure

coneilen and others added 3 commits October 13, 2026 22:10
Refs #776

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 47fe2bfe-f8ec-4057-91f9-8dbcbaa52d39
Signed-off-by: Colin Neilens <coneilen@microsoft.com>
Refs #776

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 47fe2bfe-f8ec-4057-91f9-8dbcbaa52d39
Signed-off-by: Colin Neilens <coneilen@microsoft.com>
Refs #776

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 47fe2bfe-f8ec-4057-91f9-8dbcbaa52d39
Signed-off-by: Colin Neilens <coneilen@microsoft.com>
@coneilen

Copy link
Copy Markdown
Collaborator Author

Paired jump palette evidence

Exact source SHA-256 C221CD56B67BACA737513C22091DDD9C271E712FF2A934CE6AEFAE562E38EF74, executable SHA-256 C0D183A7710B71BE7C858524BC4DC05B01DB3B9B0861BB81AA4EB99C2398142B. The PR head is d560395fff060fdd513de9f80b49158b8b603004; its documentation-only rebase did not change these source bytes.

macOS reference Windows beta26 before Windows PR build after Acceptance shown
macOS 750 jump palette Windows beta26 off-window light palette Final eight-row in-window dark palette Palette contained below toolbar; magnifier, Jump to loop and esc; two-line type/state/project context, Main/Composite labels, type bars and IDLE/DONE/STOPPED dots

The macOS reference is 1440×900pt @1x-sRGB. The Windows production shell was 1440×940 outer-window pixels at 100%, with a synthetic repository-derived stub supplying privacy-safe fixture data. Input was injected WM_KEYDOWN Up/Down/Escape, not physical keyboard input. Fixture state and row order differ from the reference; the existing Windows model order was retained. Beta26 is not a controlled surrounding-layout baseline.

Upload copies remove only external window-border/desktop slivers. Windows before also excludes the unrelated taskbar/Explorer strip at the bottom; the popup/toolbar comparison remains intact. Original files, UTC timestamps and hashes are retained locally.

Neighbouring surface, opening then Escape

Before opening the palette After Escape
Neighbour canvas before palette Same canvas after Escape

The comparison supports no canvas mutation during open/cancel, not equivalence to the old beta26 canvas. Title-bar activation differs.

Remaining overflow visual deviation

Twelve-row overflow with native light scrollbar

The 12-row run acquired native UIA ScrollPattern, asserted VerticallyScrollable, required a positive scroll advance and reset it before keyboard checks. Scrolling works, but the light native scrollbar is a known mismatch against the dark macOS palette and remains partial. This does not establish full AT conformance.

Claude Sonnet 5.5 opened these source images and real logs. Its final review found no blocking code/evidence defects and resolved source freshness, provenance and privacy findings. The eight-row reference scenario is accepted; other states, overflow visual fidelity, physically typed input, mixed DPI and the visually uncaptured no-match state remain unverified. Local full integration failed twice before the palette UIA assertions at registered-project startup; exact-head CI is still pending attribution.

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.

1 participant