Tab icons: Money should be a money bag; audit all Tab icons for instant recognition #607

Open
opened 2026-10-01 09:38:28 +00:00 by kayg · 21 comments
Owner

Owner report (2026-10-01, Tab Bar screenshot)

"The money icon in the tab bar should be a money bag 💰. Use easy to identify icons please."
The Money Tab uses a wallet-like glyph that is hard to recognise; Ask's icon is also unclear.
Fix: audit every Tab and sidebar icon for instant recognition (Apple SF Symbols / common conventions as the reference; cite):

  • Money → a money bag (lucide hand-coins/banknote/piggy-bank-style: pick the clearest money-bag glyph available in the shared icon set; add one if missing, same stroke);
  • check Calendar, Tasks, Notes, Files, Photos, Mail, Contacts, Analytics and Ask, and change only the unclear ones.
    The icons come from the shared icon set, at one stroke weight. Use the same icon in the Tab Bar, the sidebar, the search Navigate rows and Settings → Tabs.
    Test: screenshots of the Tab Bar at 390/1440 in both themes, with a before/after table on this issue.
## Owner report (2026-10-01, Tab Bar screenshot) "The money icon in the tab bar should be a money bag 💰. Use easy to identify icons please." The Money Tab uses a wallet-like glyph that is hard to recognise; Ask's icon is also unclear. **Fix:** audit every Tab and sidebar icon for instant recognition (Apple SF Symbols / common conventions as the reference; cite): - Money → a **money bag** (lucide `hand-coins`/`banknote`/`piggy-bank`-style: pick the clearest money-bag glyph available in the shared icon set; add one if missing, same stroke); - check Calendar, Tasks, Notes, Files, Photos, Mail, Contacts, Analytics and Ask, and change only the unclear ones. The icons come from the shared icon set, at one stroke weight. Use the same icon in the Tab Bar, the sidebar, the search Navigate rows and Settings → Tabs. **Test:** screenshots of the Tab Bar at 390/1440 in both themes, with a before/after table on this issue.
Author
Owner

Started work on job/tabicons-607 from base 1af8ead262daf0a4ad22a60564dc75bab0005cf4.

I’m tracing the shared icon registry across Tab Bar, sidebar, Navigate search rows and Settings → Tabs, then I’ll capture the requested before/after Tab Bar screenshots.

Started work on `job/tabicons-607` from base `1af8ead262daf0a4ad22a60564dc75bab0005cf4`. I’m tracing the shared icon registry across Tab Bar, sidebar, Navigate search rows and Settings → Tabs, then I’ll capture the requested before/after Tab Bar screenshots.
Author
Owner

Finding from the icon audit

The shared registry still maps Money to WalletIcon and Ask to BotIcon. The Files sidebar root uses HardDriveIcon while its Tab uses FilesIcon; Photos has the same split (ImagesIcon vs CameraIcon). Tab Bar also accepts only copied SVG path strings, and Settings plugin rows store a separate icon-path map, so those surfaces can drift.

The new red tests reproduce these: 4 failures across navigation, Tab Bar and SettingsRow (Wallet mismatch, Hard_drive vs Files, missing Tab Bar SVG for a component icon, and missing path for a component icon in SettingsRow). Apple documents SF Symbols as interface symbols for tab bars and recommends familiar shapes that aid recognition (Apple HIG: SF Symbols). Lucide classifies message-circle-question-mark as chat/help (Lucide icon).

I also confirmed this branch has no registered Tasks or Contacts Tab/plugin route, so those names are not currently rendered Tab Bar entries.

## Finding from the icon audit The shared registry still maps Money to `WalletIcon` and Ask to `BotIcon`. The Files sidebar root uses `HardDriveIcon` while its Tab uses `FilesIcon`; Photos has the same split (`ImagesIcon` vs `CameraIcon`). Tab Bar also accepts only copied SVG path strings, and Settings plugin rows store a separate icon-path map, so those surfaces can drift. The new red tests reproduce these: 4 failures across navigation, Tab Bar and SettingsRow (`Wallet` mismatch, `Hard_drive` vs `Files`, missing Tab Bar SVG for a component icon, and missing path for a component icon in SettingsRow). Apple documents SF Symbols as interface symbols for tab bars and recommends familiar shapes that aid recognition ([Apple HIG: SF Symbols](https://developer.apple.com/design/human-interface-guidelines/sf-symbols/)). Lucide classifies `message-circle-question-mark` as chat/help ([Lucide icon](https://lucide.dev/icons/message-circle-question-mark)). I also confirmed this branch has no registered Tasks or Contacts Tab/plugin route, so those names are not currently rendered Tab Bar entries.
Author
Owner

#607 — implementation complete

Branch: job/tabicons-607
Head: 812bf6477ac668d2a5abfee02cf2025e567976bd

Before / after

Tab or surface Before After
Calendar CalendarDays CalendarDays, unchanged
Tasks No registered Tasks Tab; task features live with Notes No new Tab
Notes FileText FileText, unchanged
Files Files in the Tab Bar; HardDrive in the Files sidebar Shared Files icon in both
Photos Camera in the Tab Bar; Images for All photos Shared Camera icon in both
Mail Mail Mail, unchanged
Contacts No Contacts Plugin or Tab in this worktree No new Tab
Analytics ChartColumn ChartColumn, unchanged
Money Wallet-like glyph Money bag in the Tab Bar, Budget sidebar row, Navigate, and Settings plugin row
Ask Robot glyph Question-mark chat bubble in the Tab Bar, Navigate, and Settings plugin row

Screenshot evidence

All screenshots are attached to this issue. Each link opens its production-build screenshot. Widths are pixels.

Surface Light (390 · 820 · 1440) Dark (390 · 820 · 1440)
Tab Bar 390 · 820 · 1440 390 · 820 · 1440
Navigate 390 · 820 · 1440 390 · 820 · 1440
Settings → Plugins 390 · 820 · 1440 390 · 820 · 1440
Files sidebar 390 · 820 · 1440 390 · 820 · 1440
Photos sidebar 390 · 820 · 1440 390 · 820 · 1440
Money sidebar 390 · 820 · 1440 390 · 820 · 1440

