Repository navigation
Conversation
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>
This was referenced Oct 14, 2026
Open
Collaborator
Author
|
Closed unmerged by operator decision (2026-10-14). Wave 1 was stopped and is being restarted from current |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
proactivecomposite 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.WM_GETMINMAXINFOenforces 452 logical client pixels, scaled at the DPI boundary and adjusted for native non-client chrome. The existing 517-DIP minimum height is retained.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
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, andAppFeature+Workspaces.swift:74. The 452-point observation is from Run A's720/min-width.txt, not a hard-coded macOS source constant.Selection ground truth:
graphcode/Sources/Features/App/AppSidebarView.swift:300-311returns 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.pngselects ParityRef on its project canvas;720/720-global-graph@1x-srgb.pngselects Graph;720/720-ref-main-workspace@1x-srgb.pngselects 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.txtlists 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-cdirectory: 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.logrecords All 6 tests passed after the correction.Final full unit run 4 on
f201067f343f65fadd0af8111215147fb8bd6d6fpassed: 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 atjump palette activation did not navigate to UIA loop B(regression-integration-1.log, retained diagnostics indiagnostics-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, viaopenNode/mountWorkspace) and would select its loop row. The code comment explicitly tracksTODO(#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 newproject-canvas jump did not select exactly its owning sidebar projectassertion. 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,attentionSectioncommented out); removal stays unticked for a follow-up.Correction evidence:
red-navigation-alias-count.logreproduces 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 ingate-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 newjump did not retain the destination project's exact canvas cardsassertion. 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 broadcanvas-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 inci-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-MultiProjectProtocolContractsfromTools\windows\Tests\ValidationRunner.Tests.ps1against 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 earliervisual-baseline.logfailed on ConciseView diagnostic wrapping and remains retained; no local harness weakening was made.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:
Sidebar.content_topThe 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 guestEnumDisplaySettingswas unavailable, before launching the renderer peer; its logs are retained undersandbox/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 headf201067f343f65fadd0af8111215147fb8bd6d6f; SHA25636647504C232CC51AC9B0093EA6812CD09A8F9012618A38E76E4D14BF903477A.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.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
b091bea002024ef402115e94244cad0aa8bb62fbfound 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.red-diamond.logrecords expected 3/found 2 before the fix.0x00D15900.review-fixes-focused-1.logrecords 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.logrecords All 15 tests passed. These remain unit/native-message evidence, not visual sign-off or physical input.palette-regression-final-rebase.logalso 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.
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
»(not implemented).make test/make check(Windows host; macOS and shared Swift source unchanged).Checklist
git commit -s) per the DCOmake test)make check)