16 KiB
UX and Copy Remediation Plan
Purpose
This document defines the UX, copywriting, and localization cleanup track for the current UI. It is separate from __REVIEW_FRONT.md:
__REVIEW_FRONT.mdfocuses on frontend architecture, safety, module structure, and delivery mechanics;__REVIEW_UX.mdfocuses on user-facing clarity, consistency, language quality, and product honesty.
The goal is to remove developer-facing language, broken localization patterns, misleading placeholders, and half-functional UI signals from the product surface.
Core Principle
The UI must speak to operators, not to developers.
That means:
- no implementation jargon such as "slice", "wired", "resolved at runtime" unless the user truly needs it;
- no debug-style booleans in user-visible success messages;
- no fake functionality presented as nearly available unless the user can act on it;
- no mixed EN/RU phrasing where the product can speak normally in one language.
Scope
This plan covers:
- English copy cleanup;
- Russian copy cleanup;
- pluralization support;
- login UX cleanup;
- settings honesty cleanup;
- command palette decision and follow-through;
- wizard message polish;
- terminology consistency rules.
Track A: English Copy Quality
Problem Types
A1. Literal formatting markers leaking into UI
Examples:
apikeys.callout.bodywizard.step2.auth_profile_hint
Current issue:
- backticks are rendered literally as characters;
- they do not become semantic formatting in HTML;
- the user sees developer-style markdown notation.
Decision
Do not use markdown-style backticks in translation strings rendered through normal text nodes.
Allowed alternatives:
- plain text without emphasis;
- explicit
<code>only when rendered through a trusted HTML path that is intended for markup; - a dedicated visual class if code-like styling is actually needed.
Required fixes
apikeys.callout.body- replace
`Last used`with plain text or a proper code-like span in a trusted template
- replace
wizard.step2.auth_profile_hint- remove
`execution_config.auth_profile_ref`from user-facing copy
- remove
Preferred rewrites
Instead of:
Last used updates after successful MCP authentication.
Use:
Last used updates after a successful MCP call.
Instead of:
Selected profile will be resolved at runtime and attached through execution_config.auth_profile_ref.
Use:
The selected auth profile is applied automatically when this tool runs.
A2. Internal planning jargon visible to users
Examples:
secrets.profiles.empty_body
Current issue:
next sliceis a delivery-planning term, not a product term.
Decision
All planning jargon must be removed from UI strings.
Forbidden user-facing phrases:
next slicethis build does not pretendwired yetnot wiredbacked byresolved at runtimeunless the user truly configures runtime behavior
Preferred rewrite
Instead of:
Create auth profiles in the next slice to bind secrets to upstream authentication.
Use:
Create auth profiles in the Wizard when configuring an operation.
A3. Unsafe or awkward symbols in plain text
Examples:
agents.drawer.recommendation
Current issue:
<15appears directly in text and should not rely on plain text rendering safety.
Decision
Prefer natural language over symbolic shorthand in user guidance.
Preferred rewrite:
LLMs usually work best when an agent has fewer than 15 tools.
A4. Debug-style status messages
Examples:
wizard.test.window_completed_bodywizard.test.session_started_body
Current issue:
- booleans like
true/falseare shown directly to users; - milliseconds are exposed when approximate guidance is enough.
Decision
User-visible status text must describe outcome, not internal flags.
Required rewrites
wizard.test.window_completed_body
Current:
Window complete: {window_complete}. Truncated: {truncated}. Has more: {has_more}.
Target behavior:
- message should describe:
- how many items were collected;
- whether data was truncated;
- whether more data is available.
Preferred shape:
Collected {count} items.Collected {count} items. Results were truncated.Collected {count} items. More data is available if you extend the window or continue polling.
wizard.test.session_started_body
Current:
Poll after {poll_after_ms} ms from the stream sessions view.
Preferred:
Session started. Check Stream sessions in a few seconds.
A5. Awkward English phrasing
Examples:
logs.range.1h: Last 1 hour
Preferred:
Last hour
Acceptance Criteria
- no markdown backticks in plain-text translations;
- no delivery jargon in user-facing EN strings;
- no debug booleans in wizard result messaging;
- obvious awkward phrases are normalized to natural English.
Track B: Russian Copy Quality
Problem Types
B1. Missing keys
Known example:
wizard.step2.auth_basicexists in EN and must exist in RU with product-quality copy.secrets.profiles.subtitle_countin the RU section is effectively still English and must be treated as a translation-parity defect, not just as weak wording.
Decision
Translation parity is mandatory for both locales.
Every newly added EN key must either:
- be translated in RU in the same change;
- or fail verification.
Required future safeguard
Add a translation parity checker to detect:
- missing RU keys;
- missing EN keys;
- exact duplicate placeholder keys if unintended.
B2. Russian pluralization is currently structurally incomplete
Known examples:
workspace_setup.member_countworkspace_setup.members.days_agosecrets.used_by_count
Current problem:
- templates like
{count} участниковfail for1; - templates like
{count} дня назадfail for5.
Decision
Introduce plural helpers based on Intl.PluralRules.
Target API
In i18n.js, add a helper such as:
function tPlural(count, forms) {
// locale-aware choice
}
Where:
- English uses
one / other - Russian uses
one / few / many
Target translation style
Instead of one flat string:
workspace_setup.member_count: '{count} участников'
Use grouped forms, for example:
workspace_setup.member_count.oneworkspace_setup.member_count.fewworkspace_setup.member_count.many
Or an equivalent plural storage format, as long as the API is stable.
First keys to migrate
workspace_setup.member_countworkspace_setup.members.days_agosecrets.used_by_countsecrets.profiles.subtitle_countwizard.step3.grpc.streaming_hiddenwizard.grpc.services_found
B3. Developer calques and transliterated jargon
Examples:
резолвитьсяв следующем срезеnotification settingslifecycleusage referencesadvanced future integrations
Decision
Russian copy should be plain product Russian, while keeping real technical terms intact.
Keep in English only true technical terms such as:
gRPCWSDLJSONBearerQueryMutationWebSocket
Rewrite non-terms into Russian.
Required rewrites
wizard.step2.auth_profile_hint
Instead of:
Выбранный профиль будет резолвиться в runtime...
Use:
Выбранный профиль применяется автоматически при каждом вызове инструмента.
secrets.callout.body
Remove mixed language and rewrite as:
После создания или ротации API возвращает только метаданные, поэтому на этой странице доступны управление секретами и просмотр их использования.
secrets.hint.generic
Avoid:
advanced future integrations
Use:
Подходит для произвольного JSON, если секрет нужно использовать в нестандартной интеграции.
workspace_setup.create.footer
Replace:
Owner
With:
Владелец
secrets.profiles.subtitle_count
Current RU text is still English-like and must be translated fully.
Acceptance Criteria
- no missing translation keys between EN/RU;
- Russian plural forms are grammatically correct;
- no developer calques remain in user-facing RU strings;
- role names are translated consistently.
Track C: Login Experience Cleanup
Problem
The login screen currently highlights unavailable functionality:
- Forgot password
- Google SSO
- Request access
all with Planned badges.
This creates the impression of unfinished product state on the very first screen.
There is also a developer-style note explaining what is not wired.
Decision
The login page must present only working entry points.
Recommended product behavior
Production/default mode
Show:
- password
- sign-in button
Optionally show a single unobtrusive note:
Password reset and SSO will be added later.
But only if product really needs that promise visible.
Preferred option:
- hide non-working actions completely.
Development-only mode
If the team wants visibility for future auth work, gate it behind a development flag.
Example:
window.CrankFeatures.showPlannedAuth
Required changes
Remove or gate:
- disabled
Forgot password? - disabled
Google SSO - disabled
Request access login.password_onlydeveloper note from production HTML
Acceptance Criteria
- login page does not lead with unavailable features;
- no developer-facing implementation note is shown in normal product mode.
Track D: Settings Honesty Pass
Problem
The settings page still contains a full Notifications section and other planned capability language that reads like UI cargo cult:
- detailed controls that do nothing;
- developer-style subtitle text;
- explanation written from the implementation perspective.
Decision
If a settings area is not functional, it should not be represented as a near-complete interactive configuration panel.
Product rule
There are only two acceptable states:
- fully functional configuration;
- compact informational placeholder.
Avoid:
- large fake forms;
- multiple toggles with
Plannedbadges; - controls that imply persistence when none exists.
Required changes
settings.page.subtitle
Current EN subtitle speaks about capabilities being visible but not wired.
Replace with a user-centered subtitle such as:
Manage your profile, password, and workspace settings.
Notifications section
Replace the current detailed pseudo-settings with one compact informational card:
- title
- short explanation
- possibly one sentence:
Notification routing and per-user preferences will be added later.
No fake toggles.
Planned security capabilities
Keep only if:
- they are clearly informational;
- they do not look like interactive controls.
If they look interactive, collapse them into one planned card as well.
Acceptance Criteria
- settings page describes what users can do now;
- non-functional areas are compact and clearly informational;
- no fake detailed settings remain.
Track E: Command Palette Decision
Problem
⌘K is visible in the navigation, but there is no working command palette attached to it.
This is worse than not showing it at all.
Decision Matrix
Option 1: Remove it
Choose this if:
- there is no actual command palette implementation;
- there is no near-term product need for it;
- keeping the hint only creates false expectation.
Option 2: Implement it
Choose this only if the product has a real command list worth exposing.
Minimum useful scope:
- go to Operations
- go to Agents
- go to API Keys
- go to Secrets
- go to Logs
- go to Usage
- go to Settings
- switch workspace
- create new operation
- create new agent
Current recommendation
Based on current code surface, remove it first.
Reason:
- there is visible affordance;
- there is no working interaction;
- product already has enough active work without adding a new shell feature mid-stream.
If later implemented, it should land as its own feature:
feat/frontend-command-palette
Acceptance Criteria
- either
⌘Kis removed everywhere; - or a real command palette exists and is keyboard-accessible.
No middle state.
Track F: Wizard Messaging and Step Clarity
Problem
Wizard copy still includes:
- technical internal language;
- poor plural handling;
- insufficiently clear streaming result messages;
- protocol-step context that changes without enough explicit signaling.
Required changes
F1. Auth selector copy
Remove implementation references such as:
execution_config.auth_profile_ref
Replace with operator language:
The selected auth profile is applied automatically when the tool runs.
F2. Streaming result messages
Replace technical booleans and milliseconds with outcome-focused language.
For:
windowsessionasync_job
F3. gRPC plural and summary strings
Fix:
streaming method(s)1 services
Use locale-aware pluralization helpers.
F4. Step-3 protocol clarity
The sidebar label changing per protocol is useful, but not always obvious enough after protocol switching.
Recommended UI change:
- add a small protocol badge near the step title on step 3:
REST configGraphQL operationgRPC methodWebSocket streamSOAP binding
This should exist both:
- in the main pane heading;
- optionally in the sidebar if compact enough.
Acceptance Criteria
- wizard status/result text reads like product UX, not runtime telemetry;
- plural forms are correct;
- step 3 protocol-specific context is explicit.
Track G: Terminology Rules
Problem
The UI currently mixes three categories without a clear rule:
- real technical terms;
- product concepts;
- implementation jargon.
Terminology Policy
Keep as technical terms
QueryMutationgRPCRESTWebSocketSOAPWSDLJSONBearer token
Translate to product language
workflowsettingsusagenotificationsworkspaceowner
Never expose as user-facing jargon
slicewiredresolved at runtimemetadata onlyif better phrasing existsfuture integrationsusage referencesbacked by
Acceptance Criteria
- technical terms remain technical;
- implementation jargon disappears from UI.
Track H: Verification and Guardrails
Problem
Without guardrails, translation and UX regressions will return.
Required safeguards
H1. Translation parity check
Add a script/test that verifies:
- EN and RU contain the same key set;
- missing keys fail CI.
H2. Dangerous copy lint
Add a lightweight scan for forbidden phrases in user-facing translations:
next slicewiredresolved at runtime- backticks in plain text translations
(s)plural suffix
This can be a simple repo script at first.
H3. UX regression checklist
Extend manual regression docs with:
- login first impression check;
- no dead nav affordances;
- no fake settings sections;
- pluralization smoke in RU.
Acceptance Criteria
- parity regressions are caught automatically;
- obvious UX copy anti-patterns are detectable before release.
Delivery Order
Recommended order:
feat/frontend-ux-review-planfeat/frontend-i18n-remediationfeat/frontend-login-simplificationfeat/frontend-settings-honesty-passfeat/frontend-command-palette-decisionfeat/frontend-wizard-copy-polishfeat/frontend-plural-rulesfeat/frontend-ux-guardrails
Per-Slice Verification
Each slice should include:
- targeted
node --checkfor touched JS - targeted Playwright smoke if the affected page already has coverage
- manual locale switch smoke for EN and RU
Additional rules:
- login cleanup must be visually checked on first load;
- plural-rule slice must include sample assertions for RU forms;
- command-palette decision slice must verify no dead
⌘Kaffordance remains.
Success Definition
This UX cleanup track is complete when:
- the product no longer exposes developer planning language;
- EN and RU feel intentional rather than partially translated;
- plural forms are correct in both locales;
- login shows only meaningful actions;
- settings no longer presents fake detailed controls;
- the command palette affordance is either real or removed;
- wizard status and streaming messages are understandable without internal knowledge.
At that point, the UI stops feeling like a well-built internal tool and starts reading like a finished product surface.