Decisions and references

  • The installed shared icon set has no exact money-bag glyph. I added a local 24 px icon with a 2 px stroke and reused it across Money surfaces; no dependency changed.
  • The canonical icon is in PLUGIN_NAVIGATION. The Tab Bar now renders that icon component; Navigate already reads the registry; Settings rows use the same component for registered Tabs. Files and Photos sidebar roots now match their Tabs.
  • This worktree has Settings → Plugins, not a separate Settings → Tabs surface, so the shared icon is used in the existing Plugin rows.
  • Tasks and Contacts are not registered Tabs here. I left those surfaces unbuilt.
  • I kept clear existing icons for Calendar, Notes, Mail, and Analytics. Apple’s SF Symbols guidance is the navigation-symbol reference; Lucide documents message-circle-question-mark as a chat/help symbol.

Gates

bun run check:

$ node scripts/check-user-storage.mjs && node scripts/check-type-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
User browser caches use userStorage; only documented device/public-link exceptions remain.
Text sizes and UI shape values use shared role tokens.
UI transitions and animation options use shared motion tokens or documented exceptions.
Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/tabicons-607/apps/web
Getting Svelte diagnostics...

svelte-check found 0 errors and 0 warnings

bun run test:

$ vitest run

 RUN  v5.0.1 /home/kayg/Developer/calternal-wt/tabicons-607/apps/web

 Test Files  148 passed (148)
      Tests  1016 passed (1016)
   Start at  03:18:48
   Duration  125.41s (transform 48%, import 19%, environment 18%, tests 11%, setup 4%)

Environment  |component| jsdom was created 46 times · 115.90s total, 28% of tracked time
             create it once per worker with pool: 'vmThreads' (keeps per-file isolation) or isolate: false (shares it across files)
             learn more: https://vitest.dev/guide/improving-performance#test-environments

The production build printed ✓ built in 69.9s and the real-server screenshot/profile run passed. No Rust files changed, so Rust gates were not run. The screenshot server build finished with:

Finished `dev` profile [unoptimized + debuginfo] target(s) in 16m 58s

Cleanup:

Removed 7237 files, 4.6GiB total

Performance profile

Closest baseline: docs/perf/baseline.json records interactions.switch_mode.visible_ms at p50 316 ms and p95 594 ms across 15 samples on perf-test with 4× CPU throttle and pre-run load average 0.15, 0.39, 1.03. This local probe measures click-to-aria-selected over eight registered Tabs on calternal-dev, whose pre-run load average was 24.44, 24.01, 23.93. The host, load, throttle, and sample method differ, so these values are adjacent reference points, not a direct regression comparison. The baseline switch_mode entry has no burst or browser CPU/RSS values.

  • Average, 24 selections: p50 1,060.12 ms, p95 1,697.23 ms, browser CPU 30.00 s / 108.7%, mean RSS 867,234,816 B, peak RSS 907,624,448 B.
  • Burst, 40 selections: p50 976.12 ms, p95 1,467.18 ms, browser CPU 40.21 s / 99.5%, peak RSS 900,481,024 B.

The performance JSON and all 36 PNGs remain under ignored artifacts/tabicons-607/; no screenshots were committed.

