chore(upstream): sync marcode through f2d5fc91 - #41

Closed
maarco wants to merge 26 commits into
mainfrom
claude/gracious-bohr-59mpva
Closed

chore(upstream): sync marcode through f2d5fc91#41
maarco wants to merge 26 commits into
mainfrom
claude/gracious-bohr-59mpva

Conversation

@maarco

Copy link
Copy Markdown
Owner

What Changed

Merges pingdotgg/t3code@f2d5fc91e3030e5c3956fdadc13e1eaa25bcabe3 (25 commits since 82b8a938) into main as a normal two-parent merge. Merge commit 8141f4d2; merge base 82b8a938.

Headline upstream work: macOS launchd support for the background service, browser tab mute, letter shortcuts on the right-panel surface dropdown, npx t3 triage, a settle-once rule for merged PRs, Clerk upgrades, and a batch of desktop fixes.

Conflicts resolved by hand (6)

PathDecision
apps/server/src/cli/connect.tsTook upstream's platform conditionals for the launchd flow; kept Marcode's product name in the strings.
apps/server/src/cli/service.tsSame, plus upstream's Linux with systemd, macOS with launchd support line.
apps/web/src/components/ChatView.tsxKept Marcode's slim ChatHeader (the action cluster is portaled into FloatingPillNav, panelLayoutControls is mounted at the workspace root). Upstream's changeRequestStatechangeRequest rename is taken where it matters — the settle memos. Seam comment added.
apps/web/src/components/chat/ChatHeader.tsxKept Marcode's slim cluster. The upstream hunks only add the thread action menu and inline rename Marcode deliberately does not mount here, so nothing upstream is dropped.
apps/web/src/components/RightPanelTabs.tsxTook the tab mute feature and the whole data-driven surface dropdown with shortcuts. Dropped only what addresses the retired right-panel file surfaces: the Files entry, copy-path, the Files icon, PierreEntryIcon.
packages/client-runtime/src/state/threadSettled.tsBoth sides changed the same rule. Upstream added a settle-once anchor; Marcode has a one-hour warm window. They guard different things, so both now apply, pinned by a new test.

Fork-boundary breaks that merged cleanly, with no conflict

These are the dangerous ones — each would have shipped silently broken.

  • bootService.ts — upstream's new launch agent exported T3CODE_HOME. resolveLauncherBaseDir only accepts MARCODE_HOME, so the macOS background service would have exited before starting a server. Also namespaced BOOT_SERVICE_LAUNCHD_LABEL to app.marcode.service for the same reason BOOT_SERVICE_UNIT_FILE is marcode.service: upstream's shared label would make a Marcode install and a T3 Code install fight over one LaunchAgent plist. T3_BOOT_SERVICE_UNIT stays upstream-shaped.
  • cli/triage.ts — the new triage command read T3CODE_HOME, so it would have collected the wrong machine's state.
  • bootService.test.ts — a new upstream assertion hardcoded systemctl --user disable --now t3code.service. Fixtures now derive from the exported constants.
  • RightPanelTabs.tsx — upstream's new addSurfaceActions array referenced props.filesAvailable, props.onAddFiles, and SURFACE_DISABLED_REASONS.files, none of which exist in Marcode.
  • .github/triage/PLAYBOOK.md + cli/triagePrompt.ts — the playbook told the agent to clone pingdotgg/t3codeat the user's release tag and file the issue there. Marcode tags do not exist upstream, so triage would have fetched the wrong source and misfiled every Marcode bug. Retargeted to maarco/marcode; the two copies stay byte-identical (a test enforces that). The t3 CLI name and npx t3 serve are unchanged.
  • docs/user/background-service.md — corrected the unit and plist paths in the new platform-support section.

Tests added so the next sync fails loudly

  • serviceLauncher.test.ts sweeps the whole server source for T3CODE_HOME reads.
  • bootService.test.ts pins the plist's MARCODE_HOME, the Marcode launchd label, and T3_BOOT_SERVICE_UNIT staying upstream-shaped.
  • threadSettled.test.ts pins that both the warm window and the settle-once anchor must clear before a terminal PR settles a thread.

Why

Scheduled upstream sync. It carries upstream's correctness, security, and platform work while preserving Marcode's product contracts — the floating pill nav, the slim chat header, the retired right-panel file surfaces, the service identity, and the MARCODE_* environment.

Two decisions worth a second look before this leaves draft:

  1. BOOT_SERVICE_LAUNCHD_LABEL renamed to app.marcode.service. Nobody has upstream's label installed yet (Marcode never shipped macOS launchd support), so there is no migration cost — but it is a product call, not a mechanical fix.
  2. Triage playbook retargeted to maarco/marcode. Leaving it would send Marcode users' bug reports to upstream and clone the wrong source; retargeting means the playbook prose is now Marcode-owned and future upstream edits to it will conflict. Both are one-commit reversible.

Coupled subtrees: pnpm-workspace.yaml moved only Clerk versions — effect and alchemy are unchanged, so no .repos sync is needed. infra/relay/package.json is untouched.

UI Changes

Two user-visible upstream surfaces land here — the browser tab mute control and the letter shortcuts on the right-panel surface dropdown — both taken as upstream wrote them. No screenshots yet: this sync was verified with focused tests and typechecks, not a live client pass. Worth driving the right panel at 390px and 820px before marking ready.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Verification run

Focused tests for every touched area (server CLI, boot service, git, service launcher; client-runtime settle rules; web right panel, command palette, preview, thread status, git actions; desktop window, preview, lifecycle, app identity; mobile thread list; contracts settings; upstream-sync tooling) — all green. Typecheck clean on t3, @t3tools/web, @t3tools/contracts, @t3tools/shared, @t3tools/desktop. vp fmt --check and vp lint clean on the changed scope. The full suite is CI's job.


Generated by Claude Code

aorightand others added 26 commits August 18, 2026 13:38
…in GitHubPullRequestCli (pingdotgg#7385)
Signed-off-by: aoright <102943475+aoright@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…t full speed (pingdotgg#7460)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…nt (pingdotgg#6563)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6286)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
25 upstream commits since 82b8a93. Six conflicts, all resolved by hand.
Conflicts
- apps/server/src/cli/connect.ts, apps/server/src/cli/service.ts: upstream added
macOS launchd support and split every service string on platform. Took the
platform conditionals, kept Marcode's product name in all six strings, and
took upstream's "Linux with systemd, macOS with launchd" support line.
- apps/web/src/components/ChatView.tsx: upstream renamed the ChatHeader prop
changeRequestState -> changeRequest and passes the full action cluster there.
Marcode's slim header stays (the cluster is portaled into FloatingPillNav and
panelLayoutControls is mounted at the workspace root); the rename is taken
where it actually matters, in the settle memos above. Seam comment added.
- apps/web/src/components/chat/ChatHeader.tsx: kept Marcode's slim cluster. The
upstream hunks only add the thread action menu and inline rename that Marcode
deliberately does not mount here, so no upstream fix is dropped.
- apps/web/src/components/RightPanelTabs.tsx: took upstream's tab mute feature
and the whole data-driven surface dropdown with letter shortcuts. Dropped only
the parts that address the retired right-panel file surfaces: the Files entry,
the copy-path menu action, the Files icon, and PierreEntryIcon.
- packages/client-runtime/src/state/threadSettled.ts: both sides changed the
same rule. Upstream added a settle-once anchor (a terminal PR settles a thread
only while it postdates every user-initiated event); Marcode has a one-hour
warm window. They guard different things, so both now apply and a new test
pins the combination.
Fork-boundary breaks that merged cleanly, with no conflict
- apps/server/src/cloud/bootService.ts: upstream's new launch agent exported
T3CODE_HOME. resolveLauncherBaseDir only accepts MARCODE_HOME, so the macOS
background service would have exited before starting a server. Also
namespaced BOOT_SERVICE_LAUNCHD_LABEL to app.marcode.service for the same
reason BOOT_SERVICE_UNIT_FILE is marcode.service: upstream's shared label
would make a Marcode install and a T3 Code install fight over one plist.
T3_BOOT_SERVICE_UNIT stays upstream-shaped.
- apps/server/src/cli/triage.ts: the new triage command read T3CODE_HOME, so it
would have collected the wrong machine's state on Marcode.
- apps/server/src/cloud/bootService.test.ts: a new upstream assertion hardcoded
"systemctl --user disable --now t3code.service". Fixtures now derive from the
exported constants.
- apps/web/src/components/RightPanelTabs.tsx: upstream's new addSurfaceActions
array referenced props.filesAvailable, props.onAddFiles, and
SURFACE_DISABLED_REASONS.files, none of which exist in Marcode.
- .github/triage/PLAYBOOK.md and apps/server/src/cli/triagePrompt.ts: the
playbook told the agent to clone pingdotgg/t3code at the user's release tag
and file the issue there. Marcode tags do not exist upstream, so triage would
have fetched the wrong source. Retargeted to maarco/marcode; the two copies
stay byte-identical. The `t3` CLI name and `npx t3 serve` are unchanged.
- docs/user/background-service.md: corrected the unit and plist paths the new
platform-support section names.
Tests added to make the next sync fail loudly
- serviceLauncher.test.ts sweeps the server source for T3CODE_HOME reads.
- bootService.test.ts pins the plist's MARCODE_HOME, the Marcode launchd label,
and T3_BOOT_SERVICE_UNIT staying upstream-shaped.
- threadSettled.test.ts pins that both the warm window and the settle-once
anchor must clear before a terminal PR settles a thread.
Coupled subtrees: pnpm-workspace.yaml moved only Clerk versions; effect and
alchemy are unchanged, so no .repos sync is needed.
Verified: focused tests for every touched area (server CLI/boot service/git,
client-runtime settle rules, web right panel/command palette/preview, desktop
window/preview/lifecycle, mobile thread list, contracts settings, sync tooling)
plus typecheck on t3, web, contracts, shared, desktop, and fmt/lint on the
changed scope. The full suite is CI's job.
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Aug 19, 2026
@github-actions

github-actionsBot commented Aug 19, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire12.6 KiB12.6 KiB+1 B (+0.0%)15.1 KiB
CodexThread snapshot wire6.3 KiB6.3 KiB−3 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire6.3 KiB6.3 KiB+4 B (+0.1%)7.8 KiB
CodexLive turn WebSocket decoded51.8 KiB51.8 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire12.6 KiB12.6 KiB−4 B (−0.0%)15.1 KiB
ClaudeThread snapshot wire6.3 KiB6.3 KiB+2 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.3 KiB−6 B (−0.1%)7.8 KiB
ClaudeLive turn WebSocket decoded52.7 KiB52.7 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 2ffb140 · PR result: 8141f4d · 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: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

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

@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Test is blocked by the runner's apt mirror, not by this diff

Test was cancelled twice on 8141f4d2 — once on the original run, once on a re-run. Both died at the identical point, and neither ever started the suite.

Root cause. The test job carries timeout-minutes: 10 (.github/workflows/ci.yml:63). The step before the suite is:

- name: Install workspace search dependencyrun: sudo apt-get update && sudo apt-get install --yes ripgrep

apt-get update stalls on an unreachable azure.archive.ubuntu.com and burns the whole budget:

runlast apt linecancelledsilent for
9613053812815:47:5115:56:338m42s
9613407801915:59:0416:07:468m42s
Ign:2 http://azure.archive.ubuntu.com/ubuntu noble InRelease
Ign:3 http://azure.archive.ubuntu.com/ubuntu noble-updates InRelease
...
##[error]The operation was canceled.

vp run test never runs, which is also why the thread-transfer bot reported no result for 8141f4d.

Why it isn't this PR. The merge touches no workflow file (git diff HEAD^1 HEAD -- .github/workflows/ is empty); the apt step and the 10-minute timeout both predate it on main. main is green, including run 32219065865 on 2ffb1404 — this PR's exact merge base. The other three required checks (Check, Mobile Native Static Analysis, Release Smoke) are green on this head.

What I'm not doing. I've used my one re-run, and a workflow change is outside what this sync was asked to do — I'm not widening the PR to fix CI infrastructure. This is most likely a transient regional mirror outage that a later run clears on its own.

Proposed patch, if it recurs — belongs in its own PR, not this one:

- name: Install workspace search dependencyrun: | command -v rg >/dev/null && exit 0 sudo apt-get -o Acquire::Retries=2 -o Acquire::http::Timeout=15 update sudo apt-get install --yes ripgrep

Skips apt entirely when rg is already on the image, and bounds the network wait so a dead mirror can't consume the job's timeout.

This PR stays draft regardless — it carries two fork-boundary decisions flagged in the description that want a human call before it goes ready.


Generated by Claude Code

@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Correction: Test is green — the mirror recovered

Superseding my previous comment. Test passed on a later run of the same head 8141f4d2 (06:39:11Z → 06:48:19Z, 9m08s). The transfer-budget report also updated in place with a real result for 8141f4d and no ceiling regressions.

That confirms the earlier diagnosis: a transient azure.archive.ubuntu.com outage, not the diff. Nothing was changed to fix it.

All four required checks are now green on 8141f4d2:

CheckResult
Check
Test
Mobile Native Static Analysis
Release Smoke

The proposed hardening of the ripgrep step still stands on its own merits — a nine-minute apt stall came within 52 seconds of the job timeout even on the run that succeeded — but it is not blocking anything here and belongs in its own PR.

Still deliberately draft. Two things want a human call before this goes ready:

  1. The two fork-boundary decisions in the description (app.marcode.service label, triage playbook retargeted to maarco/marcode).
  2. No live client pass was run. Browser tab mute and the surface-dropdown shortcuts are user-visible, so the right panel is worth driving at 390px and 820px.

Generated by Claude Code

@maarcoChatGPT Codex Connector

Copy link
Copy Markdown
OwnerAuthor

Superseded by PR #51, the newer upstream sync through f035a0f4, which has now merged to main. Closing this older draft to keep the sync queue clean.

@maarcomaarco closed this Aug 25, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXLvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

14 participants

@maarco@aoright@gbarros-dev@Bil0000@Rishet11@StiensWout@AugusDogus@tarik02@gsimone@t3dotgg@chrisdeeming@inayayousfi@RakshithBhat03@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} 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

