Skip to content

fix(web,desktop,mobile): QA sweep — naming, titlebar, nav, tooltips, terminal - #26

Merged
maarco merged 1 commit into
mainfrom
fix/qa-sweep
Aug 13, 2026
Merged

fix(web,desktop,mobile): QA sweep — naming, titlebar, nav, tooltips, terminal#26
maarco merged 1 commit into
mainfrom
fix/qa-sweep

Conversation

@maarco

@maarco maarco commented Aug 13, 2026

Copy link
Copy Markdown
Owner

QA pass over the running desktop app. One commit rather than several: the pre-commit hook re-stages the whole working tree, so splitting by concern was not achievable without disabling it.

Branding

(Alpha) dropped from the product name across desktop, web and mobile. Renaming the bundle moves Electron's userData directory, so legacyUserDataDirName becomes a list (T3 Code (Alpha), Marcode (Alpha)) probed concurrently — probing sequentially added enough filesystem latency for Electron's ready event to beat protocol.registerSchemesAsPrivileged, crashing the packaged app on launch. Mocked filesystems make sequential and concurrent probes indistinguishable, which is why the suite could not see it.

Titlebar

Settings and usage rendered their breadcrumb under the macOS traffic lights. Two causes: the inset class keys off a data-sidebar-state ancestor and Marcode mounts no sidebar there; and --workspace-titlebar-content-left was declared only on the sidebar wrapper. Variable moves to :root, sidebarless surfaces get an unconditional inset.

Navigation

  • Removes the dead /settings/beta entry (upstream deleted that page with sidebar v2).
  • Moves Pull Requests from Settings into the home category — getActiveCategory already resolved the route there, so the wrong pill highlighted. Usage stays under Settings.
  • Pill could run past the window edge: no-scrollbar was referenced twice and defined nowhere, and the cap was a flat max-w-[100vw]. Cap now derives from the pill's own dock offset and scale, on both axes.

Tooltips

14 icon-only controls across the pill nav, pull-request surfaces and usage page had no hover description.

Open-in picker

Popover used Base UI's default closeDelay of 0, so the pointer could not cross the trigger gap. Rows gained the watermark treatment from PillNavCard.

Terminal

xterm.js was imported without its stylesheet, anywhere. The rule hiding .xterm-char-measure-element never applied, so xterm's char-width scratchpad rendered its 32-repeat probe strings as visible text above the first prompt — the reported 333...MMM garbage. Never terminal data, which is why the PTY, sanitiser, history files and websocket frames were all clean. Separately, trimBufferToBytes was UTF-8-safe but ANSI-blind and could cut mid-sequence; now cuts only at escape-sequence boundaries.

Typography

10 text classes reconciled to Marcode's scale. Four trace to upstream commits that merged cleanly and were never reconciled.

Also adds .marcode to .gitignore — only upstream's .t3 was listed.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EwikZhkf3NAa9KQkULRSre

…terminal

One commit rather than several: the pre-commit hook re-stages the whole
working tree, so splitting these by concern was not achievable without
disabling it.

Branding — "(Alpha)" dropped from the product name across desktop, web and
mobile. An empty stage label now renders the bare name; mobile shows the
stage as a separate badge, so there it hides the badge instead. Renaming the
bundle moves Electron's userData directory, so legacyUserDataDirName becomes
a list with "Marcode (Alpha)" alongside "T3 Code (Alpha)", oldest first.
Candidates are probed concurrently — probing sequentially added enough
filesystem latency for Electron's ready event to beat
protocol.registerSchemesAsPrivileged, crashing the packaged app on launch.
Mocked filesystems make sequential and concurrent probes indistinguishable,
which is why the suite could not see it. Also collapses a duplicate
stage-label branch in mobile's BrandMark that labelled nightly builds
"Preview" while the shared helper called the same build "Nightly".

Titlebar — settings and usage rendered their breadcrumb under the macOS
traffic lights. Two causes: the inset class keys off a `data-sidebar-state`
ancestor, and Marcode mounts no sidebar on those routes; and
--workspace-titlebar-content-left was declared only on the sidebar wrapper,
so it would not have resolved even if the selector matched. The variable
moves to :root (`.wco` also lands there, so its override still feeds the
calc) and sidebarless surfaces get an unconditional inset.