## #607 — implementation complete **Branch:** `job/tabicons-607` **Head:** `812bf6477ac668d2a5abfee02cf2025e567976bd` ### Before / after | Tab or surface | Before | After | |---|---|---| | Calendar | CalendarDays | CalendarDays, unchanged | | Tasks | No registered Tasks Tab; task features live with Notes | No new Tab | | Notes | FileText | FileText, unchanged | | Files | Files in the Tab Bar; HardDrive in the Files sidebar | Shared Files icon in both | | Photos | Camera in the Tab Bar; Images for All photos | Shared Camera icon in both | | Mail | Mail | Mail, unchanged | | Contacts | No Contacts Plugin or Tab in this worktree | No new Tab | | Analytics | ChartColumn | ChartColumn, unchanged | | Money | Wallet-like glyph | Money bag in the Tab Bar, Budget sidebar row, Navigate, and Settings plugin row | | Ask | Robot glyph | Question-mark chat bubble in the Tab Bar, Navigate, and Settings plugin row | ### Screenshot evidence All screenshots are attached to this issue. Each link opens its production-build screenshot. Widths are pixels. | Surface | Light (390 · 820 · 1440) | Dark (390 · 820 · 1440) | |---|---|---| | Tab Bar | [390](https://git.kayg.org/attachments/749952c3-faee-4eca-be62-8cebc9266948) · [820](https://git.kayg.org/attachments/9fdc025a-6659-4279-9d4f-ac8099e8cacf) · [1440](https://git.kayg.org/attachments/4bfde3f5-82d0-4eb7-afca-3c4a89698a22) | [390](https://git.kayg.org/attachments/f9f47f04-3c14-4231-8c5c-8aab8ca65af2) · [820](https://git.kayg.org/attachments/04ae5bff-5d19-4c73-bd3f-6ef6a340e53c) · [1440](https://git.kayg.org/attachments/07412d8d-6530-4f8c-9ca0-a7ecd59bbeeb) | | Navigate | [390](https://git.kayg.org/attachments/efa40031-a816-42fc-9414-d43b0c2eb543) · [820](https://git.kayg.org/attachments/9577929a-4ecd-4555-9be7-cd70aa397e9d) · [1440](https://git.kayg.org/attachments/5fd0c22f-5d35-43dd-a67e-3eb92202cd3b) | [390](https://git.kayg.org/attachments/b0a869e9-f58f-4531-a0aa-d475c2a566e1) · [820](https://git.kayg.org/attachments/e0521cba-8010-40c0-99ac-d1eca57fd02d) · [1440](https://git.kayg.org/attachments/da39fb10-bac6-4edc-aaa4-c23b43e74190) | | Settings → Plugins | [390](https://git.kayg.org/attachments/452569e8-f2fe-4fe0-a9f6-e9fa7f59df5e) · [820](https://git.kayg.org/attachments/7e2cdc60-4cad-4430-8835-59fd84e66047) · [1440](https://git.kayg.org/attachments/06ed706b-b9a0-438d-b0cd-ddd538962bc5) | [390](https://git.kayg.org/attachments/721e5e3a-1370-44ac-9424-4c54a8848116) · [820](https://git.kayg.org/attachments/3def6c2f-a90e-4526-aaee-7309fb7626dd) · [1440](https://git.kayg.org/attachments/8a04ed3a-0e9b-4c10-bccd-b9c164eb01ca) | | Files sidebar | [390](https://git.kayg.org/attachments/41d2ee97-f712-44f9-86f6-4b51df3dcb65) · [820](https://git.kayg.org/attachments/73856919-68b9-4f9f-9867-a5dae0e91078) · [1440](https://git.kayg.org/attachments/e8c87db4-5771-4f64-be1f-eda0e7a0bda2) | [390](https://git.kayg.org/attachments/d801f0ef-f7c3-416d-a847-772ec3cdd146) · [820](https://git.kayg.org/attachments/59b2fcc1-a605-4022-8f80-35fd560e69d1) · [1440](https://git.kayg.org/attachments/7d5fb57f-477d-46b0-b4d0-ccb12160eab4) | | Photos sidebar | [390](https://git.kayg.org/attachments/2b88e1e3-10c1-4828-8579-ac5c0e3b41cb) · [820](https://git.kayg.org/attachments/0b7ff445-e9b1-4209-9704-38d77838b3d8) · [1440](https://git.kayg.org/attachments/7f773ab5-396a-4c61-978c-3e2e0a44eccf) | [390](https://git.kayg.org/attachments/c63704b9-1be9-4f86-8264-e4f003e725a5) · [820](https://git.kayg.org/attachments/9a15f625-778f-4337-951c-b49004650ddb) · [1440](https://git.kayg.org/attachments/8e3d6a75-7085-4266-8a2d-5794d0db1a43) | | Money sidebar | [390](https://git.kayg.org/attachments/7fc3f483-f2cb-47af-8efc-9d106afa0c59) · [820](https://git.kayg.org/attachments/f8a48f7d-b27e-426f-86cf-2ee3417d7097) · [1440](https://git.kayg.org/attachments/a50079a0-15ff-43be-a4a3-2e6a62925e97) | [390](https://git.kayg.org/attachments/e37983a4-75a9-4dcd-8aee-d44811997ff6) · [820](https://git.kayg.org/attachments/358fc755-e1bd-4e6a-b7bf-0a3ca000a958) · [1440](https://git.kayg.org/attachments/45dc8052-63bf-4ef3-9d26-798965d67e1d) | ### Decisions and references - The installed shared icon set has no exact money-bag glyph. I added a local 24 px icon with a 2 px stroke and reused it across Money surfaces; no dependency changed. - The canonical icon is in `PLUGIN_NAVIGATION`. The Tab Bar now renders that icon component; Navigate already reads the registry; Settings rows use the same component for registered Tabs. Files and Photos sidebar roots now match their Tabs. - This worktree has Settings → Plugins, not a separate Settings → Tabs surface, so the shared icon is used in the existing Plugin rows. - Tasks and Contacts are not registered Tabs here. I left those surfaces unbuilt. - I kept clear existing icons for Calendar, Notes, Mail, and Analytics. Apple’s [SF Symbols guidance](https://developer.apple.com/design/human-interface-guidelines/sf-symbols/) is the navigation-symbol reference; Lucide documents [message-circle-question-mark](https://lucide.dev/icons/message-circle-question-mark) as a chat/help symbol. ### Gates `bun run check`: ```text $ node scripts/check-user-storage.mjs && node scripts/check-type-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json User browser caches use userStorage; only documented device/public-link exceptions remain. Text sizes and UI shape values use shared role tokens. UI transitions and animation options use shared motion tokens or documented exceptions. Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/tabicons-607/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings ``` `bun run test`: ```text $ vitest run RUN v5.0.1 /home/kayg/Developer/calternal-wt/tabicons-607/apps/web Test Files 148 passed (148) Tests 1016 passed (1016) Start at 03:18:48 Duration 125.41s (transform 48%, import 19%, environment 18%, tests 11%, setup 4%) Environment |component| jsdom was created 46 times · 115.90s total, 28% of tracked time create it once per worker with pool: 'vmThreads' (keeps per-file isolation) or isolate: false (shares it across files) learn more: https://vitest.dev/guide/improving-performance#test-environments ``` The production build printed `✓ built in 69.9s` and the real-server screenshot/profile run passed. No Rust files changed, so Rust gates were not run. The screenshot server build finished with: ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 16m 58s ``` Cleanup: ```text Removed 7237 files, 4.6GiB total ``` ### Performance profile Closest baseline: `docs/perf/baseline.json` records `interactions.switch_mode.visible_ms` at p50 **316 ms** and p95 **594 ms** across 15 samples on `perf-test` with 4× CPU throttle and pre-run load average **0.15, 0.39, 1.03**. This local probe measures click-to-`aria-selected` over eight registered Tabs on `calternal-dev`, whose pre-run load average was **24.44, 24.01, 23.93**. The host, load, throttle, and sample method differ, so these values are adjacent reference points, not a direct regression comparison. The baseline `switch_mode` entry has no burst or browser CPU/RSS values. - Average, 24 selections: p50 **1,060.12 ms**, p95 **1,697.23 ms**, browser CPU **30.00 s / 108.7%**, mean RSS **867,234,816 B**, peak RSS **907,624,448 B**. - Burst, 40 selections: p50 **976.12 ms**, p95 **1,467.18 ms**, browser CPU **40.21 s / 99.5%**, peak RSS **900,481,024 B**. The performance JSON and all 36 PNGs remain under ignored `artifacts/tabicons-607/`; no screenshots were committed.
Author
Owner

Starting round 2 on job/tabicons-607. Branch base SHA: 687ff703136e71e89f8dfba139e93cd0788b25c1. I’m addressing the review findings for selected Tab label sizing, shared icon optical sizing, and Money bag recognition, then I’ll recapture the required production screenshots and run the requested gates.

Starting round 2 on `job/tabicons-607`. Branch base SHA: `687ff703136e71e89f8dfba139e93cd0788b25c1`. I’m addressing the review findings for selected Tab label sizing, shared icon optical sizing, and Money bag recognition, then I’ll recapture the required production screenshots and run the requested gates.
Author
Owner

Finding from the existing evidence: bench/tab-icons-607.mjs waits for fonts and two animation frames before capture, but the selected .lbl-morph transition lasts 140 ms. The captured tabbar-light-1440.png therefore can show an intermediate label width. Also, sidebar-money-light-1440.png has the same SHA-256 as tabbar-light-1440.png (54a72ab81c34c1f973eeaf189e349e681439ba2bea5989b9a143c259f685bf46), so that prior file is not valid sidebar evidence. I’m fixing the capture/assertion path and will replace the screenshot set.

Finding from the existing evidence: `bench/tab-icons-607.mjs` waits for fonts and two animation frames before capture, but the selected `.lbl-morph` transition lasts 140 ms. The captured `tabbar-light-1440.png` therefore can show an intermediate label width. Also, `sidebar-money-light-1440.png` has the same SHA-256 as `tabbar-light-1440.png` (`54a72ab81c34c1f973eeaf189e349e681439ba2bea5989b9a143c259f685bf46`), so that prior file is not valid sidebar evidence. I’m fixing the capture/assertion path and will replace the screenshot set.
Author
Owner

