Skip to content

chore(upstream): sync marcode through 8b2838e0 - #76

Draft
maarco wants to merge 35 commits into
mainfrom
claude/gracious-bohr-c3jslq
Draft

chore(upstream): sync marcode through 8b2838e0#76
maarco wants to merge 35 commits into
mainfrom
claude/gracious-bohr-c3jslq

Conversation

@maarco

@maarco maarco commented Sep 7, 2026

Copy link
Copy Markdown
Owner

What Changed

Merged pingdotgg/t3code@8b2838e0 — 33 upstream commits since 52b2bf77a941 — into a two-parent merge commit on this branch. Nine files conflicted; four more broke the fork boundary while merging perfectly cleanly.

Conflict decisions

Path Decision
.devcontainer/devcontainer.json Took upstream's rewrite that makes container setup work (pingdotgg#7875): ubuntu-24.04 base, node:2 + rust + gh features, on-create/update-content scripts, forwarded ports, cache volumes. Re-applied Marcode's identity — container name, the bun feature AGENTS.md needs for bun:sqlite test-data seeding, and MARCODE_HOME.marcode in place of upstream's T3CODE_HOME.t3.
apps/marketing/src/pages/95.astro modify/delete. Marcode retired the upstream-branded /95 page and pins that in retiredRoutes.test.ts. Upstream's pingdotgg#10460 fix is confined to that file, so nothing was left to port. Kept deleted.
apps/server/src/project/AgentSessionScanner.test.ts Upstream inserted two new exclusion tests where Marcode had renamed a fixture .t3.marcode. Kept all three. The scanner's /.marcode/worktrees/ seam was untouched by the merge.
apps/web/src/components/onboarding/WelcomeWizard.tsx Upstream rewrote the wizard into a shared multi-computer dialog (pingdotgg#10465). Took the rewrite, re-applied Marcode's three intents: product identity in the copy, the brand mark (upstream's wordmark component doesn't exist in this fork — MarcodeMark replaced it), and the TerminalViewport prop contract, which here has no providerInstanceId/visible and requires an onAddTerminalContext sink.
apps/web/src/hooks/useTheme.ts, useTheme.test.ts Upstream deleted the onboarding theme surface wholesale. Marcode's wizard is deliberately always dark (hotspot added in 082418a), so mountOnboardingTheme, its branches, and its tests stay.
apps/web/src/index.css Both sides appended at the same two points. Kept upstream's AnimatedHeight collapsible rules and sidebar drag-label animation alongside Marcode's stage-blueprint tokens and chrome.
docs/user/welcome-wizard.md Took upstream's new copy for multi-computer selection and repository-grouped import, in Marcode's product voice.
packages/shared/src/git.test.ts Kept Marcode's T3Tools/Marcode fixture and added upstream's new ssh:// remote case against it.

Clean merges that would have silently broken the fork

None of these produce a conflict marker:

  1. FirstRunGate.tsx lost its mountOnboardingTheme mount when upstream removed the feature. Restored — without it the wizard follows the saved light preference.
  2. index.css lost html[data-onboarding-surface]:root and the matching contrast probe. Restored, so portaled menus and tooltips keep the wizard's palette.
  3. docs/internals/devcontainer.md arrived new from upstream naming T3CODE_HOME, .t3, and T3CODE_DEV_ALLOWED_ORIGINS — none of which this fork reads. Corrected.
  4. .devcontainer/on-create.sh writes the container's first-run notice in upstream's product voice. Corrected.

New apps/web/src/components/onboarding/onboardingTheme.seam.test.ts pins the dark-onboarding seam — the exported theme owner, both mounts, the CSS block, the seam comments, and that the wizard renders Marcode's brand glyph — so the next sync fails loudly instead of reverting it quietly. The matching removal (that upstream's wordmark component is absent from every source root) stays owned by scripts/brand-mark-ownership.test.ts, which already does it better.

Why

