Skip to content

chore(upstream): sync marcode through fff33f9e - #71

Merged
maarco merged 344 commits into
mainfrom
integrate/upstream-fff33f9e
Sep 6, 2026
Merged

chore(upstream): sync marcode through fff33f9e#71
maarco merged 344 commits into
mainfrom
integrate/upstream-fff33f9e

Conversation

@maarco

@maarco maarco commented Sep 3, 2026

Copy link
Copy Markdown
Owner

What Changed

Hand-resolved merge of 337 upstream commits pingdotgg/t3code f035a0f4..fff33f9e into Marcode. 79 conflicts resolved by combining upstream correctness/features with Marcode's product divergences (not whole-file ours/theirs). pnpm-lock.yaml regenerated with pnpm.

Branding / compatibility — kept Marcode identity, kept upstream-shaped compat ids:

  • README / docs / AGENTS: Marcode branding; added Google Antigravity provider (merged in from upstream).
  • cli/service.ts, cloud/bootService.ts: "Marcode service", systemd unit marcode.service, launchd plist exports MARCODE_HOME and took upstream's new PATH key. Kept BOOT_SERVICE_UNIT_ENV="T3_BOOT_SERVICE_UNIT" and launchd label com.t3tools.t3code.service (compat).
  • Kept marcode:* storage keys, marcode-* mobile schemes, marcode: desktop scheme, marcode-preview-* browser partitions, "Marcode Connect".

Persistence (hotspot) — Marcode owns migration id 033 (ProjectWorkspaceLayout), so upstream's new migrations 042-047 were renumbered +1 to 043-048 (files, registry, tests, and the registry-pin test).

Server orchestration (unified-workspace seam) — kept Marcode's workspace-layout handling and folded in upstream's new project fields (autoPull, projectIcon); WorkspaceFileSystem keeps Marcode's resolveMutationTarget + upstream's new resolveReadTarget.

Web — kept Marcode's retired right-panel file surfaces + floating-editor file opening (rightPanelStore, RightPanelTabs, ChatView, ChatMarkdown, _chat.pull-requests) while adopting upstream's ComposerSurface, PR-status seeds, and browser-profile launcher. Kept the FloatingPillNav shell (AppSidebarLayout, SidebarChrome, ChatHeader) and the xterm terminal (ThreadTerminalDrawer; upstream switched to Ghostty). Adopted upstream's config-driven oxlint maxOccurrences and ported Marcode's baseline into vite.config.ts.

⚠️ Read this first: a silent data-loss regression in the editor save path

fileSaveCoordinator is the one break in this sync that is a behavior conflict, not a naming slip, and it is the thing most worth a careful look.

Upstream added a confirmedRevision counter and changed persistLatest's entry guard from latestRevision === 0 to latestRevision === confirmedRevision. That zero is Marcode's cancel() sentinel — the doc comment on cancel() names the old guard by hand — so:

  1. Discarding a buffer mid-write no longer stopped the completing write from rescheduling, and the discarded contents were persisted a second time. Marcode's existing test caught this.
  2. Not caught by any existing test: the completing write recorded confirmedRevision = 1 against a revision cancel() had zeroed, so the next edit — whose revision climbs back to 1 — compared equal to that stale confirmation and was silently never persisted. Discard, then keep typing, is an ordinary floating-editor sequence, so this was real data loss.

Both intents are kept: upstream's already-confirmed dedup stays, the zero sentinel is checked separately, a write confirming after a discard no longer records a confirmation, and cancel() resets both counters so they cannot drift apart. A regression test covers discard-then-edit; it fails against the merged code and passes now.

Silent fork-boundary breaks

None of these produced a merge conflict — upstream added new files and new call sites naming identifiers this fork renamed, so the merge took them cleanly. Most surfaced only as CI failures; several would not have surfaced at all.