chore(upstream): sync marcode through f2d5fc91 - #41

Closed
maarco wants to merge 26 commits into
mainfrom
claude/gracious-bohr-59mpva
Closed

chore(upstream): sync marcode through f2d5fc91#41
maarco wants to merge 26 commits into
mainfrom
claude/gracious-bohr-59mpva

Conversation

@maarco

Copy link
Copy Markdown
Owner

What Changed

Merges pingdotgg/t3code@f2d5fc91e3030e5c3956fdadc13e1eaa25bcabe3 (25 commits since 82b8a938) into main as a normal two-parent merge. Merge commit 8141f4d2; merge base 82b8a938.

Headline upstream work: macOS launchd support for the background service, browser tab mute, letter shortcuts on the right-panel surface dropdown, npx t3 triage, a settle-once rule for merged PRs, Clerk upgrades, and a batch of desktop fixes.

Conflicts resolved by hand (6)

PathDecision
apps/server/src/cli/connect.tsTook upstream's platform conditionals for the launchd flow; kept Marcode's product name in the strings.
apps/server/src/cli/service.tsSame, plus upstream's Linux with systemd, macOS with launchd support line.
apps/web/src/components/ChatView.tsxKept Marcode's slim ChatHeader (the action cluster is portaled into FloatingPillNav, panelLayoutControls is mounted at the workspace root). Upstream's changeRequestStatechangeRequest rename is taken where it matters — the settle memos. Seam comment added.
apps/web/src/components/chat/ChatHeader.tsxKept Marcode's slim cluster. The upstream hunks only add the thread action menu and inline rename Marcode deliberately does not mount here, so nothing upstream is dropped.
apps/web/src/components/RightPanelTabs.tsxTook the tab mute feature and the whole data-driven surface dropdown with shortcuts. Dropped only what addresses the retired right-panel file surfaces: the Files entry, copy-path, the Files icon, PierreEntryIcon.
packages/client-runtime/src/state/threadSettled.tsBoth sides changed the same rule. Upstream added a settle-once anchor; Marcode has a one-hour warm window. They guard different things, so both now apply, pinned by a new test.

Fork-boundary breaks that merged cleanly, with no conflict

These are the dangerous ones — each would have shipped silently broken.

  • bootService.ts — upstream's new launch agent exported T3CODE_HOME. resolveLauncherBaseDir only accepts MARCODE_HOME, so the macOS background service would have exited before starting a server. Also namespaced BOOT_SERVICE_LAUNCHD_LABEL to app.marcode.service for the same reason BOOT_SERVICE_UNIT_FILE is marcode.service: upstream's shared label would make a Marcode install and a T3 Code install fight over one LaunchAgent plist. T3_BOOT_SERVICE_UNIT stays upstream-shaped.
  • cli/triage.ts — the new triage command read T3CODE_HOME, so it would have collected the wrong machine's state.
  • bootService.test.ts — a new upstream assertion hardcoded systemctl --user disable --now t3code.service. Fixtures now derive from the exported constants.
  • RightPanelTabs.tsx — upstream's new addSurfaceActions array referenced props.filesAvailable, props.onAddFiles, and SURFACE_DISABLED_REASONS.files, none of which exist in Marcode.
  • .github/triage/PLAYBOOK.md + cli/triagePrompt.ts — the playbook told the agent to clone pingdotgg/t3codeat the user's release tag and file the issue there. Marcode tags do not exist upstream, so triage would have fetched the wrong source and misfiled every Marcode bug. Retargeted to maarco/marcode; the two copies stay byte-identical (a test enforces that). The t3 CLI name and npx t3 serve are unchanged.
  • docs/user/background-service.md — corrected the unit and plist paths in the new platform-support section.

Tests added so the next sync fails loudly

  • serviceLauncher.test.ts sweeps the whole server source for T3CODE_HOME reads.
  • bootService.test.ts pins the plist's MARCODE_HOME, the Marcode launchd label, and T3_BOOT_SERVICE_UNIT staying upstream-shaped.
  • threadSettled.test.ts pins that both the warm window and the settle-once anchor must clear before a terminal PR settles a thread.

Why

Scheduled upstream sync. It carries upstream's correctness, security, and platform work while preserving Marcode's product contracts — the floating pill nav, the slim chat header, the retired right-panel file surfaces, the service identity, and the MARCODE_* environment.

Two decisions worth a second look before this leaves draft:

  1. BOOT_SERVICE_LAUNCHD_LABEL renamed to app.marcode.service. Nobody has upstream's label installed yet (Marcode never shipped macOS launchd support), so there is no migration cost — but it is a product call, not a mechanical fix.
  2. Triage playbook retargeted to maarco/marcode. Leaving it would send Marcode users' bug reports to upstream and clone the wrong source; retargeting means the playbook prose is now Marcode-owned and future upstream edits to it will conflict. Both are one-commit reversible.

Coupled subtrees: pnpm-workspace.yaml moved only Clerk versions — effect and alchemy are unchanged, so no .repos sync is needed. infra/relay/package.json is untouched.

UI Changes

Two user-visible upstream surfaces land here — the browser tab mute control and the letter shortcuts on the right-panel surface dropdown — both taken as upstream wrote them. No screenshots yet: this sync was verified with focused tests and typechecks, not a live client pass. Worth driving the right panel at 390px and 820px before marking ready.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Verification run

Focused tests for every touched area (server CLI, boot service, git, service launcher; client-runtime settle rules; web right panel, command palette, preview, thread status, git actions; desktop window, preview, lifecycle, app identity; mobile thread list; contracts settings; upstream-sync tooling) — all green. Typecheck clean on t3, @t3tools/web, @t3tools/contracts, @t3tools/shared, @t3tools/desktop. vp fmt --check and vp lint clean on the changed scope. The full suite is CI's job.


Generated by Claude Code

