Intake row 5: upstream T3 through 7a12aff47 - #8
Merged
Merged
Conversation
…ccess The fork resolves expo-modules-core 57.0.18 (Expo 57.0.23), which still lacks the lock; the same patch rides on 57.0.18 and the override pins that version.
The fork runs expo-notifications 57.0.19, whose own delegate registry (a Mutex) already fixes the reentrant and concurrent cases; the regression still failed handoff and pending there. The patch is rewritten against 57.0.19's registry (record-then-snapshot on delivery, remove only the replayed responses), the version pinned exactly, and the test compiles ExpoModulesCore's Mutex backport beside the manager.
Split the fork's own headers, not upstream's: HomeHeader.android.tsx carries the fork's branded in-flow Android header (upstream's renders the deferred Material toolbar), HomeHeader.tsx the iOS native-search header, HomeHeader.types.ts the props (the fork has no list sort orders). The branding source test reads the Android file, where the mark now lives.
The fork's ControlPill keeps no Material button branches, so only the menu moves; the Android file keeps the fork's reason for the anchored menu. The React Compiler refs warning moves with the iOS menu code unchanged.
Partial: the platform splits that land on kept code only. NativeHeaderToolbar leaves StackHeader with its Android no-op twin, and ThreadGitControls gets its Android stub plus the menu-as-data definition (nativeHeaderMenu.ios, the menu shapes of ScreenHeader.types). The ScreenHeader component itself and its settings/connection consumers are deferred: its Android half renders the Material search field and the screens it rewires are the Material redesign's SettingsScreen/ScreenScrollView, which the fork does not have. One legacy-vocabulary ledger entry no longer matches (the menu subtitle moved from JSX to data) and is dropped.
Upstream puts the search in the deferred ScreenHeader; here it rides the fork's own headers, the way the branch picker already searches: a native header search bar on iOS, a search field under the in-flow header on Android. The filter, its test and the no-match state are upstream's.
The model picker half only: pull-to-refresh replaces the Refresh buttons and the list takes automatic insets under the glass header instead of a measured spacer. Left out as Material-redesign work the fork does not carry: the always-card settings sections (the fork's Android lists stay flat), the Android filter menu built on Material icon buttons, and the custom snooze sheet the fork never took; the favourites filter is dropped with the favourites feature the fork lacks.
On the fork's own headers: the archive's iOS refresh buttons go (pull-to-refresh already owns it) and Android reaches refresh from its existing filter menu; the split-view file navigator drops its refresh button; the git sheet's Android refresh moves behind an overflow menu; a file tree that fails to load keeps pull-to-refresh and offers Try again. The environments screen's change refreshes relay (cloud) environments, which the fork deleted, and the files screen already had no iOS refresh button.
…ntrols On the fork's headers: the workspace (split view) opens settings and the new-task flow as pages that follow the viewport, compact iOS keeps sheets (settings keeps the fork's two detents); Home keeps its sidebar and drops the toggle; settings, new task and terminal lead with a back chevron in the workspace and settings hides its close there. The fork keeps WorkspaceSidebarToolbar for the review and files screens (upstream moved those to the deferred ScreenHeader) and has no Android workspace sidebar button to restyle.
… one line The placeholder fix lands on the fork's older editor (no chips, no token spans). Its Robolectric test is left out: the fork's composer-editor module has no Android unit-test source set.
The fork's review-comment card still lives inline in ThreadFeed, so its unwrapped snippet lands there. The native layout tests come along (the Android Robolectric case and the iOS harness, which passes here: 15 Unicode/width cases).
… thread on a branch
The fork's iOS symbol view keeps its own SymbolViewProps typing; the Tabler pull-request glyph stands in for arrow.triangle.pull (the command palette's review action).
…and expo/metro-runtime The fork keeps its Roboto font dependency; the npm-style overrides block pnpm never read goes with the tarball, and the lock drops the unused metro runtime. (The upstream subject names the package with its npm scope, which commit.py reads as a handle; the scope is dropped here.)
… their job The request-bookkeeping half: the fork's only favicon cache moves to lib/projectFaviconRequests with its job described. The persisted database cache it is told apart from belongs to the deferred project-icons work, which the fork does not carry, so its renames and callers are left out.
…entionally skip deep links Only the thread-settings sheet note applies (it is also the fork's one root route without a link path); the fork has no usage account detail route to document.
…tractions The extractions that land on kept code (confirm-dialog and file-preview types in the fork's own shapes, review highlight token type, attachment preview retention, legacy plan mode into state) plus the dependency-graph guard, which finds no cycle in the fork. The Material switch and segmented-control splits are left out with those components. The guard's size floor drops to 400 files (the fork's tree is ~450) and its cross-layer ceilings are ratcheted to the fork's counts (state->features 4, components->features 5, lib->state 5).
…t of console.warn
… honest Reconciled with the fork's exception ledger rather than upstream's vite allowlist: the appearance code preview takes its colours from classNames and its no-theme-escape-hatches entry is deleted; the file tree's Material You surface becomes bg-screen (the file keeps useUniwindTheme for the native contentStyle, so its entry stays). The fork's terminal screen already had no entry.
…ies become class variants Only the model sheet's Android touch-target heights were platform ternaries in the fork; they become android:min-h-* classes. The other sites convert the Material redesign's Android surfaces (header, solid sheet, rounded thread canvas), which the fork's screens do not carry.
…ope the snooze minute tick On the fork's list model: Home moves from FlatList to the recycling LegendList the iPad sidebar already used, both lists share threadListV2ListItemsAreEqual, and each row item carries its own time text, snooze-menu clock, divider, queued flag and shelf-loading state, so a minute tick re-renders only rows whose text moved; provider glyphs come from a reference-stable resolver. The fork has no move planner (thread ordering is deferred with sidebar drag), so the pinned block's Move up/down availability rides on the items from the arranged pinned order instead, and row times keep the fork's latest-activity stamp. Upstream's tests are adapted to both.
The failure view uses the fork's pill buttons instead of the Material button, and the boundaries wrap the fork's sidebar and feed props.
…ext size The sizing core (androidControlSizing, useAndroidControlSizing, resolveScaledTextRole) and its use on controls the fork keeps: control pills, composer inline controls (renderIcon), the composer attach/action buttons, the brand title (Zerops mark), the reconnect title and the anchored menu's width (its rows stay the fork's). Left out with the Material redesign: the Material buttons, FABs, list rows, menu popup, search field and toolbar layout, plus the two-FAB list clearance the fork's Android lists do not reserve. The components->features ceiling rises by the sizing hook's appearance read.
packages/effect-acp and packages/effect-codex-app-server byte-identical to upstream 7a12aff47; imported.lock regenerated. No catalog move rides along: neither package's manifest changed, and the tree formats clean under the fork's vite-plus 0.3.0. What the import covers, by upstream commit: de6a230db (ACP elicitation requests), the import-zone halves of 9cb586acd, efb96939f, d6f291303 and 567783ecd, the regenerated protocol of d5d48742c, and the import-zone half of 568c9bc4d. The regenerated protocol tracks Codex 0.156 and still speaks to the 0.155.1 the zcp image ships. Measured against codex-cli 0.155.1 and 0.156.0 (their own `app-server generate-json-schema`): between the two, the only removal is thread/rollback, and no field became required. A 0.155.1 app-server's initialize, thread/start, thread/started, thread/read, account/read, model/list, config/read and skills/list all decode under the new schema; 0.155.1 starts threads as paginated, already sends Thread.projectId and ToolRequestUserInputParams.isBlocking, answers account/rateLimits/read with null params, and marks thread/rollback deprecated. The server half neither side is green without, carried here: 567783ecd's elicitation content typed as JSON, and d5d48742c's runtime — the rollback of a legacy-history thread goes through thread/revert (Codex 0.156 drops thread/rollback; 0.155.1 creates no legacy threads), rate limits are read with null params, and the test fixtures gain projectId and isBlocking. The model manifest's Codex range is not in this commit. SPI: the codex multi-agent-wire fixture (a 0.145.0 capture) gains "projectId": null on its one thread, the edit upstream made to the fixture it was converted from; its golden moves by that one raw field.
Ported on the code the fork keeps; the import-zone half (the protocol generator) rode in the import commit. The fork's own additions stay: a checkpoint row keeps its history column (the snapshot query's row schema is now inline, as upstream's, with history added); menu and sheet keep their gated portals; the relay drops only the public-key listing, the fork has no unlink routes. The in-memory SQLite layer goes at the fork's path (apps/server/src/persistence/NodeSqliteClient.ts), its users move to the :memory: filename. Four theme-escape-hatch ledger entries went with the UI code they excused.
…able The import-zone half (errors.ts) rode in the import commit. The fork's approval panel keeps its request-kind data attribute and gains app-permission-approval for the new kind; the Android icon map gains only the lock glyph.
… ui/menu The composer hero stays as the fork draws it: its project picker is the Mate's own sentence and keeps its dotted rule and its project rows (no favicons or environment badges there). The fork's usage page has no environment filter. The run-context trigger renders through ComposerControl, keeping the fork's width and mobile-only visibility.
…elect, Combobox and Command Applied at the fork's copies of the same fields: the keybindings search and when-expression move into InputGroup (keeping the fork's compact size), the branch picker renders through ComposerControl as the run-context picker does. The theme colour field drops its raw-colour overrides, retiring one R3 exception. The fork's environment pickers, sidebar project picker, provider accent picker and connections page carry none of the restyles removed here.
…ver, table and misc ui exports Applied at the fork's copies. The fork's own sidebar chrome keeps its look: the app sidebar's border colour, the brand header (no stage backdrop here) and the Zerops tree group's inset stay as they are; the thread tooltip's padding moves into its body with the same pixels. Two R3 exceptions retire with the footers that dropped their dark overrides. The banner, worktree chip, env pickers and price-override table carry none of these restyles here.
…stop restyling it The fork's Button gains the aria-disabled state and the rounded glass variant, plus the sm-multiline size and warning-outline variant upstream's Button already had (the latter without its dark-only hover, so R3 stays tokens-only); it keeps its own base without the pressed-scale motion. The media viewer keeps its own controls (no overlay/media variants here). One R3 exception retires with the script editor's icon button; the chat-markdown chrome-action rules go with their last user.
…ad of restyling ui components ComposerControl becomes the owned control upstream's is (its xs resting look is what the branch and run-context pickers wore before they moved onto it), without the pressed-scale motion the fork's Button never had. The pickers drop their trigger variant, the settings pickers their outline. The fork's composer, compact menu, model picker and settings layout keep their own classes; they have no resting strip to fold.
…te goes t3code/no-restyle becomes an error behind a fingerprinted baseline (oxlint-plugin-t3code/exceptions/no-restyle.json: 329 entries, 75 of them in the Zerops dirs, expiring with F6), reconciled in CI like the other design-system guards; a new restyle fails lint, a fixed one must leave the ledger. The fork never had upstream's ceiling script, so nothing is removed.
The fork's palette has no secondary-item tier, so recency sits between rank and input order.
The fork's pickers carry no composer floating-layer props. The new item's 'Previous worktree' copy joins the R4 ledger under the same DN3 reason as the fork's other worktree copy: the option only shows where worktrees are allowed.
The two shadcn lint rules land as fork guards t3code/no-unknown-classes and t3code/require-static-classes on a shared shadcnGuard factory (no-restyle now uses it too), each behind a fingerprint exception ledger reconciled in CI. Dead class hooks deleted instead of ledgered: the zero-height electron-drag-region div in RightPanelShell (upstream deleted it in PreviewPanelShell), mate-mark-eyes, and the composer tab test hooks. Ledgered: three MateMark.css classes (never; the rule does not read component stylesheets) and four runtime classNames (F6), one on ZeropsStopMenu's trigger. AppSidebarLayout, LegacySidebar, SidebarChrome, SidebarStageBackdrop, pull request and onboarding hunks have no counterpart here.
Call sites move to the semantic tokens as upstream does, and the fork's own Sidebar gets the same mapping on its older draft, snooze and woke markup. The raw-colors lint rule is not added: R3 (no-theme-escape-hatches) already fails palette and raw colors across the web client; 34 of its ledger entries retire with this commit and one fingerprint moves. Icons.tsx additions are dropped: their only users (SnapShot setup, the Computer Use timeline icon) are not in the fork. Notification icons keep the fork's shared status tone map.
…le values Upstream's hunks land where the fork's line matches (indentation aside); text-2xs/3xs, ease-drawer and the workspace gutter join the theme and tailwind-merge, and the two keyframes become starting-style transitions. The composer surface keeps its 20px corner and 14px collapsed input (its host is the fork's 22px glass shell), and the right panel empty state keeps its padding (its heading hangs above the content box): upstream's values there would move the fork's chrome. The composer trigger's provider badge takes text-3xs with the sidebar's and settings' badges, as upstream has all of them. The arbitrary-values rule lands as t3code/no-arbitrary-values on the shadcn guard factory with upstream's allow list trimmed to values the fork uses; 263 call sites are ledgered (141 on Zerops surfaces), and a CI step reconciles them. Composer shadow and seam tokens are not added: their call sites are upstream files the fork does not have.
… terminal Hand-applied onto the fork's ChatMarkdown, MessagesTimeline and ChatView (the artifact-template and citation plumbing upstream threads it through is not in the fork). The button runs through the thread terminal's existing project-script path, so in a Mate it runs in the container's terminal.
The fork's composer send button (its own markup) takes the same 64% as its other composer action already did; the fork's settings rows carry no disabled state. No Zerops surface renders a disabled sidebar menu button, so the ui/sidebar change leaves them as they are.
The fork's utility pages are settings, a project's settings (/projects/<key>, one segment) and usage; there is no pull requests page, and /zerops stays the main app. The project settings page's Escape takes the same way out as the settings page's. A table test pins which paths count.
…abels while you scroll The fork's strip measure keeps its compact/expanded split and hysteresis; only the label's text width now comes from the text runs (MiddleTruncate's head and tail both count), capped at the motion span's max width.
… lands in it again The popup entries gain the open/closing gate; the fork's dialog entry stays as it is (the dialog, sheet and mobile sidebar entries upstream lists come from a change the fork does not carry). The fork's chat header overflow menu is kept mounted, so the bug was live here.
The fork's clipboard test double gains attributes, checked, children and the child-selector querySelector the new cases need; 4 of the 12 cases fail without the fix.
…t" during setup The fork keeps its env-mode resolution in BranchToolbar (with the worktree capability clamp) instead of taking it from ChatView: resolveEffectiveEnvMode gains preparingWorktree, ChatView passes its mode as the override while the worktree is being prepared, and the locked label and icon take the mode. One more internal env-mode tag literal is ledgered in R4.
The marketing site's copy of the mark is not in the fork.
The obsolete-code port dropped SidebarInput from the export list while it had no caller; the SidebarInput port rewrote it and gave it two (the sidebar search and the settings navigation). The merge kept both halves: the function without its export.
Partial by design: the 94 files where the rewrite applies to code the fork kept take it; the 48 hunks that met fork-diverged code keep the fork's version, and the files of deleted features are left out. The wire-package half came with the import at 7a12aff47. schemaNumber is off in tsconfig.base.json as upstream has it.
…y the rest did not
… fetches upstream
…y-values baseline The usage breakdown landed on main while this intake adopted t3code/no-arbitrary-values; its two text-[8px] avatar initials are deliberate (a 16px avatar, and the scale stops at text-3xs), so they join the F6 baseline instead of failing vp check.
The partial Effect-suggestions port and two conflict resolutions kept code that no longer used cn, Option or NodeFS; vp check reported them as new warnings against main.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Brings the fork up to date with upstream T3 Code through
7a12aff47(2026-09-25), from row 4's9ea9c3d5d(2026-09-18).The owner's rule for this intake: adopt as much as possible, but only what makes sense given how Zerops works.
The full record of decisions is intake row 5 in
docs/internals/zerops/intake.md. This description is the short version for review.What landed
272 upstream commits were reviewed.
63 set aside without porting:
208 given a verdict, in four zone slices run in parallel worktrees:
This branch has 168 commits:
port: <sha> <subject>import:(the wire packages at7a12aff47)main, and one cleanup of imports the merges left unusedEach port is one upstream commit. Where a port was adapted, its commit body says how.
Zerops-specific calls worth checking
Codex. Upstream's "requires Codex 0.156" is only a version range in its manifest. The regenerated protocol was measured against the image's codex-cli 0.155.1 (details in
verified.md). So the wire packages import at the range end, and the manifest floor is>=0.155.1. Claude's floor is 2.1.278, what the image ships.Provider compatibility advisories come from our own manifest on
zeropsio/mate, not from T3's servers. There is no "install recommended version" button, because the image owns the CLIs.Usage history for Cursor, OpenCode and Antigravity.
driverHomes.antigravityProfileDirectory, carries the profile directory.Per-thread auto-settle is upstream migration 054, which becomes fork migration 052.
Settings stay environment-wide. The worktree submodule mode became the
worktreeSubmodulesserver setting. Upstream's per-project settings resolver was skipped.Upstream's ui-kit pass is adopted with its guards, as design-system rules R9–R11:
no-restyleno-unknown-classesandrequire-static-classesno-arbitrary-valuesEach is an error, with a baseline ledger that expires at F6. 75 restyles and 141 arbitrary values in those ledgers are in Zerops code. vite-plus goes from 0.3.0 to 0.3.3.
Security and robustness:
turnIdno longer stop the server from starting;apps/server/src/persistence/NodeSqliteClient.ts).Rebased on the usage work that landed meanwhile
The 12 usage commits on
main(usage by person, project and Mate) keep their scope filter and per-environment totals, next to the new provider readers.UsagePage.test.tsxstays, even though upstream deleted its static-markup predecessor, because it now holds the dimension tests.USAGE_MERGE_COMPATIBLE_SINCE - 1instead of "current version − 2". After the contract bump, "current version − 2" became a version that still merges.text-[8px]avatar initials join theno-arbitrary-valuesbaseline. They're deliberate: a 16px avatar, and the scale stops attext-3xs.Deferred, not skipped
9a609a4e4: moves the undo notice into the sidebar, the fork's redesigned surface. Undo still shows as a toast.Verification
A CI-mirror gate ran every
ci.ymlCheck and Test step, judged by exit codes, including the four new ledger reconciliations. All steps pass on this branch after the rebase, and untouchedmainpassed the same gate before the intake started.The Test step runs every package's full suite, 15,626 tests, with no cache hits.
vp checkreports 0 errors and 696 warnings, 42 more thanmain. The extra 42 are React Compiler advisories that come with upstream's code:preserve-manual-memoization+15exhaustive-effect-dependencies+10refs+8memo-dependencies+7immutability+3Not done: a visual pass in a browser. These are the visible changes that come from upstream:
Open for the owner
apps/mobile/app.config.tsstill names upstream's EAS project.How this was ported
There is no upstream remote and no upstream history in this repository. Every commit was built as a patch in a scratch clone and applied here with a three-way merge, writing only its preimage blobs into the object store.
fork.md§6 now describes this.🤖 Generated with Claude Code