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

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-actionsgithub-actionsBot 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.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB−18 B (−0.2%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB+7 B (+0.1%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB−25 B (−0.4%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB+28 B (+0.2%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB+1 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire5.8 KiB5.9 KiB+27 B (+0.5%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (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 mainAug 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XLvouch:trustedPR 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

@maarco
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
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

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-actionsgithub-actionsBot 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.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB−18 B (−0.2%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB+7 B (+0.1%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB−25 B (−0.4%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB+28 B (+0.2%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB+1 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire5.8 KiB5.9 KiB+27 B (+0.5%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (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 mainAug 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XLvouch:trustedPR 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

@maarco
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

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-actionsgithub-actionsBot 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.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB−18 B (−0.2%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB+7 B (+0.1%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB−25 B (−0.4%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB+28 B (+0.2%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB+1 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire5.8 KiB5.9 KiB+27 B (+0.5%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (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 mainAug 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XLvouch:trustedPR 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

@maarco
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

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-actionsgithub-actionsBot 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.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB−18 B (−0.2%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB+7 B (+0.1%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB−25 B (−0.4%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB+28 B (+0.2%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB+1 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire5.8 KiB5.9 KiB+27 B (+0.5%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (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 mainAug 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XLvouch:trustedPR 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

@maarco
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
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

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-actionsgithub-actionsBot 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.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB−18 B (−0.2%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB+7 B (+0.1%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB−25 B (−0.4%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB+28 B (+0.2%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB+1 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire5.8 KiB5.9 KiB+27 B (+0.5%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (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 mainAug 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XLvouch:trustedPR 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

@maarco
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

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-actionsgithub-actionsBot 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.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB−18 B (−0.2%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB+7 B (+0.1%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB−25 B (−0.4%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB+28 B (+0.2%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB+1 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire5.8 KiB5.9 KiB+27 B (+0.5%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (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 mainAug 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XLvouch:trustedPR 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

@maarco
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

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-actionsgithub-actionsBot 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.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB−18 B (−0.2%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB+7 B (+0.1%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB−25 B (−0.4%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB+28 B (+0.2%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB+1 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire5.8 KiB5.9 KiB+27 B (+0.5%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (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 mainAug 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XLvouch:trustedPR 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

@maarco
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
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

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-actionsgithub-actionsBot 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.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire11.3 KiB11.3 KiB−18 B (−0.2%)15.1 KiB
CodexThread snapshot wire5.5 KiB5.5 KiB+7 B (+0.1%)7.3 KiB
CodexLive turn WebSocket wire5.9 KiB5.9 KiB−25 B (−0.4%)7.8 KiB
CodexLive turn WebSocket decoded49.7 KiB49.7 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire11.3 KiB11.3 KiB+28 B (+0.2%)15.1 KiB
ClaudeThread snapshot wire5.5 KiB5.5 KiB+1 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire5.8 KiB5.9 KiB+27 B (+0.5%)7.8 KiB
ClaudeLive turn WebSocket decoded50.6 KiB50.6 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (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 mainAug 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XLvouch:trustedPR 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

@maarco