Correction to the evidence note: the desktop sidebar-money-light-1440.png intentionally uses the same Money route as the Tab Bar capture, and the desktop sidebar is visible in both images. The duplicate hash is expected for that desktop pair, so it is not a missing-sidebar defect. The actionable capture finding is the unawaited selected-label transition; I’ll still verify that sidebar, Navigate and Settings icons are visibly present in their own captures.

Correction to the evidence note: the desktop `sidebar-money-light-1440.png` intentionally uses the same Money route as the Tab Bar capture, and the desktop sidebar is visible in both images. The duplicate hash is expected for that desktop pair, so it is not a missing-sidebar defect. The actionable capture finding is the unawaited selected-label transition; I’ll still verify that sidebar, Navigate and Settings icons are visibly present in their own captures.
Author
Owner

The first web gate run passed bun run check. bun run test completed 1,016 tests: 1,015 passed and one unrelated guard test (src/lib/styles/font-weight-token.test.ts) exceeded its 5,000 ms timeout (6,041 ms) while several worktrees were running Vitest. The SettingsRow test that covers the Money glyph passed in that run. I’ll report the timeout verbatim with the final gate results.

The first web gate run passed `bun run check`. `bun run test` completed 1,016 tests: 1,015 passed and one unrelated guard test (`src/lib/styles/font-weight-token.test.ts`) exceeded its 5,000 ms timeout (6,041 ms) while several worktrees were running Vitest. The SettingsRow test that covers the Money glyph passed in that run. I’ll report the timeout verbatim with the final gate results.
Author
Owner

Post-merge bun run test gate summary:

 Test Files  9 failed | 144 passed (153)
      Tests  13 failed | 1045 passed (1058)
   Start at  15:59:59
   Duration  460.34s (transform 68%, environment 11%, import 10%, tests 8%, setup 2%)
error: script "test" exited with code 1

All 13 failures report Test timed out in 5000ms. under shared host load. The changed src/routes/settings/parts/SettingsRow.svelte.test.ts suite passed. I will not change unrelated assertions or timeouts.

Post-merge `bun run test` gate summary: ``` Test Files 9 failed | 144 passed (153) Tests 13 failed | 1045 passed (1058) Start at 15:59:59 Duration 460.34s (transform 68%, environment 11%, import 10%, tests 8%, setup 2%) error: script "test" exited with code 1 ``` All 13 failures report `Test timed out in 5000ms.` under shared host load. The changed `src/routes/settings/parts/SettingsRow.svelte.test.ts` suite passed. I will not change unrelated assertions or timeouts.
Author
Owner

Production capture/profile attempt stopped before the server could start. mediaSandboxEnv() invoked tests/adversarial/prepare-media-runtime.sh, which reported too many local threads for the bounded media sandbox test: 6408 and exited. That script rejects host counts at 4,090; the shared host was above the sandbox guard. No updated screenshots or performance JSON were produced, so no new screenshots are attached. Existing artifact files are from the previous round and are not presented as current evidence.

Production capture/profile attempt stopped before the server could start. `mediaSandboxEnv()` invoked `tests/adversarial/prepare-media-runtime.sh`, which reported `too many local threads for the bounded media sandbox test: 6408` and exited. That script rejects host counts at 4,090; the shared host was above the sandbox guard. No updated screenshots or performance JSON were produced, so no new screenshots are attached. Existing artifact files are from the previous round and are not presented as current evidence.
Author
Owner

#607 round 2 complete

Head: 76da3dda5c506664aa29b1deabd3c54c7a21bbca (job/tabicons-607). Merged current origin/dev once before final gates. No push or deploy. Worktree is clean.

Built

  • Unified Tab Bar, sidebar, Navigate, and Settings glyphs with the shared --icon size and new --icon-stroke-width: 2 token.
  • Updated the Money glyph to a pinched-neck, wide-body bag with a dollar mark. The silhouette follows the common Money Bag symbol (Unicode U+1F4B0).
  • Extended bench/tab-icons-607.mjs to emulate macOS, check all eight Tabs after their label morph and fonts settle, assert scrollWidth <= clientWidth, and cover 390/820/1440 px in light and dark themes.
  • Added/updated tests for shared Settings icon stroke and navigation glyphs.

Gates

bun run check — passed:

$ node scripts/check-user-storage.mjs && node scripts/check-type-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json
User browser caches use userStorage; only documented device/public-link exceptions remain.
Text sizes and UI shape values use shared role tokens.
UI transitions and animation options use shared motion tokens or documented exceptions.
Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/tabicons-607/apps/web
Getting Svelte diagnostics...

svelte-check found 0 errors and 0 warnings

bun run test — 1,045 passed; 13 tests timed out at 5 seconds under shared-host load:

 Test Files  9 failed | 144 passed (153)
      Tests  13 failed | 1045 passed (1058)
   Start at  15:59:59
   Duration  460.34s (transform 68%, environment 11%, import 10%, tests 8%, setup 2%)

error: script "test" exited with code 1

cargo clean:

     Removed 0 files

No Rust crate changed, so Rust format, clippy, and test gates were not applicable. The production web build succeeded.

UX gaps closed

  • Tab labels now wait for the active morph and font readiness in capture; the e2e profile asserts the selected label fits on every Tab at each required viewport/theme.
  • The navigation icon family uses common size and stroke tokens, and the Money icon has a sack silhouette.

UX gaps left

  • No new screenshots were captured or attached. The production profile stopped in prepare-media-runtime.sh because the host reported 6,408 threads, above the media sandbox guard (too many local threads for the bounded media sandbox test: 6408). Mac-platform emulation is in the profile, but its screenshots still need capture and visual review.
  • Performance measurements were not produced because the profile stopped before its run.

Decisions

  • The shared line icon stroke token is 2; all four navigation surfaces use the existing --icon size token.
  • Money uses a custom outline with a cinched neck, broad sack body, and dollar mark so the glyph remains recognizable at Tab size. Reference: Unicode Emoji List.

Files

