Step 12d: UI redesign from calternal.js polish #21

Open
opened 2026-09-23 06:53:12 +00:00 by kayg · 33 comments
Owner

Step 12d, from owner feedback on the preview (2026-09-23): "the UI looks absolutely horrible, with the font weights even worse".

The owner's direction:

  • Copy the UI polish from calternal.js (kayg/calternal.js, branch dev; pinned as a read-only reference at 604105b in /mnt/hdd/infraternal/artifacts/reference/calternal.js). Use progressive blur, shadows and depth.
  • The sidebar is always editable. There is no edit mode: drag and drop works directly. This changes DECISIONS §20 and docs/UI.md.
  • Profile, sign out and server version share one row.
  • The inbox is its own floating card, with a progressive blur over the content underneath it.

Done when merged to dev, browser-verified at 1440×900 and 390×844, light and dark, with before-and-after screenshots.

Step 12d, from owner feedback on the preview (2026-09-23): "the UI looks absolutely horrible, with the font weights even worse". The owner's direction: - **Copy the UI polish from calternal.js** (`kayg/calternal.js`, branch `dev`; pinned as a read-only reference at `604105b` in `/mnt/hdd/infraternal/artifacts/reference/calternal.js`). Use progressive blur, shadows and depth. - **The sidebar is always editable.** There is no edit mode: drag and drop works directly. This changes DECISIONS §20 and `docs/UI.md`. - **Profile, sign out and server version share one row.** - **The inbox is its own floating card**, with a progressive blur over the content underneath it. Done when merged to `dev`, browser-verified at 1440×900 and 390×844, light and dark, with before-and-after screenshots.
Author
Owner

Starting the UI redesign job.

  • Branch: ui-redesign
  • Base: dev at 244df292cbe6ae7280d83d0abdaab9b8026fb14f
  • Scope: design tokens/primitives, app shell, inbox/account, sign-in/setup, Dashboard, Hosts, UI spec and browser check as listed in the job contract.
Starting the UI redesign job. - Branch: `ui-redesign` - Base: `dev` at `244df292cbe6ae7280d83d0abdaab9b8026fb14f` - Scope: design tokens/primitives, app shell, inbox/account, sign-in/setup, Dashboard, Hosts, UI spec and browser check as listed in the job contract.
Author
Owner

Finding from the baseline review: AppShell.svelte exposes an “Edit sidebar” toggle, and Sidebar.svelte gates item/group dragging plus create, rename and move controls on sidebarStore.editMode. The inbox currently opens as a generic dialog, while account, sign-out and version occupy separate footer rows. The sidebar behavior and footer structure will move to the always-available layout requested for this job.

Finding from the baseline review: `AppShell.svelte` exposes an “Edit sidebar” toggle, and `Sidebar.svelte` gates item/group dragging plus create, rename and move controls on `sidebarStore.editMode`. The inbox currently opens as a generic dialog, while account, sign-out and version occupy separate footer rows. The sidebar behavior and footer structure will move to the always-available layout requested for this job.
Author
Owner

Started the ui-redesign restart on branch ui-redesign. Merged the current origin/dev; base head is 1830177ac5. Capturing the existing owned pages and browser states before changes.

Started the ui-redesign restart on branch ui-redesign. Merged the current origin/dev; base head is 1830177ac53bb17160b8b038a6016eacd76d40d2. Capturing the existing owned pages and browser states before changes.
Author
Owner

Baseline findings from the unchanged UI at 1830177ac5: the desktop screenshot shows a centered modal with a uniform dark scrim and no backdrop blur; the header still exposes “Edit sidebar”; the current account identity, server version and sign-out are three separate footer rows. The existing font treatment renders the sidebar group labels and primary headings heavier than surrounding text. Captured owned pages at 1440×900 and 390×844 in light/dark, plus open inbox and an in-progress sidebar drag, under /mnt/hdd/infraternal/artifacts/ui-redesign/before. Baseline first-load JavaScript: 73,410 bytes gzip of 122,880 bytes.

Baseline gate output:

PASS browser: Playwright against release server
PASS browser: terminal production first-load budget
Baseline findings from the unchanged UI at 1830177ac53bb17160b8b038a6016eacd76d40d2: the desktop screenshot shows a centered modal with a uniform dark scrim and no backdrop blur; the header still exposes “Edit sidebar”; the current account identity, server version and sign-out are three separate footer rows. The existing font treatment renders the sidebar group labels and primary headings heavier than surrounding text. Captured owned pages at 1440×900 and 390×844 in light/dark, plus open inbox and an in-progress sidebar drag, under /mnt/hdd/infraternal/artifacts/ui-redesign/before. Baseline first-load JavaScript: 73,410 bytes gzip of 122,880 bytes. Baseline gate output: ```text PASS browser: Playwright against release server PASS browser: terminal production first-load budget ```
Author
Owner

Resuming UI redesign on branch ui-redesign at 3df38e1; fetched origin/dev at 1830177, which is already an ancestor of this branch. I’m reviewing the unfinished WIP against the UI contract and will report fixes, screenshots and gate output here.

Resuming UI redesign on branch `ui-redesign` at `3df38e1`; fetched `origin/dev` at `1830177`, which is already an ancestor of this branch. I’m reviewing the unfinished WIP against the UI contract and will report fixes, screenshots and gate output here.
Author
Owner

The inherited browser check still targeted the removed “Edit sidebar” controls, so it could not verify the new always-editable navigation. Review also found that keyboard reparenting can remove the focused handle when an item moves between keyed sections; the desktop sidebar and mobile drawer also render duplicate group IDs, making global ID-based focus restoration target the inert copy. I’m updating the gate and scoping/fixing those focus paths before the screenshot runs.

The inherited browser check still targeted the removed “Edit sidebar” controls, so it could not verify the new always-editable navigation. Review also found that keyboard reparenting can remove the focused handle when an item moves between keyed sections; the desktop sidebar and mobile drawer also render duplicate group IDs, making global ID-based focus restoration target the inert copy. I’m updating the gate and scoping/fixing those focus paths before the screenshot runs.
Author
Owner

The production-browser overflow guard isolated the 1024px container-filter overflow to the shared shell: the viewport and app shell were 1024px wide, the collapsed sidebar was 68px, but .app-body ended at x=757 (689px wide). The Inbox status paragraph carried sr-only, but that utility only existed in Sidebar-scoped CSS, so it rendered as a normal flex item in AppShell and reserved the remaining 267px. I added the shared visually-hidden utility to the global UI tokens and removed the duplicate scoped rule; this restores the shell width without touching the container page.

The production-browser overflow guard isolated the 1024px container-filter overflow to the shared shell: the viewport and app shell were 1024px wide, the collapsed sidebar was 68px, but `.app-body` ended at x=757 (689px wide). The Inbox status paragraph carried `sr-only`, but that utility only existed in Sidebar-scoped CSS, so it rendered as a normal flex item in AppShell and reserved the remaining 267px. I added the shared visually-hidden utility to the global UI tokens and removed the duplicate scoped rule; this restores the shell width without touching the container page.
Author
Owner

CI=1 INFRATERAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/ui-redesign/after scripts/verify browser stopped in the parallel-owned terminal fixture before the web browser check. The Playwright traces show xterm: waits for the exact terminal font before measuring differed by 12 px, xterm: mounts with the CSS fallback when the terminal font fails to load measured a 0 px cell, and the clipboard test read an empty string; the producer-bound test also timed out under concurrent release compilation. No terminal-owned files were changed. I restored the shared regular and medium weight tokens to 500 and 560, which match the reference’s weight range, and will rerun the required gate after the parallel build finishes.

`CI=1 INFRATERAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/ui-redesign/after scripts/verify browser` stopped in the parallel-owned terminal fixture before the web browser check. The Playwright traces show `xterm: waits for the exact terminal font before measuring` differed by 12 px, `xterm: mounts with the CSS fallback when the terminal font fails to load` measured a 0 px cell, and the clipboard test read an empty string; the producer-bound test also timed out under concurrent release compilation. No terminal-owned files were changed. I restored the shared regular and medium weight tokens to 500 and 560, which match the reference’s weight range, and will rerun the required gate after the parallel build finishes.
Author
Owner

