fix(sessions): tighten session-list spacing, 2px colour bar, left folder unread dot - #3903
Conversation
GPT 5.6 Review — ✅ no blocking findingsGPT 5.6 completed its review of This comment is updated in place on each push. Review detailsNo findings. False positive or not applicable? A repository writer can comment: |
Design Review (Fable 5) — ✅ PASSAdvisory design-level review of Design-Verdict: PASS Proportionate visual polish with the geometry decisions, their rationale, and the guard tests all updated coherently in one commit. [DESIGN-REVIEWED] 96e6766 |
Opus 4.8 Review — ✅ no blocking findingsReviewed Verdict parsed from the review's SHA-scoped output markers for commit False positive or not applicable? A repository writer can comment: |
UX Review (Fable 5) — ✅ PASSAdvisory UX-level review of UX-Verdict: PASS Consistency polish that pays off: unread markers now share one left-gutter convention, counts align by depth, and the screenshot confirms the spacing claims. Suggestions
[UX-REVIEWED] 96e6766 |
First Principles Review (Fable 5) — 🟡 CONCERNSAdvisory premise-level review of Evidence gathered: I read the contract, the intent file, the patch, and verified against the repo — the First-Principles-Verdict: CONCERNS The unread-dot move is backed only by "consistent with session rows" — no one named as misreading it — and the connector retune skips its board-view twin. What this change shipsIntent: polish the just-merged (#3766) session-list rows' spacing and alignment — a FIX (visual-defect follow-up).
Watch
[FIRST-PRINCIPLES-REVIEWED] 96e6766 |
3bb17ac to
96e6766
Compare
|
Dispositions for the First Principles advisory (verified against Fixed
Accepted / deferred (out of scope for this list-view tuning)
Noted (honesty nit)
None of these block; the rollup is green and mergeable. |
|
Addendum for the refreshed First Principles verdict on
Both advisory; rollup remains green and mergeable. |
bolichen97
left a comment
There was a problem hiding this comment.
Tier 1 auto-approve: cosmetic-UI (4 files). Criteria: no conflict, no requested changes, security path denylist clean, SAST annotations clean, security checklist all-NO, AI reviewers green. Category: tightens session-list spacing, adds 2px colour bar, positions folder unread dot — pure CSS/layout polish.
iamwhatever
left a comment
There was a problem hiding this comment.
Tier 1 auto-approve: cosmetic-UI (4 files). Criteria: no conflict, no requested changes, no security surface, AI reviewers green. Category: session-list spacing polish — 2px colour bar, left folder unread dot, tighter vertical spacing.
bolichen97
left a comment
There was a problem hiding this comment.
Tier 1 auto-approve: cosmetic-UI (4 files). Criteria: no conflict, no requested changes, security path denylist clean, SAST annotations clean, security checklist all-NO, AI reviewers green. Category: CSS spacing polish — session-list 2px colour bar and folder unread dot.
A folder in the session list and the sessions filed under it did not share a left edge. #3766 added the row's status gutter as an in-flow flex child, so its 12px width plus a gap landed on the content column: the agent label, title and tool-call subtitle of every session inside a folder sat well right of that folder's own name. #3903 then tightened the same rows and got closer, but measured on a real render it still left the folder name 1px past its sessions' text and a nested folder's glyph 2px short of their column. Three guides now hold, in the root lane and at every nesting depth: 1. a folder glyph sits on its own border-l connector line 2. a folder name shares one edge with the agent label / title / tool-call subtitle of every session inside it 3. a NESTED folder's glyph sits on the content column of the sessions filed beside it, so a subfolder reads as their peer Solving all three simultaneously forces header pad == session row pad. With D = 2, a MEASURED container differential (the header's box starts 2px left of the nested body's box, and no class in the component expresses it): guide 1 P = D + M 14 = 2 + 12 guide 2 P + G + g = D + M + B + p + R 33 = 33 guide 3 P = R 14 = 14 The status gutter moves out of the content flow (absolutely positioned inside that pad) and is centred on the row rather than deriving the headline's y; in flow it is what broke guide 2, and no class-level assertion could see it. Because the algebra has no per-depth term it is scale-free: depth 3 nests as depth 2 does, and root-lane sessions land on the root folder's glyph, which restores the original pre-#1211 guide. Measured on the built SPA: depth 1 glyph/connector 259, name and all three text lines 278; depth 2 glyph/connector 278 (== depth 1's content column), name/content 297; root lane content 259. This reverts #3903's row and folder geometry, agreed with its author. Its collapsed-folder unread dot goes back inline on the right of the name rather than into an absolute left gutter: that gutter is what forced the header pad to 18px, and the pad is not free — it has to equal the session row's. The 2px colour bar from #3903 is kept, being orthogonal to the guides. Also drop the title's mt-0.5 (row height 49.6 -> 43.6px idle, 68.1 -> 62.1 running), use lucide Loader for the running spinner (at 12px the LoaderCircle arc reads as a broken ring where the spokes read as motion), and pull the divider inset and the empty-folder "New chat in X" affordance onto the same column as the sessions. The alignment invariant test has been rewritten by each of the last two PRs to accept the then-current misalignment. It now pins all three guides, adds guide 3 at depth 2 with a nested fixture, and the gutter test pins the gutter as out-of-flow and row-centred. Every number in the test header is a measurement with its frame named: two paper estimates during this fix were 2px and 3px out.
A folder in the session list and the sessions filed under it did not share a left edge. #3766 added the row's status gutter as an in-flow flex child, so its 12px width plus a gap landed on the content column: the agent label, title and tool-call subtitle of every session inside a folder sat well right of that folder's own name. #3903 then tightened the same rows and got closer, but measured on a real render it still left the folder name 1px past its sessions' text and a nested folder's glyph 2px short of their column. Three guides now hold, in the root lane and at every nesting depth: 1. a folder glyph sits on its own border-l connector line 2. a folder name shares one edge with the agent label / title / tool-call subtitle of every session inside it 3. a NESTED folder's glyph sits on the content column of the sessions filed beside it, so a subfolder reads as their peer Solving all three simultaneously forces header pad == session row pad. With D = 2, a MEASURED container differential (the header's box starts 2px left of the nested body's box, and no class in the component expresses it): guide 1 P = D + M 14 = 2 + 12 guide 2 P + G + g = D + M + B + p + R 33 = 33 guide 3 P = R 14 = 14 The status gutter moves out of the content flow (absolutely positioned inside that pad) and is centred on the row rather than deriving the headline's y; in flow it is what broke guide 2, and no class-level assertion could see it. Because the algebra has no per-depth term it is scale-free: depth 3 nests as depth 2 does, and root-lane sessions land on the root folder's glyph, which restores the original pre-#1211 guide. Measured on the built SPA: depth 1 glyph/connector 259, name and all three text lines 278; depth 2 glyph/connector 278 (== depth 1's content column), name/content 297; root lane content 259. This reverts #3903's row and folder geometry, agreed with its author. Its collapsed-folder unread dot goes back inline on the right of the name rather than into an absolute left gutter: that gutter is what forced the header pad to 18px, and the pad is not free — it has to equal the session row's. The 2px colour bar from #3903 is kept, being orthogonal to the guides. Also drop the title's mt-0.5 (row height 49.6 -> 43.6px idle, 68.1 -> 62.1 running), use lucide Loader for the running spinner (at 12px the LoaderCircle arc reads as a broken ring where the spokes read as motion), and pull the divider inset and the empty-folder "New chat in X" affordance onto the same column as the sessions. The alignment invariant test has been rewritten by each of the last two PRs to accept the then-current misalignment. It now pins all three guides, adds guide 3 at depth 2 with a nested fixture, and the gutter test pins the gutter as out-of-flow and row-centred. Every number in the test header is a measurement with its frame named: two paper estimates during this fix were 2px and 3px out.
A folder in the session list and the sessions filed under it did not share a left edge. #3766 added the row's status gutter as an in-flow flex child, so its 12px width plus a gap landed on the content column: the agent label, title and tool-call subtitle of every session inside a folder sat well right of that folder's own name. #3903 then tightened the same rows and got closer, but measured on a real render it still left the folder name 1px past its sessions' text and a nested folder's glyph 2px short of their column. Three guides now hold, in the root lane and at every nesting depth: 1. a folder glyph sits on its own border-l connector line 2. a folder name shares one edge with the agent label / title / tool-call subtitle of every session inside it 3. a NESTED folder's glyph sits on the content column of the sessions filed beside it, so a subfolder reads as their peer Solving all three simultaneously forces header pad == session row pad. With D = 2, a MEASURED container differential (the header's box starts 2px left of the nested body's box, and no class in the component expresses it): guide 1 P = D + M 14 = 2 + 12 guide 2 P + G + g = D + M + B + p + R 33 = 33 guide 3 P = R 14 = 14 The status gutter moves out of the content flow (absolutely positioned inside that pad) and is centred on the row rather than deriving the headline's y; in flow it is what broke guide 2, and no class-level assertion could see it. Because the algebra has no per-depth term it is scale-free: depth 3 nests as depth 2 does, and root-lane sessions land on the root folder's glyph, which restores the original pre-#1211 guide. Measured on the built SPA: depth 1 glyph/connector 259, name and all three text lines 278; depth 2 glyph/connector 278 (== depth 1's content column), name/content 297; root lane content 259. This reverts #3903's row and folder geometry, agreed with its author. Its collapsed-folder unread dot goes back inline on the right of the name rather than into an absolute left gutter: that gutter is what forced the header pad to 18px, and the pad is not free — it has to equal the session row's. The 2px colour bar from #3903 is kept, being orthogonal to the guides. Also drop the title's mt-0.5 (row height 49.6 -> 43.6px idle, 68.1 -> 62.1 running), use lucide Loader for the running spinner (at 12px the LoaderCircle arc reads as a broken ring where the spokes read as motion), and pull the divider inset and the empty-folder "New chat in X" affordance onto the same column as the sessions. The alignment invariant test has been rewritten by each of the last two PRs to accept the then-current misalignment. It now pins all three guides, adds guide 3 at depth 2 with a nested fixture, and the gutter test pins the gutter as out-of-flow and row-centred. Every number in the test header is a measurement with its frame named: two paper estimates during this fix were 2px and 3px out.
A folder in the session list and the sessions filed under it did not share a left edge. #3766 added the row's status gutter as an in-flow flex child, so its 12px width plus a gap landed on the content column: the agent label, title and tool-call subtitle of every session inside a folder sat well right of that folder's own name. #3903 then tightened the same rows and got closer, but measured on a real render it still left the folder name 1px past its sessions' text and a nested folder's glyph 2px short of their column. Three guides now hold, in the root lane and at every nesting depth: 1. a folder glyph sits on its own border-l connector line 2. a folder name shares one edge with the agent label / title / tool-call subtitle of every session inside it 3. a NESTED folder's glyph sits on the content column of the sessions filed beside it, so a subfolder reads as their peer Solving all three simultaneously forces header pad == session row pad. With D = 2, a MEASURED container differential (the header's box starts 2px left of the nested body's box, and no class in the component expresses it): guide 1 P = D + M 14 = 2 + 12 guide 2 P + G + g = D + M + B + p + R 33 = 33 guide 3 P = R 14 = 14 The status gutter moves out of the content flow (absolutely positioned inside that pad) and is centred on the row rather than deriving the headline's y; in flow it is what broke guide 2, and no class-level assertion could see it. Because the algebra has no per-depth term it is scale-free: depth 3 nests as depth 2 does, and root-lane sessions land on the root folder's glyph, which restores the original pre-#1211 guide. Measured on the built SPA: depth 1 glyph/connector 259, name and all three text lines 278; depth 2 glyph/connector 278 (== depth 1's content column), name/content 297; root lane content 259. This reverts #3903's row and folder geometry, agreed with its author. Its collapsed-folder unread dot goes back inline on the right of the name rather than into an absolute left gutter: that gutter is what forced the header pad to 18px, and the pad is not free — it has to equal the session row's. The 2px colour bar from #3903 is kept, being orthogonal to the guides. Also drop the title's mt-0.5 (row height 49.6 -> 43.6px idle, 68.1 -> 62.1 running), use lucide Loader for the running spinner (at 12px the LoaderCircle arc reads as a broken ring where the spokes read as motion), and pull the divider inset and the empty-folder "New chat in X" affordance onto the same column as the sessions. The alignment invariant test has been rewritten by each of the last two PRs to accept the then-current misalignment. It now pins all three guides, adds guide 3 at depth 2 with a nested fixture, and the gutter test pins the gutter as out-of-flow and row-centred. Every number in the test header is a measurement with its frame named: two paper estimates during this fix were 2px and 3px out.
The sidebar's three folder alignment guides have regressed four times (#1211, #3766, #3903, and twice on paper inside #3905), every time via a Tailwind-class derivation that omitted the 2px FOLDER_BODY_INSET_PX container differential between the folder header's box and the nested body's box. The jsdom test (ChatSidebar.folderAlignment.test.tsx) cannot catch that class of break: jsdom has no layout engine, so it asserts class tokens and an arithmetic identity between constants, never the rendered geometry. Add a Playwright spec to the `E2E (stub ACP backend, offline)` gate that seeds one folder, one subfolder, and sessions in both plus one ungrouped session via the harness gateway API, then asserts the guides on getBoundingClientRect().left of the real rendered elements: - guide 1: folder glyph on its border-l connector line (depth 1 and 2) - guide 2: folder name on the agent label / title of its sessions (depth 1 and 2) - guide 3: nested folder glyph on its sibling sessions' content column, and the root-lane identity (ungrouped content on the root glyph) - depth invariance: the depth-2 connector on depth 1's content column Falsified against the historical regression class: rebuilding with FOLDER_BODY_INSET_PX bumped 2 -> 4 fails the spec with "fGlyph=259 vs fConnector=261" while the jsdom test stays green. The missing-selector diagnostics were falsified the same way (a broken selector fails with "missing: [aAgent, ...]", not a bare timeout). Pre-push review (GPT + Opus model-pinned): no blocking. Fixed advisory findings: absolute sanity anchors so difference-only assertions cannot hold vacuously at left=0; seeding requests assert response.ok() so a 4xx fails as a seeding fault, not an alignment fault; the settle poll subsumes the render wait (budget fits the 30s test timeout) and names missing selectors; the serial-run dependency on the wipe discipline in session-tags-folders.spec.ts is documented in the header. The tool-call subtitle is not asserted: it needs a live agent turn to render, is a sibling of the title inside the same block container (equal left by construction), and its class parity is pinned by the jsdom test. MIN_EXECUTED_SPECS raised 219 -> 220 for the added spec. Closes #3914
The sidebar's three folder alignment guides have regressed four times (#1211, #3766, #3903, and twice on paper inside #3905), every time via a Tailwind-class derivation that omitted the 2px FOLDER_BODY_INSET_PX container differential between the folder header's box and the nested body's box. The jsdom test (ChatSidebar.folderAlignment.test.tsx) cannot catch that class of break: jsdom has no layout engine, so it asserts class tokens and an arithmetic identity between constants, never the rendered geometry. Add a Playwright spec to the `E2E (stub ACP backend, offline)` gate that seeds one folder, one subfolder, and sessions in both plus one ungrouped session via the harness gateway API, then asserts the guides on getBoundingClientRect().left of the real rendered elements: - guide 1: folder glyph on its border-l connector line (depth 1 and 2) - guide 2: folder name on the agent label / title of its sessions (depth 1 and 2) - guide 3: nested folder glyph on its sibling sessions' content column, and the root-lane identity (ungrouped content on the root glyph) - depth invariance: the depth-2 connector on depth 1's content column Falsified against the historical regression class: rebuilding with FOLDER_BODY_INSET_PX bumped 2 -> 4 fails the spec with "fGlyph=259 vs fConnector=261" while the jsdom test stays green. The missing-selector diagnostics were falsified the same way (a broken selector fails with "missing: [aAgent, ...]", not a bare timeout). Pre-push review (GPT + Opus model-pinned): no blocking. Fixed advisory findings: absolute coherence anchors so difference-only assertions cannot hold vacuously at left=0; seeding requests assert response.ok() so a 4xx fails as a seeding fault, not an alignment fault; the settle poll subsumes the render wait (budget fits the 30s test timeout) and names missing selectors; the serial-run dependency on the wipe discipline in session-tags-folders.spec.ts is documented in the header. The tool-call subtitle is not asserted: it needs a live agent turn to render, is a sibling of the title inside the same block container (equal left by construction), and its class parity is pinned by the jsdom test. MIN_EXECUTED_SPECS raised 219 -> 220 for the added spec. Closes #3914
… (#3942) The sidebar's three folder alignment guides have regressed four times (#1211, #3766, #3903, and twice on paper inside #3905), every time via a Tailwind-class derivation that omitted the 2px FOLDER_BODY_INSET_PX container differential between the folder header's box and the nested body's box. The jsdom test (ChatSidebar.folderAlignment.test.tsx) cannot catch that class of break: jsdom has no layout engine, so it asserts class tokens and an arithmetic identity between constants, never the rendered geometry. Add a Playwright spec to the `E2E (stub ACP backend, offline)` gate that seeds one folder, one subfolder, and sessions in both plus one ungrouped session via the harness gateway API, then asserts the guides on getBoundingClientRect().left of the real rendered elements: - guide 1: folder glyph on its border-l connector line (depth 1 and 2) - guide 2: folder name on the agent label / title of its sessions (depth 1 and 2) - guide 3: nested folder glyph on its sibling sessions' content column, and the root-lane identity (ungrouped content on the root glyph) - depth invariance: the depth-2 connector on depth 1's content column Falsified against the historical regression class: rebuilding with FOLDER_BODY_INSET_PX bumped 2 -> 4 fails the spec with "fGlyph=259 vs fConnector=261" while the jsdom test stays green. The missing-selector diagnostics were falsified the same way (a broken selector fails with "missing: [aAgent, ...]", not a bare timeout). Pre-push review (GPT + Opus model-pinned): no blocking. Fixed advisory findings: absolute coherence anchors so difference-only assertions cannot hold vacuously at left=0; seeding requests assert response.ok() so a 4xx fails as a seeding fault, not an alignment fault; the settle poll subsumes the render wait (budget fits the 30s test timeout) and names missing selectors; the serial-run dependency on the wipe discipline in session-tags-folders.spec.ts is documented in the header. The tool-call subtitle is not asserted: it needs a live agent turn to render, is a sibling of the title inside the same block container (equal left by construction), and its class parity is pinned by the jsdom test. MIN_EXECUTED_SPECS raised 219 -> 220 for the added spec. Closes #3914 Co-authored-by: Joe Guo <zejiangg@amazon.com>
…dotdev#3905) A folder in the session list and the sessions filed under it did not share a left edge. kirodotdev#3766 added the row's status gutter as an in-flow flex child, so its 12px width plus a gap landed on the content column: the agent label, title and tool-call subtitle of every session inside a folder sat well right of that folder's own name. kirodotdev#3903 then tightened the same rows and got closer, but measured on a real render it still left the folder name 1px past its sessions' text and a nested folder's glyph 2px short of their column. Three guides now hold, in the root lane and at every nesting depth: 1. a folder glyph sits on its own border-l connector line 2. a folder name shares one edge with the agent label / title / tool-call subtitle of every session inside it 3. a NESTED folder's glyph sits on the content column of the sessions filed beside it, so a subfolder reads as their peer Solving all three simultaneously forces header pad == session row pad. With D = 2, a MEASURED container differential (the header's box starts 2px left of the nested body's box, and no class in the component expresses it): guide 1 P = D + M 14 = 2 + 12 guide 2 P + G + g = D + M + B + p + R 33 = 33 guide 3 P = R 14 = 14 The status gutter moves out of the content flow (absolutely positioned inside that pad) and is centred on the row rather than deriving the headline's y; in flow it is what broke guide 2, and no class-level assertion could see it. Because the algebra has no per-depth term it is scale-free: depth 3 nests as depth 2 does, and root-lane sessions land on the root folder's glyph, which restores the original pre-kirodotdev#1211 guide. Measured on the built SPA: depth 1 glyph/connector 259, name and all three text lines 278; depth 2 glyph/connector 278 (== depth 1's content column), name/content 297; root lane content 259. This reverts kirodotdev#3903's row and folder geometry, agreed with its author. Its collapsed-folder unread dot goes back inline on the right of the name rather than into an absolute left gutter: that gutter is what forced the header pad to 18px, and the pad is not free — it has to equal the session row's. The 2px colour bar from kirodotdev#3903 is kept, being orthogonal to the guides. Also drop the title's mt-0.5 (row height 49.6 -> 43.6px idle, 68.1 -> 62.1 running), use lucide Loader for the running spinner (at 12px the LoaderCircle arc reads as a broken ring where the spokes read as motion), and pull the divider inset and the empty-folder "New chat in X" affordance onto the same column as the sessions. The alignment invariant test has been rewritten by each of the last two PRs to accept the then-current misalignment. It now pins all three guides, adds guide 3 at depth 2 with a nested fixture, and the gutter test pins the gutter as out-of-flow and row-centred. Every number in the test header is a measurement with its frame named: two paper estimates during this fix were 2px and 3px out.
…dotdev#3914) (kirodotdev#3942) The sidebar's three folder alignment guides have regressed four times (kirodotdev#1211, kirodotdev#3766, kirodotdev#3903, and twice on paper inside kirodotdev#3905), every time via a Tailwind-class derivation that omitted the 2px FOLDER_BODY_INSET_PX container differential between the folder header's box and the nested body's box. The jsdom test (ChatSidebar.folderAlignment.test.tsx) cannot catch that class of break: jsdom has no layout engine, so it asserts class tokens and an arithmetic identity between constants, never the rendered geometry. Add a Playwright spec to the `E2E (stub ACP backend, offline)` gate that seeds one folder, one subfolder, and sessions in both plus one ungrouped session via the harness gateway API, then asserts the guides on getBoundingClientRect().left of the real rendered elements: - guide 1: folder glyph on its border-l connector line (depth 1 and 2) - guide 2: folder name on the agent label / title of its sessions (depth 1 and 2) - guide 3: nested folder glyph on its sibling sessions' content column, and the root-lane identity (ungrouped content on the root glyph) - depth invariance: the depth-2 connector on depth 1's content column Falsified against the historical regression class: rebuilding with FOLDER_BODY_INSET_PX bumped 2 -> 4 fails the spec with "fGlyph=259 vs fConnector=261" while the jsdom test stays green. The missing-selector diagnostics were falsified the same way (a broken selector fails with "missing: [aAgent, ...]", not a bare timeout). Pre-push review (GPT + Opus model-pinned): no blocking. Fixed advisory findings: absolute coherence anchors so difference-only assertions cannot hold vacuously at left=0; seeding requests assert response.ok() so a 4xx fails as a seeding fault, not an alignment fault; the settle poll subsumes the render wait (budget fits the 30s test timeout) and names missing selectors; the serial-run dependency on the wipe discipline in session-tags-folders.spec.ts is documented in the header. The tool-call subtitle is not asserted: it needs a live agent turn to render, is a sibling of the title inside the same block container (equal left by construction), and its class parity is pinned by the jsdom test. MIN_EXECUTED_SPECS raised 219 -> 220 for the added spec. Closes kirodotdev#3914 Co-authored-by: Joe Guo <zejiangg@amazon.com>
Problem / Motivation
Follow-up polish to the session-list rows that landed in #3766 (merged). Iterating against a live preview surfaced several spacing/visual details that were slightly off once the redesign was in real use:
px-3), pushing content in.Why it matters
These are the rows a user scans dozens of times a session. Inconsistent left/right alignment (unread dot on opposite sides, folder counts not lining up by depth) reads as visual noise and undercuts the redesign's intent. Small, but directly in the primary navigation surface.
What changed (motivation → approach → change)
Visual tuning of
ChatSidebar.tsx+index.css. The only non-visual touch is a tightened render guard (item 4) so the folder unread dot does not overlap the rename input; no signal is lost:gap-1.5 px-3→gap-1 pl-1 pr-2— tighter, asymmetric padding.3px→2px(both the solid.session-colored::beforeand the gradient-mode solid stops), for a finer line.px-2.5→pl-[18px] pr-3(arbitrary-value left pad because this Tailwind config has no4.5step). The extra left pad opens a gutter for the folder unread dot.<span>in the left gutter, matching the session rows' left marker. Render guard tightened to also suppress it while the folder is being renamed; keptaria-hidden.ml-2 pl-1→ml-4(sessions sit flush against the connector line).FolderBody's inner wrapper had symmetric2pxpadding, so each nesting level pushed content in 2px on the right and counts drifted left per level. Changed to2px 0 2px 2px(top/right/bottom/left) — right padding removed — so counts share the same right edge at every depth.Tests
Updated
ChatSidebar.folderAlignment.test.tsxtoken-exact assertions to the new values (folder-rowpl-[18px]/pr-3+gap-2, nested bodyml-4with nopl-1, session rowpl-1/pr-2/gap-1) and refreshed its doc header + the stale in-source measurement comment. All 337 sidebar/color-bar tests pass;tsc -bclean; eslint 0 errors; brand + i18n gates clean (no string/locale changes).Manual verification
Captured against the isolated preview harness (built
distserved on loopback with stubbed API — no gateway), folder-tree view showing nested folders, right-aligned counts, 2px color bars, and the tightened spacing. See below.Screenshots / video
Related Issues
no linked issue: visual follow-up polish to the merged #3766 redesign, no tracked issue.
Checklist