page:docs-specs-platform-gaps-phase0-t3code-patches-inventory
t3code upstream patch inventory (WP-T3-32 stage 1) reference
Source: the read-only t3code snapshot at commit de251fc2971a884cb5b1305ba4daf309dc8cccb0 (MIT, T3 Tools Inc. — intent D15), patches/ directory (23 files) as wired by pnpm-workspace.yaml patchedDependencies (lines 182–205 of the snapshot). Every patch was read hunk by hunk; the "purpose" column is derived from the hunks and the upstream comments they carry, not from commit messages. "Consumers" is the set of t3code workspaces whose package.json declares the package (transitive-only packages say so).
t3code upstream patch inventory (WP-T3-32 stage 1)
Source: the read-only t3code snapshot at commit de251fc2971a884cb5b1305ba4daf309dc8cccb0 (MIT, T3 Tools Inc. — intent D15), patches/ directory (23 files) as wired by pnpm-workspace.yaml patchedDependencies (lines 182–205 of the snapshot). Every patch was read hunk by hunk; the "purpose" column is derived from the hunks and the upstream comments they carry, not from commit messages. "Consumers" is the set of t3code workspaces whose package.json declares the package (transitive-only packages say so).
Decision key:
- **PORTED** — carried into fabric under
patches/(patch-package format) and applied onpostinstall. - **DROPPED-mobile-only** — every consumer is
t3:apps/mobile, which intent D13 excludes from adoption; nothing in fabric will ever install the package. - **DROPPED-toolchain** — the patch exists only to serve the pnpm/vite-plus toolchain that spec 10 §2 (B5 exclusion list) and WP-T3-32 stage 2 replace; porting it would break the package under fabric's stock toolchain.
- **DEFERRED-stage-2** — the package is consumed by a unit that lands in a later WP (server, web, desktop); the patch is re-evaluated when that unit lands, against whatever version of the package is current then.
Counts
| Decision | Count |
|---|---|
| PORTED | 1 (effect) |
| DROPPED-toolchain | 1 (@effect/vitest) |
| DROPPED-mobile-only | **17** |
| DEFERRED-stage-2 | 4 (@ff-labs/fff-node, dbus-next, @legendapp/list, @pierre/diffs) |
| Total | 23 |
The WP-T3-32 brief says "19 mobile-only". Reading the consumers gives **17**: @legendapp/list and @pierre/diffs are declared by t3:apps/web as well as t3:apps/mobile (apps/web/package.json), and their hunks touch web-relevant entrypoints (react.js, react-native.web.js; dist/components/VirtualizedFile.js, dist/react/utils/useFileInstance.js), so they are not mobile-only and are deferred to the console-web landing (WP-T3-25) instead of dropped.
Inventory
| # | Upstream patch file | Target | Consumers (t3code) | Purpose (from the hunks) | Decision |
|---|---|---|---|---|---|
| 1 | @clerk__expo@4.6.8.patch | @clerk/expo@4.6.8 | apps/mobile | iOS Swift: Clerk auth/profile native views take the theme page background, pre-glass solid nav bar, and pop the enclosing React Navigation route natively on back | DROPPED-mobile-only (Clerk is also excluded outright, spec 10 §2 row 10) |
| 2 | @effect__vitest@4.0.0-rc.115.patch | @effect/vitest@4.0.0-rc.115 | every workspace (13) | Rewrites every import … from "vitest" / export * from "vitest" in dist/ and src/ to vite-plus/test so the package runs under Voidzero's vite-plus test runner; no behavioural change | DROPPED-toolchain — fabric runs stock vitest, where the unpatched package's vitest imports are exactly right; scripts/ci/effect-baseline.test.mjs pins that the installed package imports vitest and never vite-plus (see docs/EFFECT-BASELINE.md §3) |
| 3 | @expo__metro-config@57.0.12.patch | @expo/metro-config@57.0.12 | transitive of expo (apps/mobile only) | Metro source-map serializer: strip Hermes segments that reference generated lines Metro never emitted so @jridgewell/remapping does not throw | DROPPED-mobile-only |
| 4 | @ff-labs__fff-node@0.9.4.patch | @ff-labs/fff-node@0.9.4 | apps/server | Resolve the native binary through app.asar.unpacked when packaged in Electron; add require and reorder types in the exports map | DEFERRED-stage-2 (rides WP-T3-19 apps/environment; re-check against the then-current fff-node) |
| 5 | @legendapp__list@3.3.5.patch | @legendapp/list@3.3.5 | apps/mobile, apps/web | Large keyboard/inset rework of the virtualized list (useKeyboardChatComposerInset, contentInsetStartAdjustment, safe-area-net anchored blank, reanimated timing), 12 files incl. react.js and react-native.web.* | DEFERRED-stage-2 (web consumer; evaluate at WP-T3-25) |
| 6 | @pierre%2Fdiffs@1.3.0-beta.10.patch | @pierre/diffs@1.3.0-beta.10 | apps/mobile, apps/web | Diff renderer: applyDocumentChange(..., startLine) keeps unchanged wrapped-row heights, code-width change invalidates the layout cache, ResizeManager.onResize hook, token transformer on by default, worker cache eviction on file change, extra exports subpaths (./types, ./utils/*) | DEFERRED-stage-2 (web consumer; evaluate at WP-T3-25) |
| 7 | @react-native-ai__apple@0.12.0.patch | @react-native-ai/apple@0.12.0 | apps/mobile | iOS Swift transcription: locale support/asset-installation errors, invalid-audio rejection, temp-file cleanup, collected timed segments | DROPPED-mobile-only |
| 8 | @react-native-menu__menu@2.0.0.patch | @react-native-menu/menu@2.0.0 | apps/mobile | iOS menu: onMenuInteractionStart event on old and new architecture, nested sub-sub-actions, presented-guard flush | DROPPED-mobile-only |
| 9 | @react-navigation%2Fnative-stack@7.17.6.patch | @react-navigation/native-stack@7.17.6 | apps/mobile | Emit finishTransitioning to every route (modal dismiss), unstable_header{Center,Right,Toolbar}Items, mailSearchToolbar item type, header subtitle/navigation-item style | DROPPED-mobile-only |
| 10 | dbus-next@0.10.2.patch | dbus-next@0.10.2 | apps/desktop | Drop the optional usocket dependency: connect to Unix path and abstract sockets with net.createConnection (no FD passing needed); deletes CHANGELOG.md | DEFERRED-stage-2 (rides WP-T3-26 console-desktop) |
| 11 | effect@4.0.0-rc.115.patch | effect@4.0.0-rc.115 | every workspace | (a) unstable/rpc/RpcClient: new RequestHooks service (onRequestStart/Chunk/Exit/Interrupt), ConnectionHooks.onPing/onPong/onPingTimeout, pinger tolerates 3 missed pongs before timeout, onPong becomes an Effect; (b) unstable/http/HttpClientResponse: cookies tolerates a headers object without getSetCookie (getSetCookie?.() ?? [], dist + src); (c) unstable/ai/McpServer: HTTP DELETE <path> ends the MCP session (400 no header / 404 unknown / 204) instead of 405 | **PORTED** → patches/effect+4.0.0-rc.115.patch (5 files, 23 hunks, bodies byte-identical to upstream; only the a//b/ prefixes gained node_modules/effect/) |
| 12 | expo-audio@57.0.4.patch | expo-audio@57.0.4 | apps/mobile | iOS: didFinish(successfully:) reports .error / hasError when the recorder fails instead of always "stopped" | DROPPED-mobile-only |
| 13 | expo-modules-core@57.0.14.patch | expo-modules-core@57.0.14 | transitive of expo (apps/mobile only) | iOS: @synchronized around the permissions-requester maps | DROPPED-mobile-only |
| 14 | expo-notifications@57.0.15.patch | expo-notifications@57.0.15 | apps/mobile (t3code) | iOS: lock-protected delegate list and pending-response buffer so overlapping React runtimes do not lose notification responses | DROPPED-mobile-only. Note: fabric's root dependencies carries expo-notifications ^55.0.23 for its own packages/genty/mobile-* shells (spec 15 §3.2 retirement list); the t3code patch targets 57.0.15 and is not applicable to that line |
| 15 | expo-sharing@57.0.17.patch | expo-sharing@57.0.17 | apps/mobile | Android share-intent parser: text + stream payloads together, originalName from DISPLAY_NAME (blank stays null); types updated | DROPPED-mobile-only |
| 16 | expo-widgets@57.0.15.patch | expo-widgets@57.0.15 | apps/mobile | iOS WidgetKit: widgetRenderingMode and isLiquidGlassAvailable (iOS 26) in the environment, live-activity sections read the environment inside the rendered view | DROPPED-mobile-only |
| 17 | react-native-gesture-handler@2.32.0.patch | react-native-gesture-handler@2.32.0 | apps/mobile | Swipeable: failOffsetY, onSwipeableRelease (UI-thread full-swipe commit); iOS hover handler removes the pointer interaction before Fabric recycles the view | DROPPED-mobile-only |
| 18 | react-native-keyboard-controller@1.21.13.patch | react-native-keyboard-controller@1.21.13 | apps/mobile | KeyboardChatScrollView: report presentation height / effective bottom padding (onContentInsetChange, adjustedInsetCompensation, adjustedStartInsetCompensation) for virtualized-list scroll math on iOS | DROPPED-mobile-only |
| 19 | react-native-nitro-markdown@0.5.8.patch | react-native-nitro-markdown@0.5.8 | apps/mobile | md4c autolinks: single-label hosts (localhost), ports, wider path/query charset, trailing punctuation left outside the link (upstream comment in pnpm-workspace.yaml) | DROPPED-mobile-only |
| 20 | react-native-nitro-modules@0.35.9.patch | react-native-nitro-modules@0.35.9 | apps/mobile | package.json codegen config: iOS modulesProvider entry | DROPPED-mobile-only |
| 21 | react-native-reanimated@4.5.5.patch | react-native-reanimated@4.5.5 | apps/mobile | Layout animations: isExitingWhenSettled so a settled animation keeps its final frame unless the view is being removed (backport of software-mansion/react-native-reanimated#10171, per the upstream comment) | DROPPED-mobile-only |
| 22 | react-native-screens@4.26.2.patch | react-native-screens@4.26.2 | apps/mobile | iOS 26 glass-chrome header props (bar-button items, menus, subtitle, navigation-item style) with Android no-op setters so codegen compiles; 12 files, 78 hunks | DROPPED-mobile-only |
| 23 | uniwind@1.11.0.patch | uniwind@1.11.0 | apps/mobile | Tailwind-for-RN CSS processor: Tailwind ≥4.3.3 flat variant selectors, media queries surviving sibling-rule resets, data-* attribute variants; metro transformer | DROPPED-mobile-only |
Cross-checks
- Names in this table are exactly the 23 keys of the snapshot's
patchedDependenciesblock;scripts/ci/effect-baseline.test.mjsasserts every one of them appears here (test 4), so the inventory cannot drift from the upstream list without a reviewed edit. t3:apps/webdoes not declarereact-native,expoor anyreact-native-*package (grep -n react-native apps/web/package.json→ none), which is what makes rows 3, 7–9, 12–13, 15–23 mobile-only.- Row 14 is the only upstream patch whose target package also exists in fabric today, on a different major (
expo-notifications ^55at the fabric root); it is not applied because the patch is written against 57.0.15 and the consumer is the retired mobile shell line.