Independent review found that the terminal reads --text-md with Number.parseFloat in packages/terminal/src/theme.ts:25-28; keeping the shared type-size scale in px preserves its 14 px terminal font without changing parallel-owned code. Keyboard and pointer drops into a collapsed navigation group now expand it so the moved handle remains present and focused. The browser check now tests collapsed-group focus, touch input, pointer drag start/drop/order, sticky Hosts header blur, and cold Dashboard JS after disabling the browser cache for that navigation.

Independent review found that the terminal reads `--text-md` with `Number.parseFloat` in `packages/terminal/src/theme.ts:25-28`; keeping the shared type-size scale in px preserves its 14 px terminal font without changing parallel-owned code. Keyboard and pointer drops into a collapsed navigation group now expand it so the moved handle remains present and focused. The browser check now tests collapsed-group focus, touch input, pointer drag start/drop/order, sticky Hosts header blur, and cold Dashboard JS after disabling the browser cache for that navigation.
Author
Owner

Starting ui-redesign4 continuation on branch ui-redesign.

Base: current dev at 2c69013777a95218d17e36cfb6a0408341b0c5f0, fetched and merged into the worktree. Starting head: 1a5730c84bf753561de4fcee8f06ec93227f38af.

I’m reviewing the inherited WIP against the step 12d brief, then will implement the remaining UI changes, commit in small steps, and run the requested fast and browser gates with screenshots.

Starting ui-redesign4 continuation on branch `ui-redesign`. Base: current `dev` at `2c69013777a95218d17e36cfb6a0408341b0c5f0`, fetched and merged into the worktree. Starting head: `1a5730c84bf753561de4fcee8f06ec93227f38af`. I’m reviewing the inherited WIP against the step 12d brief, then will implement the remaining UI changes, commit in small steps, and run the requested fast and browser gates with screenshots.
Author
Owner

Baseline browser finding: scripts/verify browser measured METRIC initial route JS gzip: 77462 bytes, within the 120 KB budget, then failed during the setup/sign-in flow before the owned-page screenshot loop.

Relevant output:

FAIL browser: Playwright against release server
METRIC initial route JS gzip: 77462 bytes
TimeoutError: waitFor: Timeout 30000ms exceeded.
  - waiting for getByRole('heading', { name: 'Dashboard', level: 1 }) to be visible

I’m tracing the auth/browser fixture so the final browser gate can complete and generate the requested before/after captures.

Baseline browser finding: `scripts/verify browser` measured `METRIC initial route JS gzip: 77462 bytes`, within the 120 KB budget, then failed during the setup/sign-in flow before the owned-page screenshot loop. Relevant output: ``` FAIL browser: Playwright against release server METRIC initial route JS gzip: 77462 bytes TimeoutError: waitFor: Timeout 30000ms exceeded. - waiting for getByRole('heading', { name: 'Dashboard', level: 1 }) to be visible ``` I’m tracing the auth/browser fixture so the final browser gate can complete and generate the requested before/after captures.
Author
Owner

Finding: the baseline shell sets --weight-regular: 500, so body copy inherits the same medium weight used by controls and labels. The 1440×900 Dashboard capture also shows every sidebar drag grip at full contrast. Reworked the scale around Inter Variable at 400/500/560/600/650/680, use Spline Sans Mono from calternal for identifiers, and keep drag grips low contrast until hover/focus (visible on touch). The selected mono package resolved to 5.3.0; the reference source is /mnt/hdd/infraternal/artifacts/reference/calternal.js at 604105b1e490e9e91b0a62a6bdc59ff6596bc7ae.

Finding: the baseline shell sets `--weight-regular: 500`, so body copy inherits the same medium weight used by controls and labels. The 1440×900 Dashboard capture also shows every sidebar drag grip at full contrast. Reworked the scale around Inter Variable at 400/500/560/600/650/680, use Spline Sans Mono from calternal for identifiers, and keep drag grips low contrast until hover/focus (visible on touch). The selected mono package resolved to 5.3.0; the reference source is `/mnt/hdd/infraternal/artifacts/reference/calternal.js` at `604105b1e490e9e91b0a62a6bdc59ff6596bc7ae`.
Author
Owner

Browser finding: replacing the shared --font-mono face with Spline Sans Mono made the terminal fixture's xterm and Ghostty font-measurement checks fail by 5 px (expected ≤1.01 px). The terminal package owns that token as its measured cell face. I restored JetBrains Mono on the stable --font-mono API, added --font-data for Spline Sans Mono identifiers, and will rerun scripts/verify browser before recording the final result.

Browser finding: replacing the shared `--font-mono` face with Spline Sans Mono made the terminal fixture's xterm and Ghostty font-measurement checks fail by 5 px (expected ≤1.01 px). The terminal package owns that token as its measured cell face. I restored JetBrains Mono on the stable `--font-mono` API, added `--font-data` for Spline Sans Mono identifiers, and will rerun `scripts/verify browser` before recording the final result.
Author
Owner

Browser capture finding: the inbox locator timed out after its dialog was visible because captureInboxOpen searched for .ui-floating-surface beneath the dialog, while that class is on the dialog element itself. The Playwright run had already measured first-load JS at 77,495 bytes gzip (baseline browser run: 77,462 bytes). I am correcting the capture to inspect the dialog node directly and rerunning the full browser gate.

Browser capture finding: the inbox locator timed out after its dialog was visible because `captureInboxOpen` searched for `.ui-floating-surface` beneath the dialog, while that class is on the dialog element itself. The Playwright run had already measured first-load JS at 77,495 bytes gzip (baseline browser run: 77,462 bytes). I am correcting the capture to inspect the dialog node directly and rerunning the full browser gate.
Author
Owner

Browser capture finding: the data-face assertion also ran on unrelated routes. It failed on the container table, which retains JetBrains Mono through the stable --font-mono token owned by the parallel container/terminal work. I narrowed the Spline Sans Mono assertion to the Dashboard, Hosts, Account and host-detail screenshots owned by this job; the first-load measurement was 77,503 bytes gzip, within the 120 KB budget.

Browser capture finding: the data-face assertion also ran on unrelated routes. It failed on the container table, which retains JetBrains Mono through the stable `--font-mono` token owned by the parallel container/terminal work. I narrowed the Spline Sans Mono assertion to the Dashboard, Hosts, Account and host-detail screenshots owned by this job; the first-load measurement was 77,503 bytes gzip, within the 120 KB budget.
Author
Owner

Browser finding on 71ba255: the mobile touch-drag guard reached the drop check but the Hosts item stayed before Containers (["hosts", "containers", "stacks", "images", "volumes"] instead of ["containers", "hosts", ...]). The same run passed both font assertions and measured 77,503 bytes gzip. I am tracing pointer target detection and drop-index handling before the final browser rerun.

Browser finding on `71ba255`: the mobile touch-drag guard reached the drop check but the Hosts item stayed before Containers (`["hosts", "containers", "stacks", "images", "volumes"]` instead of `["containers", "hosts", ...]`). The same run passed both font assertions and measured 77,503 bytes gzip. I am tracing pointer target detection and drop-index handling before the final browser rerun.
Author
Owner

Browser gate finding: touch pointer movement reached the intended sidebar row and applied its drop-target styling, but the item order remained unchanged after touch release. I added event tracing for pointerdown/move/up/cancel to identify whether the release event reaches the captured drag handle. The required touch reorder behavior remains under test.

Browser gate finding: touch pointer movement reached the intended sidebar row and applied its drop-target styling, but the item order remained unchanged after touch release. I added event tracing for pointerdown/move/up/cancel to identify whether the release event reaches the captured drag handle. The required touch reorder behavior remains under test.
Author
Owner

Touch trace identified the test failure: the helper measured the Containers row at y=217..257, then the live row shifted to y=233..277 during the touch stream. Its y=247 endpoint was above the live midpoint (255), so the app correctly resolved a before-target insertion and left Hosts in place. Updated the browser check to aim near the target row's lower edge, assert that the intended row is highlighted alone, and then verify the committed order. No production drag behavior change was needed.

