{
  "window": {
    "author": "kitlangton",
    "repository": "Effect-TS/effect",
    "from": "2026-09-02T17:50:37Z",
    "to": "2026-09-04T17:50:37Z",
    "query": "created:2026-09-02T17:50:37Z..2026-09-04T17:50:37Z",
    "total": 174,
    "merged": 143,
    "open": 23,
    "closedUnmerged": 8
  },
  "selection": "Concrete semantic failures and focused implementation corrections; editorial order, not severity rank.",
  "fixes": [
    {
      "pr": 7655,
      "title": "fix(Stream): preserve large source chunks when rechunking",
      "url": "https://github.com/Effect-TS/effect/pull/7655",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T18:49:56Z",
      "mergedAt": "2026-09-03T01:08:27Z",
      "head": "86484819fd9054f8872939dbf0913c9823c63dd3",
      "files": [
        {
          "filename": "packages/effect/src/Stream.ts",
          "patch": "@@ -6905,7 +6905,9 @@ export const rechunk: {\n             if (chunk.length === 0 && arr.length === target) {\n               return Effect.succeed(arr)\n             } else if (chunk.length + arr.length < target) {\n-              chunk.push(...arr)\n+              for (let i = 0; i < arr.length; i++) {\n+                chunk.push(arr[i])\n+              }\n               return loop()\n             }\n             current = arr",
          "additions": 3,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7659,
      "title": "fix(Sink): preserve unconsumed leftovers in flatMap",
      "url": "https://github.com/Effect-TS/effect/pull/7659",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T18:50:05Z",
      "mergedAt": "2026-09-03T00:44:57Z",
      "head": "cb0fb2789914f580e23654fad636b9ca761cc112",
      "files": [
        {
          "filename": "packages/effect/src/Sink.ts",
          "patch": "@@ -1247,7 +1247,12 @@ export const flatMap: {\n             return upstream\n           }),\n           scope\n-        )\n+        ).pipe(Effect.map((end): End<A1, L | L1> => {\n+          if (!leftover) {\n+            return end\n+          }\n+          return [end[0], end[1] ? [...end[1], ...leftover] : leftover]\n+        }))\n     )\n   }))\n ",
          "additions": 6,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7782,
      "title": "fix(Order): retain finite criteria across comparisons",
      "url": "https://github.com/Effect-TS/effect/pull/7782",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T00:00:39Z",
      "mergedAt": "2026-09-03T04:38:28Z",
      "head": "c775d6a26fbd5d6832d4526a7d864f927ca69d54",
      "files": [
        {
          "filename": "packages/effect/src/Order.ts",
          "patch": "@@ -368,6 +368,7 @@ export function alwaysEqual<A>(): Order<A> {\n  *\n  * Applies orders in iteration order and short-circuits on the first non-zero\n  * result. It returns `0` only if all orders return `0`.\n+ * The collection is materialized when the order is created, so it must be finite.\n  *\n  * **Example** (Combining multiple Orders)\n  *\n@@ -397,9 +398,10 @@ export function alwaysEqual<A>(): Order<A> {\n  * @since 2.0.0\n  */\n export function combineAll<A>(collection: Iterable<Order<A>>): Order<A> {\n+  const orders = Array.from(collection)\n   return make((a1, a2) => {\n     let out: Ordering = 0\n-    for (const O of collection) {\n+    for (const O of orders) {\n       out = O(a1, a2)\n       if (out !== 0) {\n         return out",
          "additions": 3,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7774,
      "title": "fix(Trie): preserve valued nodes during removal",
      "url": "https://github.com/Effect-TS/effect/pull/7774",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T23:59:36Z",
      "mergedAt": "2026-09-03T04:43:15Z",
      "head": "23c8256b6e535be0b7401159203575fa1e27a0f5",
      "files": [
        {
          "filename": "packages/effect/src/internal/trie.ts",
          "patch": "@@ -516,7 +516,10 @@ export const remove = dual<\n       const n2 = nStack[s]\n       const d = dStack[s]\n       const child = nStack[s + 1]\n-      const nc = child.left === undefined && child.mid === undefined && child.right === undefined ? undefined : child\n+      const nc =\n+        child.value === undefined && child.left === undefined && child.mid === undefined && child.right === undefined\n+          ? undefined\n+          : child\n       if (d === -1) {\n         // left\n         nStack[s] = {",
          "additions": 4,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7740,
      "title": "fix(effect): forward fallback atom writes to the primary atom",
      "url": "https://github.com/Effect-TS/effect/pull/7740",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T22:14:17Z",
      "mergedAt": "2026-09-03T04:54:48Z",
      "head": "54b54543764f53bef188bab3993f2573d117e3f1",
      "files": [
        {
          "filename": "packages/effect/src/unstable/reactivity/Atom.ts",
          "patch": "@@ -1465,7 +1465,9 @@ export const withFallback: {\n   return isWritable(self)\n     ? writable(\n       withFallback,\n-      self.write,\n+      function(ctx, value) {\n+        ctx.set(self, value)\n+      },\n       self.refresh ?? function(refresh) {\n         refresh(self)\n       }",
          "additions": 3,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7744,
      "title": "fix(atom-react): preserve notifications after switching refs",
      "url": "https://github.com/Effect-TS/effect/pull/7744",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T22:14:24Z",
      "mergedAt": "2026-09-03T04:57:01Z",
      "head": "d031a431d66ef91ad1b6ce85a60d92a21dbb2635",
      "files": [
        {
          "filename": "packages/atom/react/src/Hooks.ts",
          "patch": "@@ -435,8 +435,8 @@ export const useAtomSubscribe = <A>(\n  * @since 4.0.0\n  */\n export const useAtomRef = <A>(ref: AtomRef.ReadonlyRef<A>): A => {\n-  const [, setValue] = React.useState(ref.value)\n-  React.useEffect(() => ref.subscribe(setValue), [ref])\n+  const [, forceUpdate] = React.useReducer((n) => n + 1, 0)\n+  React.useEffect(() => ref.subscribe(forceUpdate), [ref])\n   return ref.value\n }\n ",
          "additions": 2,
          "deletions": 2
        }
      ]
    },
    {
      "pr": 7915,
      "title": "fix(Effectable): evaluate Class with asEffect",
      "url": "https://github.com/Effect-TS/effect/pull/7915",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T14:18:29Z",
      "mergedAt": "2026-09-04T05:39:11Z",
      "head": "56446afbe2038ceecb96097367fed6f1a3b5a812",
      "files": [
        {
          "filename": "packages/effect/src/Effectable.ts",
          "patch": "@@ -42,10 +42,10 @@ export const Prototype = <A extends Effect.Effect<any, any, any>>(options: {\n \n const Base: new<A, E, R>() => Effect.Effect<A, E, R> = (() => {\n   const Base = function() {}\n-  Base.prototype = Prototype({\n+  Base.prototype = Prototype<Class<any, any, any>>({\n     label: \"Effectable\",\n     evaluate(_) {\n-      return this\n+      return this.asEffect()\n     }\n   })\n   return Base as any\n@@ -64,5 +64,5 @@ const Base: new<A, E, R>() => Effect.Effect<A, E, R> = (() => {\n  * @since 2.0.0\n  */\n export abstract class Class<A, E = never, R = never> extends Base<A, E, R> {\n-  abstract override: Effect.Effect<A, E, R>\n+  abstract asEffect(): Effect.Effect<A, E, R>\n }",
          "additions": 3,
          "deletions": 3
        }
      ]
    },
    {
      "pr": 7967,
      "title": "fix(FiberHandle): keep same-fiber registrations idempotent",
      "url": "https://github.com/Effect-TS/effect/pull/7967",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T23:49:14Z",
      "mergedAt": "2026-09-04T04:05:40Z",
      "head": "973668dd00f7d0623ede67f3381fbe021f7664a7",
      "files": [
        {
          "filename": "packages/effect/src/FiberHandle.ts",
          "patch": "@@ -332,10 +332,10 @@ export const setUnsafe: {\n     fiber.interruptUnsafe(internalFiberId)\n     return\n   } else if (self.state.fiber !== undefined) {\n-    if (options?.onlyIfMissing === true) {\n-      fiber.interruptUnsafe(internalFiberId)\n+    if (self.state.fiber === fiber) {\n       return\n-    } else if (self.state.fiber === fiber) {\n+    } else if (options?.onlyIfMissing === true) {\n+      fiber.interruptUnsafe(internalFiberId)\n       return\n     }\n     self.state.fiber.interruptUnsafe(internalFiberId)",
          "additions": 3,
          "deletions": 3
        },
        {
          "filename": "packages/effect/src/FiberMap.ts",
          "patch": "@@ -305,7 +305,8 @@ const isInternalInterruption = Filter.toPredicate(Filter.compose(\n  *\n  * When the fiber completes, it is removed from the map. If the key already has\n  * a fiber, that previous fiber is interrupted unless `onlyIfMissing` is set;\n- * in that case the new fiber is interrupted and the existing entry is kept.\n+ * in that case a different new fiber is interrupted and the existing entry is\n+ * kept, while re-registering the existing fiber is a no-op.\n  *\n  * **Example** (Adding a fiber unsafely)\n  *\n@@ -367,10 +368,10 @@ export const setUnsafe: {\n \n   const previous = MutableHashMap.get(self.state.backing, key)\n   if (previous._tag === \"Some\") {\n-    if (options?.onlyIfMissing === true) {\n-      fiber.interruptUnsafe(internalFiberId)\n+    if (previous.value === fiber) {\n       return\n-    } else if (previous.value === fiber) {\n+    } else if (options?.onlyIfMissing === true) {\n+      fiber.interruptUnsafe(internalFiberId)\n       return\n     }\n   }\n@@ -408,7 +409,8 @@ export const setUnsafe: {\n  *\n  * When the fiber completes, it is removed from the map. If the key already has\n  * a fiber, that previous fiber is interrupted unless `onlyIfMissing` is set;\n- * in that case the new fiber is interrupted and the existing entry is kept.\n+ * in that case a different new fiber is interrupted and the existing entry is\n+ * kept, while re-registering the existing fiber is a no-op.\n  *\n  * This is the Effect-wrapped version of `setUnsafe`.\n  *",
          "additions": 7,
          "deletions": 5
        }
      ]
    },
    {
      "pr": 7979,
      "title": "fix(RequestResolver): preserve tagged handler failure causes",
      "url": "https://github.com/Effect-TS/effect/pull/7979",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-04T02:32:42Z",
      "mergedAt": "2026-09-04T04:07:29Z",
      "head": "ac7ec7775b82875b32168b02584630adfd2fccee",
      "files": [
        {
          "filename": "packages/effect/src/RequestResolver.ts",
          "patch": "@@ -17,7 +17,7 @@ import type * as Duration from \"./Duration.ts\"\n import * as Effect from \"./Effect.ts\"\n import * as Exit from \"./Exit.ts\"\n import { constTrue, dual, identity } from \"./Function.ts\"\n-import { exitFail, exitSucceed } from \"./internal/core.ts\"\n+import { exitSucceed } from \"./internal/core.ts\"\n import * as Count from \"./internal/count.ts\"\n import * as effect from \"./internal/effect.ts\"\n import * as internal from \"./internal/request.ts\"\n@@ -533,7 +533,7 @@ export const fromEffectTagged = <A extends Request.Any & { readonly _tag: string\n             onFailure: (cause) => {\n               for (let i = 0; i < requests.length; i++) {\n                 const entry = requests[i]\n-                entry.completeUnsafe(exitFail(cause) as any)\n+                entry.completeUnsafe(Exit.failCause(cause) as any)\n               }\n             },\n             onSuccess: (res) => {",
          "additions": 2,
          "deletions": 2
        }
      ]
    },
    {
      "pr": 7981,
      "title": "fix(RequestResolver): consume tagged iterable results",
      "url": "https://github.com/Effect-TS/effect/pull/7981",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-04T02:32:50Z",
      "mergedAt": "2026-09-04T06:03:09Z",
      "head": "002a3639d0040033ebecaa18618bd54b77b99818",
      "files": [
        {
          "filename": "packages/effect/src/RequestResolver.ts",
          "patch": "@@ -529,17 +529,18 @@ export const fromEffectTagged = <A extends Request.Any & { readonly _tag: string\n       return Effect.forEach(\n         grouped,\n         ([tag, requests]) =>\n-          Effect.matchCause((fns[tag] as any)(requests) as Effect.Effect<Array<any>, unknown, unknown>, {\n+          Effect.matchCause((fns[tag] as any)(requests) as Effect.Effect<Iterable<any>, unknown, unknown>, {\n             onFailure: (cause) => {\n               for (let i = 0; i < requests.length; i++) {\n                 const entry = requests[i]\n                 entry.completeUnsafe(Exit.failCause(cause) as any)\n               }\n             },\n             onSuccess: (res) => {\n-              for (let i = 0; i < res.length; i++) {\n-                const entry = requests[i]\n-                entry.completeUnsafe(exitSucceed(res[i]) as any)\n+              let i = 0\n+              for (const result of res) {\n+                const entry = requests[i++]\n+                entry.completeUnsafe(exitSucceed(result) as any)\n               }\n             }\n           }),",
          "additions": 5,
          "deletions": 4
        }
      ]
    },
    {
      "pr": 8020,
      "title": "fix(Effect): install cleanup before invoking use callbacks",
      "url": "https://github.com/Effect-TS/effect/pull/8020",
      "state": "OPEN",
      "isDraft": false,
      "createdAt": "2026-09-04T09:00:37Z",
      "mergedAt": null,
      "head": "9e96a770dea62222e9083dbb3cb50179d13c18ac",
      "files": [
        {
          "filename": "packages/effect/src/internal/effect.ts",
          "patch": "@@ -4315,7 +4315,7 @@ export const acquireUseRelease = <Resource, E, R, A, E2, R2, E3, R3>(\n   uninterruptibleMask((restore) =>\n     flatMap(acquire, (a) =>\n       onExitPrimitive(\n-        restore(use(a)),\n+        suspend(() => restore(use(a))),\n         (exit) => release(a, exit),\n         true\n       ))\n@@ -6062,7 +6062,10 @@ export const useSpan: {\n     const span = makeSpanUnsafe(fiber, name, options)\n     const clock = fiber.getRef(ClockRef)\n     const timingEnabled = fiber.getRef(TracerTimingEnabled)\n-    return onExit(internalCall(() => evaluate(span)), (exit) => endSpan(span, exit, clock, timingEnabled))\n+    return onExit(\n+      suspend(() => internalCall(() => evaluate(span))),\n+      (exit) => endSpan(span, exit, clock, timingEnabled)\n+    )\n   })\n }\n ",
          "additions": 5,
          "deletions": 2
        }
      ]
    },
    {
      "pr": 7991,
      "title": "fix(Metric): scope cached hooks to the selected registry",
      "url": "https://github.com/Effect-TS/effect/pull/7991",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-04T02:33:30Z",
      "mergedAt": "2026-09-04T06:02:51Z",
      "head": "ef952f49b841289d2ccdb63fc9a4226cb10e1721",
      "files": [
        {
          "filename": "packages/effect/src/Metric.ts",
          "patch": "@@ -1660,8 +1660,7 @@ abstract class Metric$<in Input, out State> implements Metric<Input, State> {\n   declare readonly Input: Contravariant<Input>\n   declare readonly State: Covariant<State>\n \n-  readonly #metadataCache = new WeakMap<Metric.Attributes, Metric.Metadata<Input, State>>()\n-  #metadata: Metric.Metadata<Input, State> | undefined\n+  readonly #metadata = new WeakMap<MetricRegistry, Metric.Metadata<Input, State>>()\n \n   readonly id: string\n   readonly description: string | undefined\n@@ -1693,20 +1692,15 @@ abstract class Metric$<in Input, out State> implements Metric<Input, State> {\n \n   hook(context: Context.Context<never>): Metric.Hooks<Input, State> {\n     const extraAttributes = Context.get(context, CurrentMetricAttributes)\n-    if (Object.keys(extraAttributes).length === 0) {\n-      if (Predicate.isNotUndefined(this.#metadata)) {\n-        return this.#metadata.hooks\n-      }\n-      this.#metadata = this.getOrCreate(context, this.attributes)\n-      return this.#metadata.hooks\n+    if (Object.keys(extraAttributes).length > 0) {\n+      return this.getOrCreate(context, mergeAttributes(this.attributes, extraAttributes)).hooks\n     }\n-    const mergedAttributes = mergeAttributes(this.attributes, extraAttributes)\n-    let metadata = this.#metadataCache.get(mergedAttributes)\n-    if (Predicate.isNotUndefined(metadata)) {\n-      return metadata.hooks\n+    const registry = Context.get(context, MetricRegistry)\n+    let metadata = this.#metadata.get(registry)\n+    if (Predicate.isUndefined(metadata)) {\n+      metadata = this.getOrCreate(context, this.attributes)\n+      this.#metadata.set(registry, metadata)\n     }\n-    metadata = this.getOrCreate(context, mergedAttributes)\n-    this.#metadataCache.set(mergedAttributes, metadata)\n     return metadata.hooks\n   }\n ",
          "additions": 8,
          "deletions": 14
        }
      ]
    },
    {
      "pr": 7993,
      "title": "fix(Metric): canonicalize attribute order in series keys",
      "url": "https://github.com/Effect-TS/effect/pull/7993",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-04T02:33:37Z",
      "mergedAt": "2026-09-04T05:45:22Z",
      "head": "4f2b1fef5abe0ece04659e47ddd1c0c5992817d1",
      "files": [
        {
          "filename": "packages/effect/src/Metric.ts",
          "patch": "@@ -3503,7 +3503,9 @@ function makeHooks<Input, State>(\n }\n \n function serializeAttributes(attributes: Metric.Attributes): string {\n-  return JSON.stringify(Array.isArray(attributes) ? attributes : Object.entries(attributes))\n+  const entries = Array.isArray(attributes) ? [...attributes] : Object.entries(attributes)\n+  entries.sort((a, b) => a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0)\n+  return JSON.stringify(entries)\n }\n \n function mergeAttributes(",
          "additions": 3,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7961,
      "title": "fix(reactivity): honor explicit zero query TTL values",
      "url": "https://github.com/Effect-TS/effect/pull/7961",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T23:47:49Z",
      "mergedAt": "2026-09-04T05:43:18Z",
      "head": "8581c663e893196fe93742f8dfcb51b42f5e76fb",
      "files": [
        {
          "filename": "packages/effect/src/unstable/reactivity/AtomHttpApi.ts",
          "patch": "@@ -312,7 +312,7 @@ export const Service =\n         headers: request.headers,\n         responseMode: request.responseMode ?? \"decoded-only\",\n         reactivityKeys: request.reactivityKeys,\n-        timeToLive: request.timeToLive\n+        timeToLive: request.timeToLive !== undefined\n           ? Duration.fromInputUnsafe(request.timeToLive)\n           : undefined,\n         serializationKey: request.serializationKey",
          "additions": 1,
          "deletions": 1
        },
        {
          "filename": "packages/effect/src/unstable/reactivity/AtomRpc.ts",
          "patch": "@@ -275,7 +275,7 @@ export const Service = <Self>() =>\n         ? Headers.fromInput(options.headers)\n         : undefined,\n       reactivityKeys: options?.reactivityKeys,\n-      timeToLive: options?.timeToLive\n+      timeToLive: options?.timeToLive !== undefined\n         ? Duration.fromInputUnsafe(options.timeToLive)\n         : undefined,\n       serializationKey: options?.serializationKey",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7750,
      "title": "fix(effect): clear stale dynamic tool schemas when replacing parameters",
      "url": "https://github.com/Effect-TS/effect/pull/7750",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T22:14:36Z",
      "mergedAt": "2026-09-03T05:08:13Z",
      "head": "3b2caa2b729d2ced852e56ca187da7472f103453",
      "files": [
        {
          "filename": "packages/effect/src/unstable/ai/Tool.ts",
          "patch": "@@ -1064,7 +1064,7 @@ const Proto = {\n     return clone(this)\n   },\n   setParameters(this: Any, parametersSchema: Schema.Constraint) {\n-    return clone(this, { parametersSchema })\n+    return clone(this, { parametersSchema, jsonSchema: undefined })\n   },\n   setSuccess(this: Any, successSchema: Schema.Constraint) {\n     return clone(this, { successSchema })",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7683,
      "title": "fix(RpcSerialization): retain falsy control IDs when decoding JSON-RPC",
      "url": "https://github.com/Effect-TS/effect/pull/7683",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T19:56:38Z",
      "mergedAt": "2026-09-03T03:57:25Z",
      "head": "9209cdd306a929ef702784e3e34a81b3b1524b98",
      "files": [
        {
          "filename": "packages/effect/src/unstable/rpc/RpcSerialization.ts",
          "patch": "@@ -306,7 +306,7 @@ function decodeJsonRpcMessage(decoded: JsonRpcMessage): RpcMessage.FromClientEnc\n         | RpcMessage.FromServerEncoded[\"_tag\"]\n         | Exclude<RpcMessage.FromClientEncoded[\"_tag\"], \"Request\">\n       const requestId = (request as any).params?.requestId\n-      return requestId ?\n+      return requestId !== undefined ?\n         {\n           _tag: tag,\n           requestId",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7677,
      "title": "fix(FetchHttpClient): set duplex for raw Web stream bodies",
      "url": "https://github.com/Effect-TS/effect/pull/7677",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T19:56:25Z",
      "mergedAt": "2026-09-03T00:54:32Z",
      "head": "1037dcb238520faf43c7d61276ded5fe8f1bdfb0",
      "files": [
        {
          "filename": "packages/effect/src/unstable/http/FetchHttpClient.ts",
          "patch": "@@ -68,7 +68,7 @@ const fetch: HttpClient.HttpClient = HttpClient.make((request, url, signal, fibe\n             method: request.method,\n             headers,\n             body,\n-            duplex: request.body._tag === \"Stream\" ? \"half\" : undefined,\n+            duplex: typeof ReadableStream !== \"undefined\" && body instanceof ReadableStream ? \"half\" : undefined,\n             signal\n           } as any),\n         catch: (cause) =>",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7679,
      "title": "fix(HttpEffect): close request scopes for streaming HEAD responses",
      "url": "https://github.com/Effect-TS/effect/pull/7679",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T19:56:29Z",
      "mergedAt": "2026-09-03T01:37:08Z",
      "head": "708491deaeb49ba8394b8a6e65bf234534e0e7be",
      "files": [
        {
          "filename": "packages/effect/src/unstable/http/HttpEffect.ts",
          "patch": "@@ -241,7 +241,7 @@ export const toWebHandlerWith = <Provided, R = never, ReqR = Exclude<R, Provided\n {\n   const resolveSymbol = Symbol.for(\"@effect/platform/HttpApp/resolve\")\n   const httpApp = toHandled(self, (request, response) => {\n-    response = scopeTransferToStream(response)\n+    if (request.method !== \"HEAD\") response = scopeTransferToStream(response)\n     ;(request as any)[resolveSymbol](\n       Response.toWeb(response, { withoutBody: request.method === \"HEAD\", context })\n     )",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7693,
      "title": "fix(HttpMiddleware): preserve existing CORS Vary dimensions",
      "url": "https://github.com/Effect-TS/effect/pull/7693",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T19:57:01Z",
      "mergedAt": "2026-09-03T04:30:45Z",
      "head": "fd9dae95046edd863f2f8f4c524c4782d4c49a75",
      "files": [
        {
          "filename": "packages/effect/src/unstable/http/HttpMiddleware.ts",
          "patch": "@@ -340,8 +340,8 @@ export const cors = (options?: {\n     : (origin: string) => (opts.allowedOrigins as ReadonlyArray<string>).includes(origin)\n \n   const allowOrigin = typeof opts.allowedOrigins === \"function\" || opts.allowedOrigins.length > 1\n-    ? ((originHeader: string) => {\n-      if (!isAllowedOrigin(originHeader)) return undefined\n+    ? ((originHeader: string): ReadonlyRecord<string, string> => {\n+      if (!isAllowedOrigin(originHeader)) return { vary: \"Origin\" }\n       return {\n         \"access-control-allow-origin\": originHeader,\n         vary: \"Origin\"\n@@ -403,18 +403,36 @@ export const cors = (options?: {\n   const headersFromRequestOptions = (request: HttpServerRequest) => {\n     const origin = request.headers[\"origin\"]\n     const accessControlRequestHeaders = request.headers[\"access-control-request-headers\"]\n-    return Headers.fromRecordUnsafe({\n+    const headers = Headers.fromRecordUnsafe({\n       ...allowOrigin(origin),\n       ...allowCredentials,\n       ...exposeHeaders,\n       ...allowMethods,\n-      ...allowHeaders(accessControlRequestHeaders),\n       ...maxAge\n     })\n+    const accessControlHeaders = allowHeaders(accessControlRequestHeaders)\n+    if (accessControlHeaders === undefined) return headers\n+    const vary = accessControlHeaders[\"vary\"]\n+    return Headers.setAll(\n+      headers,\n+      vary === undefined\n+        ? accessControlHeaders\n+        : {\n+          ...accessControlHeaders,\n+          vary: compressionInternal.varyWith(headers, vary)\n+        }\n+    )\n   }\n \n-  const preResponseHandler = (request: HttpServerRequest, response: HttpServerResponse) =>\n-    Effect.succeed(Response.setHeaders(response, headersFromRequest(request)))\n+  const preResponseHandler = (request: HttpServerRequest, response: HttpServerResponse) => {\n+    const headers = headersFromRequest(request)\n+    return Effect.succeed(Response.setHeaders(\n+      response,\n+      headers[\"vary\"] === undefined\n+        ? headers\n+        : Headers.set(headers, \"vary\", compressionInternal.varyWith(response.headers, \"Origin\"))\n+    ))\n+  }\n \n   return <E, R>(\n     httpApp: Effect.Effect<HttpServerResponse, E, R>\n@@ -566,8 +584,8 @@ export const compression = (\n }\n \n const withVary = (response: HttpServerResponse): HttpServerResponse => {\n-  const vary = compressionInternal.varyAcceptEncoding(response.headers)\n-  return vary === undefined ? response : Response.setHeader(response, \"vary\", vary)\n+  const vary = compressionInternal.varyWith(response.headers, \"Accept-Encoding\")\n+  return Response.setHeader(response, \"vary\", vary)\n }\n \n const defaultAlgorithms: ReadonlyArray<CompressionAlgorithm> = [\"br\", \"gzip\", \"deflate\"]",
          "additions": 26,
          "deletions": 8
        },
        {
          "filename": "packages/effect/src/unstable/http/internal/compression.ts",
          "patch": "@@ -7,15 +7,13 @@ import type { Compression, CompressionAlgorithm, CompressionOptions } from \"../H\n import * as Response from \"../HttpServerResponse.ts\"\n \n /** @internal */\n-export const varyAcceptEncoding = (headers: Headers.Headers): string | undefined => {\n+export const varyWith = (headers: Headers.Headers, dimension: string): string => {\n   const vary = headers[\"vary\"]\n   if (vary === undefined) {\n-    return \"Accept-Encoding\"\n+    return dimension\n   }\n   const members = vary.split(\",\").map((member) => member.trim().toLowerCase())\n-  return members.includes(\"*\") || members.includes(\"accept-encoding\")\n-    ? undefined\n-    : `${vary}, Accept-Encoding`\n+  return members.includes(\"*\") || members.includes(dimension.toLowerCase()) ? vary : `${vary}, ${dimension}`\n }\n \n /** @internal */\n@@ -26,10 +24,9 @@ export const wrapCompression = (impl: Compression): Compression => ({\n       if (compressed === response) {\n         return response\n       }\n-      const headers: Record<string, string> = { \"content-encoding\": algorithm }\n-      const vary = varyAcceptEncoding(compressed.headers)\n-      if (vary !== undefined) {\n-        headers[\"vary\"] = vary\n+      const headers: Record<string, string> = {\n+        \"content-encoding\": algorithm,\n+        vary: varyWith(compressed.headers, \"Accept-Encoding\")\n       }\n       const etag = compressed.headers[\"etag\"]\n       if (etag !== undefined && !etag.startsWith(\"W/\")) {",
          "additions": 6,
          "deletions": 9
        }
      ]
    },
    {
      "pr": 7701,
      "title": "fix(HttpApiClient): preserve base paths in URL builders",
      "url": "https://github.com/Effect-TS/effect/pull/7701",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T19:57:19Z",
      "mergedAt": "2026-09-03T03:51:33Z",
      "head": "78568c2a48dac0fde26e7dd14a19eecb3ac91f17",
      "files": [
        {
          "filename": "packages/effect/src/unstable/httpapi/HttpApiClient.ts",
          "patch": "@@ -687,9 +687,20 @@ export const urlBuilder = <Api extends HttpApi.Constraint>(api: Api, options?: {\n         const queryInput = request?.query === undefined\n           ? undefined\n           : (encodeQuery === undefined ? request.query : encodeQuery(request.query)) as UrlParams.Input\n-        const query = queryInput === undefined ? \"\" : UrlParams.toString(UrlParams.fromInput(queryInput))\n-        const url = query === \"\" ? path : `${path}?${query}`\n-        return options?.baseUrl === undefined ? url : new URL(url, options.baseUrl.toString()).toString()\n+        const urlParams = queryInput === undefined ? UrlParams.empty : UrlParams.fromInput(queryInput)\n+        if (options?.baseUrl === undefined) {\n+          const query = UrlParams.toString(urlParams)\n+          return query === \"\" ? path : `${path}?${query}`\n+        }\n+        const url = new URL(\n+          HttpClientRequest.prependUrl(HttpClientRequest.get(path), options.baseUrl.toString()).url\n+        )\n+        for (const [key, value] of urlParams.params) {\n+          if (value !== undefined) {\n+            url.searchParams.append(key, value)\n+          }\n+        }\n+        return url.toString()\n       }\n       InternalRecord.assignProperty(\n         group.topLevel ? builder : builder[group.identifier],",
          "additions": 14,
          "deletions": 3
        }
      ]
    },
    {
      "pr": 7699,
      "title": "fix(HttpApiClient): decode form-urlencoded responses through UrlParams",
      "url": "https://github.com/Effect-TS/effect/pull/7699",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T19:57:15Z",
      "mergedAt": "2026-09-03T03:50:40Z",
      "head": "e8f256be143b0787fe72b967d69d36ecbca8dc83",
      "files": [
        {
          "filename": "packages/effect/src/unstable/httpapi/HttpApiClient.ts",
          "patch": "@@ -1023,7 +1023,13 @@ function fromArrayBuffer(schema: Schema.Constraint): Schema.Top {\n         : UnknownFromArrayBuffer\n     }\n     case \"FormUrlEncoded\":\n-      return StringFromArrayBuffer.pipe(Schema.decodeTo(Schema.RecordFromUrlParams))\n+      return StringFromArrayBuffer.pipe(Schema.decodeTo(\n+        Schema.RecordFromUrlParams,\n+        SchemaTransformation.transform({\n+          decode: (text) => UrlParams.fromInput(new URLSearchParams(text)),\n+          encode: UrlParams.toString\n+        })\n+      ))\n     case \"Uint8Array\":\n       return Uint8ArrayFromArrayBuffer\n     case \"Text\":",
          "additions": 7,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7681,
      "title": "fix(HttpServerResponse): preserve Web response content lengths",
      "url": "https://github.com/Effect-TS/effect/pull/7681",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T19:56:34Z",
      "mergedAt": "2026-09-03T03:38:40Z",
      "head": "ed171ce0ab4d1460d1707e809e7991cde2e78844",
      "files": [
        {
          "filename": "packages/effect/src/unstable/http/HttpServerResponse.ts",
          "patch": "@@ -1384,7 +1384,8 @@ export const fromWeb = (response: Response): HttpServerResponse => {\n           evaluate: () => response.body!,\n           onError: (e) => e\n         }),\n-        contentType ?? undefined\n+        contentType ?? undefined,\n+        bodyInternal.parseContentLength(response.headers.get(\"content-length\"))\n       )\n     )\n   }",
          "additions": 2,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7874,
      "title": "fix(Logger): complete file log writes after partial progress",
      "url": "https://github.com/Effect-TS/effect/pull/7874",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T11:14:36Z",
      "mergedAt": "2026-09-03T23:10:26Z",
      "head": "f8696a02e9bcea096850265eb8783d33f095f5cf",
      "files": [
        {
          "filename": "packages/effect/src/Logger.ts",
          "patch": "@@ -951,9 +951,8 @@ export const layer = <\n  *\n  * const writes: Array<string> = []\n  * const file = {\n- *   write: (buffer: Uint8Array) => Effect.sync(() => {\n+ *   writeAll: (buffer: Uint8Array) => Effect.sync(() => {\n  *     writes.push(new TextDecoder().decode(buffer).trim())\n- *     return FileSystem.Size(buffer.length)\n  *   })\n  * } as unknown as FileSystem.File\n  * const fileSystem = FileSystem.makeNoop({ open: () => Effect.succeed(file) })\n@@ -977,9 +976,8 @@ export const layer = <\n  *\n  * const writes: Array<string> = []\n  * const file = {\n- *   write: (buffer: Uint8Array) => Effect.sync(() => {\n+ *   writeAll: (buffer: Uint8Array) => Effect.sync(() => {\n  *     writes.push(new TextDecoder().decode(buffer).trim())\n- *     return FileSystem.Size(buffer.length)\n  *   })\n  * } as unknown as FileSystem.File\n  * const fileSystem = FileSystem.makeNoop({ open: () => Effect.succeed(file) })\n@@ -1030,7 +1028,7 @@ export const toFile = dual<\n       const encoder = new TextEncoder()\n       return yield* batched(self, {\n         window: options?.batchWindow ?? 1000,\n-        flush: (output) => effect.ignore(logFile.write(encoder.encode(output.join(\"\\n\") + \"\\n\")))\n+        flush: (output) => effect.ignore(logFile.writeAll(encoder.encode(output.join(\"\\n\") + \"\\n\")))\n       })\n     })\n )",
          "additions": 3,
          "deletions": 5
        }
      ]
    },
    {
      "pr": 7708,
      "title": "fix(NodeFileSystem): accept empty writeAll buffers",
      "url": "https://github.com/Effect-TS/effect/pull/7708",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T21:02:56Z",
      "mergedAt": "2026-09-03T04:07:04Z",
      "head": "3c79cf8c7bfddf3f3abd6d800a4b3d268462fa4b",
      "files": [
        {
          "filename": "packages/platform/node-shared/src/NodeFileSystem.ts",
          "patch": "@@ -382,7 +382,7 @@ const makeFile = (() => {\n     }\n \n     writeAll(buffer: Uint8Array) {\n-      return this.writeAllChunk(buffer)\n+      return buffer.length === 0 ? Effect.void : this.writeAllChunk(buffer)\n     }\n   }\n ",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7728,
      "title": "fix(NodeChildProcessSpawner): expose the first pipeline stage stdin",
      "url": "https://github.com/Effect-TS/effect/pull/7728",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T21:03:36Z",
      "mergedAt": "2026-09-03T04:57:26Z",
      "head": "43e548d7b72e0e5edb83b5b3ab150dc958e1edd1",
      "files": [
        {
          "filename": "packages/platform/node-shared/src/NodeChildProcessSpawner.ts",
          "patch": "@@ -639,7 +639,7 @@ const make = Effect.gen(function*() {\n           exitCode: handle.exitCode,\n           isRunning: handle.isRunning,\n           kill,\n-          stdin: handle.stdin,\n+          stdin: handles[0].stdin,\n           stdout: handle.stdout,\n           stderr: handle.stderr,\n           all: handle.all,",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7716,
      "title": "fix(platform-node): preserve incoming bytes when selecting text readers",
      "url": "https://github.com/Effect-TS/effect/pull/7716",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T21:03:11Z",
      "mergedAt": "2026-09-03T04:11:38Z",
      "head": "149e514770e123fe30d5f693c12a081a531d67f3",
      "files": [
        {
          "filename": "packages/platform/node/src/NodeHttpClient.ts",
          "patch": "@@ -275,18 +275,7 @@ class UndiciResponse extends Inspectable.Class implements HttpClientResponse, Pi\n     if (this.textBody) {\n       return this.textBody\n     }\n-    this.textBody = Effect.tryPromise({\n-      try: () => this.source.body.text(),\n-      catch: (cause) =>\n-        new Error.HttpClientError({\n-          reason: new Error.DecodeError({\n-            request: this.request,\n-            response: this,\n-            cause\n-          })\n-        })\n-    }).pipe(Effect.cached, Effect.runSync)\n-    this.arrayBufferBody = Effect.map(this.textBody, (_) => new TextEncoder().encode(_).buffer)\n+    this.textBody = Effect.map(this.arrayBuffer, (_) => new TextDecoder().decode(_))\n     return this.textBody\n   }\n ",
          "additions": 1,
          "deletions": 12
        },
        {
          "filename": "packages/platform/node/src/NodeHttpIncomingMessage.ts",
          "patch": "@@ -76,17 +76,7 @@ export abstract class NodeHttpIncomingMessage<E> extends Inspectable.Class\n     if (this.textEffect) {\n       return this.textEffect\n     }\n-    this.textEffect = Effect.runSync(Effect.cached(\n-      Effect.flatMap(\n-        IncomingMessage.MaxBodySize,\n-        (maxBodySize) =>\n-          NodeStream.toString(() => this.source, {\n-            onError: this.onError,\n-            maxBytes: maxBodySize\n-          })\n-      )\n-    ))\n-    this.arrayBufferEffect = Effect.map(this.textEffect, (_) => new TextEncoder().encode(_).buffer)\n+    this.textEffect = Effect.map(this.arrayBuffer, (_) => Buffer.from(_).toString(\"utf8\"))\n     return this.textEffect\n   }\n ",
          "additions": 1,
          "deletions": 11
        }
      ]
    },
    {
      "pr": 7720,
      "title": "fix(sql-pglite): preserve string values passed to sql.json",
      "url": "https://github.com/Effect-TS/effect/pull/7720",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T21:03:20Z",
      "mergedAt": "2026-09-03T04:15:24Z",
      "head": "b4740605f612ccce7d75e6452abd52276b0e673e",
      "files": [
        {
          "filename": "packages/sql/pglite/src/PgliteClient.ts",
          "patch": "@@ -429,13 +429,12 @@ export const makeCompiler = (\n     onCustom(type, placeholder, withoutTransform) {\n       switch (type.kind) {\n         case \"PgJson\": {\n+          const value = withoutTransform || transformValue === undefined\n+            ? type.paramA\n+            : transformValue(type.paramA)\n           return [\n             placeholder(undefined),\n-            [\n-              withoutTransform || transformValue === undefined\n-                ? type.paramA\n-                : transformValue(type.paramA)\n-            ]\n+            [typeof value === \"string\" ? JSON.stringify(value) : value]\n           ]\n         }\n       }",
          "additions": 4,
          "deletions": 5
        }
      ]
    },
    {
      "pr": 7829,
      "title": "fix(sql-libsql): isolate transaction contexts per client",
      "url": "https://github.com/Effect-TS/effect/pull/7829",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T05:29:52Z",
      "mergedAt": "2026-09-04T03:35:48Z",
      "head": "0c8f8ed74413126b00bb31b8ae9b497788e744d1",
      "files": [
        {
          "filename": "packages/sql/libsql/src/LibsqlClient.ts",
          "patch": "@@ -70,9 +70,7 @@ export interface LibsqlClient extends Client.SqlClient {\n  */\n export const LibsqlClient = Context.Service<LibsqlClient>(\"@effect/sql-libsql/LibsqlClient\")\n \n-const LibsqlTransaction = Context.Service<readonly [LibsqlConnection, counter: number]>(\n-  \"@effect/sql-libsql/LibsqlClient/LibsqlTransaction\"\n-)\n+let clientIdCounter = 0\n \n /**\n  * Configuration for a libSQL client, either by supplying connection options or an existing live libSQL client.\n@@ -185,6 +183,9 @@ export const make = (\n   options: LibsqlClientConfig\n ): Effect.Effect<LibsqlClient, never, Scope.Scope | Reactivity.Reactivity> =>\n   Effect.gen(function*() {\n+    const LibsqlTransaction = Context.Service<readonly [LibsqlConnection, counter: number]>(\n+      `@effect/sql-libsql/LibsqlClient/LibsqlTransaction/${clientIdCounter++}`\n+    )\n     const compiler = Statement.makeCompilerSqlite(options.transformQueryNames)\n     const transformRows = options.transformResultNames ?\n       Statement.defaultTransforms(",
          "additions": 4,
          "deletions": 3
        }
      ]
    },
    {
      "pr": 7722,
      "title": "fix(sql-sqlite-node): capture unprepared statement preparation errors",
      "url": "https://github.com/Effect-TS/effect/pull/7722",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T21:03:25Z",
      "mergedAt": "2026-09-03T04:33:42Z",
      "head": "df9dcfcc171453139536d9431002b73df3ebf9b0",
      "files": [
        {
          "filename": "packages/sql/sqlite-node/src/SqliteClient.ts",
          "patch": "@@ -151,14 +151,16 @@ export const make = (\n         db.exec(\"PRAGMA journal_mode = WAL\")\n       }\n \n+      const prepare = (sql: string) =>\n+        Effect.try({\n+          try: () => db.prepare(sql),\n+          catch: (cause) => new SqlError({ reason: classifyError(cause, \"Failed to prepare statement\", \"prepare\") })\n+        })\n+\n       const prepareCache = yield* Cache.make({\n         capacity: options.prepareCacheSize ?? 200,\n         timeToLive: options.prepareCacheTTL ?? Duration.minutes(10),\n-        lookup: (sql: string) =>\n-          Effect.try({\n-            try: () => db.prepare(sql),\n-            catch: (cause) => new SqlError({ reason: classifyError(cause, \"Failed to prepare statement\", \"prepare\") })\n-          })\n+        lookup: prepare\n       })\n \n       const runStatement = (\n@@ -246,7 +248,7 @@ export const make = (\n       const runValuesUnprepared = (\n         sql: string,\n         params: ReadonlyArray<unknown>\n-      ) => runStatementValuesUnprepared(db.prepare(sql), params)\n+      ) => Effect.flatMap(prepare(sql), (statement) => runStatementValuesUnprepared(statement, params))\n \n       return identity<SqliteConnection>({\n         execute(sql, params, transformRows) {\n@@ -264,7 +266,7 @@ export const make = (\n           return runValuesUnprepared(sql, params)\n         },\n         executeUnprepared(sql, params, transformRows) {\n-          const effect = runStatement(db.prepare(sql), params ?? [], false)\n+          const effect = Effect.flatMap(prepare(sql), (statement) => runStatement(statement, params ?? [], false))\n           return transformRows ? Effect.map(effect, transformRows) : effect\n         },\n         executeStream(_sql, _params) {",
          "additions": 9,
          "deletions": 7
        }
      ]
    },
    {
      "pr": 7661,
      "title": "fix(Schema): preserve percent-encoded JSON Schema references",
      "url": "https://github.com/Effect-TS/effect/pull/7661",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T18:50:10Z",
      "mergedAt": "2026-09-03T03:38:15Z",
      "head": "1b75e1f664a02e49b5b4c211b66d4c3a8d0d88c8",
      "files": [
        {
          "filename": "packages/effect/src/internal/schema/toJsonSchemaDocument.ts",
          "patch": "@@ -16,6 +16,10 @@ type CheckRepresentationAnnotation = SchemaRepresentation.CheckRepresentationAnn\n   SchemaRepresentation.Representation\n >\n \n+function formatReferenceToken(token: string): string {\n+  return encodeURI(escapeToken(token)).replace(/#/g, \"%23\")\n+}\n+\n const jsonSchemaAnnotationExcludedKeys = new Set([\n   ...InternalAnnotations.annotationExcludedKeys,\n   InternalAnnotations.IDENTIFIER_FALLBACK_KEY,\n@@ -220,10 +224,16 @@ function compileJsonSchema(\n \n   function finalizeJsonSchema(schema: JsonSchema.JsonSchema): JsonSchema.JsonSchema {\n     if (!hasAliases) return schema\n+    // URI-encoded slashes separate pointer tokens; only ~1 represents a slash within a token.\n     return rewriteRefs(schema, ($ref) =>\n-      $ref.replace(/^#\\/\\$defs\\/([^/]*)/, (match, token) => {\n+      $ref.replace(/^#\\/\\$defs\\/((?:(?!%2[fF])[^/])*)/, (match, token) => {\n+        try {\n+          token = decodeURIComponent(token)\n+        } catch {\n+          // Keep the raw token so malformed callback references can still be canonicalized.\n+        }\n         const canonical = definitionStates.get(unescapeToken(token))\n-        return typeof canonical === \"string\" ? `#/$defs/${escapeToken(canonical)}` : match\n+        return typeof canonical === \"string\" ? `#/$defs/${formatReferenceToken(canonical)}` : match\n       }))\n   }\n \n@@ -283,7 +293,7 @@ function compileJsonSchema(\n   ): JsonSchema.JsonSchema {\n     if (representation._tag === \"Reference\") {\n       const canonical = compileDefinition(representation.$ref, path)\n-      return { $ref: `#/$defs/${escapeToken(canonical)}` }\n+      return { $ref: `#/$defs/${formatReferenceToken(canonical)}` }\n     }\n     const cached = compiledRepresentations.get(representation)\n     if (cached !== undefined) return cached",
          "additions": 13,
          "deletions": 3
        }
      ]
    },
    {
      "pr": 7673,
      "title": "fix(SchemaBinary): preserve leading U+FEFF in strings",
      "url": "https://github.com/Effect-TS/effect/pull/7673",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T18:50:38Z",
      "mergedAt": "2026-09-03T00:44:01Z",
      "head": "5e0480d2d60ff16f799b0b6e1fad76b8ddbaf06c",
      "files": [
        {
          "filename": "packages/effect/src/unstable/encoding/SchemaBinary.ts",
          "patch": "@@ -921,7 +921,7 @@ const BIGINT_U32_MASK = BigInt(0xFFFFFFFF)\n const BIGINT_THIRTY_TWO = BigInt(32)\n \n const utf8Encode = new TextEncoder()\n-const utf8DecodeFatal = new TextDecoder(\"utf-8\", { fatal: true })\n+const utf8DecodeFatal = new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true })\n \n // General numbers use up to seven varint bytes, a varint mantissa with a\n // decimal scale byte, or an eight-byte f64.",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7884,
      "title": "fix(ConfigProvider): substitute dotenv references as literal data",
      "url": "https://github.com/Effect-TS/effect/pull/7884",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T12:21:08Z",
      "mergedAt": "2026-09-03T23:03:24Z",
      "head": "0ea877803fd5ece625fed51760155cff3f700b16",
      "files": [
        {
          "filename": "packages/effect/src/ConfigProvider.ts",
          "patch": "@@ -1135,7 +1135,7 @@ function interpolate(envValue: string, parsed: Record<string, string>): string {\n       : defaultValue ?? \"\"\n \n     return interpolate(\n-      envValue.replace(group, value),\n+      envValue.replace(group, () => value),\n       parsed\n     )\n   }",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7953,
      "title": "fix(sql-sqlite-wasm): retain statement-specific result columns",
      "url": "https://github.com/Effect-TS/effect/pull/7953",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T19:51:39Z",
      "mergedAt": "2026-09-04T05:45:57Z",
      "head": "3266181e0c9724631a5ed4098ba384c9155165ba",
      "files": [
        {
          "filename": "packages/sql/sqlite-wasm/src/OpfsWorker.ts",
          "patch": "@@ -94,13 +94,15 @@ export const run = (\n               const [id, sql, params] = message\n               messageId = id\n               const results: Array<any> = []\n-              let columns: Array<string> | undefined\n+              const columns: Array<Array<string>> = []\n               for (const stmt of sqlite3.statements(db, sql)) {\n+                let statementColumns: Array<string> | undefined\n                 sqlite3.bind_collection(stmt, params as any)\n                 while (sqlite3.step(stmt) === WaSqlite.SQLITE_ROW) {\n-                  columns = columns ?? sqlite3.column_names(stmt)\n+                  statementColumns = statementColumns ?? sqlite3.column_names(stmt)\n                   const row = sqlite3.row(stmt)\n                   results.push(row)\n+                  columns.push(statementColumns)\n                 }\n               }\n               options.port.postMessage([id, undefined, [columns, results]])",
          "additions": 4,
          "deletions": 2
        },
        {
          "filename": "packages/sql/sqlite-wasm/src/SqliteClient.ts",
          "patch": "@@ -387,7 +387,7 @@ export const make = (\n         params: ReadonlyArray<unknown> = [],\n         rowMode: \"object\" | \"array\" = \"object\"\n       ): Effect.Effect<Array<any>, SqlError, never> => {\n-        const rows = Effect.withFiber<[Array<string>, Array<any>], SqlError>((fiber) => {\n+        const rows = Effect.withFiber<WorkerResult, SqlError>((fiber) => {\n           const id = currentId++\n           return send(id, [id, sql, params], fiber.getRef(Transferables))\n         })\n@@ -471,8 +471,10 @@ function rowToObject(columns: Array<string>, row: Array<any>) {\n   }\n   return obj\n }\n-const extractObject = (rows: [Array<string>, Array<any>]) => rows[1].map((row) => rowToObject(rows[0], row))\n-const extractRows = (rows: [Array<string>, Array<any>]) => rows[1]\n+type WorkerResult = [columns: Array<Array<string>>, rows: Array<any>]\n+\n+const extractObject = (rows: WorkerResult) => rows[1].map((row, index) => rowToObject(rows[0][index], row))\n+const extractRows = (rows: WorkerResult) => rows[1]\n \n /**\n  * Fiber reference that stores transferables to include with worker-backed SQLite WASM query messages.",
          "additions": 5,
          "deletions": 3
        }
      ]
    },
    {
      "pr": 7818,
      "title": "fix(IndexedDb): preserve out-of-line primary keys in query results",
      "url": "https://github.com/Effect-TS/effect/pull/7818",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T04:25:10Z",
      "mergedAt": "2026-09-03T06:31:16Z",
      "head": "f1d13d3e6709c41c3a87538ca79238e2aa4ea59d",
      "files": [
        {
          "filename": "packages/platform/browser/src/IndexedDbQueryBuilder.ts",
          "patch": "@@ -937,7 +937,7 @@ const applySelect = Effect.fnUntraced(function*(\n         if (predicate === undefined || predicate(cursor.value)) {\n           results.push(\n             keyPath === undefined\n-              ? { ...cursor.value, key: cursor.key }\n+              ? { ...cursor.value, key: cursor.primaryKey }\n               : cursor.value\n           )\n           count += 1\n@@ -992,7 +992,7 @@ const applyFirst = Effect.fnUntraced(function*(\n   const data = yield* Effect.callback<any, IndexedDbQueryError | Cause.NoSuchElementError>((resume) => {\n     const { keyRange, store } = getReadonlyObjectStore(query.select)\n \n-    if (keyRange !== undefined) {\n+    if (keyRange !== undefined && keyPath !== undefined) {\n       const request = store.get(keyRange)\n \n       request.onerror = (event) => {\n@@ -1016,7 +1016,7 @@ const applyFirst = Effect.fnUntraced(function*(\n         }\n       }\n     } else {\n-      const request = store.openCursor()\n+      const request = store.openCursor(keyRange)\n \n       request.onerror = (event) => {\n         resume(\n@@ -1031,7 +1031,7 @@ const applyFirst = Effect.fnUntraced(function*(\n \n       request.onsuccess = () => {\n         const value = request.result?.value\n-        const key = request.result?.key\n+        const key = request.result?.primaryKey\n \n         if (value === undefined) {\n           resume(",
          "additions": 4,
          "deletions": 4
        }
      ]
    },
    {
      "pr": 7827,
      "title": "fix(Socket): count UTF-8 text bytes toward WebSocket watermarks",
      "url": "https://github.com/Effect-TS/effect/pull/7827",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T05:20:38Z",
      "mergedAt": "2026-09-03T06:06:11Z",
      "head": "e11c3efb97fc6da0a00dedbf69f72c5f33d453bb",
      "files": [
        {
          "filename": "packages/effect/src/unstable/socket/Socket.ts",
          "patch": "@@ -919,7 +919,9 @@ export const fromWebSocket = <RO, WS extends WebSocketLike>(\n \n       function push(data: Uint8Array | string) {\n         buffer.push(data)\n-        bufferSize += typeof data === \"string\" ? data.length : data.byteLength\n+        if (highWaterMark !== undefined) {\n+          bufferSize += typeof data === \"string\" ? encoder.encode(data).byteLength : data.byteLength\n+        }\n         if (waiter !== undefined) {\n           if (!flushScheduled) {\n             flushScheduled = true",
          "additions": 3,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7864,
      "title": "fix(Random, Crypto): prevent rounding to exclusive upper bounds",
      "url": "https://github.com/Effect-TS/effect/pull/7864",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T11:01:01Z",
      "mergedAt": "2026-09-03T23:05:25Z",
      "head": "ca2677903ce528b2c5cda4a7bbb76335e664a0dd",
      "files": [
        {
          "filename": "packages/effect/src/Crypto.ts",
          "patch": "@@ -11,6 +11,7 @@\n  */\n import * as Context from \"./Context.ts\"\n import * as Effect from \"./Effect.ts\"\n+import * as random from \"./internal/random.ts\"\n import * as Uuid from \"./internal/uuid.ts\"\n import * as PlatformError from \"./PlatformError.ts\"\n \n@@ -251,7 +252,7 @@ export const make = (\n     random: Effect.sync(() => nextDoubleUnsafe()),\n     randomBoolean: Effect.sync(() => nextDoubleUnsafe() > 0.5),\n     randomInt: Effect.sync(() => nextIntUnsafe()),\n-    randomBetween: (min, max) => Effect.sync(() => nextDoubleUnsafe() * (max - min) + min),\n+    randomBetween: (min, max) => Effect.sync(() => random.nextBetween(min, max, nextDoubleUnsafe())),\n     randomIntBetween(min, max, options) {\n       const extra = options?.halfOpen === true ? 0 : 1\n       return Effect.sync(() => {",
          "additions": 2,
          "deletions": 1
        },
        {
          "filename": "packages/effect/src/Random.ts",
          "patch": "@@ -153,7 +153,7 @@ export const nextInt: Effect.Effect<number> = randomWith((r) => r.nextIntUnsafe(\n  * @since 4.0.0\n  */\n export const nextBetween = (min: number, max: number): Effect.Effect<number> =>\n-  randomWith((r) => r.nextDoubleUnsafe() * (max - min) + min)\n+  randomWith((r) => random.nextBetween(min, max, r.nextDoubleUnsafe()))\n \n /**\n  * Generates a random integer between `min` and `max`.",
          "additions": 1,
          "deletions": 1
        },
        {
          "filename": "packages/effect/src/internal/random.ts",
          "patch": "@@ -13,3 +13,21 @@ export const Random: Context.Reference<RandomService> = Context.Reference<Random\n     }\n   })\n })\n+\n+/** @internal */\n+export const nextBetween = (min: number, max: number, draw: number): number => {\n+  const value = draw * (max - min) + min\n+  if (value !== max || min >= max || !Number.isFinite(max)) {\n+    return value\n+  }\n+  // Rounding can reach the excluded endpoint even for a draw below 1.\n+  // Return its immediate predecessor, which is at least min for finite min < max.\n+  if (max === 0) {\n+    return -Number.MIN_VALUE\n+  }\n+  const view = new DataView(new ArrayBuffer(8))\n+  view.setFloat64(0, max)\n+  const bits = view.getBigUint64(0)\n+  view.setBigUint64(0, max > 0 ? bits - BigInt(1) : bits + BigInt(1))\n+  return view.getFloat64(0)\n+}",
          "additions": 18,
          "deletions": 0
        }
      ]
    },
    {
      "pr": 7973,
      "title": "fix(oxc): preserve bigint precision in literal fixes",
      "url": "https://github.com/Effect-TS/effect/pull/7973",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T23:49:36Z",
      "mergedAt": "2026-09-04T04:10:29Z",
      "head": "eb17dbd78bf772e5ab5a71a1a59cae20b623d132",
      "files": [
        {
          "filename": "packages/tools/oxc/src/oxlint/rules/no-bigint-literals.ts",
          "patch": "@@ -10,7 +10,7 @@ const rule: CreateRule = {\n     return {\n       Literal(node) {\n         if (typeof node.value === \"bigint\") {\n-          const fixedSource = `BigInt(${node.value})`\n+          const fixedSource = `BigInt(\"${node.value}\")`\n           context.report({\n             node,\n             message: \"BigInt literals are not allowed\",",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 8057,
      "title": "fix(cli): reset date input buffer on Tab navigation",
      "url": "https://github.com/Effect-TS/effect/pull/8057",
      "state": "OPEN",
      "isDraft": true,
      "createdAt": "2026-09-04T16:57:08Z",
      "mergedAt": null,
      "head": "e4522880d6501e5d3c1fd84a368e65a07197234f",
      "files": [
        {
          "filename": "packages/effect/src/unstable/cli/Prompt.ts",
          "patch": "@@ -1777,7 +1777,7 @@ const processDateNext = (state: DateState) => {\n     onSome: (next) => state.dateParts.indexOf(next)\n   })\n   return Action.NextFrame({\n-    state: { ...state, cursor }\n+    state: { ...state, typed: \"\", cursor }\n   })\n }\n ",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 8059,
      "title": "fix(cli): preserve option-looking flag values in wizard mode",
      "url": "https://github.com/Effect-TS/effect/pull/8059",
      "state": "OPEN",
      "isDraft": true,
      "createdAt": "2026-09-04T16:57:17Z",
      "mergedAt": null,
      "head": "868e5268f1beab61784884c813e89f8eac7f27e8",
      "files": [
        {
          "filename": "packages/effect/src/unstable/cli/internal/wizard.ts",
          "patch": "@@ -168,7 +168,11 @@ const promptParam = Effect.fnUntraced(\n     if (single.kind === Param.argumentKind) {\n       return values\n     }\n-    return values.flatMap((value) => [commandLineArg(`--${single.name}`), value])\n+    return values.flatMap((value) =>\n+      value.value.startsWith(\"-\") && value.value.length > 1\n+        ? [commandLineArg(`--${single.name}=${value.value}`, `--${single.name}=${value.displayValue}`)]\n+        : [commandLineArg(`--${single.name}`), value]\n+    )\n   }\n )\n ",
          "additions": 5,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7671,
      "title": "fix(Sse): preserve events with mixed line endings",
      "url": "https://github.com/Effect-TS/effect/pull/7671",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T18:50:34Z",
      "mergedAt": "2026-09-03T00:42:43Z",
      "head": "904f4654d1268600d97b3525576c1bde7cb75628",
      "files": [
        {
          "filename": "packages/effect/src/unstable/encoding/Sse.ts",
          "patch": "@@ -311,7 +311,7 @@ export function makeParser(onParse: (event: AnyEvent) => void, options?: DecodeO\n       let fieldLength = startingFieldLength\n       let character: string\n \n-      for (let index = startingPosition; lineLength < 0 && index < length; ++index) {\n+      for (let index = position + startingPosition; lineLength < 0 && index < length; ++index) {\n         character = buffer[index]\n         if (character === \":\" && fieldLength < 0) {\n           fieldLength = index - position",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7667,
      "title": "fix(Toml): allow child tables in distinct array entries",
      "url": "https://github.com/Effect-TS/effect/pull/7667",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T18:50:24Z",
      "mergedAt": "2026-09-03T01:07:56Z",
      "head": "9139c7aa0744215b2823b7a1ae570d0c41b47c2f",
      "files": [
        {
          "filename": "packages/effect/src/unstable/encoding/Toml.ts",
          "patch": "@@ -45,7 +45,7 @@ class TomlParser {\n   private index = 0\n   private line = 1\n   private column = 1\n-  private readonly explicitTables = new Set<string>()\n+  private readonly explicitTables = new Set<Table>()\n \n   constructor(input: string) {\n     this.input = input\n@@ -85,14 +85,14 @@ class TomlParser {\n     }\n     this.finishStatement()\n \n-    const pathKey = JSON.stringify(path)\n-    if (!array && this.explicitTables.has(pathKey)) {\n+    const table = this.resolveTable(path, array)\n+    if (!array && this.explicitTables.has(table)) {\n       this.fail(`Cannot redefine table '${path.join(\".\")}'`)\n     }\n     if (!array) {\n-      this.explicitTables.add(pathKey)\n+      this.explicitTables.add(table)\n     }\n-    this.current = this.resolveTable(path, array)\n+    this.current = table\n   }\n \n   private resolveTable(path: ReadonlyArray<string>, array: boolean): Table {",
          "additions": 5,
          "deletions": 5
        }
      ]
    },
    {
      "pr": 7669,
      "title": "fix(Yaml): preserve folded scalar paragraph and indentation breaks",
      "url": "https://github.com/Effect-TS/effect/pull/7669",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T18:50:29Z",
      "mergedAt": "2026-09-03T01:10:48Z",
      "head": "273695734da6f96142cc2404bcb8185dc74132f5",
      "files": [
        {
          "filename": "packages/effect/src/unstable/encoding/Yaml.ts",
          "patch": "@@ -480,14 +480,25 @@ class YamlParser {\n     if (style === \"|\") {\n       output = content.join(\"\\n\")\n     } else {\n-      for (let index = 0; index < content.length; index++) {\n-        output += content[index]\n-        if (index < content.length - 1) {\n-          output += content[index].length === 0 || content[index + 1].length === 0 ? \"\\n\" : \" \"\n+      let blankLines = 0\n+      let previousMoreIndented: boolean | undefined\n+      for (const line of content) {\n+        if (line.length === 0) {\n+          blankLines++\n+        } else {\n+          const moreIndented = line.startsWith(\" \")\n+          const hardBreak = moreIndented || previousMoreIndented === true\n+          if (previousMoreIndented === undefined) output += \"\\n\".repeat(blankLines)\n+          else if (blankLines === 0) output += hardBreak ? \"\\n\" : \" \"\n+          else output += \"\\n\".repeat(blankLines + (hardBreak ? 1 : 0))\n+          output += line\n+          blankLines = 0\n+          previousMoreIndented = moreIndented\n         }\n       }\n+      output += \"\\n\".repeat(blankLines)\n     }\n-    if (chomp === \"keep\") return `${output}\\n`\n+    if (chomp === \"keep\") return output.endsWith(\"\\n\") ? output : `${output}\\n`\n     output = output.replace(/\\n+$/, \"\")\n     return chomp === \"strip\" ? output : `${output}\\n`\n   }",
          "additions": 16,
          "deletions": 5
        }
      ]
    },
    {
      "pr": 7687,
      "title": "fix(cli): allow optional wrappers around alternative flags",
      "url": "https://github.com/Effect-TS/effect/pull/7687",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T19:56:48Z",
      "mergedAt": "2026-09-03T04:10:24Z",
      "head": "8676193ba0b02313421003b434c08fb0bfdb9270",
      "files": [
        {
          "filename": "packages/effect/src/unstable/cli/Param.ts",
          "patch": "@@ -1272,18 +1272,15 @@ export const mapTryCatch: {\n export const optional = <Kind extends ParamKind, A>(\n   param: Param<Kind, A>\n ): Param<Kind, Option.Option<A>> => {\n-  const parse: Parse<Option.Option<A>> = Effect.fnUntraced(function*(args) {\n-    getUnderlyingSingleOrThrow(param)\n-\n-    return yield* param.parse(args).pipe(\n+  const parse: Parse<Option.Option<A>> = (args) =>\n+    param.parse(args).pipe(\n       Effect.map(([leftover, value]) => [leftover, Option.some(value)] as const),\n       // Catch both MissingOption (for flags) and MissingArgument (for positional arguments)\n       Effect.catchTags({\n         MissingOption: () => Effect.succeed([args.arguments, Option.none()] as const),\n         MissingArgument: () => Effect.succeed([args.arguments, Option.none()] as const)\n       })\n     )\n-  })\n   return Object.assign(Object.create(Proto), {\n     _tag: \"Optional\",\n     kind: param.kind,",
          "additions": 2,
          "deletions": 5
        }
      ]
    },
    {
      "pr": 7691,
      "title": "fix(HttpStaticServer): ignore Range on non-GET requests",
      "url": "https://github.com/Effect-TS/effect/pull/7691",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T19:56:57Z",
      "mergedAt": "2026-09-03T03:42:28Z",
      "head": "050fda2fc8dbd6b5656a1f569d7b5183ec5dfba5",
      "files": [
        {
          "filename": "packages/effect/src/unstable/http/HttpStaticServer.ts",
          "patch": "@@ -114,7 +114,7 @@ export const make: (options: {\n     fileSize?: number\n   ) => Effect.Effect<HttpServerResponse.HttpServerResponse, HttpServerError.HttpServerError> = Effect.fnUntraced(\n     function*(request, filePath, fileSize) {\n-      const rangeHeader = request.headers[\"range\"]\n+      const rangeHeader = request.method === \"GET\" ? request.headers[\"range\"] : undefined\n       const shouldEvaluateConditionals = request.headers[\"if-none-match\"] !== undefined ||\n         request.headers[\"if-modified-since\"] !== undefined\n ",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7712,
      "title": "fix(NodeSink): capture writable finalization errors",
      "url": "https://github.com/Effect-TS/effect/pull/7712",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T21:03:04Z",
      "mergedAt": "2026-09-03T04:03:41Z",
      "head": "1ada20c34fdee4caf01ef5af20eee0d7d5d42b87",
      "files": [
        {
          "filename": "packages/platform/node-shared/src/NodeSink.ts",
          "patch": "@@ -95,22 +95,26 @@ export const pullIntoWritable = <A, IE, E>(options: {\n       })\n     }),\n     Effect.forever({ disableYield: true }),\n-    Effect.raceFirst(Effect.callback<never, E>((resume) => {\n-      const onError = (error: unknown) => resume(Effect.fail(options.onError(error)))\n-      options.writable.once(\"error\", onError)\n-      return Effect.sync(() => {\n-        options.writable.off(\"error\", onError)\n-      })\n-    })),\n     options.endOnDone !== false ?\n       Pull.catchDone((_) => {\n         if (\"closed\" in options.writable && options.writable.closed) {\n           return Cause.done(_)\n         }\n         return Effect.callback<never, E | Cause.Done<unknown>>((resume) => {\n-          options.writable.once(\"finish\", () => resume(Cause.done(_)))\n+          const onFinish = () => resume(Cause.done(_))\n+          options.writable.once(\"finish\", onFinish)\n           options.writable.end()\n+          return Effect.sync(() => {\n+            options.writable.off(\"finish\", onFinish)\n+          })\n         })\n       }) :\n-      identity\n+      identity,\n+    Effect.raceFirst(Effect.callback<never, E>((resume) => {\n+      const onError = (error: unknown) => resume(Effect.fail(options.onError(error)))\n+      options.writable.once(\"error\", onError)\n+      return Effect.sync(() => {\n+        options.writable.off(\"error\", onError)\n+      })\n+    }))\n   )",
          "additions": 13,
          "deletions": 9
        }
      ]
    },
    {
      "pr": 7718,
      "title": "fix(NodeHttpClient): parse Undici response forms from cached bytes",
      "url": "https://github.com/Effect-TS/effect/pull/7718",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T21:03:15Z",
      "mergedAt": "2026-09-03T05:03:52Z",
      "head": "64b1a10744bc02617f843e8f93cccd4f5517fe80",
      "files": [
        {
          "filename": "packages/platform/node/src/NodeHttpClient.ts",
          "patch": "@@ -296,17 +296,18 @@ class UndiciResponse extends Inspectable.Class implements HttpClientResponse, Pi\n \n   private formDataBody?: Effect.Effect<FormData, Error.HttpClientError>\n   get formData(): Effect.Effect<FormData, Error.HttpClientError> {\n-    return this.formDataBody ??= Effect.tryPromise({\n-      try: () => this.source.body.formData() as Promise<FormData>,\n-      catch: (cause) =>\n-        new Error.HttpClientError({\n-          reason: new Error.DecodeError({\n-            request: this.request,\n-            response: this,\n-            cause\n+    return this.formDataBody ??= Effect.flatMap(this.arrayBuffer, (body) =>\n+      Effect.tryPromise({\n+        try: () => new globalThis.Response(body, { headers: this.headers }).formData(),\n+        catch: (cause) =>\n+          new Error.HttpClientError({\n+            reason: new Error.DecodeError({\n+              request: this.request,\n+              response: this,\n+              cause\n+            })\n           })\n-        })\n-    }).pipe(Effect.cached, Effect.runSync)\n+      })).pipe(Effect.cached, Effect.runSync)\n   }\n \n   private arrayBufferBody?: Effect.Effect<ArrayBuffer, Error.HttpClientError>",
          "additions": 11,
          "deletions": 10
        }
      ]
    },
    {
      "pr": 7724,
      "title": "fix(sql-mssql): forward the configured NTLM domain",
      "url": "https://github.com/Effect-TS/effect/pull/7724",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T21:03:29Z",
      "mergedAt": "2026-09-03T04:43:57Z",
      "head": "b412da06393fc68a53ad1f1a4b6ed774301856bf",
      "files": [
        {
          "filename": "packages/sql/mssql/src/MssqlClient.ts",
          "patch": "@@ -311,6 +311,7 @@ export const make = (\n         authentication: {\n           type: (options.authType as any) ?? \"default\",\n           options: {\n+            domain: options.domain,\n             userName: options.username,\n             password: options.password\n               ? Redacted.value(options.password)",
          "additions": 1,
          "deletions": 0
        }
      ]
    },
    {
      "pr": 7726,
      "title": "fix(sql-mssql): adapt byte arrays for automatic VarBinary binding",
      "url": "https://github.com/Effect-TS/effect/pull/7726",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T21:03:32Z",
      "mergedAt": "2026-09-03T04:56:13Z",
      "head": "9bd58e62ae8a9816a0e6e348171111e148f402da",
      "files": [
        {
          "filename": "packages/sql/mssql/src/MssqlClient.ts",
          "patch": "@@ -40,6 +40,7 @@ import {\n   UnknownError\n } from \"effect/unstable/sql/SqlError\"\n import * as Statement from \"effect/unstable/sql/Statement\"\n+import { Buffer } from \"node:buffer\"\n import * as Tedious from \"tedious\"\n import type { ConnectionOptions } from \"tedious/lib/connection.ts\"\n import type { DataType } from \"tedious/lib/data-type.ts\"\n@@ -706,6 +707,17 @@ function numberToParamName(n: number) {\n   return `${Math.ceil(n + 1)}`\n }\n \n+const byteArrayParameterType: DataType = {\n+  ...Tedious.TYPES.VarBinary,\n+  validate(value, collation, options) {\n+    return Tedious.TYPES.VarBinary.validate(\n+      Buffer.isBuffer(value) ? value : Buffer.from(value.buffer, value.byteOffset, value.byteLength),\n+      collation,\n+      options\n+    )\n+  }\n+}\n+\n /**\n  * Default mapping from Effect SQL primitive value kinds to Tedious SQL Server parameter data types.\n  *\n@@ -718,8 +730,8 @@ export const defaultParameterTypes: Record<Statement.PrimitiveKind, DataType> =\n   bigint: Tedious.TYPES.BigInt,\n   boolean: Tedious.TYPES.Bit,\n   Date: Tedious.TYPES.DateTime,\n-  Uint8Array: Tedious.TYPES.VarBinary,\n-  Int8Array: Tedious.TYPES.VarBinary,\n+  Uint8Array: byteArrayParameterType,\n+  Int8Array: byteArrayParameterType,\n   null: Tedious.TYPES.Bit\n }\n ",
          "additions": 14,
          "deletions": 2
        }
      ]
    },
    {
      "pr": 7730,
      "title": "fix(NodeHttpServer): forward custom and empty status text",
      "url": "https://github.com/Effect-TS/effect/pull/7730",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T21:03:40Z",
      "mergedAt": "2026-09-03T04:53:04Z",
      "head": "f39223491614723cd40e307d23b6a9c3adc6c89f",
      "files": [
        {
          "filename": "packages/platform/node/src/NodeHttpServer.ts",
          "patch": "@@ -537,7 +537,7 @@ const handleResponse = (\n   }\n \n   if (request.method === \"HEAD\") {\n-    nodeResponse.writeHead(response.status, headers)\n+    nodeResponse.writeHead(response.status, response.statusText, headers)\n     return Effect.andThen(\n       cancelResponseBody(response.body),\n       Effect.callback<void>((resume) => {\n@@ -556,12 +556,12 @@ const handleResponse = (\n   const body = response.body\n   switch (body._tag) {\n     case \"Empty\": {\n-      nodeResponse.writeHead(response.status, headers)\n+      nodeResponse.writeHead(response.status, response.statusText, headers)\n       nodeResponse.end()\n       return Effect.void\n     }\n     case \"Raw\": {\n-      nodeResponse.writeHead(response.status, headers)\n+      nodeResponse.writeHead(response.status, response.statusText, headers)\n       if (\n         typeof body.body === \"object\" && body.body !== null && \"pipe\" in body.body &&\n         typeof body.body.pipe === \"function\"\n@@ -587,7 +587,7 @@ const handleResponse = (\n       })\n     }\n     case \"Uint8Array\": {\n-      nodeResponse.writeHead(response.status, headers)\n+      nodeResponse.writeHead(response.status, response.statusText, headers)\n       // If the body is less than 1MB, we skip the callback\n       if (body.body.length < 1024 * 1024) {\n         nodeResponse.end(body.body)\n@@ -600,7 +600,7 @@ const handleResponse = (\n     case \"FormData\": {\n       return Effect.suspend(() => {\n         const r = new globalThis.Response(body.formData)\n-        nodeResponse.writeHead(response.status, {\n+        nodeResponse.writeHead(response.status, response.statusText, {\n           ...headers,\n           ...Object.fromEntries(r.headers)\n         })\n@@ -629,7 +629,7 @@ const handleResponse = (\n       })\n     }\n     case \"Stream\": {\n-      nodeResponse.writeHead(response.status, headers)\n+      nodeResponse.writeHead(response.status, response.statusText, headers)\n       const drainLatch = Latch.makeUnsafe()\n       nodeResponse.on(\"drain\", () => drainLatch.openUnsafe())\n       return body.stream.pipe(\n@@ -666,7 +666,7 @@ const handleCause = (\n   Effect.flatMap(causeResponse(originalCause), ([response, cause]) => {\n     const headersSent = nodeResponse.headersSent\n     if (!headersSent) {\n-      nodeResponse.writeHead(response.status)\n+      nodeResponse.writeHead(response.status, response.statusText)\n     }\n     if (!nodeResponse.writableEnded) {\n       nodeResponse.end()",
          "additions": 7,
          "deletions": 7
        }
      ]
    },
    {
      "pr": 7734,
      "title": "fix(sql-pg): honor explicit SSL overrides for URL modes",
      "url": "https://github.com/Effect-TS/effect/pull/7734",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T21:03:47Z",
      "mergedAt": "2026-09-03T04:52:11Z",
      "head": "265822b7a3922213fadba29fb2e17e0b361e7ea9",
      "files": [
        {
          "filename": "packages/sql/pg/src/PgConnection.ts",
          "patch": "@@ -2136,7 +2136,7 @@ const configError = (message: string, cause?: unknown): SqlError =>\n const resolveConfig = (options: Config): Effect.Effect<ResolvedConfig, SqlError> =>\n   Effect.suspend(() => {\n     const parsed: EffectResult.Result<UrlConfig, SqlError> = options.url !== undefined\n-      ? parseUrl(Redacted.value(options.url))\n+      ? parseUrl(Redacted.value(options.url), options.ssl !== undefined)\n       : EffectResult.succeed({})\n     if (EffectResult.isFailure(parsed)) return Effect.fail(parsed.failure)\n     const url = parsed.success\n@@ -2187,7 +2187,7 @@ const parsePort = (value: string, what: string): EffectResult.Result<number, Sql\n     : EffectResult.succeed(port)\n }\n \n-const parseUrl = (raw: string): EffectResult.Result<UrlConfig, SqlError> => {\n+const parseUrl = (raw: string, hasExplicitSsl: boolean): EffectResult.Result<UrlConfig, SqlError> => {\n   let url: URL\n   try {\n     url = new URL(raw)\n@@ -2270,6 +2270,7 @@ const parseUrl = (raw: string): EffectResult.Result<UrlConfig, SqlError> => {\n             break\n           case \"prefer\":\n           case \"allow\":\n+            if (hasExplicitSsl) break\n             return EffectResult.fail(\n               configError(`sslmode \"${value}\" is not supported: set ssl explicitly to true or false`)\n             )",
          "additions": 3,
          "deletions": 2
        }
      ]
    },
    {
      "pr": 7736,
      "title": "fix(BrowserHttpClient): support readers in ArrayBuffer mode",
      "url": "https://github.com/Effect-TS/effect/pull/7736",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T21:03:51Z",
      "mergedAt": "2026-09-03T04:53:37Z",
      "head": "032941f83c665f1af54d21193b297ab797a50dcd",
      "files": [
        {
          "filename": "packages/platform/browser/src/BrowserHttpClient.ts",
          "patch": "@@ -260,6 +260,13 @@ abstract class IncomingMessageImpl<E> extends Inspectable.Class implements HttpI\n     if (this._textEffect) {\n       return this._textEffect\n     }\n+    if (this.source.responseType === \"arraybuffer\") {\n+      return this._textEffect = this.arrayBuffer.pipe(\n+        Effect.map((buffer) => new TextDecoder().decode(buffer)),\n+        Effect.cached,\n+        Effect.runSync\n+      )\n+    }\n     return this._textEffect = Effect.callback<string, E>((resume) => {\n       if (this.source.readyState === 4) {\n         resume(Effect.succeed(this.source.responseText))\n@@ -303,6 +310,9 @@ abstract class IncomingMessageImpl<E> extends Inspectable.Class implements HttpI\n   }\n \n   get stream(): Stream.Stream<Uint8Array, E> {\n+    if (this.source.responseType === \"arraybuffer\") {\n+      return Stream.fromEffect(Effect.map(this.arrayBuffer, (buffer) => new Uint8Array(buffer)))\n+    }\n     return Stream.callback<Uint8Array, E>((queue) => {\n       let offset = 0\n       const onReadyStateChange = () => {",
          "additions": 10,
          "deletions": 0
        }
      ]
    },
    {
      "pr": 7746,
      "title": "fix(atom-vue): publish the selected ref's current value",
      "url": "https://github.com/Effect-TS/effect/pull/7746",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T22:14:28Z",
      "mergedAt": "2026-09-03T01:16:23Z",
      "head": "e567ddf3ff4d6c96d5c5802bdea1e73c61f965b5",
      "files": [
        {
          "filename": "packages/atom/vue/src/index.ts",
          "patch": "@@ -206,6 +206,7 @@ export const useAtomRef = <A>(atomRef: () => AtomRef.ReadonlyRef<A>): Readonly<R\n     onCleanup(ref.subscribe((next: A) => {\n       value.value = next\n     }))\n+    value.value = ref.value\n   })\n   return value as Readonly<Ref<A>>\n }",
          "additions": 1,
          "deletions": 0
        }
      ]
    },
    {
      "pr": 7760,
      "title": "fix(opentelemetry): preserve negative counter deltas in both exporters",
      "url": "https://github.com/Effect-TS/effect/pull/7760",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T22:14:54Z",
      "mergedAt": "2026-09-03T04:47:05Z",
      "head": "7ed737f4e99a4d285fcb78f899c3f2570d14411a",
      "files": [
        {
          "filename": "packages/effect/src/unstable/observability/OtlpMetrics.ts",
          "patch": "@@ -156,15 +156,15 @@ export const make: (options: {\n               if (typeof currentCount === \"bigint\" && typeof previousCount === \"bigint\") {\n                 reportValue = currentCount - previousCount\n                 // Handle reset: if current < previous, report current value\n-                if (reportValue < BigInt(0)) {\n+                if (state.state.incremental && reportValue < BigInt(0)) {\n                   reportValue = currentCount\n                 }\n               } else {\n                 const curr = Number(currentCount)\n                 const prev = Number(previousCount)\n                 reportValue = curr - prev\n                 // Handle reset\n-                if (reportValue < 0) {\n+                if (state.state.incremental && reportValue < 0) {\n                   reportValue = curr\n                 }\n               }",
          "additions": 2,
          "deletions": 2
        },
        {
          "filename": "packages/opentelemetry/src/internal/metrics.ts",
          "patch": "@@ -116,15 +116,15 @@ export class MetricProducerImpl implements MetricProducer {\n               if (typeof currentCount === \"bigint\" && typeof previousCount === \"bigint\") {\n                 reportValue = currentCount - previousCount\n                 // Handle reset: if current < previous, report current value\n-                if (reportValue < BigInt(0)) {\n+                if (state.state.incremental && reportValue < BigInt(0)) {\n                   reportValue = currentCount\n                 }\n               } else {\n                 const curr = Number(currentCount)\n                 const prev = Number(previousCount)\n                 reportValue = curr - prev\n                 // Handle reset\n-                if (reportValue < 0) {\n+                if (state.state.incremental && reportValue < 0) {\n                   reportValue = curr\n                 }\n               }",
          "additions": 2,
          "deletions": 2
        }
      ]
    },
    {
      "pr": 7778,
      "title": "fix(Optic): preserve deletions through pick and omit",
      "url": "https://github.com/Effect-TS/effect/pull/7778",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T00:00:30Z",
      "mergedAt": "2026-09-03T04:40:05Z",
      "head": "b2dda3f30bfe6c6781e60b87d72668e89062f54c",
      "files": [
        {
          "filename": "packages/effect/src/Optic.ts",
          "patch": "@@ -1058,10 +1058,10 @@ class OptionalImpl<S, A> implements Optional<S, A> {\n     )\n   }\n   pick(keys: any) {\n-    return this.compose(makeLens(Struct.pick(keys), (p, a) => ({ ...a, ...p })))\n+    return this.compose(makeLens(Struct.pick(keys), (p, a) => ({ ...Struct.omit(a, keys), ...p })))\n   }\n   omit(keys: any) {\n-    return this.compose(makeLens(Struct.omit(keys), (o, a) => ({ ...a, ...o })))\n+    return this.compose(makeLens(Struct.omit(keys), (o, a) => ({ ...Struct.pick(a, keys), ...o })))\n   }\n   notUndefined(): any {\n     return this.refine(Predicate.isNotUndefined, { expected: \"a value other than `undefined`\" })",
          "additions": 2,
          "deletions": 2
        }
      ]
    },
    {
      "pr": 7780,
      "title": "fix(Optic): splice canonical string indices in optionalKey",
      "url": "https://github.com/Effect-TS/effect/pull/7780",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T00:00:34Z",
      "mergedAt": "2026-09-03T04:44:40Z",
      "head": "d081c807926d21f8d50951acc8526a9059b477cf",
      "files": [
        {
          "filename": "packages/effect/src/Optic.ts",
          "patch": "@@ -1001,8 +1001,13 @@ class OptionalImpl<S, A> implements Optional<S, A> {\n           (a, s) => {\n             const copy = cloneShallow(s)\n             if (a === undefined) {\n-              if (Array.isArray(copy) && typeof key === \"number\") {\n-                copy.splice(key, 1)\n+              const index = typeof key === \"symbol\" ? NaN : Number(key)\n+              if (\n+                Array.isArray(copy) &&\n+                (typeof key === \"number\" ||\n+                  (String(index) === key && Number.isInteger(index) && index >= 0 && index < 0xFFFFFFFF))\n+              ) {\n+                copy.splice(index, 1)\n               } else {\n                 delete copy[key]\n               }",
          "additions": 7,
          "deletions": 2
        }
      ]
    },
    {
      "pr": 7796,
      "title": "fix(Schema): preserve ArrayEnsure element branches and encoding cardinality",
      "url": "https://github.com/Effect-TS/effect/pull/7796",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T01:46:28Z",
      "mergedAt": "2026-09-03T04:42:52Z",
      "head": "c180d8af382ed092e399faa0de7b452369d37ab5",
      "files": [
        {
          "filename": "packages/effect/src/Schema.ts",
          "patch": "@@ -4521,13 +4521,16 @@ export interface ArrayEnsure<S extends Constraint> extends decodeTo<$Array<toTyp\n  * @since 3.10.0\n  */\n export function ArrayEnsure<S extends Constraint>(schema: S): ArrayEnsure<S> {\n-  return Union([schema, ArraySchema(schema)]).pipe(decodeTo(\n-    ArraySchema(toType(schema)),\n+  const many = ArraySchema(schema)\n+  const to = ArraySchema(toType(schema))\n+  const one = decodeTo(\n+    Tuple([Unknown]),\n     SchemaTransformation.transform({\n-      decode: Arr.ensure,\n-      encode: (array) => array.length === 1 ? array[0] : array\n+      decode: (value) => [value] as const,\n+      encode: ([value]) => value\n     })\n-  ))\n+  )(schema)\n+  return make(Union([one, many]).pipe(decodeTo(to)).ast, { from: Union([schema, many]), to })\n }\n /**\n  * Type-level representation returned by {@link UniqueArray}.",
          "additions": 8,
          "deletions": 5
        }
      ]
    },
    {
      "pr": 7798,
      "title": "fix(Channel): emit CR-terminated lines before pulling more input",
      "url": "https://github.com/Effect-TS/effect/pull/7798",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T01:46:32Z",
      "mergedAt": "2026-09-03T05:27:57Z",
      "head": "3d8c1dd0fa6f4364cd50c659e07eeee80f2efe61",
      "files": [
        {
          "filename": "packages/effect/src/Channel.ts",
          "patch": "@@ -6515,9 +6515,8 @@ export const splitLines = <Err, Done>(): Channel<\n       // Accumulates text that has not yet been terminated by a line break.\n       // Content is carried across chunks until a terminator is found.\n       let stringBuilder = \"\"\n-      // Set when a chunk ends with \\r so the next chunk can check whether\n-      // the following character is \\n (completing a \\r\\n pair) or not\n-      // (standalone \\r, which is itself a line terminator).\n+      // A trailing \\r completes the line immediately. Remember it only to\n+      // suppress a leading \\n in the next nonempty string.\n       let midCRLF = false\n       // Remembers the upstream Done value after the first time the upstream\n       // signals completion, so subsequent pulls return Done immediately\n@@ -6544,11 +6543,8 @@ export const splitLines = <Err, Done>(): Channel<\n             let indexOfLF = str.indexOf(\"\\n\")\n             if (midCRLF) {\n               if (indexOfLF === 0) {\n-                pushLine(\"\")\n                 from = 1\n                 indexOfLF = str.indexOf(\"\\n\", from)\n-              } else {\n-                pushLine(\"\")\n               }\n               midCRLF = false\n             }\n@@ -6558,18 +6554,19 @@ export const splitLines = <Err, Done>(): Channel<\n                 from = indexOfLF + 1\n                 indexOfLF = str.indexOf(\"\\n\", from)\n               } else {\n+                pushLine(str.substring(from, indexOfCR))\n                 if (str.length === indexOfCR + 1) {\n                   midCRLF = true\n+                  from = str.length\n                   indexOfCR = -1\n                 } else {\n-                  pushLine(str.substring(from, indexOfCR))\n                   from = indexOfCR + (indexOfLF === indexOfCR + 1 ? 2 : 1)\n                   indexOfCR = str.indexOf(\"\\r\", from)\n                   indexOfLF = str.indexOf(\"\\n\", from)\n                 }\n               }\n             }\n-            stringBuilder = stringBuilder + str.substring(from, str.length - (midCRLF ? 1 : 0))\n+            stringBuilder = stringBuilder + str.substring(from)\n           }\n         }\n         return Arr.isReadonlyArrayNonEmpty(chunkBuilder) ? chunkBuilder : null\n@@ -6584,7 +6581,7 @@ export const splitLines = <Err, Done>(): Channel<\n           onFailure: Effect.failCause,\n           onDone: (leftover) => {\n             done = Option.some(leftover)\n-            if (stringBuilder.length > 0 || midCRLF) {\n+            if (stringBuilder.length > 0) {\n               const last = stringBuilder\n               stringBuilder = \"\"\n               midCRLF = false",
          "additions": 6,
          "deletions": 9
        }
      ]
    },
    {
      "pr": 7820,
      "title": "fix(IndexedDb): keep select streams within their query limits",
      "url": "https://github.com/Effect-TS/effect/pull/7820",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T04:25:14Z",
      "mergedAt": "2026-09-03T06:29:37Z",
      "head": "5d75b87fd68bf572d8bc2aeb07ad1c2f4e59dab6",
      "files": [
        {
          "filename": "packages/platform/browser/src/IndexedDbQueryBuilder.ts",
          "patch": "@@ -1785,6 +1785,7 @@ const SelectProto: Omit<\n             const isPartial = data.length < chunkSize\n             const next = makeSelect({\n               ...select,\n+              limitValue: limit === undefined ? chunkSize : Math.min(chunkSize, limit - total),\n               offsetValue: initialOffset + total\n             })\n             return [data, isPartial || reachedLimit ? Option.none() : Option.some(next)] as const",
          "additions": 1,
          "deletions": 0
        }
      ]
    },
    {
      "pr": 7886,
      "title": "fix(HashRing): include the final exclusion search radius",
      "url": "https://github.com/Effect-TS/effect/pull/7886",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T12:21:11Z",
      "mergedAt": "2026-09-03T23:01:47Z",
      "head": "f319b51332c383a8ffa8b630ae53ec672b21419e",
      "files": [
        {
          "filename": "packages/effect/src/HashRing.ts",
          "patch": "@@ -420,7 +420,7 @@ function getIndexForInput<A extends PrimaryKey.PrimaryKey>(\n     return [a, distA]\n   }\n   const range = Math.max(lo, len - lo)\n-  for (let i = 1; i < range; i++) {\n+  for (let i = 1; i <= range; i++) {\n     let index = lo - i\n     if (index >= 0 && index < len && !exclude.has(ring[index][1])) {\n       return [index, Math.abs(ring[index][0] - hash)]",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7989,
      "title": "fix(ChildProcess): preserve astral escapes in templates",
      "url": "https://github.com/Effect-TS/effect/pull/7989",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-04T02:33:23Z",
      "mergedAt": "2026-09-04T04:00:15Z",
      "head": "e8ddc162ea03a2ca17d609fb819d6a73a49e3aa7",
      "files": [
        {
          "filename": "packages/effect/src/unstable/process/ChildProcess.ts",
          "patch": "@@ -1018,8 +1018,13 @@ const splitByWhitespaces = (template: string, rawTemplate: string): {\n         rawIndex += 1\n       } else if (nextRawCharacter === \"u\" && rawTemplate[rawIndex + 2] === \"{\") {\n         // Handle variable-length unicode escape sequences (i.e. `\\u{1F600}`) by:\n+        // - Advancing the template index an extra code unit for astral code points\n         // - Advancing the raw template index past the unicode escape sequence\n-        rawIndex = rawTemplate.indexOf(\"}\", rawIndex + 3)\n+        const end = rawTemplate.indexOf(\"}\", rawIndex + 3)\n+        if (parseInt(rawTemplate.slice(rawIndex + 3, end), 16) > 0xffff) {\n+          templateIndex += 1\n+        }\n+        rawIndex = end\n       } else {\n         // Advance raw template index past fixed-length escape sequences:\n         // - \\n    → 2 chars (backslash + n)",
          "additions": 6,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7675,
      "title": "fix(Mime): normalize parameters in all-extension lookups",
      "url": "https://github.com/Effect-TS/effect/pull/7675",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T18:50:43Z",
      "mergedAt": "2026-09-03T00:47:58Z",
      "head": "05a1d03a4c639acf1e3034f2d8737a8183afbd68",
      "files": [
        {
          "filename": "packages/effect/src/unstable/http/Mime.ts",
          "patch": "@@ -72,5 +72,5 @@ export const getAllExtensions = (type: string): Option.Option<ReadonlySet<string\n   if (typeof type !== \"string\") {\n     return Option.none()\n   }\n-  return Option.fromUndefinedOr(typeToExtensions.get(type.toLowerCase()))\n+  return Option.fromUndefinedOr(typeToExtensions.get(type.split(\";\")[0].trim().toLowerCase()))\n }",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7685,
      "title": "fix(cli): classify absent required variadic arguments as missing",
      "url": "https://github.com/Effect-TS/effect/pull/7685",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T19:56:43Z",
      "mergedAt": "2026-09-03T01:36:06Z",
      "head": "8c22f75c78448dbcb1fb5f238ab485e00345971a",
      "files": [
        {
          "filename": "packages/effect/src/unstable/cli/Param.ts",
          "patch": "@@ -2008,12 +2008,14 @@ const parsePositionalVariadic: <Kind extends ParamKind, A>(\n   }\n \n   if (count < minValue) {\n-    return yield* new CliError.InvalidValue({\n-      option: single.name,\n-      value: `${count} values`,\n-      expected: `at least ${minValue} value${minValue === 1 ? \"\" : \"s\"}`,\n-      kind: single.kind\n-    })\n+    return yield* count === 0\n+      ? new CliError.MissingArgument({ argument: single.name })\n+      : new CliError.InvalidValue({\n+        option: single.name,\n+        value: `${count} values`,\n+        expected: `at least ${minValue} value${minValue === 1 ? \"\" : \"s\"}`,\n+        kind: single.kind\n+      })\n   }\n \n   return [currentArgs, results] as const",
          "additions": 8,
          "deletions": 6
        }
      ]
    },
    {
      "pr": 7689,
      "title": "fix(HttpRouter): normalize prefix-removal metadata",
      "url": "https://github.com/Effect-TS/effect/pull/7689",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T19:56:52Z",
      "mergedAt": "2026-09-03T03:42:08Z",
      "head": "d0b0b0dac35e6d1238fbcdedf58b26ebedf9d424",
      "files": [
        {
          "filename": "packages/effect/src/unstable/http/HttpRouter.ts",
          "patch": "@@ -163,6 +163,7 @@ export const make = Effect.gen(function*() {\n   return HttpRouter.of({\n     [TypeId]: TypeId,\n     prefixed(this: HttpRouter, prefix: string) {\n+      prefix = removeTrailingSlash(prefix as PathInput)\n       return HttpRouter.of({\n         ...this,\n         prefixed: (newPrefix: string) => this.prefixed(prefixPath(prefix, newPrefix)),\n@@ -748,7 +749,7 @@ export const prefixRoute: {\n     ...self,\n     path: prefixPath(self.path, prefix) as PathInput,\n     prefix: Option.match(self.prefix, {\n-      onNone: () => prefix as string,\n+      onNone: () => removeTrailingSlash(prefix as PathInput),\n       onSome: (existingPrefix) => prefixPath(existingPrefix, prefix) as string\n     })\n   }))",
          "additions": 2,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7695,
      "title": "fix(HttpApiSchema): clear stale metadata in encodeToWithHeaders",
      "url": "https://github.com/Effect-TS/effect/pull/7695",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T19:57:06Z",
      "mergedAt": "2026-09-03T03:48:16Z",
      "head": "5e7ad10ae6f1e9acb6de511c0ce15964a03474bf",
      "files": [
        {
          "filename": "packages/effect/src/unstable/httpapi/HttpApiSchema.ts",
          "patch": "@@ -735,8 +735,8 @@ export function encodeToWithHeaders<\n       )\n     ).annotate({\n       \"~httpApiWithHeaders\": { body, headers, headersCodec: Schema.toEncoded(headers) },\n-      ...(status !== undefined ? { httpApiStatus: status } : undefined),\n-      ...(encoding !== undefined ? { \"~httpApiEncoding\": encoding } : undefined)\n+      httpApiStatus: status,\n+      \"~httpApiEncoding\": encoding\n     })\n   }\n }",
          "additions": 2,
          "deletions": 2
        }
      ]
    },
    {
      "pr": 7697,
      "title": "fix(HttpApiBuilder): honor status annotations on stream wrappers",
      "url": "https://github.com/Effect-TS/effect/pull/7697",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T19:57:11Z",
      "mergedAt": "2026-09-03T03:49:39Z",
      "head": "202fb6aa1a40352519a342c5c54da12d9e341676",
      "files": [
        {
          "filename": "packages/effect/src/unstable/httpapi/HttpApiBuilder.ts",
          "patch": "@@ -971,13 +971,14 @@ function makeWithHeadersEncoder(endpoint: HttpApiEndpoint.Top): WithHeadersEncod\n }\n \n function makeStreamEncoder(endpoint: HttpApiEndpoint.Top): StreamEncoder | undefined {\n-  const streamSchema = getStreamSuccessSchema(endpoint)\n-  if (streamSchema === undefined) {\n+  const successSchema = getStreamSuccessSchema(endpoint)\n+  if (successSchema === undefined) {\n     return undefined\n   }\n \n+  const streamSchema = successSchema.body\n   const hasBuffered = hasBufferedSuccess(endpoint)\n-  const status = HttpApiSchema.getStatusStream(streamSchema)\n+  const status = HttpApiSchema.getStatusSuccessSchema(successSchema.schema)\n   const contentType = streamSchema.contentType\n \n   if (HttpApiSchema.isStreamUint8Array(streamSchema)) {\n@@ -1021,7 +1022,7 @@ function getStreamSuccessSchema(endpoint: HttpApiEndpoint.Top) {\n   for (const schema of endpoint.success) {\n     const body = HttpApiSchema.isWithHeaders(schema) ? schema.schema : schema\n     if (HttpApiSchema.isStreamSchema(body)) {\n-      return body\n+      return { schema, body }\n     }\n   }\n }",
          "additions": 5,
          "deletions": 4
        },
        {
          "filename": "packages/effect/src/unstable/httpapi/HttpApiSchema.ts",
          "patch": "@@ -996,11 +996,6 @@ export function getResponseEncodingSchema(schema: Schema.Constraint): ResponseEn\n   return getResponseEncoding(schema.ast)\n }\n \n-/** @internal */\n-export function getStatusStream(self: StreamSchema): number {\n-  return getStatusSuccess(self.ast)\n-}\n-\n /** @internal */\n export function getStatusError(self: SchemaAST.AST): number {\n   return resolveHttpApiStatus(self) ?? 500",
          "additions": 0,
          "deletions": 5
        }
      ]
    },
    {
      "pr": 7705,
      "title": "fix(HttpApiTest): run registered pre-response handlers",
      "url": "https://github.com/Effect-TS/effect/pull/7705",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T19:57:26Z",
      "mergedAt": "2026-09-03T04:07:55Z",
      "head": "5c656734e23b5531ce266347fd034a19f346fc25",
      "files": [
        {
          "filename": "packages/effect/src/unstable/httpapi/HttpApiTest.ts",
          "patch": "@@ -20,6 +20,7 @@ import type { HttpPlatform } from \"../http/HttpPlatform.ts\"\n import * as HttpRouter from \"../http/HttpRouter.ts\"\n import * as HttpServerRequest from \"../http/HttpServerRequest.ts\"\n import * as HttpServerResponse from \"../http/HttpServerResponse.ts\"\n+import * as preResponseHandler from \"../http/internal/preResponseHandler.ts\"\n import type * as HttpApi from \"./HttpApi.ts\"\n import type { HandlerRuntime } from \"./HttpApiBuilder.ts\"\n import * as HttpApiBuilder from \"./HttpApiBuilder.ts\"\n@@ -100,6 +101,10 @@ export const groups = Effect.fnUntraced(function*<\n   const httpClient = HttpClient.make(Effect.fnUntraced(function*(request) {\n     const serverRequest = HttpServerRequest.fromClientRequest(request)\n     const response = yield* handler.pipe(\n+      Effect.flatMap((response) => {\n+        const preResponse = preResponseHandler.requestPreResponseHandlers.get(serverRequest.source)\n+        return preResponse === undefined ? Effect.succeed(response) : preResponse(serverRequest, response)\n+      }),\n       Effect.provideService(HttpServerRequest.HttpServerRequest, serverRequest),\n       Effect.orDie\n     )",
          "additions": 5,
          "deletions": 0
        }
      ]
    },
    {
      "pr": 7732,
      "title": "fix(sql-sqlite-do): classify streaming storage failures as SqlError",
      "url": "https://github.com/Effect-TS/effect/pull/7732",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T21:03:43Z",
      "mergedAt": "2026-09-03T05:11:49Z",
      "head": "9cb9b887f9954f9c4524634f09feb255f3e169fa",
      "files": [
        {
          "filename": "packages/sql/sqlite-do/src/SqliteClient.ts",
          "patch": "@@ -21,6 +21,7 @@\n  * @since 4.0.0\n  */\n import type { DurableObjectStorage, SqlStorage } from \"@cloudflare/workers-types\"\n+import * as Cause from \"effect/Cause\"\n import * as Config from \"effect/Config\"\n import * as Context from \"effect/Context\"\n import * as Effect from \"effect/Effect\"\n@@ -258,6 +259,12 @@ export const make = (\n             const iterator = runIterator(sql, params)\n             return Stream.fromIteratorSucceed(iterator, 128)\n           }).pipe(\n+            Stream.catchCauseFilter(Cause.findDefect, (defect) =>\n+              Stream.fail(\n+                new SqlError({\n+                  reason: classifyError(defect, \"Failed to execute statement\", \"execute\")\n+                })\n+              )),\n             transformRows\n               ? Stream.mapArray((chunk) => transformRows(chunk) as any)\n               : identity",
          "additions": 7,
          "deletions": 0
        }
      ]
    },
    {
      "pr": 7742,
      "title": "fix(effect): tolerate repeated reactivity keys during query cleanup",
      "url": "https://github.com/Effect-TS/effect/pull/7742",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T22:14:21Z",
      "mergedAt": "2026-09-03T04:55:25Z",
      "head": "bba6d89a3463bd1000be7e418c7f45d03a7b76f5",
      "files": [
        {
          "filename": "packages/effect/src/unstable/reactivity/Reactivity.ts",
          "patch": "@@ -123,7 +123,8 @@ export const make = Effect.sync(() => {\n     })\n     return () => {\n       for (let i = 0; i < resolvedKeys.length; i++) {\n-        const set = handlers.get(resolvedKeys[i])!\n+        const set = handlers.get(resolvedKeys[i])\n+        if (set === undefined) continue\n         set.delete(handler)\n         if (set.size === 0) {\n           handlers.delete(resolvedKeys[i])",
          "additions": 2,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7748,
      "title": "fix(effect): encode tool results using their known result branch",
      "url": "https://github.com/Effect-TS/effect/pull/7748",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T22:14:32Z",
      "mergedAt": "2026-09-03T06:43:03Z",
      "head": "1a8fb7e2b73882684056f96c2cbfc6c63ff5eb5a",
      "files": [
        {
          "filename": "packages/effect/src/unstable/ai/Toolkit.ts",
          "patch": "@@ -243,27 +243,25 @@ const Proto = {\n         readonly context: Context.Context<never>\n         readonly handler: Tool.Handler<any>[\"handler\"]\n         readonly decodeParameters: (u: unknown) => Effect.Effect<unknown, Schema.SchemaError>\n-        readonly decodeResult: (u: unknown) => Effect.Effect<unknown, Schema.SchemaError>\n-        readonly encodeResult: (u: unknown) => Effect.Effect<unknown, Schema.SchemaError>\n+        readonly encodeResult: (u: unknown, isFailure: boolean) => Effect.Effect<unknown, Schema.SchemaError>\n       }>()\n \n       const getSchemas = (tool: Tool.Any) => {\n         let schemas = schemasCache.get(tool)\n         if (Predicate.isUndefined(schemas)) {\n           const handler = services.mapUnsafe.get(tool.id)! as Tool.Handler<any>\n-          const resultSchema = tool.failureMode === \"return\"\n-            ? Schema.Union([tool.successSchema, tool.failureSchema, AiError.AiError])\n-            : tool.successSchema\n           const decodeParameters = Schema.isSchema(tool.parametersSchema)\n             ? Schema.decodeUnknownEffect(tool.parametersSchema) as any\n             : (u: unknown) => Effect.succeed(u)\n-          const decodeResult = Schema.decodeUnknownEffect(resultSchema) as any\n-          const encodeResult = Schema.encodeUnknownEffect(resultSchema) as any\n+          const encodeSuccess = Schema.encodeUnknownEffect(tool.successSchema) as any\n+          const encodeFailure = Schema.encodeUnknownEffect(tool.failureSchema) as any\n+          const encodeAiError = Schema.encodeUnknownEffect(AiError.AiError)\n+          const encodeResult = (u: unknown, isFailure: boolean) =>\n+            !isFailure ? encodeSuccess(u) : AiError.isAiError(u) ? encodeAiError(u) : encodeFailure(u)\n           schemas = {\n             context: handler.context,\n             handler: handler.handler,\n             decodeParameters,\n-            decodeResult,\n             encodeResult\n           }\n           schemasCache.set(tool, schemas)\n@@ -294,8 +292,8 @@ const Proto = {\n         // Fetch cached schemas / handlers for the tool\n         const schemas = getSchemas(tool)\n \n-        const encodeResult = (result: any) =>\n-          schemas.encodeResult(result).pipe(\n+        const encodeResult = (result: any, isFailure: boolean) =>\n+          schemas.encodeResult(result, isFailure).pipe(\n             Effect.mapError((cause) =>\n               AiError.make({\n                 module: \"Toolkit\",\n@@ -323,7 +321,7 @@ const Proto = {\n             return yield* error\n           }\n           return Stream.fromEffect(\n-            Effect.map(encodeResult(error), (encodedResult) => ({\n+            Effect.map(encodeResult(error, true), (encodedResult) => ({\n               result: error,\n               isFailure: true,\n               preliminary: false,\n@@ -390,7 +388,7 @@ const Proto = {\n               : Stream.succeed({ result: normalizedError, isFailure: true, preliminary: false })\n           }),\n           Stream.mapEffect(Effect.fnUntraced(function*(output) {\n-            const encodedResult = yield* encodeResult(output.result)\n+            const encodedResult = yield* encodeResult(output.result, output.isFailure)\n             return { ...output, encodedResult }\n           })),\n           Stream.onEnd(Fiber.interrupt(fiber))",
          "additions": 10,
          "deletions": 12
        }
      ]
    },
    {
      "pr": 7754,
      "title": "fix(doctest): preserve statement boundaries after generated assertions",
      "url": "https://github.com/Effect-TS/effect/pull/7754",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T22:14:43Z",
      "mergedAt": "2026-09-03T01:14:29Z",
      "head": "7bf0ee5dadd9ffcb7190fd4ac3654d3ba4c8aca7",
      "files": [
        {
          "filename": "packages/tools/doctest/src/Transform.ts",
          "patch": "@@ -175,7 +175,7 @@ export const transform = (source: string, file: string, line: number): string =>\n       output.overwrite(\n         expression.start,\n         comment.end,\n-        `${alias}(${source.slice(expression.start, expression.end)}, ${expected})`\n+        `${alias}(${source.slice(expression.start, expression.end)}, ${expected});`\n       )\n       continue\n     }\n@@ -189,7 +189,7 @@ export const transform = (source: string, file: string, line: number): string =>\n         id?.type === \"Identifier\" && typeof id.name === \"string\"\n       ) {\n         const indentation = source.slice(source.lastIndexOf(\"\\n\", node.start - 1) + 1, node.start)\n-        output.overwrite(node.end, comment.end, `\\n${indentation}${alias}(${id.name}, ${expected})`)\n+        output.overwrite(node.end, comment.end, `\\n${indentation}${alias}(${id.name}, ${expected});`)\n         continue\n       }\n     }",
          "additions": 2,
          "deletions": 2
        }
      ]
    },
    {
      "pr": 7762,
      "title": "fix(opentelemetry): use collection interval starts for delta metrics",
      "url": "https://github.com/Effect-TS/effect/pull/7762",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T22:14:57Z",
      "mergedAt": "2026-09-03T05:19:58Z",
      "head": "0e95d468e8ca916bb45ec5e81abde957ef718198",
      "files": [
        {
          "filename": "packages/opentelemetry/src/internal/metrics.ts",
          "patch": "@@ -133,7 +133,7 @@ export class MetricProducerImpl implements MetricProducer {\n           }\n \n           const descriptor = descriptorFromState(state, attributes)\n-          const startTime = this.startTimeFor(descriptor.name, intervalStartTime)\n+          const startTime = isDelta ? intervalStartTime : this.startTimeFor(descriptor.name, intervalStartTime)\n           const dataPoint: DataPoint<number> = {\n             startTime,\n             endTime: hrTimeNow,\n@@ -217,7 +217,7 @@ export class MetricProducerImpl implements MetricProducer {\n           }\n \n           const descriptor = descriptorFromState(state, attributes)\n-          const startTime = this.startTimeFor(descriptor.name, intervalStartTime)\n+          const startTime = isDelta ? intervalStartTime : this.startTimeFor(descriptor.name, intervalStartTime)\n           const dataPoint: DataPoint<Histogram> = {\n             startTime,\n             endTime: hrTimeNow,\n@@ -263,7 +263,7 @@ export class MetricProducerImpl implements MetricProducer {\n             }\n \n             const descriptor = descriptorFromState(state, attributes)\n-            const startTime = this.startTimeFor(descriptor.name, intervalStartTime)\n+            const startTime = isDelta ? intervalStartTime : this.startTimeFor(descriptor.name, intervalStartTime)\n             dataPoints.push({\n               startTime,\n               endTime: hrTimeNow,",
          "additions": 3,
          "deletions": 3
        }
      ]
    },
    {
      "pr": 7764,
      "title": "fix(ai-openrouter): retain normalized tool-call finish reasons",
      "url": "https://github.com/Effect-TS/effect/pull/7764",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-02T22:15:01Z",
      "mergedAt": "2026-09-03T01:13:38Z",
      "head": "e1f89fa2ca9c8f4e610b0669c37b5ab1b0f15ad3",
      "files": [
        {
          "filename": "packages/ai/openrouter/src/OpenRouterLanguageModel.ts",
          "patch": "@@ -1494,7 +1494,7 @@ const makeStreamResponse = Effect.fnUntraced(\n             (detail) => detail.type === \"reasoning.encrypted\" && detail.data.length > 0\n           )\n           if (totalToolCalls > 0 && hasEncryptedReasoning && finishReason === \"stop\") {\n-            finishReason = resolveFinishReason(\"tool-calls\")\n+            finishReason = \"tool-calls\"\n           }\n \n           // Forward any unsent tool calls if finish reason is 'tool-calls'",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7788,
      "title": "fix(FileSystem): retain the sink write default for undefined flags",
      "url": "https://github.com/Effect-TS/effect/pull/7788",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T00:22:59Z",
      "mergedAt": "2026-09-03T04:44:56Z",
      "head": "fc93a19c166486d27c3e246786b71646651b2f27",
      "files": [
        {
          "filename": "packages/effect/src/FileSystem.ts",
          "patch": "@@ -741,7 +741,7 @@ export const make = (\n     }, Stream.unwrap),\n     sink: (path, options) =>\n       pipe(\n-        impl.open(path, { flag: \"w\", ...options }),\n+        impl.open(path, { ...options, flag: options?.flag ?? \"w\" }),\n         Effect.map((file) => Sink.forEach((_: Uint8Array) => file.writeAll(_))),\n         Sink.unwrap\n       ),",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7800,
      "title": "fix(platform-bun): report Unix addresses for Unix socket servers",
      "url": "https://github.com/Effect-TS/effect/pull/7800",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T01:46:37Z",
      "mergedAt": "2026-09-03T04:36:07Z",
      "head": "ca25095134bf51cf632e4165a7daa36dd700d8bb",
      "files": [
        {
          "filename": "packages/platform/bun/src/BunHttpServer.ts",
          "patch": "@@ -155,7 +155,9 @@ export const make = Effect.fnUntraced(\n     yield* Scope.addFinalizer(scope, shutdown)\n \n     return Server.make({\n-      address: { _tag: \"TcpAddress\", port: server.port!, hostname: server.hostname! },\n+      address: \"unix\" in options && options.unix !== undefined\n+        ? { _tag: \"UnixAddress\", path: options.unix }\n+        : { _tag: \"TcpAddress\", port: server.port!, hostname: server.hostname! },\n       serve: Effect.fnUntraced(function*(httpApp, middleware) {\n         const parent = yield* Effect.fiber\n         const services = parent.context",
          "additions": 3,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7810,
      "title": "fix(platform-node): preserve unsafe worker reply payloads",
      "url": "https://github.com/Effect-TS/effect/pull/7810",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T04:06:12Z",
      "mergedAt": "2026-09-03T06:40:23Z",
      "head": "582db10525abf8352aa4a1976143dab45b6d3680",
      "files": [
        {
          "filename": "packages/platform/node/src/NodeWorkerRunner.ts",
          "patch": "@@ -38,11 +38,13 @@ export const layer: Layer.Layer<WorkerRunner.WorkerRunnerPlatform> = Layer.succe\n         })\n       }\n \n-      const sendUnsafe = WorkerThreads.parentPort\n+      const sendRaw = WorkerThreads.parentPort\n         ? (_portId: number, message: any, transfers?: any) => WorkerThreads.parentPort!.postMessage(message, transfers)\n         : (_portId: number, message: any, _transfers?: any) => process.send!(message)\n+      const sendUnsafe = (_portId: number, message: O, transfers?: ReadonlyArray<unknown>) =>\n+        sendRaw(_portId, [1, message], transfers)\n       const send = (_portId: number, message: O, transfers?: ReadonlyArray<unknown>) =>\n-        Effect.sync(() => sendUnsafe(_portId, [1, message], transfers as any))\n+        Effect.sync(() => sendUnsafe(_portId, message, transfers))\n \n       const run = <A, E, R>(\n         handler: (portId: number, message: I) => Effect.Effect<A, E, R> | void\n@@ -115,7 +117,7 @@ export const layer: Layer.Layer<WorkerRunner.WorkerRunnerPlatform> = Layer.succe\n             })\n           )\n \n-          sendUnsafe(0, [0])\n+          sendRaw(0, [0])\n \n           return yield* Deferred.await(closeLatch)\n         }))",
          "additions": 5,
          "deletions": 3
        }
      ]
    },
    {
      "pr": 7814,
      "title": "fix(McpServer): resolve HTTP resource templates without losing origins",
      "url": "https://github.com/Effect-TS/effect/pull/7814",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T04:18:08Z",
      "mergedAt": "2026-09-03T06:35:31Z",
      "head": "e97015ff87a0c671eae2d21b910c0a8195044ad6",
      "files": [
        {
          "filename": "packages/effect/src/unstable/ai/McpServer.ts",
          "patch": "@@ -2149,9 +2149,9 @@ const makeUriMatcher = <A>() => {\n     caseSensitive: true\n   })\n   const add = (uri: string, value: A) => {\n-    router.on(\"GET\", uri as any, value)\n+    router.on(\"GET\", `/${uri}`, value)\n   }\n-  const find = (uri: string) => router.find(\"GET\", uri)\n+  const find = (uri: string) => router.find(\"GET\", `/${uri}`)\n \n   return { add, find } as const\n }",
          "additions": 2,
          "deletions": 2
        }
      ]
    },
    {
      "pr": 7837,
      "title": "fix(SqlMessageStorage): preserve reply IDs in by-ID reads",
      "url": "https://github.com/Effect-TS/effect/pull/7837",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T06:14:08Z",
      "mergedAt": "2026-09-04T03:34:24Z",
      "head": "e80bfffd78864b749f37bb53e3c38efb1e7e20f4",
      "files": [
        {
          "filename": "packages/effect/src/unstable/cluster/SqlMessageStorage.ts",
          "patch": "@@ -666,7 +666,7 @@ export const makeEncoded: (options?: {\n     unprocessedMessagesById(ids, now) {\n       const idArr = Array.from(ids, (id) => String(id))\n       return sql<MessageRow & ReplyJoinRow>`\n-        SELECT m.*, r.id as reply_id, r.kind as reply_kind, r.payload as reply_payload, r.sequence as reply_sequence\n+        SELECT m.*, r.id as reply_reply_id, r.kind as reply_kind, r.payload as reply_payload, r.sequence as reply_sequence\n         FROM ${messagesTableSql} m\n         LEFT JOIN ${repliesTableSql} r ON r.id = m.last_reply_id\n         WHERE m.id IN (${sql.literal(idArr.join(\",\"))})",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7840,
      "title": "fix(DurableClock): preserve explicit zero in-memory thresholds",
      "url": "https://github.com/Effect-TS/effect/pull/7840",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T06:31:50Z",
      "mergedAt": "2026-09-04T03:35:01Z",
      "head": "6e296d9c456a386d4a4c86b787fdab55f656b5de",
      "files": [
        {
          "filename": "packages/effect/src/unstable/workflow/DurableClock.ts",
          "patch": "@@ -93,7 +93,7 @@ export const sleep: (\n     return\n   }\n \n-  const inMemoryThreshold = options.inMemoryThreshold\n+  const inMemoryThreshold = options.inMemoryThreshold !== undefined\n     ? Duration.fromInputUnsafe(options.inMemoryThreshold)\n     : defaultInMemoryThreshold\n ",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7872,
      "title": "fix(Formatter): preserve defined falsy Error causes",
      "url": "https://github.com/Effect-TS/effect/pull/7872",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T11:14:33Z",
      "mergedAt": "2026-09-03T22:43:05Z",
      "head": "87770ba782b8404e20be34d060334adbb057a19b",
      "files": [
        {
          "filename": "packages/effect/src/Formatter.ts",
          "patch": "@@ -169,7 +169,7 @@ export function format(input: unknown, options?: {\n         v[\"toString\"] !== Array.prototype.toString\n       ) {\n         const s = safeToString(v)\n-        output = v instanceof Error && v.cause ? `${s} (cause: ${recur(v.cause, d)})` : s\n+        output = v instanceof Error && v.cause !== undefined ? `${s} (cause: ${recur(v.cause, d)})` : s\n       } else if (Symbol.iterator in v) {\n         output = `${v.constructor.name}(${recur(Array.from(v as any), d)})`\n       } else {",
          "additions": 1,
          "deletions": 1
        }
      ]
    },
    {
      "pr": 7951,
      "title": "fix(sql-sqlite-wasm): start native message ports",
      "url": "https://github.com/Effect-TS/effect/pull/7951",
      "state": "MERGED",
      "isDraft": false,
      "createdAt": "2026-09-03T19:50:53Z",
      "mergedAt": "2026-09-04T03:32:25Z",
      "head": "5f9d69215befb00d39a8d7209a93331f40e9a072",
      "files": [
        {
          "filename": "packages/sql/sqlite-wasm/src/OpfsWorker.ts",
          "patch": "@@ -29,7 +29,7 @@ const classifyError = (cause: unknown, message: string, operation: string) =>\n  * @since 4.0.0\n  */\n export interface OpfsWorkerConfig {\n-  readonly port: EventTarget & Pick<MessagePort, \"postMessage\" | \"close\">\n+  readonly port: EventTarget & Pick<MessagePort, \"postMessage\" | \"close\"> & Partial<Pick<MessagePort, \"start\">>\n   readonly dbName: string\n }\n \n@@ -114,6 +114,7 @@ export const run = (\n         }\n       }\n       options.port.addEventListener(\"message\", onMessage)\n+      options.port.start?.()\n       options.port.postMessage([\"ready\", undefined, undefined])\n       return Effect.sync(() => {\n         options.port.removeEventListener(\"message\", onMessage)",
          "additions": 2,
          "deletions": 1
        },
        {
          "filename": "packages/sql/sqlite-wasm/src/SqliteClient.ts",
          "patch": "@@ -343,6 +343,9 @@ export const make = (\n         }\n       }\n       port.addEventListener(\"message\", onMessage)\n+      if (\"start\" in port) {\n+        port.start()\n+      }\n \n       function onError(cause: Event) {\n         const exit = Exit.fail(\n@@ -362,7 +365,7 @@ export const make = (\n       yield* Scope.addFinalizer(\n         scope,\n         Effect.sync(() => {\n-          worker.removeEventListener(\"message\", onMessage)\n+          port.removeEventListener(\"message\", onMessage)\n           worker.removeEventListener(\"error\", onError)\n         })\n       )",
          "additions": 4,
          "deletions": 1
        }
      ]
    }
  ]
}