diff --git a/apps/desktop/src/renderer/session-workbar.tsx b/apps/desktop/src/renderer/session-workbar.tsx
index 36a4c39a52..1d92071a0e 100644
--- a/apps/desktop/src/renderer/session-workbar.tsx
+++ b/apps/desktop/src/renderer/session-workbar.tsx
@@ -49,6 +49,7 @@ import { Button } from '@astryxdesign/core/Button';
import { Card } from '@astryxdesign/core/Card';
import { ContextMenu } from '@astryxdesign/core/ContextMenu';
import { Item } from '@astryxdesign/core/Item';
+import { Kbd } from '@astryxdesign/core/Kbd';
import { Section } from '@astryxdesign/core/Section';
import { Spinner } from '@astryxdesign/core/Spinner';
import { Toolbar } from '@astryxdesign/core/Toolbar';
@@ -563,7 +564,8 @@ function WorkbarLauncher(props: {
label: copy.sideChat,
description: copy.launcher.sideChat,
icon:
,
- shortcut: isMac ? '⌥⌘S' : 'Alt+Ctrl+S',
+ // Astryx Kbd tokens (+ separated); mod = Cmd on Mac / Ctrl elsewhere.
+ shortcut: isMac ? 'mod+alt+s' : 'ctrl+alt+s',
disabled: !props.sideChatAvailable,
},
{
@@ -571,28 +573,28 @@ function WorkbarLauncher(props: {
label: copy.review,
description: copy.launcher.review,
icon:
,
- shortcut: '⌃⇧G',
+ shortcut: 'ctrl+shift+g',
},
{
kind: 'terminal',
label: copy.terminal,
description: copy.launcher.terminal,
icon:
,
- shortcut: isMac ? '⌃`' : 'Ctrl+`',
+ shortcut: 'ctrl+`',
},
{
kind: 'browser',
label: copy.browser,
description: copy.launcher.browser,
icon:
,
- shortcut: isMac ? '⌘T' : 'Ctrl+T',
+ shortcut: 'mod+t',
},
{
kind: 'files',
label: copy.files,
description: copy.launcher.files,
icon:
,
- shortcut: isMac ? '⌘P' : 'Ctrl+P',
+ shortcut: 'mod+p',
},
{
kind: 'tasks',
@@ -687,7 +689,9 @@ function WorkbarLauncher(props: {
aria-description={action.description}
endContent={
action.shortcut ? (
-
{action.shortcut}
+
+
+
) : undefined
}
isDisabled={action.disabled}
diff --git a/apps/desktop/src/renderer/styles/agent-graph.css b/apps/desktop/src/renderer/styles/agent-graph.css
index 7e12f38686..7c3f8db84d 100644
--- a/apps/desktop/src/renderer/styles/agent-graph.css
+++ b/apps/desktop/src/renderer/styles/agent-graph.css
@@ -6,8 +6,8 @@
overflow: auto;
border: var(--border-width-hairline) solid var(--border);
border-radius: var(--radius-surface);
- background: var(--background-elevated);
- box-shadow: 0 8px 24px oklch(from var(--foreground) l c h / 0.05);
+ /* In-flow reading plate: raised fill + line only (DESIGN.md One Means). */
+ background: var(--surface-raised);
color: var(--foreground);
}
diff --git a/apps/desktop/src/renderer/styles/chat-detail.css b/apps/desktop/src/renderer/styles/chat-detail.css
index d0f6185b37..5ddb9637a2 100644
--- a/apps/desktop/src/renderer/styles/chat-detail.css
+++ b/apps/desktop/src/renderer/styles/chat-detail.css
@@ -332,13 +332,9 @@
height: var(--icon-chrome);
}
+/* Astryx Kbd owns keycap chrome; only mute the cluster. */
.maka-workbar-launcher-shortcut {
- padding: 2px var(--space-2);
- border: 0;
- border-radius: var(--radius-full);
- background: var(--card-bg);
color: var(--muted-foreground);
- font: var(--maka-text-supporting);
white-space: nowrap;
}
@@ -918,11 +914,16 @@
.maka-browser-toolbar {
flex: 0 0 auto;
+ /* Band chrome only — Astryx Toolbar owns the row; start slot stretches. */
+ border-bottom: var(--border-width-hairline) solid var(--border);
+}
+
+.maka-browser-toolbar-start {
display: flex;
+ min-width: 0;
+ flex: 1 1 auto;
align-items: center;
gap: var(--space-1);
- padding: var(--space-1-5) var(--space-2);
- border-bottom: var(--border-width-hairline) solid var(--border);
}
.maka-browser-address-field {
diff --git a/apps/desktop/src/renderer/styles/chat-header.css b/apps/desktop/src/renderer/styles/chat-header.css
index 5e4f01cbd9..5bd537fc7d 100644
--- a/apps/desktop/src/renderer/styles/chat-header.css
+++ b/apps/desktop/src/renderer/styles/chat-header.css
@@ -67,7 +67,8 @@
.maka-session-context__inner {
min-width: 0;
- min-height: 40px;
+ /* Control rhythm 36 (lg) — band holds sm/md controls without off-ladder 40. */
+ min-height: 36px;
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, auto);
align-items: center;
diff --git a/apps/desktop/src/renderer/styles/deep-research.css b/apps/desktop/src/renderer/styles/deep-research.css
index 33c12dc09b..2e0b332f70 100644
--- a/apps/desktop/src/renderer/styles/deep-research.css
+++ b/apps/desktop/src/renderer/styles/deep-research.css
@@ -94,12 +94,12 @@
padding: var(--space-3) var(--space-4);
border: var(--border-width-hairline) solid var(--border);
border-radius: var(--radius-surface);
- background: oklch(from var(--focus-ring) l c h / 0.035);
+ background: var(--info-wash);
color: var(--foreground);
}
.maka-deep-research-run-panel[data-status="completed"] {
- background: oklch(from var(--success) l c h / 0.035);
+ background: var(--success-wash);
}
.maka-deep-research-run-summary,
@@ -141,7 +141,7 @@
align-items: center;
padding: var(--space-0-5) var(--space-2);
border-radius: var(--radius-pill);
- background: oklch(from var(--focus-ring) l c h / 0.10);
+ background: var(--info-wash);
font-variant-numeric: tabular-nums;
}
@@ -163,11 +163,11 @@
}
.maka-deep-research-handoff-button:hover {
- background: oklch(from var(--focus-ring) l c h / 0.08);
+ background: var(--info-wash);
}
.maka-deep-research-handoff-button:active {
- background: oklch(from var(--focus-ring) l c h / 0.14);
+ background: var(--info-wash-border);
}
.maka-deep-research-handoff-button:focus-visible {
diff --git a/apps/desktop/src/renderer/styles/plan-mode.css b/apps/desktop/src/renderer/styles/plan-mode.css
index 0f4281b791..ab024ec293 100644
--- a/apps/desktop/src/renderer/styles/plan-mode.css
+++ b/apps/desktop/src/renderer/styles/plan-mode.css
@@ -10,10 +10,8 @@
padding: var(--space-4);
border: var(--border-width-hairline) solid var(--border);
border-radius: var(--radius-surface);
- background: var(--background-elevated);
- box-shadow:
- 0 1px 2px oklch(from var(--foreground) l c h / 0.04),
- 0 8px 24px oklch(from var(--foreground) l c h / 0.05);
+ /* Reading plate on the chat canvas: raised fill + line only (One Means). */
+ background: var(--surface-raised);
}
.plan-proposal-heading,
@@ -114,9 +112,9 @@
display: inline-flex;
align-items: center;
justify-content: center;
- border: var(--border-width-hairline) solid oklch(from var(--status-running) l c h / 0.28);
+ border: var(--border-width-hairline) solid var(--info-wash-border);
border-radius: var(--radius-pill);
- background: oklch(from var(--status-running) l c h / 0.10);
+ background: var(--info-wash);
color: var(--foreground);
font-variant-numeric: tabular-nums;
}
@@ -147,7 +145,7 @@
position: relative;
padding: var(--space-1-5) var(--space-2) var(--space-1-5) var(--space-5);
border-radius: var(--radius-control);
- background: oklch(from var(--warning) l c h / 0.08);
+ background: var(--warning-wash);
}
.plan-proposal-risks li::before {
@@ -171,8 +169,7 @@
padding: var(--space-2-5) var(--space-3);
border: var(--border-width-hairline) solid var(--border);
border-radius: var(--radius-surface);
- background: var(--background-elevated);
- box-shadow: 0 1px 2px oklch(from var(--foreground) l c h / 0.04);
+ background: var(--surface-raised);
}
.plan-execution-toggle {
@@ -255,7 +252,7 @@
.plan-execution-steps li[data-status="in_progress"] {
color: var(--foreground);
- background: oklch(from var(--status-running) l c h / 0.06);
+ background: var(--info-wash);
}
.plan-execution-steps li[data-status="completed"],
@@ -276,14 +273,14 @@
}
.plan-execution-step-marker[data-status="in_progress"] {
- border-color: oklch(from var(--status-running) l c h / 0.38);
- background: oklch(from var(--status-running) l c h / 0.12);
- color: var(--status-running);
+ border-color: var(--info-wash-border);
+ background: var(--info-wash);
+ color: var(--info-text);
}
.plan-execution-step-marker[data-status="completed"] {
- border-color: oklch(from var(--success) l c h / 0.36);
- background: oklch(from var(--success) l c h / 0.12);
+ border-color: var(--success-wash-border);
+ background: var(--success-wash);
color: var(--success-text);
}
diff --git a/apps/desktop/src/renderer/styles/quote-side-panel.css b/apps/desktop/src/renderer/styles/quote-side-panel.css
index d0a918d9e3..d184ab3ed1 100644
--- a/apps/desktop/src/renderer/styles/quote-side-panel.css
+++ b/apps/desktop/src/renderer/styles/quote-side-panel.css
@@ -85,7 +85,7 @@
overflow: hidden;
border-radius: var(--radius-surface);
- box-shadow: 0 2px 8px oklch(from var(--foreground) l c h / 0.08);
+ /* Leave elevation to ChatComposer; product shadow overrode hover/focus lift. */
}
.maka-session-workbar-panel[data-placement="right"]
diff --git a/apps/desktop/src/renderer/styles/settings/bot.css b/apps/desktop/src/renderer/styles/settings/bot.css
index 570673a269..a8d787d31f 100644
--- a/apps/desktop/src/renderer/styles/settings/bot.css
+++ b/apps/desktop/src/renderer/styles/settings/bot.css
@@ -18,8 +18,8 @@
display: block;
}
.settingsBotLogo[data-large="true"] {
- width: 44px;
- height: 44px;
+ width: 36px;
+ height: 36px;
}
.settingsRemoteAccessChannelRow,
diff --git a/apps/desktop/src/renderer/styles/settings/models.css b/apps/desktop/src/renderer/styles/settings/models.css
index a34f4c2b03..1ae0e0917e 100644
--- a/apps/desktop/src/renderer/styles/settings/models.css
+++ b/apps/desktop/src/renderer/styles/settings/models.css
@@ -47,8 +47,8 @@
official brand mark (provider-brand-marks.tsx), so the plate stays a
quiet foreground wash in both light and dark — no per-provider tints. */
.providerLogo {
- width: 44px;
- height: 44px;
+ width: 36px;
+ height: 36px;
display: grid;
place-items: center;
border-radius: var(--radius-plate);
diff --git a/apps/desktop/src/renderer/styles/settings/theme-preview.css b/apps/desktop/src/renderer/styles/settings/theme-preview.css
index 18ee015922..de26232062 100644
--- a/apps/desktop/src/renderer/styles/settings/theme-preview.css
+++ b/apps/desktop/src/renderer/styles/settings/theme-preview.css
@@ -108,8 +108,8 @@
colors are hard-coded here (not pulled from --accent) so a non-
active palette still previews its real color. */
.settingsPaletteSwatch {
- width: 34px;
- height: 34px;
+ width: 32px;
+ height: 32px;
border-radius: 50%;
border: var(--border-width-thick) solid var(--border);
box-shadow: inset 0 0 0 2px oklch(1 0 0 / 0.25);
diff --git a/docs/astryx-surface-file-inventory.md b/docs/astryx-surface-file-inventory.md
index ca831fba02..cad3658a28 100644
--- a/docs/astryx-surface-file-inventory.md
+++ b/docs/astryx-surface-file-inventory.md
@@ -5,7 +5,7 @@ Each row is one on-disk product surface file. Regenerated inventory must stay in
Wiki bar: Design Conventions · API Use-the-System · Theming · Container Padding.
-**Totals:** 183 files — blocker 0, polish 4, aligned 179.
+**Totals:** 183 files — blocker 0, polish 0, aligned 183.
## Exclusions (explicit)
@@ -35,7 +35,7 @@ Wiki bar: Design Conventions · API Use-the-System · Theming · Container Paddi
| `apps/desktop/src/renderer/artifact-pane.tsx` | shell-chrome-or-panel | Badge, Banner, Button, EmptyState | aligned — uses Astryx (Badge, Banner, Button, EmptyState) | aligned |
| `apps/desktop/src/renderer/artifact-preview-registry-shell.tsx` | shell-chrome-or-panel | Banner, Button, Spinner | aligned — uses Astryx (Banner, Button, Spinner) | aligned |
| `apps/desktop/src/renderer/artifact-preview.tsx` | shell-chrome-or-panel | Banner, Button, Spinner | aligned — uses Astryx (Banner, Button, Spinner) | aligned |
-| `apps/desktop/src/renderer/browser-panel.tsx` | shell-chrome-or-panel | EmptyState, IconButton, Tooltip | aligned — uses Astryx (EmptyState, IconButton, Tooltip) | aligned |
+| `apps/desktop/src/renderer/browser-panel.tsx` | shell-chrome-or-panel | EmptyState, IconButton, Toolbar, Tooltip | aligned — uses Astryx (EmptyState, IconButton, Toolbar, Tooltip) | aligned |
| `apps/desktop/src/renderer/cascade-layers.css` | styles | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/chat-composer-region.tsx` | shell-chrome-or-panel | Banner, Button | aligned — uses Astryx (Banner, Button) | aligned |
| `apps/desktop/src/renderer/chat-message-surface.tsx` | shell-chrome-or-panel | Banner, Button | aligned — uses Astryx (Banner, Button) | aligned |
@@ -44,7 +44,7 @@ Wiki bar: Design Conventions · API Use-the-System · Theming · Container Paddi
| `apps/desktop/src/renderer/custom-pet-companion.tsx` | other | none | aligned — no raw controls; no Astryx JSX usage | aligned |
| `apps/desktop/src/renderer/error-boundary.tsx` | other | Button, Card | aligned — uses Astryx (Button, Card) | aligned |
| `apps/desktop/src/renderer/external-session-import-dialog.tsx` | dialog-overlay | Banner, Button, CheckboxInput, Dialog, DialogHeader, EmptyState, HStack, Item, Layout, LayoutContent, SegmentedControl, SegmentedControlItem, Spinner, Text, VStack | aligned — uses Astryx (Banner, Button, CheckboxInput, Dialog, DialogHeader, EmptyState, HStack, Item) | aligned |
-| `apps/desktop/src/renderer/keyboard-help.tsx` | dialog-overlay | Dialog, DialogHeader, Layout, LayoutContent | aligned — uses Astryx (Dialog, DialogHeader, Layout, LayoutContent) | aligned |
+| `apps/desktop/src/renderer/keyboard-help.tsx` | dialog-overlay | Dialog, DialogHeader, Heading, Layout, LayoutContent | aligned — uses Astryx (Dialog, DialogHeader, Heading, Layout, LayoutContent) | aligned |
| `apps/desktop/src/renderer/live-turn-reconciler.tsx` | other | none | aligned — no raw controls; no Astryx JSX usage | aligned |
| `apps/desktop/src/renderer/maka-tokens.css` | styles | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/mcp-brand-marks.tsx` | other | none | aligned — no raw controls; no Astryx JSX usage | aligned |
@@ -104,7 +104,7 @@ Wiki bar: Design Conventions · API Use-the-System · Theming · Container Paddi
| `apps/desktop/src/renderer/styles/astryx-mount.css` | styles | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/base.css` | styles | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/chat-detail.css` | shell-chrome-or-panel | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
-| `apps/desktop/src/renderer/styles/chat-header.css` | shell-chrome-or-panel | n/a (css) | off-rhythm control height 40px (Design size) | polish |
+| `apps/desktop/src/renderer/styles/chat-header.css` | shell-chrome-or-panel | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/chat-message.css` | shell-chrome-or-panel | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/composer-mention.css` | shell-chrome-or-panel | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/composer.css` | shell-chrome-or-panel | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
@@ -133,19 +133,19 @@ Wiki bar: Design Conventions · API Use-the-System · Theming · Container Paddi
| `apps/desktop/src/renderer/styles/search-modal.css` | dialog-overlay | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/settings.css` | styles | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/settings/about.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
-| `apps/desktop/src/renderer/styles/settings/bot.css` | settings-module | n/a (css) | off-rhythm control height 44px (Design size) | polish |
+| `apps/desktop/src/renderer/styles/settings/bot.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/settings/connection.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/settings/form.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/settings/health.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/settings/memory.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
-| `apps/desktop/src/renderer/styles/settings/models.css` | settings-module | n/a (css) | off-rhythm control height 44px (Design size) | polish |
+| `apps/desktop/src/renderer/styles/settings/models.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/settings/nav-sidebar.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/settings/permission.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/settings/provider-editor.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/settings/route.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/settings/rows.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/settings/select.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
-| `apps/desktop/src/renderer/styles/settings/theme-preview.css` | settings-module | n/a (css) | off-rhythm control height 34px (Design size) | polish |
+| `apps/desktop/src/renderer/styles/settings/theme-preview.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/settings/usage.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/settings/web-search.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
| `apps/desktop/src/renderer/styles/settings/wechat.css` | settings-module | n/a (css) | aligned — no off-rhythm control heights flagged | aligned |
diff --git a/docs/frontend-architecture-astryx-review-2026-08-09.md b/docs/frontend-architecture-astryx-review-2026-08-09.md
index 6f4432f337..7f7655fa20 100644
--- a/docs/frontend-architecture-astryx-review-2026-08-09.md
+++ b/docs/frontend-architecture-astryx-review-2026-08-09.md
@@ -149,14 +149,28 @@ Severity: **blocker** = structural cost that blocks every feature; **high** = cl
## 3. Astryx style / component coverage gaps
-### 3.1 Inventory baseline (disk, 2026-08-09)
+### 3.1 Inventory baseline
+
+| Metric | Post-#2580 audit | After review-debt fix (this branch) |
+|--------|------------------|-------------------------------------|
+| Files | 183 | 183 |
+| blocker | **0** | **0** |
+| polish | **4** (exact rows below) | **0** |
+| aligned | 179 | 183 |
+
+**Post-#2580 polish rows (historical, for accuracy):**
+
+| Path | Flagged height | What it was |
+|------|----------------|-------------|
+| `styles/chat-header.css` | `min-height: 40px` | `.maka-session-context__inner` band |
+| `styles/settings/bot.css` | `height: 44px` | `.settingsBotLogo[data-large]` |
+| `styles/settings/models.css` | `height: 44px` | `.providerLogo` default plate |
+| `styles/settings/theme-preview.css` | `height: 34px` | `.settingsPaletteSwatch` |
+
+These were **not** invent-from-whole-cloth “logo false positives” in the abstract — they were the four inventory rows. They were **fixed to the 28/32/36 control rhythm** (36 band / 36 plates / 32 swatch) rather than allowlisted away.
| Metric | Value |
|--------|--------|
-| Files | 183 |
-| blocker | **0** |
-| polish | 4 (logo/swatch/session-context band heights — **decorative false positives**) |
-| aligned | 179 |
| Raw `