Touch trace identified the test failure: the helper measured the Containers row at y=217..257, then the live row shifted to y=233..277 during the touch stream. Its y=247 endpoint was above the live midpoint (255), so the app correctly resolved a before-target insertion and left Hosts in place. Updated the browser check to aim near the target row's lower edge, assert that the intended row is highlighted alone, and then verify the committed order. No production drag behavior change was needed.
Author
Owner

Finished ui-redesign4 continuation on branch ui-redesign.

Head: 0315d7e7d4587a76bc22fa2e5f6bd1a972a74826

Gate output (verbatim):

PASS fast: migrations are append-only
PASS fast: JavaScript dependencies
PASS fast: build web app
PASS fast: cargo fmt --check
PASS fast: cargo clippy
PASS fast: cargo test
PASS fast: svelte-check
PASS fast: UI package svelte-check
PASS fast: stream package typecheck
PASS fast: Vitest
PASS fast: UI package Vitest
PASS fast: stream package Vitest
PASS fast: OpenAPI and TypeScript client drift
PASS fast: terminal TypeScript
PASS fast: terminal Vitest
PASS browser: JavaScript dependencies
PASS browser: install Chromium and system dependencies
PASS browser: terminal fixture Playwright
PASS browser: build web app
PASS browser: build release binary
PASS browser: Playwright against release server
PASS browser: terminal production first-load budget

The Playwright gate also passed its existing viewport overflow guard, inbox focus checks, reduced-transparency fallback, account-row fit checks, and pointer/touch/keyboard sidebar reorder checks.

Initial route JS gzip was 76,619 bytes in artifacts/ui-redesign/before/production-first-load.json and 76,787 bytes in artifacts/ui-redesign/after/production-first-load.json (+168 bytes). The budget is 122,880 bytes (120 KiB); both are within budget.

Screenshots:

  • Route captures (light/dark, 1440×900 and 390×844) are under /mnt/hdd/infraternal/artifacts/ui-redesign/before and /mnt/hdd/infraternal/artifacts/ui-redesign/after; examples include light-1440x900-dashboard.png, dark-390x844-dashboard.png, light-1440x900-hosts.png, dark-390x844-account.png, light-390x844-sign-in.png, and dark-1440x900-setup.png.
  • Inbox open, desktop and phone, both themes: before/light-1440x900-inbox-open.png, before/dark-390x844-inbox-open.png; after: after/inbox-open-light-1440x900.png, after/inbox-open-dark-390x844.png (same pattern for the other two sizes/themes).
  • Sidebar drag in progress: before/sidebar-drag-light-1440x900.png, before/sidebar-drag-dark-1440x900.png, and the matching files under after.
  • After also captures host detail in both themes at both sizes. The supplied before set has desktop host-detail screenshots but no 390×844 host-detail pair; I left that baseline gap explicit rather than synthesizing an image.

Rules applied: emil-design-eng and better-typography for variable type roles, tuned weight tokens, optical sizing and unitless leading; better-colors, better-ui and better-layout for shared semantic tokens, elevation, spacing and aligned surfaces; apple-design for restrained depth, masked blur and safe-area-aware sheet behavior; better-accessibility and mobile-native for named controls, touch hit areas, keyboard DnD, live announcements, managed focus, and mobile viewport behavior; better-writing for concise sentence-case labels; review-animations for transform/opacity-only motion, reduced-motion handling and no keyboard-triggered motion.

Ported/adapted from calternal.js commit 604105b1e490e9e91b0a62a6bdc59ff6596bc7ae: type and font-source choices from /mnt/hdd/infraternal/artifacts/reference/calternal.js/packages/web/src/app.css, packages/web/src/lib/fonts.ts, and packages/web/src/lib/fontSources/local.ts; elevation values from packages/web/src/lib/styles/blockLift.css; progressive scrim behavior and floating-card handling from packages/web/src/lib/styles/scrim.css and packages/web/src/lib/components/menu/FloatingSurface.svelte; sidebar hierarchy from packages/web/src/lib/components/Sidebar.svelte. Each adapted source file records its reference path and commit.

Safari/iOS owner checklist:

  1. On iPhone Safari in light and dark appearance, open the navigation drawer and inbox sheet; check the safe areas, scroll lock, and sheet placement around the home indicator.
  2. Drag a sidebar item within and between groups with touch, reload to confirm persistence, then repeat with VoiceOver and an external keyboard to verify announcements and focus.
  3. Open and close the inbox with VoiceOver and keyboard; confirm focus enters and returns to its trigger. Repeat with Reduce Motion and Reduce Transparency enabled and inspect the solid fallback.
Finished ui-redesign4 continuation on branch `ui-redesign`. Head: `0315d7e7d4587a76bc22fa2e5f6bd1a972a74826` Gate output (verbatim): ``` PASS fast: migrations are append-only PASS fast: JavaScript dependencies PASS fast: build web app PASS fast: cargo fmt --check PASS fast: cargo clippy PASS fast: cargo test PASS fast: svelte-check PASS fast: UI package svelte-check PASS fast: stream package typecheck PASS fast: Vitest PASS fast: UI package Vitest PASS fast: stream package Vitest PASS fast: OpenAPI and TypeScript client drift PASS fast: terminal TypeScript PASS fast: terminal Vitest ``` ``` PASS browser: JavaScript dependencies PASS browser: install Chromium and system dependencies PASS browser: terminal fixture Playwright PASS browser: build web app PASS browser: build release binary PASS browser: Playwright against release server PASS browser: terminal production first-load budget ``` The Playwright gate also passed its existing viewport overflow guard, inbox focus checks, reduced-transparency fallback, account-row fit checks, and pointer/touch/keyboard sidebar reorder checks. Initial route JS gzip was 76,619 bytes in `artifacts/ui-redesign/before/production-first-load.json` and 76,787 bytes in `artifacts/ui-redesign/after/production-first-load.json` (+168 bytes). The budget is 122,880 bytes (120 KiB); both are within budget. Screenshots: - Route captures (light/dark, 1440×900 and 390×844) are under `/mnt/hdd/infraternal/artifacts/ui-redesign/before` and `/mnt/hdd/infraternal/artifacts/ui-redesign/after`; examples include `light-1440x900-dashboard.png`, `dark-390x844-dashboard.png`, `light-1440x900-hosts.png`, `dark-390x844-account.png`, `light-390x844-sign-in.png`, and `dark-1440x900-setup.png`. - Inbox open, desktop and phone, both themes: `before/light-1440x900-inbox-open.png`, `before/dark-390x844-inbox-open.png`; after: `after/inbox-open-light-1440x900.png`, `after/inbox-open-dark-390x844.png` (same pattern for the other two sizes/themes). - Sidebar drag in progress: `before/sidebar-drag-light-1440x900.png`, `before/sidebar-drag-dark-1440x900.png`, and the matching files under `after`. - After also captures host detail in both themes at both sizes. The supplied `before` set has desktop host-detail screenshots but no 390×844 host-detail pair; I left that baseline gap explicit rather than synthesizing an image. Rules applied: `emil-design-eng` and `better-typography` for variable type roles, tuned weight tokens, optical sizing and unitless leading; `better-colors`, `better-ui` and `better-layout` for shared semantic tokens, elevation, spacing and aligned surfaces; `apple-design` for restrained depth, masked blur and safe-area-aware sheet behavior; `better-accessibility` and `mobile-native` for named controls, touch hit areas, keyboard DnD, live announcements, managed focus, and mobile viewport behavior; `better-writing` for concise sentence-case labels; `review-animations` for transform/opacity-only motion, reduced-motion handling and no keyboard-triggered motion. Ported/adapted from calternal.js commit `604105b1e490e9e91b0a62a6bdc59ff6596bc7ae`: type and font-source choices from `/mnt/hdd/infraternal/artifacts/reference/calternal.js/packages/web/src/app.css`, `packages/web/src/lib/fonts.ts`, and `packages/web/src/lib/fontSources/local.ts`; elevation values from `packages/web/src/lib/styles/blockLift.css`; progressive scrim behavior and floating-card handling from `packages/web/src/lib/styles/scrim.css` and `packages/web/src/lib/components/menu/FloatingSurface.svelte`; sidebar hierarchy from `packages/web/src/lib/components/Sidebar.svelte`. Each adapted source file records its reference path and commit. Safari/iOS owner checklist: 1. On iPhone Safari in light and dark appearance, open the navigation drawer and inbox sheet; check the safe areas, scroll lock, and sheet placement around the home indicator. 2. Drag a sidebar item within and between groups with touch, reload to confirm persistence, then repeat with VoiceOver and an external keyboard to verify announcements and focus. 3. Open and close the inbox with VoiceOver and keyboard; confirm focus enters and returns to its trigger. Repeat with Reduce Motion and Reduce Transparency enabled and inspect the solid fallback.
Author
Owner