Break Effect if left
updatesTestHarness.ts used T3CODE_* env keys harness diverges from MARCODE_* config
clientMetadata.ts / service.ts labelled "T3 Code" wrong product name in user-visible strings
vite.config.ts oxlint namespace t3code/ rule overrides silently no-op
bootService.test.ts unit t3code.service test stops pinning the installed unit name
scripts/package.json lost Marcode's yaml Test redCannot find package 'yaml', plus TS2307 in Check
cli/app.test.ts fixtures assume ~/.t3 Test Server 1 red — fake desktop bound a socket the CLI never dialed
T3Wordmark re-added on web, dangling on mobile Check typecheck red; web timeline rendered upstream's T3 lettermark
t3 app / t3 theme read T3CODE_HOME MARCODE_HOME silently ignored; both commands target the default install
DesktopRemoteUpdates.test.ts seeded T3CODE_DISABLE_AUTO_UPDATE failing test — config reads the MARCODE_ name
BrowserSession.test.ts asserted persist:t3code-preview- failing tests — production builds persist:marcode-preview-
oxlint-plugin-marcode rule tests targeted plugin t3code 26 failing tests — oxlint rejects the fixture config at parse time
clientMetadata.test.ts asserted "T3 Code Desktop" failing test — production reports "Marcode Desktop"
clientPersistenceStorage.test.ts seeded t3code:client-settings:v1 assertion stopped covering the stored-settings path
useEnvironmentThemeSync.test.ts seeded t3code:theme setup stopped covering "a theme is already stored"
fileSaveCoordinator guard change discarded buffer re-persisted; next edit silently dropped (see above)

Three further invariants worth a second look:

  • Brand mark. Marcode renamed upstream's wordmark to MarcodeMark on web and mobile. The merge re-added apps/web/src/components/T3Wordmark.tsx as a new file and pointed the t3-code tool-server icon at it. Both surfaces now render MarcodeMark; the re-added component is deleted. The t3-code server name is an upstream-shaped compat identifier and is untouched — only the icon is brand identity.
  • CLI home variable. Marcode's base-dir variable is MARCODE_HOME in config.ts, pair, triage and the installed systemd unit, and triage.ts already carried a seam comment saying upstream reads T3CODE_HOME here. Upstream's own comment in the new theme.ts states the intent — "same precedence as the rest of the CLI" — which on this fork selects MARCODE_HOME. (An earlier revision of this description wrongly listed T3CODE_HOME among the kept compat identifiers.)
  • oxlint plugin namespace. The plugin declares name: "marcode". Two upstream rule-test files built fixture configs against plugin t3code, which oxlint rejects at parse time rather than as a type or lint error — which is why they survived the earlier vite.config.ts namespace fix.

Deliberately left upstream-shaped. A sweep of every production (non-test) file this merge touched found "T3 Code" in the new cli/app.ts and cli/theme.ts user-visible error messages. That is not a break: Marcode's own pair.ts and triage.ts on main use "T3 Code" in user-facing CLI prose, and apps/mobile/app.config.ts pairs appName: "T3 Code" with scheme: "marcode" exactly as main does. The CLI surface is deliberately upstream-shaped, consistent with t3 being a kept compat identifier, so none of it was changed. main is the oracle per surface — the fixes above are surface-specific, not a blanket rename.

Removals and renames are now pinned by tests, since they are otherwise invisible to the next merge: scripts/brand-mark-ownership.test.ts (no wordmark component or reference on web/mobile/desktop), os-jank.test.ts (default base dir is ~/.marcode), the corrected BrowserSession.test.ts prefix assertions, the CLIENT_SETTINGS_STORAGE_KEY seed read off the module rather than a literal, and the existing bootService.test.ts plist assertion.

Coupled subtrees: pnpm-workspace.yaml bumped clerk/tailwind/vite-plus but effect stayed at 4.0.0-beta.103, so the vendored effect-smol subtree is unchanged.

Why

