Skip to content

Bring sidebar navigation and minimum width toward macOS parity - #800

Closed
coneilen wants to merge 5 commits into
mainfrom
coneilen-microsoft-sidebar-macos-parity
Closed

coneilen wants to merge 5 commits into
mainfrom
coneilen-microsoft-sidebar-macos-parity

Conversation

@coneilen

@coneilen coneilen commented Oct 14, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Bring the Windows sidebar's navigation rows, expanded loop tree, selection styling and workspace footer closer to macOS, and enforce a DPI-scaled 452-DIP client-width floor.

Refs #767. This is a partial implementation: sidebar worktree-row removal is deferred to the #777 Worktrees sheet/UIA migration (lane A); narrow-window sidebar overlay and toolbar overflow are not implemented.

Changes

  • Graph and Quick Chats come first, with drawn monochrome icons rather than letter glyphs. Folder groups have Local Projects / Remote Repositories captions, folder icons and hover-only add/disclosure controls.
  • Loop rows use 32-DIP spacing, 16-DIP indentation, macOS type colours (including the serialized proactive composite type), compact ages and solid/hollow state dots. Default expansion deliberately follows the captured expanded tree rather than macOS's empty fresh persisted expansion set. Explicit new-format collapses persist; legacy expanded records remain effectively expanded under the new default.
  • Rounded blue selection and UIA selection share the destination model. A Worktrees inspection opened from the overview retains its owning-project selection, preserving the existing Worktrees contracts.
  • The opaque footer shows the workspace name and opens the existing Workspace menu by pointer or UIA. Like macOS, it is absent for a lone Default workspace. New row/footer text is container-bounded; unchanged worktree, Needs-you, Activity and update-banner draw helpers retain their original behavior. The duplicate footer status text is no longer painted.
  • WM_GETMINMAXINFO enforces 452 logical client pixels, scaled at the DPI boundary and adjusted for native non-client chrome. The existing 517-DIP minimum height is retained.
  • Approved lease extensions only: two C++ footer identity classifications (automation ID and Button role), and strict sidebar assertions in the live gate. The gate still requires exactly one recent-project row and one open-project row; the footer has its own prefix and exactly-one Button assertion.
  • A further coordinator-approved call-site fix makes keyboard worktree selection and Jump scrolling use the generated rows and current folds. Jump uses the real viewport and a visible project/group fallback. Lane E's palette entry-building hunk is untouched; rebased onto Windows parity: in-window dark jump palette matching macOS (#776) #788 (f8926561) and its root still passes all 15 tests. Jump still opens the Windows project canvas, not the macOS loop workspace; that destination gap is deferred to Windows parity: Jump palette selection should open the loop like a sidebar tap, not just select it on the canvas #799, not claimed as parity here.

Acceptance scope

Issue criterion Scope of this PR
Graph / Quick Chats / folder row structure Specified icons/caption/folder structure visually supported; Quick Chats selected-row plus remains a fidelity gap
Expanded, indented tree; type bars, ages, state dots Hierarchy/pitch/type bars visually supported; trailing spacing and cross-state dot comparison remain Partial
No worktrees, Needs-you or Activity in sidebar Unticked: worktree rows and their UIA projection retained by coordinator decision; Needs-you and Activity left unchanged as requested
Workspace footer; no overlapping footer text Structure and nonoverlap visually supported; inset rounded panel shape differs and popup rendering unverified
Blue rounded selection pill Active blue state visually supported; inactive grey treatment unmatched
452-point-equivalent width, overlay and toolbar overflow Width floor implemented; overlay and toolbar collapse remain unmet

macOS source references: AppSidebarView.swift (column range 200/240/320, 3x14 stripe and 12.5-point row text), AppSidebarView+Rows.swift (16-point indentation and trailing controls), LoopTypeAppearance.swift, LoopStateAppearance.swift, WorkspaceSwitcher.swift, and AppFeature+Workspaces.swift:74. The 452-point observation is from Run A's 720/min-width.txt, not a hard-coded macOS source constant.

Selection ground truth: graphcode/Sources/Features/App/AppSidebarView.swift:300-311 returns the open loop/chat row when a workspace is open, otherwise the detail project row or Quick Chats row. The Graph is the global project's row (AppSidebarView+Rows.swift:13-16,97-101). Paired reference states: 727/727-canvas-final-states@1x-srgb.png selects ParityRef on its project canvas; 720/720-global-graph@1x-srgb.png selects Graph; 720/720-ref-main-workspace@1x-srgb.png selects RefMain. All three images were opened; the workspace image is reference-only and will not be uploaded unless privacy-safe.