Review started for step 12d. Branch: ui-redesign. Base: dev at 2c69013. Review head: 0315d7e7d4. Scope is read-only review of the requested UI redesign diff, reference styling, screenshots, behavior, and bundle evidence.

Review started for step 12d. Branch: ui-redesign. Base: dev at 2c69013. Review head: 0315d7e7d4587a76bc22fa2e5f6bd1a972a74826. Scope is read-only review of the requested UI redesign diff, reference styling, screenshots, behavior, and bundle evidence.
Author
Owner

Independent review of step 12d at 0315d7e7d4587a76bc22fa2e5f6bd1a972a74826 (base 2c69013). Review-only; no source edits or commits.

Findings

  1. HIGH · blocks-merge · Account row requirement is not met. Before: profile, server version, and sign-out share one line. After: the 1440 screenshot shows the version below the profile name; Sidebar.svelte:436-443,500-502 uses a grid for the copy. Evidence: /mnt/hdd/infraternal/artifacts/ui-redesign/after/dark-1440x900-account.png. The account-row browser assertion checks visibility/height/side-by-side controls, not whether the version shares the name's row. Fix: use display:flex; align-items:baseline; gap:var(--space-2) (8px) for .account-copy; keep .account-name at min-inline-size:0 with ellipsis, and .account-version white-space:nowrap; flex:0 0 auto; retain a 40px sign-out control. Check the 272px drawer at 320px and the 300px drawer at 390px. Port the flexible, truncating account segment pattern from calternal.js packages/web/src/lib/components/Sidebar.svelte (.foot-acct). Rule: better-layout's single-row grouping and deliberate truncation; preserve the better-accessibility target size.

  2. MEDIUM · blocks-merge · The main dashboard still reads almost like the before version. The 1440 before/after pair retains the same bordered-card grid; the new shadow is visible but subtle, so the requested calternal depth/material treatment does not read clearly on the primary page. Evidence: /mnt/hdd/infraternal/artifacts/ui-redesign/before/dark-1440x900-dashboard.png and /mnt/hdd/infraternal/artifacts/ui-redesign/after/dark-1440x900-dashboard.png; Surface.svelte now applies --shadow-card to every default surface. Fix: use explicit elevation tiers: keep secondary surfaces on --shadow-card, and use the existing Surface raised tone / --shadow-panel for primary dashboard status surfaces (light: 0 1px 1px rgb(0 0 0 / 8%), 0 8px 18px -4px rgb(0 0 0 / 22%), 0 24px 44px -12px rgb(0 0 0 / 30%); dark: 0 1px 1px rgb(0 0 0 / 34%), 0 10px 22px -4px rgb(0 0 0 / 56%), 0 28px 50px -12px rgb(0 0 0 / 66%)). Use calternal.js lib/styles/blockLift.css for the contact/mid/ambient shadow recipe and lib/components/menu/FloatingSurface.svelte for the floating material recipe, rather than treating all cards alike. Rules: emil-design-eng and better-ui, visible material/elevation hierarchy.

  3. MEDIUM · later · The inbox scrim's ramp is too subtle to read as progressive. The implementation does have a mask: FloatingSurface.svelte:174-177 keeps full blur through 76% of the viewport and fades only over the final 24%; the 1440 screenshot consequently reads as a broad full-page blur, including the sidebar. Evidence: /mnt/hdd/infraternal/artifacts/ui-redesign/after/inbox-open-dark-1440x900.png and /mnt/hdd/infraternal/artifacts/ui-redesign/after/inbox-open-dark-390x844.png. The top bar also has its own masked 8px blur (AppShell.svelte:284), disabled while inbox is open to keep one live blur (:322-325). Correction to the claim: calternal.js lib/styles/scrim.css itself has no gradient mask; it defines one live full-screen blur and disables other backdrop filters. Fix: keep that one-live-filter rule, --scrim-blur:8px, and the existing 18% tint; change the mask to linear-gradient(to bottom,#000 0%,#000 58%,transparent 100%), matching the current top-bar fade, so the fade spans 42% instead of 24%. Keep the solid fallback and reduced-transparency behavior. Use calternal.js lib/styles/scrim.css for single-live-filter behavior and lib/components/menu/FloatingSurface.svelte for the floating material. Rules: apple-design's single live material layer and emil-design-eng's intentional depth.

  4. MEDIUM · later · Sidebar controls add persistent visual noise. Desktop drag handles have default opacity:0.12 and every group has a visible 32px menu/gear (Sidebar.svelte:480,483-486); the screenshot shows both. The “group headers have no hierarchy” claim is refuted: headers are 32px/13px versus 40px/14px items, with separate spacing (:475-477). Fix: make desktop handles and group menus hidden at rest, reveal handles at .65 on hover and 1 on keyboard focus/drag, and reveal the menu on hover/focus/open. Keep coarse-pointer affordances visible at the existing .75 opacity and 44px target. Align the group title with item labels when its handle is hidden. Use calternal.js packages/web/src/lib/components/Sidebar.svelte and lib/components/modeIsland.css for contextual sidebar feedback. Rules: better-ui contextual controls, better-layout hierarchy, and better-accessibility keyboard/touch access.

  5. LOW · later · Inbox close target is 32×32px. FloatingSurface.svelte:147-149 requests IconButton size="sm"; IconButton.svelte:53 sets 32px. The accessible name and focus path work, but the × is a small pointer target. Fix: use size="lg" (44×44px, already supported) in the floating header. Rule: better-accessibility's comfortable touch target; use calternal.js lib/components/menu/FloatingSurface.svelte for the header/material context.

Checked with no finding

  • Sidebar has no edit mode. Production browser checks passed pointer drag, touch drag, keyboard reorder/cross-group moves, live announcements, and focus retention. Reorder state is intentionally in-memory until the API exists, as docs/UI.md:91-92 specifies; a full reload resets it.
  • Inbox is a separate dialog/sheet; focus enters, Escape closes and restores the trigger. Reduced motion, reduced transparency, and no-backdrop-filter fallbacks are present. Top-bar progressive blur exists; at the initial scroll position there is little content beneath it to make the blur visible.
  • Typography claim refuted: production browser checks passed body 400, page heading 600, dashboard count 560, Inter Variable, and Spline Sans Mono data face. The CSS uses font-weight for the variable weight axis and font-optical-sizing:auto; there is no authored font-variation-settings override (computed normal is expected). Calternal's body/title values are 400/600. The browser harness checks weights, not that property directly.
  • No overflow or visible regressions were found in the checked Containers, Settings, account, and route snapshots. The 320px route snapshot is clean; the mobile account drawer assertion runs at 390px, not 320px.
  • First-load JS gzip: 76,787 bytes after vs 76,619 before (+168), below the 122,880-byte budget.
  • Tried calternal.js with VITE_ENABLE_DEV_ROUTES=1; /dev/overlay still redirected to /login without its authenticated backend/session, so visual comparison used the checked-in CSS. The reference app did load the login screen without page errors.

Browser gate output

PASS browser: JavaScript dependencies
PASS browser: install Chromium and system dependencies
PASS browser: terminal fixture Playwright
PASS browser: build web app
PASS browser: build release binary
PASS browser: Playwright against release server
PASS browser: terminal production first-load budget

Verdict: Block on the account-row requirement and the insufficiently visible dashboard treatment. Findings use emil-design-eng, better-interface, better-ui, better-layout, better-typography, better-colors, better-accessibility, better-writing, apple-design, and review-animations rules; the focus here is on layout, hierarchy, material, target size, and reduced-motion/transparency behavior.