Daily upstream sync. Brings upstream correctness, security, protocol, dependency, and feature work (Antigravity provider, server-side thread settlement, PR labels/status seeds, browser profiles, media previews, composer refactor) into the maintained fork while preserving Marcode's intentional product divergences.

Closes the tracking block in #70 (t3code@57a66608, included in this range).

UI Changes

Not captured in this automated sync. Web/mobile/desktop UI hotspots changed and should get runtime verification (test-t3-app / test-t3-mobile, 390px + 820px) before this leaves draft. Two changes are user-visible: the brand mark on both web and mobile timelines, and the editor discard/save behavior above.

Checklist

  • Conflicts resolved by combining intents (no whole-file ours/theirs)
  • vp check 0 errors; vpr typecheck clean across all 15 packages
  • apps/web 3795/3795 (316 files); desktop 707/707; oxlint-plugin 72/72; ssh 358/358
  • Server suite green apart from seven documented chmod container artifacts
  • Full CI green on a1edd0e7Check, Test, Mobile Native Static Analysis, Release Smoke, plus all three Test Server shards, Rust, and claude-review (run 33786720079)
  • Per-hotspot runtime verification for changed UI surfaces
  • Human review of hotspot decisions before marking ready

Left draft deliberately. CI is green and the branch is mergeable, but this automated sync does not mark PRs ready or merge them. The two unchecked boxes are the remaining human steps.

Container-only artifacts seen while verifying locally, none of them regressions — every one of these files is byte-identical to main, and all of them pass in CI. chmod-injection tests cannot fail as intended in a root container: keybindings.test.ts, server.test.ts, terminal/Manager.test.ts, four cli/theme.test.ts cases, and update-release-package-versions.test.ts. Net.test.ts needs an IPv6 loopback the container lacks (::1 bind returns EAFNOSUPPORT, so isPortAvailableOnLoopback can never succeed).

🤖 Generated with Claude Code

https://claude.ai/code/session_016jdCVqZCzYw2dSFVgnqvob


Generated by Claude Code