Test plan

RED: & C:\gct\c\zig-0.15.2\zig.exe test src\Sidebar.zig -target x86_64-windows-msvc -lc -luser32 -lgdi32 --cache-dir C:\gcs\c\zig-cache --global-cache-dir C:\gcs\c\zig-global --test-filter "parity sidebar pins" -> expected .quick_chat_overview, found .open_project; 0 passed, 1 failed (red-rows.log)
GREEN: & C:\gct\c\zig-0.15.2\zig.exe test src\Sidebar.zig -target x86_64-windows-msvc -lc -luser32 -lgdi32 --cache-dir C:\gcs\c\zig-cache --global-cache-dir C:\gcs\c\zig-global --test-filter "parity sidebar pins" -> All 1 tests passed (green-rows.log)
REGRESSION: pwsh -NoProfile -File Tools\windows\validate.ps1 -Task windows-shell -ShellPart unit -SkipTrayLive -ShellValidationRoot C:\gc-c -> final run 4 passed, 58 source roots wired and 55/55 sections executed; earlier failures retained

Evidence directory: C:\gcs\c\. Focused native-linked acceptance and corrected geometry selectors: All 24 tests passed (headless-sidebar-regression.log). The two unchanged overview Worktrees ownership/readback tests plus the new selection contract: All 3 tests passed (worktree-selection-regression-2.log). These are not screenshot or physical-input evidence.

Failed attempts and corrections

evidence-failures.txt lists retained failures. The initial Sidebar root had 14 coupled failures; its corrected run passed all 206 tests. The initial native-linked footer test failed because its test sink did not collect the new identity; that was corrected. The later selection RED reproduced a stale UIA project selection; drawing and UIA now use the same selection helper.

Full unit run 1 was a harness failure hashing a locked host-profile zmx log. Run 2 used owned, redirected USERPROFILE / LOCALAPPDATA roots; the real host-profile snapshot was not executed. Its 12 App failures included legacy worktree projections removed during the initial implementation. Worktree rows/projection were restored after the coordinator deferred that migration. The four Worktrees tests are unchanged.

Full unit run 3 used a real short C:\gc-c directory: App 1188 passed / 1193 executed, five failed. These five expected the cached project header to be selected even on a Graph/workspace destination. Their coordinator-approved corrections require exactly one selected sidebar element, the correct Graph/loop row, and the wrong project header unselected, while retaining all model/project/node/cache identity assertions. A full App rerun was stopped at the 00:23 lease boundary and is not a passing run. Its stricter count exposed duplicate loop IDs across fixture projects; loop selection is now scoped to the selected project as well as the node ID. selection-contracts-fixed.log records All 6 tests passed after the correction.

Final full unit run 4 on f201067f343f65fadd0af8111215147fb8bd6d6f passed: 58 source files wired; 55 of 55 sections executed, runner exit 0, with the final root reporting All 1205 tests passed (regression-unit-4.log). This is not a single aggregate Zig test count. The default-profile guard ran against a process-scoped scratch profile: USERPROFILE, LOCALAPPDATA, APPDATA, TEMP and TMP all pointed to lane-owned scratch directories.