Independent review of step 12d at `0315d7e7d4587a76bc22fa2e5f6bd1a972a74826` (base `2c69013`). Review-only; no source edits or commits. ## Findings 1. **HIGH · blocks-merge · Account row requirement is not met.** Before: profile, server version, and sign-out share one line. After: the 1440 screenshot shows the version below the profile name; `Sidebar.svelte:436-443,500-502` uses a grid for the copy. Evidence: `/mnt/hdd/infraternal/artifacts/ui-redesign/after/dark-1440x900-account.png`. The account-row browser assertion checks visibility/height/side-by-side controls, not whether the version shares the name's row. **Fix:** use `display:flex; align-items:baseline; gap:var(--space-2)` (8px) for `.account-copy`; keep `.account-name` at `min-inline-size:0` with ellipsis, and `.account-version` `white-space:nowrap; flex:0 0 auto`; retain a 40px sign-out control. Check the 272px drawer at 320px and the 300px drawer at 390px. Port the flexible, truncating account segment pattern from calternal.js `packages/web/src/lib/components/Sidebar.svelte` (`.foot-acct`). Rule: better-layout's single-row grouping and deliberate truncation; preserve the better-accessibility target size. 2. **MEDIUM · blocks-merge · The main dashboard still reads almost like the before version.** The 1440 before/after pair retains the same bordered-card grid; the new shadow is visible but subtle, so the requested calternal depth/material treatment does not read clearly on the primary page. Evidence: `/mnt/hdd/infraternal/artifacts/ui-redesign/before/dark-1440x900-dashboard.png` and `/mnt/hdd/infraternal/artifacts/ui-redesign/after/dark-1440x900-dashboard.png`; `Surface.svelte` now applies `--shadow-card` to every default surface. **Fix:** use explicit elevation tiers: keep secondary surfaces on `--shadow-card`, and use the existing `Surface` raised tone / `--shadow-panel` for primary dashboard status surfaces (light: `0 1px 1px rgb(0 0 0 / 8%), 0 8px 18px -4px rgb(0 0 0 / 22%), 0 24px 44px -12px rgb(0 0 0 / 30%)`; dark: `0 1px 1px rgb(0 0 0 / 34%), 0 10px 22px -4px rgb(0 0 0 / 56%), 0 28px 50px -12px rgb(0 0 0 / 66%)`). Use calternal.js `lib/styles/blockLift.css` for the contact/mid/ambient shadow recipe and `lib/components/menu/FloatingSurface.svelte` for the floating material recipe, rather than treating all cards alike. Rules: emil-design-eng and better-ui, visible material/elevation hierarchy. 3. **MEDIUM · later · The inbox scrim's ramp is too subtle to read as progressive.** The implementation does have a mask: `FloatingSurface.svelte:174-177` keeps full blur through 76% of the viewport and fades only over the final 24%; the 1440 screenshot consequently reads as a broad full-page blur, including the sidebar. Evidence: `/mnt/hdd/infraternal/artifacts/ui-redesign/after/inbox-open-dark-1440x900.png` and `/mnt/hdd/infraternal/artifacts/ui-redesign/after/inbox-open-dark-390x844.png`. The top bar also has its own masked 8px blur (`AppShell.svelte:284`), disabled while inbox is open to keep one live blur (`:322-325`). Correction to the claim: calternal.js `lib/styles/scrim.css` itself has no gradient mask; it defines one live full-screen blur and disables other backdrop filters. **Fix:** keep that one-live-filter rule, `--scrim-blur:8px`, and the existing 18% tint; change the mask to `linear-gradient(to bottom,#000 0%,#000 58%,transparent 100%)`, matching the current top-bar fade, so the fade spans 42% instead of 24%. Keep the solid fallback and reduced-transparency behavior. Use calternal.js `lib/styles/scrim.css` for single-live-filter behavior and `lib/components/menu/FloatingSurface.svelte` for the floating material. Rules: apple-design's single live material layer and emil-design-eng's intentional depth. 4. **MEDIUM · later · Sidebar controls add persistent visual noise.** Desktop drag handles have default `opacity:0.12` and every group has a visible 32px menu/gear (`Sidebar.svelte:480,483-486`); the screenshot shows both. The “group headers have no hierarchy” claim is refuted: headers are 32px/13px versus 40px/14px items, with separate spacing (`:475-477`). **Fix:** make desktop handles and group menus hidden at rest, reveal handles at `.65` on hover and `1` on keyboard focus/drag, and reveal the menu on hover/focus/open. Keep coarse-pointer affordances visible at the existing `.75` opacity and 44px target. Align the group title with item labels when its handle is hidden. Use calternal.js `packages/web/src/lib/components/Sidebar.svelte` and `lib/components/modeIsland.css` for contextual sidebar feedback. Rules: better-ui contextual controls, better-layout hierarchy, and better-accessibility keyboard/touch access. 5. **LOW · later · Inbox close target is 32×32px.** `FloatingSurface.svelte:147-149` requests `IconButton size="sm"`; `IconButton.svelte:53` sets 32px. The accessible name and focus path work, but the × is a small pointer target. **Fix:** use `size="lg"` (44×44px, already supported) in the floating header. Rule: better-accessibility's comfortable touch target; use calternal.js `lib/components/menu/FloatingSurface.svelte` for the header/material context. ## Checked with no finding - Sidebar has no edit mode. Production browser checks passed pointer drag, touch drag, keyboard reorder/cross-group moves, live announcements, and focus retention. Reorder state is intentionally in-memory until the API exists, as `docs/UI.md:91-92` specifies; a full reload resets it. - Inbox is a separate dialog/sheet; focus enters, Escape closes and restores the trigger. Reduced motion, reduced transparency, and no-`backdrop-filter` fallbacks are present. Top-bar progressive blur exists; at the initial scroll position there is little content beneath it to make the blur visible. - Typography claim refuted: production browser checks passed body 400, page heading 600, dashboard count 560, Inter Variable, and Spline Sans Mono data face. The CSS uses `font-weight` for the variable weight axis and `font-optical-sizing:auto`; there is no authored `font-variation-settings` override (computed `normal` is expected). Calternal's body/title values are 400/600. The browser harness checks weights, not that property directly. - No overflow or visible regressions were found in the checked Containers, Settings, account, and route snapshots. The 320px route snapshot is clean; the mobile account drawer assertion runs at 390px, not 320px. - First-load JS gzip: 76,787 bytes after vs 76,619 before (+168), below the 122,880-byte budget. - Tried calternal.js with `VITE_ENABLE_DEV_ROUTES=1`; `/dev/overlay` still redirected to `/login` without its authenticated backend/session, so visual comparison used the checked-in CSS. The reference app did load the login screen without page errors. ## Browser gate output ```text PASS browser: JavaScript dependencies PASS browser: install Chromium and system dependencies PASS browser: terminal fixture Playwright PASS browser: build web app PASS browser: build release binary PASS browser: Playwright against release server PASS browser: terminal production first-load budget ``` Verdict: **Block** on the account-row requirement and the insufficiently visible dashboard treatment. Findings use emil-design-eng, better-interface, better-ui, better-layout, better-typography, better-colors, better-accessibility, better-writing, apple-design, and review-animations rules; the focus here is on layout, hierarchy, material, target size, and reduced-motion/transparency behavior.
Author
Owner

Starting the one fix round for step 12d.

  • Branch: ui-redesign
  • Base head: 0315d7e7d4587a76bc22fa2e5f6bd1a972a74826
  • Scope: owned UI, UI spec, and browser check files from the fix job contract.
  • I am addressing the five blocks-merge review findings and will run scripts/verify fast and scripts/verify browser with the requested screenshot and blur-cost evidence.
Starting the one fix round for step 12d. - Branch: `ui-redesign` - Base head: `0315d7e7d4587a76bc22fa2e5f6bd1a972a74826` - Scope: owned UI, UI spec, and browser check files from the fix job contract. - I am addressing the five blocks-merge review findings and will run `scripts/verify fast` and `scripts/verify browser` with the requested screenshot and blur-cost evidence.
Author
Owner

