Audit: plain-language UI copy and names across every screen #860

Open
opened 2026-10-02 16:47:31 +00:00 by kayg · 7 comments
Owner

Read every user-visible string in apps/web/src and packages/ui/src (labels, buttons, toasts, empty states, errors, Settings section names, tooltips, aria-labels). Owner rules: no jargon in any UI label (CalDAV, WebDAV, IMAP, MCP, API, bearer, scope, proxy, sandbox, E2EE, index, projection, plugin only where unavoidable and then explained); normie-friendly privacy (protections are silent: no 'blocked' banners); Settings section names in Title Case; 'Connected Accounts' for provider sign-ins and 'Apps' for clients; never name third-party products in UI, code or comments. Example already found: App Passwords preset 'Photo upload · PhotoSync' and 'Send this in the Authorization header as a Bearer token' (#849). List each offending string with file:line and a proposed replacement; group per screen into issues.

Read-only job (LIGHT class)

This job runs at the lowest CPU priority on a shared, overloaded build host. Do not build or test: no cargo build/test/clippy/check, no bun install/build/test/run check, no servers, no browsers. Use rg, sed, git, scripts/fj, and reading. Write findings to audit-findings.md at the worktree root as you go (append per finding) and commit it on your branch. For each real defect: search existing issues first (scripts/fj --host https://git.kayg.org issue search --repo kayg/calternal "<terms>"), then either add evidence to the existing issue or create one self-contained issue (title, evidence with file:line, owner rule or DESIGN section, expected behaviour, test idea) that a later build job can own. Group findings that share one fix into one issue (one owner per shared fix). No product code changes. Post a summary with the list of issues on your own issue. Docs use ASD-STE100 Simplified Technical English.

Read every user-visible string in apps/web/src and packages/ui/src (labels, buttons, toasts, empty states, errors, Settings section names, tooltips, aria-labels). Owner rules: no jargon in any UI label (CalDAV, WebDAV, IMAP, MCP, API, bearer, scope, proxy, sandbox, E2EE, index, projection, plugin only where unavoidable and then explained); normie-friendly privacy (protections are silent: no 'blocked' banners); Settings section names in Title Case; 'Connected Accounts' for provider sign-ins and 'Apps' for clients; never name third-party products in UI, code or comments. Example already found: App Passwords preset 'Photo upload · PhotoSync' and 'Send this in the Authorization header as a Bearer token' (#849). List each offending string with file:line and a proposed replacement; group per screen into issues. ## Read-only job (LIGHT class) This job runs at the lowest CPU priority on a shared, overloaded build host. **Do not build or test**: no `cargo build/test/clippy/check`, no `bun install/build/test/run check`, no servers, no browsers. Use `rg`, `sed`, `git`, `scripts/fj`, and reading. Write findings to `audit-findings.md` at the worktree root as you go (append per finding) and commit it on your branch. For each real defect: search existing issues first (`scripts/fj --host https://git.kayg.org issue search --repo kayg/calternal "<terms>"`), then either add evidence to the existing issue or create one self-contained issue (title, evidence with file:line, owner rule or DESIGN section, expected behaviour, test idea) that a later build job can own. Group findings that share one fix into one issue (one owner per shared fix). No product code changes. Post a summary with the list of issues on your own issue. Docs use ASD-STE100 Simplified Technical English.
Author
Owner

Starting the read-only UI copy audit on branch job/copy-audit, based on dev at 440e19dce2.

Starting the read-only UI copy audit on branch job/copy-audit, based on dev at 440e19dce23040ac8ebaae88f0469b6535b1afcb.
Author
Owner

Copy audit #860 is complete.

  • Committed audit-findings.md on job/copy-audit: 2d17a226353607570ad31796b8f7b7fb3306667b.
  • Existing issues updated with evidence: #57, #407, #412, #474, #502, #542, #726, #837, #849, #863.
  • New issues filed for grouped fixes: #914, #919, #921, #922, #924, #925, #926, #927.
  • No product source files changed. This read-only audit records proposed replacements and evidence; it does not implement UI fixes.
  • Gate output: Not run. The LIGHT job forbids builds, tests, checks, servers and browsers. git diff --cached --check completed with no output. cargo clean output: Removed 1 file, 356B total. No web build output directories were present.
  • Known gaps: no rendered screenshots, runtime checks, performance profile or adversarial round were run, as required by the read-only job constraints.
  • Decisions outside DESIGN: none implemented. Copy proposals follow the 2026-10-02 owner rules for plain language, Settings naming and silent privacy protections.
Copy audit #860 is complete. - Committed `audit-findings.md` on `job/copy-audit`: `2d17a226353607570ad31796b8f7b7fb3306667b`. - Existing issues updated with evidence: #57, #407, #412, #474, #502, #542, #726, #837, #849, #863. - New issues filed for grouped fixes: #914, #919, #921, #922, #924, #925, #926, #927. - No product source files changed. This read-only audit records proposed replacements and evidence; it does not implement UI fixes. - Gate output: Not run. The LIGHT job forbids builds, tests, checks, servers and browsers. `git diff --cached --check` completed with no output. `cargo clean` output: `Removed 1 file, 356B total`. No web build output directories were present. - Known gaps: no rendered screenshots, runtime checks, performance profile or adversarial round were run, as required by the read-only job constraints. - Decisions outside DESIGN: none implemented. Copy proposals follow the 2026-10-02 owner rules for plain language, Settings naming and silent privacy protections.
Author
Owner

Starting copy fixes for #914, #919, #921, #922, #924, #925, #926 and #927 on branch job/copyfix, based on c4faf184df.

Starting copy fixes for #914, #919, #921, #922, #924, #925, #926 and #927 on branch job/copyfix, based on c4faf184df726a9375ae0c13bdfb6018ac2cf57e.
Author
Owner

Finding for #914: the new plain Agent 1/Agent 2 names were mapped only when they began the request, so a request naming both choices was treated as a one-agent task. I now map plain agent names throughout the request before validation, and a focused regression test checks that the UI asks the User to choose one.

Finding for #914: the new plain Agent 1/Agent 2 names were mapped only when they began the request, so a request naming both choices was treated as a one-agent task. I now map plain agent names throughout the request before validation, and a focused regression test checks that the UI asks the User to choose one.
Author
Owner

Finding: two touched source comments still named the AI products in Settings navigation and transcript state. Replaced them with the User's saved sign-ins and Agent 2 item IDs; the API protocol IDs remain unchanged.

Finding: two touched source comments still named the AI products in Settings navigation and transcript state. Replaced them with the User's saved sign-ins and Agent 2 item IDs; the API protocol IDs remain unchanged.
Author
Owner

Implemented the #860 plain-language UI copy audit across AI, search, fonts, online photos, Features settings, passkeys, file-paste fallbacks, notifications, clipboard fallback, microphone access, and Money. Updated matching aria-labels, tooltips, tests, and affected e2e text. Agent 1/Agent 2 choices map to the existing backend agent IDs. Kept integration and API identifiers unchanged. Did not touch App Passwords photo preset (#849) or Mail HTML (#726).

Branch: job/copyfix
Base: c4faf184df
Head: 92ccb31176

Files: 49 files under apps/web/e2e, apps/web/src/lib, and apps/web/src/routes. git diff --check c4faf184df726a9375ae0c13bdfb6018ac2cf57..HEAD passed with no output. No Rust files changed, so Rust gates were not run.

Focused Vitest command: TMPDIR=<worktree>/target/tmp bunx vitest run <10 touched test files> --maxWorkers=2

Test Files 10 passed (10)
Tests 57 passed (57)
Start at 23:10:57
Duration 90.33s (transform 84%, environment 8%, import 4%, tests 2%, setup 1%)

Transform |component| transforming modules took 55.67s · 73% of tracked time, re-done on every run
persist transforms across runs with fsModuleCache: true
learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns

bun run check passed:

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

svelte-check found 0 errors and 0 warnings

Production web build passed (✓ built in 1m 39s; existing bundled use client directive warnings were emitted). cargo clean removed 7,237 files (4.6 GiB); web build output was deleted afterward.

UX gaps closed: synchronized visible copy, aria-labels and tooltips; updated affected text assertions; kept the backend agent mapping intact.
UX gaps left: the Admin passkey-link fallback screenshot could not be captured because the invite flow did not expose its link field, and a later fixture attempt lacked a local server binary. The Ask no-answer screen redirects when AI is disabled, and Calendar cannot be disabled for a User, so those requested review states were inaccessible. These are screenshot coverage gaps, not known UX defects.

Screenshots: macOS-emulated production build captures at 390, 820 and 1440 px in paper and tokyo-night themes. Four archives are attached:

Decisions where the design docs were silent: expose existing agents as the ordered plain labels “Agent 1” and “Agent 2” while mapping to current backend IDs; use “Sans” and generic “Online photos” / “Photo source” labels; retain internal integration and API identifiers. No API behavior changed.

Implemented the #860 plain-language UI copy audit across AI, search, fonts, online photos, Features settings, passkeys, file-paste fallbacks, notifications, clipboard fallback, microphone access, and Money. Updated matching aria-labels, tooltips, tests, and affected e2e text. Agent 1/Agent 2 choices map to the existing backend agent IDs. Kept integration and API identifiers unchanged. Did not touch App Passwords photo preset (#849) or Mail HTML (#726). Branch: job/copyfix Base: c4faf184df726a9375ae0c13bdfb6018ac2cf57 Head: 92ccb311764a4a84dcbf9bf92dd5cb45fc3ccf8d Files: 49 files under apps/web/e2e, apps/web/src/lib, and apps/web/src/routes. `git diff --check c4faf184df726a9375ae0c13bdfb6018ac2cf57..HEAD` passed with no output. No Rust files changed, so Rust gates were not run. Focused Vitest command: `TMPDIR=<worktree>/target/tmp bunx vitest run <10 touched test files> --maxWorkers=2` Test Files 10 passed (10) Tests 57 passed (57) Start at 23:10:57 Duration 90.33s (transform 84%, environment 8%, import 4%, tests 2%, setup 1%) Transform |component| transforming modules took 55.67s · 73% of tracked time, re-done on every run persist transforms across runs with fsModuleCache: true learn more: https://vitest.dev/guide/improving-performance#caching-between-reruns `bun run check` passed: $ node scripts/check-user-storage.mjs && node scripts/check-type-tokens.mjs && node scripts/check-motion-tokens.mjs && svelte-kit sync && svelte-check --tsconfig ./tsconfig.json User browser caches use userStorage; only documented device/public-link exceptions remain. Text sizes and UI shape values use shared role tokens. UI transitions and animation options use shared motion tokens or documented exceptions. Loading svelte-check in workspace: /home/kayg/Developer/calternal-wt/copyfix/apps/web Getting Svelte diagnostics... svelte-check found 0 errors and 0 warnings Production web build passed (`✓ built in 1m 39s`; existing bundled `use client` directive warnings were emitted). `cargo clean` removed 7,237 files (4.6 GiB); web build output was deleted afterward. UX gaps closed: synchronized visible copy, aria-labels and tooltips; updated affected text assertions; kept the backend agent mapping intact. UX gaps left: the Admin passkey-link fallback screenshot could not be captured because the invite flow did not expose its link field, and a later fixture attempt lacked a local server binary. The Ask no-answer screen redirects when AI is disabled, and Calendar cannot be disabled for a User, so those requested review states were inaccessible. These are screenshot coverage gaps, not known UX defects. Screenshots: macOS-emulated production build captures at 390, 820 and 1440 px in paper and tokyo-night themes. Four archives are attached: - Workflows (48 images): https://git.kayg.org/attachments/846aee58-2ce7-4619-b79b-0d488319488c - Settings and Files (54 images): https://git.kayg.org/attachments/d108f481-31bf-42dc-a52f-90dd16b85c88 - Device states (18 images): https://git.kayg.org/attachments/3a13680c-1c85-447a-8f2c-b17e5cefc7ae - Account and turn states (12 images): https://git.kayg.org/attachments/a5fecc1c-0eb0-4b7c-8c44-f80339a1c55f Decisions where the design docs were silent: expose existing agents as the ordered plain labels “Agent 1” and “Agent 2” while mapping to current backend IDs; use “Sans” and generic “Online photos” / “Photo source” labels; retain internal integration and API identifiers. No API behavior changed.
Author
Owner

Repair on job/copyfix (not pushed). The branch over-applied the product-name rule.

Clarified rule (owner, 2026-10-02): do not name competing apps (other notes, calendar, mail or photo apps) in UI, code or comments. Platform, OS, browser, protocol and client names that state technical facts stay. AI providers that the User connects and chooses (Claude, Codex) stay in the UI, because the User must tell them apart.

  • 5e2efaed9 fix(ai): restore Claude and Codex names and @provider commands. PROVIDER_LABEL is Claude/Codex again. > ask @claude / > ask @codex work as before (the Agent 1/Agent 2 alias parser is removed). The per-agent note and Files actions, the token setup help and the stream-format comments are back. Plain copy is kept for the start-failure errors, the Agents intro, the 503 messages and Title Case group names.
  • dd1f5195a fix(web): restore browser, platform, font and photo source facts. Passkey help and default passkey names name Safari, Chrome, Edge and Firefox again. Files paste toasts name Finder, Safari and Firefox again. Push setup names iPhone, iPad, Safari and iOS 16.4 again. The codec comment is back. "Google Sans" is the font name. Unsplash keeps its name, because the Unsplash API terms require the "Photo by X on Unsplash" credit.
  • Kept: Plugins → Features (#921), "turned off" copy, calm denied-permission copy (#925, #927), Title Case card names.

Gates: bun run check: 0 errors, 0 warnings. Focused Vitest (src/lib/ai, passkeys, recorder, push, fontsGroup, search access, settings sections): 11 files, 59 tests passed.

Repair on `job/copyfix` (not pushed). The branch over-applied the product-name rule. Clarified rule (owner, 2026-10-02): do not name competing apps (other notes, calendar, mail or photo apps) in UI, code or comments. Platform, OS, browser, protocol and client names that state technical facts stay. AI providers that the User connects and chooses (Claude, Codex) stay in the UI, because the User must tell them apart. - `5e2efaed9` fix(ai): restore Claude and Codex names and @provider commands. PROVIDER_LABEL is Claude/Codex again. `> ask @claude` / `> ask @codex` work as before (the Agent 1/Agent 2 alias parser is removed). The per-agent note and Files actions, the token setup help and the stream-format comments are back. Plain copy is kept for the start-failure errors, the Agents intro, the 503 messages and Title Case group names. - `dd1f5195a` fix(web): restore browser, platform, font and photo source facts. Passkey help and default passkey names name Safari, Chrome, Edge and Firefox again. Files paste toasts name Finder, Safari and Firefox again. Push setup names iPhone, iPad, Safari and iOS 16.4 again. The codec comment is back. "Google Sans" is the font name. Unsplash keeps its name, because the Unsplash API terms require the "Photo by X on Unsplash" credit. - Kept: Plugins → Features (#921), "turned off" copy, calm denied-permission copy (#925, #927), Title Case card names. Gates: `bun run check`: 0 errors, 0 warnings. Focused Vitest (`src/lib/ai`, passkeys, recorder, push, fontsGroup, search access, settings sections): 11 files, 59 tests passed.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal#860
No description provided.