Integration run 1: pwsh -NoProfile -File Tools\windows\validate.ps1 -Task windows-shell -ShellPart integration -SkipTrayLive -ShellValidationRoot C:\gc-c -> failed at jump palette activation did not navigate to UIA loop B (regression-integration-1.log, retained diagnostics in diagnostics-integration-1). The gate expected a selected sidebar loop after Jump, whereas the current Windows destination is a project canvas. The coordinator-approved correction requires exactly one selected sidebar project, loop B unselected, and exactly one selected canvas card B, retaining both named project cards. The corrected block parses successfully but has not yet been runtime-rerun; exact-head CI is pending. macOS Jump opens the loop workspace (AppFeature+JumpPalette.swift:44-47, via openNode/mountWorkspace) and would select its loop row. The code comment explicitly tracks TODO(#799): restore loop-row selection when jump opens the workspace. No Jump destination parity claim is made.

Exact-head CI attempt 1 failed on b091bea002024ef402115e94244cad0aa8bb62fb: Windows shell run 38551425940, integration job 115810091010, at the new project-canvas jump did not select exactly its owning sidebar project assertion. All three unit shards, both packaging jobs and the Windows port/spikes workflow passed. The shell aggregator failed because integration failed. This is self-caused CI failure 1, not attributed to environment or focus. Full failure logs and actual diagnostic artifact are retained (ci-shell-failed.log, ci-integration-exact-head-1.log, ci-integration-1-artifacts). The artifact contains two JSON files, not the screenshot referenced by the job log.

Source investigation found the retained Needs-you alias can be selected independently of navigation (App.zig:7777), so broad all-SelectionItem cardinality is not a navigation-only count. Separately, the native C++ provider discards static Graph/Quick Chats selection flags, unlike the publication sink used by unit tests. No native selected-ID list was logged, so the failed run's exact count is not inferred from an empty diagnostic result. Not PR READY: native integration remains failed.

Coordinator-directed correction: count only destination-navigation rows, requiring exactly one correct owning project or loop, while logging every observed selected extra by AutomationId/name (UIA_SIDEBAR_EXTRA_SELECTIONS). Correct project plus a Needs-you alias is allowed and logged; zero, wrong or two navigation selections still fail. Only this PR's newly added native overview selected requirement is removed; every main-branch owner/card/PID/geometry/cache/roster assertion and Graph publication-sink unit check remains. Native Graph/Quick Chats SelectionItem wiring is deferred to #801, NotVerified. C++ remains limited to the two originally approved footer expressions; Needs-you/Activity/Worktrees producers are unchanged. macOS has no sidebar Needs-you section (AppSidebarView.swift:334, attentionSection commented out); removal stays unticked for a follow-up.

Correction evidence: red-navigation-alias-count.log reproduces the old source predicate rejecting one navigation selection plus a retained alias (functional RED, not native readback). pwsh -NoProfile -File Tools\windows\Tests\ValidationRunner.Tests.ps1 -> PASS, 404 functional cases (56 positive, 348 negative), liveAppSelectionProved=false (validation-runner-navigation-fix.log). Six added cases cover exact/wrong/zero/two navigation selections and alias logging, including alias-only with zero navigation failing. Pinned Pester 5.7.1 isolation gate -> 5 executed / 5 passed / 0 failed (gate-isolation-pester-navigation-fix-2.log). The first Pester invocation redirected its PassThru result and the count check saw null; that harness invocation error is retained in gate-isolation-pester-navigation-fix.log, not silently replaced.

Review identified a non-blocking clipped-extra logging gap before push: the strict geometry evidence helper would reject a selected alias with empty bounds. Fixed within the approved observer only, without changing the shared evidence helper or existing owner/card geometry checks. A selected-name cache read verifies fresh/cached PID, identity/runtime before Name, string type, after-read ownership and whole-observation stability; it needs no bounds for logging. Ten additional positive/privacy/type cases cover empty/zero bounds, cached PID/identity/runtime drift and after-read drift. Final local ValidationRunner.Tests.ps1 -> PASS, 414 functional cases (58 positive, 356 negative), liveAppSelectionProved=false (validation-runner-clipped-alias-fix.log). No native-rerun claim is made from these cases.

Exact-head CI attempt 2 failed; escalation threshold reached. At c82286b08082f2fb2cface7e9ab69adf9bddfbd5, Windows shell run 38556773638, integration job 115827820931 failed the new jump did not retain the destination project's exact canvas cards assertion. Navigation cardinality passed and logged the actual retained Needs-you alias. All three unit shards and both packaging jobs passed; integration/aggregate did not. Owned foreground/no timeout: this is self-caused CI failure 2, not attributed to environment. Source-derived hypothesis: the broad canvas-card- count may include a legitimate retained Worktrees/source-summary card; actual card IDs/names/count were not logged, so the precise roster is not yet proved. This fails before the selected-card-B check. Logs/artifacts are retained in ci-shell-c822-failed.log, ci-integration-exact-head-2.log, ci-integration-2-artifacts.

Implementation stopped under the coordinator's escalation rule. Lane C2 (claude-sonnet-5.5, xhigh, long_context) is taking over this existing branch and draft PR; no further lane-C pushes. Handoff: C:\gcs\c\handoff-767-c.txt. Review rejection count remains 1; accepted local/scoped reviews are not a substitute for the failed native gate. PR remains open/draft, not ready and not merged.

The later multi-project Rename observer had the same legacy expectation that both project and loop rows were selected. Its coordinator-approved correction requires project-only navigation selection on a project canvas and loop-only selection on a workspace. Native overview selection is deferred to #801; Graph selection remains unit-sink evidence. Selected retained extras are logged rather than included in navigation cardinality. Every existing owner/card/PID/geometry/cache/roster assertion remains; new selection capture uses fresh ownership checks and whole-observation verification. There are no product or Worktrees changes in these gate corrections.

Focused behavioral RED: extracting Test-MultiProjectProtocolContracts from Tools\windows\Tests\ValidationRunner.Tests.ps1 against the old gate -> RED: multi-project sidebar owner selection contradicts its destination (red-multiproject-selection.log). The new tests execute the actual source-derived owner predicate and cardinality/identity predicate: nine destination/owner cases plus five absent/wrong/duplicate selection cases. GREEN -> 398 functional cases executed (54 positive, 344 negative) (green-multiproject-selection.log); liveAppSelectionProved=false. Regression: pwsh -NoProfile -File Tools\windows\Tests\ValidationRunner.Tests.ps1 -> PASS, including the same 398 functional cases (validation-runner-regression-final.log). The controlled teardown persistence warnings are asserted negative cases, not ignored suite failures. Native multi-project selection runtime evidence remains pending exact-head CI.

pwsh -NoProfile -File Tools\windows\validate.ps1 -Task visual-baseline -> passed after rebasing onto #796 (2a6aeb98): VisualBaseline contract PASS, ReferenceSet 8 contracts, PaletteParity 5 passed / 0 failed (visual-baseline-after-796.log). The earlier visual-baseline.log failed on ConciseView diagnostic wrapping and remains retained; no local harness weakening was made.

Changed selection test Old assertion New assertion
Interleaved Alpha refresh preserves cached Beta workspace Selected Beta project-header count=1 Project-header count=0; exactly one selected sidebar row, Beta loop=1; cached Beta model/node/workspace unchanged
Same-owner refresh preserves workspace Selected Beta project-header count=1 Same stronger workspace assertions
Settled refresh preserves overview Selected Beta project-header count=1 Header count=0; exactly one selected Graph row=1; cached Beta identity unchanged
Overview Open selects exact projects Cached Alpha header selected on Graph Graph selected, both headers unselected; opening each project still selects its exact header and card
Overview refresh preserves selected loop Cached Beta header selected on Graph Graph selected, both headers unselected; cached Beta node identity and both projects/cards retained

Project-canvas positive coverage remains explicit in the overview Open test (Alpha/Beta project header selected=1) and the new destination-selection contract. The shared overview sink now requires exactly one selected sidebar row, not merely the absence of the old selection.

The geometry expectations changed are:

Contract Old New Why coverage is retained
Fully hidden row clip probe Fixed-header coordinates A rect ending exactly at Sidebar.content_top Still asserts an entirely hidden row has an empty published rect
Drawn ordinary-row bounds x=12..232, y=top-3..top+23 x=10..212, y=top..top+32 Exact independent geometry oracle; positive visible and clipped counts retained
Banner click/UIA equivalence 14 shown / 2 collapsed 16 shown; one explicit shorter collapsed viewport Removing fixed headings allows the original 16 cases to fit; the added short case still asserts no offer is opened
Local-caption DPI bounds 12,109,232,135 at 96 DPI 10,154,212,186 at 96 DPI, with literal 144/192-DPI expectations Caption follows Graph, Quick Chats and the chat row; exactly-once physical scaling remains checked
Footer disjointness and Quick Chats reachability Unpainted status-text proxy and removed CHATS-label helper Actual workspace footer, and an independent literal Quick Chats row rect The actual bar is checked against both banner and error footer across the matrix; row reachability still requires a positive target

The explicit short banner-collapse viewport is synthetic and below the preserved 517-DIP window-height floor. It checks the geometry boundary, not a reachable ordinary dragged window size.

Visual evidence

Both Sandbox attempts produced no screenshots. Attempt 1 clamped the requested 1440x900 client to 1440x784; its logs/fixture are retained under sandbox/out-attempt1. The one permitted retry failed when guest EnumDisplaySettings was unavailable, before launching the renderer peer; its logs are retained under sandbox/out. The owned Sandbox processes were stopped by PID, and the coordinator confirmed teardown and release. No host services or permissions were changed.

Host, not clean-machine: pwsh -NoProfile -File C:\gcs\c\capture-sidebar.ps1 -Binary C:\gcs\c\after-build\bin\graphcode-windows.exe -PeerScript C:\gcs\c\render-peer.ps1 -OutputRoot C:\gcs\c\host-captures-1 -ForegroundLease "lane c 02:38-03:33 host not clean-machine" -> CAPTURE_COMPLETE screenshots=4 loops=8 dpi=96. The shell was rebuilt from product head f201067f343f65fadd0af8111215147fb8bd6d6f; SHA256 36647504C232CC51AC9B0093EA6812CD09A8F9012618A38E76E4D14BF903477A. PrintWindow(hwnd, hdc, 2) captured the actual HWND into a memory bitmap, cropped to client bounds, and verified sidebar RGB(29,29,33) before saving. All four images were opened and show GraphCode. The three usable paired states are 1440x900 project/Quick Chats and 452x900 minimum client width; native minimum outer width is 468 at 96 DPI. The fourth menu-request image excludes the separate popup HWND and is not evidence of native menu rendering. Onboarding was seeded in GRAPHCODE_SUPPORT_DIR. Shell exited through File > Exit command 4104; no owned shell/peer remained. Desktop released at 03:29, before the 03:33 hard stop.

macOS reference Windows before Windows after Criteria
macOS project canvas Windows beta26 project canvas before Windows project canvas after, host not clean-machine Rows, hierarchy, colours, selection, footer
macOS Quick Chats Windows beta26 Quick Chats before Windows Quick Chats after, host not clean-machine Quick Chats selection and row structure
macOS minimum-width canvas Windows beta26 minimum-width canvas before Windows 452-client-pixel canvas after, host not clean-machine Width floor; overlay/overflow explicitly unmet

The prepared renderer peer follows the shared ParityRef / ParityRef2 fixture specification with eight spaced-title loops and the listed edges, using synthetic protocol frames and zero backend turns. It does not prove real-daemon persistence or backend state transitions.

The host fixture is static and has different ages and some different states from Run A (for example Goal succeeded versus needing input). It verifies the renderer for those supplied states, not a synchronized state-transition replay. It supplies no worktree or attention rows, so their absence in the after image is not evidence that the retained sidebar extras were removed.

Rubber-duck review

Preliminary review by Claude Sonnet 5.5 counts as substantive rejection 1. Final same-task review at b091bea002024ef402115e94244cad0aa8bb62fb found no material defects and no second substantive rejection, accepted the scoped code/evidence changes, checked all five old/new assertions and unchanged Worktrees tests, and opened the paired images. Full visual parity is not met; only the structural findings below are supported.

Finding Response
Collapsing one parent hid a shared diamond child under another expanded parent Fixed: emitted-node visitation is separate from uncapped topology reachability; the child remains under the expanded parent and single-parent hidden descendants do not become fallback roots. red-diamond.log records expected 3/found 2 before the fix.
Keyboard worktree/Jumps used old row formulas or ignored folds Fixed under additional coordinator lease approval. Keyboard-selection RED reproduced a row below the footer; collapsed-Jump RED expected parent top 154/found 1114. Generated rows, current folds and the real viewport now drive scrolling.
Default expansion differs from fresh macOS persisted defaults Explicitly documented as capture-driven, including legacy-state migration limits; not claimed as identical fresh-default persistence behavior.
Global text helper affected retained sections Restored the old helper. Only the new rows/footer use the new bounded rendering.
Footer coverage checked unused status/CHATS rects Replaced relevant assertions with actual workspace-bar disjointness and independent row bounds; added the real framed-window/menu client-width contract.
Banner collapse case is below the native minimum height Explicitly documented as a synthetic boundary test.
Borrowed paint context remained after paint Selection and workspace-name borrows are cleared immediately after sidebar painting.
Blue pill differed from sampled macOS colour Updated to sampled RGB(0,89,209), COLORREF 0x00D15900.

review-fixes-focused-1.log records All 22 tests passed, including the diamond, folded/expanded Jump target, keyboard worktree scrolling and framed native-window/menu width contracts. palette-regression-after-rebase.log records All 15 tests passed. These remain unit/native-message evidence, not visual sign-off or physical input.

palette-regression-final-rebase.log also records All 15 tests passed at the final rebased product state. The reviewer opened and confirmed all cited RED/GREEN/REGRESSION logs, the unit-runner section/root counts, both retained failures and corrected visual-baseline evidence, and the 398 functional gate cases.

Paired visual review findings

Coordinates are 1x image pixels, from the paired images above. Reviewed after captures are host-only, static protocol fixtures.

Surface/criterion macOS crop/reference Windows after crop/reference Finding
Graph / Quick Chats icons and caption Project canvas icons around (33,68)/(33,100), caption y144 Project image (25,62)/(27,94), caption y138 Specified structural rows/caption supported
Hierarchy and pitch Main/Goal/Turn/Timed text x50/66/82/98, y205/237/269/301 x44/60/76/92, y202/234/266/298 32px pitch and 16px indentation match, eight loops/three levels only
Type bars Goal green, Turn pink, Timed orange, Composite purple, Main/sketch white Sampled (25,158,112), (213,81,129), (201,133,0), (144,133,233), (211,218,227) Visually supported, within about four channel units of sampled reference
Trailing ages/dots/chevrons Cluster x190-232 with about 9px age/dot gap x174-207 with about 2px gap, pill ending x210 Partial: tighter spacing and crowded chevron
Active blue pill Project pill x18-237, y157-188 x10-210, y154-184; sample (120,160)=RGB(0,89,209) Active state supported; inactive grey unmatched
Selected destination 727 project=ParityRef; 720 Quick Chats selected Corresponding project and Quick Chats pills Project/Quick Chats supported by captures; Graph/loop selection only unit-tested, not captured
Footer y858-891, inset rounded panel y866-900, full-width opaque bar/top rule Structure/nonoverlap supported; shape differs, popup not captured
Minimum width 452px reference 452x900 client; 468 outer at 96DPI Width floor supported; overlay and toolbar overflow still unmet
Quick Chats trailing plus Visible on selected reference row Controls hover-only; pointer remained over ParityRef Partial, including capture hover artifact

Sidebar width remains fixed 220 versus the reference's 240; exact default-column fidelity is not claimed. The supplied Goal/Timed states differ, so state colours cannot be called synchronized macOS state parity. Exact font/AA/material and deep-tree indentation beyond three levels remain unverified.

Pre-existing accessibility limitation: App publishes both Quick Chats aliases as selected (App.zig:7699-7700), but the native provider discards static-destination flags. Publication-sink selection evidence is not equivalent to native UIA readback. Native static Graph/Quick Chats selection is NotVerified, #801; new native navigation-count assertions cover project/loop destinations only. The capture shows one visual pill, not SelectionItem conformance.

Not verified

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

Refs #767. Retain sidebar worktrees pending the #777 sheet/UIA migration.

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

Copilot-Session: 46a0afce-b4a0-4ab9-bf0e-4e8c0cec3c38
Signed-off-by: Colin Neilens <coneilen@microsoft.com>
Update legacy publication/overview assertions to require one correct sidebar selection while preserving cached project and node identity.

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

Copilot-Session: 46a0afce-b4a0-4ab9-bf0e-4e8c0cec3c38
Signed-off-by: Colin Neilens <coneilen@microsoft.com>
Keep exactly one selected sidebar project and canvas card, while tracking the separate macOS workspace destination gap in #799.

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

Copilot-Session: 46a0afce-b4a0-4ab9-bf0e-4e8c0cec3c38
Signed-off-by: Colin Neilens <coneilen@microsoft.com>
Preserve ownership, card, geometry and roster checks while asserting exactly one selected sidebar identity. Cover the actual source-derived predicates with 14 positive and negative cases.

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

Copilot-Session: 46a0afce-b4a0-4ab9-bf0e-4e8c0cec3c38
Signed-off-by: Colin Neilens <coneilen@microsoft.com>
Preserve existing owner/card geometry and ownership checks. Defer native static-destination selection to #801 and verify selected-alias names without rejecting clipped bounds.

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

Copilot-Session: 46a0afce-b4a0-4ab9-bf0e-4e8c0cec3c38
Signed-off-by: Colin Neilens <coneilen@microsoft.com>
@coneilen

Copy link
Copy Markdown
Collaborator Author

Closed unmerged by operator decision (2026-10-14). Wave 1 was stopped and is being restarted from current main under a revised process: exact-head CI as the regression gate, screenshots taken once at the end, and escalation only after 5 failed iterations. This PR's findings are recorded on the issue. Superseded by the wave-2 PR for the same issue.

@coneilen coneilen closed this Oct 14, 2026
@coneilen
coneilen deleted the coneilen-microsoft-sidebar-macos-parity branch October 14, 2026 14:34
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