Skip to content

Windows: make the right loop panel readable and match its macOS hierarchy - #789

Merged
coneilen merged 6 commits into
mainfrom
coneilen-microsoft-fix-right-loop-panel-escalated
Oct 14, 2026
Merged

coneilen merged 6 commits into
mainfrom
coneilen-microsoft-fix-right-loop-panel-escalated

Conversation

@coneilen

@coneilen coneilen commented Oct 14, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Restore readable right-loop-panel text at wide and narrow window sizes, and align its minimap, handoff rows and started-time footer with the shipping macOS reference.

Refs #773. Supersedes closed draft #786; deliberately reuses reviewed commits f94ced63 and 874acc7d, now cherry-picked/rebased as 1787068f and 0e02bb43 onto main including #788.

Changes

  • Replace the fixed x=1200 text edge with the owning card, rail or panel edge at every canvas helper caller; lane labels already use container rectangles.
  • Stack type-coloured incoming/self/outgoing minimap blocks vertically, show the target title above its human-readable condition, and use target-state dots rather than edge-fired dots.
  • Keep the actual branch and locale-formatted local clock time at the bottom. Remove non-macOS detail rows (metric_command, goal_summary, model_tier, backend/path fallback), invented primary-checkout/empty-metric placeholders and empty sparklines.
  • Bound complete handoff rows above the footer/metric sections, distinguish hollow blocked/stopped/waiting dots, and ignore stale input presence on resolved targets.
  • Coordinator-approved narrow App.syncAccessibilityTo change: publish the same footer/sparkline bounds the canvas paints, omit sparklines with fewer than two samples, and cover 96/144/192-DPI geometry.
  • Coordinator-approved test-runner change: add -luser32 -lgdi32 to the existing GraphCanvas root, so its offscreen native raster contract runs in the full unit gate; no new root or section.
  • Coordinator-approved palette contract: document the private macOS RailMinimap.surface exception and verify its Swift RGB against the exact Windows 0x001A1616 value.

Test plan

RED: C:\gct\b2\zig-0.15.2\zig.exe test src\GraphCanvas.zig --test-filter "canvas text raster" -target x86_64-windows-msvc -lc -luser32 -lgdi32 -IC:\gcp\b2\winghostty\include --cache-dir C:\gcs\b2\before-cache --global-cache-dir C:\gcs\b2\global -> main snapshot f892656 with the raster test added: expected 811 ink pixels, found 0 beyond x1200; 0 passed, 1 failed (red-main-raster.log)
GREEN: C:\gct\b2\zig-0.15.2\zig.exe test src\GraphCanvas.zig --test-filter "canvas text raster" -target x86_64-windows-msvc -lc -luser32 -lgdi32 -IC:\gcp\b2\winghostty\include --cache-dir C:\gcs\b2\cache --global-cache-dir C:\gcs\b2\global -> referenceInk=811 wideInk=811; All 1 tests passed, including zero ink outside the small owning rectangle (green-raster.log)
REGRESSION: pwsh -NoProfile -File Tools\windows\validate.ps1 -Task windows-shell -ShellPart unit -SkipTrayLive -ShellValidationRoot C:\gc-b2 -ShellTestManifest C:\gcs\b2\logs\full-unit-rerun1-sections.json -SwiftExecutable C:\Users\coneilen\AppData\Local\Programs\Swift\Toolchains\6.3.3+Asserts\usr\bin\swift.exe -> exit0; 55/55 sections, 58 wired files, 79 positive Zig invocations / 4389 imported-inclusive executions; full-unit-rerun1.log; process-scoped scratch profile guard only

The full unit ran inside the coordinator desktop lease (00:31, extended until01:16) and finished at01:00:54; lease released immediately. The test-runner agent executed it; its later reporting turn failed with a service error, so the complete raw log/result/manifest were reconciled directly. Every executed root/filter count is below, not just App's last summary. Counts include imported modules and repeated filtered roots, not unique cases. Additionally: isolation Pester 5/5, live GDI+ 1 execution / 2 observations, worktree harness 17 positive scenarios plus 4 expected-rejection fixtures, all completed without unexpected failures.

