Repository navigation
chore(deps): upgrade Effect to stable 4.0.1 - #16138
Conversation
Effect 4.0 drops the `effect/unstable/*` export paths, so every import
moves to its flattened `effect/<area>` path (`httpapi` becomes `http-api`),
and `effect/Encoding` is split into `effect/encoding/{Base64,Base64Url,Hex}`.
Dependencies that still target the release candidates:
- Alchemy 2.0.0-beta.80 and distilled 1.0.0-rc.13 ship the new layout.
- OpenCode 2 (@opencode/client, protocol, schema) moves to 2.0.23 and is
patched: it still imports the removed paths, `Encoding` and
`Schema.isStartsWith`, and its `statics` helper assigned over a schema's
`make`, which 4.0 caches as a non-configurable property. Drop the
patches once OpenCode targets stable Effect.
- Drizzle's Effect integration only references the old paths in .d.ts
files and loads unchanged.
Behavior changes from rc.116 through 4.0.1:
- `HttpRouter.serve` builds the app in a private memo map, so the server's
`TracerDisabledWhen` predicate is provided to the served layer. Services
from layers around `serve` win over the app's own, so the static-file
test provides its FileSystem between `serve` and the test server.
- `Scope.close` requires a closeable scope: SSH tunnels take their entry
scope explicitly, and the ACP and Antigravity runtimes close a child of
the caller's scope.
- `RpcSerialization.ndJsonRpc` skips lines that are not JSON, so effect-acp
decodes each frame with the strict codec to keep failing sessions on a
malformed agent line.
- `Effect.partition` returns successes first; `Stream.scan` takes a lazy
initial state; `SchemaGetter.onSome`/`.compose` are replaced;
`Schema.brand` requires a single concrete brand key.
- A declared MCP tool failure is returned as `isError` with its payload as
JSON text, without `structuredContent`; the MCP tests read it there.
The effect patch is re-ported. It keeps MCP session DELETE, the RpcClient
request and connection hooks, the missed-pong tolerance and the React
Native `getSetCookie` guard. 4.0.1 ships its own fix for a busy stream
blocking the socket on interrupt, so the patch's version of that is gone.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This is a broad Effect runtime upgrade spanning production desktop, mobile, web, server, relay, and shared code, with additional process-lifecycle, parser, tracing, and authentication-path changes plus patched third-party packages. The sensitive authentication-directory changes and non-mechanical runtime adaptations make the blast radius unsuitable for automatic approval. You can add or adjust custom eligibility rules. Learn more. |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 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.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
RequestHooks and the ConnectionHooks onPing/onPong/onPingTimeout callbacks have had no callers since the client connection rewrite (#2978). The patch now carries only MCP session DELETE (upstream: Effect-TS/effect#8773), the getSetCookie guard (Effect-TS/effect#8772) and the missed-pong tolerance (Effect-TS/effect#8774). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@effect/vitest 4.0.1 declares vitest as a peer. pnpm auto-installed one for it, and that vitest brought real vite@8.3.2 with its own rolldown, since the vite → vite-plus-core override does not reach auto-installed peers. Our patch already makes @effect/vitest import vite-plus/test, so the patch now also drops the unused vitest peer, and the peerDependenciesMeta extension that only marked it optional goes away. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A catalog: spec in packageExtensions resolves only when the same name has a catalog: override, which is why vite-plus@*'s vite entry worked and @effect/vitest's vite-plus one did not. Add a vite-plus catalog override so @effect/vitest can use catalog: like everything else, and every vite-plus in the tree resolves to the one catalog version. The vite-plus@* extension is dropped: vite-plus already depends on vite-plus-core, so it changed nothing but the extensions checksum. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Resolves the conflict with the Effect 4.0.1 upgrade (pingdotgg#16138): reactivity and sql modules dropped their unstable/ prefix. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
## What's Changed * chore(deps): upgrade Effect to stable 4.0.1 by @juliusmarminge in pingdotgg/t3code#16138 * fix(server): worktree threads survive a local branch named t3code by @juliusmarminge in pingdotgg/t3code#16167 * chore(refs): sync Effect and Alchemy references to 4.0.1 and beta.80 by @juliusmarminge in pingdotgg/t3code#16170 * fix(web): match subagent timestamp fonts to chat by @StiensWout in pingdotgg/t3code#16151 * fix(web): wrap full status text in composer hover details by @UtkarshUsername in pingdotgg/t3code#16158 * ci: run the transfer report job on Blacksmith by @juliusmarminge in pingdotgg/t3code#16178 * fix(server): Stop also stops delegated tasks and pull request watches by @t3dotgg in pingdotgg/t3code#16002 * feat: native /goal for Codex and Claude, with goal status in the UI by @t3dotgg in pingdotgg/t3code#15592 * fix(server): name the cause of a failed git command by @walid-baharwal in pingdotgg/t3code#8645 * fix(server): PR watch wakes the agent when a bot edits its review comment by @Gigioxx in pingdotgg/t3code#15415 * feat(source-control): omit agent credits from PR merge messages by @juliusmarminge in pingdotgg/t3code#16192 * fix(clients): dropped connections say why in the client trace by @t3dotgg in pingdotgg/t3code#16200 * fix(server): PR watch reports a required check that first appears already passed by @ScottN-PV in pingdotgg/t3code#15804 * fix: a failed DPoP key load and a fresh maintenance read are no longer cached by @juliusmarminge in pingdotgg/t3code#15500 * fix: tool screenshots show as images, not base64 text by @t3dotgg in pingdotgg/t3code#16199 * docs(mcp): thread tools reach threads in any project by @t3dotgg in pingdotgg/t3code#15947 * fix(threads): threads watching a PR stay in Working instead of bouncing to the inbox by @t3dotgg in pingdotgg/t3code#16204 * chore(deps): bump cursor sdk and astro to clear vulnerable transitives by @juliusmarminge in pingdotgg/t3code#16214 * fix(server): PR sync waits out a GitHub rate limit pause instead of failing every PR by @t3dotgg in pingdotgg/t3code#16203 * feat(server): scheduled tasks can run on a webhook by @juliusmarminge in pingdotgg/t3code#15085 * feat(relay): forward webhook requests to the environment's tunnel by @juliusmarminge in pingdotgg/t3code#15086 * feat(mobile): create and copy webhook automations by @juliusmarminge in pingdotgg/t3code#15087 * feat(web): create webhook automations and inspect their deliveries by @juliusmarminge in pingdotgg/t3code#15088 * feat(relay,server,web,mobile): opt-in to hold webhooks while offline by @juliusmarminge in pingdotgg/t3code#15487 * fix(server): PR watches stop burning GitHub's rate limit and giving up by @t3dotgg in pingdotgg/t3code#16208 * fix(server): delegation sees a fixed provider without the app open by @t3dotgg in pingdotgg/t3code#16219 * feat: new branches use the shorter t3/ prefix by @t3dotgg in pingdotgg/t3code#16220 * perf: cheaper shell refreshes, one copy of Codex streaming text, no MCP wait polling by @t3dotgg in pingdotgg/t3code#15033 * feat: agents can show HTML pages inline in threads by @t3dotgg in pingdotgg/t3code#15968 * chore(relay): match Alchemy to the PS-80 Postgres cluster by @juliusmarminge in pingdotgg/t3code#16228 * feat: agents ask the user for a secret through a private card by @juliusmarminge in pingdotgg/t3code#15907 * feat(web): see and stop pull request watches in the thread details card by @t3dotgg in pingdotgg/t3code#16235 * fix(server): ACP mode states with null descriptions are no longer dropped by @juliusmarminge in pingdotgg/t3code#16218 * fix(server): finished outbox rows and old PR cache files are pruned by @juliusmarminge in pingdotgg/t3code#16247 * fix(relay): releasing a tunnel that still has a connector no longer 500s by @juliusmarminge in pingdotgg/t3code#16250 ## New Contributors * @ScottN-PV made their first contribution in pingdotgg/t3code#15804 **Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261005.2689...v0.0.46-nightly.20261005.2702 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261005.2702
## What's Changed * chore(deps): upgrade Effect to stable 4.0.1 by @juliusmarminge in pingdotgg/t3code#16138 * fix(server): worktree threads survive a local branch named t3code by @juliusmarminge in pingdotgg/t3code#16167 * chore(refs): sync Effect and Alchemy references to 4.0.1 and beta.80 by @juliusmarminge in pingdotgg/t3code#16170 * fix(web): match subagent timestamp fonts to chat by @StiensWout in pingdotgg/t3code#16151 * fix(web): wrap full status text in composer hover details by @UtkarshUsername in pingdotgg/t3code#16158 * ci: run the transfer report job on Blacksmith by @juliusmarminge in pingdotgg/t3code#16178 * fix(server): Stop also stops delegated tasks and pull request watches by @t3dotgg in pingdotgg/t3code#16002 * feat: native /goal for Codex and Claude, with goal status in the UI by @t3dotgg in pingdotgg/t3code#15592 * fix(server): name the cause of a failed git command by @walid-baharwal in pingdotgg/t3code#8645 * fix(server): PR watch wakes the agent when a bot edits its review comment by @Gigioxx in pingdotgg/t3code#15415 * feat(source-control): omit agent credits from PR merge messages by @juliusmarminge in pingdotgg/t3code#16192 * fix(clients): dropped connections say why in the client trace by @t3dotgg in pingdotgg/t3code#16200 * fix(server): PR watch reports a required check that first appears already passed by @ScottN-PV in pingdotgg/t3code#15804 * fix: a failed DPoP key load and a fresh maintenance read are no longer cached by @juliusmarminge in pingdotgg/t3code#15500 * fix: tool screenshots show as images, not base64 text by @t3dotgg in pingdotgg/t3code#16199 * docs(mcp): thread tools reach threads in any project by @t3dotgg in pingdotgg/t3code#15947 * fix(threads): threads watching a PR stay in Working instead of bouncing to the inbox by @t3dotgg in pingdotgg/t3code#16204 * chore(deps): bump cursor sdk and astro to clear vulnerable transitives by @juliusmarminge in pingdotgg/t3code#16214 * fix(server): PR sync waits out a GitHub rate limit pause instead of failing every PR by @t3dotgg in pingdotgg/t3code#16203 * feat(server): scheduled tasks can run on a webhook by @juliusmarminge in pingdotgg/t3code#15085 * feat(relay): forward webhook requests to the environment's tunnel by @juliusmarminge in pingdotgg/t3code#15086 * feat(mobile): create and copy webhook automations by @juliusmarminge in pingdotgg/t3code#15087 * feat(web): create webhook automations and inspect their deliveries by @juliusmarminge in pingdotgg/t3code#15088 * feat(relay,server,web,mobile): opt-in to hold webhooks while offline by @juliusmarminge in pingdotgg/t3code#15487 * fix(server): PR watches stop burning GitHub's rate limit and giving up by @t3dotgg in pingdotgg/t3code#16208 * fix(server): delegation sees a fixed provider without the app open by @t3dotgg in pingdotgg/t3code#16219 * feat: new branches use the shorter t3/ prefix by @t3dotgg in pingdotgg/t3code#16220 * perf: cheaper shell refreshes, one copy of Codex streaming text, no MCP wait polling by @t3dotgg in pingdotgg/t3code#15033 * feat: agents can show HTML pages inline in threads by @t3dotgg in pingdotgg/t3code#15968 * chore(relay): match Alchemy to the PS-80 Postgres cluster by @juliusmarminge in pingdotgg/t3code#16228 * feat: agents ask the user for a secret through a private card by @juliusmarminge in pingdotgg/t3code#15907 * feat(web): see and stop pull request watches in the thread details card by @t3dotgg in pingdotgg/t3code#16235 * fix(server): ACP mode states with null descriptions are no longer dropped by @juliusmarminge in pingdotgg/t3code#16218 * fix(server): finished outbox rows and old PR cache files are pruned by @juliusmarminge in pingdotgg/t3code#16247 * fix(relay): releasing a tunnel that still has a connector no longer 500s by @juliusmarminge in pingdotgg/t3code#16250 ## New Contributors * @ScottN-PV made their first contribution in pingdotgg/t3code#15804 **Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261005.2689...v0.0.46-nightly.20261005.2702 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261005.2702
Merges upstream/main up to ac8e945 (123 commits since the fork base 7812230). The upstream commits are kept as they are; against upstream, the result differs only in the 19 T3.14 files. Two textual conflicts (ProviderTurnStartService imports, server.ts layer naming), plus twelve renames and moves from upstream pingdotgg#16295, pingdotgg#16282 and pingdotgg#16138 fixed in T3.14 code. No behavior change. 334 tests pass, and the merged server boots with a durable Pi instance. Codex: no major issues. Running the fork now needs `T3_SERVICE_LAUNCHER_CONTEXT` unset when it is started from a shell an installed T3 launched. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Moves Effect from
4.0.0-rc.115to stable4.0.1, without waiting for OpenCode to move off the release candidates. 4.0.1 includes several fixes we sent upstream (interruptedEffect.cached/Cachelookups, idlegroupedWithinticking, sqlite-node prepare caching, RpcClient stream buffers on interrupt). This replaces #14914, which targeted 4.0.0 and is 170 commits behind main.Changes
Imports. 4.0 removes the
effect/unstable/*paths: every import moves toeffect/<area>(httpapibecomeshttp-api), andeffect/Encodingis split intoeffect/encoding/{Base64,Base64Url,Hex}. This is the bulk of the 834 files and was done with a script.Dependencies.
effectand every@effect/*package at 4.0.1.@opencode/client,protocol,schema) at 2.0.23, patched. They still import the removed paths,EncodingandSchema.isStartsWith, and theirstaticshelper assigned over a schema'smake, which 4.0 caches as a non-configurable property. Drop the patches once OpenCode targets stable Effect.Behavior changes picked up from rc.116 through 4.0.1:
HttpRouter.servebuilds the app in a private memo map, soTracerDisabledWhenis provided to the served layer.Scope.closerequires a closeable scope: SSH tunnels and the ACP and Antigravity runtimes close a scope they own.RpcSerialization.ndJsonRpcskips non-JSON lines, so effect-acp decodes each frame with the strict codec to keep failing on a malformed agent line.Effect.partitionreturns successes first;Stream.scantakes a lazy initial state;SchemaGetter.onSome/.composeare replaced;Schema.brandneeds a single concrete brand key.isErrorwith JSON text, withoutstructuredContent; the MCP tests read it there.Patches.
effect@4.0.1.patchis down to three changes, each sent upstream so it can be dropped:allowSessionTermination; we'd pass it once that lands).getSetCookieguard: Effect-TS/effect#8772.The RpcClient
RequestHooksandonPing/onPong/onPingTimeouthooks are dropped: nothing has used them since the client connection rewrite in [codex] Rewrite client connection architecture #2978. 4.0.1 has its own fix for a busy stream blocking the socket on interrupt, so ours is dropped too. The Alchemy patch applies unchanged.@effect/vitestpatch. Besides importingvite-plus/test, it now drops the package'svitestpeer. Left in, pnpm auto-installed a secondvitestfor it, and that one pulled in realvite@8.3.2and another rolldown, because ourvite→ vite-plus-core override doesn't reach auto-installed peers. Nothing imported it.Verification
tsc --noEmitclean in all 12 packages: contracts, shared, effect-acp, effect-codex-app-server, client-runtime, ssh, tailscale, server, desktop, web, mobile, relay.vp test run:/varvs/private/vartemp paths, symlink resolution, the root.envleaking a Clerk client id intoconnectCliAuth.test.ts, and the Swift TSan fixtures.OpenCode2Client.live.test.tsagainst a real OpenCode 2.0.23 server: passes (server info, one turn, history paging), so the patched client decodes the live API under 4.0.1. Its pinned server version moves to 2.0.23.Not in this PR: syncing
.repos/effect-smolto 4.0.1 (separate refs PR).Model/harness: Claude Opus 5.5 (1M context) via Claude Code in T3 Code.
🤖 Generated with Claude Code