Skip to content

fix(sidebar): render folder workspaces under every Group by mode (#15362) - #15404

Merged
brennanb2025 merged 2 commits into
mainfrom
brennanb2025/bug-folder-workspaces-vanish-from-the-sidebar-un
Aug 19, 2026
Merged

brennanb2025 merged 2 commits into
mainfrom
brennanb2025/bug-folder-workspaces-vanish-from-the-sidebar-un

Conversation

@brennanb2025

@brennanb2025 brennanb2025 commented Aug 19, 2026 •

Copy link
Copy Markdown
Contributor
Files Added Deleted Net
Test 5 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​551 0 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​551
Prod 17 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​450 $\color{#cf222e}{\Huge{\mathbf{−}}}$​79 $\color{#1a7f37}{\Huge{\mathbf{+}}}$​371

ELI5

If you use a folder workspace on a multi-repo project group, it only showed up in the sidebar when "Group by" was set to Project. Switch to Status, PR status or None and it silently disappeared. Now it shows up in all of them.

What Changed

Folder-workspace rows were emitted in exactly one place — inside the repo-grouping branch of buildRows — so every other Group by mode dropped them.

Membership is now decided once, above the groupBy switch; a mode only chooses which lane a workspace lands in, never whether it exists. Lane assignment is an exhaustive WorktreeGroupBy switch with no default: clause, so adding a fifth grouping mode is a compile error here instead of silently re-introducing this bug.

Placement per mode:

Mode Placement
Project unchanged — nested under its project group
Status its own workspaceStatus lane
PR status the same lane no-PR worktrees already land in
None the flat All lane

The drop-site sweep found four more paths where the same row kind went missing. All are fixed here because this change makes folder-only non-repo results ordinary:

  • Flat mode gated its entire section on worktree count, so an account with only folder workspaces rendered nothing at all.
  • Host sections: a collapsed folder-only lane header rendered globally instead of under its host, because an empty worktree list yields undefined host counts. Host id maps now carry explicit empty arrays so the host fallback cannot leak global worktree ids into a section.
  • Reveal resolved folder workspaces to project-group header keys only, so revealing one inside a collapsed lane never expanded it and retried out. Reveal now reuses the same lane function as grouping (so the two cannot disagree), expands the host header, and covers the agent-send path and the host-qualified row lookup.
  • The Clear Filters empty state ignored folder workspaces, so a folder-only account lost them whenever any filter was active — host scope counts as one. This one reproduces on main today, including under Project grouping.

Two behaviours are deliberately left alone, and both are pinned by tests:

  • Archived folder workspaces are still not filtered. Nothing filters them today, so they already render under Project grouping. Filtering them only in the new lanes would make membership mode-dependent — exactly the defect being removed — and filtering them everywhere would change behaviour users see today.
  • Pinned folder workspaces still render in their natural lane rather than the Pinned section. After this change that is now uniform across all modes, matching what Project grouping already did. The Pinned-section gap is separate; follow-up below.

Why

AGENTS.md says all changes must consider folder workspaces as well as git worktrees. This is one of the spots that predates that rule, and the shape of it is the reason it stayed hidden: membership was computed inside a mode branch, so each new grouping mode forgot the second workspace kind by default. Hoisting membership above the switch and making the mode switch exhaustive fixes the instance and the class.

This is not a regression. The groupBy !== 'repo' gate landed in #2866 (2026-05-27), two weeks before folder workspaces existed. #5172 (2026-06-11) then added folder-workspace emission below that gate, unreachable for non-repo grouping from its very first commit. workspaceStatus has been on FolderWorkspace since day one and status grouping shipped 2026-05-14, so the data was always there — only the wiring was missing.

Bisect hazard for reviewers: build-rows.ts looks like August code, but that is only the #14486 module split out of worktree-list-groups.ts. git log --follow bottoms out at the split; the logic is byte-for-byte the June original.

Linked Issue

Fixes #15362

Visual Proof

Outstanding — needs an Electron session. This is a real UI change and the template requires before/after. I could not capture it in this pass: Electron validation here runs through the $electron skill, which is user-invoked only, so I could not self-drive a capture. Happy to attach a before/after the moment someone runs it.

In the meantime the behaviour is pinned by unit-level evidence with proven pre-fix differentials, described below.

Testing

Four new/extended suites. What matters is not that they pass, but that each was run against pre-fix source and observed to fail — a test that cannot fail measures nothing:

Suite Red pre-fix Notes
build-rows.folder-workspace-lanes.test.ts 13 of 17 4 that pass pre-fix are deliberate no-regression guards, see below
folder-reveal.test.ts (extended) 2 of 3 3rd is the repo-grouping guard
render-row-lookup.folder-workspace.test.ts 1 of 2 2nd is a negative guard
sidebar-empty-state-gate.test.ts n/a (new module) verified load-bearing: deleting the folder clause turns it red

The four intentionally-passing entries are guards, not evidence: the repo arm of the parametrized test, the repo no-duplication guard, the host-filtered negative arm, and a pure lane-key assertion. They are labelled as such in the test file so nobody later mistakes them for acceptance coverage.

Coverage includes: all four Group by modes; a folder workspace as the sole occupant of a status lane; a folder-only account in flat mode; ordering across both emitters (grouped lanes and the separate flat path); host placement for a collapsed folder-only lane; explicit empty hostWorktreeIds; archived parity across all four modes; and no duplication under Project grouping.

  • Automated tests added/updated
  • I manually tested these changes locally — not done, see Visual Proof

pnpm typecheck (web) and the oxlint code-quality gate are clean locally.

One honest caveat on the local suite: the full sidebar run reported 23 failing tests, but this machine was at load average 119–172 with other worktrees running vitest concurrently. Every named failure was re-run individually at --maxWorkers=1 and passed — including WorktreeList.folder-workspace-rows.test.ts (5/5), the existing suite covering exactly these rows. Two others (WorktreeCard.lineage, WorktreeCard.pinned-repo-icon) were confirmed failing on pristine main with none of this branch's changes present, so they are pre-existing and untouched here. CI is the real gate.

Review

Platform/compat notes: renderer-only change. No RPC params, stream opcodes, or published host content are touched, so there is no remote wire-compatibility surface. No new platform-dependent behaviour, no Git invocations, no provider-specific logic. SSH/remote folder workspaces are covered — the host resolver is now centralised in one function shared by header counting and reveal, so the two cannot drift.

Agent skill upstream boundary

  • Not applicable.

Notes

Follow-ups deliberately not bundled here, to keep this focused:

  1. Pinned section — a pinned folder workspace never reaches the Pinned lane, because emitPinnedGroup only receives worktrees. Pre-existing and orthogonal.
  2. Lineage-derived PR lanes — folder workspaces land in the no-PR lane. Deriving a real PR lane from lineage would need four caches threaded into buildRows, well beyond this fix.
  3. Host resolver divergence — getFolderWorkspaceHostId ignores executionHostId while the host filter resolver prefers it, so a runtime-hosted folder workspace passes the filter but buckets under the default host. Pre-existing; this change surfaces it in more modes without causing it.
  4. Archived asymmetry — archived worktrees are dropped upstream; archived folder workspaces are not.

Checklist

  • This PR is small and focused
  • I explained what changed and why (including ELI5)
  • Before/after screenshots or videos attached — outstanding, see Visual Proof
  • Self-reviewed for correctness, security, and performance
  • Cross-platform, SSH/remote, and path/shortcut impact considered
  • pnpm typecheck and lint pass locally; CI covers the rest

Author

  • X / Twitter: @BrennanKB5

)

Folder-workspace rows were emitted in exactly one place, inside the
repo-grouping branch of buildRows, so switching the sidebar to Status,
PR status or None dropped them from every lane.

Membership is now decided once, above the groupBy switch; a mode only
chooses which lane a workspace lands in. Lane assignment is an exhaustive
WorktreeGroupBy switch with no default clause, so a future grouping mode
is a compile error here rather than a silent regression.

Not a regression: the groupBy !== 'repo' gate predates folder workspaces
by two weeks (#2866), and #5172 added folder-workspace emission below it,
unreachable for non-repo grouping from its first commit.

Also fixes four further paths where the same row kind went missing:

- Flat mode gated its whole section on worktree count, so an account with
  only folder workspaces rendered nothing at all.
- A collapsed folder-only lane header rendered globally instead of under
  its host section, because empty worktree lists yield undefined host
  counts. Host id maps now carry explicit empty arrays so the host
  fallback cannot leak global worktree ids.
- Reveal resolved folder workspaces to project-group header keys only, so
  revealing one inside a collapsed lane never expanded it. Reveal now
  reuses the same lane function as grouping, expands the host header, and
  covers the agent-send path and the host-qualified row lookup.
- The Clear Filters empty state ignored folder workspaces, so a
  folder-only account lost them whenever any filter was active. This one
  reproduced under Project grouping too.

Behaviour deliberately unchanged: archived folder workspaces are still
not filtered, matching current behaviour rather than making membership
mode-dependent. Pinned folder workspaces still render in their natural
lane rather than the Pinned section, now uniformly across modes.
@coderabbitai

coderabbitai Bot commented Aug 19, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 330dcc40-7d69-4818-8e4d-05fb10dfade2

📥 Commits

Reviewing files that changed from the base of the PR and between cd7dbb6 and e7136b5.

📒 Files selected for processing (3)
  • src/renderer/src/components/sidebar/host-section-folder-workspace-counts.test.ts
  • src/renderer/src/components/sidebar/host-section-rows.ts
  • src/renderer/src/components/sidebar/worktree-list/grouping/worktree-grouping.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 2 remain after this review.


📝 Walkthrough

Walkthrough

Folder workspaces now render in flat, workspace-status, PR-status, and project-grouped sidebar views. The change adds shared host resolution, lane metadata, sorting, row construction, filtering, collapsed-group expansion, reveal-key generation, and render-row lookup. Tests cover empty-state precedence, grouping behavior, host metadata, reveal keys, and folder workspace row matching.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 37.93% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes satisfy issue #15362 by rendering folder workspaces in Project, Status, PR status, and None grouping modes, with related paths covered.
Out of Scope Changes check ✅ Passed The changes address folder-workspace rendering, host placement, reveal behavior, filtering, and row lookup within the linked issue scope.
Title check ✅ Passed The title clearly summarizes the primary fix: rendering folder workspaces under every grouping mode.
Description check ✅ Passed The description covers the required sections and provides detailed scope, rationale, testing, limitations, and checklist status.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/renderer/src/components/sidebar/folder-workspace-host-id.ts (1)

5-13: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Shorten the new implementation-history comments.

Keep only the non-obvious invariant where a comment is necessary. Remove issue history and behavior that the code or test name already states.

  • src/renderer/src/components/sidebar/folder-workspace-host-id.ts#L5-L13: reduce this block to the resolver consistency invariant.
  • src/renderer/src/components/sidebar/sidebar-empty-state-gate.ts#L1-L9: reduce this block to the empty-state rule.
  • src/renderer/src/components/sidebar/sidebar-empty-state-gate.test.ts#L12-L14: remove the duplicated test rationale.
  • src/renderer/src/components/sidebar/worktree-list/grouping/host-labels.ts#L117-L124: reduce this block to the folder-only host-section invariant.
  • src/renderer/src/components/sidebar/worktree-list/grouping/host-labels.ts#L142-L149: reduce this block to the empty host-ID-array invariant.
  • src/renderer/src/components/sidebar/worktree-list/navigation/render-row-lookup.ts#L112-L113: remove this comment because the branch states the behavior.
  • src/renderer/src/components/sidebar/worktree-list/navigation/render-row-lookup.folder-workspace.test.ts#L39-L41: remove the duplicated test rationale.
  • src/renderer/src/components/sidebar/worktree-list/listing/use-collapsed-groups.ts#L58-L59: reduce this block to the folder-workspace lookup invariant.

As per coding guidelines, “Comments must be concise, non-obvious, and brief—prefer one line; do not explain obvious behavior or walk through code.”

Source: Coding guidelines


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ffbf5cba-cb1f-4cba-be89-7dd77ac943af

📥 Commits

Reviewing files that changed from the base of the PR and between 4ec6bbf and cd7dbb6.

📒 Files selected for processing (21)
  • src/renderer/src/components/sidebar/WorktreeList.tsx
  • src/renderer/src/components/sidebar/folder-workspace-host-id.ts
  • src/renderer/src/components/sidebar/host-section-rows.ts
  • src/renderer/src/components/sidebar/sidebar-empty-state-gate.test.ts
  • src/renderer/src/components/sidebar/sidebar-empty-state-gate.ts
  • src/renderer/src/components/sidebar/worktree-list/grouping/build-rows.folder-workspace-lanes.test.ts
  • src/renderer/src/components/sidebar/worktree-list/grouping/build-rows.ts
  • src/renderer/src/components/sidebar/worktree-list/grouping/folder-workspace-lanes.ts
  • src/renderer/src/components/sidebar/worktree-list/grouping/group-keys.ts
  • src/renderer/src/components/sidebar/worktree-list/grouping/group-sections.ts
  • src/renderer/src/components/sidebar/worktree-list/grouping/host-labels.ts
  • src/renderer/src/components/sidebar/worktree-list/grouping/project-group-sections.ts
  • src/renderer/src/components/sidebar/worktree-list/grouping/project-grouping.ts
  • src/renderer/src/components/sidebar/worktree-list/grouping/row-builders.ts
  • src/renderer/src/components/sidebar/worktree-list/grouping/worktree-grouping.ts
  • src/renderer/src/components/sidebar/worktree-list/listing/use-collapsed-groups.ts
  • src/renderer/src/components/sidebar/worktree-list/navigation/folder-reveal.test.ts
  • src/renderer/src/components/sidebar/worktree-list/navigation/folder-reveal.ts
  • src/renderer/src/components/sidebar/worktree-list/navigation/pending-reveal-inputs.ts
  • src/renderer/src/components/sidebar/worktree-list/navigation/render-row-lookup.folder-workspace.test.ts
  • src/renderer/src/components/sidebar/worktree-list/navigation/render-row-lookup.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 7 remain after this review.

Comment on lines +102 to +105
if (owningGroup && options?.defaultHostId) {
keys.push(
`host:${getFolderWorkspaceHostId(folderWorkspace, owningGroup, options.defaultHostId)}`
)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Honor ProjectGroup.executionHostId during folder workspace host resolution.

getFolderWorkspaceHostId only reads connectionId. It ignores ProjectGroup.executionHostId, which is the runtime-host stamp. A folder workspace in a runtime-host group without a connection ID resolves to the default host. Its row metadata and reveal key then target the wrong host section.

  • src/renderer/src/components/sidebar/worktree-list/navigation/folder-reveal.ts#L102-L105: Generate the host key from a resolver that honors the effective runtime host.
  • src/renderer/src/components/sidebar/worktree-list/grouping/group-sections.ts#L107-L143: Ensure grouped lane host metadata uses that same effective host.
  • src/renderer/src/components/sidebar/worktree-list/grouping/build-rows.ts#L148-L159: Ensure flat-mode host metadata uses that same effective host.
  • src/renderer/src/components/sidebar/worktree-list/grouping/build-rows.folder-workspace-lanes.test.ts#L185-L245: Add a folder-only runtime-host case with executionHostId: 'runtime:...'.
  • src/renderer/src/components/sidebar/worktree-list/navigation/folder-reveal.test.ts#L139-L146: Assert that reveal returns the matching host:runtime:... key.
📍 Affects 5 files
  • src/renderer/src/components/sidebar/worktree-list/navigation/folder-reveal.ts#L102-L105 (this comment)
  • src/renderer/src/components/sidebar/worktree-list/grouping/group-sections.ts#L107-L143
  • src/renderer/src/components/sidebar/worktree-list/grouping/build-rows.ts#L148-L159
  • src/renderer/src/components/sidebar/worktree-list/grouping/build-rows.folder-workspace-lanes.test.ts#L185-L245
  • src/renderer/src/components/sidebar/worktree-list/navigation/folder-reveal.test.ts#L139-L146

@brennanb2025

Copy link
Copy Markdown
Contributor Author

Electron UI validation (head e7136b5bad)

Exercised the visible sidebar Group by controls (Workspace options → None / Status / PR / Project) against one seeded folder workspace (QA-Folder-Workspace-15404). The same card stayed rendered in every mode.

Mode (visible control) Store groupBy Sidebar lane Folder workspace visible
Project repo QA Folder Group 15404 yes
Status workspace-status In progress yes
PR (PR status) pr-status In progress yes
None none All yes

Uncropped full-app screenshots (no repo commit):

Project

01-groupby-project.png

Status

02-groupby-status.png

PR

03-groupby-pr.png

None

04-groupby-none.png

@brennanb2025

brennanb2025 commented Aug 19, 2026 •

Copy link
Copy Markdown
Contributor Author

Final review status: ready to land

Reviewed the focused fix for #15362 through repeated same-model review/readiness passes, performance review, and established UI-state precedent. The closing readiness pass found no remaining P0/P1/P2 issues.

Meaningful fixes pushed in e7136b5bad:

  • Folder-only host badges now count visible folder workspace rows instead of showing 0 or undercounting.
  • Folder lane bucketing now initializes once and mutates with push, removing the prior O(n²) array-copy pattern.
  • Focused regression coverage was added for expanded and collapsed folder workspace counts.
  • A broader host-resolution cleanup was deliberately removed after review exposed a cross-host filtering regression; the final diff stays scoped to [Bug]: Folder workspaces vanish from the sidebar under every Group by mode except Project #15362.

Validation:

  • Focused sidebar suites: 54/54 passed.
  • Host-section regression suite: 22/22 passed.
  • Renderer typecheck, Oxlint/pre-commit hooks, and git diff --check: passed.
  • Current GitHub CI: fully green, including both Node matrices, packaging on macOS/Windows, typecheck, static analysis, Git compatibility, and wire compatibility.
  • Electron/CDP validation at exact head e7136b5bad: the same folder workspace remained visible under Project, Status, PR, and None. Screenshots: fix(sidebar): render folder workspaces under every Group by mode (#15362) #15404 (comment)

No mobile, Windows/WSL, or SSH rig was required because this is a renderer-only sidebar grouping change with no platform, Git, or remote-wire behavior. The isolated dev harness needed a temporary Vite alias for an unrelated existing node:path bootstrap gap; no tracked files or PR scope were changed for it.

Verdict: land.

@brennanb2025
brennanb2025 merged commit 1272406 into main Aug 19, 2026
46 checks passed
paidaxingyo666 pushed a commit to paidaxingyo666/Manta that referenced this pull request Aug 21, 2026
…blyai#15362) (stablyai#15404)

* fix(sidebar): render folder workspaces under every Group by mode (stablyai#15362)

Folder-workspace rows were emitted in exactly one place, inside the
repo-grouping branch of buildRows, so switching the sidebar to Status,
PR status or None dropped them from every lane.

Membership is now decided once, above the groupBy switch; a mode only
chooses which lane a workspace lands in. Lane assignment is an exhaustive
WorktreeGroupBy switch with no default clause, so a future grouping mode
is a compile error here rather than a silent regression.

Not a regression: the groupBy !== 'repo' gate predates folder workspaces
by two weeks (stablyai#2866), and stablyai#5172 added folder-workspace emission below it,
unreachable for non-repo grouping from its first commit.

Also fixes four further paths where the same row kind went missing:

- Flat mode gated its whole section on worktree count, so an account with
  only folder workspaces rendered nothing at all.
- A collapsed folder-only lane header rendered globally instead of under
  its host section, because empty worktree lists yield undefined host
  counts. Host id maps now carry explicit empty arrays so the host
  fallback cannot leak global worktree ids.
- Reveal resolved folder workspaces to project-group header keys only, so
  revealing one inside a collapsed lane never expanded it. Reveal now
  reuses the same lane function as grouping, expands the host header, and
  covers the agent-send path and the host-qualified row lookup.
- The Clear Filters empty state ignored folder workspaces, so a
  folder-only account lost them whenever any filter was active. This one
  reproduced under Project grouping too.

Behaviour deliberately unchanged: archived folder workspaces are still
not filtered, matching current behaviour rather than making membership
mode-dependent. Pinned folder workspaces still render in their natural
lane rather than the Pinned section, now uniformly across modes.

* fix(sidebar): count folder workspaces in host badges
dallascrilley pushed a commit to dallascrilley/orca that referenced this pull request Aug 27, 2026
…blyai#15362) (stablyai#15404)

* fix(sidebar): render folder workspaces under every Group by mode (stablyai#15362)

Folder-workspace rows were emitted in exactly one place, inside the
repo-grouping branch of buildRows, so switching the sidebar to Status,
PR status or None dropped them from every lane.

Membership is now decided once, above the groupBy switch; a mode only
chooses which lane a workspace lands in. Lane assignment is an exhaustive
WorktreeGroupBy switch with no default clause, so a future grouping mode
is a compile error here rather than a silent regression.

Not a regression: the groupBy !== 'repo' gate predates folder workspaces
by two weeks (stablyai#2866), and stablyai#5172 added folder-workspace emission below it,
unreachable for non-repo grouping from its first commit.

Also fixes four further paths where the same row kind went missing:

- Flat mode gated its whole section on worktree count, so an account with
  only folder workspaces rendered nothing at all.
- A collapsed folder-only lane header rendered globally instead of under
  its host section, because empty worktree lists yield undefined host
  counts. Host id maps now carry explicit empty arrays so the host
  fallback cannot leak global worktree ids.
- Reveal resolved folder workspaces to project-group header keys only, so
  revealing one inside a collapsed lane never expanded it. Reveal now
  reuses the same lane function as grouping, expands the host header, and
  covers the agent-send path and the host-qualified row lookup.
- The Clear Filters empty state ignored folder workspaces, so a
  folder-only account lost them whenever any filter was active. This one
  reproduced under Project grouping too.

Behaviour deliberately unchanged: archived folder workspaces are still
not filtered, matching current behaviour rather than making membership
mode-dependent. Pinned folder workspaces still render in their natural
lane rather than the Pinned section, now uniformly across modes.

* fix(sidebar): count folder workspaces in host badges
enrick-dev pushed a commit to enrick-dev/orca that referenced this pull request Oct 15, 2026
…blyai#15362) (stablyai#15404)

* fix(sidebar): render folder workspaces under every Group by mode (stablyai#15362)

Folder-workspace rows were emitted in exactly one place, inside the
repo-grouping branch of buildRows, so switching the sidebar to Status,
PR status or None dropped them from every lane.

Membership is now decided once, above the groupBy switch; a mode only
chooses which lane a workspace lands in. Lane assignment is an exhaustive
WorktreeGroupBy switch with no default clause, so a future grouping mode
is a compile error here rather than a silent regression.

Not a regression: the groupBy !== 'repo' gate predates folder workspaces
by two weeks (stablyai#2866), and stablyai#5172 added folder-workspace emission below it,
unreachable for non-repo grouping from its first commit.

Also fixes four further paths where the same row kind went missing:

- Flat mode gated its whole section on worktree count, so an account with
  only folder workspaces rendered nothing at all.
- A collapsed folder-only lane header rendered globally instead of under
  its host section, because empty worktree lists yield undefined host
  counts. Host id maps now carry explicit empty arrays so the host
  fallback cannot leak global worktree ids.
- Reveal resolved folder workspaces to project-group header keys only, so
  revealing one inside a collapsed lane never expanded it. Reveal now
  reuses the same lane function as grouping, expands the host header, and
  covers the agent-send path and the host-qualified row lookup.
- The Clear Filters empty state ignored folder workspaces, so a
  folder-only account lost them whenever any filter was active. This one
  reproduced under Project grouping too.

Behaviour deliberately unchanged: archived folder workspaces are still
not filtered, matching current behaviour rather than making membership
mode-dependent. Pinned folder workspaces still render in their natural
lane rather than the Pinned section, now uniformly across modes.

* fix(sidebar): count folder workspaces in host badges
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.

[Bug]: Folder workspaces vanish from the sidebar under every Group by mode except Project

1 participant