Every executed Zig root/filter count (79 positive invocations)
Executed root / filter / fixture Passed count Section
Accessibility.zig 4 Accessibility contract executable tests
Wire.zig 163 Wire executable tests
Codespaces.zig 13 Codespace client executable tests
WindowsCodespaceDialog.zig 20 Codespace ingress dialog executable tests
Forms.zig 163 Forms and navigation executable tests
EdgeCreationTests.zig 14 Edge creation captured draft and scope pure tests
EdgeEditing.zig 11 Edge editing data-only executable tests
Win32.zig 1 Win32 pointer conversion executable tests
NativeForms.zig 287 Native dialog message-loop executable tests
UpdateOfferPresentation.zig 1 Update offer modal deferral executable tests
SketchPromotion.zig 6 Sketch promotion executable tests
GraphContextMenu.zig 192 Context menu and gate fixture message executable tests
MainWindow.zig 73 Context menu and gate fixture message executable tests
JumpPalette.zig 15 Jump palette executable tests
WindowsOnboarding.zig 13 Onboarding executable tests
WindowsProductSettings.zig 9 Product Settings executable tests
ModalTeardown.zig 3 Modal teardown executable tests
WindowsUpdates.zig 30 Windows update feed executable tests
WindowsUpdateInstall.zig 14 Windows update install executable tests
FrameBuffer.zig 167 Frame buffer executable tests
DaemonClient.zig 204 Daemon client startup tests
DaemonRoundTripTests.zig 1 Daemon round-trip helper executable tests
DaemonSupervisor.zig 8 Daemon supervisor handoff tests
WorkspaceLayout.zig 17 Workspace layout executable tests
InputRouter.zig 9 Workspace layout executable tests
TerminalKeys.zig 10 Workspace layout executable tests
ZmxSession.zig 5 Zmx session identity executable tests
LoopLaunchWait.zig 20 Zmx session identity executable tests
LoopBarLayout.zig 8 Loop bar layout executable tests
TerminalVt.zig 27 Terminal VT preparation and memory tests
TerminalKeyEncoding.zig 44 Terminal VT preparation and memory tests
TerminalSelection.zig 40 Terminal VT preparation and memory tests
TerminalSurface.zig 266 Terminal input queue tests
Clipboard.zig 16 Windows clipboard encoding tests
GraphModel.zig 163 Graph model executable tests
CanvasInput.zig 10 Graph canvas input executable tests
GraphCanvas.zig 232 Graph canvas executable tests
WorktreeStatus.zig 32 Worktree status executable tests
worktree-git-tests.zig (scope-dir) 1 Worktree Git process regression tests
worktree-git-tests.zig (scope-mixed-case) 1 Worktree Git process regression tests
worktree-git-tests.zig (scope-config-count) 1 Worktree Git process regression tests
worktree-git-tests.zig (scope-config-parameters) 1 Worktree Git process regression tests
worktree-git-tests.zig (index) 1 Worktree Git process regression tests
worktree-git-tests.zig (objects) 1 Worktree Git process regression tests
worktree-git-tests.zig (preserve) 1 Worktree Git process regression tests
worktree-git-tests.zig (streams) 1 Worktree Git process regression tests
worktree-git-tests.zig (stdout-cap) 1 Worktree Git process regression tests
worktree-git-tests.zig (stderr-cap) 1 Worktree Git process regression tests
worktree-git-tests.zig (errors) 1 Worktree Git process regression tests
worktree-git-tests.zig (git-stderr) 1 Worktree Git process regression tests
worktree-git-tests.zig (allocations) 1 Worktree Git process regression tests
worktree-git-tests.zig (removals) 1 Worktree Git process regression tests
worktree-git-tests.zig (removal-output-direct) 1 Worktree Git process regression tests
worktree-git-tests.zig (removal-output-selected) 1 Worktree Git process regression tests
worktree-git-tests.zig (removal-output-forced) 1 Worktree Git process regression tests
DraftAttachments.zig 11 Draft attachments executable tests
WorktreeDialog.zig 36 Worktree dialog executable tests
Dpi.zig 3 DPI scaling executable tests
TemplateLibrary.zig 167 Template library executable tests
GraphContextMenu.zig (custody child) 2 Custody child data-only executable tests
NativeForms.zig (custody child) 4 Custody child data-only executable tests
GraphModel.zig (custody selection) 2 Custody child data-only executable tests
App.zig (custody child) 30 Custody child data-only executable tests
Diagnostics.zig 2 Windows shell diagnostics executable tests
WorkspaceLifecycle.zig 14 Workspace lifecycle executable tests
WorkspaceManager.zig 31 Workspace manager data executable tests
WorkspaceTeardown.zig 257 Workspace teardown executable tests
WorkspaceManagerForm.zig 24 Workspace manager form data executable tests
Navigation.zig 2 Sidebar navigation executable tests
WorkspaceControls.zig 1 Workspace controls executable tests
Sidebar.zig 202 Sidebar executable tests
WindowsRepositoryDialogs.zig 14 Windows repository dialogs executable tests
GdiGradient.zig 3 GDI gradient executable tests
AppFont.zig 6 App font cache executable tests
GdiplusAA.zig 1 GDI+ antialiasing executable tests
UpdateOfferDialog.zig 5 Update offer dialog executable tests
UpdateInstallDialog.zig 34 Update install dialog executable tests
WindowsNativeDialogs.zig 19 Native dialog field contract executable tests
App.zig 1191 App shell executable tests