Daily upstream sync. Upstream's delta carries real correctness and operational work worth taking (a devcontainer that actually builds, a Cursor transport-failure fix, Codex Spark limit handling, a large mobile thread-lifecycle pass, project-import grouping), and none of it should be dropped because it landed in a customized file. Every conflict was resolved by combining both intents rather than taking a side, and the four no-conflict breaks are exactly the class the fork-boundary rules in AGENTS.md exist to catch.

Compatibility identifiers left upstream-shaped on purpose: @t3tools/*, the t3 CLI name and its npx t3 … commands, T3_BOOT_SERVICE_UNIT, T3_SERVICE_LAUNCHER_CONTEXT, T3CODE_DESKTOP_*, T3CODE_TRANSFER_*, and t3code-* cache volume names.

Neither coupled vendored subtree source (pnpm-workspace.yaml, infra/relay/package.json) moved, so no sync:repos run was needed.

UI Changes

The onboarding wizard changes shape (upstream's redesign) and the chat composer swaps a generic file icon for Pierre icons, but this environment is headless — no browser or simulator — so no before/after captures were taken. Live verification of the wizard at 390px and 820px is still owed before this leaves draft, per the sync runbook's runtime-verification step for apps/web/** hotspots. That is the one thing blocking this from being ready for review.

Checklist

  • This PR is small and focused — one concern: the upstream merge
  • I explained what changed and why
  • I included before/after screenshots for any UI changes — not capturable here, see above
  • I included a video for animation/interaction changes — same

Verification

CI on 0c81071f: all four required checks greenCheck, Test, Mobile Native Static Analysis, Release Smoke — plus Test Server 1/2/3, Rust, Native fingerprint diff, and Mobile Native Changes. Thread-transfer impact is within every ceiling. No merge conflict against main.

claude-review is red and is not this PR's failure: the review app's own credentials. It has failed on every run since 2026-09-07 02:30 UTC, including seven on PR #75's unrelated branch, and its re-run here failed identically. Details in the comments below. It is not a required check.

Local, before pushing:

  • Full apps/web suite: 356 files, 4462 tests, all passing.
  • vp run -r typecheck: clean across all 15 packages, 0 errors.
  • Focused tests for every resolved path: AgentSessionScanner (81), useTheme, git, forkIdentity, branding, retiredRoutes, brand-mark-ownership, the new seam test, plus the unified-workspace, right-panel, chat-ambient, sidebar-drag/pointer, ChatView-logic and project-import suites.
  • vp fmt --check and vp lint clean on the changed scope.

The second commit here (0c81071f) fixes two defects CI caught in the seam test I added — a banned node:fs import in apps/web, and two references to upstream's wordmark name that brand-mark-ownership.test.ts correctly rejects. Neither touched a conflict resolution. Both are explained in the commit message and in the comments.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LE6a6L6CrRksuzTjFLR9YM

t3dotgg and others added 30 commits September 6, 2026 19:04
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…dotgg#10463)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…ccount (pingdotgg#10462)

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
… second one (pingdotgg#10440)

Co-authored-by: Claude Code <noreply@anthropic.com>
…ed (pingdotgg#10435)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…dotgg#10019)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…diff fallback (pingdotgg#9828)

Co-authored-by: James <jamescollard2005@gmail.com>
… update depth errors (pingdotgg#7138)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
juliusmarminge and others added 4 commits September 7, 2026 03:01
…0493)

Onboarding listed every directory Claude Code or Codex had ever run in as one flat list of paths, with everything from the last 30 days preselected. On my machine that was 270 rows and 80 preselected. Most of them were Codex scratch folders, worktrees, and one-off questions. I wanted two or three projects and had no fast way to get there.
The scanner now reads each candidate's `.git/config` directly, so the client can group clones by origin and show the GitHub `owner/name`. Linked worktrees, Codex scratch directories under `~/Documents/Codex`, `~/Downloads`, and temp roots are no longer offered. Folders that are not git repositories collapse under "Other folders". The default selection requires a git repository with at least three threads. Select all and Select none sit above the list, and each row shows the source icons, thread count, and last activity.
On the same machine this drops the list to 162 rows and the default selection to 16.
Mobile has no project import step, so there is no mobile change.
Created with Claude Fable 5.1 in Claude Code.
33 upstream commits since 52b2bf7. Nine conflicts, plus four
fork-boundary breaks that merged with no conflict at all.

Conflict decisions
------------------

.devcontainer/devcontainer.json — upstream rewrote the container so setup
actually works (pingdotgg#7875: ubuntu-24.04 base, node:2 + rust + gh features,
onCreate/updateContent scripts, forwarded ports, cache volumes). Took all of
it, then re-applied Marcode's identity: the container name, the bun feature
AGENTS.md needs for `bun:sqlite` test-data seeding, and `MARCODE_HOME` ->
`.marcode` in place of upstream's `T3CODE_HOME` -> `.t3`. Marcode's server
only reads MARCODE_HOME, so upstream's variable would have been ignored and
sent container dev state at the shared home.

apps/marketing/src/pages/95.astro — modify/delete. Marcode retired the
upstream-branded /95 page and pins the removal in retiredRoutes.test.ts.
Upstream's fix (pingdotgg#10460, nightly downloads to /download?channel=nightly) is
confined to that one file, so nothing was left to port. Kept deleted.

apps/server/src/project/AgentSessionScanner.test.ts — upstream inserted two
new exclusion tests where Marcode had renamed a fixture `.t3` -> `.marcode`.
Kept both upstream tests and Marcode's renamed one. The scanner's own
`/.marcode/worktrees/` seam was untouched by the merge.

apps/web/src/components/onboarding/WelcomeWizard.tsx — upstream rewrote the
wizard into a shared multi-computer dialog (pingdotgg#10465). Took the rewrite, then
re-applied Marcode's three intents: product identity in the copy, the brand
mark (this fork has no `T3Wordmark`; `MarcodeMark` replaced it), and the
`TerminalViewport` prop contract, which here has no `providerInstanceId` or
`visible` and requires an `onAddTerminalContext` sink.

apps/web/src/hooks/useTheme.ts, useTheme.test.ts — upstream deleted the
onboarding theme surface wholesale. Marcode's wizard is deliberately always
dark (hotspot added in 082418a), so kept `mountOnboardingTheme`, its
branches, and its tests.

apps/web/src/index.css — both sides appended at the same two points. Kept
upstream's AnimatedHeight collapsible rules and sidebar drag-label animation
alongside Marcode's stage-blueprint tokens and chrome.

docs/user/welcome-wizard.md — took upstream's new copy for multi-computer
selection and repository-grouped import, in Marcode's product voice.

packages/shared/src/git.test.ts — kept Marcode's `T3Tools/Marcode` fixture
and added upstream's new `ssh://` remote case against it.

Clean merges that would have silently broken the fork
-----------------------------------------------------

1. FirstRunGate.tsx lost its `mountOnboardingTheme` mount when upstream
   removed the feature. Restored; without it the wizard follows the saved
   light preference.
2. index.css lost `html[data-onboarding-surface]:root` and the matching
   contrast probe. Restored, so portaled menus and tooltips keep the
   wizard's palette.
3. docs/internals/devcontainer.md arrived new from upstream naming
   `T3CODE_HOME`, `.t3`, and `T3CODE_DEV_ALLOWED_ORIGINS` — none of which
   this fork reads. Corrected.
4. .devcontainer/on-create.sh writes the container's first-run notice in
   upstream's product voice. Corrected.

None of these produce a conflict marker, so
apps/web/src/components/onboarding/onboardingTheme.seam.test.ts now pins the
whole dark-onboarding seam: the exported theme owner, both mounts, the CSS
block, the seam comments, and the absence of `T3Wordmark`.

Compatibility identifiers left upstream-shaped on purpose: `@t3tools/*`, the
`t3` CLI name and its `npx t3 …` commands, `T3_BOOT_SERVICE_UNIT`,
`T3_SERVICE_LAUNCHER_CONTEXT`, `T3CODE_DESKTOP_*`, `T3CODE_TRANSFER_*`, and
`t3code-*` cache volume names.

Neither coupled vendored subtree source moved, so no `sync:repos` run was
needed.

Verified: focused tests for every resolved path (AgentSessionScanner 81,
useTheme, git, forkIdentity, branding, retiredRoutes, the new seam test) plus
the unified-workspace, right-panel, chat-ambient, sidebar-drag and
project-import suites — 550 tests, all passing. Typecheck clean for web,
shared, server, mobile and marketing. `vp fmt --check` and `vp lint` clean on
the changed scope.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LE6a6L6CrRksuzTjFLR9YM
@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Sep 7, 2026

maarco commented Sep 7, 2026

Copy link
Copy Markdown
Owner Author

claude-review is failing, and it is not this PR's failure. Flagging it so it doesn't read as something the merge introduced.

What's failing. Job 101794066018 on 4f87747. The action gets through OIDC, the app token, the Claude Code install, the marketplace and plugin install, then the SDK run itself dies:

{"type":"result","subtype":"success","is_error":true,
 "duration_ms":2039,"num_turns":1,"total_cost_usd":0,"modelUsage":{}}
##[error]Claude execution failed: result is_error:true

One turn, two seconds, zero cost, empty modelUsage — it never reached the model. ANTHROPIC_API_KEY is empty in the job env. Full output is hidden for security (show_full_output: true or debug mode would print the underlying error).

Why it isn't this PR's. Claude Code Review has failed on every run since run pingdotgg#84 (2026-09-07 02:30 UTC) and last succeeded at run pingdotgg#83 (2026-09-06 22:42 UTC). Runs pingdotgg#84pingdotgg#90 are all on chore/upstream-52b2bf77a941 (PR #75) across six different head SHAs, and pingdotgg#89 was already a re-run attempt that failed the same way. This branch didn't exist for any of them. It also reproduces on a diff that shares nothing with this one.

Two further reasons the diff can't be the cause: the workflow restores .claude, .mcp.json, .gitmodules, and CLAUDE.md from origin/main before running ("PR head is untrusted"), so it isn't even reading this PR's copies — and this PR touches none of those files anyway.

No fix ported, because none exists in the repository. This is a credentials/account condition on the review app, not a code path. Nothing I could add to this branch would turn it green, and widening the PR to guess at workflow config would be worse than leaving it red. Someone with access to the repo's Claude secrets should check whether the app's credential expired or was revoked around 2026-09-07 02:30 UTC.

Not a required check. Branch protection requires Check, Test, Mobile Native Static Analysis, and Release Smoke. Release Smoke, Rust, Mobile Native Changes, and Native fingerprint diff are already green on this head; the rest are still running. claude-review is advisory and its absence costs a review pass, not correctness.

I'm re-running the job once to confirm it fails identically on this head SHA, and will keep watching the PR until the required checks are terminal.


Generated by Claude Code

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 13.6 KiB 13.6 KiB +12 B (+0.1%) 15.1 KiB
Codex Thread snapshot wire 7.0 KiB 7.0 KiB +2 B (+0.0%) 7.3 KiB
Codex Live turn WebSocket wire 6.6 KiB 6.6 KiB +10 B (+0.1%) 7.8 KiB
Codex Live turn WebSocket decoded 57.1 KiB 57.1 KiB 0 B (0.0%) 66.4 KiB
Codex Live turn messages 10 10 0 (0.0%) 21
Claude Total thread wire 13.6 KiB 13.6 KiB −16 B (−0.1%) 15.1 KiB
Claude Thread snapshot wire 7.1 KiB 7.1 KiB −2 B (−0.0%) 7.3 KiB
Claude Live turn WebSocket wire 6.5 KiB 6.5 KiB −14 B (−0.2%) 7.8 KiB
Claude Live turn WebSocket decoded 57.8 KiB 57.8 KiB −44 B (−0.1%) 66.4 KiB
Claude Live turn messages 9 8 −1 (−11.1%) 21

Baseline: b25b24b · PR result: 0c81071 · 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: 113.9 KiB
  • Claude decoded thread snapshot: 114.6 KiB

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

maarco commented Sep 7, 2026

Copy link
Copy Markdown
Owner Author

Update on the three red checks.

claude-review — confirmed not this PR's. The re-run (job 101794656294) failed identically on the same head SHA, matching the seven prior failures on PR #75's branch. That's my one re-run spent; the conclusion in the comment above stands, and it still needs someone with access to the repo's Claude credentials.

Check and Test — both mine, both fixed. Two real defects, and both were in the seam test I added rather than in the merge resolution:

  1. CheckonboardingTheme.seam.test.ts(19,25): error TS377057 effect(nodeBuiltinImport). apps/web forbids node:fs. I used it to read index.css, because a ?raw import of a stylesheet resolves to an empty string under the test CSS pipeline. Fixed with the // @effect-diagnostics nodeBuiltinImport:off pragma, which is the convention scripts/brand-mark-ownership.test.ts already uses for exactly this — a fork-boundary assertion that has to read a checked-in file.

  2. Testbrand-mark-ownership.test.ts flagged two references to upstream's wordmark component, in WelcomeWizard.tsx and in my seam test. That test is right and I was wrong: it scans every file under apps/{web,mobile,desktop}/src for the literal name and assembles the string at runtime so it cannot match itself. My seam comment spelled the name out, and my seam test asserted on its absence — duplicating a check that file already owns, better. The comment now describes the component instead of naming it, and the seam test asserts the positive (MarcodeMark is imported and rendered) and leaves the removal to brand-mark-ownership.test.ts.

Why local verification missed both. I installed dependencies with --ignore-scripts, so the repo's prepare step never ran effect-tsgo patch and the Effect language-service diagnostics were inactive in my typecheck. I've since applied the patch, reproduced TS377057 locally, and confirmed it clears. The brand-mark-ownership miss was simpler: I ran focused tests for the paths I resolved and didn't run the one in scripts/ that guards the identifier I'd just typed.

Everything else on this head is green, including all the other required checks — Release Smoke, Mobile Native Static Analysis, Test Server 1/2/3, Rust, Native fingerprint diff. Note that Test aborted after the scripts failure, so apps/web, apps/marketing, packages/shared and the oxlint plugin never ran in it; I'm running the full apps/web suite and a repo-wide typecheck locally before pushing, rather than sending up another speculative commit.


Generated by Claude Code

Both CI failures on the sync merge were in the seam test it added, not in
any conflict resolution.

Check / typecheck — `onboardingTheme.seam.test.ts(19,25): error TS377057
effect(nodeBuiltinImport)`. apps/web forbids `node:fs`. The test reaches for
it because a `?raw` import of a stylesheet resolves to an empty string under
the test CSS pipeline, so reading index.css is the only way to assert on the
onboarding palette. Opt out with the same
`// @effect-diagnostics nodeBuiltinImport:off` pragma
scripts/brand-mark-ownership.test.ts already uses for exactly this: a
fork-boundary assertion that has to read a checked-in file.

Test — brand-mark-ownership.test.ts flagged two references to upstream's
wordmark component, one in the WelcomeWizard seam comment and one in the seam
test. That test is right. It scans every file under apps/{web,mobile,desktop}
/src for the literal name and assembles the string at runtime so it cannot
match itself; spelling the name out in a comment defeats it just as much as a
real import would. The comment now describes the component instead of naming
it, and the seam test asserts the positive — that `MarcodeMark` is imported
and rendered — leaving the removal to brand-mark-ownership.test.ts, which
already owns it across every source root and does it better.

Local verification had missed both. Dependencies were installed with
--ignore-scripts, so `prepare` never ran `effect-tsgo patch` and the Effect
language-service diagnostics were inactive; the patch is applied now,
TS377057 reproduced, and it clears. The brand-mark miss was plainer: focused
tests covered the resolved paths but not the guard on the identifier the
comment had just introduced.

Verified: both failures reproduced then fixed; `vp run -r typecheck` clean
across all 15 packages (0 errors); brand-mark-ownership and the seam test
pass; fmt and lint clean on both files.

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

Labels

📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. size:XXL vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants