Repository navigation
Windows parity: Sidebar and window layout match macOS (tree, colours, sections, minimum width) #767
Description
Visual and functional parity work item, from the 2026-10-13 side-by-side review.
- Comparison: macOS reference Run A (app at
09eda11a, Dark, 2x) against the Windows testing-gaps run (installed0.1.78-windows.beta26, 2560x1440 at 100%). - Ground truth: macOS is the reference. Only platform chrome may differ: the title bar, window buttons, menu-bar location and native file pickers.
- Evidence limits:
- File names below refer to the two local evidence bundles. The next macOS ground-truth run will attach captures.
- Difference IDs (D1, E2, …) refer to the review report.
- The reviewer opened the paired images it cites. Some surfaces could not be reviewed; they are listed under "Captures needed" in the ledger entry.
- Done when: every acceptance box is met and shown with paired screenshots in the PR. Before/after Windows captures go next to the macOS capture, and a reviewer from a different model vendor confirms them. A UIA readback or green unit test alone does not satisfy a visual criterion.
Evidence:
- macOS:
740-parityref-above…,727-canvas-final-states,720-quick-chats,720-min-width-canvas; - Windows:
tg720-project-canvas-1440,tg-lane-740-above,tg735-promote-menu-state,tg720-project-canvas-min; - differences A1–A8, Y1–Y2;
- source:
Sidebar.zig:183-309, 485-489,App.zig:8877-8883.
Acceptance criteria:
- Rows: Graph and Quick Chats with icons, a "Local Projects" caption, and project rows with folder icons, + and a chevron. No "GRAPH", "Projects" or "CHATS" headings, and no letter glyphs.
- The loop tree is indented and expanded as on macOS, every loop is visible, and each row has its type-colour bar, an age, and a state dot.
- No worktree rows or Needs-you section in the normal sidebar. Match the optional Activity strip below the canvas, including its filter and actions; the returned macOS capture records it there, not in the sidebar.
- The workspace switcher appears in the sidebar footer, and no footer text overlaps rows.
- Selection is a blue rounded pill.
- The window enforces a 452pt-equivalent minimum width. Below the sidebar threshold, the sidebar overlays the canvas and the toolbar collapses into "»", as in
720-min-width-canvas.
Reference intake 2026-10-14: Primary macOS source 2ccf303a04f995184aae1d4b738a9eca0f71b79e comments out the normal-sidebar attention call at AppSidebarView.swift:334; toolbar/canvas attention still exists. The recording now shows the optional bottom Activity strip, so it is not an absent feature to remove. The third box above is narrowed to that distinction; all six boxes remain unchecked. This is the extras-are-not-parity scope decision, not a claim that sidebar-extra removal has landed. Such removal needs a separate bounded approval and reachable equivalent actions. The current approved first navigation slice and its named route-alignment corrections are not expanded.
Activity
Align sidebar hierarchy and window minimum with macOS
coneilen commentedon Oct 14, 2026
Escalation record (wave 1, lane C), 2026-10-14 04:53 PDT.
gpt-6.1-sol, high, long_context (lane C)investigation/windows-parity-orchestration-plan.md. Both were in new UIA gate assertions C added, not in product behaviour.claude-sonnet-5.5, xhigh, long_context (lane C2); reviewergpt-6.1-solState handed over: draft PR #800 at
c82286b0, which C2 takes over.Open: the jump-block card oracle ("exact canvas cards") failed in CI run 38556773638. The suspected cause, from source only, is a retained Worktrees or summary card in a broad card count; it has to be confirmed.
Coordinator decisions carried over:
AppSidebarView.swift:334).coneilen commentedon Oct 14, 2026
Wave 1 stopped (operator decision, 2026-10-14). PR #800 was closed unmerged. All this work is abandoned. Findings to reuse in wave 2:
AppSidebarView.swift:300-310): select the open loop if there is one, otherwise the project.needs-you-rowalias is a logged extra.workspace-footer-.AppSidebarView.swift:334, commented out).Restarting from
mainunderinvestigation/windows-parity-lane-kickoff.md.coneilen commentedon Oct 14, 2026
Implementation plan (wave 2)
Planning worker
pc, lane C. Investigated currentmain8ea8106; local HEAD andorigin/mainmatch the GitHub main SHA. This is a source-and-capture plan, not an implementation or a parity sign-off. No product files changed, builds/tests run, or desktop used.Complexity: standard
Assessment applies only to the approved acceptance-box-1 navigation slice, not the deferred whole-sidebar work. It reuses
Sidebar.appendRows, existing GDI painting/hit testing, App's sidebar accessibility and scrolling adapters, and existing temporary fixture mechanisms. The changes are a bounded navigation projection/geometry correction with corresponding named-roster tests; they introduce neither a new shared framework used by multiple surfaces nor a cross-lane architectural mechanism. AlthoughApp.zigand the gate are large files, the approved edits are confined to their sidebar adapters/oracle and fixture restoration. Tree semantics/persistence, selection, footer switching and responsive-window architecture are explicitly excluded. Under the supplied definition this is standard, not highly complex; the applicable implementation tier isgpt-6-luna, high.Decision: first PR is the navigation-row structure, not another whole-sidebar rewrite
First slice: acceptance box 1 only -- Graph and Quick Chats first, then captioned open-project groups, real outline icons, compact project headers, and their existing add/disclosure actions. This repairs the sidebar's primary navigation hierarchy without changing loop hierarchy/persistence, selection semantics, Worktrees ownership, the workspace switcher, or window layout at the same time.
The 220-DIP Windows rail versus Run A's approximately 240pt column, floating-panel silhouette, loop-row density, palette, inactive/active selection, and missing footer remain visible limits, not claimed matches. macOS allows a 200/240/320pt column (
AppSidebarView.swift:102); do not change lane B's shared width token to conceal a comparison difference.Reused Wave 1 findings, verified against main
Read the Wave 1 stopped comment first, and PR #800's scope/evidence notes. #800 is closed unmerged; none of its product changes are present on main, and this plan does not authorize cherry-picking its abandoned rewrite.
graphcode/Sources/Features/App/AppSidebarView.swift:300-310returns the open loop/chat first, otherwise project or Quick Chats. WindowsApp.zig:7614-7652independently marks the selected project and selected node, while7668-7700marks destination/header aliases. Preserve today's behavior in this first slice; a subsequent selection slice must use one navigation-presentation decision. Count only Graph, Quick Chats, project, loop/chat navigation rows; not Worktrees, canvas cards, disclosure/add controls, or Needs-you aliases.App.zig:4189-4236: Jump selects project/node and sets.project, not the loop workspace. A scrolling fix below must not change that destination or require the loop row to become selected.AccessibilityProvider.cpp:851-862retains only static destination bounds and skips their selected flags;1080-1084excludes non-row keys from SelectionItem. An App sink result cannot establish native selection. This first slice must not edit that C++ behavior.AppSidebarView.swift:334comments outattentionSection; WindowsSidebar.zig:289-318paints it andApp.zig:7735-7758publishes it. Retained and labeled in this slice, not passed off as macOS content.AppView.swift:21-31), not a sidebar section. Windows additionally paints sidebar Activity (Sidebar.zig:320-349). Retain it here rather than deleting an action whose alternative navigation path this PR has not established.uia-live-gate.ps1:3227-3242), and connection banners can coexist. Preserve the existing exact named node/summary roster checks. Do not add the failed Wave 1 broad-card-count oracle.workspace-footer-classification is conditional work. Main's multi-project chrome prefix list (uia-live-gate.ps1:3479-3484) lacks it. This PR adds no footer identity, so do not edit that classifier gratuitously. The later footer PR must add it and positive/negative functional tests.C:\gcpc(7 characters), not a junction or an 8-character root. This planner did not run a live gate.Acceptance-by-acceptance source comparison and root causes
Paths below are repository-relative. Swift sidebar files are under
graphcode/Sources/Features/App/; Zig files undergraphcode-windows/src/.1. Navigation rows, sections, icons and project controls
macOS:
AppSidebarView.swift:332-377emits the global project's group, Quick Chats, Local Projects and Remote Repositories, grouping open projects rather than recent folders.AppSidebarView+Rows.swift:11-27,43-110gives each project one header, its children immediately below it, monochrome graph/folder/network icons, and hover-only+then trailing disclosure.AppSidebarView.swift:426-506makes Quick Chats a peer header with an outline chat icon and indented chat children.SidebarIcon.swift:25-38specifies a 15pt symbol in a 20pt monochrome column. Recent projects instead live in Add Folder (AppSidebarView.swift:239-244).Windows:
Sidebar.draw:182-184paints fixed GRAPH/Projects headings;204-228paints R/L/G and leading text chevrons;267-286paints Quick Chats later with an additional CHATS heading.appendRows:621-709emits unopened recents first, then Graph, loaded/placeholder project blocks, Worktrees, and only then Quick Chats.top += 38after loaded project groups andtop += 62for placeholders create the large gaps.projectIsVisibleInSection:797-804groups unopened recent projects, so Local Projects can be absent despite an open local project.Root cause:
appendRowsmodels recents, graph navigation, open graphs and chats as sequential unrelated sections instead of the macOS open-project navigation list;drawseparately paints fixed headings and letter substitutions. Project controls use hard-coded x/y regions in bothApp.onWindowMessage:9739-9757andsyncAccessibilityTo:7607-7634, so changing only paint will misroute pointer/UIA actions. Metadata-only open rows are appended butdraw:218andsyncAccessibilityTo:7608both requiregraphFor(path), making the placeholder unpainted/unpublished.Existing alternative for recents, verified: Windows already has File > Add Folder > Recent Folders (
MainWindow.zig:594-608,799-825), populated from the unchanged model inApp.updateNativeChrome:7190-7198. The live gate reads both fixture recents and invokes the remote command (uia-live-gate.ps1:8151-8200). Therefore removing sidebar presentation of unopened recents need not remove their data or access.2. Tree visibility, indentation and loop-row information
macOS:
AppSidebarView+Rows.swift:209-252starts fromLoopGraph.sidebarRoots, orders siblings by the stored sidebar order, walks all outgoing edges, and uses a visited set.269-287adds 16pt per depth.AppSidebarView.swift:276-295uses a 3x14pt rounded type stripe, 12.5pt title, 10.5pt monospaced age and 7pt state indicator.LoopTypeAppearance.swift:43-47gives Main/Goal/Timed/Turn/Composite RGB colors; composite serializes asproactive(GraphcodeKit/Sources/Domain/LoopType.swift:29-32).LoopStateAppearance.swift:46-51,74-83defines hollow waiting/blocked/stopped versus filled states;Features/Canvas/LoopCardView.swift:393-409renders that indicator.Windows:
Sidebar.hierarchyItems/collectRootIndices/appendHierarchy:846-965only nests handoff edges; it has cycle protection but different root/child semantics.draw:233-246uses 12px indentation, a 3x19px non-rounded stripe, a compact state word, and a 24px slot.loopAccent:485-490uses non-reference COLORREF literals and lacks sketch/turnBased/serialized proactive cases; their default becomes orange when interpreted as COLORREF.loopRowTextRects:371-379reserves a whole state-text column.Expansion correction to Wave 1's abandoned design: A fresh macOS set is also empty (
AppSidebarView.swift:45-49); it does not imply "always default-expanded". Initial edge observation is seeded silently, later new edges reveal the complete ancestor chain (78-85,AppSidebarView+Rows.swift:309-337). Windows only changes expanded IDs on explicit toggles/store load (Sidebar.zig:35-49,79-90; App toggles at8329and9767). A capture of an expanded tree is not permission to replace persisted expansion with a default-true migration.Root causes: different edge/root projection, hand-maintained narrow columns, missing type dispatch and RGB-to-COLORREF conversion, word rather than indicator paint, and no equivalent new-edge ancestor reveal. Expanded Run A fixture versus a cleared Windows profile is also a state mismatch. Future work must seed matching expansion for visual evidence, preserve collapse persistence, and separately test new-edge auto-reveal.
LoopGraph.swift:241-297is the authoritative root/cycle/sketch policy; do not claim arbitrary "every node" parity just from a handoff chain.First slice: none of these semantics or colors change.
3. Worktrees, Needs-you and Activity in the sidebar
macOS:
AppSidebarView.swift:332-377contains no worktree rows and disables the sidebar attention section at334; Activity is below the entire split (AppView.swift:24-31). Run A sidebar confirms these absences.Windows:
appendRows:687-694inserts inspection entries;draw:249-265,289-349paints Worktrees, Needs-you and Activity;contentBottom:985-995reserves their scrolled extent.App.syncAccessibilityTo:7657-7667,7735-7796publishes these elements, and pointer handlers9666-9722route Stop/filter/event actions.Root cause: sidebar is being used as an additional inspector/monitor surface, not merely navigation. Removing only paint would leave invisible actionable/UIA elements or break Worktrees selection/scrolling. The live gate explicitly requires populated Needs-you at
5378-5413.First slice: retain all three as documented Windows extras. Do not silently weaken/remove their functional assertions. Worktree migration needs lane A/#777 coordination; sidebar attention/Activity relocation needs a deliberate alternative-action/evidence plan. This first PR does not reinstate Wave 1 approvals as current permission.
4. Footer switcher and overlap
macOS:
AppSidebarView.swift:190-214places update/error over WorkspaceFooter in the bottom inset.Features/Workspaces/WorkspaceSwitcher.swift:119-180gives the switcher an opaque full-width bar, divider, workspace name, stack glyph and chevrons. Visibility is non-default OR more than one known workspace, not unconditional (AppFeature+Workspaces.swift:74). The switcher opens a structured panel with workspace summaries (WorkspaceSwitcher.swift:186-240); an existing Windows menu is not proof of full panel parity.Windows:
Sidebar.draw:356-365ends with duplicate status text.footerReserve/effectiveFooter/contentViewportBottom/statusTextRect:397-436already reserve and clip a footer; there is no workspace switcher input or drawn row. App has workspace identity/list and existing commands (App.zig:1418-1421,7199-7212,8429-8442), but they are not a sidebar footer.Root cause: Sidebar receives a status string, not a workspace-footer presentation/action; no footer navigation node is emitted. The historical overlap report must not be treated as proof current clipping still fails: main has regression coverage at
App.zig:11586-12475.First slice: preserve existing footer behavior, and test that moved rows remain above its clip. Do not add a menu-only footer and claim the macOS summary panel.
5. Blue rounded selection
macOS:
AppSidebarView.swift:76-77,300-310uses native sidebar List selection and the open-loop-first binding. Opened Run A720-global-graphand720-quick-chatsshow active blue rounded pills;727-canvas-final-statesshows an inactive gray project pill. Both active and inactive states matter.Windows:
Sidebar.draw:218-224merely brightens selected project text. The only row fill in that switch is a selected reclaimable worktree (252-253); no Graph/Quick Chats/loop selection pill is painted. App's independent selected booleans can select project and loop together (7610,7638), and the static-provider limitation above remains.Root cause: Sidebar has model selection but no destination/open-workspace-aware presentation; selected project/node mean different things from the macOS List selection. A single helper must later feed paint and App projection without conflating pointer hover, canvas selection, modal worktree ownership or native selection support.
First slice: leave this box and #801 explicitly unverified; do not introduce a "one selected item across every UIA row" oracle.
6. Minimum width, sidebar overlay and toolbar overflow
macOS:
AppView.swift:46-52delegates split behavior to NavigationSplitView;AppSidebarView.swift:102-107gives the sidebar its 200/240/320pt range and toolbar item.AppView.swift:91-145supplies system toolbar items, including Jump. 452pt is a runtime observation, not a source literal: opened720/min-width.txtsays a request for 400pt clamped to 452pt, and opened720-min-width-canvas@1x-srgb.pngshows the visible sidebar and>>overflow. The exact collapse threshold is not established by that single image; do not invent a source constant or claim all narrower widths were measured.Windows:
App.minimumWindowHeight:1078-1100converts only client height to the outer frame.onWindowMessage:8880-8888constrains onlyptMinTrackSize.y;WM_SIZE:9202-9208relayouts without a responsive-sidebar state.GraphCanvas.renderBounds:621-632permanently subtracts rail width while visible.GraphCanvas.Header.layout:505-531proportionally squeezes controls instead of creating overflow.WorkspaceControls.zig:14-23only toggles a boolean rail; no overlay mode.Root causes: absent x minimum, docked-only canvas/input geometry (
App.inputBounds:1147-1152), and no common overflow presentation/hit-test/UIA model. Later minimum-width work should preserve larger OS minima, useAdjustWindowRectExForDpifor client 452-DIP width, test 96/144/192 DPI plus native menu wrapping, and retain the existing height policy. Responsive overlay/overflow is a separate cross-lane change, not a WM_SIZE paint trick.First slice: no change and no claim for any part of this box.
Implementation steps for the first PR
Names below are proposed new test names, not tests this planner claims to have run. Add tests using existing public APIs first, so RED is a behavioral assertion failure on main, not a missing-new-helper compile error. Keep failing logs.
1. Make the generated row sequence the navigation source of truth
File/functions:
Sidebar.zig,appendRows, project section predicates/lookup,content_top,sidebarSectionBottom, layout/row-extent helpers and their existing tests.model.graphfallback.App.min_client_heightcurrently derives fromSidebar.content_top, and its existing test asserts 517 (App.zig:12277-12310). Moving the first row must not inadvertently shrink that floor. Adjust only this coupled height-floor expression if needed, and retain its existing regression; do not add a width constraint or responsive window mode.RED tests in existing root
src\Sidebar.zig:parity sidebar navigation pins destinations before open folder groupsappendRows:625-653emits the recent section before Graph; Quick Chats comes lastparity sidebar navigation emits each open owner once including global and loading owners.open_projectloop at659-671; loading row cannot be resolved by current paint/UIA guardparity sidebar navigation folds do not hide peer destinations625-671)parity sidebar navigation shares row extents across scroll and hit testingUpdate old tests that assert the intentionally superseded recent-sidebar/CHATS/header policy; do not delete coverage for folds, root reorder, Worktrees/Needs-you/Activity, update/error footers or empty models.
2. Paint bounded outline header rows and preserve real actions
File/functions:
Sidebar.zig,draw, row bounds/text rect helpers and small local icon drawing routines;App.zig, narrow sidebar branches ofonWindowMessage(pointer click, hover and context hit regions).vor>in project/chat headers. No changes to loop state text in this slice.openGlobalOverviewis atApp.zig:2659-2667;createNodealready captures its context at3371-3378. Preserve existing form behavior; no lane A edits.RED tests:
src\Sidebar.zig:parity sidebar navigation paint bounds long names and replaces letter glyphs-- render the existingdrawentry point to a memory bitmap, as current paint tests do. Assert no text ink outside the rail/label rectangle, no fixed heading ink in the removed bands, and nonempty contained graph/folder/network/chat icon regions for each explicit fixture. Main's headerdrawTextuses a right edge of 1200 (2172-2179) and paints the fixed headings/letter glyphs. Semantic icon choice plus nonempty pixel tests does not replace image review.src\App.zig:parity sidebar navigation pointer zones preserve title add and disclosure ownership-- never-shown native window; send logical-center mouse messages throughonWindowMessage, intercept existing form/creation seams rather than opening a modal. Assert each named owner stays exact, disclosure does not navigate/create, and Graph creation does not reuse a local owner. On main the proposed new header/control positions do not align with the old fixed 174/198 ranges and Graph has no equivalent header add branch.3. Wire accessibility and scrolling to those same rows
File/functions:
App.zig,syncAccessibilityTosidebar loop;jumpToNodescrolling tail only;ensureWorktreeVisible; related existing never-shown test helpers. These are outside the narrow App window-procedure lease and require approval.jumpToNode:4230-4233's obsolete fixed row/700px viewport calculation with a lookup through generated rows/current folds and the actual content viewport. If the target is folded, reveal its visible owning project/group; do not expand nodes or change the destination as a side effect.ensureWorktreeVisible:6530-6539's old hand-computed top with the generated worktree row and its actual extent. Retaining this extra means retaining its keyboard navigation correctly after the list moves.RED tests in
src\App.zig:parity sidebar navigation UIA matches painted owners and clipped row controls-- at 96/144/192 DPI, assert a positive named owner count, matching name/identity and exactly-once-scaled bounds for Graph/Quick Chats/open local/open remote/loading owner; every nonempty control rect stays inside its row and the rail and above the footer. Main omits loading owners and uses fixedrow.top - 3 .. row.top + 23and control bounds atApp.zig:7593-7600,7611-7633.parity sidebar navigation scrolling uses current folds and viewport-- explicit short/tall clients and a collapsed group/project, generated target above/below viewport, then worktree rows after the changed list. Assert actual target or visible owner is reachable and scroll clamps to generated content. Main's Jump tail uses700, old node coordinates and no current fold argument;ensureWorktreeVisibleuses the old formula.Use only the never-shown/memory seams for local App execution. Any test that can show forms, a Jump palette, a terminal, or foreground a window belongs in CI or requires a lease; do not run it locally as a supposedly hidden test.
4. Change the live oracle deliberately, with functional negative tests
Files/functions:
Tools\windows\uia-live-gate.ps1initial sidebar navigation block (5360-5480), andTools\windows\Tests\ValidationRunner.Tests.ps1.This is a requested gate lease extension, not permission to edit other canvas/Jump/Worktrees checks.
project-row-plus oneopen-project-with zero sidebar recent rows AND an exact positive named open-owner roster. Verify Graph then Quick Chats then caption/open owners using their bounds, not broad child counts. Preserve all stable fragment-link checks.UiaFixtureData.inithas one open local graph and a recent-only remote (App.zig:999-1024); do not simply delete remote-collapse coverage. Add a bounded temporary sidebar-only fixture state/mutation with a named open remote owner using the existing fixture mechanisms, exercise local and remote group folds, and restore the ordinary fixture before the rest of the gate. No real SSH/Codespace connection or global fixture-wide graph roster change. The correspondingApp.zigfixture mutation and never-shown ownership tests require the explicit scope extension below.8151-8200; that is the alternative access preserved when sidebar recents disappear.ValidationRunner.Tests.ps1, use actual helper execution, not just source regexes: accept valid open local/remote owners plus Graph/Quick Chats; reject a missing/duplicate destination, swapped destination order, wrong owner path, unexpected sidebar recent, empty roster, or row/control outside the allowed clip. Test temporary fixture restoration explicitly. Main's current oracle accepts/requires the recent-only layout and has no equivalent new predicate; capture assertion RED after writing the predicate/test against the old fixture result, not a missing-function error.workspace-footer-or alter multi-project card classification: no footer is added here.5. Documentation and regression evidence
File:
graphcode-windows\README.md, only the Sidebar scrolling and short windows subsection (357-384).Replace the removed fixed GRAPH/Projects header description with the actual navigation order and clipping policy; state that recents remain in File > Add Folder > Recent Folders, and list retained Windows sidebar extras. Do not change width/overlay/selection/expansion claims. The parity ledger stays coordinator-owned and Partial.
File scope for approval
graphcode-windows\src\Sidebar.ziggraphcode-windows\src\App.ziggraphcode-windows\src\App.ziggraphcode-windows\src\App.zigsyncAccessibilityTosidebar projection,ensureWorktreeVisible,jumpToNodescrolling tail only, bounded sidebar fixture mutation, and focused related testsTools\windows\uia-live-gate.ps1Tools\windows\Tests\ValidationRunner.Tests.ps1graphcode-windows\README.mdNo first-PR changes to
GraphCanvas.zig,DesignTokens.zig,GraphModel.zig,AccessibilityProvider.cpp,MainWindow.zig, NativeForms, TerminalSurface, shared Swift, the parity ledger, or workflow/classifier configuration. All Zig tests remain in already registered Sidebar/App roots (WindowsShell.Tests.ps1:1114,1214); no new test root or runner registration is needed. If the temporary fixture requires broader code changes than the bounded App mutation, stop and ask for a scope correction rather than modifying GraphModel or the stub daemon.Evidence and execution plan
Focused RED/GREEN (implementation worker)
Bootstrap only when starting implementation, using canonical
pcroots: seed from read-only mirrors/cache intoC:\gct\pc/C:\gcp\pc, bootstrap those roots, then dot-sourceC:\gct\pc\environment.ps1. UseC:\gcs\pcfor logs/caches/TEMP/TMP and a process-scoped disposable support/profile. Do not write into the abandoned lane C/C2 directories.From
graphcode-windows, the focused Sidebar command is:For focused App tests, use the existing native link invocation in
Tools\windows\Tests\WindowsShell.Tests.ps1:1214-1218, with this same test-name filter and private cache directories: App.zig plus AccessibilityProvider.cpp/FilePicker.c/FolderPicker.c, pinned provider host library and this worker's built ghostty-vt-static.lib; the listed Win32 libraries/UNICODE defines are required. Build missing provider/artifact prerequisites through the pinned repository build path, not a hand-created compiler environment or another worker's artifacts. Run only the new hidden cases and existing relevant known hidden geometry/scroll cases. Preserve compilation/link failures as environment/build failures, not RED.After gate changes, from repository root:
This is an executable script ending in
ValidationRunner.Tests.ps1: PASS, not an assumed Pester test file. Assert nonzero new functional case counts. PrependC:\v5modulesto this process's PSModulePath only when a called task needs Pester 5.7.1.Header/icon/spacing paint changes warrant:
Keep separate RED/GREEN logs and quote the real positive executed-test count; a zero-test filtered success is failure. No passing count is forecast as already observed.
Full regression: exact-head CI only, not full local unit/integration. Require every exact-head workflow green; record run/job IDs and positive test counts. Review every hunk after rebasing onto current origin/main. Get the different-vendor code/evidence reviewer before screenshot time; preserve named-card oracles and review new harness predicates carefully.
Final screenshots (one coordinator-granted slot, after CI and code review)
Use main-before and final-head-after binaries with the same privacy-safe fixture, 100%/96 DPI, matched client size and destination, and
PrintWindow(hwnd, hdc, 2)plus pixel verification. The beta26 return captures are diagnosis only, not a substitute for a current-main before image. Seedonboarding-seen, chats, andwindows-sidebar-state.tsvin the fixture'sGRAPHCODE_SUPPORT_DIR. To match an expanded reference, seed its expanded IDs; do not alter product default expansion to manufacture it. Never upload734/*.zipor the prohibited Needs-you-click capture.720/720-global-graph@1x-srgb.png720/720-quick-chats@1x-srgb.png740/740-parityref-above-threshold-8-linked-canvas@1x-srgb.pngand727/727-canvas-final-states@1x-srgb.pngDo not label the first PR a footer/minimum-width/selection/tree fix because neighboring defects appear in these images.
720-min-width-canvaswas opened for investigation but its overlay/overflow criterion is not part of this PR.After captures, File > Exit and stop only owned PIDs, including zmx daemons, verifying none remain; release the desktop lease. Upload only privacy-safe fixtures and get the reviewer to open every paired image and decide box 1. Use
Refs #767, notFixes; fill the repository PR template, list all unticked criteria and missing evidence, and validate literal RED/GREEN/REGRESSION lines withTools\tdd\Test-TddEvidence.ps1.Risks and explicit guardrails
Approval requested for this one-box first slice and the explicitly marked App/harness/documentation extensions. Remaining boxes need later reviewed slices; this plan intentionally does not resurrect Wave 1's multi-surface PR.
coneilen commentedon Oct 14, 2026
Plan approved (coordinator)
Approved: #767 (comment), acceptance-box-1 navigation structure only, with the following exact file leases. Boxes 2-6 remain unticked. In particular, no default-expanded migration, selection rewrite, footer switcher, minimum width or overlay/overflow-toolbar change.
Approved files/functions: graphcode-windows/src/Sidebar.zig for the described open-owner row projection, row/control geometry, bounded header/icon paint and tests; graphcode-windows/src/App.zig sidebar-only pointer/hover/context adapters, sidebar portion of syncAccessibilityTo, ensureWorktreeVisible, jumpToNode scrolling tail only, bounded temporary sidebar fixture mutation/tests, and only a coupled expression change needed to preserve the existing 517-DIP client-height floor. graphcode-windows/README.md Sidebar scrolling and short windows subsection only is approved outside the original lease. A owns a separate text-prompt paragraph in that file; preserve it after rebasing.
Harness extension approved: Tools/windows/uia-live-gate.ps1 initial sidebar navigation/section oracle and temporary sidebar-only fixture restore only; Tools/windows/Tests/ValidationRunner.Tests.ps1 named positive/negative functional cases for that oracle/restore only. Prefix helpers/tests distinctly for sidebar navigation. E is approved for separate menu expectation/connector-create sections in these files; do not rewrite its helpers or cases. Open #587 changes the isolation/timeout boundary and historical Worktrees traversal hunks; I inspected its diff. Do not touch those mechanisms, merge its branch, or claim it is integrated. Rebase and preserve accepted main before every push.
I verified AppSidebarView.swift:332-377,390-506 and AppSidebarView+Rows.swift:11-110: Graph, Quick Chats, open local/remote groups, hover-only plus/disclosure, actual outline symbols. SidebarIcon.swift:25-38 establishes 15pt symbol/20pt column. AppSidebarView.swift:239-244 and Windows MainWindow.zig:594-608 confirm that recents have an existing Add Folder/Recent Folders route, so removing their sidebar projection must not remove data or menu access. AppSidebarView.swift:45-49,78-85 does not authorize default-expanding everything; 300-310 is the open-workspace-first selection rule, deferred here. Its attentionSection is commented at 334. I opened the Run A Quick Chats, min-width and final-card sidebar captures: they support navigation structure, not completion of all sidebar criteria.
RED must be a compiling production appendRows/draw/routing/publication assertion: current recents precede Graph, Quick Chats follows folders, folds gate recents rather than loaded owners, and loading metadata is omitted by current paint/UIA guards. Test exact named positive owner rosters, independent folds, long names, hit/action ownership and clipped bounds; do not count arbitrary UIA/card sets or demand one selected element across aliases. Reuse current selection/destination semantics and maintain Worktrees/Needs-you/Activity actions as recorded Windows extras. Jump stays on the project canvas (#799); native selection support remains #801.
Replace, do not delete, obsolete sidebar gate coverage; keep Recent Folders invocation, remote folding with a temporary named open owner, stable fragment links and reliable fixture restoration. Run ValidationRunner.Tests.ps1 as its executable script (pwsh -NoProfile -File), assert the new functional cases execute, and run visual-baseline. No other gate, C++, GraphModel, shared Swift, or ledger edits. Code review plus green exact-head CI precede the single screenshot lease. Check box 1 only if paired review accepts it; use Refs #767. Implementer ic uses C:\gcs\ic, C:\gct\ic, C:\gcp\ic and real C:\gcic, not the planner's pc paths.
Implementation model (user-directed policy, 2026-10-14): gpt-6-luna, high, default context. The approved one-box slice reuses the existing Sidebar row projection, draw/hit/UIA adapters and fixture mechanisms; it excludes the broader tree, selection, footer and responsive-window architecture. Its harness edits are a bounded named-roster replacement, so no highly-complex exception is needed. Reviewer remains claude-sonnet-5.5, high.
Launch hold (new user-directed planner-rating step): the approval/model assessment above was posted before this additional policy arrived. Scope/source review is complete, but effective model approval and implementation launch are pending the original planner's own standard/highly-complex rating and reason in its plan comment. No implementation session for this lane has launched.
Final model/launch approval: the original planner has now added standard with its existing row-projection/geometry/adapter/named-oracle rationale to the plan comment. I read and accept the assessment for this one-box slice, not the deferred whole-sidebar work. The launch hold is lifted: use gpt-6-luna, high, default context, reviewer claude-sonnet-5.5, high. Exact leases and exclusions above remain unchanged.
Align Windows sidebar navigation
coneilen commentedon Oct 14, 2026
Named navigation correction approved (coordinator)
The recoverable independent review of cd9e51a is NOT ACCEPTED until the Graph row stops offering project-destructive actions against graphcode://global. Suppress that invalid project context-menu target through the existing approved App navigation/context dispatch; do not add a speculative global-project menu.
N1 is approved as a bounded active-route alignment, not a selection-style/tree redesign. Exact existing surfaces: Sidebar.draw plus one shared Sidebar row-selection predicate; App.syncAccessibilityTo uses that same predicate for overview-destination, quick-chats-destination and open-project rows. GraphCanvas.paint may pass its already-known active surface into Sidebar.draw at that one call site; this is the sole additional GraphCanvas.zig lease. Do not edit card rendering, fonts, geometry, topology or other B-owned paint logic. Graph remains visibly selected in blue on overview, Quick Chats on its canvas, and project rows use the selected project only on project/normal-workspace routes. Preserve the existing background/icon design, tree/keyboard/worktree/dialog selection behavior, scroll tails and 517-DIP floor. Do not absorb the unknown edit that removes Graph's selected background.
Add named focused tests for overview, quick_chats, project and workspace routes, paint/UIA predicate agreement, retained Graph selection, and project-header suppression on non-project canvases. Do not silently equate every workspace with a normal project: a bound Quick Chat workspace must not acquire new incorrect project selection; report any additional input/dependency needed instead of broadening selection semantics. Full native-list selection cardinality remains outside this slice.
N2: replace the seven-fixture claim with counts derived from actual executed positive/negative fixtures, and add the real never-shown App temporary-row append(22) then restoration(20) assertion, not merely a synthetic reset proxy. Use existing App test root; no WindowsShell/validate/gate refactor is authorized. N3/N4 need actual exact-head unit/App/integration log dispositions rather than an unauthorized local full UIA run. N5 needs an explicit visible/accessibility-label comparison against the pinned macOS source/reference; only directly coupled navigation-label corrections are in scope.
Preserve unknown dirty edits intact and excluded; use clean worker-owned source and stage only independently implemented approved changes. Preserve prior failures/review, read the complete final diff, obtain fresh focused counts, exact-head CI/body evidence and the same different-vendor acceptance. No screenshot lease or broad local runner is granted. This does not close the sidebar issue or establish whole-sidebar parity.
Align Windows sidebar navigation
coneilen commentedon Oct 14, 2026
Coupled owner-selection oracle extension approved (coordinator)
I read the exact 8a0f68e gate assertion comparing projectSelected and loopSelected to the same selected owner. Its positive project/loop identity, names, ownership, bounds and exact card checks remain valid; only the parent-project selected-state expectation is stale after N1. Pinned macOS AppSidebarView selectionBinding chooses the open node/chat, not its parent project, while a workspace is open.
Approve ONLY the named two-project owner-evidence selection assertion in Tools/windows/uia-live-gate.ps1 and directly coupled functional controls in ValidationRunner.Tests.ps1: expect a project row selected only when the surface is the matching project canvas; expect no parent project-row selection on overview, workspace or Quick Chats. Retain the existing loop selected-owner expectation, exact card roster/card selection, ownership/identity/name/bounds, captured-snapshot and foreign-fragment guards. Do not replace these checks with a count-only or truthy fallback, and do not introduce a broad all-tree selection-cardinality oracle.
Add focused positive/negative controls that reject a selected parent in workspace, a missing selected project on its matching project surface, a stale selected project on overview/Quick Chats where applicable, and loss of the expected loop selection. Preserve the failed exact-head integration evidence, then run the existing focused offline functional contracts and fresh exact-head CI. No local full UIA/integration or desktop execution is authorized. This clarifies active N1 state semantics, not a blue-pill/style redesign or expansion of the current slice.
Align Windows sidebar navigation
Align Windows sidebar navigation
Align Windows sidebar navigation
Align Windows sidebar navigation
Align Windows sidebar navigation with active destinations (#817)
coneilen commentedon Oct 15, 2026
The approved sidebar navigation code slice merged in #817, commit
24209d2a70efee78be2a8214edf013e9b787ccd0. The accepted combined B/D/C source review, current-head hosted checks and fresh Ready-event DCO were admitted; the six merged source blobs match the reviewed head.Visual acceptance: NotExecuted, tracked by #826. All six whole-issue criteria remain unchecked and this issue stays open. The navigation projection/route/UIA changes do not establish the selected fill's macOS visual match, full tree/footer/responsive parity or a paired screenshot. The offscreen renderer and selected exact-HWND route have their own separate source/plan/execution gates; this merge authorizes no capture or manual screenshots.
Document bounded parity evidence and execution admission (#828)