First scripts/verify fast result on the fix-round diff: the migration, dependency, web build, formatting, clippy, Rust tests, Svelte checks, stream typecheck, and first Vitest steps passed. It then exited 1 at fast: UI package Vitest before running tests: src/primitives.test.ts and src/timestamp.test.ts each had a worker fork startup timeout after 60.07s (Timeout waiting for worker to respond) during concurrent heavy Rust compilation. I will rerun after the load clears.

First `scripts/verify fast` result on the fix-round diff: the migration, dependency, web build, formatting, clippy, Rust tests, Svelte checks, stream typecheck, and first Vitest steps passed. It then exited 1 at `fast: UI package Vitest` before running tests: `src/primitives.test.ts` and `src/timestamp.test.ts` each had a worker fork startup timeout after 60.07s (`Timeout waiting for worker to respond`) during concurrent heavy Rust compilation. I will rerun after the load clears.
Author
Owner

Browser gate attempt on 2026-09-24 stopped before the owned UI screenshots or assertions. The container lifecycle step waited for the success toast Start infraternal-browser-3294301-1790212863237, but the toast had already changed to Stop infraternal-browser-3294301-1790212863237; the test row reported Exited (137) and Start was disabled. No account, surface, blur, sidebar, or owned-route browser checks ran in this attempt. I am rerunning after the concurrent Cargo build load clears to determine whether this is transient.

Browser gate attempt on 2026-09-24 stopped before the owned UI screenshots or assertions. The container lifecycle step waited for the success toast `Start infraternal-browser-3294301-1790212863237`, but the toast had already changed to `Stop infraternal-browser-3294301-1790212863237`; the test row reported Exited (137) and Start was disabled. No account, surface, blur, sidebar, or owned-route browser checks ran in this attempt. I am rerunning after the concurrent Cargo build load clears to determine whether this is transient.
Author
Owner

Browser rerun evidence: at 1440 the account row was 44 px high, all four controls were contained in its line box, the name/version baseline delta was 0.875 px, and their common vertical band was 15.98 px. The profile and sign-out centers were 3.58 px apart because the row uses baseline alignment. I removed the extra center-equality check and kept the required containment, overlap, common-line-band, and name/version baseline assertions at 320, 390, and 1440. This run stopped before screenshots; the browser gate is running again.

Browser rerun evidence: at 1440 the account row was 44 px high, all four controls were contained in its line box, the name/version baseline delta was 0.875 px, and their common vertical band was 15.98 px. The profile and sign-out centers were 3.58 px apart because the row uses baseline alignment. I removed the extra center-equality check and kept the required containment, overlap, common-line-band, and name/version baseline assertions at 320, 390, and 1440. This run stopped before screenshots; the browser gate is running again.
Author
Owner

Starting continuation on branch ui-redesign at 9f54a04549; the fix round originated from 0315d7e. I am checking the current head against the review and owner brief before making any changes.

Starting continuation on branch ui-redesign at 9f54a045499cbb892854d342178c971c2689fbaa; the fix round originated from 0315d7e. I am checking the current head against the review and owner brief before making any changes.
Author
Owner

Current-head check at 9f54a04: the Dashboard and Hosts comparison captures show visibly deeper shadows; FloatingSurface has three 2/6/12px masked passes and its close control already uses size="lg". The 320px drawer capture also looks like one row. The browser assertion still needs stronger evidence: assertAccountRowFits checks positive overlap for the profile wrapper, version, and sign-out, but does not include the avatar in the common-line calculation or assert the sign-out is exactly 40×40. The existing blur-scroll-smoke.json records mean 120.55ms and p95 144.5ms for 90 moved frames; the fresh browser gate is remeasuring this.

Current-head check at 9f54a04: the Dashboard and Hosts comparison captures show visibly deeper shadows; FloatingSurface has three 2/6/12px masked passes and its close control already uses size="lg". The 320px drawer capture also looks like one row. The browser assertion still needs stronger evidence: assertAccountRowFits checks positive overlap for the profile wrapper, version, and sign-out, but does not include the avatar in the common-line calculation or assert the sign-out is exactly 40×40. The existing blur-scroll-smoke.json records mean 120.55ms and p95 144.5ms for 90 moved frames; the fresh browser gate is remeasuring this.
Author
Owner

Blur smoke evidence: at the time of the 102.25ms mean / 113.10ms p95 run, a second production browser gate was active. The Chromium process used --disable-gpu-compositing and SwiftShader, so this is a contended software-rendered headless smoke, not a GPU performance result. The current gate adds an on/off A/B with the same scroll loop to isolate the filters.

Blur smoke evidence: at the time of the 102.25ms mean / 113.10ms p95 run, a second production browser gate was active. The Chromium process used --disable-gpu-compositing and SwiftShader, so this is a contended software-rendered headless smoke, not a GPU performance result. The current gate adds an on/off A/B with the same scroll loop to isolate the filters.
Author
Owner

Fix round complete on branch ui-redesign, HEAD d694f5ad8cd9e296b6570b7bc6308a02e0f69c79 (ahead 23; not pushed).

Owner requirements

  1. Account row — PASS. Avatar, ellipsized name, nowrap version, and 40×40 sign-out control stay in one baseline-aligned flex row with var(--space-2) gap. Browser assertion checks their shared line at 1440px and in the open 390px and 320px drawers; the 320px drawer is opened in the browser gate.
  2. Raised depth — PASS. Dashboard focal surfaces and the Hosts table use the raised tier and --shadow-panel, with softened borders. Secondary Dashboard cards use --shadow-card. Before/after side-by-side captures show the difference in both themes.
  3. Progressive blur — PASS. Inbox and top bar each use three masked 2/6/12px backdrop-filter passes; stronger inbox regions are bounded to 880×720px and 640×560px on desktop and ramp up toward the card. The stronger phone-sheet passes are limited to the lower 62% and 42%. Inbox layers are mounted only while open. Reduced-transparency and unsupported-backdrop-filter fallbacks remain. The top bar uses the same downward ramp; Hosts’ sticky heading uses a static tint to stay within the three-layer cap.
    • Chromium production-browser smoke: 90/90 scroll frames moved. Blur enabled: 102.27ms mean, 117.20ms p95. Filters disabled: 17.84ms mean, 16.90ms p95. This runner used --disable-gpu-compositing with SwiftShader and had no concurrent browser gate, so these are software-renderer smoke figures, not a GPU performance result. Data: /mnt/hdd/infraternal/artifacts/fix-ui-redesign/after/blur-scroll-smoke.json.
  4. Sidebar — PASS. On fine pointers handles and group menus are hidden at rest, handles use 0.65 opacity on hover and 1 on focus/drag. Coarse pointers use always-visible 0.75 handles with 44px targets. Group headers align with item labels and use quieter, smaller type with spacing above.
  5. Inbox close control — PASS. Close control is size="lg"; browser gate checks at least 44×44px.

Production first-load JavaScript is 76,761 bytes gzip (122,880-byte budget): /mnt/hdd/infraternal/artifacts/fix-ui-redesign/after/production-first-load.json.

Gates

scripts/verify fast:

PASS fast: migrations are append-only
PASS fast: JavaScript dependencies
PASS fast: build web app
PASS fast: cargo fmt --check
PASS fast: cargo clippy
PASS fast: cargo test
PASS fast: svelte-check
PASS fast: UI package svelte-check
PASS fast: stream package typecheck
PASS fast: Vitest
PASS fast: UI package Vitest
PASS fast: stream package Vitest
PASS fast: OpenAPI and TypeScript client drift
PASS fast: terminal TypeScript
PASS fast: terminal Vitest

scripts/verify browser:

PASS browser: JavaScript dependencies
PASS browser: install Chromium and system dependencies
PASS browser: terminal fixture Playwright
PASS browser: build web app
PASS browser: build release binary
PASS browser: Playwright against release server
PASS browser: terminal production first-load budget

Screenshots

Full before and after sets are under /mnt/hdd/infraternal/artifacts/fix-ui-redesign/{before,after}/:

  • Dashboard and Hosts: {light,dark}-{1440x900,390x844}-{dashboard,hosts}.png
  • Inbox open and top bar over scrolled content: inbox-open-{light,dark}-{1440x900,390x844}.png, topbar-scrolled-{light,dark}-{1440x900,390x844}.png
  • Sidebar rest/hover: sidebar-{rest,hovered}-{light,dark}-1440x900.png
  • Account row at 1440, 390 drawer, and 320 drawer: account-row-{light,dark}-{1440x900,390x844-drawer,320x844-drawer}.png
  • Before/after Dashboard and Hosts comparisons: /mnt/hdd/infraternal/artifacts/fix-ui-redesign/comparison-{dashboard,hosts}-{light,dark}-1440x900.png