Navigation — removes the /settings/beta entry, dead since upstream deleted
that page when sidebar v2 became the default. Moves Pull Requests from
Settings into the home category: it is a destination, not a preference, and
getActiveCategory already resolved the route there, so the wrong pill
highlighted. Usage stays under Settings. The pill could also run past the
window edge — `no-scrollbar` was referenced in two places and defined
nowhere, leaving a raw scrollbar visible, and the width cap was a flat
max-w-[100vw] with no margin. The cap is now derived from the pill's own dock
offset and scale, and the same unguarded overflow on the vertical dock axis
is fixed alongside.

Tooltips — 14 icon-only controls across the pill nav, the pull-request
surfaces and the usage page had no hover description. Includes
PullRequestReviewerPicker, where the disabled state carried a tooltip and the
enabled one did not.

Open-in picker — the popover used Base UI's default closeDelay of 0, so the
pointer could not cross the trigger gap before it dismissed. Now uses the
delay/closeDelay pair every sibling pill already uses. Rows gained the
oversized watermark treatment from PillNavCard, via a token colour so it
holds in both themes.

Terminal — xterm.js was imported without its stylesheet, anywhere. The rule
hiding `.xterm-char-measure-element` therefore never applied, and xterm's
char-width scratchpad rendered its 32-repeat probe strings as visible text
above the first prompt. That is the reported "333...MMM at terminal startup"
garbage: never terminal data, which is why the PTY, sanitiser, history files
and websocket frames were all clean. Separately, trimBufferToBytes was
UTF-8-safe but ANSI-blind and could cut mid-sequence; it now cuts only at
escape-sequence boundaries, found by scanning forward from a known-safe
anchor.

Typography — 10 text classes across the sidebar, chat, settings and clerk
surfaces reconciled to Marcode's scale. Four trace to upstream commits that
merged cleanly and were never reconciled; the rest are Marcode's own drift.
Deliberately untouched: the unified workspace tree's mono register, the
jump-hint badge tier, and the shadcn responsive `text-base sm:text-sm`
convention.

Also adds .marcode to .gitignore — the dev runner defaults worktree-local
state there and only upstream's `.t3` was listed, leaving it one `git add -A`
from being committed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EwikZhkf3NAa9KQkULRSre
@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL labels Aug 13, 2026
@github-actions

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 11.3 KiB 11.3 KiB −18 B (−0.2%) 15.1 KiB
Codex Thread snapshot wire 5.5 KiB 5.5 KiB +7 B (+0.1%) 7.3 KiB
Codex Live turn WebSocket wire 5.9 KiB 5.9 KiB −25 B (−0.4%) 7.8 KiB
Codex Live turn WebSocket decoded 49.7 KiB 49.7 KiB 0 B (0.0%) 66.4 KiB
Codex Live turn messages 16 16 0 (0.0%) 21
Claude Total thread wire 11.3 KiB 11.3 KiB +28 B (+0.2%) 15.1 KiB
Claude Thread snapshot wire 5.5 KiB 5.5 KiB +1 B (+0.0%) 7.3 KiB
Claude Live turn WebSocket wire 5.8 KiB 5.9 KiB +27 B (+0.5%) 7.8 KiB
Claude Live turn WebSocket decoded 50.6 KiB 50.6 KiB 0 B (0.0%) 66.4 KiB
Claude Live turn messages 16 16 0 (0.0%) 21

Baseline: 7c0314e · PR result: e25a4f2 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 94.6 KiB
  • Claude decoded thread snapshot: 95.4 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@maarco
maarco merged commit a13cd28 into main Aug 13, 2026
11 of 12 checks passed
maarco added a commit that referenced this pull request Aug 13, 2026
Brings the QA sweep (PR #26) and the sidebar thread de-duplication (PR #27)
under this sync so it can land on a main that already has them.

One conflict, in SidebarUpdatePill's release-notes heading. Both sides had
edited the same class list from a shared base of
`text-muted-foreground … font-semibold`: upstream promoted the colour to
`text-foreground`, Marcode had dropped the weight to `font-medium` for the
fork's type scale. Orthogonal edits, so both are kept.

Verified after resolving: repo-wide typecheck clean across all 15 packages,
and every suite green — web 2451, server 2465, desktop 447, client-runtime
612, mobile 657.

The sync also adds four dependencies (jszip, culori, @noble/hashes,
jsonc-parser) that infra/relay's new openVsxThemes/themePalette modules
import; `pnpm install` is required after pulling this or that package fails
to typecheck.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EwikZhkf3NAa9KQkULRSre
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant