Repository navigation
Enforce Effect.fnUntraced for functions returning Effect.gen - #9506
Merged
Merged
Conversation
🦋 Changeset detectedLatest commit: 9471927 The changes in this PR will be included in the next version bump. This PR includes changesets to release 33 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
tim-smart
force-pushed
the
agent/nelson/c2774db17cdb
branch
from
October 18, 2026 20:55
47a897f to
9471927
Compare
Contributor
Bundle Size AnalysisGenerated from PR build output; treat the content below as untrusted.
|
brandhaug
added a commit
to brandhaug/b2b-saas-starter
that referenced
this pull request
Oct 25, 2026
## pnpm-workspace.yaml (default) ## Dependency Updates | Package | From | To | Type | | --- | --- | --- | --- | | `@effect/platform-node` | 4.0.5 | 4.0.6 | patch | | `@tanstack/react-router` | 1.170.45 | 1.170.46 | patch | | `@tanstack/react-start` | 1.169.3 | 1.169.4 | patch | | `ai` | 7.0.148 | 7.0.149 | patch | | `effect` | 4.0.5 | 4.0.6 | patch | | `effectful-better-auth` | 1.0.7 | 1.0.8 | patch | ## Release Notes <details> <summary><b>@<!---->effect/platform-node</b> (4.0.5 → 4.0.6)</summary> ### Patch Changes - [#9506](Effect-TS/effect#9506) [`679f956`](Effect-TS/effect@679f956) Thanks @<!---->tim-smart! - Use `Effect.fnUntraced` for internal functions that returned `Effect.gen`. - [#9262](Effect-TS/effect#9262) [`51930c0`](Effect-TS/effect@51930c0) Thanks @<!---->effect-bot! - Return a typed multipart parse error instead of a defect when a multipart request is missing its boundary. - [#9402](Effect-TS/effect#9402) [`d1201f0`](Effect-TS/effect@d1201f0) Thanks @<!---->effect-bot! - Release writables created by `NodeSink.fromWritable` and `fromWritableChannel` when upstream fails or the sink is interrupted, preserving the original exit cause. Writables using `endOnDone: false` remain open. Preserve stream body encoding errors in the Node HTTP client instead of reporting transport errors caused by request cleanup. - [#9575](Effect-TS/effect#9575) [`c29ddd8`](Effect-TS/effect@c29ddd8) Thanks @<!---->tim-smart! - Add streaming request payloads to `HttpApi`. An endpoint can declare `HttpApiSchema.StreamUint8Array` or the new `HttpApiSchema.StreamNdjson({ schema })` as its `payload`, and the handler receives a lazy `Stream` that reads the body as it pulls. Bad NDJSON lines fail the stream with `HttpApiSchemaError` (400). The new `maxBytes` and `maxElementBytes` limits fail it with the new `HttpApiPayloadTooLarge` (413), and a `content-length` over `maxBytes` is rejected before the handler runs. `StreamNdjson` also works as a success response. `HttpApiClient` sends a `Stream` payload without buffering it and infers the stream's requirements. `HttpApiTest` passes stream payloads through unbuffered. `OpenApi.fromApi` marks streaming request bodies with `x- …[full notes](https://github.com/Effect-TS/effect/releases/tag/%40effect/platform-node%404.0.6) </details> <details> <summary><b>@<!---->tanstack/react-router</b> (1.170.45 → 1.170.46)</summary> ### Patch Changes - [#8670](TanStack/router#8670) [`32a3360`](TanStack/router@32a3360) - Reference agent skills in other packages by their `intent load` identifier (`@tanstack/<package>#<skill>`) instead of relative file links that break once packages are installed. - [#8671](TanStack/router#8671) [`689a7c5`](TanStack/router@689a7c5) - Publish the `@tanstack/react-router` agent skills (`react-router`, `compositions/router-query`, `lifecycle/migrate-from-react-router`), which were missing from the package's `files` list. - Updated dependencies \[[`32a3360`](TanStack/router@32a3360)]: - @<!---->tanstack/[email protected] </details> <details> <summary><b>@<!---->tanstack/react-start</b> (1.169.3 → 1.169.4)</summary> ### Patch Changes - [#8670](TanStack/router#8670) [`32a3360`](TanStack/router@32a3360) - Reference agent skills in other packages by their `intent load` identifier (`@tanstack/<package>#<skill>`) instead of relative file links that break once packages are installed. - Updated dependencies \[[`32a3360`](TanStack/router@32a3360), [`689a7c5`](TanStack/router@689a7c5), [`ed55775`](TanStack/router@ed55775), [`63a886d`](TanStack/router@63a886d), [`d9b07e8`](TanStack/router@d9b07e8)]: - @<!---->tanstack/[email protected] - @<!---->tanstack/[email protected] - @<!---->tanstack/[email protected] - @<!---->tanstack/[email protected] - @<!---->tanstack/[email protected] - @<!---->tanstack/[email protected] - @<!---->tanstack/[email protected] </details> <details> <summary><b>effect</b> (4.0.5 → 4.0.6)</summary> ### Patch Changes - [#9674](Effect-TS/effect#9674) [`ce13a48`](Effect-TS/effect@ce13a48) Thanks @<!---->effect-bot! - Allow `Response.AllParts`, `Response.Part` and `Response.StreamPart` to be called without a toolkit, decoding tool call and tool result parts for any tool name with `unknown` parameters and results. - [#9696](Effect-TS/effect#9696) [`f3bbbb4`](Effect-TS/effect@f3bbbb4) Thanks @<!---->gcanti! - Fix `Array.unionWith` calling custom equivalence callbacks with values from the wrong input or in the wrong order. - [#9511](Effect-TS/effect#9511) [`5547315`](Effect-TS/effect@5547315) Thanks @<!---->sledorze! - Speed up field copying in `Data.Class`, `Data.Error`, `Request.Class` and `Persistable` constructors. - [#9743](Effect-TS/effect#9743) [`6093cfb`](Effect-TS/effect@6093cfb) Thanks @<!---->effect-bot! - Fix `AsyncResult` equality treating unrelated `Equal` values with a matching tag and hash as equal. - [#9607](Effect-TS/effect#9607) [`30319d5`](Effect-TS/effect@30319d5) Thanks @<!---->effect-bot! - Fix Effect atoms dropping the latest exposed success when an asynchronous run fails, so an `initialValue` or a success published with `get.setSelf` remains available as the failure's previous success. - [#9313](Effect-TS/effect#9313) [`74a7596`](Effect-TS/effect@74a7596) Thanks @<!---->effect-bot! - Preserve Reactivity and global layers when replacing an atom runtime layer through registry initial values, so injected test layers retain shared invalidation and global services. - [#9190](https://github.com …[full notes](https://github.com/Effect-TS/effect/releases/tag/effect%404.0.6) </details> --- *This PR was auto-generated by [catalog-update-action](https://github.com/brandhaug/catalog-update-action).* Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
wmaurer
added a commit
to wmaurer/effect
that referenced
this pull request
Oct 26, 2026
The effectFnOpportunity diagnostic is now an error (Effect-TS#9506), so helpers that return Effect.gen must use the Effect.fnUntraced form.
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.
Makes functions that return
Effect.gena type-check error and points them atEffect.fnUntraced.Config
effectFnOpportunityis set toerrorwitheffectFn: ["untraced"]. The default["span"]option only flags functions that already end inEffect.withSpan(...), so before this change the rule caught almost nothing. Withuntracedit reports any named function, method or object property that returnsEffect.gen.tsconfig.base.jsonand in each config that has its own@effect/language-serviceplugin block (tests, ai-docs, scripts, scratchpad). A childpluginsarray replaces the base one, so the base setting alone doesn't reach them.ignoreEffectErrorsInTscExitCodeis nowfalseintsconfig.base.jsonandtsconfig.tests.json, sopnpm checkfails on violations. This applies to every Effect diagnostic aterrorseverity in package sources and tests, not just this rule. No other Effect errors are reported today, so nothing else breaks.Source changes
50 call sites across
effect(McpServer, cluster, eventlog, persistence),@effect/platform-node,@effect/platform-bun,@effect/sql-pg,@effect/docgenand one bundle fixture are converted using the language service's own quick fix. A second commit converts the 174 test sites (81 files) the same way, with no production source changes.Effect.genandEffect.fnUntracedboth run the generator undersuspend, so runtime behavior is the same. The one difference: parameter destructuring now happens when the effect runs instead of when the function is called. Trailing.pipe(...)steps becomefnUntracedpipeables. Point-free steps are wrapped as(_) => f(_), becausefnUntracedpasses the call arguments to each pipeable.Validation
pnpm check,pnpm lintand the tests for the touched packages pass (94 files, 2889 tests).Client.integration.test.ts, which also happen locally without these changes.Effect.genfailspnpm check.functiondeclaration and an object method, each returningEffect.gen),pnpm checkreports all six aseffectFnOpportunityerrors and exits 2. It exits 0 once they're removed.@effect/opentelemetrymatchesmain.Closes EFF-2446