Design rules applied

Applied emil-design-eng, better-interface, better-ui, better-layout, better-typography, better-colors, better-accessibility, better-writing, apple-design, and review-animations: use shared tokens and primitives, establish clear surface hierarchy, align and truncate deliberately, retain accessible focus and 44px touch targets, preserve reduced-transparency fallbacks, and keep motion to the approved transform/opacity properties with reduced-motion behavior.

Fix round complete on branch `ui-redesign`, HEAD `d694f5ad8cd9e296b6570b7bc6308a02e0f69c79` (ahead 23; not pushed). ## Owner requirements 1. **Account row — PASS.** Avatar, ellipsized name, nowrap version, and 40×40 sign-out control stay in one baseline-aligned flex row with `var(--space-2)` gap. Browser assertion checks their shared line at 1440px and in the open 390px and 320px drawers; the 320px drawer is opened in the browser gate. 2. **Raised depth — PASS.** Dashboard focal surfaces and the Hosts table use the raised tier and `--shadow-panel`, with softened borders. Secondary Dashboard cards use `--shadow-card`. Before/after side-by-side captures show the difference in both themes. 3. **Progressive blur — PASS.** Inbox and top bar each use three masked 2/6/12px backdrop-filter passes; stronger inbox regions are bounded to 880×720px and 640×560px on desktop and ramp up toward the card. The stronger phone-sheet passes are limited to the lower 62% and 42%. Inbox layers are mounted only while open. Reduced-transparency and unsupported-backdrop-filter fallbacks remain. The top bar uses the same downward ramp; Hosts’ sticky heading uses a static tint to stay within the three-layer cap. - Chromium production-browser smoke: 90/90 scroll frames moved. Blur enabled: 102.27ms mean, 117.20ms p95. Filters disabled: 17.84ms mean, 16.90ms p95. This runner used `--disable-gpu-compositing` with SwiftShader and had no concurrent browser gate, so these are software-renderer smoke figures, not a GPU performance result. Data: `/mnt/hdd/infraternal/artifacts/fix-ui-redesign/after/blur-scroll-smoke.json`. 4. **Sidebar — PASS.** On fine pointers handles and group menus are hidden at rest, handles use 0.65 opacity on hover and 1 on focus/drag. Coarse pointers use always-visible 0.75 handles with 44px targets. Group headers align with item labels and use quieter, smaller type with spacing above. 5. **Inbox close control — PASS.** Close control is `size="lg"`; browser gate checks at least 44×44px. Production first-load JavaScript is 76,761 bytes gzip (122,880-byte budget): `/mnt/hdd/infraternal/artifacts/fix-ui-redesign/after/production-first-load.json`. ## Gates `scripts/verify fast`: ```text PASS fast: migrations are append-only PASS fast: JavaScript dependencies PASS fast: build web app PASS fast: cargo fmt --check PASS fast: cargo clippy PASS fast: cargo test PASS fast: svelte-check PASS fast: UI package svelte-check PASS fast: stream package typecheck PASS fast: Vitest PASS fast: UI package Vitest PASS fast: stream package Vitest PASS fast: OpenAPI and TypeScript client drift PASS fast: terminal TypeScript PASS fast: terminal Vitest ``` `scripts/verify browser`: ```text PASS browser: JavaScript dependencies PASS browser: install Chromium and system dependencies PASS browser: terminal fixture Playwright PASS browser: build web app PASS browser: build release binary PASS browser: Playwright against release server PASS browser: terminal production first-load budget ``` ## Screenshots Full before and after sets are under `/mnt/hdd/infraternal/artifacts/fix-ui-redesign/{before,after}/`: - Dashboard and Hosts: `{light,dark}-{1440x900,390x844}-{dashboard,hosts}.png` - Inbox open and top bar over scrolled content: `inbox-open-{light,dark}-{1440x900,390x844}.png`, `topbar-scrolled-{light,dark}-{1440x900,390x844}.png` - Sidebar rest/hover: `sidebar-{rest,hovered}-{light,dark}-1440x900.png` - Account row at 1440, 390 drawer, and 320 drawer: `account-row-{light,dark}-{1440x900,390x844-drawer,320x844-drawer}.png` - Before/after Dashboard and Hosts comparisons: `/mnt/hdd/infraternal/artifacts/fix-ui-redesign/comparison-{dashboard,hosts}-{light,dark}-1440x900.png` ## Design rules applied Applied `emil-design-eng`, `better-interface`, `better-ui`, `better-layout`, `better-typography`, `better-colors`, `better-accessibility`, `better-writing`, `apple-design`, and `review-animations`: use shared tokens and primitives, establish clear surface hierarchy, align and truncate deliberately, retain accessible focus and 44px touch targets, preserve reduced-transparency fallbacks, and keep motion to the approved transform/opacity properties with reduced-motion behavior.
Author
Owner

Starting verify-ui-redesign on branch ui-redesign. Assignment base head: d694f5ad8cd9e296b6570b7bc6308a02e0f69c79.

Fetched dev as 2c69013777a95218d17e36cfb6a0408341b0c5f0; it is already an ancestor of the assignment head. git merge --no-ff --no-edit FETCH_HEAD reports Already up to date. No product files changed yet.

Starting verify-ui-redesign on branch `ui-redesign`. Assignment base head: `d694f5ad8cd9e296b6570b7bc6308a02e0f69c79`. Fetched `dev` as `2c69013777a95218d17e36cfb6a0408341b0c5f0`; it is already an ancestor of the assignment head. `git merge --no-ff --no-edit FETCH_HEAD` reports `Already up to date.` No product files changed yet.
Author
Owner

Verification finished on head d694f5ad8c.

Fetched origin/dev at 2c69013777. It was already an ancestor of the verified head; git merge --no-ff --no-edit FETCH_HEAD reported “Already up to date.”, so no merge commit was needed. No product code changes were required.

Findings:

  1. PASS — Account row: avatar, name, version and sign-out fit one line at 320×844 (drawer open), 390×844 (drawer open) and 1440×900 in light and dark.

  2. PASS — Visible depth: Dashboard and Hosts show a raised focal tier with layered shadows and softened borders. Before/after comparisons in both themes are in /mnt/hdd/infraternal/artifacts/verify-ui-redesign/.

  3. PASS — Progressive blur: Inbox uses three masked levels (2/6/12 px), and the top-bar blur fades over scrolled content. Inbox blur DOM layer and scrim are absent when closed; top-bar blur is suspended while Inbox is open. Reduced Transparency uses a solid scrim; the unsupported-backdrop-filter fallback was checked through its CSS fallback and a Chromium no-filter simulation.

    Software-renderer browser-gate smoke, 90 synthetic scroll frames while Inbox was open: blur on 103.15 ms mean / 114.8 ms p95; filters off 17.65 ms mean / 17.0 ms p95. This synthetic background scrolling is not reachable by the user: at 390×844 the page scrolls with Inbox closed, but the background is inert and does not move under wheel input while Inbox is open, with no background animation. The scroll-related Inbox cost therefore applies to the opening visual change; the surface is removed immediately on close, and keyboard opening does not animate.

    With Inbox closed, desktop top-bar smoke was 16.84 ms mean / 18.6 ms p95 with blur versus 16.63 ms / 18.4 ms without. On a naturally scrollable mobile page p95 was 19.3 ms with blur versus 17.0 ms without; the blur-on mean was 291 ms due to one scheduler outlier. These are software-renderer smoke measurements, not a performance gate. The explicit SwiftShader run showed unstable frame-time outliers.

  4. PASS — Calm sidebar: fine-pointer handles/group menus are hidden at rest and shown on hover/focus; headers are distinct; pointer, touch and keyboard reorder work with live announcements. Coarse-pointer handles and menus are visible with 44×44 px targets. No edit mode control.

  5. PASS — Inbox close: 44×44, keyboard reachable; Escape closes and restores focus.

