Repository navigation
feat(studio): align Settings sections and About with the prototype - #2252
Merged
Merged
Conversation
peppescg
added this pull request to stack #2227
October 10, 2026 10:48
This was referenced Oct 10, 2026
peppescg
force-pushed
the
feat/studio-settings-2206b
branch
from
October 11, 2026 14:57
7f5301a to
99c1e18
Compare
This was referenced Oct 11, 2026
peppescg
force-pushed
the
feat/studio-settings-2206b
branch
2 times, most recently
from
October 11, 2026 16:13
29f4015 to
84a954c
Compare
peppescg
force-pushed
the
feat/studio-settings-2206b
branch
from
October 13, 2026 13:29
84a954c to
7337088
Compare
peppescg
force-pushed
the
feat/studio-settings-2206b
branch
from
October 14, 2026 08:45
7337088 to
485f252
Compare
kantord
force-pushed
the
feat/studio-settings-2206b
branch
6 times, most recently
from
October 14, 2026 09:47
13ce7b7 to
41d97f9
Compare
…ter prompts Pins the behaviour the Settings alignment must keep before any change: Studio's thirteen slugs and their order, the legacy redirects, both navigation modes, the runtime and inventory state wording that masks cached facts, the read-only contract, today's deployment facts, and the draft chat's starter prompts with nothing stored. Refs #2206 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Settings takes the prototype's grouping, labels, icons, and navigation visuals while keeping Studio's slugs, section order, and redirects: - Navigation: Preferences, Agent runtime, Experimental, and Support groups; "You" and "Personalise" labels; a lucide icon per section; the prototype's w-44 nav, 500px pivots, and inset-row look on the phone picker, which carries the current section's icon. - Sections: the prototype's row and fact-list grammar for You, Agent, Permissions (a read-only "Safety level" badge), Providers (status rows linked to the detail page), Models, MCP tools, Storage, Diagnostics, and Labs. Personalise splits into Appearance, Chat, and Notifications. - About: an app card (Studio build, SDK version, help links) and an agent card (daemon facts, copy support summary), plus a Sign-in card when signed in. Diagnostics shares the daemon facts. - Live regions: loading and offline notes are role="status"; failed reads are role="alert". - Starter prompts: a new account-scoped Personalise preference, shown by default. The draft chat greeting reads it and hides the chips when off. Settings stays read-only. The gateway sign-in card, the Diagnostics logs and usage cards, and the learning mode display are out of scope. Refs #2206 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The You section showed "Your name" above an input named "Your display name", so a speech user saying the visible words would not reach it (WCAG 2.5.3, Label in Name). Show "Your display name" as the label. The accessible name, which the read-only pins check, stays the same. Refs #2206 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The Studio guide said the shortcuts page follows the "Message during a run" preference. This branch renamed that row to "Messages while the agent works" in Settings > Personalise, so the guide named a setting that no longer exists. Refs #2206 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Settings > Memory switched the facts table between its stacked and two-column layouts at a 500px viewport. Beside the Settings nav, a 500-640px window leaves the table about 190-330px, so the fixed 280px Name column made the table scroll sideways. Switch on the table's own width with a container query instead, so a phone and a narrow Settings column both get the stacked cells. Refs #2206 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
From 500px the section nav takes 176px beside the content, so at
500-640px a section card has about 190-330px. In that range:
- The display and agent name inputs kept a fixed 240px width and spilled
out of the card. A settings row's control now never grows past the
row, so the input narrows instead; phones and desktops keep 176px and
240px.
- The Models grid went to two columns at 500px, which made 87-157px
cards that split names and labels. Columns now follow the card's own
width (two from 480px, three from 700px), and a card's Visible switch
drops under a long name instead of squeezing it.
- Fact values split words ("Manag-ed by deploy-ment") beside their
label. A value now drops below its label only when its longest word
would not fit beside it.
A browser journey checks every section at 500, 568, and 640px: no
sideways scroll, nothing spilling out of a card, fact prose broken only
between words, and model cards at least 180px wide with one-line labels.
Refs #2206
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… visible - At 1280x800 the section nav is about 900px tall and scrolled with the page, so on Labs and About the highlighted item sat below the fold. The nav is now sticky, scrolls on its own within the window, and scrolls the current section into view. Targets stay 44px, with room for focus outlines. - The phone section picker's fill was about 1.05:1 against the page in both themes, so it did not read as a control. It now has a muted-foreground border, about 4.9:1 in light and 6.8:1 in dark (WCAG 1.4.11). Browser checks cover the current nav item at 1280x800 for every section and the picker boundary contrast in both themes. Refs #2206 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
At 500px, Copy support summary ran 10px and Sign out 20px into the About card's padding. Long action labels now wrap within the card, and the sign-in row puts Sign out under its text when they do not fit side by side. The 500-640px browser check now measures spill against the card's content edge, not its border. Refs #2206 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The 500-640px journey reloaded the app 39 times in one test. On a CI runner it took 56s of its 60s timeout on this branch and timed out on every branch above it, and the serial suite then ran into Playwright's 300s global timeout, so later journeys never ran. - One test per width, one page load per test. Each section opens from the Settings nav, as a person opens it; the test now also checks the URL and aria-current for each section. The measurements and their assertions are unchanged. Locally the three tests take about 2.5s each, against 40s for the single test before. With the layout fix reverted they still fail on every section that spilled. - globalTimeout is a backstop for a hung run, not a pace target: each test keeps its 60s timeout. The serial suite grew from 54 to over 100 journeys and a CI runner takes about 1.5x a local run, so the backstop moves from 300s to 600s. Refs #2206 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
About's other actions keep Studio's 44px minimum, but Sign out, now in its own Sign-in card, kept the button's default 36px height. Refs #2206 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
kantord
force-pushed
the
feat/studio-settings-2206b
branch
from
October 14, 2026 09:48
41d97f9 to
1f7bd41
Compare
41 tasks done
Member
|
Post-merge review follow-ups for this PR. No blockers or regressions found. Items worth tracking were filed here:
Other candidate findings were checked and dropped as not worth tracking. Fully or partially written by an AI agent. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This is part (b) of the Settings, Shortcuts, and About alignment (#2206, part of #2210). It's stacked on part (a), the shortcuts page, so review that first. Settings now uses the prototype's section grouping, labels, icons, and navigation look, and the prototype's per-section UI for Personalise, Agent, Permissions, Providers, Models, Storage, Diagnostics, and Labs. About is split into a Studio card and an agent card. Personalise gains the prototype's Starter prompts preference, and the new-chat greeting honours it.
Studio keeps its route structure and slugs (
/workspace/settings/$sectionwithproviders,models,mcp-tools,about, and the rest), its section order, and its legacy redirects. Settings stays read-only, and it only shows data the BFF already serves. The "No regression" section has the proof.What changed
Navigation (
settings-sections.ts,settings-workspace.tsx)UserRound,Palette,Bot,ShieldCheck,Server,Network,Database,Brain,GraduationCap,Activity,FlaskConical,CircleHelp; Models, which the prototype doesn't have, usesBoxes).profileandappearance.w-44column,gap-5groups,px-2items withbg-mutedfor the current section, and agap-10gutter before the content. Like the prototype's desktop nav, it shows no icons.rounded-2xl bg-muted/50, 15px text) with the current section's icon on the left and a chevron on the right.min-[500px]:), and so does every grid in the files this PR touches. Nosm:ormd:classes are left in them.max-w-3xlreading width, withspace-y-5between cards.Section pages
settings-card.tsx): adds the prototype'sSettingsRow(label and description on the left, control on the right, hairline dividers) and aFactList/FactRowpair for read-only facts, in the prototype's About-card look.SettingsCardandNoteare unchanged.SettingsRows ("Your display name", "Shown on your messages."), with a labelled input. The sign-in session facts become a fact list.About (
about-cards.tsx)Runtime status line and live regions
Each runtime-backed section now shows its loading, offline, or failure note inside the section's own card, through one
RuntimeStatusLinecomponent. Loading notes carry a small spinner. Loading and offline notes arerole="status". Failed reads, and an incompatible agent, arerole="alert". The same applies to the storage states, the sign-in session check, and the "no providers" and "no models" notes. The wording is unchanged, and cached facts stay hidden until the runtime validates, as before.Starter prompts
useShowStarterPrompts()inlib/profile-preferences.tsstoresstudio.profile.starter-promptsthrough Studio's account-scoped storage. The prompts are shown by default, and the key holdshiddenonly while they're off. A sign-out or account change clears it, like every otherstudio.preference.DraftGreetingreads the preference and leaves out the chips when it's off. The heading stays. The chat change is limited todraft-greeting.tsx;chat-workspace.tsxis untouched.Docs
user-docs/operating/studio.mdnames Personalise, the Starter prompts switch, the Safety level, and About's two cards.Differences from the prototype
/workspace/settingsmust keep redirecting to/workspace/settings/profile, andsettings-accessibility.test.tsxpins the nativeselect#settings-section. For the same reason, the "Settings" title stays on phones. This is a native<select>where Studio: use shadcn/ui primitives like the prototype and SEP (no custom components) #2201 prefers a primitive; it stays only because of that pinned contract.text-page-title(34px) instead of the prototype'stext-3xl, matching the other Studio pages.EnterSendBehaviorhas no "Always wait".studio.profile.starter-prompts), cleared on sign-out, instead of the prototype's device key (mecatl-studio.hide-starter-prompts).Out of scope
These need a product decision and are tracked separately:
Gaps
No regression
Pinning tests
settings-alignment.pinning.test.tsxwas committed first, alone (8e07554d0), and passed on the old code (6 tests). It passes unchanged on the new code. It pins:/workspace/settings_/$sectionwithout a redirect/workspace/settingsand unknown slugs (including the prototype's ownhelp,provider,gateway,chat, andnotifications) go toprofile;/workspace/settings/memory?item=goes to the fact page;/workspace/memoryand/workspace/providerwithout an item go back to their sectionsaria-current, a native picker with the 13 values and its label, and both callingonSectionChangeExisting tests
settings-accessibility.test.tsx,settings-navigation.test.tsx, andsettings-route-interactions.test.tsxare unchanged and pass. So aresettings-routes.test.tsx,about-page.test.tsx(including the exact copied summary and the five "Not reported" facts),settings-card.test.tsx, andstorage-settings.test.ts.Modified tests
settings-workspace.test.tsx, "titles every section with a plain card heading": the expected headings change for two sections, as Studio alignment: settings, shortcuts, and About #2206 asks. About goes from["About"]to["About Mecatl Studio", "About the agent"], and Personalise from["Appearance"]to["Appearance", "Chat"](Notifications isn't rendered in the test DOM). The assertion is still an exacttoEqualon every section's headings.New tests
settings-alignment.test.tsx(9 tests) covers the groups, labels, and icons; the 500px pivots in every section this PR owns; the live-region roles for each state; the Safety level badge for every tier; the provider row; About's two cards and the conditional Sign-in card; the shared daemon facts; and the Starter prompts preference end to end (switch, account-scoped key, greeting, reset on sign-out).Gate counts
b7ca46bbe)task studio:checkandtask studio:browserpass on both. The web delta is the two new files: 6 pinning tests and 9 alignment tests.matlatl check --strictpasses for the docs change (0 broken links or anchors).Screenshots
Before is
b7ca46bbe, After isea96ca9de, and Prototype isstack-08. Each tree was captured twice; the repeat runs differ by at most 194 pixels (the composer caret), so every red box is a real change. Desktop is 1280 wide and mobile is 390, both grown to the full height of the scrolling content. Where Before and After differ in height, the shorter shot is padded with a flat grey band, and the shell's top gradient, which scales with the viewport, gets a red box on phones. Both are capture artifacts, not changes.You
Matches the prototype's rows (Your name, Picture). Deviations: Studio keeps its explanatory note and the Sign-in session card; the phone keeps the section picker and the "Settings" title instead of the back bar.
Desktop dark, mobile light, mobile dark
Personalise
Matches the prototype's Appearance, Chat (with the new Starter prompts switch), and Notifications cards. Deviations: "Interface scale" instead of "Text size", Studio's Tool activity row and busy-message wording, 44px steppers.
Desktop dark, mobile light, mobile dark
Agent
Matches the prototype's name and picture rows. Deviation: Agent behavior shows Studio's steering badge and managed note instead of the prototype's external-agent note.
Desktop dark, mobile light, mobile dark
Permissions
Matches the prototype's read-only Safety level row and posture badge (Auto shown in warning). Deviation: Studio's managed-by-deployment note.
Desktop dark, mobile light, mobile dark
Providers
Matches the prototype's bordered provider list with status dots, state, model count, and the hint for a provider that isn't ready. Deviations: Studio's management notes and its four state words; rows link to Studio's provider detail.
Desktop dark, mobile light, mobile dark
Models
Studio-only section (the prototype folds models into Providers, shown for reference). Default model and Routing move to the prototype's fact-list grammar; the model cards are unchanged.
Desktop dark, mobile light, mobile dark
MCP tools
Fact-list grammar. Deviation: the prototype's gateway sign-in card is out of scope.
Desktop dark, mobile light, mobile dark
Storage
Matches the prototype: status badge and Refresh on one row, then the facts. Deviation: Studio keeps its managed-by-deployment note, now below the facts.
Desktop dark, mobile light, mobile dark
Memory
Content unchanged (aligned in #2222 and #2229); only the navigation changes.
Desktop dark, mobile light, mobile dark
Learning
Content unchanged (aligned in #2232); only the navigation changes. The prototype column shows its fixture's learning data.
Desktop dark, mobile light, mobile dark
Diagnostics
Daemon facts in the prototype's About-card grammar, shared with About. Deviation: the Logs and Usage statistics cards are out of scope, so Diagnostics keeps one card with the storage-health line and the logs note.
Desktop dark, mobile light, mobile dark
Labs
Nav only; the content is unchanged. Studio has no demo chat or developer tools to switch.
Desktop dark, mobile light, mobile dark
About
Matches the prototype's split: About Mecatl Studio, About the agent, and Sign-in. Deviations: Studio's build, SDK, and five daemon facts, and Copy support summary.
Desktop dark, mobile light, mobile dark
New chat, Starter prompts on
Unchanged, as intended (the only differing pixels are the composer caret, equal to the capture noise). Matches the prototype's greeting with chips.
Desktop dark, mobile light, mobile dark
New chat, Starter prompts off
Matches the prototype: the chips are hidden and the heading stays.
Desktop dark, mobile light, mobile dark
Review fixes
Fixes from the final regression and security review of the stack (stack #2227). Each one comes with a test that fails without the fix.
92a26e62dtask docspasses. No prose test (AGENTS.md: don't pin documentation prose).c313489dbsettings-accessibility.test.tsx: "keeps each identity field's visible label inside its accessible name" (fails before, passes after)e175641c7,f67b9340de2e/settings-layout.spec.ts: "settings sections fit at 500/568/640px, between the 500px pivot and a tablet"cd1a4791fe2e/settings-layout.spec.ts: "the settings nav keeps the current section on screen at 1280x800"muted-foregroundborder, about 4.9:1 in light and 6.8:1 in dark (WCAG 1.4.11)cd1a4791fe2e/settings-layout.spec.ts: "the phone section picker reads as a control in light/dark mode"b082e8b84humanize(id)How the 500–640px layout works now. From 500px the section nav takes 176px, which leaves a section card about 190–330px wide.
The browser journey checks every section at 500, 568, and 640px:
Before the fix it failed on profile, agent, models, memory, MCP tools, diagnostics, and about.
Differences from the prototype.
Gates on
e001f782b:studio:check: server 195/195, web 1040/1040 (139 files; +1 vitest test).studio:browser: 70 passed, 4 skipped. The new spec adds 4 tests per project, and each runs on only one project.Screenshots
Before is
7f5301a89and After ise001f782b. Red boxes mark pixel differences. These are responsive fixes for widths and states the prototype does not define, so there is no prototype column.Models at 500px: one readable column instead of two 87px columns, and fact values keep their words whole.
The current nav item at 1280×800 (the window as a user sees it, About): before, About sat below the fold; after, the nav scrolls it into view.
The phone section picker now has a visible border, and the label reads "Your display name":
More: 500/568/640px sections, desktop, dark
You at 500px: the input stays inside the card.
Agent at 500px:
Models at 568px and 640px:
Models at 1280px still shows three columns; a long name now puts Visible under it:
Memory at 500, 568, and 640px: stacked cells, no sideways scroll.
About at 500px and 568px: fact values keep their words whole, and the buttons stay inside the card.
MCP tools and Diagnostics at 500px:
Labs at 1280×800, light and dark:
Phone picker, dark:
Re-verification (2026-10-11)
aria-current. The measurements and assertions are unchanged, each test takes about 2.5s, and with the layout fix reverted they still fail on every section that spilled.globalTimeoutmoves from 300s to 600s: it is a backstop for a hung run, each test keeps its 60s timeout, and the serial suite grew from 54 to over 100 journeys (5.3 minutes on CI at the stack top). (e6fd0022a)min-h-11. (485f25242) Test:settings-accessibility.test.tsx"gives About's Sign out a 44px touch area" (fails without the fix).Sign out, before and after the fix (36px → 44px on desktop; the images are labelled with the pre-restack hashes):
More: mobile, dark
Gates on the restacked head
485f25242:studio:checkpasses (web 1,152, server 210 tests). At the stack top (#2256):studio:browser118 passed, 30 skipped; themecated --mockintegration suite 8 passed. The browser suite takes 5.3 minutes on a CI runner.Commit hashes cited earlier in this body predate the restacks; the current commits keep the same subjects. Hashes in Review fixes are updated.
Closes #2206
🤖 Generated with Claude Code