apps/web/src/lib/components/MoneyBagIcon.svelte, apps/web/src/lib/components/money/MoneySidebar.svelte, apps/web/src/lib/navigation.ts, apps/web/src/lib/navigation.test.ts, apps/web/src/lib/search/SearchResultRow.svelte, apps/web/src/lib/styles/sidebar.css, apps/web/src/lib/tray.svelte.test.ts, apps/web/src/routes/settings/parts/SettingsRow.svelte, apps/web/src/routes/settings/parts/SettingsRow.svelte.test.ts, apps/web/src/routes/settings/parts/icons.ts, apps/web/src/routes/settings/plugins/PluginsSection.svelte, bench/tab-icons-607.mjs, packages/ui/src/components/PillGroup.svelte, packages/ui/src/components/SegmentedControl.svelte, packages/ui/src/components/TabBar.svelte, packages/ui/src/tokens.css.

## #607 round 2 complete **Head:** `76da3dda5c506664aa29b1deabd3c54c7a21bbca` (`job/tabicons-607`). Merged current `origin/dev` once before final gates. No push or deploy. Worktree is clean. ### Built - Unified Tab Bar, sidebar, Navigate, and Settings glyphs with the shared `--icon` size and new `--icon-stroke-width: 2` token. - Updated the Money glyph to a pinched-neck, wide-body bag with a dollar mark. The silhouette follows the common Money Bag symbol (Unicode U+1F4B0). - Extended `bench/tab-icons-607.mjs` to emulate macOS, check all eight Tabs after their label morph and fonts settle, assert `scrollWidth <= clientWidth`, and cover 390/820/1440 px in light and dark themes. - Added/updated tests for shared Settings icon stroke and navigation glyphs. ### Gates `bun run check` — passed: ```text $ node scripts/check-user-storage.mjs && node scripts/check-type-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json User browser caches use userStorage; only documented device/public-link exceptions remain. Text sizes and UI shape values use shared role tokens. UI transitions and animation options use shared motion tokens or documented exceptions. Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/tabicons-607/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings ``` `bun run test` — 1,045 passed; 13 tests timed out at 5 seconds under shared-host load: ```text Test Files 9 failed | 144 passed (153) Tests 13 failed | 1045 passed (1058) Start at 15:59:59 Duration 460.34s (transform 68%, environment 11%, import 10%, tests 8%, setup 2%) error: script "test" exited with code 1 ``` `cargo clean`: ```text Removed 0 files ``` No Rust crate changed, so Rust format, clippy, and test gates were not applicable. The production web build succeeded. ### UX gaps closed - Tab labels now wait for the active morph and font readiness in capture; the e2e profile asserts the selected label fits on every Tab at each required viewport/theme. - The navigation icon family uses common size and stroke tokens, and the Money icon has a sack silhouette. ### UX gaps left - No new screenshots were captured or attached. The production profile stopped in `prepare-media-runtime.sh` because the host reported 6,408 threads, above the media sandbox guard (`too many local threads for the bounded media sandbox test: 6408`). Mac-platform emulation is in the profile, but its screenshots still need capture and visual review. - Performance measurements were not produced because the profile stopped before its run. ### Decisions - The shared line icon stroke token is `2`; all four navigation surfaces use the existing `--icon` size token. - Money uses a custom outline with a cinched neck, broad sack body, and dollar mark so the glyph remains recognizable at Tab size. Reference: [Unicode Emoji List](https://www.unicode.org/emoji/charts/emoji-list.html). ### Files `apps/web/src/lib/components/MoneyBagIcon.svelte`, `apps/web/src/lib/components/money/MoneySidebar.svelte`, `apps/web/src/lib/navigation.ts`, `apps/web/src/lib/navigation.test.ts`, `apps/web/src/lib/search/SearchResultRow.svelte`, `apps/web/src/lib/styles/sidebar.css`, `apps/web/src/lib/tray.svelte.test.ts`, `apps/web/src/routes/settings/parts/SettingsRow.svelte`, `apps/web/src/routes/settings/parts/SettingsRow.svelte.test.ts`, `apps/web/src/routes/settings/parts/icons.ts`, `apps/web/src/routes/settings/plugins/PluginsSection.svelte`, `bench/tab-icons-607.mjs`, `packages/ui/src/components/PillGroup.svelte`, `packages/ui/src/components/SegmentedControl.svelte`, `packages/ui/src/components/TabBar.svelte`, `packages/ui/src/tokens.css`.
Author
Owner

Round 3 capture starts on job/tabicons-607. Pre-round head: 76da3dda5c506664aa29b1deabd3c54c7a21bbca; branch merge-base with origin/dev: c4a61e8cf090170f35b1bed3350d9de20c83ecd5; pending origin/dev update: 440e19dce23040ac8ebaae88f0469b6535b1afcb. I will merge origin/dev, run the production screenshot and Tab switch profile, and attach fresh evidence. No code changes are planned unless capture shows a defect.

Round 3 capture starts on `job/tabicons-607`. Pre-round head: `76da3dda5c506664aa29b1deabd3c54c7a21bbca`; branch merge-base with `origin/dev`: `c4a61e8cf090170f35b1bed3350d9de20c83ecd5`; pending `origin/dev` update: `440e19dce23040ac8ebaae88f0469b6535b1afcb`. I will merge `origin/dev`, run the production screenshot and Tab switch profile, and attach fresh evidence. No code changes are planned unless capture shows a defect.
Author
Owner

Round 3 status: incomplete

  • Branch: job/tabicons-607
  • Head: 42d57b3640e3f7b43b30cf2ebe4be88f4d01e778
  • origin/dev merge: included 440e19dce (busy-host media sandbox ceiling fix).
  • No source files changed and no new commit was made.

Evidence and checks

The production web build completed before the capture attempt. Its observed success lines were:

Wrote site to "build"
✔ done

The Tab icon profile did not complete. The only available prebuilt server lacked the Money API. The profile stopped while enabling optional Tabs:

AssertionError [ERR_ASSERTION]: the test User enables each optional Tab through the real API
+ actual - expected
  [
    204,
    204,
+   404,
    204,
    204,
-   204
  ]

A server build from this worktree was still linking after the job passed its four-hour limit. I stopped it. cargo clean completed:

Removed 7250 files, 3.8GiB total

The generated web build output was also removed. Rust format, clippy and test gates were not run because this capture-only round made no code changes.

Remaining work

  • Rebuild calternal-server from this worktree and rerun bench/tab-icons-607.mjs.
  • Capture fresh Tab Bar, sidebar, Navigate and Settings screenshots at 390/820/1440 in Light and Dark with macOS emulation.
  • Capture the requested 3× icon-and-label row crops, attach the fresh evidence, and report Tab switch performance numbers against the documented baseline.

The existing files under artifacts/tabicons-607/screenshots/ predate this round and are stale; they were not attached or presented as evidence. No fresh screenshots, crops or performance numbers were produced. UX gaps left: the visual review and requested capture coverage remain outstanding. No new design decisions were made.