All rows are positive executed summaries. The worktree harness additionally exercised four intentionally rejected unknown-scenario fixtures; those expected negative checks are not green Zig summaries. No unexpected test failure occurred in the successful rerun.

The original refinement RED is retained separately (red-panel.log: 2/4 passed, missing Always rectangle and minimap expected118/found72). The stale succeeded+awaitingInput-presence RED is retained (red-stale-status.log: 0/1 passed); the correction is covered by All 9 loop-detail tests passed (green-review-panel.log). The inherited fixed-edge helper was already implemented when this session began; the additional raster RED ran against an exact main snapshot, not a rewritten implementation.

Focused App --test-filter "loop detail UIA": All 1 tests passed (green-uia-rerun.log). The first attempt did not compile because the VT static library had not been installed; build prepare-terminal-vt supplied it. Both logs retained.

The independent literal App DPI bounds test --test-filter "DPI UIA logical cards headers sidebar and direct inserts scale once" also reports All 1 tests passed (green-dpi-literal.log). Together these establish logical/UIA wiring and literal 96/144/192-DPI geometry, not painted-pixel equality.

Provider build: the initial hand-written zmx build used its default MSVC target and failed compiling SIMD intrinsics (provider-zmx.log). The repository's canonical Tools\windows\provider-build.ps1 used the pinned GNU target and passed both providers (provider-canonical.log, PROVIDER_BUILD_EXECUTED=2). No provider or toolchain pin changed.

Required Windows shell CI run 38525363552 passed on reviewed/rebased head e6fcc49543449078709b62ac11705adc45eaea7c, including integration, all three unit shards, both packaging jobs and the complete-section aggregator. ci-integration-reviewed.log reports SCRUBBED_SHELL_STARTUP: PASS; executed=5, with registered-project row open-project-1559143368152282765 and fatalLogAbsent=true. These PR runs build refs/pull/789/merge, associated with the stated exact PR head, not a raw head checkout or manual dispatch. Earlier passing run 38521326970 and superseded/cancelled initial run 0daa3d3a are retained separately.