Also PASS — overflow guard across all routes at 1440×900, 1024×768, 768×1024, 390×844 and 320×640 in light and dark. docs/UI.md and DECISIONS §20 state there is no edit mode. First-load JavaScript: 76,761 bytes gzip / 122,880-byte budget.

Owner Safari/iOS checklist:

  1. On real Mac/iOS hardware in Safari, scroll a long Dashboard or Hosts page with Inbox closed and judge whether the top-bar blur causes a hitch. Then open and close Inbox and judge the progressive blur ramp, transition smoothness and text legibility; repeat with Reduced Transparency enabled. Record device/OS and any hitch in this issue.

Gate output:

scripts/verify fast

PASS fast: migrations are append-only
PASS fast: JavaScript dependencies
PASS fast: build web app
PASS fast: cargo fmt --check
PASS fast: cargo clippy
PASS fast: cargo test
PASS fast: svelte-check
PASS fast: UI package svelte-check
PASS fast: stream package typecheck
PASS fast: Vitest
PASS fast: UI package Vitest
PASS fast: stream package Vitest
PASS fast: OpenAPI and TypeScript client drift
PASS fast: terminal TypeScript
PASS fast: terminal Vitest

INFRATERNAI_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/verify-ui-redesign scripts/verify browser

PASS browser: JavaScript dependencies
PASS browser: install Chromium and system dependencies
PASS browser: terminal fixture Playwright
PASS browser: build web app
PASS browser: build release binary
PASS browser: Playwright against release server
PASS browser: terminal production first-load budget

The complete evidence, screenshots, blur measurements and checklist are in /mnt/hdd/infraternal/artifacts/verify-ui-redesign/verification.md.EOF

Verification finished on head d694f5ad8cd9e296b6570b7bc6308a02e0f69c79. Fetched origin/dev at 2c69013777a95218d17e36cfb6a0408341b0c5f0. It was already an ancestor of the verified head; git merge --no-ff --no-edit FETCH_HEAD reported “Already up to date.”, so no merge commit was needed. No product code changes were required. Findings: 1. PASS — Account row: avatar, name, version and sign-out fit one line at 320×844 (drawer open), 390×844 (drawer open) and 1440×900 in light and dark. 2. PASS — Visible depth: Dashboard and Hosts show a raised focal tier with layered shadows and softened borders. Before/after comparisons in both themes are in /mnt/hdd/infraternal/artifacts/verify-ui-redesign/. 3. PASS — Progressive blur: Inbox uses three masked levels (2/6/12 px), and the top-bar blur fades over scrolled content. Inbox blur DOM layer and scrim are absent when closed; top-bar blur is suspended while Inbox is open. Reduced Transparency uses a solid scrim; the unsupported-backdrop-filter fallback was checked through its CSS fallback and a Chromium no-filter simulation. Software-renderer browser-gate smoke, 90 synthetic scroll frames while Inbox was open: blur on 103.15 ms mean / 114.8 ms p95; filters off 17.65 ms mean / 17.0 ms p95. This synthetic background scrolling is not reachable by the user: at 390×844 the page scrolls with Inbox closed, but the background is inert and does not move under wheel input while Inbox is open, with no background animation. The scroll-related Inbox cost therefore applies to the opening visual change; the surface is removed immediately on close, and keyboard opening does not animate. With Inbox closed, desktop top-bar smoke was 16.84 ms mean / 18.6 ms p95 with blur versus 16.63 ms / 18.4 ms without. On a naturally scrollable mobile page p95 was 19.3 ms with blur versus 17.0 ms without; the blur-on mean was 291 ms due to one scheduler outlier. These are software-renderer smoke measurements, not a performance gate. The explicit SwiftShader run showed unstable frame-time outliers. 4. PASS — Calm sidebar: fine-pointer handles/group menus are hidden at rest and shown on hover/focus; headers are distinct; pointer, touch and keyboard reorder work with live announcements. Coarse-pointer handles and menus are visible with 44×44 px targets. No edit mode control. 5. PASS — Inbox close: 44×44, keyboard reachable; Escape closes and restores focus. Also PASS — overflow guard across all routes at 1440×900, 1024×768, 768×1024, 390×844 and 320×640 in light and dark. docs/UI.md and DECISIONS §20 state there is no edit mode. First-load JavaScript: 76,761 bytes gzip / 122,880-byte budget. Owner Safari/iOS checklist: 1. On real Mac/iOS hardware in Safari, scroll a long Dashboard or Hosts page with Inbox closed and judge whether the top-bar blur causes a hitch. Then open and close Inbox and judge the progressive blur ramp, transition smoothness and text legibility; repeat with Reduced Transparency enabled. Record device/OS and any hitch in this issue. Gate output: scripts/verify fast ~~~text PASS fast: migrations are append-only PASS fast: JavaScript dependencies PASS fast: build web app PASS fast: cargo fmt --check PASS fast: cargo clippy PASS fast: cargo test PASS fast: svelte-check PASS fast: UI package svelte-check PASS fast: stream package typecheck PASS fast: Vitest PASS fast: UI package Vitest PASS fast: stream package Vitest PASS fast: OpenAPI and TypeScript client drift PASS fast: terminal TypeScript PASS fast: terminal Vitest ~~~ INFRATERNAI_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/verify-ui-redesign scripts/verify browser ~~~text PASS browser: JavaScript dependencies PASS browser: install Chromium and system dependencies PASS browser: terminal fixture Playwright PASS browser: build web app PASS browser: build release binary PASS browser: Playwright against release server PASS browser: terminal production first-load budget ~~~ The complete evidence, screenshots, blur measurements and checklist are in /mnt/hdd/infraternal/artifacts/verify-ui-redesign/verification.md.EOF
Author
Owner

Correction to the browser command label in my finish comment: the variable is INFRATERNAL_ARTIFACT_DIR (ending in L):
INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/verify-ui-redesign scripts/verify browser

The quoted PASS output and verification results are unchanged. The artifact report has the corrected command.EOF

Correction to the browser command label in my finish comment: the variable is INFRATERNAL_ARTIFACT_DIR (ending in L): INFRATERNAL_ARTIFACT_DIR=/mnt/hdd/infraternal/artifacts/verify-ui-redesign scripts/verify browser The quoted PASS output and verification results are unchanged. The artifact report has the corrected command.EOF
Author
Owner

Orchestrator: step 12d is merged to dev at 7bda001 and pushed. The merged tree is identical to the verified head d694f5a. The path was build (ui-redesign, 4 runs across usage limits), one independent review, one fix round (the review's five findings, all promoted to blocks-merge as owner requirements) and one verify: all PASS, fast and browser green.

Blur cost, decided acceptable.

  • With the inbox closed, the top-bar blur costs about nothing: 16.84 ms against 16.63 ms mean frame time.
  • With the inbox open, the page behind it is inert, so the 103 ms software-rendered cost applies only to the opening transition.
  • The judgment on real hardware is item 1 of the owner's Safari/iOS checklist: /mnt/hdd/infraternal/artifacts/verify-ui-redesign/safari-ios-checklist.md.

Note: sidebar order is still in memory until the arrangement API exists (docs/UI.md).

Orchestrator: **step 12d is merged to `dev` at `7bda001`** and pushed. The merged tree is identical to the verified head `d694f5a`. The path was build (`ui-redesign`, 4 runs across usage limits), one independent review, one fix round (the review's five findings, all promoted to blocks-merge as owner requirements) and one verify: all PASS, fast and browser green. **Blur cost, decided acceptable.** - With the inbox closed, the top-bar blur costs about nothing: 16.84 ms against 16.63 ms mean frame time. - With the inbox open, the page behind it is inert, so the 103 ms software-rendered cost applies only to the opening transition. - The judgment on real hardware is item 1 of the owner's Safari/iOS checklist: `/mnt/hdd/infraternal/artifacts/verify-ui-redesign/safari-ios-checklist.md`. **Note:** sidebar order is still in memory until the arrangement API exists (`docs/UI.md`).
Commenting is not possible because the repository is archived.
No labels
No milestone
No project
No assignees
1 participant
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/infraternal-v0#21
No description provided.