aorightand others added 26 commits August 18, 2026 13:38
…in GitHubPullRequestCli (pingdotgg#7385)
Signed-off-by: aoright <102943475+aoright@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…t full speed (pingdotgg#7460)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…nt (pingdotgg#6563)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6286)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
25 upstream commits since 82b8a93. Six conflicts, all resolved by hand.
Conflicts
- apps/server/src/cli/connect.ts, apps/server/src/cli/service.ts: upstream added
macOS launchd support and split every service string on platform. Took the
platform conditionals, kept Marcode's product name in all six strings, and
took upstream's "Linux with systemd, macOS with launchd" support line.
- apps/web/src/components/ChatView.tsx: upstream renamed the ChatHeader prop
changeRequestState -> changeRequest and passes the full action cluster there.
Marcode's slim header stays (the cluster is portaled into FloatingPillNav and
panelLayoutControls is mounted at the workspace root); the rename is taken
where it actually matters, in the settle memos above. Seam comment added.
- apps/web/src/components/chat/ChatHeader.tsx: kept Marcode's slim cluster. The
upstream hunks only add the thread action menu and inline rename that Marcode
deliberately does not mount here, so no upstream fix is dropped.
- apps/web/src/components/RightPanelTabs.tsx: took upstream's tab mute feature
and the whole data-driven surface dropdown with letter shortcuts. Dropped only
the parts that address the retired right-panel file surfaces: the Files entry,
the copy-path menu action, the Files icon, and PierreEntryIcon.
- packages/client-runtime/src/state/threadSettled.ts: both sides changed the
same rule. Upstream added a settle-once anchor (a terminal PR settles a thread
only while it postdates every user-initiated event); Marcode has a one-hour
warm window. They guard different things, so both now apply and a new test
pins the combination.
Fork-boundary breaks that merged cleanly, with no conflict
- apps/server/src/cloud/bootService.ts: upstream's new launch agent exported
T3CODE_HOME. resolveLauncherBaseDir only accepts MARCODE_HOME, so the macOS
background service would have exited before starting a server. Also
namespaced BOOT_SERVICE_LAUNCHD_LABEL to app.marcode.service for the same
reason BOOT_SERVICE_UNIT_FILE is marcode.service: upstream's shared label
would make a Marcode install and a T3 Code install fight over one plist.
T3_BOOT_SERVICE_UNIT stays upstream-shaped.
- apps/server/src/cli/triage.ts: the new triage command read T3CODE_HOME, so it
would have collected the wrong machine's state on Marcode.
- apps/server/src/cloud/bootService.test.ts: a new upstream assertion hardcoded
"systemctl --user disable --now t3code.service". Fixtures now derive from the
exported constants.
- apps/web/src/components/RightPanelTabs.tsx: upstream's new addSurfaceActions
array referenced props.filesAvailable, props.onAddFiles, and
SURFACE_DISABLED_REASONS.files, none of which exist in Marcode.
- .github/triage/PLAYBOOK.md and apps/server/src/cli/triagePrompt.ts: the
playbook told the agent to clone pingdotgg/t3code at the user's release tag
and file the issue there. Marcode tags do not exist upstream, so triage would
have fetched the wrong source. Retargeted to maarco/marcode; the two copies
stay byte-identical. The `t3` CLI name and `npx t3 serve` are unchanged.
- docs/user/background-service.md: corrected the unit and plist paths the new
platform-support section names.
Tests added to make the next sync fail loudly
- serviceLauncher.test.ts sweeps the server source for T3CODE_HOME reads.
- bootService.test.ts pins the plist's MARCODE_HOME, the Marcode launchd label,
and T3_BOOT_SERVICE_UNIT staying upstream-shaped.
- threadSettled.test.ts pins that both the warm window and the settle-once
anchor must clear before a terminal PR settles a thread.
Coupled subtrees: pnpm-workspace.yaml moved only Clerk versions; effect and
alchemy are unchanged, so no .repos sync is needed.
Verified: focused tests for every touched area (server CLI/boot service/git,
client-runtime settle rules, web right panel/command palette/preview, desktop
window/preview/lifecycle, mobile thread list, contracts settings, sync tooling)
plus typecheck on t3, web, contracts, shared, desktop, and fmt/lint on the
changed scope. The full suite is CI's job.
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Aug 19, 2026
@github-actions

github-actionsBot commented Aug 19, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire12.6 KiB12.6 KiB+1 B (+0.0%)15.1 KiB
CodexThread snapshot wire6.3 KiB6.3 KiB−3 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire6.3 KiB6.3 KiB+4 B (+0.1%)7.8 KiB
CodexLive turn WebSocket decoded51.8 KiB51.8 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire12.6 KiB12.6 KiB−4 B (−0.0%)15.1 KiB
ClaudeThread snapshot wire6.3 KiB6.3 KiB+2 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.3 KiB−6 B (−0.1%)7.8 KiB
ClaudeLive turn WebSocket decoded52.7 KiB52.7 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 2ffb140 · PR result: 8141f4d · 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: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

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

@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Test is blocked by the runner's apt mirror, not by this diff

Test was cancelled twice on 8141f4d2 — once on the original run, once on a re-run. Both died at the identical point, and neither ever started the suite.

Root cause. The test job carries timeout-minutes: 10 (.github/workflows/ci.yml:63). The step before the suite is:

- name: Install workspace search dependencyrun: sudo apt-get update && sudo apt-get install --yes ripgrep

apt-get update stalls on an unreachable azure.archive.ubuntu.com and burns the whole budget:

runlast apt linecancelledsilent for
9613053812815:47:5115:56:338m42s
9613407801915:59:0416:07:468m42s
Ign:2 http://azure.archive.ubuntu.com/ubuntu noble InRelease
Ign:3 http://azure.archive.ubuntu.com/ubuntu noble-updates InRelease
...
##[error]The operation was canceled.

vp run test never runs, which is also why the thread-transfer bot reported no result for 8141f4d.

Why it isn't this PR. The merge touches no workflow file (git diff HEAD^1 HEAD -- .github/workflows/ is empty); the apt step and the 10-minute timeout both predate it on main. main is green, including run 32219065865 on 2ffb1404 — this PR's exact merge base. The other three required checks (Check, Mobile Native Static Analysis, Release Smoke) are green on this head.

What I'm not doing. I've used my one re-run, and a workflow change is outside what this sync was asked to do — I'm not widening the PR to fix CI infrastructure. This is most likely a transient regional mirror outage that a later run clears on its own.

Proposed patch, if it recurs — belongs in its own PR, not this one:

- name: Install workspace search dependencyrun: | command -v rg >/dev/null && exit 0 sudo apt-get -o Acquire::Retries=2 -o Acquire::http::Timeout=15 update sudo apt-get install --yes ripgrep

Skips apt entirely when rg is already on the image, and bounds the network wait so a dead mirror can't consume the job's timeout.

This PR stays draft regardless — it carries two fork-boundary decisions flagged in the description that want a human call before it goes ready.


Generated by Claude Code

@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Correction: Test is green — the mirror recovered

Superseding my previous comment. Test passed on a later run of the same head 8141f4d2 (06:39:11Z → 06:48:19Z, 9m08s). The transfer-budget report also updated in place with a real result for 8141f4d and no ceiling regressions.

That confirms the earlier diagnosis: a transient azure.archive.ubuntu.com outage, not the diff. Nothing was changed to fix it.

All four required checks are now green on 8141f4d2:

CheckResult
Check
Test
Mobile Native Static Analysis
Release Smoke

The proposed hardening of the ripgrep step still stands on its own merits — a nine-minute apt stall came within 52 seconds of the job timeout even on the run that succeeded — but it is not blocking anything here and belongs in its own PR.

Still deliberately draft. Two things want a human call before this goes ready:

  1. The two fork-boundary decisions in the description (app.marcode.service label, triage playbook retargeted to maarco/marcode).
  2. No live client pass was run. Browser tab mute and the surface-dropdown shortcuts are user-visible, so the right panel is worth driving at 390px and 820px.

Generated by Claude Code

@maarcoChatGPT Codex Connector

Copy link
Copy Markdown
OwnerAuthor

Superseded by PR #51, the newer upstream sync through f035a0f4, which has now merged to main. Closing this older draft to keep the sync queue clean.

@maarcomaarco closed this Aug 25, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXLvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

14 participants

@maarco@aoright@gbarros-dev@Bil0000@Rishet11@StiensWout@AugusDogus@tarik02@gsimone@t3dotgg@chrisdeeming@inayayousfi@RakshithBhat03@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore(upstream): sync marcode through f2d5fc91 - #41

Closed
maarco wants to merge 26 commits into
mainfrom
claude/gracious-bohr-59mpva
Closed

chore(upstream): sync marcode through f2d5fc91#41
maarco wants to merge 26 commits into
mainfrom
claude/gracious-bohr-59mpva

Conversation

@maarco

Copy link
Copy Markdown
Owner

What Changed

Merges pingdotgg/t3code@f2d5fc91e3030e5c3956fdadc13e1eaa25bcabe3 (25 commits since 82b8a938) into main as a normal two-parent merge. Merge commit 8141f4d2; merge base 82b8a938.

Headline upstream work: macOS launchd support for the background service, browser tab mute, letter shortcuts on the right-panel surface dropdown, npx t3 triage, a settle-once rule for merged PRs, Clerk upgrades, and a batch of desktop fixes.

Conflicts resolved by hand (6)

PathDecision
apps/server/src/cli/connect.tsTook upstream's platform conditionals for the launchd flow; kept Marcode's product name in the strings.
apps/server/src/cli/service.tsSame, plus upstream's Linux with systemd, macOS with launchd support line.
apps/web/src/components/ChatView.tsxKept Marcode's slim ChatHeader (the action cluster is portaled into FloatingPillNav, panelLayoutControls is mounted at the workspace root). Upstream's changeRequestStatechangeRequest rename is taken where it matters — the settle memos. Seam comment added.
apps/web/src/components/chat/ChatHeader.tsxKept Marcode's slim cluster. The upstream hunks only add the thread action menu and inline rename Marcode deliberately does not mount here, so nothing upstream is dropped.
apps/web/src/components/RightPanelTabs.tsxTook the tab mute feature and the whole data-driven surface dropdown with shortcuts. Dropped only what addresses the retired right-panel file surfaces: the Files entry, copy-path, the Files icon, PierreEntryIcon.
packages/client-runtime/src/state/threadSettled.tsBoth sides changed the same rule. Upstream added a settle-once anchor; Marcode has a one-hour warm window. They guard different things, so both now apply, pinned by a new test.

Fork-boundary breaks that merged cleanly, with no conflict

These are the dangerous ones — each would have shipped silently broken.

  • bootService.ts — upstream's new launch agent exported T3CODE_HOME. resolveLauncherBaseDir only accepts MARCODE_HOME, so the macOS background service would have exited before starting a server. Also namespaced BOOT_SERVICE_LAUNCHD_LABEL to app.marcode.service for the same reason BOOT_SERVICE_UNIT_FILE is marcode.service: upstream's shared label would make a Marcode install and a T3 Code install fight over one LaunchAgent plist. T3_BOOT_SERVICE_UNIT stays upstream-shaped.
  • cli/triage.ts — the new triage command read T3CODE_HOME, so it would have collected the wrong machine's state.
  • bootService.test.ts — a new upstream assertion hardcoded systemctl --user disable --now t3code.service. Fixtures now derive from the exported constants.
  • RightPanelTabs.tsx — upstream's new addSurfaceActions array referenced props.filesAvailable, props.onAddFiles, and SURFACE_DISABLED_REASONS.files, none of which exist in Marcode.
  • .github/triage/PLAYBOOK.md + cli/triagePrompt.ts — the playbook told the agent to clone pingdotgg/t3codeat the user's release tag and file the issue there. Marcode tags do not exist upstream, so triage would have fetched the wrong source and misfiled every Marcode bug. Retargeted to maarco/marcode; the two copies stay byte-identical (a test enforces that). The t3 CLI name and npx t3 serve are unchanged.
  • docs/user/background-service.md — corrected the unit and plist paths in the new platform-support section.

Tests added so the next sync fails loudly

  • serviceLauncher.test.ts sweeps the whole server source for T3CODE_HOME reads.
  • bootService.test.ts pins the plist's MARCODE_HOME, the Marcode launchd label, and T3_BOOT_SERVICE_UNIT staying upstream-shaped.
  • threadSettled.test.ts pins that both the warm window and the settle-once anchor must clear before a terminal PR settles a thread.

Why

Scheduled upstream sync. It carries upstream's correctness, security, and platform work while preserving Marcode's product contracts — the floating pill nav, the slim chat header, the retired right-panel file surfaces, the service identity, and the MARCODE_* environment.

Two decisions worth a second look before this leaves draft:

  1. BOOT_SERVICE_LAUNCHD_LABEL renamed to app.marcode.service. Nobody has upstream's label installed yet (Marcode never shipped macOS launchd support), so there is no migration cost — but it is a product call, not a mechanical fix.
  2. Triage playbook retargeted to maarco/marcode. Leaving it would send Marcode users' bug reports to upstream and clone the wrong source; retargeting means the playbook prose is now Marcode-owned and future upstream edits to it will conflict. Both are one-commit reversible.

Coupled subtrees: pnpm-workspace.yaml moved only Clerk versions — effect and alchemy are unchanged, so no .repos sync is needed. infra/relay/package.json is untouched.

UI Changes

Two user-visible upstream surfaces land here — the browser tab mute control and the letter shortcuts on the right-panel surface dropdown — both taken as upstream wrote them. No screenshots yet: this sync was verified with focused tests and typechecks, not a live client pass. Worth driving the right panel at 390px and 820px before marking ready.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Verification run

Focused tests for every touched area (server CLI, boot service, git, service launcher; client-runtime settle rules; web right panel, command palette, preview, thread status, git actions; desktop window, preview, lifecycle, app identity; mobile thread list; contracts settings; upstream-sync tooling) — all green. Typecheck clean on t3, @t3tools/web, @t3tools/contracts, @t3tools/shared, @t3tools/desktop. vp fmt --check and vp lint clean on the changed scope. The full suite is CI's job.


Generated by Claude Code

aorightand others added 26 commits August 18, 2026 13:38
…in GitHubPullRequestCli (pingdotgg#7385)
Signed-off-by: aoright <102943475+aoright@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…t full speed (pingdotgg#7460)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…nt (pingdotgg#6563)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6286)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
25 upstream commits since 82b8a93. Six conflicts, all resolved by hand.
Conflicts
- apps/server/src/cli/connect.ts, apps/server/src/cli/service.ts: upstream added
macOS launchd support and split every service string on platform. Took the
platform conditionals, kept Marcode's product name in all six strings, and
took upstream's "Linux with systemd, macOS with launchd" support line.
- apps/web/src/components/ChatView.tsx: upstream renamed the ChatHeader prop
changeRequestState -> changeRequest and passes the full action cluster there.
Marcode's slim header stays (the cluster is portaled into FloatingPillNav and
panelLayoutControls is mounted at the workspace root); the rename is taken
where it actually matters, in the settle memos above. Seam comment added.
- apps/web/src/components/chat/ChatHeader.tsx: kept Marcode's slim cluster. The
upstream hunks only add the thread action menu and inline rename that Marcode
deliberately does not mount here, so no upstream fix is dropped.
- apps/web/src/components/RightPanelTabs.tsx: took upstream's tab mute feature
and the whole data-driven surface dropdown with letter shortcuts. Dropped only
the parts that address the retired right-panel file surfaces: the Files entry,
the copy-path menu action, the Files icon, and PierreEntryIcon.
- packages/client-runtime/src/state/threadSettled.ts: both sides changed the
same rule. Upstream added a settle-once anchor (a terminal PR settles a thread
only while it postdates every user-initiated event); Marcode has a one-hour
warm window. They guard different things, so both now apply and a new test
pins the combination.
Fork-boundary breaks that merged cleanly, with no conflict
- apps/server/src/cloud/bootService.ts: upstream's new launch agent exported
T3CODE_HOME. resolveLauncherBaseDir only accepts MARCODE_HOME, so the macOS
background service would have exited before starting a server. Also
namespaced BOOT_SERVICE_LAUNCHD_LABEL to app.marcode.service for the same
reason BOOT_SERVICE_UNIT_FILE is marcode.service: upstream's shared label
would make a Marcode install and a T3 Code install fight over one plist.
T3_BOOT_SERVICE_UNIT stays upstream-shaped.
- apps/server/src/cli/triage.ts: the new triage command read T3CODE_HOME, so it
would have collected the wrong machine's state on Marcode.
- apps/server/src/cloud/bootService.test.ts: a new upstream assertion hardcoded
"systemctl --user disable --now t3code.service". Fixtures now derive from the
exported constants.
- apps/web/src/components/RightPanelTabs.tsx: upstream's new addSurfaceActions
array referenced props.filesAvailable, props.onAddFiles, and
SURFACE_DISABLED_REASONS.files, none of which exist in Marcode.
- .github/triage/PLAYBOOK.md and apps/server/src/cli/triagePrompt.ts: the
playbook told the agent to clone pingdotgg/t3code at the user's release tag
and file the issue there. Marcode tags do not exist upstream, so triage would
have fetched the wrong source. Retargeted to maarco/marcode; the two copies
stay byte-identical. The `t3` CLI name and `npx t3 serve` are unchanged.
- docs/user/background-service.md: corrected the unit and plist paths the new
platform-support section names.
Tests added to make the next sync fail loudly
- serviceLauncher.test.ts sweeps the server source for T3CODE_HOME reads.
- bootService.test.ts pins the plist's MARCODE_HOME, the Marcode launchd label,
and T3_BOOT_SERVICE_UNIT staying upstream-shaped.
- threadSettled.test.ts pins that both the warm window and the settle-once
anchor must clear before a terminal PR settles a thread.
Coupled subtrees: pnpm-workspace.yaml moved only Clerk versions; effect and
alchemy are unchanged, so no .repos sync is needed.
Verified: focused tests for every touched area (server CLI/boot service/git,
client-runtime settle rules, web right panel/command palette/preview, desktop
window/preview/lifecycle, mobile thread list, contracts settings, sync tooling)
plus typecheck on t3, web, contracts, shared, desktop, and fmt/lint on the
changed scope. The full suite is CI's job.
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Aug 19, 2026
@github-actions

github-actionsBot commented Aug 19, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire12.6 KiB12.6 KiB+1 B (+0.0%)15.1 KiB
CodexThread snapshot wire6.3 KiB6.3 KiB−3 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire6.3 KiB6.3 KiB+4 B (+0.1%)7.8 KiB
CodexLive turn WebSocket decoded51.8 KiB51.8 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire12.6 KiB12.6 KiB−4 B (−0.0%)15.1 KiB
ClaudeThread snapshot wire6.3 KiB6.3 KiB+2 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.3 KiB−6 B (−0.1%)7.8 KiB
ClaudeLive turn WebSocket decoded52.7 KiB52.7 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 2ffb140 · PR result: 8141f4d · 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: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

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

@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Test is blocked by the runner's apt mirror, not by this diff

Test was cancelled twice on 8141f4d2 — once on the original run, once on a re-run. Both died at the identical point, and neither ever started the suite.

Root cause. The test job carries timeout-minutes: 10 (.github/workflows/ci.yml:63). The step before the suite is:

- name: Install workspace search dependencyrun: sudo apt-get update && sudo apt-get install --yes ripgrep

apt-get update stalls on an unreachable azure.archive.ubuntu.com and burns the whole budget:

runlast apt linecancelledsilent for
9613053812815:47:5115:56:338m42s
9613407801915:59:0416:07:468m42s
Ign:2 http://azure.archive.ubuntu.com/ubuntu noble InRelease
Ign:3 http://azure.archive.ubuntu.com/ubuntu noble-updates InRelease
...
##[error]The operation was canceled.

vp run test never runs, which is also why the thread-transfer bot reported no result for 8141f4d.

Why it isn't this PR. The merge touches no workflow file (git diff HEAD^1 HEAD -- .github/workflows/ is empty); the apt step and the 10-minute timeout both predate it on main. main is green, including run 32219065865 on 2ffb1404 — this PR's exact merge base. The other three required checks (Check, Mobile Native Static Analysis, Release Smoke) are green on this head.

What I'm not doing. I've used my one re-run, and a workflow change is outside what this sync was asked to do — I'm not widening the PR to fix CI infrastructure. This is most likely a transient regional mirror outage that a later run clears on its own.

Proposed patch, if it recurs — belongs in its own PR, not this one:

- name: Install workspace search dependencyrun: | command -v rg >/dev/null && exit 0 sudo apt-get -o Acquire::Retries=2 -o Acquire::http::Timeout=15 update sudo apt-get install --yes ripgrep

Skips apt entirely when rg is already on the image, and bounds the network wait so a dead mirror can't consume the job's timeout.

This PR stays draft regardless — it carries two fork-boundary decisions flagged in the description that want a human call before it goes ready.


Generated by Claude Code

@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Correction: Test is green — the mirror recovered

Superseding my previous comment. Test passed on a later run of the same head 8141f4d2 (06:39:11Z → 06:48:19Z, 9m08s). The transfer-budget report also updated in place with a real result for 8141f4d and no ceiling regressions.

That confirms the earlier diagnosis: a transient azure.archive.ubuntu.com outage, not the diff. Nothing was changed to fix it.

All four required checks are now green on 8141f4d2:

CheckResult
Check
Test
Mobile Native Static Analysis
Release Smoke

The proposed hardening of the ripgrep step still stands on its own merits — a nine-minute apt stall came within 52 seconds of the job timeout even on the run that succeeded — but it is not blocking anything here and belongs in its own PR.

Still deliberately draft. Two things want a human call before this goes ready:

  1. The two fork-boundary decisions in the description (app.marcode.service label, triage playbook retargeted to maarco/marcode).
  2. No live client pass was run. Browser tab mute and the surface-dropdown shortcuts are user-visible, so the right panel is worth driving at 390px and 820px.

Generated by Claude Code

@maarcoChatGPT Codex Connector

Copy link
Copy Markdown
OwnerAuthor

Superseded by PR #51, the newer upstream sync through f035a0f4, which has now merged to main. Closing this older draft to keep the sync queue clean.

@maarcomaarco closed this Aug 25, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXLvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

14 participants

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

chore(upstream): sync marcode through f2d5fc91 - #41

Closed
maarco wants to merge 26 commits into
mainfrom
claude/gracious-bohr-59mpva
Closed

chore(upstream): sync marcode through f2d5fc91#41
maarco wants to merge 26 commits into
mainfrom
claude/gracious-bohr-59mpva

Conversation

@maarco

Copy link
Copy Markdown
Owner

What Changed

Merges pingdotgg/t3code@f2d5fc91e3030e5c3956fdadc13e1eaa25bcabe3 (25 commits since 82b8a938) into main as a normal two-parent merge. Merge commit 8141f4d2; merge base 82b8a938.

Headline upstream work: macOS launchd support for the background service, browser tab mute, letter shortcuts on the right-panel surface dropdown, npx t3 triage, a settle-once rule for merged PRs, Clerk upgrades, and a batch of desktop fixes.

Conflicts resolved by hand (6)

PathDecision
apps/server/src/cli/connect.tsTook upstream's platform conditionals for the launchd flow; kept Marcode's product name in the strings.
apps/server/src/cli/service.tsSame, plus upstream's Linux with systemd, macOS with launchd support line.
apps/web/src/components/ChatView.tsxKept Marcode's slim ChatHeader (the action cluster is portaled into FloatingPillNav, panelLayoutControls is mounted at the workspace root). Upstream's changeRequestStatechangeRequest rename is taken where it matters — the settle memos. Seam comment added.
apps/web/src/components/chat/ChatHeader.tsxKept Marcode's slim cluster. The upstream hunks only add the thread action menu and inline rename Marcode deliberately does not mount here, so nothing upstream is dropped.
apps/web/src/components/RightPanelTabs.tsxTook the tab mute feature and the whole data-driven surface dropdown with shortcuts. Dropped only what addresses the retired right-panel file surfaces: the Files entry, copy-path, the Files icon, PierreEntryIcon.
packages/client-runtime/src/state/threadSettled.tsBoth sides changed the same rule. Upstream added a settle-once anchor; Marcode has a one-hour warm window. They guard different things, so both now apply, pinned by a new test.

Fork-boundary breaks that merged cleanly, with no conflict

These are the dangerous ones — each would have shipped silently broken.

  • bootService.ts — upstream's new launch agent exported T3CODE_HOME. resolveLauncherBaseDir only accepts MARCODE_HOME, so the macOS background service would have exited before starting a server. Also namespaced BOOT_SERVICE_LAUNCHD_LABEL to app.marcode.service for the same reason BOOT_SERVICE_UNIT_FILE is marcode.service: upstream's shared label would make a Marcode install and a T3 Code install fight over one LaunchAgent plist. T3_BOOT_SERVICE_UNIT stays upstream-shaped.
  • cli/triage.ts — the new triage command read T3CODE_HOME, so it would have collected the wrong machine's state.
  • bootService.test.ts — a new upstream assertion hardcoded systemctl --user disable --now t3code.service. Fixtures now derive from the exported constants.
  • RightPanelTabs.tsx — upstream's new addSurfaceActions array referenced props.filesAvailable, props.onAddFiles, and SURFACE_DISABLED_REASONS.files, none of which exist in Marcode.
  • .github/triage/PLAYBOOK.md + cli/triagePrompt.ts — the playbook told the agent to clone pingdotgg/t3codeat the user's release tag and file the issue there. Marcode tags do not exist upstream, so triage would have fetched the wrong source and misfiled every Marcode bug. Retargeted to maarco/marcode; the two copies stay byte-identical (a test enforces that). The t3 CLI name and npx t3 serve are unchanged.
  • docs/user/background-service.md — corrected the unit and plist paths in the new platform-support section.

Tests added so the next sync fails loudly

  • serviceLauncher.test.ts sweeps the whole server source for T3CODE_HOME reads.
  • bootService.test.ts pins the plist's MARCODE_HOME, the Marcode launchd label, and T3_BOOT_SERVICE_UNIT staying upstream-shaped.
  • threadSettled.test.ts pins that both the warm window and the settle-once anchor must clear before a terminal PR settles a thread.

Why

Scheduled upstream sync. It carries upstream's correctness, security, and platform work while preserving Marcode's product contracts — the floating pill nav, the slim chat header, the retired right-panel file surfaces, the service identity, and the MARCODE_* environment.

Two decisions worth a second look before this leaves draft:

  1. BOOT_SERVICE_LAUNCHD_LABEL renamed to app.marcode.service. Nobody has upstream's label installed yet (Marcode never shipped macOS launchd support), so there is no migration cost — but it is a product call, not a mechanical fix.
  2. Triage playbook retargeted to maarco/marcode. Leaving it would send Marcode users' bug reports to upstream and clone the wrong source; retargeting means the playbook prose is now Marcode-owned and future upstream edits to it will conflict. Both are one-commit reversible.

Coupled subtrees: pnpm-workspace.yaml moved only Clerk versions — effect and alchemy are unchanged, so no .repos sync is needed. infra/relay/package.json is untouched.

UI Changes

Two user-visible upstream surfaces land here — the browser tab mute control and the letter shortcuts on the right-panel surface dropdown — both taken as upstream wrote them. No screenshots yet: this sync was verified with focused tests and typechecks, not a live client pass. Worth driving the right panel at 390px and 820px before marking ready.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Verification run

Focused tests for every touched area (server CLI, boot service, git, service launcher; client-runtime settle rules; web right panel, command palette, preview, thread status, git actions; desktop window, preview, lifecycle, app identity; mobile thread list; contracts settings; upstream-sync tooling) — all green. Typecheck clean on t3, @t3tools/web, @t3tools/contracts, @t3tools/shared, @t3tools/desktop. vp fmt --check and vp lint clean on the changed scope. The full suite is CI's job.


Generated by Claude Code

aorightand others added 26 commits August 18, 2026 13:38
…in GitHubPullRequestCli (pingdotgg#7385)
Signed-off-by: aoright <102943475+aoright@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…t full speed (pingdotgg#7460)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…nt (pingdotgg#6563)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6286)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
25 upstream commits since 82b8a93. Six conflicts, all resolved by hand.
Conflicts
- apps/server/src/cli/connect.ts, apps/server/src/cli/service.ts: upstream added
macOS launchd support and split every service string on platform. Took the
platform conditionals, kept Marcode's product name in all six strings, and
took upstream's "Linux with systemd, macOS with launchd" support line.
- apps/web/src/components/ChatView.tsx: upstream renamed the ChatHeader prop
changeRequestState -> changeRequest and passes the full action cluster there.
Marcode's slim header stays (the cluster is portaled into FloatingPillNav and
panelLayoutControls is mounted at the workspace root); the rename is taken
where it actually matters, in the settle memos above. Seam comment added.
- apps/web/src/components/chat/ChatHeader.tsx: kept Marcode's slim cluster. The
upstream hunks only add the thread action menu and inline rename that Marcode
deliberately does not mount here, so no upstream fix is dropped.
- apps/web/src/components/RightPanelTabs.tsx: took upstream's tab mute feature
and the whole data-driven surface dropdown with letter shortcuts. Dropped only
the parts that address the retired right-panel file surfaces: the Files entry,
the copy-path menu action, the Files icon, and PierreEntryIcon.
- packages/client-runtime/src/state/threadSettled.ts: both sides changed the
same rule. Upstream added a settle-once anchor (a terminal PR settles a thread
only while it postdates every user-initiated event); Marcode has a one-hour
warm window. They guard different things, so both now apply and a new test
pins the combination.
Fork-boundary breaks that merged cleanly, with no conflict
- apps/server/src/cloud/bootService.ts: upstream's new launch agent exported
T3CODE_HOME. resolveLauncherBaseDir only accepts MARCODE_HOME, so the macOS
background service would have exited before starting a server. Also
namespaced BOOT_SERVICE_LAUNCHD_LABEL to app.marcode.service for the same
reason BOOT_SERVICE_UNIT_FILE is marcode.service: upstream's shared label
would make a Marcode install and a T3 Code install fight over one plist.
T3_BOOT_SERVICE_UNIT stays upstream-shaped.
- apps/server/src/cli/triage.ts: the new triage command read T3CODE_HOME, so it
would have collected the wrong machine's state on Marcode.
- apps/server/src/cloud/bootService.test.ts: a new upstream assertion hardcoded
"systemctl --user disable --now t3code.service". Fixtures now derive from the
exported constants.
- apps/web/src/components/RightPanelTabs.tsx: upstream's new addSurfaceActions
array referenced props.filesAvailable, props.onAddFiles, and
SURFACE_DISABLED_REASONS.files, none of which exist in Marcode.
- .github/triage/PLAYBOOK.md and apps/server/src/cli/triagePrompt.ts: the
playbook told the agent to clone pingdotgg/t3code at the user's release tag
and file the issue there. Marcode tags do not exist upstream, so triage would
have fetched the wrong source. Retargeted to maarco/marcode; the two copies
stay byte-identical. The `t3` CLI name and `npx t3 serve` are unchanged.
- docs/user/background-service.md: corrected the unit and plist paths the new
platform-support section names.
Tests added to make the next sync fail loudly
- serviceLauncher.test.ts sweeps the server source for T3CODE_HOME reads.
- bootService.test.ts pins the plist's MARCODE_HOME, the Marcode launchd label,
and T3_BOOT_SERVICE_UNIT staying upstream-shaped.
- threadSettled.test.ts pins that both the warm window and the settle-once
anchor must clear before a terminal PR settles a thread.
Coupled subtrees: pnpm-workspace.yaml moved only Clerk versions; effect and
alchemy are unchanged, so no .repos sync is needed.
Verified: focused tests for every touched area (server CLI/boot service/git,
client-runtime settle rules, web right panel/command palette/preview, desktop
window/preview/lifecycle, mobile thread list, contracts settings, sync tooling)
plus typecheck on t3, web, contracts, shared, desktop, and fmt/lint on the
changed scope. The full suite is CI's job.
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Aug 19, 2026
@github-actions

github-actionsBot commented Aug 19, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire12.6 KiB12.6 KiB+1 B (+0.0%)15.1 KiB
CodexThread snapshot wire6.3 KiB6.3 KiB−3 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire6.3 KiB6.3 KiB+4 B (+0.1%)7.8 KiB
CodexLive turn WebSocket decoded51.8 KiB51.8 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire12.6 KiB12.6 KiB−4 B (−0.0%)15.1 KiB
ClaudeThread snapshot wire6.3 KiB6.3 KiB+2 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.3 KiB−6 B (−0.1%)7.8 KiB
ClaudeLive turn WebSocket decoded52.7 KiB52.7 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 2ffb140 · PR result: 8141f4d · 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: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

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

@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Test is blocked by the runner's apt mirror, not by this diff

Test was cancelled twice on 8141f4d2 — once on the original run, once on a re-run. Both died at the identical point, and neither ever started the suite.

Root cause. The test job carries timeout-minutes: 10 (.github/workflows/ci.yml:63). The step before the suite is:

- name: Install workspace search dependencyrun: sudo apt-get update && sudo apt-get install --yes ripgrep

apt-get update stalls on an unreachable azure.archive.ubuntu.com and burns the whole budget:

runlast apt linecancelledsilent for
9613053812815:47:5115:56:338m42s
9613407801915:59:0416:07:468m42s
Ign:2 http://azure.archive.ubuntu.com/ubuntu noble InRelease
Ign:3 http://azure.archive.ubuntu.com/ubuntu noble-updates InRelease
...
##[error]The operation was canceled.

vp run test never runs, which is also why the thread-transfer bot reported no result for 8141f4d.

Why it isn't this PR. The merge touches no workflow file (git diff HEAD^1 HEAD -- .github/workflows/ is empty); the apt step and the 10-minute timeout both predate it on main. main is green, including run 32219065865 on 2ffb1404 — this PR's exact merge base. The other three required checks (Check, Mobile Native Static Analysis, Release Smoke) are green on this head.

What I'm not doing. I've used my one re-run, and a workflow change is outside what this sync was asked to do — I'm not widening the PR to fix CI infrastructure. This is most likely a transient regional mirror outage that a later run clears on its own.

Proposed patch, if it recurs — belongs in its own PR, not this one:

- name: Install workspace search dependencyrun: | command -v rg >/dev/null && exit 0 sudo apt-get -o Acquire::Retries=2 -o Acquire::http::Timeout=15 update sudo apt-get install --yes ripgrep

Skips apt entirely when rg is already on the image, and bounds the network wait so a dead mirror can't consume the job's timeout.

This PR stays draft regardless — it carries two fork-boundary decisions flagged in the description that want a human call before it goes ready.


Generated by Claude Code

@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Correction: Test is green — the mirror recovered

Superseding my previous comment. Test passed on a later run of the same head 8141f4d2 (06:39:11Z → 06:48:19Z, 9m08s). The transfer-budget report also updated in place with a real result for 8141f4d and no ceiling regressions.

That confirms the earlier diagnosis: a transient azure.archive.ubuntu.com outage, not the diff. Nothing was changed to fix it.

All four required checks are now green on 8141f4d2:

CheckResult
Check
Test
Mobile Native Static Analysis
Release Smoke

The proposed hardening of the ripgrep step still stands on its own merits — a nine-minute apt stall came within 52 seconds of the job timeout even on the run that succeeded — but it is not blocking anything here and belongs in its own PR.

Still deliberately draft. Two things want a human call before this goes ready:

  1. The two fork-boundary decisions in the description (app.marcode.service label, triage playbook retargeted to maarco/marcode).
  2. No live client pass was run. Browser tab mute and the surface-dropdown shortcuts are user-visible, so the right panel is worth driving at 390px and 820px.

Generated by Claude Code

@maarcoChatGPT Codex Connector

Copy link
Copy Markdown
OwnerAuthor

Superseded by PR #51, the newer upstream sync through f035a0f4, which has now merged to main. Closing this older draft to keep the sync queue clean.

@maarcomaarco closed this Aug 25, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXLvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

14 participants

@maarco@aoright@gbarros-dev@Bil0000@Rishet11@StiensWout@AugusDogus@tarik02@gsimone@t3dotgg@chrisdeeming@inayayousfi@RakshithBhat03@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } 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

chore(upstream): sync marcode through f2d5fc91 - #41

Closed
maarco wants to merge 26 commits into
mainfrom
claude/gracious-bohr-59mpva
Closed

chore(upstream): sync marcode through f2d5fc91#41
maarco wants to merge 26 commits into
mainfrom
claude/gracious-bohr-59mpva

Conversation

@maarco

Copy link
Copy Markdown
Owner

What Changed

Merges pingdotgg/t3code@f2d5fc91e3030e5c3956fdadc13e1eaa25bcabe3 (25 commits since 82b8a938) into main as a normal two-parent merge. Merge commit 8141f4d2; merge base 82b8a938.

Headline upstream work: macOS launchd support for the background service, browser tab mute, letter shortcuts on the right-panel surface dropdown, npx t3 triage, a settle-once rule for merged PRs, Clerk upgrades, and a batch of desktop fixes.

Conflicts resolved by hand (6)

PathDecision
apps/server/src/cli/connect.tsTook upstream's platform conditionals for the launchd flow; kept Marcode's product name in the strings.
apps/server/src/cli/service.tsSame, plus upstream's Linux with systemd, macOS with launchd support line.
apps/web/src/components/ChatView.tsxKept Marcode's slim ChatHeader (the action cluster is portaled into FloatingPillNav, panelLayoutControls is mounted at the workspace root). Upstream's changeRequestStatechangeRequest rename is taken where it matters — the settle memos. Seam comment added.
apps/web/src/components/chat/ChatHeader.tsxKept Marcode's slim cluster. The upstream hunks only add the thread action menu and inline rename Marcode deliberately does not mount here, so nothing upstream is dropped.
apps/web/src/components/RightPanelTabs.tsxTook the tab mute feature and the whole data-driven surface dropdown with shortcuts. Dropped only what addresses the retired right-panel file surfaces: the Files entry, copy-path, the Files icon, PierreEntryIcon.
packages/client-runtime/src/state/threadSettled.tsBoth sides changed the same rule. Upstream added a settle-once anchor; Marcode has a one-hour warm window. They guard different things, so both now apply, pinned by a new test.

Fork-boundary breaks that merged cleanly, with no conflict

These are the dangerous ones — each would have shipped silently broken.

  • bootService.ts — upstream's new launch agent exported T3CODE_HOME. resolveLauncherBaseDir only accepts MARCODE_HOME, so the macOS background service would have exited before starting a server. Also namespaced BOOT_SERVICE_LAUNCHD_LABEL to app.marcode.service for the same reason BOOT_SERVICE_UNIT_FILE is marcode.service: upstream's shared label would make a Marcode install and a T3 Code install fight over one LaunchAgent plist. T3_BOOT_SERVICE_UNIT stays upstream-shaped.
  • cli/triage.ts — the new triage command read T3CODE_HOME, so it would have collected the wrong machine's state.
  • bootService.test.ts — a new upstream assertion hardcoded systemctl --user disable --now t3code.service. Fixtures now derive from the exported constants.
  • RightPanelTabs.tsx — upstream's new addSurfaceActions array referenced props.filesAvailable, props.onAddFiles, and SURFACE_DISABLED_REASONS.files, none of which exist in Marcode.
  • .github/triage/PLAYBOOK.md + cli/triagePrompt.ts — the playbook told the agent to clone pingdotgg/t3codeat the user's release tag and file the issue there. Marcode tags do not exist upstream, so triage would have fetched the wrong source and misfiled every Marcode bug. Retargeted to maarco/marcode; the two copies stay byte-identical (a test enforces that). The t3 CLI name and npx t3 serve are unchanged.
  • docs/user/background-service.md — corrected the unit and plist paths in the new platform-support section.

Tests added so the next sync fails loudly

  • serviceLauncher.test.ts sweeps the whole server source for T3CODE_HOME reads.
  • bootService.test.ts pins the plist's MARCODE_HOME, the Marcode launchd label, and T3_BOOT_SERVICE_UNIT staying upstream-shaped.
  • threadSettled.test.ts pins that both the warm window and the settle-once anchor must clear before a terminal PR settles a thread.

Why

Scheduled upstream sync. It carries upstream's correctness, security, and platform work while preserving Marcode's product contracts — the floating pill nav, the slim chat header, the retired right-panel file surfaces, the service identity, and the MARCODE_* environment.

Two decisions worth a second look before this leaves draft:

  1. BOOT_SERVICE_LAUNCHD_LABEL renamed to app.marcode.service. Nobody has upstream's label installed yet (Marcode never shipped macOS launchd support), so there is no migration cost — but it is a product call, not a mechanical fix.
  2. Triage playbook retargeted to maarco/marcode. Leaving it would send Marcode users' bug reports to upstream and clone the wrong source; retargeting means the playbook prose is now Marcode-owned and future upstream edits to it will conflict. Both are one-commit reversible.

Coupled subtrees: pnpm-workspace.yaml moved only Clerk versions — effect and alchemy are unchanged, so no .repos sync is needed. infra/relay/package.json is untouched.

UI Changes

Two user-visible upstream surfaces land here — the browser tab mute control and the letter shortcuts on the right-panel surface dropdown — both taken as upstream wrote them. No screenshots yet: this sync was verified with focused tests and typechecks, not a live client pass. Worth driving the right panel at 390px and 820px before marking ready.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Verification run

Focused tests for every touched area (server CLI, boot service, git, service launcher; client-runtime settle rules; web right panel, command palette, preview, thread status, git actions; desktop window, preview, lifecycle, app identity; mobile thread list; contracts settings; upstream-sync tooling) — all green. Typecheck clean on t3, @t3tools/web, @t3tools/contracts, @t3tools/shared, @t3tools/desktop. vp fmt --check and vp lint clean on the changed scope. The full suite is CI's job.


Generated by Claude Code

aorightand others added 26 commits August 18, 2026 13:38
…in GitHubPullRequestCli (pingdotgg#7385)
Signed-off-by: aoright <102943475+aoright@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…t full speed (pingdotgg#7460)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…nt (pingdotgg#6563)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6286)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
25 upstream commits since 82b8a93. Six conflicts, all resolved by hand.
Conflicts
- apps/server/src/cli/connect.ts, apps/server/src/cli/service.ts: upstream added
macOS launchd support and split every service string on platform. Took the
platform conditionals, kept Marcode's product name in all six strings, and
took upstream's "Linux with systemd, macOS with launchd" support line.
- apps/web/src/components/ChatView.tsx: upstream renamed the ChatHeader prop
changeRequestState -> changeRequest and passes the full action cluster there.
Marcode's slim header stays (the cluster is portaled into FloatingPillNav and
panelLayoutControls is mounted at the workspace root); the rename is taken
where it actually matters, in the settle memos above. Seam comment added.
- apps/web/src/components/chat/ChatHeader.tsx: kept Marcode's slim cluster. The
upstream hunks only add the thread action menu and inline rename that Marcode
deliberately does not mount here, so no upstream fix is dropped.
- apps/web/src/components/RightPanelTabs.tsx: took upstream's tab mute feature
and the whole data-driven surface dropdown with letter shortcuts. Dropped only
the parts that address the retired right-panel file surfaces: the Files entry,
the copy-path menu action, the Files icon, and PierreEntryIcon.
- packages/client-runtime/src/state/threadSettled.ts: both sides changed the
same rule. Upstream added a settle-once anchor (a terminal PR settles a thread
only while it postdates every user-initiated event); Marcode has a one-hour
warm window. They guard different things, so both now apply and a new test
pins the combination.
Fork-boundary breaks that merged cleanly, with no conflict
- apps/server/src/cloud/bootService.ts: upstream's new launch agent exported
T3CODE_HOME. resolveLauncherBaseDir only accepts MARCODE_HOME, so the macOS
background service would have exited before starting a server. Also
namespaced BOOT_SERVICE_LAUNCHD_LABEL to app.marcode.service for the same
reason BOOT_SERVICE_UNIT_FILE is marcode.service: upstream's shared label
would make a Marcode install and a T3 Code install fight over one plist.
T3_BOOT_SERVICE_UNIT stays upstream-shaped.
- apps/server/src/cli/triage.ts: the new triage command read T3CODE_HOME, so it
would have collected the wrong machine's state on Marcode.
- apps/server/src/cloud/bootService.test.ts: a new upstream assertion hardcoded
"systemctl --user disable --now t3code.service". Fixtures now derive from the
exported constants.
- apps/web/src/components/RightPanelTabs.tsx: upstream's new addSurfaceActions
array referenced props.filesAvailable, props.onAddFiles, and
SURFACE_DISABLED_REASONS.files, none of which exist in Marcode.
- .github/triage/PLAYBOOK.md and apps/server/src/cli/triagePrompt.ts: the
playbook told the agent to clone pingdotgg/t3code at the user's release tag
and file the issue there. Marcode tags do not exist upstream, so triage would
have fetched the wrong source. Retargeted to maarco/marcode; the two copies
stay byte-identical. The `t3` CLI name and `npx t3 serve` are unchanged.
- docs/user/background-service.md: corrected the unit and plist paths the new
platform-support section names.
Tests added to make the next sync fail loudly
- serviceLauncher.test.ts sweeps the server source for T3CODE_HOME reads.
- bootService.test.ts pins the plist's MARCODE_HOME, the Marcode launchd label,
and T3_BOOT_SERVICE_UNIT staying upstream-shaped.
- threadSettled.test.ts pins that both the warm window and the settle-once
anchor must clear before a terminal PR settles a thread.
Coupled subtrees: pnpm-workspace.yaml moved only Clerk versions; effect and
alchemy are unchanged, so no .repos sync is needed.
Verified: focused tests for every touched area (server CLI/boot service/git,
client-runtime settle rules, web right panel/command palette/preview, desktop
window/preview/lifecycle, mobile thread list, contracts settings, sync tooling)
plus typecheck on t3, web, contracts, shared, desktop, and fmt/lint on the
changed scope. The full suite is CI's job.
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Aug 19, 2026
@github-actions

github-actionsBot commented Aug 19, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire12.6 KiB12.6 KiB+1 B (+0.0%)15.1 KiB
CodexThread snapshot wire6.3 KiB6.3 KiB−3 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire6.3 KiB6.3 KiB+4 B (+0.1%)7.8 KiB
CodexLive turn WebSocket decoded51.8 KiB51.8 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire12.6 KiB12.6 KiB−4 B (−0.0%)15.1 KiB
ClaudeThread snapshot wire6.3 KiB6.3 KiB+2 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.3 KiB−6 B (−0.1%)7.8 KiB
ClaudeLive turn WebSocket decoded52.7 KiB52.7 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 2ffb140 · PR result: 8141f4d · 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: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

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

@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Test is blocked by the runner's apt mirror, not by this diff

Test was cancelled twice on 8141f4d2 — once on the original run, once on a re-run. Both died at the identical point, and neither ever started the suite.

Root cause. The test job carries timeout-minutes: 10 (.github/workflows/ci.yml:63). The step before the suite is:

- name: Install workspace search dependencyrun: sudo apt-get update && sudo apt-get install --yes ripgrep

apt-get update stalls on an unreachable azure.archive.ubuntu.com and burns the whole budget:

runlast apt linecancelledsilent for
9613053812815:47:5115:56:338m42s
9613407801915:59:0416:07:468m42s
Ign:2 http://azure.archive.ubuntu.com/ubuntu noble InRelease
Ign:3 http://azure.archive.ubuntu.com/ubuntu noble-updates InRelease
...
##[error]The operation was canceled.

vp run test never runs, which is also why the thread-transfer bot reported no result for 8141f4d.

Why it isn't this PR. The merge touches no workflow file (git diff HEAD^1 HEAD -- .github/workflows/ is empty); the apt step and the 10-minute timeout both predate it on main. main is green, including run 32219065865 on 2ffb1404 — this PR's exact merge base. The other three required checks (Check, Mobile Native Static Analysis, Release Smoke) are green on this head.

What I'm not doing. I've used my one re-run, and a workflow change is outside what this sync was asked to do — I'm not widening the PR to fix CI infrastructure. This is most likely a transient regional mirror outage that a later run clears on its own.

Proposed patch, if it recurs — belongs in its own PR, not this one:

- name: Install workspace search dependencyrun: | command -v rg >/dev/null && exit 0 sudo apt-get -o Acquire::Retries=2 -o Acquire::http::Timeout=15 update sudo apt-get install --yes ripgrep

Skips apt entirely when rg is already on the image, and bounds the network wait so a dead mirror can't consume the job's timeout.

This PR stays draft regardless — it carries two fork-boundary decisions flagged in the description that want a human call before it goes ready.


Generated by Claude Code

@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Correction: Test is green — the mirror recovered

Superseding my previous comment. Test passed on a later run of the same head 8141f4d2 (06:39:11Z → 06:48:19Z, 9m08s). The transfer-budget report also updated in place with a real result for 8141f4d and no ceiling regressions.

That confirms the earlier diagnosis: a transient azure.archive.ubuntu.com outage, not the diff. Nothing was changed to fix it.

All four required checks are now green on 8141f4d2:

CheckResult
Check
Test
Mobile Native Static Analysis
Release Smoke

The proposed hardening of the ripgrep step still stands on its own merits — a nine-minute apt stall came within 52 seconds of the job timeout even on the run that succeeded — but it is not blocking anything here and belongs in its own PR.

Still deliberately draft. Two things want a human call before this goes ready:

  1. The two fork-boundary decisions in the description (app.marcode.service label, triage playbook retargeted to maarco/marcode).
  2. No live client pass was run. Browser tab mute and the surface-dropdown shortcuts are user-visible, so the right panel is worth driving at 390px and 820px.

Generated by Claude Code

@maarcoChatGPT Codex Connector

Copy link
Copy Markdown
OwnerAuthor

Superseded by PR #51, the newer upstream sync through f035a0f4, which has now merged to main. Closing this older draft to keep the sync queue clean.

@maarcomaarco closed this Aug 25, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXLvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

14 participants

@maarco@aoright@gbarros-dev@Bil0000@Rishet11@StiensWout@AugusDogus@tarik02@gsimone@t3dotgg@chrisdeeming@inayayousfi@RakshithBhat03@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore(upstream): sync marcode through f2d5fc91 - #41

Closed
maarco wants to merge 26 commits into
mainfrom
claude/gracious-bohr-59mpva
Closed

chore(upstream): sync marcode through f2d5fc91#41
maarco wants to merge 26 commits into
mainfrom
claude/gracious-bohr-59mpva

Conversation

@maarco

Copy link
Copy Markdown
Owner

What Changed

Merges pingdotgg/t3code@f2d5fc91e3030e5c3956fdadc13e1eaa25bcabe3 (25 commits since 82b8a938) into main as a normal two-parent merge. Merge commit 8141f4d2; merge base 82b8a938.

Headline upstream work: macOS launchd support for the background service, browser tab mute, letter shortcuts on the right-panel surface dropdown, npx t3 triage, a settle-once rule for merged PRs, Clerk upgrades, and a batch of desktop fixes.

Conflicts resolved by hand (6)

PathDecision
apps/server/src/cli/connect.tsTook upstream's platform conditionals for the launchd flow; kept Marcode's product name in the strings.
apps/server/src/cli/service.tsSame, plus upstream's Linux with systemd, macOS with launchd support line.
apps/web/src/components/ChatView.tsxKept Marcode's slim ChatHeader (the action cluster is portaled into FloatingPillNav, panelLayoutControls is mounted at the workspace root). Upstream's changeRequestStatechangeRequest rename is taken where it matters — the settle memos. Seam comment added.
apps/web/src/components/chat/ChatHeader.tsxKept Marcode's slim cluster. The upstream hunks only add the thread action menu and inline rename Marcode deliberately does not mount here, so nothing upstream is dropped.
apps/web/src/components/RightPanelTabs.tsxTook the tab mute feature and the whole data-driven surface dropdown with shortcuts. Dropped only what addresses the retired right-panel file surfaces: the Files entry, copy-path, the Files icon, PierreEntryIcon.
packages/client-runtime/src/state/threadSettled.tsBoth sides changed the same rule. Upstream added a settle-once anchor; Marcode has a one-hour warm window. They guard different things, so both now apply, pinned by a new test.

Fork-boundary breaks that merged cleanly, with no conflict

These are the dangerous ones — each would have shipped silently broken.

  • bootService.ts — upstream's new launch agent exported T3CODE_HOME. resolveLauncherBaseDir only accepts MARCODE_HOME, so the macOS background service would have exited before starting a server. Also namespaced BOOT_SERVICE_LAUNCHD_LABEL to app.marcode.service for the same reason BOOT_SERVICE_UNIT_FILE is marcode.service: upstream's shared label would make a Marcode install and a T3 Code install fight over one LaunchAgent plist. T3_BOOT_SERVICE_UNIT stays upstream-shaped.
  • cli/triage.ts — the new triage command read T3CODE_HOME, so it would have collected the wrong machine's state.
  • bootService.test.ts — a new upstream assertion hardcoded systemctl --user disable --now t3code.service. Fixtures now derive from the exported constants.
  • RightPanelTabs.tsx — upstream's new addSurfaceActions array referenced props.filesAvailable, props.onAddFiles, and SURFACE_DISABLED_REASONS.files, none of which exist in Marcode.
  • .github/triage/PLAYBOOK.md + cli/triagePrompt.ts — the playbook told the agent to clone pingdotgg/t3codeat the user's release tag and file the issue there. Marcode tags do not exist upstream, so triage would have fetched the wrong source and misfiled every Marcode bug. Retargeted to maarco/marcode; the two copies stay byte-identical (a test enforces that). The t3 CLI name and npx t3 serve are unchanged.
  • docs/user/background-service.md — corrected the unit and plist paths in the new platform-support section.

Tests added so the next sync fails loudly

  • serviceLauncher.test.ts sweeps the whole server source for T3CODE_HOME reads.
  • bootService.test.ts pins the plist's MARCODE_HOME, the Marcode launchd label, and T3_BOOT_SERVICE_UNIT staying upstream-shaped.
  • threadSettled.test.ts pins that both the warm window and the settle-once anchor must clear before a terminal PR settles a thread.

Why

Scheduled upstream sync. It carries upstream's correctness, security, and platform work while preserving Marcode's product contracts — the floating pill nav, the slim chat header, the retired right-panel file surfaces, the service identity, and the MARCODE_* environment.

Two decisions worth a second look before this leaves draft:

  1. BOOT_SERVICE_LAUNCHD_LABEL renamed to app.marcode.service. Nobody has upstream's label installed yet (Marcode never shipped macOS launchd support), so there is no migration cost — but it is a product call, not a mechanical fix.
  2. Triage playbook retargeted to maarco/marcode. Leaving it would send Marcode users' bug reports to upstream and clone the wrong source; retargeting means the playbook prose is now Marcode-owned and future upstream edits to it will conflict. Both are one-commit reversible.

Coupled subtrees: pnpm-workspace.yaml moved only Clerk versions — effect and alchemy are unchanged, so no .repos sync is needed. infra/relay/package.json is untouched.

UI Changes

Two user-visible upstream surfaces land here — the browser tab mute control and the letter shortcuts on the right-panel surface dropdown — both taken as upstream wrote them. No screenshots yet: this sync was verified with focused tests and typechecks, not a live client pass. Worth driving the right panel at 390px and 820px before marking ready.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Verification run

Focused tests for every touched area (server CLI, boot service, git, service launcher; client-runtime settle rules; web right panel, command palette, preview, thread status, git actions; desktop window, preview, lifecycle, app identity; mobile thread list; contracts settings; upstream-sync tooling) — all green. Typecheck clean on t3, @t3tools/web, @t3tools/contracts, @t3tools/shared, @t3tools/desktop. vp fmt --check and vp lint clean on the changed scope. The full suite is CI's job.


Generated by Claude Code

aorightand others added 26 commits August 18, 2026 13:38
…in GitHubPullRequestCli (pingdotgg#7385)
Signed-off-by: aoright <102943475+aoright@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…t full speed (pingdotgg#7460)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…nt (pingdotgg#6563)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6286)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
25 upstream commits since 82b8a93. Six conflicts, all resolved by hand.
Conflicts
- apps/server/src/cli/connect.ts, apps/server/src/cli/service.ts: upstream added
macOS launchd support and split every service string on platform. Took the
platform conditionals, kept Marcode's product name in all six strings, and
took upstream's "Linux with systemd, macOS with launchd" support line.
- apps/web/src/components/ChatView.tsx: upstream renamed the ChatHeader prop
changeRequestState -> changeRequest and passes the full action cluster there.
Marcode's slim header stays (the cluster is portaled into FloatingPillNav and
panelLayoutControls is mounted at the workspace root); the rename is taken
where it actually matters, in the settle memos above. Seam comment added.
- apps/web/src/components/chat/ChatHeader.tsx: kept Marcode's slim cluster. The
upstream hunks only add the thread action menu and inline rename that Marcode
deliberately does not mount here, so no upstream fix is dropped.
- apps/web/src/components/RightPanelTabs.tsx: took upstream's tab mute feature
and the whole data-driven surface dropdown with letter shortcuts. Dropped only
the parts that address the retired right-panel file surfaces: the Files entry,
the copy-path menu action, the Files icon, and PierreEntryIcon.
- packages/client-runtime/src/state/threadSettled.ts: both sides changed the
same rule. Upstream added a settle-once anchor (a terminal PR settles a thread
only while it postdates every user-initiated event); Marcode has a one-hour
warm window. They guard different things, so both now apply and a new test
pins the combination.
Fork-boundary breaks that merged cleanly, with no conflict
- apps/server/src/cloud/bootService.ts: upstream's new launch agent exported
T3CODE_HOME. resolveLauncherBaseDir only accepts MARCODE_HOME, so the macOS
background service would have exited before starting a server. Also
namespaced BOOT_SERVICE_LAUNCHD_LABEL to app.marcode.service for the same
reason BOOT_SERVICE_UNIT_FILE is marcode.service: upstream's shared label
would make a Marcode install and a T3 Code install fight over one plist.
T3_BOOT_SERVICE_UNIT stays upstream-shaped.
- apps/server/src/cli/triage.ts: the new triage command read T3CODE_HOME, so it
would have collected the wrong machine's state on Marcode.
- apps/server/src/cloud/bootService.test.ts: a new upstream assertion hardcoded
"systemctl --user disable --now t3code.service". Fixtures now derive from the
exported constants.
- apps/web/src/components/RightPanelTabs.tsx: upstream's new addSurfaceActions
array referenced props.filesAvailable, props.onAddFiles, and
SURFACE_DISABLED_REASONS.files, none of which exist in Marcode.
- .github/triage/PLAYBOOK.md and apps/server/src/cli/triagePrompt.ts: the
playbook told the agent to clone pingdotgg/t3code at the user's release tag
and file the issue there. Marcode tags do not exist upstream, so triage would
have fetched the wrong source. Retargeted to maarco/marcode; the two copies
stay byte-identical. The `t3` CLI name and `npx t3 serve` are unchanged.
- docs/user/background-service.md: corrected the unit and plist paths the new
platform-support section names.
Tests added to make the next sync fail loudly
- serviceLauncher.test.ts sweeps the server source for T3CODE_HOME reads.
- bootService.test.ts pins the plist's MARCODE_HOME, the Marcode launchd label,
and T3_BOOT_SERVICE_UNIT staying upstream-shaped.
- threadSettled.test.ts pins that both the warm window and the settle-once
anchor must clear before a terminal PR settles a thread.
Coupled subtrees: pnpm-workspace.yaml moved only Clerk versions; effect and
alchemy are unchanged, so no .repos sync is needed.
Verified: focused tests for every touched area (server CLI/boot service/git,
client-runtime settle rules, web right panel/command palette/preview, desktop
window/preview/lifecycle, mobile thread list, contracts settings, sync tooling)
plus typecheck on t3, web, contracts, shared, desktop, and fmt/lint on the
changed scope. The full suite is CI's job.
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Aug 19, 2026
@github-actions

github-actionsBot commented Aug 19, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire12.6 KiB12.6 KiB+1 B (+0.0%)15.1 KiB
CodexThread snapshot wire6.3 KiB6.3 KiB−3 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire6.3 KiB6.3 KiB+4 B (+0.1%)7.8 KiB
CodexLive turn WebSocket decoded51.8 KiB51.8 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire12.6 KiB12.6 KiB−4 B (−0.0%)15.1 KiB
ClaudeThread snapshot wire6.3 KiB6.3 KiB+2 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.3 KiB−6 B (−0.1%)7.8 KiB
ClaudeLive turn WebSocket decoded52.7 KiB52.7 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 2ffb140 · PR result: 8141f4d · 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: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

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

@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Test is blocked by the runner's apt mirror, not by this diff

Test was cancelled twice on 8141f4d2 — once on the original run, once on a re-run. Both died at the identical point, and neither ever started the suite.

Root cause. The test job carries timeout-minutes: 10 (.github/workflows/ci.yml:63). The step before the suite is:

- name: Install workspace search dependencyrun: sudo apt-get update && sudo apt-get install --yes ripgrep

apt-get update stalls on an unreachable azure.archive.ubuntu.com and burns the whole budget:

runlast apt linecancelledsilent for
9613053812815:47:5115:56:338m42s
9613407801915:59:0416:07:468m42s
Ign:2 http://azure.archive.ubuntu.com/ubuntu noble InRelease
Ign:3 http://azure.archive.ubuntu.com/ubuntu noble-updates InRelease
...
##[error]The operation was canceled.

vp run test never runs, which is also why the thread-transfer bot reported no result for 8141f4d.

Why it isn't this PR. The merge touches no workflow file (git diff HEAD^1 HEAD -- .github/workflows/ is empty); the apt step and the 10-minute timeout both predate it on main. main is green, including run 32219065865 on 2ffb1404 — this PR's exact merge base. The other three required checks (Check, Mobile Native Static Analysis, Release Smoke) are green on this head.

What I'm not doing. I've used my one re-run, and a workflow change is outside what this sync was asked to do — I'm not widening the PR to fix CI infrastructure. This is most likely a transient regional mirror outage that a later run clears on its own.

Proposed patch, if it recurs — belongs in its own PR, not this one:

- name: Install workspace search dependencyrun: | command -v rg >/dev/null && exit 0 sudo apt-get -o Acquire::Retries=2 -o Acquire::http::Timeout=15 update sudo apt-get install --yes ripgrep

Skips apt entirely when rg is already on the image, and bounds the network wait so a dead mirror can't consume the job's timeout.

This PR stays draft regardless — it carries two fork-boundary decisions flagged in the description that want a human call before it goes ready.


Generated by Claude Code

@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Correction: Test is green — the mirror recovered

Superseding my previous comment. Test passed on a later run of the same head 8141f4d2 (06:39:11Z → 06:48:19Z, 9m08s). The transfer-budget report also updated in place with a real result for 8141f4d and no ceiling regressions.

That confirms the earlier diagnosis: a transient azure.archive.ubuntu.com outage, not the diff. Nothing was changed to fix it.

All four required checks are now green on 8141f4d2:

CheckResult
Check
Test
Mobile Native Static Analysis
Release Smoke

The proposed hardening of the ripgrep step still stands on its own merits — a nine-minute apt stall came within 52 seconds of the job timeout even on the run that succeeded — but it is not blocking anything here and belongs in its own PR.

Still deliberately draft. Two things want a human call before this goes ready:

  1. The two fork-boundary decisions in the description (app.marcode.service label, triage playbook retargeted to maarco/marcode).
  2. No live client pass was run. Browser tab mute and the surface-dropdown shortcuts are user-visible, so the right panel is worth driving at 390px and 820px.

Generated by Claude Code

@maarcoChatGPT Codex Connector

Copy link
Copy Markdown
OwnerAuthor

Superseded by PR #51, the newer upstream sync through f035a0f4, which has now merged to main. Closing this older draft to keep the sync queue clean.

@maarcomaarco closed this Aug 25, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXLvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

14 participants

@maarco@aoright@gbarros-dev@Bil0000@Rishet11@StiensWout@AugusDogus@tarik02@gsimone@t3dotgg@chrisdeeming@inayayousfi@RakshithBhat03@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

chore(upstream): sync marcode through f2d5fc91 - #41

Closed
maarco wants to merge 26 commits into
mainfrom
claude/gracious-bohr-59mpva
Closed

chore(upstream): sync marcode through f2d5fc91#41
maarco wants to merge 26 commits into
mainfrom
claude/gracious-bohr-59mpva

Conversation

@maarco

Copy link
Copy Markdown
Owner

What Changed

Merges pingdotgg/t3code@f2d5fc91e3030e5c3956fdadc13e1eaa25bcabe3 (25 commits since 82b8a938) into main as a normal two-parent merge. Merge commit 8141f4d2; merge base 82b8a938.

Headline upstream work: macOS launchd support for the background service, browser tab mute, letter shortcuts on the right-panel surface dropdown, npx t3 triage, a settle-once rule for merged PRs, Clerk upgrades, and a batch of desktop fixes.

Conflicts resolved by hand (6)

PathDecision
apps/server/src/cli/connect.tsTook upstream's platform conditionals for the launchd flow; kept Marcode's product name in the strings.
apps/server/src/cli/service.tsSame, plus upstream's Linux with systemd, macOS with launchd support line.
apps/web/src/components/ChatView.tsxKept Marcode's slim ChatHeader (the action cluster is portaled into FloatingPillNav, panelLayoutControls is mounted at the workspace root). Upstream's changeRequestStatechangeRequest rename is taken where it matters — the settle memos. Seam comment added.
apps/web/src/components/chat/ChatHeader.tsxKept Marcode's slim cluster. The upstream hunks only add the thread action menu and inline rename Marcode deliberately does not mount here, so nothing upstream is dropped.
apps/web/src/components/RightPanelTabs.tsxTook the tab mute feature and the whole data-driven surface dropdown with shortcuts. Dropped only what addresses the retired right-panel file surfaces: the Files entry, copy-path, the Files icon, PierreEntryIcon.
packages/client-runtime/src/state/threadSettled.tsBoth sides changed the same rule. Upstream added a settle-once anchor; Marcode has a one-hour warm window. They guard different things, so both now apply, pinned by a new test.

Fork-boundary breaks that merged cleanly, with no conflict

These are the dangerous ones — each would have shipped silently broken.

  • bootService.ts — upstream's new launch agent exported T3CODE_HOME. resolveLauncherBaseDir only accepts MARCODE_HOME, so the macOS background service would have exited before starting a server. Also namespaced BOOT_SERVICE_LAUNCHD_LABEL to app.marcode.service for the same reason BOOT_SERVICE_UNIT_FILE is marcode.service: upstream's shared label would make a Marcode install and a T3 Code install fight over one LaunchAgent plist. T3_BOOT_SERVICE_UNIT stays upstream-shaped.
  • cli/triage.ts — the new triage command read T3CODE_HOME, so it would have collected the wrong machine's state.
  • bootService.test.ts — a new upstream assertion hardcoded systemctl --user disable --now t3code.service. Fixtures now derive from the exported constants.
  • RightPanelTabs.tsx — upstream's new addSurfaceActions array referenced props.filesAvailable, props.onAddFiles, and SURFACE_DISABLED_REASONS.files, none of which exist in Marcode.
  • .github/triage/PLAYBOOK.md + cli/triagePrompt.ts — the playbook told the agent to clone pingdotgg/t3codeat the user's release tag and file the issue there. Marcode tags do not exist upstream, so triage would have fetched the wrong source and misfiled every Marcode bug. Retargeted to maarco/marcode; the two copies stay byte-identical (a test enforces that). The t3 CLI name and npx t3 serve are unchanged.
  • docs/user/background-service.md — corrected the unit and plist paths in the new platform-support section.

Tests added so the next sync fails loudly

  • serviceLauncher.test.ts sweeps the whole server source for T3CODE_HOME reads.
  • bootService.test.ts pins the plist's MARCODE_HOME, the Marcode launchd label, and T3_BOOT_SERVICE_UNIT staying upstream-shaped.
  • threadSettled.test.ts pins that both the warm window and the settle-once anchor must clear before a terminal PR settles a thread.

Why

Scheduled upstream sync. It carries upstream's correctness, security, and platform work while preserving Marcode's product contracts — the floating pill nav, the slim chat header, the retired right-panel file surfaces, the service identity, and the MARCODE_* environment.

Two decisions worth a second look before this leaves draft:

  1. BOOT_SERVICE_LAUNCHD_LABEL renamed to app.marcode.service. Nobody has upstream's label installed yet (Marcode never shipped macOS launchd support), so there is no migration cost — but it is a product call, not a mechanical fix.
  2. Triage playbook retargeted to maarco/marcode. Leaving it would send Marcode users' bug reports to upstream and clone the wrong source; retargeting means the playbook prose is now Marcode-owned and future upstream edits to it will conflict. Both are one-commit reversible.

Coupled subtrees: pnpm-workspace.yaml moved only Clerk versions — effect and alchemy are unchanged, so no .repos sync is needed. infra/relay/package.json is untouched.

UI Changes

Two user-visible upstream surfaces land here — the browser tab mute control and the letter shortcuts on the right-panel surface dropdown — both taken as upstream wrote them. No screenshots yet: this sync was verified with focused tests and typechecks, not a live client pass. Worth driving the right panel at 390px and 820px before marking ready.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Verification run

Focused tests for every touched area (server CLI, boot service, git, service launcher; client-runtime settle rules; web right panel, command palette, preview, thread status, git actions; desktop window, preview, lifecycle, app identity; mobile thread list; contracts settings; upstream-sync tooling) — all green. Typecheck clean on t3, @t3tools/web, @t3tools/contracts, @t3tools/shared, @t3tools/desktop. vp fmt --check and vp lint clean on the changed scope. The full suite is CI's job.


Generated by Claude Code

aorightand others added 26 commits August 18, 2026 13:38
…in GitHubPullRequestCli (pingdotgg#7385)
Signed-off-by: aoright <102943475+aoright@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…t full speed (pingdotgg#7460)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…nt (pingdotgg#6563)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6286)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
25 upstream commits since 82b8a93. Six conflicts, all resolved by hand.
Conflicts
- apps/server/src/cli/connect.ts, apps/server/src/cli/service.ts: upstream added
macOS launchd support and split every service string on platform. Took the
platform conditionals, kept Marcode's product name in all six strings, and
took upstream's "Linux with systemd, macOS with launchd" support line.
- apps/web/src/components/ChatView.tsx: upstream renamed the ChatHeader prop
changeRequestState -> changeRequest and passes the full action cluster there.
Marcode's slim header stays (the cluster is portaled into FloatingPillNav and
panelLayoutControls is mounted at the workspace root); the rename is taken
where it actually matters, in the settle memos above. Seam comment added.
- apps/web/src/components/chat/ChatHeader.tsx: kept Marcode's slim cluster. The
upstream hunks only add the thread action menu and inline rename that Marcode
deliberately does not mount here, so no upstream fix is dropped.
- apps/web/src/components/RightPanelTabs.tsx: took upstream's tab mute feature
and the whole data-driven surface dropdown with letter shortcuts. Dropped only
the parts that address the retired right-panel file surfaces: the Files entry,
the copy-path menu action, the Files icon, and PierreEntryIcon.
- packages/client-runtime/src/state/threadSettled.ts: both sides changed the
same rule. Upstream added a settle-once anchor (a terminal PR settles a thread
only while it postdates every user-initiated event); Marcode has a one-hour
warm window. They guard different things, so both now apply and a new test
pins the combination.
Fork-boundary breaks that merged cleanly, with no conflict
- apps/server/src/cloud/bootService.ts: upstream's new launch agent exported
T3CODE_HOME. resolveLauncherBaseDir only accepts MARCODE_HOME, so the macOS
background service would have exited before starting a server. Also
namespaced BOOT_SERVICE_LAUNCHD_LABEL to app.marcode.service for the same
reason BOOT_SERVICE_UNIT_FILE is marcode.service: upstream's shared label
would make a Marcode install and a T3 Code install fight over one plist.
T3_BOOT_SERVICE_UNIT stays upstream-shaped.
- apps/server/src/cli/triage.ts: the new triage command read T3CODE_HOME, so it
would have collected the wrong machine's state on Marcode.
- apps/server/src/cloud/bootService.test.ts: a new upstream assertion hardcoded
"systemctl --user disable --now t3code.service". Fixtures now derive from the
exported constants.
- apps/web/src/components/RightPanelTabs.tsx: upstream's new addSurfaceActions
array referenced props.filesAvailable, props.onAddFiles, and
SURFACE_DISABLED_REASONS.files, none of which exist in Marcode.
- .github/triage/PLAYBOOK.md and apps/server/src/cli/triagePrompt.ts: the
playbook told the agent to clone pingdotgg/t3code at the user's release tag
and file the issue there. Marcode tags do not exist upstream, so triage would
have fetched the wrong source. Retargeted to maarco/marcode; the two copies
stay byte-identical. The `t3` CLI name and `npx t3 serve` are unchanged.
- docs/user/background-service.md: corrected the unit and plist paths the new
platform-support section names.
Tests added to make the next sync fail loudly
- serviceLauncher.test.ts sweeps the server source for T3CODE_HOME reads.
- bootService.test.ts pins the plist's MARCODE_HOME, the Marcode launchd label,
and T3_BOOT_SERVICE_UNIT staying upstream-shaped.
- threadSettled.test.ts pins that both the warm window and the settle-once
anchor must clear before a terminal PR settles a thread.
Coupled subtrees: pnpm-workspace.yaml moved only Clerk versions; effect and
alchemy are unchanged, so no .repos sync is needed.
Verified: focused tests for every touched area (server CLI/boot service/git,
client-runtime settle rules, web right panel/command palette/preview, desktop
window/preview/lifecycle, mobile thread list, contracts settings, sync tooling)
plus typecheck on t3, web, contracts, shared, desktop, and fmt/lint on the
changed scope. The full suite is CI's job.
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Aug 19, 2026
@github-actions

github-actionsBot commented Aug 19, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire12.6 KiB12.6 KiB+1 B (+0.0%)15.1 KiB
CodexThread snapshot wire6.3 KiB6.3 KiB−3 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire6.3 KiB6.3 KiB+4 B (+0.1%)7.8 KiB
CodexLive turn WebSocket decoded51.8 KiB51.8 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire12.6 KiB12.6 KiB−4 B (−0.0%)15.1 KiB
ClaudeThread snapshot wire6.3 KiB6.3 KiB+2 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.3 KiB−6 B (−0.1%)7.8 KiB
ClaudeLive turn WebSocket decoded52.7 KiB52.7 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 2ffb140 · PR result: 8141f4d · 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: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

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

@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Test is blocked by the runner's apt mirror, not by this diff

Test was cancelled twice on 8141f4d2 — once on the original run, once on a re-run. Both died at the identical point, and neither ever started the suite.

Root cause. The test job carries timeout-minutes: 10 (.github/workflows/ci.yml:63). The step before the suite is:

- name: Install workspace search dependencyrun: sudo apt-get update && sudo apt-get install --yes ripgrep

apt-get update stalls on an unreachable azure.archive.ubuntu.com and burns the whole budget:

runlast apt linecancelledsilent for
9613053812815:47:5115:56:338m42s
9613407801915:59:0416:07:468m42s
Ign:2 http://azure.archive.ubuntu.com/ubuntu noble InRelease
Ign:3 http://azure.archive.ubuntu.com/ubuntu noble-updates InRelease
...
##[error]The operation was canceled.

vp run test never runs, which is also why the thread-transfer bot reported no result for 8141f4d.

Why it isn't this PR. The merge touches no workflow file (git diff HEAD^1 HEAD -- .github/workflows/ is empty); the apt step and the 10-minute timeout both predate it on main. main is green, including run 32219065865 on 2ffb1404 — this PR's exact merge base. The other three required checks (Check, Mobile Native Static Analysis, Release Smoke) are green on this head.

What I'm not doing. I've used my one re-run, and a workflow change is outside what this sync was asked to do — I'm not widening the PR to fix CI infrastructure. This is most likely a transient regional mirror outage that a later run clears on its own.

Proposed patch, if it recurs — belongs in its own PR, not this one:

- name: Install workspace search dependencyrun: | command -v rg >/dev/null && exit 0 sudo apt-get -o Acquire::Retries=2 -o Acquire::http::Timeout=15 update sudo apt-get install --yes ripgrep

Skips apt entirely when rg is already on the image, and bounds the network wait so a dead mirror can't consume the job's timeout.

This PR stays draft regardless — it carries two fork-boundary decisions flagged in the description that want a human call before it goes ready.


Generated by Claude Code

@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Correction: Test is green — the mirror recovered

Superseding my previous comment. Test passed on a later run of the same head 8141f4d2 (06:39:11Z → 06:48:19Z, 9m08s). The transfer-budget report also updated in place with a real result for 8141f4d and no ceiling regressions.

That confirms the earlier diagnosis: a transient azure.archive.ubuntu.com outage, not the diff. Nothing was changed to fix it.

All four required checks are now green on 8141f4d2:

CheckResult
Check
Test
Mobile Native Static Analysis
Release Smoke

The proposed hardening of the ripgrep step still stands on its own merits — a nine-minute apt stall came within 52 seconds of the job timeout even on the run that succeeded — but it is not blocking anything here and belongs in its own PR.

Still deliberately draft. Two things want a human call before this goes ready:

  1. The two fork-boundary decisions in the description (app.marcode.service label, triage playbook retargeted to maarco/marcode).
  2. No live client pass was run. Browser tab mute and the surface-dropdown shortcuts are user-visible, so the right panel is worth driving at 390px and 820px.

Generated by Claude Code

@maarcoChatGPT Codex Connector

Copy link
Copy Markdown
OwnerAuthor

Superseded by PR #51, the newer upstream sync through f035a0f4, which has now merged to main. Closing this older draft to keep the sync queue clean.

@maarcomaarco closed this Aug 25, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXLvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

14 participants

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

chore(upstream): sync marcode through f2d5fc91 - #41

Closed
maarco wants to merge 26 commits into
mainfrom
claude/gracious-bohr-59mpva
Closed

chore(upstream): sync marcode through f2d5fc91#41
maarco wants to merge 26 commits into
mainfrom
claude/gracious-bohr-59mpva

Conversation

@maarco

Copy link
Copy Markdown
Owner

What Changed

Merges pingdotgg/t3code@f2d5fc91e3030e5c3956fdadc13e1eaa25bcabe3 (25 commits since 82b8a938) into main as a normal two-parent merge. Merge commit 8141f4d2; merge base 82b8a938.

Headline upstream work: macOS launchd support for the background service, browser tab mute, letter shortcuts on the right-panel surface dropdown, npx t3 triage, a settle-once rule for merged PRs, Clerk upgrades, and a batch of desktop fixes.

Conflicts resolved by hand (6)

PathDecision
apps/server/src/cli/connect.tsTook upstream's platform conditionals for the launchd flow; kept Marcode's product name in the strings.
apps/server/src/cli/service.tsSame, plus upstream's Linux with systemd, macOS with launchd support line.
apps/web/src/components/ChatView.tsxKept Marcode's slim ChatHeader (the action cluster is portaled into FloatingPillNav, panelLayoutControls is mounted at the workspace root). Upstream's changeRequestStatechangeRequest rename is taken where it matters — the settle memos. Seam comment added.
apps/web/src/components/chat/ChatHeader.tsxKept Marcode's slim cluster. The upstream hunks only add the thread action menu and inline rename Marcode deliberately does not mount here, so nothing upstream is dropped.
apps/web/src/components/RightPanelTabs.tsxTook the tab mute feature and the whole data-driven surface dropdown with shortcuts. Dropped only what addresses the retired right-panel file surfaces: the Files entry, copy-path, the Files icon, PierreEntryIcon.
packages/client-runtime/src/state/threadSettled.tsBoth sides changed the same rule. Upstream added a settle-once anchor; Marcode has a one-hour warm window. They guard different things, so both now apply, pinned by a new test.

Fork-boundary breaks that merged cleanly, with no conflict

These are the dangerous ones — each would have shipped silently broken.

  • bootService.ts — upstream's new launch agent exported T3CODE_HOME. resolveLauncherBaseDir only accepts MARCODE_HOME, so the macOS background service would have exited before starting a server. Also namespaced BOOT_SERVICE_LAUNCHD_LABEL to app.marcode.service for the same reason BOOT_SERVICE_UNIT_FILE is marcode.service: upstream's shared label would make a Marcode install and a T3 Code install fight over one LaunchAgent plist. T3_BOOT_SERVICE_UNIT stays upstream-shaped.
  • cli/triage.ts — the new triage command read T3CODE_HOME, so it would have collected the wrong machine's state.
  • bootService.test.ts — a new upstream assertion hardcoded systemctl --user disable --now t3code.service. Fixtures now derive from the exported constants.
  • RightPanelTabs.tsx — upstream's new addSurfaceActions array referenced props.filesAvailable, props.onAddFiles, and SURFACE_DISABLED_REASONS.files, none of which exist in Marcode.
  • .github/triage/PLAYBOOK.md + cli/triagePrompt.ts — the playbook told the agent to clone pingdotgg/t3codeat the user's release tag and file the issue there. Marcode tags do not exist upstream, so triage would have fetched the wrong source and misfiled every Marcode bug. Retargeted to maarco/marcode; the two copies stay byte-identical (a test enforces that). The t3 CLI name and npx t3 serve are unchanged.
  • docs/user/background-service.md — corrected the unit and plist paths in the new platform-support section.

Tests added so the next sync fails loudly

  • serviceLauncher.test.ts sweeps the whole server source for T3CODE_HOME reads.
  • bootService.test.ts pins the plist's MARCODE_HOME, the Marcode launchd label, and T3_BOOT_SERVICE_UNIT staying upstream-shaped.
  • threadSettled.test.ts pins that both the warm window and the settle-once anchor must clear before a terminal PR settles a thread.

Why

Scheduled upstream sync. It carries upstream's correctness, security, and platform work while preserving Marcode's product contracts — the floating pill nav, the slim chat header, the retired right-panel file surfaces, the service identity, and the MARCODE_* environment.

Two decisions worth a second look before this leaves draft:

  1. BOOT_SERVICE_LAUNCHD_LABEL renamed to app.marcode.service. Nobody has upstream's label installed yet (Marcode never shipped macOS launchd support), so there is no migration cost — but it is a product call, not a mechanical fix.
  2. Triage playbook retargeted to maarco/marcode. Leaving it would send Marcode users' bug reports to upstream and clone the wrong source; retargeting means the playbook prose is now Marcode-owned and future upstream edits to it will conflict. Both are one-commit reversible.

Coupled subtrees: pnpm-workspace.yaml moved only Clerk versions — effect and alchemy are unchanged, so no .repos sync is needed. infra/relay/package.json is untouched.

UI Changes

Two user-visible upstream surfaces land here — the browser tab mute control and the letter shortcuts on the right-panel surface dropdown — both taken as upstream wrote them. No screenshots yet: this sync was verified with focused tests and typechecks, not a live client pass. Worth driving the right panel at 390px and 820px before marking ready.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Verification run

Focused tests for every touched area (server CLI, boot service, git, service launcher; client-runtime settle rules; web right panel, command palette, preview, thread status, git actions; desktop window, preview, lifecycle, app identity; mobile thread list; contracts settings; upstream-sync tooling) — all green. Typecheck clean on t3, @t3tools/web, @t3tools/contracts, @t3tools/shared, @t3tools/desktop. vp fmt --check and vp lint clean on the changed scope. The full suite is CI's job.


Generated by Claude Code

aorightand others added 26 commits August 18, 2026 13:38
…in GitHubPullRequestCli (pingdotgg#7385)
Signed-off-by: aoright <102943475+aoright@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
…t full speed (pingdotgg#7460)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…nt (pingdotgg#6563)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…tgg#6286)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
25 upstream commits since 82b8a93. Six conflicts, all resolved by hand.
Conflicts
- apps/server/src/cli/connect.ts, apps/server/src/cli/service.ts: upstream added
macOS launchd support and split every service string on platform. Took the
platform conditionals, kept Marcode's product name in all six strings, and
took upstream's "Linux with systemd, macOS with launchd" support line.
- apps/web/src/components/ChatView.tsx: upstream renamed the ChatHeader prop
changeRequestState -> changeRequest and passes the full action cluster there.
Marcode's slim header stays (the cluster is portaled into FloatingPillNav and
panelLayoutControls is mounted at the workspace root); the rename is taken
where it actually matters, in the settle memos above. Seam comment added.
- apps/web/src/components/chat/ChatHeader.tsx: kept Marcode's slim cluster. The
upstream hunks only add the thread action menu and inline rename that Marcode
deliberately does not mount here, so no upstream fix is dropped.
- apps/web/src/components/RightPanelTabs.tsx: took upstream's tab mute feature
and the whole data-driven surface dropdown with letter shortcuts. Dropped only
the parts that address the retired right-panel file surfaces: the Files entry,
the copy-path menu action, the Files icon, and PierreEntryIcon.
- packages/client-runtime/src/state/threadSettled.ts: both sides changed the
same rule. Upstream added a settle-once anchor (a terminal PR settles a thread
only while it postdates every user-initiated event); Marcode has a one-hour
warm window. They guard different things, so both now apply and a new test
pins the combination.
Fork-boundary breaks that merged cleanly, with no conflict
- apps/server/src/cloud/bootService.ts: upstream's new launch agent exported
T3CODE_HOME. resolveLauncherBaseDir only accepts MARCODE_HOME, so the macOS
background service would have exited before starting a server. Also
namespaced BOOT_SERVICE_LAUNCHD_LABEL to app.marcode.service for the same
reason BOOT_SERVICE_UNIT_FILE is marcode.service: upstream's shared label
would make a Marcode install and a T3 Code install fight over one plist.
T3_BOOT_SERVICE_UNIT stays upstream-shaped.
- apps/server/src/cli/triage.ts: the new triage command read T3CODE_HOME, so it
would have collected the wrong machine's state on Marcode.
- apps/server/src/cloud/bootService.test.ts: a new upstream assertion hardcoded
"systemctl --user disable --now t3code.service". Fixtures now derive from the
exported constants.
- apps/web/src/components/RightPanelTabs.tsx: upstream's new addSurfaceActions
array referenced props.filesAvailable, props.onAddFiles, and
SURFACE_DISABLED_REASONS.files, none of which exist in Marcode.
- .github/triage/PLAYBOOK.md and apps/server/src/cli/triagePrompt.ts: the
playbook told the agent to clone pingdotgg/t3code at the user's release tag
and file the issue there. Marcode tags do not exist upstream, so triage would
have fetched the wrong source. Retargeted to maarco/marcode; the two copies
stay byte-identical. The `t3` CLI name and `npx t3 serve` are unchanged.
- docs/user/background-service.md: corrected the unit and plist paths the new
platform-support section names.
Tests added to make the next sync fail loudly
- serviceLauncher.test.ts sweeps the server source for T3CODE_HOME reads.
- bootService.test.ts pins the plist's MARCODE_HOME, the Marcode launchd label,
and T3_BOOT_SERVICE_UNIT staying upstream-shaped.
- threadSettled.test.ts pins that both the warm window and the settle-once
anchor must clear before a terminal PR settles a thread.
Coupled subtrees: pnpm-workspace.yaml moved only Clerk versions; effect and
alchemy are unchanged, so no .repos sync is needed.
Verified: focused tests for every touched area (server CLI/boot service/git,
client-runtime settle rules, web right panel/command palette/preview, desktop
window/preview/lifecycle, mobile thread list, contracts settings, sync tooling)
plus typecheck on t3, web, contracts, shared, desktop, and fmt/lint on the
changed scope. The full suite is CI's job.
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Aug 19, 2026
@github-actions

github-actionsBot commented Aug 19, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire12.6 KiB12.6 KiB+1 B (+0.0%)15.1 KiB
CodexThread snapshot wire6.3 KiB6.3 KiB−3 B (−0.0%)7.3 KiB
CodexLive turn WebSocket wire6.3 KiB6.3 KiB+4 B (+0.1%)7.8 KiB
CodexLive turn WebSocket decoded51.8 KiB51.8 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages16160 (0.0%)21
ClaudeTotal thread wire12.6 KiB12.6 KiB−4 B (−0.0%)15.1 KiB
ClaudeThread snapshot wire6.3 KiB6.3 KiB+2 B (+0.0%)7.3 KiB
ClaudeLive turn WebSocket wire6.3 KiB6.3 KiB−6 B (−0.1%)7.8 KiB
ClaudeLive turn WebSocket decoded52.7 KiB52.7 KiB0 B (0.0%)66.4 KiB
ClaudeLive turn messages16160 (0.0%)21

Baseline: 2ffb140 · PR result: 8141f4d · 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: 99.9 KiB
  • Claude decoded thread snapshot: 100.6 KiB

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

@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Test is blocked by the runner's apt mirror, not by this diff

Test was cancelled twice on 8141f4d2 — once on the original run, once on a re-run. Both died at the identical point, and neither ever started the suite.

Root cause. The test job carries timeout-minutes: 10 (.github/workflows/ci.yml:63). The step before the suite is:

- name: Install workspace search dependencyrun: sudo apt-get update && sudo apt-get install --yes ripgrep

apt-get update stalls on an unreachable azure.archive.ubuntu.com and burns the whole budget:

runlast apt linecancelledsilent for
9613053812815:47:5115:56:338m42s
9613407801915:59:0416:07:468m42s
Ign:2 http://azure.archive.ubuntu.com/ubuntu noble InRelease
Ign:3 http://azure.archive.ubuntu.com/ubuntu noble-updates InRelease
...
##[error]The operation was canceled.

vp run test never runs, which is also why the thread-transfer bot reported no result for 8141f4d.

Why it isn't this PR. The merge touches no workflow file (git diff HEAD^1 HEAD -- .github/workflows/ is empty); the apt step and the 10-minute timeout both predate it on main. main is green, including run 32219065865 on 2ffb1404 — this PR's exact merge base. The other three required checks (Check, Mobile Native Static Analysis, Release Smoke) are green on this head.

What I'm not doing. I've used my one re-run, and a workflow change is outside what this sync was asked to do — I'm not widening the PR to fix CI infrastructure. This is most likely a transient regional mirror outage that a later run clears on its own.

Proposed patch, if it recurs — belongs in its own PR, not this one:

- name: Install workspace search dependencyrun: | command -v rg >/dev/null && exit 0 sudo apt-get -o Acquire::Retries=2 -o Acquire::http::Timeout=15 update sudo apt-get install --yes ripgrep

Skips apt entirely when rg is already on the image, and bounds the network wait so a dead mirror can't consume the job's timeout.

This PR stays draft regardless — it carries two fork-boundary decisions flagged in the description that want a human call before it goes ready.


Generated by Claude Code

@maarcoClaude

Copy link
Copy Markdown
OwnerAuthor

Correction: Test is green — the mirror recovered

Superseding my previous comment. Test passed on a later run of the same head 8141f4d2 (06:39:11Z → 06:48:19Z, 9m08s). The transfer-budget report also updated in place with a real result for 8141f4d and no ceiling regressions.

That confirms the earlier diagnosis: a transient azure.archive.ubuntu.com outage, not the diff. Nothing was changed to fix it.

All four required checks are now green on 8141f4d2:

CheckResult
Check
Test
Mobile Native Static Analysis
Release Smoke

The proposed hardening of the ripgrep step still stands on its own merits — a nine-minute apt stall came within 52 seconds of the job timeout even on the run that succeeded — but it is not blocking anything here and belongs in its own PR.

Still deliberately draft. Two things want a human call before this goes ready:

  1. The two fork-boundary decisions in the description (app.marcode.service label, triage playbook retargeted to maarco/marcode).
  2. No live client pass was run. Browser tab mute and the surface-dropdown shortcuts are user-visible, so the right panel is worth driving at 390px and 820px.

Generated by Claude Code

@maarcoChatGPT Codex Connector

Copy link
Copy Markdown
OwnerAuthor

Superseded by PR #51, the newer upstream sync through f035a0f4, which has now merged to main. Closing this older draft to keep the sync queue clean.

@maarcomaarco closed this Aug 25, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXLvouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

14 participants

@maarco@aoright@gbarros-dev@Bil0000@Rishet11@StiensWout@AugusDogus@tarik02@gsimone@t3dotgg@chrisdeeming@inayayousfi@RakshithBhat03@claude