Bil0000 and others added 30 commits August 29, 2026 08:50
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
…text (pingdotgg#8804)

Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
…gg#8734)

Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
juliusmarminge and others added 17 commits September 2, 2026 23:35
…lly (pingdotgg#9355)

Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: maria-rcks <maria@kuuro.net>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Claude Code <noreply@anthropic.com>
…ngdotgg#9122)

Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…gdotgg#9123)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
…old as legacy (pingdotgg#9397)

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
Integrates 337 upstream commits (f035a0f..fff33f9) by hand. 79 conflicts
resolved combining upstream correctness/features with Marcode's product
divergences. Key decisions:

Branding / compatibility (kept Marcode identity, kept upstream-shaped compat ids):
- README/docs/AGENTS: Marcode branding; added Google Antigravity provider.
- cli/service.ts, bootService.ts: "Marcode service", systemd unit "marcode.service",
  plist exports MARCODE_HOME (not T3CODE_HOME) + took upstream's new PATH key;
  kept BOOT_SERVICE_UNIT_ENV="T3_BOOT_SERVICE_UNIT" and launchd label
  com.t3tools.t3code.service (compat).
- Storage keys marcode:*, mobile schemes marcode-*, desktop scheme marcode:,
  browser partition marcode-preview-*, settingsSearch "Marcode Connect".

Persistence hotspot:
- Migrations: Marcode owns id 33 (ProjectWorkspaceLayout); upstream 042-047
  renumbered +1 to 043-048 (files, registry, tests, registry-pin test).

Server orchestration (unified-workspace seam):
- projector/ProjectionPipeline: kept Marcode workspace-layout handling AND folded
  in upstream's new project fields (autoPull, projectIcon).
- decider/commandInvariants: kept Marcode workspace-layout invariants + upstream imports.
- WorkspaceFileSystem: kept Marcode resolveMutationTarget + upstream resolveReadTarget.

Web (floating editor / unified workspace / retired file surfaces):
- rightPanelStore/RightPanelTabs/ChatView/ChatMarkdown/_chat.pull-requests: kept
  Marcode's retirement of right-panel file surfaces + floating-editor opening;
  adopted upstream's ComposerSurface, PR status seeds, browser profiles.
- AppSidebarLayout/SidebarChrome/ChatHeader: kept Marcode FloatingPillNav shell.
- ThreadTerminalDrawer: kept Marcode xterm terminal (upstream switched to Ghostty).
- oxlint no-manual-effect-runtime: adopted upstream's config-driven maxOccurrences,
  ported Marcode's baseline into vite.config.ts (fixed t3code/ -> marcode/ namespace).

Silent-break fixes (clean merges that would have broken on Marcode identity):
- updatesTestHarness.ts: T3CODE_* env keys -> MARCODE_*.
- clientMetadata.ts / service.ts: "T3 Code" labels -> "Marcode".
- vite.config.ts oxlint override namespace t3code/ -> marcode/.
- bootService.test.ts systemd unit t3code.service -> marcode.service.

Verified: typecheck clean for web, server, contracts, client-runtime, desktop;
focused tests pass (bootService, migrations, orchestration, settlement, settings).
pnpm-lock.yaml regenerated with pnpm; effect-smol subtree unchanged (effect
version stable at 4.0.0-beta.103).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016jdCVqZCzYw2dSFVgnqvob
@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Sep 3, 2026
Base advanced to 200e149 (chat ambient effects, #66) after this integration
branched. Only pnpm-lock.yaml conflicted; regenerated with pnpm. ChatView,
ChatHeader, index.css and popover auto-merged cleanly with the upstream sync.

Verified: apps/web typecheck clean; ambient-effects tests and the sync's web
tests pass (51 tests).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016jdCVqZCzYw2dSFVgnqvob
@github-actions github-actions Bot added the 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. label Sep 3, 2026
@github-actions

github-actions Bot commented Sep 3, 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.4 KiB 13.7 KiB +319 B (+2.3%) 15.1 KiB
Codex Thread snapshot wire 6.9 KiB 7.0 KiB +134 B (+1.9%) 7.3 KiB
Codex Live turn WebSocket wire 6.5 KiB 6.7 KiB +185 B (+2.8%) 7.8 KiB
Codex Live turn WebSocket decoded 55.0 KiB 58.5 KiB +3.5 KiB (+6.3%) 66.4 KiB
Codex Live turn messages 16 10 −6 (−37.5%) 21
Claude Total thread wire 13.4 KiB 13.8 KiB +328 B (+2.4%) 15.1 KiB
Claude Thread snapshot wire 6.9 KiB 7.0 KiB +141 B (+2.0%) 7.3 KiB
Claude Live turn WebSocket wire 6.5 KiB 6.7 KiB +187 B (+2.8%) 7.8 KiB
Claude Live turn WebSocket decoded 55.8 KiB 59.3 KiB +3.5 KiB (+6.2%) 66.4 KiB
Claude Live turn messages 16 10 −6 (−37.5%) 21

Baseline: 200e149 · PR result: a1edd0e · 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.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

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

The Check job failed on `vp check`. Two causes, both from this merge:

- Formatting: packages/client-runtime/src/operations/projectWorkspace.ts
  reformatted with `vp fmt` (cosmetic arrow-wrapper collapse, no behavior change).
- Unused lint directives (reportUnusedDisableDirectives is an error):
  - Three oxlint-disable comments arrived from upstream naming `t3code/...`
    rules. Marcode's plugin is `meta.name: "marcode"`, so those ids do not
    exist here and the directives were no-ops. Renamed to `marcode/...`,
    matching the plugin and the rule ids already used in vite.config.ts.
  - Three eslint-disable directives (ThreadTerminalDrawer, UnifiedWorkspaceRow,
    floating-code-pill) stopped reporting under upstream's oxlint bump
    (1.68 -> 1.79 via vite-plus 0.3.0) and are removed; the explanatory
    comments that documented the intent are kept.

Verified: `vp check` reports 0 errors; typecheck clean for web, desktop,
server and client-runtime; formatting clean on every edited file.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016jdCVqZCzYw2dSFVgnqvob
… home

Two silent fork-boundary breaks from the upstream merge, both of which merged
without a conflict and only surfaced in CI.

`scripts/package.json` auto-merged to upstream's dependency list, which drops
Marcode's `yaml` dependency. The scripts workspace still imports it, so `Test`
failed with `Cannot find package 'yaml'`. Restored the dependency and
regenerated the lockfile.

`apps/server/src/cli/app.test.ts` arrives whole from upstream with the new
`t3 app` desktop-control command. Its fixtures hardcode `~/.t3` as the home the
CLI falls back to when neither `--base-dir` nor `T3CODE_HOME` is set, but
Marcode's `resolveBaseDir` defaults to `~/.marcode`. The fake desktop therefore
bound a socket derived from a different state directory than the one the CLI
dialed, and four tests failed with `connect ENOENT`. The fixtures now derive the
directory from a named constant with a seam comment. `T3CODE_HOME`, the
`t3code-` socket prefix, and the `t3` package name are compatibility
identifiers and stay upstream-shaped.

`os-jank.test.ts` now pins `resolveBaseDir`'s default so a future sync that
reverts the directory name fails loudly instead of silently re-pointing every
default-home caller.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016jdCVqZCzYw2dSFVgnqvob
None of these produced a merge conflict. Upstream added new files and new call
sites that name identifiers this fork renamed, so the merge took them cleanly
and they only surface as a CI failure or, worse, as wrong runtime behavior.

`T3Wordmark` -> `MarcodeMark`. Marcode renamed upstream's wordmark component on
web and mobile. The merge re-added `apps/web/src/components/T3Wordmark.tsx` as a
new file and pointed the web timeline's `t3-code` tool-server icon at it, while
the matching mobile import in `thread-work-log.tsx` had no file to resolve --
that was the `Check` job's typecheck failure. Both surfaces now render
`MarcodeMark` and the re-added component is removed. The `t3-code` server name
is an upstream-shaped compatibility identifier and is untouched; only the icon
beside it is brand identity. `scripts/brand-mark-ownership.test.ts` pins the
removal, since a rename is otherwise invisible to the next merge.

`T3CODE_HOME` -> `MARCODE_HOME` in the new `t3 app` and `t3 theme` commands.
Marcode's base-dir variable is `MARCODE_HOME` in `config.ts`, `pair`, `triage`
and the installed systemd unit; `triage.ts` already carries a seam comment
saying so. Upstream's own comment in `theme.ts` states the intent -- "same
precedence as the rest of the CLI" -- which on this fork selects `MARCODE_HOME`.
Left as it stands, a provisioning script exporting `MARCODE_HOME` would have
these two commands silently target the default install.

`T3CODE_DISABLE_AUTO_UPDATE` -> `MARCODE_DISABLE_AUTO_UPDATE` in
`DesktopRemoteUpdates.test.ts`. `DesktopConfig` reads the `MARCODE_` name and
`DesktopUpdates` reports it, so the new upstream test seeded an ignored variable
and asserted the upstream message. This was a real failing test, not a fixture
detail.

`t3code:theme` -> `marcode:theme` in `useEnvironmentThemeSync.test.ts`.
`useTheme` stores the selected theme under `marcode:theme`, so the upstream seed
set nothing and the setup had silently stopped covering "a theme is already
stored". Sibling keys (`t3code:themes:v1`, `t3code:theme-appearance-mode`, ...)
are persisted-state compatibility identifiers and stay upstream-shaped.

Verified: `vp check` 0 errors; `vpr typecheck` clean across all 15 packages
(this was red before); 247 focused tests pass across the changed surfaces.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016jdCVqZCzYw2dSFVgnqvob
Both surfaced by reproducing the CI `Test` job locally
(`vp run --filter '!t3' --filter '!@t3tools/monorepo' test`). Neither conflicted.

`BrowserSession.test.ts` asserted upstream's `persist:t3code-preview-` partition
prefix. `BrowserSession.ts` builds `persist:marcode-preview-`, so the three
assertions pinned a string this fork does not produce. Browser partitions are
per-profile Electron session keys; the assertions now pin the prefix Marcode
actually ships.

The `oxlint-plugin-marcode` rule tests for `no-mobile-uniwind-theme-escape-hatches`
and `no-manual-effect-runtime-in-tests` built their oxlint fixture configs
against plugin `t3code`. The plugin declares `name: "marcode"` in `index.ts` and
every sibling rule test already uses `marcode/`, so oxlint rejected the fixture
config outright -- "Plugin 't3code' not found" -- failing all 26 cases in those
two files. This is the same namespace break already repaired in
`vite.config.ts`; these two files were missed because the failure is a fixture
parse error rather than a type or lint error.

Verified: `vp check` 0 errors; desktop 707/707; oxlint-plugin-marcode 72/72.

Two remaining local failures are container artifacts, not regressions, and both
files are byte-identical to `main`: `update-release-package-versions.test.ts`
and four `cli/theme.test.ts` cases assert on `chmod`-injected failures that a
root container ignores, and `Net.test.ts` needs an IPv6 loopback this container
does not have (`::1` bind returns EAFNOSUPPORT, so `isPortAvailableOnLoopback`
can never succeed here).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016jdCVqZCzYw2dSFVgnqvob
…breaks

The CI `Test` job covers 13 packages; the local filter I had been reproducing it
with resolved only five, and `apps/web` was not among them. Running the web
suite directly surfaced three failures.

`fileSaveCoordinator` is the real one, and it is a behavior conflict rather than
a naming slip. Upstream added a `confirmedRevision` counter and changed
`persistLatest`'s entry guard from `latestRevision === 0` to
`latestRevision === confirmedRevision`. That zero is Marcode's `cancel()`
sentinel -- the documented contract on `cancel()` names the old guard by hand --
so discarding a buffer mid-write no longer stopped the completing write from
rescheduling, and the discarded contents were persisted a second time.

Worse, and not covered by any existing test: the completing write recorded
`confirmedRevision = 1` against a revision `cancel()` had zeroed, so the *next*
edit -- whose revision climbs back to 1 -- compared equal to that stale
confirmation and was silently never persisted. Discard, then keep typing, is an
ordinary floating-editor sequence, so that was real data loss.

Both intents are kept: upstream's already-confirmed dedup stays, and the zero
sentinel is checked separately; a write that confirms after a discard no longer
records a confirmation; and `cancel()` resets both counters so they cannot drift
apart. A regression test covers the discard-then-edit sequence, which failed
against the merged code and passes now.

The other two are naming breaks that merged without a conflict:
`clientMetadata.test.ts` asserted the label "T3 Code Desktop" while
`clientPresentationMetadata` reports "Marcode Desktop", and
`clientPersistenceStorage.test.ts` seeded `t3code:client-settings:v1`, a key this
fork never writes, so the assertion below it had stopped covering the
stored-settings path. That seed now reads `CLIENT_SETTINGS_STORAGE_KEY` off the
module so it cannot drift again.

Verified: apps/web 3795/3795 (316 files); `vp check` 0 errors; web typecheck
clean. The server suite's 7 remaining local failures are all `chmod`-injection
tests that a root container defeats (`keybindings`, `server`, `terminal/Manager`,
and four `cli/theme` cases); every one of those files is byte-identical to
`main`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016jdCVqZCzYw2dSFVgnqvob
@maarco
maarco merged commit a1edd0e into main Sep 6, 2026
21 checks passed
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.