## Round 3 status: incomplete - Branch: `job/tabicons-607` - Head: `42d57b3640e3f7b43b30cf2ebe4be88f4d01e778` - `origin/dev` merge: included `440e19dce` (busy-host media sandbox ceiling fix). - No source files changed and no new commit was made. ### Evidence and checks The production web build completed before the capture attempt. Its observed success lines were: ```text Wrote site to "build" ✔ done ``` The Tab icon profile did not complete. The only available prebuilt server lacked the Money API. The profile stopped while enabling optional Tabs: ```text AssertionError [ERR_ASSERTION]: the test User enables each optional Tab through the real API + actual - expected [ 204, 204, + 404, 204, 204, - 204 ] ``` A server build from this worktree was still linking after the job passed its four-hour limit. I stopped it. `cargo clean` completed: ```text Removed 7250 files, 3.8GiB total ``` The generated web build output was also removed. Rust format, clippy and test gates were not run because this capture-only round made no code changes. ### Remaining work - Rebuild `calternal-server` from this worktree and rerun `bench/tab-icons-607.mjs`. - Capture fresh Tab Bar, sidebar, Navigate and Settings screenshots at 390/820/1440 in Light and Dark with macOS emulation. - Capture the requested 3× icon-and-label row crops, attach the fresh evidence, and report Tab switch performance numbers against the documented baseline. The existing files under `artifacts/tabicons-607/screenshots/` predate this round and are stale; they were not attached or presented as evidence. No fresh screenshots, crops or performance numbers were produced. UX gaps left: the visual review and requested capture coverage remain outstanding. No new design decisions were made.
Author
Owner

Started SEND-BACK round on job/tabicons-607 at head 42d57b3640e3f7b43b30cf2ebe4be88f4d01e778; current branch base is 440e19dce23040ac8ebaae88f0469b6535b1afcb. I will rebuild the current server, rerun bench/tab-icons-607.mjs, capture fresh macOS-rendered production screenshots at 390/820/1440 in light and dark with 3× row crops, record Tab switch numbers, then run focused tests and per-crate gates.

Started SEND-BACK round on `job/tabicons-607` at head `42d57b3640e3f7b43b30cf2ebe4be88f4d01e778`; current branch base is `440e19dce23040ac8ebaae88f0469b6535b1afcb`. I will rebuild the current server, rerun `bench/tab-icons-607.mjs`, capture fresh macOS-rendered production screenshots at 390/820/1440 in light and dark with 3× row crops, record Tab switch numbers, then run focused tests and per-crate gates.
Author
Owner

Continuing the SEND-BACK round on job/tabicons-607 at head 5a345846af0d415d52f38a9f0d3180c16d49a063, after the origin/dev merge already present in this worktree. The remaining work is evidence: build the current calternal-server so the Money plugin API is available, rebuild the production web app, rerun bench/tab-icons-607.mjs, attach fresh macOS-rendered screenshots and crops for 390/820/1440 in both themes, record Tab switch numbers, and then run focused tests and the per-crate gates.

Continuing the SEND-BACK round on `job/tabicons-607` at head `5a345846af0d415d52f38a9f0d3180c16d49a063`, after the `origin/dev` merge already present in this worktree. The remaining work is evidence: build the current `calternal-server` so the Money plugin API is available, rebuild the production web app, rerun `bench/tab-icons-607.mjs`, attach fresh macOS-rendered screenshots and crops for 390/820/1440 in both themes, record Tab switch numbers, and then run focused tests and the per-crate gates.
Author
Owner

The rebuilt current server started successfully and the profile passed the Money setup and API checks. Capture then failed in the profile assertion: tokenSize was null when read from document.documentElement, while the Tab Bar icon measured 22.6094 × 22.6094 px and its stroke matched --icon-stroke-width: 2. I’m checking the shared token scope and will update the profile to read the token from the component that owns it before rerunning captures.

The rebuilt current server started successfully and the profile passed the Money setup and API checks. Capture then failed in the profile assertion: `tokenSize` was `null` when read from `document.documentElement`, while the Tab Bar icon measured `22.6094 × 22.6094 px` and its stroke matched `--icon-stroke-width: 2`. I’m checking the shared token scope and will update the profile to read the token from the component that owns it before rerunning captures.
Author
Owner

Correction to my previous finding: --icon is present on :root, but its computed custom-property string is calc() / round() based, so Number.parseFloat returns NaN (serialized as null). --icon-stroke-width is a plain number, which is why that check passed. I’ll resolve var(--icon) through a temporary width probe in the profile, then compare the rendered icon dimensions against that resolved value.

Correction to my previous finding: `--icon` is present on `:root`, but its computed custom-property string is `calc()` / `round()` based, so `Number.parseFloat` returns `NaN` (serialized as `null`). `--icon-stroke-width` is a plain number, which is why that check passed. I’ll resolve `var(--icon)` through a temporary width probe in the profile, then compare the rendered icon dimensions against that resolved value.
Author
Owner

The corrected browser diagnostic found a real icon-size mismatch: the Money Tab SVG computed to 22.6094px, while --icon resolves to 22px. No width rule matched the nested component SVG (matchingWidthRules: []); the .seg-btn svg rule is scoped inside SegmentedControl.svelte and does not reach the child icon component root. I’m changing that selector to cross the Svelte component boundary. The profile will keep the resolved-token assertion as a regression check.

The corrected browser diagnostic found a real icon-size mismatch: the Money Tab SVG computed to `22.6094px`, while `--icon` resolves to `22px`. No width rule matched the nested component SVG (`matchingWidthRules: []`); the `.seg-btn svg` rule is scoped inside `SegmentedControl.svelte` and does not reach the child icon component root. I’m changing that selector to cross the Svelte component boundary. The profile will keep the resolved-token assertion as a regression check.
Author
Owner

The production profile now passes the resolved --icon and stroke assertions on the Tab Bar, Navigate, Settings, and the 390 px sidebar. It then stopped at 820 px because the sidebar assertion hard-coded #app-sidebar, while showSidebar() returns .desktop-sidebar at widths of 768 px and above. I’m scoping the icon assertion to the sidebar locator returned by that helper so the same check covers the phone and desktop sidebar DOM.

The production profile now passes the resolved `--icon` and stroke assertions on the Tab Bar, Navigate, Settings, and the 390 px sidebar. It then stopped at 820 px because the sidebar assertion hard-coded `#app-sidebar`, while `showSidebar()` returns `.desktop-sidebar` at widths of 768 px and above. I’m scoping the icon assertion to the sidebar locator returned by that helper so the same check covers the phone and desktop sidebar DOM.
Author
Owner

The latest profile captured all 36 screenshots and passed the size/stroke checks at every surface and viewport. It then failed in profileSwitches() with a 30 s timeout waiting for aria-selected after a Tab click. A separate real-server run enabled the same five optional Tabs (all PUT calls returned 204) and selected all eight Tabs successfully. I’m rerunning the profile once to determine whether this is transient shared-host load; the screenshot matrix itself is complete.

The latest profile captured all 36 screenshots and passed the size/stroke checks at every surface and viewport. It then failed in `profileSwitches()` with a 30 s timeout waiting for `aria-selected` after a Tab click. A separate real-server run enabled the same five optional Tabs (all `PUT` calls returned 204) and selected all eight Tabs successfully. I’m rerunning the profile once to determine whether this is transient shared-host load; the screenshot matrix itself is complete.
Author
Owner

Round 4 evidence

Fresh production-build screenshots were captured from the current branch at 390, 820, and 1440 px in light and dark themes for the Tab Bar, Navigate, Settings → Tabs, and the Files, Photos, and Money sidebars. The attached Tab Bar crops are 3× row crops for icon and label alignment review. The current-build Tab switch profile is attached as JSON.

Capture platform: Chromium with macOS platform metadata emulation. Profile host: local shared build host; load was not isolated. Full source screenshot matrix: 36 images; Tab Bar crops: 6 images.

## Round 4 evidence Fresh production-build screenshots were captured from the current branch at 390, 820, and 1440 px in light and dark themes for the Tab Bar, Navigate, Settings → Tabs, and the Files, Photos, and Money sidebars. The attached Tab Bar crops are 3× row crops for icon and label alignment review. The current-build Tab switch profile is attached as JSON. Capture platform: Chromium with macOS platform metadata emulation. Profile host: local shared build host; load was not isolated. Full source screenshot matrix: 36 images; Tab Bar crops: 6 images.
Author
Owner

Round 4 final report — #607

Head: 82640d4dc8934477206cbc650e587b5d8d0c07ed (fix(ui): size nested Tab icons from shared tokens). The worktree is clean. No screenshots or review artifacts are committed.

Built

The existing #607 icon audit is complete. This round fixed the Svelte style-boundary bug that left nested Tab icons at intrinsic sizes, corrected the token assertion to resolve CSS calc()/round() values through a real CSS property, and fixed the 820 px sidebar locator. The Money bag remains one app-owned icon shared across the Tab Bar, sidebar, Navigate rows and Settings rows, with the shared size and stroke tokens.

Files in the branch:

  • apps/web/src/lib/components/MoneyBagIcon.svelte
  • apps/web/src/lib/components/money/MoneySidebar.svelte
  • apps/web/src/lib/navigation.ts
  • apps/web/src/lib/navigation.test.ts
  • apps/web/src/lib/search/SearchResultRow.svelte
  • apps/web/src/lib/styles/sidebar.css
  • apps/web/src/lib/tray.svelte.test.ts
  • apps/web/src/routes/settings/parts/SettingsRow.svelte
  • apps/web/src/routes/settings/parts/SettingsRow.svelte.test.ts
  • apps/web/src/routes/settings/parts/icons.ts
  • apps/web/src/routes/settings/plugins/PluginsSection.svelte
  • packages/ui/src/components/PillGroup.svelte
  • packages/ui/src/components/SegmentedControl.svelte
  • packages/ui/src/components/TabBar.svelte
  • packages/ui/src/tokens.css
  • bench/tab-icons-607.mjs

Fresh evidence and profile

The production SPA was captured at 390, 820 and 1440 px in light and dark themes for the Tab Bar, Navigate, Settings → Tabs, and Files, Photos and Money sidebars. The Tab Bar has six additional 3× row crops. Playwright emulated macOS platform metadata. All 43 files (36 screenshots, 6 crops and perf.json) are attached to the Round 4 evidence comment.

The 8-Tab local Chromium profile on the shared host recorded average selection latency p50 888.06 ms, p95 2120.63 ms, max 2711.04 ms across 24 selections. The 40-selection burst recorded p50 568.01 ms, p95 2653.59 ms, max 3579.23 ms. Average browser RSS was 876,686,336 B (peak 896,122,880 B); burst peak was 902,004,736 B. Load average before the run was 39.14, 41.03, 41.19. docs/perf/baseline.json reports switch_mode.visible_ms p50 316 ms and p95 594 ms from a different 4×-throttled perf-test method; these figures are not a direct comparison.

UX gaps closed / left

  • Closed: all captured Money glyphs use the shared icon size and stroke; all three viewport widths and both themes have fresh review captures; the profile now checks desktop sidebars correctly.
  • Left: Tasks and Contacts are not registered, plugin-backed Tabs in this build, so this change did not add new rows or sample data for them.

Verification

cargo fmt --check passed with no output (exit 0).

cargo clippy --offline -p calternal-server --all-targets -- -D warnings passed. Verbatim completion line:

    Finished `dev` profile [unoptimized + debuginfo] target(s) in 71m 05s

cargo test --offline -p calternal-server compiled, then reported one existing timing-sensitive live-app test failure. Verbatim summary:

thread 'wire::tests::full_app_setup_session_config_and_backup' panicked at crates/calternal-server/src/wire.rs:7679:10:
called `Result::unwrap()` on an `Err` value: Elapsed(())
test result: 0 passed; 1 failed; 0 ignored; 0 measured; 109 filtered out; finished in 17.67s
test result: 106 passed; 1 failed; 3 ignored; 0 measured; 0 filtered out; finished in 48.56s
error: test failed, to rerun pass `-p calternal-server --bin calternal-server`

The failure is the existing 5-second archival wait expiring while many builds were active on the shared host. No server code or test expectation changed. The shell then printed zsh:1: read-only variable: status while assigning a result variable; the test output above was read from the captured log. The suite was run once and not retried.

bun run build passed (Wrote site to "build"; ✔ done). bun run check passed:

User browser caches use userStorage; only documented device/public-link exceptions remain.
Text sizes and UI shape values use shared role tokens.
UI transitions and animation options use shared motion tokens or documented exceptions.
Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/tabicons-607/apps/web
Getting Svelte diagnostics...

svelte-check found 0 errors and 0 warnings

Focused Vitest command bunx vitest run src/lib/navigation.test.ts src/lib/tray.svelte.test.ts src/routes/settings/parts/SettingsRow.svelte.test.ts --maxWorkers=2 passed:

Test Files  3 passed (3)
     Tests  42 passed (42)

The focused production profile passed and produced all captures. cargo clean completed with Removed 13674 files, 7.2GiB total; apps/web/build was deleted.

Decisions / merge round

  • Keep the Money bag as an app-owned shared Svelte icon; no dependency was needed.
  • Use :global(.seg-btn svg) because the icon SVG is rendered by a child component and the local Svelte selector did not cross that boundary.
  • Compare the local click-to-aria-selected profile with the existing baseline only as adjacent context because the host and measurement method differ.
  • For the merge round, run the full bun run test, the configured apps/web test:e2e:* scenarios, and tests/adversarial/run.sh matrices. This job ran only focused Vitest and the requested production screenshot/profile round.

Known gap: the calternal-server test suite has the one timeout above. It did not touch any files outside the UI/benchmark set.

## Round 4 final report — #607 **Head:** `82640d4dc8934477206cbc650e587b5d8d0c07ed` (`fix(ui): size nested Tab icons from shared tokens`). The worktree is clean. No screenshots or review artifacts are committed. ### Built The existing #607 icon audit is complete. This round fixed the Svelte style-boundary bug that left nested Tab icons at intrinsic sizes, corrected the token assertion to resolve CSS `calc()`/`round()` values through a real CSS property, and fixed the 820 px sidebar locator. The Money bag remains one app-owned icon shared across the Tab Bar, sidebar, Navigate rows and Settings rows, with the shared size and stroke tokens. Files in the branch: - `apps/web/src/lib/components/MoneyBagIcon.svelte` - `apps/web/src/lib/components/money/MoneySidebar.svelte` - `apps/web/src/lib/navigation.ts` - `apps/web/src/lib/navigation.test.ts` - `apps/web/src/lib/search/SearchResultRow.svelte` - `apps/web/src/lib/styles/sidebar.css` - `apps/web/src/lib/tray.svelte.test.ts` - `apps/web/src/routes/settings/parts/SettingsRow.svelte` - `apps/web/src/routes/settings/parts/SettingsRow.svelte.test.ts` - `apps/web/src/routes/settings/parts/icons.ts` - `apps/web/src/routes/settings/plugins/PluginsSection.svelte` - `packages/ui/src/components/PillGroup.svelte` - `packages/ui/src/components/SegmentedControl.svelte` - `packages/ui/src/components/TabBar.svelte` - `packages/ui/src/tokens.css` - `bench/tab-icons-607.mjs` ### Fresh evidence and profile The production SPA was captured at 390, 820 and 1440 px in light and dark themes for the Tab Bar, Navigate, Settings → Tabs, and Files, Photos and Money sidebars. The Tab Bar has six additional 3× row crops. Playwright emulated macOS platform metadata. All 43 files (36 screenshots, 6 crops and `perf.json`) are attached to the [Round 4 evidence comment](https://git.kayg.org/kayg/calternal/issues/607#issuecomment-22463). The 8-Tab local Chromium profile on the shared host recorded average selection latency p50 **888.06 ms**, p95 **2120.63 ms**, max **2711.04 ms** across 24 selections. The 40-selection burst recorded p50 **568.01 ms**, p95 **2653.59 ms**, max **3579.23 ms**. Average browser RSS was **876,686,336 B** (peak **896,122,880 B**); burst peak was **902,004,736 B**. Load average before the run was **39.14, 41.03, 41.19**. `docs/perf/baseline.json` reports `switch_mode.visible_ms` p50 **316 ms** and p95 **594 ms** from a different 4×-throttled perf-test method; these figures are not a direct comparison. ### UX gaps closed / left - Closed: all captured Money glyphs use the shared icon size and stroke; all three viewport widths and both themes have fresh review captures; the profile now checks desktop sidebars correctly. - Left: Tasks and Contacts are not registered, plugin-backed Tabs in this build, so this change did not add new rows or sample data for them. ### Verification `cargo fmt --check` passed with no output (exit 0). `cargo clippy --offline -p calternal-server --all-targets -- -D warnings` passed. Verbatim completion line: ```text Finished `dev` profile [unoptimized + debuginfo] target(s) in 71m 05s ``` `cargo test --offline -p calternal-server` compiled, then reported one existing timing-sensitive live-app test failure. Verbatim summary: ```text thread 'wire::tests::full_app_setup_session_config_and_backup' panicked at crates/calternal-server/src/wire.rs:7679:10: called `Result::unwrap()` on an `Err` value: Elapsed(()) test result: 0 passed; 1 failed; 0 ignored; 0 measured; 109 filtered out; finished in 17.67s test result: 106 passed; 1 failed; 3 ignored; 0 measured; 0 filtered out; finished in 48.56s error: test failed, to rerun pass `-p calternal-server --bin calternal-server` ``` The failure is the existing 5-second archival wait expiring while many builds were active on the shared host. No server code or test expectation changed. The shell then printed `zsh:1: read-only variable: status` while assigning a result variable; the test output above was read from the captured log. The suite was run once and not retried. `bun run build` passed (`Wrote site to "build"`; `✔ done`). `bun run check` passed: ```text User browser caches use userStorage; only documented device/public-link exceptions remain. Text sizes and UI shape values use shared role tokens. UI transitions and animation options use shared motion tokens or documented exceptions. Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/tabicons-607/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings ``` Focused Vitest command `bunx vitest run src/lib/navigation.test.ts src/lib/tray.svelte.test.ts src/routes/settings/parts/SettingsRow.svelte.test.ts --maxWorkers=2` passed: ```text Test Files 3 passed (3) Tests 42 passed (42) ``` The focused production profile passed and produced all captures. `cargo clean` completed with `Removed 13674 files, 7.2GiB total`; `apps/web/build` was deleted. ### Decisions / merge round - Keep the Money bag as an app-owned shared Svelte icon; no dependency was needed. - Use `:global(.seg-btn svg)` because the icon SVG is rendered by a child component and the local Svelte selector did not cross that boundary. - Compare the local click-to-`aria-selected` profile with the existing baseline only as adjacent context because the host and measurement method differ. - For the merge round, run the full `bun run test`, the configured `apps/web` `test:e2e:*` scenarios, and `tests/adversarial/run.sh` matrices. This job ran only focused Vitest and the requested production screenshot/profile round. **Known gap:** the `calternal-server` test suite has the one timeout above. It did not touch any files outside the UI/benchmark set.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal#607
No description provided.