Coverage gap and correction: that passing shell workflow was not the whole required portfolio. Windows port run 38525363547 on e6fcc495 failed the unregistered loop_minimap_surface inventory, then its channel-swap negative fixture (CI failure #1, retained). Local asserted RED red-palette-asserted.log confirms 2/4 passed, 2 failed; corrected green-palette.log confirms 5/5 passed, including source RGB and exact COLORREF checks. The first local RED wrapper mistakenly exited0 after redirecting the PassThru result; its failing Pester output remains in red-palette.log, and the corrected assertion exited1.

The full local -ShellPart unit does not include palette parity. -Task visual-baseline is the actual local entrypoint used by the workflow's windows-spikes terminal/contracts job. It was run twice locally, but an existing ConciseView diagnostic-wrap assertion fails before palette. palette-entrypoint.log captures the failure; palette-entrypoint-rerun1.log contains only the banner, with its terminating exception retained in the session tool output. The same direct VisualBaseline.Tests.ps1 failure reproduces on untouched main f7f7754a in this console (visual-baseline-main-environment.log, host buffer120): the intended hash-rejection phrase wraps between no longer and matches. This is disclosed as local environment/harness evidence, not a pass or product regression; that harness was not edited.

Final head 20104872445b35ea93b756860429caef7b953eda: all seven workflow runs completed successfully (nonempty exact-head portfolio in ci-all-final.json): DCO, TDD evidence, Windows release hardening, macOS shared Swift regression, Linux, Windows shell 38533914719, and Windows port / windows-spikes 38533914827. The platform workflows' legitimate path-gated skips are not claims of macOS/Linux test execution. Final integration log ci-integration-final-head.log confirms all five scrubbed-startup cases and populated registered-project row open-project-2010372392230797688, with no fatal log. The final palette-only commit and intervening main documentation do not change any renderer/product file, so the captured/native-unit renderer at e6fcc495 is source-identical; only the separate palette Pester contract changed.

Acceptance scope and visual evidence

Targeted boxes: container-derived readable headings/rows at widths 960 px and above; THIS LOOP minimap, HANDS OFF TO title/condition/type-bar/status-dot rows and started-time footer.

Cross-vendor Sonnet5.5 paired-image verdict: accepted PARTIAL, no blocking findings. Both issue boxes are evidenced for the scoped change; the broader fidelity/action residuals below remain explicit and the ledger is not promoted:

  • No accidental fixed-edge heading/row clipping at the requested960px outer width, exact960px client, default or wide captures.
  • THIS LOOP / typed minimap, HANDS OFF TO row structure and started-clock footer match the claimed macOS information/hierarchy.

Paired captures use normal production painting at 96 DPI / 100%, without GRAPHCODE_UIA_GATE or the daemon-supervisor hook. Both Windows builds use the same owned reference-shaped protocol fixture (ParityRef, RefMain, RefGoal, RefComposite plus five neighbors), with a real pinned zmx cmd.exe fixture session. This is not a production graphcoded/backend qualification. Before binary: main f8926561; its GraphCanvas blob is unchanged in subsequent main. After binary: e6fcc495, with renderer sources unchanged at final head20104872.

Surface / dimensions macOS requested 721 reference Windows before (main) Windows after Acceptance shown
Default: 1280 px outer window, 1264 x 761 client macOS panel crop Before default After default Readable headings and names; vertical typed minimap; title/condition/type-bar/state rows; clock footer
960 px outer window, 944 x 761 client; extra exact 960-client capture also retained same macOS reference Before 960 After 960 Same panel remains readable at both the requested outer width and the stricter exact 960-client width
Wide: 1800 px outer, 1784 x 761 client, panel beyond x1200 same macOS reference Before wide: missing text After wide Direct runtime reproduction/removal of the fixed-edge bug: missing headings/names before, readable after

The after panel crops at 960 outer, 960 client and 1800 outer are byte-identical, so the attachment upload deduplicated them; their distinct HWND geometry, original full-client PNGs and hashes remain in each run's captured-images.json / evidence.json.

Minimum-height stress capture: actual 960 x 517 client, six outgoing edges, four minimap blocks, branch plus sparkline plus footer. Three complete rows fit above RECENT PASSES; the remaining rows are omitted rather than overlapping lower sections. Full-height stress crop shows all six rows, intentional long-title ellipsis, hollow waiting/stopped/blocked vs solid awaiting-input dots, and the fired-condition label.

Neighboring surfaces: panned cards before / after, and overview lanes before / after. In both pairs the rightmost card names disappear before at x1200 and are readable after. Existing card/type-palette and workspace/sidebar differences remain separate work.

Capture attempts are preserved: before-ref1 lacked a backend; before-ref2 used the harness's incorrect v3-prefixed session rather than GraphCode's graphcode-UUID name and lacked sibling staging. Both reached real screenshots but failed the final attachment assertion, so are not called successful capture runs. before-ref3, after-ref1 and after-stress1 completed with the correct owned graphcode-UUID backend and the same pinned zmx staged beside each shell; File > Exit ended each successful run.

All twelve unique published PNGs were opened and inspected: they show GraphCode's fixture surfaces, not Copilot or another overlaid app. The capture harness additionally guarded HWND process/creation identity, foreground, 96-DPI client geometry and higher-Z-order overlap before/after CopyFromScreen. No contaminated capture was published.

Cross-vendor rubber duck

claude-sonnet-5.5: CODE accepted / EVIDENCE accepted / VISUAL accepted PARTIAL; no blocking findings. It opened the paired/native neighbor images, complete approved diff, raw RED/GREEN/full-unit logs and count table, palette RED/GREEN and CI startup JSON. The initial sync reviewer could not receive a follow-up through the tool; a background final follow-up reviewer completed the remaining evidence checks.

Finding Response
Handoff rows could overlap lower sections at short height Bound complete rows before metric/footer; pure minimum517 test plus actual 960x517 stress capture
Stale input presence could tint resolved targets RED retained, gate presence on running; explicit Windows representation difference disclosed
Solid-only status dots and hard-coded English clock Hollow blocked/stopped/waiting indicators and native short-time locale formatting
Real non-macOS detail fields were called fabricated Separate removed real rows from invented placeholders
Geometry evidence was broader than RED / literal DPI not run Actual native main raster RED811/0 and GREEN811/811; independent literal DPI run
UIA geometry/root counts/merge-ref described too broadly Distinguish logical geometry, offscreen pixels, live captures, imported/repeated totals and PR merge-ref
New palette token was absent from another required contract CI failure #1 disclosed; documented private-component exception plus source/exact-literal test; fresh complete CI portfolio green

Optional nonblocking review suggestions not taken: mutation proof for the new palette mirror test and refining its source-line diagnostic number. These do not change the verified equality or render behavior.

Not verified

  • Real default-profile snapshot: initial unit attempt stopped before any section (0 executed) on a stale delete-pending zmx-validation-ee\logs\zmx.log; full-unit.log retains it. The successful coordinator-authorized rerun snapshots a process-scoped scratch profile. The real user's LocalAppData was not snapshotted.
  • Native physical keyboard input, installed production-daemon rendering, mixed DPI and whole-workspace visual parity are not established by the focused tests.
  • Long titles retain intentional ellipsis, as on macOS. Rows beyond the vertical capacity are omitted; scrolling and handoff-row click navigation are not added in this scoped PR. The existing Windows Collapse affordance remains; full typography/visual fidelity and the fallback renderer are not claimed.
  • For consistency with Windows' existing attention model, running plus presence=awaitingInput also gets the human-attention tint/dot. macOS's rail tests target.state.wantsHuman only; this representation difference is retained explicitly. Small GDI status dots are less circular than the macOS antialiased dots.
  • make test / make check: macOS commands not runnable on this Windows host.

Earlier captures failed before fixture installation because capture-visual-baseline.ps1 wrote onboarding-seen under LOCALAPPDATA\GraphCode, while WindowsOnboarding.Store uses GRAPHCODE_SUPPORT_DIR\onboarding-seen. First-run entered startup/onboarding and the fresh fixture directory had no graphcoded.exe. The successful runs seeded only their own fixture support marker, kept normal production painting, and used this session's pinned providers. Predecessor failed logs remain read-only in C:\gcs\b\capture-*.

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
coneilen force-pushed the coneilen-microsoft-fix-right-loop-panel-escalated branch from dbe9ec9 to e6fcc49 Compare October 14, 2026 06:58
coneilen and others added 6 commits October 14, 2026 01:15
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: dc42ae02-a736-4bad-a084-8a3cf0c9cde5
Signed-off-by: Colin Neilens <coneilen@microsoft.com>
(cherry picked from commit f94ced6)
Keep the right-loop rail from leaving blank minimap boxes or skipped-row gaps, and narrow adjacent labels so they don't collide.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: dc42ae02-a736-4bad-a084-8a3cf0c9cde5
Signed-off-by: Colin Neilens <coneilen@microsoft.com>
(cherry picked from commit 874acc7)
Reuse reviewed panel commits f94ced6 and 874acc7; stack one-hop minimap blocks, keep conditions below titles, use target state dots, and share painted footer/metric bounds with UIA.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: cd7356bf-1770-4937-b9d7-cb326c8ee5fc
Signed-off-by: Colin Neilens <coneilen@microsoft.com>
Handle explicit awaitingInput states as well as presence, and convert the creation date using the date-specific local time-zone rule.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: cd7356bf-1770-4937-b9d7-cb326c8ee5fc
Signed-off-by: Colin Neilens <coneilen@microsoft.com>
Reproduce main clipping in an offscreen GDI raster contract, stop full handoff rows before lower sections, follow target-state hollow indicators, ignore stale input presence after resolution, and use the Windows short-time locale format. Link the existing GraphCanvas test root to user32 and gdi32 with coordinator approval.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: cd7356bf-1770-4937-b9d7-cb326c8ee5fc
Signed-off-by: Colin Neilens <coneilen@microsoft.com>
Document the private RailMinimap surface outside Theme.swift and compare its source RGB with the exact Windows COLORREF value so the exception cannot drift silently.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: cd7356bf-1770-4937-b9d7-cb326c8ee5fc
Signed-off-by: Colin Neilens <coneilen@microsoft.com>
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