Skip to content

Sync/upstream 20260827 215608 - #8455

Closed
theoneand33 wants to merge 23 commits into
pingdotgg:mainfrom
theoneand33:sync/upstream-20260827-215608
Closed

theoneand33 wants to merge 23 commits into
pingdotgg:mainfrom
theoneand33:sync/upstream-20260827-215608

Conversation

@theoneand33

@theoneand33 theoneand33 commented Aug 27, 2026 •

Copy link
Copy Markdown

What Changed

Synced changes from upstream

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Cursor Bugbot is generating a summary for commit c69d3b8. Configure here.

Note

Add Pi provider driver and overhaul CI/release workflows to GitHub-hosted runners

  • Introduces a full Pi provider driver: PiDriver, PiAdapter (RPC subprocess session management), PiProvider (snapshot/probe), PiSkills (skill discovery), PiTextGeneration, and PiSettings schema in contracts. Registered in BUILT_IN_DRIVERS and disabled by default.
  • Overhauls CI and release workflows: replaces all blacksmith runners with ubuntu-24.04/macos-15/windows-2025; adds opencode-review and sync-upstream workflows; removes relay public config propagation, publish_cli, publish_aur, deploy_web, and announce_discord jobs from release.yml; finalize now depends on [preflight, quality, build].
  • Extracts shared helpers makeWithInstanceIdentity and makeStandardTextGeneration across provider drivers and text-generation factories; converts label and check-status arrays to Set lookups.
  • Fixes SettingsWatcherLive to acquire the subscription synchronously before forking, preventing dropped settings-change events.
  • Fixes ghosttyCellText to use Array.from instead of new Array(count), avoiding sparse-hole iteration.
  • Risk: release.yml no longer publishes CLI, AUR, web app, or Discord announcements — verify these are intentionally removed or handled elsewhere. cli-external-packages.test.ts now requires dependencies/optionalDependencies/peerDependencies to be defined on manifests.
📊 Macroscope summarized c69d3b8. 71 files reviewed, 30 issues evaluated, 13 issues filtered, 15 comments posted

🗂️ Filtered Issues

.github/workflows/release.yml — 4 comments posted, 5 evaluated, 1 filtered
  • line 733: announce_discord was removed with no replacement notification step. Successful stable releases and nightlies now terminate after finalize without posting the previously configured release webhook message, so subscribers are not informed that a release is available. [ Out of scope (post-validation triage) ]
apps/server/src/provider/Drivers/PiDriver.ts — 1 comment posted, 3 evaluated, 2 filtered
  • line 98: PiDriver declares ProviderEventLoggers as a required environment service but never retrieves or passes its native logger when constructing makePiAdapter. Unlike the other built-in drivers, Pi protocol events therefore cannot be written to the shared native event log, leaving Pi sessions absent from the provider diagnostic logs. [ Out of scope (post-validation triage) ]
  • line 107: The per-instance environment is passed into checkPiProviderStatus, which invokes discoverPiSkills, but that function ignores its environment argument and calls NodeOS.homedir() against the server's own process.env. Consequently, a Pi instance configured with a different HOME launches Pi with that home but publishes skills from the server process's home, so its $ picker omits the instance's user skills (or exposes the wrong account's skills). [ Exceeded comment limit ]
apps/server/src/provider/Layers/GrokAdapter.ts — 0 comments posted, 1 evaluated, 1 filtered
  • line 746: interruptedTurnIds grows permanently for watchdog-cancelled turns: settleStalledTurn adds each timed-out turnId, but the stalled-settlement path never deletes it (unlike the normal completion path). A long-lived session that encounters many stalled or manually cancelled turns therefore retains an unbounded set of unique turn IDs, causing a per-session memory leak. [ Out of scope (post-validation triage) ]
apps/server/src/provider/Layers/PiAdapter.ts — 0 comments posted, 8 evaluated, 8 filtered
  • line 134: getThreadSemaphore permanently inserts a semaphore for every thread ID, but neither stopSessionInternal nor stopAll removes the entry. Since conversations create unbounded new thread IDs, threadLocksRef grows for the lifetime of the provider instance even after all sessions have ended. [ Out of scope (post-validation triage) ]
  • line 481: The new Pi session context is created without applying or recording input.modelSelection; the spawned pi --mode rpc command also receives no --model option. Consequently, choosing a custom Pi model when starting a thread always runs Pi's configured default model while the application persists the requested model selection, so chat output and usage are attributed to the wrong model. [ Cross-file consolidated ]
  • line 540: The old child's exit handler unconditionally calls sessions.delete(ctx.threadId). Starting a replacement session for the same thread kills the old child and immediately installs the new context, but the old process's asynchronous exit can then delete that new context. Subsequent operations report the active replacement session as missing, and the emitted exit event is also attributed to its thread. [ Exceeded comment limit ]
  • line 610: sendTurn sets ctx.activeTurnId and changes the session to running before validating that the turn has content or before reading every attachment. An empty turn, invalid attachment path, or attachment read failure returns an error on lines 624–655 without calling markSessionReady, leaving listSessions/subsequent state observers with a phantom running turn although no prompt was submitted. [ Exceeded comment limit ]
  • line 709: The background completion poller stops after 600 successful streaming checks without emitting turn.completed or resetting the session. A Pi turn that remains streaming for more than ten minutes leaves ctx.activeTurnId and ctx.session.status permanently running, so clients never receive completion and later state remains stale. [ Exceeded comment limit ]
  • line 755: interruptTurn clears ctx.activeTurnId and sends Pi's unscoped abort even when the supplied turnId is not the currently active turn. A delayed cancel request for an earlier turn therefore aborts a newer turn, while emitting a cancellation event for the stale ID. The adapter must ignore a provided ID that differs from the active turn. [ Exceeded comment limit ]
  • line 786: respondToRequest ignores the returned RPC result's success flag and always emits request.resolved; respondToUserInput has the same behavior. If Pi rejects an extension_ui_response (for example, for an expired request), the server reports it as resolved even though the provider did not receive the decision, leaving the interactive operation blocked or in a different state. [ Exceeded comment limit ]
  • line 850: readThread never checks the RPC response's success flag. When Pi replies to get_messages with { success: false, error: ... }, this code treats missing data.messages as [] and returns a seemingly valid empty thread snapshot, silently hiding the provider failure from the caller. [ Exceeded comment limit ]
apps/server/src/textGeneration/makeStandardTextGeneration.ts — 0 comments posted, 1 evaluated, 1 filtered
  • line 28: RunJson accepts and forwards modelSelection, but the Pi implementation discards it (modelSelection: _modelSelection) and never adds its model to the CLI arguments. Thus selecting any configured custom Pi model for commit/PR/title generation still runs Pi's default model, even though Pi supports --model; the generated result is silently produced by a different model than the one selected. [ Cross-file consolidated ]

theoneand33 and others added 22 commits August 26, 2026 09:45
- PiDriver: make health check use live settings via snapshotSettings.getSettings
- PiProvider: include configured binaryPath in probe error messages
- PiTextGeneration: remove provider field from TextGenerationError, add --no-tools/--no-extensions and filter launchArgs
- PiAdapter: fix Deferred error typing, map to CanonicalItemType, use RuntimeRequestId and acp.pi.extension source, replace for-await in Effect.gen with Effect.promise loop, mark session stopped on exit with makeEventStamp, deduplicate session-ready logic, guard poller by owned turn, propagate RPC failures for request/user-input, and make rollbackThread explicit
- Extract withInstanceIdentity 6× copy into providerIdentity.ts:makeWithInstanceIdentity(driver)
  All drivers (Codex, Claude, Cursor, Grok, OpenCode, Pi) now share one factory

- Extract textGeneration 4× method boilerplate (buildPrompt -> runJson -> sanitize) into makeStandardTextGeneration.ts
  Pi, Grok, Cursor now use the shared helper; Codex/Claude/OpenCode can follow the same pattern next

- PiTextGeneration: drop TokenBucket rate-limit (no other provider does it; server queues), simplify 3-stage JSON salvage to single extractJsonObject, adopt standard prompts/schemas so Pi is uniform with others

Verified via static import check; ponytail net -457 lines in this pass, -680 total when Codex/Claude/OpenCode adopt helper.
feat(provider): add Pi coding agent integration
- Migrate all workflows from blacksmith-* to ubuntu-24.04, macos-15, and windows-2025
- remove relay_public_config job and relay tracing artifact handling
- remove T3CODE relay/Clerk env wiring from build and publish jobs
- remove deploy_web job and simplify finalize dependencies
- Remove publish_cli, publish_aur and announce_discord jobs and decouple release from CLI publishing
- Fix ProviderInstanceRegistryHydration race by subscribing before forking
- Allow inline WASM assets in web Vite config
- replace array `includes` with `Set.has` for labels, statuses, and activity ids
- remove unused imports/vars and fix formatting in Pi adapter/driver
- add oxlint disables for intentional spread and array-index-key usage
- Update PiAdapter payloads to canonical shapes (streamKind/itemType/toolName/summary/requestType)
- Migrate Effect.async to Effect.callback and tighten ProviderAdapterError typing
- Fix Pi text generation timeout handling via timeoutOption and improve error mapping
- increase timeout-minutes from 10 to 20 to prevent premature cancellation
# Conflicts:
#	.github/workflows/release.yml
- Scan global (~/.pi/agent/skills, ~/.agents/skills) and project (.pi/skills, .agents/skills ancestors plus .claude/skills) roots
- Parse SKILL.md frontmatter for name/description with project-over-user precedence
- Include skills in Pi provider snapshot and wire FileSystem/Path/cwd through driver
- traverse each configured skill root recursively to discover nested SKILL.md files (e.g. collection/skills/example/SKILL.md) while preserving frontmatter parsing
- make buildInitialPiProviderSnapshot accept cwd and pass serverConfig.cwd from PiDriver instead of process.cwd()
Update both opencode GitHub actions (opencode-review and sync-upstream)
to use openrouter/z-ai/glm-5.3-flash with OPENROUTER_API_KEY per
https://opencode.ai/docs/github.
@coderabbitai

coderabbitai Bot commented Aug 27, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 15ac0840-d4f2-4f5b-a7d3-c3c56d8bc2f5

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Aug 27, 2026

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the new/changed Effect service code in this sync (Pi driver/adapter/provider/text generation, Grok skills, shared providerIdentity, makeStandardTextGeneration).

Most of the new code follows the conventions (subpath namespace imports, Effect.fn constructors, environment-acquired FileSystem/Path/Crypto/ChildProcessSpawner, structured errors mirroring the existing provider patterns). Two dependency-acquisition / runtime-boundary violations in apps/server/src/provider/Layers/PiAdapter.ts need attention:

  • the Pi process is spawned via a dynamic node:child_process import instead of the ChildProcessSpawner service, hiding an imperative runtime dependency from the service environment;
  • node stdio/exit callbacks execute Effects with bare Effect.runSync/Effect.runPromise inside the service constructor, detaching them from the adapter runtime (contrast ClaudeAdapter, which bridges its SDK callbacks with Effect.runPromiseWith(runtimeContext)).

No other findings; error shapes such as detail: cause.message / stderr-derived detail match established patterns in CodexTextGeneration/ClaudeTextGeneration and are out of scope for this check.

Posted via Macroscope — Effect Service Conventions

Comment on lines +450 to +452
const nodeChild: NodeChildProcess.ChildProcess = yield* Effect.tryPromise({
try: async () => {
const { spawn } = await import("node:child_process");

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

makePiAdapter spawns Pi through a dynamic node:child_process import rather than acquiring the spawner from the Effect environment, so this imperative dependency never appears in the service's requirements and cannot be substituted by a test layer. Consider const spawner = yield* ChildProcessSpawner.ChildProcessSpawner plus ChildProcess.make(...) — the same acquisition CodexAdapter, GrokAdapter, GrokSkills, and PiProvider already use — and drive stdin/stdout through the returned handle's Sink/Stream.

Posted via Macroscope — Effect Service Conventions

Comment on lines +493 to +500
stderr.on("data", (chunk: Buffer) => {
Effect.runSync(
Effect.logWarning("Pi stderr", {
threadId: input.threadId,
chunk: chunk.toString().slice(0, 500),
}),
);
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These node callbacks run Effects with bare Effect.runSync/Effect.runPromise inside the service constructor (also lines 522-527, 542, and 554), which starts a fresh runtime per event and drops the adapter's context, logging/tracing configuration, interruption, and error propagation into the session scope. Consider offering raw stdio lines and the exit result into a Queue from the callback and consuming them in a fiber forked into scope; if a callback bridge is truly required, capture the ambient context once and use Effect.runPromiseWith(context) as ClaudeAdapter does.

Posted via Macroscope — Effect Service Conventions


const homedir = NodeOS.homedir();

// Global roots — always scanned.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium Drivers/PiSkills.ts:81

discoverPiSkills omits skills configured through Pi's settings.skills, package skills/ directories, and pi.skills package entries, so those skills are loaded by Pi but never appear in T3 Code's $ picker. The roots list only contains the two default global roots and ancestor-based project roots; include the configured and package-provided skill roots when building it.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/provider/Drivers/PiSkills.ts around line 81:

`discoverPiSkills` omits skills configured through Pi's `settings.skills`, package `skills/` directories, and `pi.skills` package entries, so those skills are loaded by Pi but never appear in T3 Code's `$` picker. The `roots` list only contains the two default global roots and ancestor-based project roots; include the configured and package-provided skill roots when building it.

Comment on lines +95 to +105
// Also include cwd's .claude/skills for shared skill reuse? Pi docs say
// users can add ~/.claude/skills via settings.skills, but discovery for
// `$` picker should surface project-local .claude/skills when present,
// mirroring Claude's behavior for cross-harness reuse.
const crossHarnessProjectRoots: ReadonlyArray<{ directory: string; scope: PiSkillScope }> = cwd
? [{ directory: path.join(cwd, ".claude", "skills"), scope: "project" as const }]
: [];

// Order: global first, then project ancestors (cwd first, then parents outward).
// Later entries win on name collision, so project overrides user.
const roots = [...globalRoots, ...projectRoots, ...crossHarnessProjectRoots];

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium Drivers/PiSkills.ts:95

The $ picker exposes skills from <cwd>/.claude/skills as enabled even though the spawned Pi process does not load them unless they are explicitly configured in Pi's settings.skills, so selecting one exposes a skill that Pi cannot use. Remove this unconditional cross-harness root (or gate it on the corresponding Pi setting).

-  // Also include cwd's .claude/skills for shared skill reuse? Pi docs say
-  // users can add ~/.claude/skills via settings.skills, but discovery for
-  // `$` picker should surface project-local .claude/skills when present,
-  // mirroring Claude's behavior for cross-harness reuse.
-  const crossHarnessProjectRoots: ReadonlyArray<{ directory: string; scope: PiSkillScope }> = cwd
-    ? [{ directory: path.join(cwd, ".claude", "skills"), scope: "project" as const }]
-    : [];
-
   // Order: global first, then project ancestors (cwd first, then parents outward).
   // Later entries win on name collision, so project overrides user.
-  const roots = [...globalRoots, ...projectRoots, ...crossHarnessProjectRoots];
+  const roots = [...globalRoots, ...projectRoots];
🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/provider/Drivers/PiSkills.ts around lines 95-105:

The `$` picker exposes skills from `<cwd>/.claude/skills` as enabled even though the spawned Pi process does not load them unless they are explicitly configured in Pi's `settings.skills`, so selecting one exposes a skill that Pi cannot use. Remove this unconditional cross-harness root (or gate it on the corresponding Pi setting).

.readDirectory(current)
.pipe(Effect.orElseSucceed((): ReadonlyArray<string> => []));
for (const entry of [...entries].sort()) {
const fullPath = path.join(current, entry);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium Drivers/PiSkills.ts:122

The picker omits valid Markdown skills that are not named SKILL.md, including root .md files under ~/.pi/agent/skills and .pi/skills and nested .md files under .agents/skills and ~/.agents/skills. The traversal only probes <entry>/SKILL.md and treats every entry as a directory, so these files are never added to skillPaths; inspect .md entries as skill files and recurse only into directories.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/provider/Drivers/PiSkills.ts around line 122:

The picker omits valid Markdown skills that are not named `SKILL.md`, including root `.md` files under `~/.pi/agent/skills` and `.pi/skills` and nested `.md` files under `.agents/skills` and `~/.agents/skills`. The traversal only probes `<entry>/SKILL.md` and treats every entry as a directory, so these files are never added to `skillPaths`; inspect `.md` entries as skill files and recurse only into directories.

actions: read
steps:
- name: Checkout repository
uses: actions/checkout@v6

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 High workflows/opencode-review.yml:18

Both third-party actions execute from mutable references (actions/checkout@v6 and anomalyco/opencode/github@latest), so a retagged or compromised release runs with OPENROUTER_API_KEY and write-capable repository permissions and can exfiltrate the key or modify the repository. Pin both actions to reviewed immutable commit SHAs.

🤖 Copy this AI Prompt to have your agent fix this:
In file @.github/workflows/opencode-review.yml around line 18:

Both third-party actions execute from mutable references (`actions/checkout@v6` and `anomalyco/opencode/github@latest`), so a retagged or compromised release runs with `OPENROUTER_API_KEY` and write-capable repository permissions and can exfiltrate the key or modify the repository. Pin both actions to reviewed immutable commit SHAs.

Effect.orElseSucceed((): ReadonlyArray<string> | undefined => undefined),
);
if (subEntries !== undefined) {
stack.push(fullPath);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium Drivers/PiSkills.ts:135

A directory containing SKILL.md is still recursed into, so nested SKILL.md files under that skill's assets or references are advertised as separate invocable skills. Add a guard so directories already identified as skill roots are not pushed onto stack.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/provider/Drivers/PiSkills.ts around line 135:

A directory containing `SKILL.md` is still recursed into, so nested `SKILL.md` files under that skill's assets or references are advertised as separate invocable skills. Add a guard so directories already identified as skill roots are not pushed onto `stack`.

if (!name) {
continue;
}
// Skip if already set by a later (higher priority) root? Actually we

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium Drivers/PiSkills.ts:156

A same-named skill in a parent directory overwrites the nearer skill from cwd, so /repo/.pi/skills/foo is replaced by /.pi/skills/foo and the nearest-project precedence is reversed. Because projectRoots lists ancestors from cwd outward but this loop always calls skillsByName.set, retain an existing project-scoped skill instead of overwriting it.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/provider/Drivers/PiSkills.ts around line 156:

A same-named skill in a parent directory overwrites the nearer skill from `cwd`, so `/repo/.pi/skills/foo` is replaced by `/.pi/skills/foo` and the nearest-project precedence is reversed. Because `projectRoots` lists ancestors from `cwd` outward but this loop always calls `skillsByName.set`, retain an existing project-scoped skill instead of overwriting it.

env: processEnv,
});

const adapter = yield* makePiAdapter(effectiveConfig, {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 High Drivers/PiDriver.ts:98

With a missing or non-executable binaryPath, startSession reports a ready session and leaves hasSession true even though no child process is running; subsequent turns then fail. The adapter's error listener only resumes its fork and never marks or removes the session. Handle the spawn error by failing startup and cleaning up the session context.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/provider/Drivers/PiDriver.ts around line 98:

With a missing or non-executable `binaryPath`, `startSession` reports a ready session and leaves `hasSession` true even though no child process is running; subsequent turns then fail. The adapter's `error` listener only resumes its fork and never marks or removes the session. Handle the spawn error by failing startup and cleaning up the session context.

continue;
}
const frontmatter = parseSkillFrontmatter(contents);
if (frontmatter.kind === "malformed") {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium Drivers/PiSkills.ts:148

discoverPiSkills advertises skills that the Pi CLI does not load when SKILL.md has no non-empty description or has no frontmatter, so those entries appear selectable but are unavailable. Require parsed frontmatter with a description before registering the skill.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/server/src/provider/Drivers/PiSkills.ts around line 148:

`discoverPiSkills` advertises skills that the Pi CLI does not load when `SKILL.md` has no non-empty `description` or has no frontmatter, so those entries appear selectable but are unavailable. Require parsed frontmatter with a description before registering the skill.

id-token: write

env:
UPSTREAM_REPOSITORY: pingdotgg/t3code

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium workflows/sync-upstream.yml:22

This workflow never synchronizes a distinct upstream: UPSTREAM_REPOSITORY points to the same repository as origin, so upstream/main is the checked-out main history and git merge-base --is-ancestor upstream/main HEAD causes every run to set needed=false. Set UPSTREAM_REPOSITORY to the intended upstream repository.

🤖 Copy this AI Prompt to have your agent fix this:
In file @.github/workflows/sync-upstream.yml around line 22:

This workflow never synchronizes a distinct upstream: `UPSTREAM_REPOSITORY` points to the same repository as `origin`, so `upstream/main` is the checked-out `main` history and `git merge-base --is-ancestor upstream/main HEAD` causes every run to set `needed=false`. Set `UPSTREAM_REPOSITORY` to the intended upstream repository.

- name: Publish CLI package
run: node apps/server/scripts/cli.ts publish --tag "${{ needs.preflight.outputs.cli_dist_tag }}" --app-version "${{ needs.preflight.outputs.version }}" --verbose

release:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium workflows/release.yml:618

After a GitHub release, no job invokes .github/workflows/publish-aur.yml, so new release tags never update the AUR package and Linux users installing through AUR receive an indefinitely stale version. Restore the publish_aur reusable-workflow job or otherwise trigger that workflow after release succeeds.

🤖 Copy this AI Prompt to have your agent fix this:
In file @.github/workflows/release.yml around line 618:

After a GitHub release, no job invokes `.github/workflows/publish-aur.yml`, so new release tags never update the AUR package and Linux users installing through AUR receive an indefinitely stale version. Restore the `publish_aur` reusable-workflow job or otherwise trigger that workflow after `release` succeeds.

@macroscopeapp macroscopeapp Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the new Pi service modules (PiDriver.ts, PiAdapter.ts, PiProvider.ts, PiSkills.ts, PiTextGeneration.ts, providerIdentity.ts, makeStandardTextGeneration.ts) plus the touched registry/hydration code.

Service definition, layering, and namespace-import conventions look correct, and the makeWithInstanceIdentity / makeStandardTextGeneration extractions are clean. Two convention issues in PiAdapter.ts / PiTextGeneration.ts:

  • Nested Effect.runSync / Effect.runPromise inside the makePiAdapter service constructor for stdout/stderr/exit handling, instead of ChildProcessSpawner + Stream (as CodexSessionRuntime/opencodeRuntime do) or a context-aware runner captured at the callback boundary (as ClaudeAdapter does).
  • Error detail fields populated from cause.message / String(cause), so the structural attribute and the resulting message just restate the underlying failure. Sibling providers keep detail a stable description and preserve the original error in cause.

Posted via Macroscope — Effect Service Conventions

new ProviderAdapterRequestError({
provider: PROVIDER,
method: "readThread",
detail: cause.message,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

detail here just copies the underlying error's message, so the wrapper adds no stable structural context (and ProviderAdapterRequestError.message is derived from it). A fixed description plus cause preserves both. Same at line 637.

Suggested change
detail: cause.message,
detail: "Failed to read Pi thread messages.",

Posted via Macroscope — Effect Service Conventions

(cause: unknown) =>
new TextGenerationError({
operation,
detail: (cause as { message?: string })?.message ?? String(cause),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

detail is populated from cause.message/String(cause), so the TextGenerationError message merely restates the underlying failure and the structured field carries no stable operation context. GrokTextGeneration/ClaudeTextGeneration keep detail a fixed description and leave the underlying error in cause. Same pattern at lines 85, 106, and 137.

Suggested change
detail: (cause as { message?: string })?.message ?? String(cause),
detail: "Failed to resolve the Pi binary for text generation.",

Posted via Macroscope — Effect Service Conventions

Comment on lines +491 to +533
const stderr = nodeChild.stderr as NodeJS.ReadableStream | null | undefined;
if (stderr) {
stderr.on("data", (chunk: Buffer) => {
Effect.runSync(
Effect.logWarning("Pi stderr", {
threadId: input.threadId,
chunk: chunk.toString().slice(0, 500),
}),
);
});
}

const stdout = nodeChild.stdout as NodeJS.ReadableStream | null | undefined;
if (stdout) {
const stdoutEffect = Effect.promise(async () => {
let buffer = "";
for await (const chunk of stdout as unknown as AsyncIterable<Buffer | string>) {
const text =
typeof chunk === "string" ? chunk : (chunk as Buffer).toString("utf-8");
buffer += text;
let nl: number;
while ((nl = buffer.indexOf("\n")) !== -1) {
let line = buffer.slice(0, nl);
buffer = buffer.slice(nl + 1);
if (line.endsWith("\r")) line = line.slice(0, -1);
if (!line.trim()) continue;
let parsed: unknown;
try {
// @effect-diagnostics-next-line preferSchemaOverJson:off -- ad-hoc RPC line protocol
parsed = JSON.parse(line);
} catch {
await Effect.runPromise(
Effect.logWarning("Pi RPC parse error", { line: line.slice(0, 500) }),
);
continue;
}
await Effect.runPromise(handlePiEvent(ctx, parsed));
}
}
}).pipe(
Effect.catchCause((cause) => Effect.logWarning("Pi stdout loop failed", { cause })),
);
yield* stdoutEffect.pipe(Effect.forkIn(scope));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

makePiAdapter runs nested runtimes inside the service: Effect.runSync for the stderr log (494) and await Effect.runPromise(...) per parsed RPC line (522, 527). Bare run* discards the surrounding context (logger/tracer annotations, FileSystem, ServerConfig, Crypto) and detaches interruption, and run* should stay at application boundaries rather than inside a service constructor.

Consider spawning through ChildProcessSpawner.ChildProcessSpawner (already acquired by PiProvider/PiTextGeneration) and consuming child.stdout/child.stderr as Streams — Stream.decodeText() → Stream.runForEach(...) with a Ref holding the partial line — each forked with Effect.forkIn(scope), matching CodexSessionRuntime and opencodeRuntime. If raw Node stdio really is required here, capture the context once (const runPromise = Effect.runPromiseWith(yield* Effect.context<never>())) like ClaudeAdapter and use that only at the callback boundary.

Posted via Macroscope — Effect Service Conventions

Comment on lines +536 to +572
yield* Effect.callback<void, never>(
(resume: (effect: Effect.Effect<void, never>) => void) => {
const onExit = (code: number | null, signal: string | null) => {
ctx.stopped = true;
sessions.delete(ctx.threadId);
for (const deferred of ctx.pendingCommands.values()) {
Effect.runSync(
Deferred.fail(
deferred,
new ProviderAdapterRequestError({
provider: PROVIDER,
method: "session",
detail: `Pi process exited with code ${code} signal ${signal}`,
}),
).pipe(Effect.ignore),
);
}
ctx.pendingCommands.clear();
Effect.runPromise(
Effect.gen(function* () {
yield* offerRuntimeEvent({
type: "session.exited",
...(yield* makeEventStamp()),
provider: PROVIDER,
threadId: ctx.threadId,
payload: {
exitKind: code === 0 ? "graceful" : "error",
reason: `exit code ${code} signal ${signal}`,
},
});
}),
).finally(() => resume(Effect.void));
};
nodeChild.on("exit", onExit);
nodeChild.on("error", () => resume(Effect.void));
},
).pipe(Effect.forkIn(scope));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same runtime-boundary issue in the exit handler: Effect.runSync (542) and Effect.runPromise (554) run new runtimes from inside the adapter. Suggest failing the pending deferreds and publishing session.exited via a runner derived from Effect.context<never>() (Effect.runForkWith/Effect.runPromiseWith), or modelling exit as child.exitCode on an Effect child process forked into scope, so annotations and interruption survive.

Posted via Macroscope — Effect Service Conventions

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 4 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Want fixes drafted automatically? Bugbot Autofix can create code changes for findings. A team admin can enable Autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 8fc1c65. Configure here.

}
}
}),
).pipe(Effect.ignore);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pi turns can hang indefinitely

High Severity

The turn-completion poller is started with Effect.forkScoped and then ignored, instead of Effect.forkIn(ctx.scope) like the stdout and exit fibers. A missing Scope or a short-lived caller scope drops the poller with no turn.completed. Even when it runs, the 600-attempt loop can exit without emitting turn.completed, so the thread stays running.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 8fc1c65. Configure here.

operation: "sendTurn",
issue: "Turn requires non-empty text or attachments.",
});
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Failed sendTurn leaves session running

High Severity

sendTurn sets ctx.session to running and assigns activeTurnId before attachment and empty-input checks. Those failures return without markSessionReady or a turn.completed event, so the session stays running and later turns or settle logic cannot proceed.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 8fc1c65. Configure here.

nodeChild.on("exit", onExit);
nodeChild.on("error", () => resume(Effect.void));
},
).pipe(Effect.forkIn(scope));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pi spawn failure leaves zombie session

High Severity

Node spawn reports a missing or failed binary on the error event, but that handler only resumes the watcher fiber. The session is still published as ready. Process exit and stopSessionInternal also omit turn.completed for an in-flight turn, and both can emit session.exited, so threads can stay running or tear down twice.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 8fc1c65. Configure here.

decision: "accept" as const,
label: String(o),
}))
: [];

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pi approval options all accept

Medium Severity

Every string in an extension_ui_request options list is mapped to decision: "accept". Choosing Deny or any non-allow label still resolves as accept, so respondToRequest sends Allow to Pi.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 8fc1c65. Configure here.

@macroscopeapp

macroscopeapp Bot commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This change combines a substantial new Pi provider runtime with privileged AI workflows and major release-pipeline changes, including removal of CLI, hosted web, AUR, and production configuration paths. The scope and production/security blast radius are too broad for automatic approval.

Not approved because:

  • 15 blocking correctness issues found at or above your repo's Minimum Blocking Severity

Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more.

patroza pushed a commit to patroza/t3code that referenced this pull request Oct 14, 2026
e17ecdbe90 Version Packages (#8993)
ab04ad0622 fix(sql-pg): invalidate released pins so they cannot reach the next borrower (#9089)
ab90be98ea feat: GraphQL client and generator (#8979)
1bfd8fddeb fix(Schema): merge colliding bounds in JSON Schema export instead of emitting allOf (#9081)
711719d28d Bound import-time stack detection probes (#9083)
6c824e0e34 Stage npm releases and promote latest once every package is visible (#9073)
e571748085 Relax timeout for compiler-backed api-diff snapshot tests (#9079)
e8751695bf Revert "Expand Crypto with hashing, encryption, signing, and key management" (#9077)
09738f4aa6 Honor Retry-After in HttpClient.retryTransient (#9053)
de38e53651 Allow OpenAI find_in_page web search actions without a URL (#9075)
984b4abfb2 Regenerate the OpenAI client from the canonical OpenAI spec (#9067)
f41a60f59b Wait for PostgreSQL containers to stop before removal (#9074)
797696a2b7 Merge outer headers into a raw Response with immutable headers in HttpServerResponse.toWeb (#9062)
211ea2efec fix(sqlite-node): support node:sqlite without enableLoadExtension (#9070)
892d14d88b perf(Sse): stop re-copying long lines split across chunks (#9065)
fdcb47e643 Fix Sharding storage-loop initialization order (#9069)
077c55770d Preserve HTTP server spans during runtime shutdown (#9066)
83df573a79 Refresh migration guidance for terminal, OpenAI and Workers defaults (#9071)
7547a99f81 Bound sparse bracket-path array indices in SchemaGetter.makeTreeRecord (#9030)
8aee3b9caa perf(ai-openai-compat): reuse prepared tool parameter codecs (#9054)
b7c1ac6837 Fix streamed prompt ordering and preserve partial assistant text (#9056)
8ae4d04359 Isolate Sharding reset claim-expiry regression from concurrent tests (#9057)
0d92a92ab2 Expand Crypto with hashing, encryption, signing, and key management (#8749)
fc349a13f7 Fix Sink.takeUntil dropping the input after the match (#9049)
a59b9711af Read Retry-After HTTP dates as dates in withRateLimiter (#9052)
a0a26b789c Fix DateTime.add treating hours and minutes as wall-clock time across DST (#9048)
390bc98756 Fix StructWithRest primitive-encoded base constraint (#9020)
cea74c92ac Persist cluster sends before local shard lock acquisition (#9046)
8f1ea52f0c Fix grouped RequestResolver batch key retention (#9041)
fccf660d83 Add request-scoped MCP HTTP layer (#9031)
e1c6053c5e Release aborted web handler requests and streamed bodies (#9037)
7440cf0884 Document Cloudflare Workers shared-fiber limitations (#9033)
4a999a34e8 Clean up Anthropic documentation imports and omitted binding (#9029)
eebdf25f99 Batch SQLite Node Resolver fixture inserts (#9028)
5d88d8761d Update repository dependencies (#9027)
689fec6543 Avoid busy polling in Sharding claim-expiry tests (#9022)
22e7129023 Expose Scalar preferred authentication security scheme configuration (#9019)
78e4c435ed Fix Multipart.toPersisted failing on dot and long multi-byte file names (#9013)
5726c655af fix(platform-node): skip taskkill for exited children (#9015)
8b097ac4ba Stabilize cross-queue deduplication delivery assertion (#9021)
95a3ab78e9 Fix Node HTTP text keeping a UTF-8 BOM that breaks json (#9014)
52c91f0080 Keep MSSQL error listener after connection cleanup (#9018)
844a77b18c Fix assistant replay with legacy OpenAI compat config (#9011)
cf5179b488 Wake suspended workflow callers when their workflow completes (#9007)
42aceb966a Replay assistant reasoning alongside tool calls in openai-compat (#9005)
cc843ea091 Return invalid and undeclared AI tool calls when tool call validation is deferred (#9008)
c93485e365 Support servername in client TLS socket upgrades (#9010)
93146666ec perf(Context): optimize pick for zero or one service (#8998)
251f849155 Fix unhandled errors after child process input interruption (#9004)
f8379667c9 Release losing DurableDeferred.raceAll waits when the race settles (#8997)
35ec46efd0 Remove fork approval gate from release queue (#8996)
37e088f2af Use decoded response aliases and canonical finite schemas in code generation (#8990)
118deefe7c Add Host.toFullyQualified, Host.toRelative, and Host.parseHostsFile (#8992)
fde67a10e9 Add NetAddress.loopbackAddresses (#8991)
967a7dc596 Version Packages (#8887)
4fcdede9a4 Clarify native Array.fromAsync in Stream examples (#8989)
84f48df586 Omit cumulative min/max from delta histogram points in OtlpMetrics (#8987)
1d3419e76c Fix histogram export dropping or duplicating the overflow bucket (#8986)
b4e5af825a fix(effect): handle synchronous re-entrancy in Effect.cached* (#8977)
b8d6e7a89b cli: export the terminal display-width measure as CliOutput.displayWidth (#8982)
43bb382f68 fix(ai-openai): default unrecognized models to reasoning and preserve explicit includes (#8980)
b630acdb8c Revert "Add an explicit maxDepth option to Context.makeUnsafe (#8969)"
0b17b9e2e4 Support WebSocket handshake headers alongside subprotocols (#8978)
f9f7a5a16e feat(rpc): report socket ping timeouts through an onPingTimeout option (#8976)
4b1f4aa8ad Add an explicit maxDepth option to Context.makeUnsafe (#8969)
1db5671d77 fix(ai-anthropic): decode replies a fallback model took over (#8971)
76a03f7599 Fix Duration.times throwing for non-integer multipliers of nanosecond durations (#8972)
e052f1b30b Avoid copying the Context rebase map twice (#8968)
f7c4317345 Test DateTime.toDate wall-clock conversion for zoned values (#8975)
9dbd07e006 Accept address and name server inputs in the Dns services (#8973)
e7d84e449a Add fromInput functions to the net data types (#8970)
66257d2922 Hand cluster shards off one at a time on shutdown (#8941)
f54c34a754 Restore lease-based SQL shard lock renewal (#8965)
bfc5742e18 Record RPC response-encoding failures on the server span (#8958)
aef1d1f2e5 Add cluster RPC interrupt-on-termination annotation (#8963)
210fd06398 Keep shard locks held while their runner shuts down (#8961)
cd2ab19600 Route shard handoff interrupts to the draining owner and wait for shard locks (#8940)
73fa2873cb Fix safe integer bounds in JSON Schema export (#8956)
ae63afed95 Reclaim row shard locks whose holder is no longer a registered runner (#8942)
ec8ccb92a4 Document Schema class field overrides (#8960)
aa811e454b Failing test: RPC success encode failures are not logged with the RPC tag (#8943)
93410da528 Add stderr terminal detection to Stdio (#8938)
310228c2be Allow scheduler 0.28 in atom-react peers (#8954)
b63a4f9ac7 Fix ai-openai-compat splitting streamed reasoning on empty content deltas (#8952)
7ba976c620 Fix interrupted activity replay in memory workflow engine (#8955)
d4f7dc3300 Add TLSA records to DNS services (#8953)
a9b5148225 Add DNS resolution to effect/net (#8880)
7ff5048db5 Skip continuation-mark probing when stack traces are disabled (#8937)
63bfad88fc Keep durable race and into continuations running beside a parked workflow sibling (#8926)
e00eaae8d9 Fix lazy terminal input acquisition for CLI prompts (#8932)
89d5c88810 Fix NO_COLOR handling in CLI prompts and wizard (#8933)
ebe487f888 Support configurable Crypto UUID output formats (#8935)
8e5ab22a42 Fix Esc cancellation for CLI prompts (#8934)
b210b6be1f Refresh migration guidance for inferred services and telemetry (#8928)
7803e51e94 Hold the shared SQL connection for the whole statement (#8927)
3b934343a0 Start Effect spans with the active OpenTelemetry parent span itself (#8929)
d6d515bafc Honor reported remaining budgets in HttpClient rate limiting (#8917)
0a6f270e21 Allow NodeTerminal fixtures time to start under CI load (#8930)
8598157653 Fix Duration.fromInputUnsafe throwing on infinite nanosecond totals (#8921)
a494a64788 Allow HTTP MCP servers to disable subscriptions (#8924)
ee3a350768 Fix spurious MCP list-change notifications on first subscription (#8925)
950ea4eeb2 Preserve tool call extra_content in ai-openai-compat (#8916)
7e444029d3 fix(http): ignore B3 headers whose ids are not hex (#8913)
0e487c027a Fix Effect spans losing a getter-based OpenTelemetry parent (#8922)
13ace20e6c Update migration bundle size figures (#8911)
c755b69701 Add a deterministic TestCrypto layer (#8487)
788eced019 Keep the test clock advancing through PersistedQueue cleanup completion (#8910)
48ed32f846 Add delay option to PersistedQueue.offer (#8907)
be560ff3ab Fix Bun worker graceful shutdown without self.close (#8909)
59e58a6b98 Add PowerShell support to --completions (#8904)
7c5133c342 disable experimentalApiUsage
b9e7821be3 Add DatagramSocket (UDP) module (#8409)
182e26dae1 Add FileSystem noFollow open option and positional reads (#8900)
738d81f19e Simplify SchemaError serialization (#8903)
0e2b988eec Fix orphaned workflow activity recovery after a crash (#8899)
ca068cef44 Allow cluster SQL storage to run without runtime DDL (#8897)
9753be9ecf Deliver cluster WithTransaction replies after the transaction outcome is known (#8891)
f686000760 Add compact SchemaError JSON and inspect output (#8895)
ea52c245f6 Fix typed SQL transaction COMMIT error recovery (#8892)
d6082a25a3 Send MCP cancellation notifications for interrupted reverse requests (#8890)
977096bcea Persist cluster WithTransaction failure replies after rollback (#8886)
133ceb2b77 Answer cancelled MCP HTTP request POSTs with an empty event stream (#8888)
d418ce011a test(encoding): cover Base64 binary and padding contracts (#8889)
a46592aed9 Preserve query URLs during HTTP router slash normalization (#8885)
cf58cb0362 Fix Zsh completions for flag descriptions containing `]` (#8882)
269a7c8643 Version Packages (#8744)
757821fe99 Fix PostgreSQL cancellation test readiness and cleanup (#8879)
540ecd1a94 Require explicit @stability on every module and importable export (#8770)
1b35732952 Fix Stream.slidingSize dropping elements from the final partial window (#8878)
7a721cee6b Keep `=` inside values when decoding key-value config strings (#8877)
78994c5e0d docs(http-api): fix stale HttpApiBuilder.middlewareSecurity references (#8876)
0aeb7fd6f5 Preserve active OpenTelemetry parents for Effect spans (#8586)
d350f8e7ba Fix HttpApi form and GET payloads rejecting single-value arrays (#8858)
f6af4b6d24 expose more of the atom registry apis (#8875)
00f1cc783f fix(sql): follow OpenTelemetry database semantic conventions in SQL spans (#8866)
146e86a689 fix(http): align HTTP tracing with OpenTelemetry semantic conventions (#8873)
f5716ad55d fix(observability): align OTLP exporter, resource and logger with the OpenTelemetry spec (#8868)
a0e1b871b4 fix(tracing): leave interrupted spans Unset and drop synthetic stack frames (#8864)
26c108919f fix(ai): follow the OpenTelemetry GenAI semantic conventions (#8870)
c6086ee5a2 fix(rpc): set span kind and rpc.* attributes per OpenTelemetry RPC conventions (#8867)
26931d0fee fix(observability): export OTLP Summary metrics and UCUM units (#8869)
763b445f55 Fix SQL event-log notifications before transaction commit (#8855)
7ccfeb3569 fix(sql-pg): report a stale plan inside a transaction instead of retrying it (#8861)
d4f4bc8b83 Fix Stream.groupBy and partition hanging when a substream stops early (#8857)
2131d44bd1 fix(sql-pg): release connection listeners and retirement hooks on scope closure (#8854)
ec540703a5 Update repository dependencies (#8740)
7d8d4979c6 Fix logged status after successful WebSocket upgrades (#8852)
48a373b2b4 Fix NodeHttpServer keep-alive requests during graceful shutdown (#8846)
bc4d76e44a Add trusted /effect-bot maintainer comment relay (#8853)
6c59de782b Preserve defects and interruption in Arbitrary mixed causes (#8849)
eee0eeb1e4 Fix suspended compiled Struct parser output reuse (#8810)
5630677ff5 fix(ai): preserve MCP toolkit service requirements (#8842)
972c80fb02 Fix SqlEventJournal on PostgreSQL (#8756)
053e3ead5a Keep atom-react server snapshots stable for delayed Suspense hydration (#8841)
22d6f4dcd4 Mark HttpMiddleware.tracer spans as failed for 5xx responses (#8821)
0ac6ac813c Fix RPC request defect serialization for SchemaBinary (#8835)
42763ce0b4 Use the negotiated MCP protocol version when the header is absent (#8775)
7234786687 Fix K8sHttpClient service-account token rotation (#8836)
fb757e3eae Fix Cache.get startup interruption race (#8837)
af114e664b Fix Channel.decodeText options for Node-only declarations (#8838)
bd96be0f1c Fix HttpApi response schema error status and reporting (#8834)
e36abbba72 Fix empty framed RPC HTTP responses (#8833)
375c1b021c Keep the URL hash and drop an empty query in Atom.searchParam (#8820)
46b75b1a7c Fix YAML block scalar trailing line breaks (#8752)
a0cb4c25d8 ai: let decisions carry images (#8832)
7095539c23 Fix TOML multiline strings keeping a leading CRLF (#8753)
45a70ced8c Make Atom.windowFocusSignal work when window is undefined (#8771)
2b3c63c14f Fix HttpClient retaining unread responses without FinalizationRegistry (#8830)
7064da92f2 Fix Channel.runIntoPubSub error type (#8757)
c6f2179d3d Fix interruption while waiting for transactional permits and locks (#8805)
b9d6581931 Fix Config parsing to preserve composite provider causes (#8808)
3ed997b1f4 Fix Channel.merge propagation of side finalizer failures (#8816)
2fbecc82c3 Fix schedule drivers discarding finalizer defects (#8799)
aefe05aea1 Fix Map/Set comparison builders accepting proper subsets as equal (#8814)
82303c1bc8 Fix ManagedRuntime disposal from managed effects (#8783)
88917ebb2e Fix formatJson redaction for getter-returned values with toJSON (#8782)
985860df71 Fix transaction retries discarding cleanup failures (#8780)
76fcd898c5 Fix ScopedCache pending entries after expired finalizer failure (#8803)
c07c144b1a Reproduce: Cron.next returns a past occurrence during the second DST fold hour (#8800)
c419a0edaa Reproduce: PartitionedSemaphore synchronously resumes permit chains until the JavaScript stack overflows (#8789)
99b6b45aff Reproduce: Mutating an empty concatenation result contaminates every array reducer (#8815)
684ccdc20b Fix batched logger shutdown ordering and interrupted output (#8807)
8903b68add Fix child fibers reusing completed transaction journals (#8777)
b79fcb8b62 Fix PubSub surplus publishing after end (#8786)
3cb395e151 Fix ExecutionPlan schedule error and requirement tracking (#8765)
c381fbc045 Fix stack overflow when completing coalesced cached requests (#8804)
f31e6b7fd2 Fix Stream.tapSink completion during an upstream pull (#8793)
b817ebefc0 Fix suspended union parsers reusing state across effect runs (#8809)
7b396bd3b5 Fix mergeAll discarding inner scope finalizer defects (#8798)
8409eb4592 Fix Floyd-Warshall path reconstruction through zero-cost cycles (#8813)
2e03688cdf fix(Stream): preserve sink leftovers when peeling (#8792)
716e358e0e Reproduce: Repeated throwing cause handlers overflow the interpreter stack and bypass finalization (#8778)
a6c7dcb042 Fix one-shot iterable inputs lost on transaction retries (#8806)
87813882fa Fix Channel callback registration failure propagation (#8817)
e4cb9f1f58 Fix inherited Standard Schema adapters bypassing child schemas (#8811)
888a18915c Reject fractional and NaN PubSub capacities (#8790)
f11526aea2 Fix tapSink swallowing sink failures after end-of-stream (#8794)
7e7ede67d8 Fix Queue capacity release after reentrant shutdown (#8785)
33303ea634 Fix Pool shutdown to wait for borrowed resources (#8788)
5326527918 Fix Channel.acquireUseRelease resource leak on acquisition interruption (#8796)
c5cf8ce402 Fix resource lifetime when retrying Layer.buildWithMemoMap (#8781)
d85a3095af Fix Queue.clear swallowing failures combined with Done (#8791)
332d363f07 Fix Sink.make successful pipeline results (#8797)
495740d9d0 Reproduce: zipLatest hangs when one finite input is empty and another emits a value (#8795)
efebfa9cf9 Include completion services in McpServer prompt requirements (#8762)
9b8200da0f Reproduce: PubSub takers can observe the final message before data published during waiter registration (#8787)
18035009c9 Fix interruption masking before scope finalizer callbacks (#8779)
a84aa4e863 Fix FiberHandle ownership during reentrant replacement (#8784)
166437bdb8 Omit cumulative min/max from delta OTLP histogram points (#8769)
98a5ed7603 Fix HttpApiClient result type for union response modes (#8767)
50a5686ab6 Fix effectify error mapper exceptions stranding fibers (#8776)
d0b3862b65 Fix Channel.mapInput data-last overload dropping requirements (#8758)
1ba8521582 Fix Sink.catchCause data-last error type (#8764)
44defad43f Fix HttpServer service serve middleware service requirements (#8759)
467d3aceff Include runtime error in AtomRuntime.subscriptionRef result type (#8760)
a3b4cf3e2b fix(queue): deliver taken values before scheduler yields (#8819)
90a1bae898 Make RPC socket ping timing configurable and count all server frames as liveness (#8825)
1f74b62b6c feat(ai): let McpServer.layerHttp terminate sessions on DELETE (#8773)
fce9c52cab Document typed SQLite setup failures in migration reference (#8822)
bd00773b25 fix(http): read response cookies when Headers has no getSetCookie (#8772)
b1d200c40a Expose tag key on Schema tagged unions, closes #8681 (#8748)
13eb0099aa Fix PostgreSQL binary interval decoding (#8746)
4153144de5 Fix AsyncResult.flatMap data-last type inference (#8742)
460272d304 Version Packages (#8647)
bb3216bba1 change changeset level for clef
f15748273a fix(ai): encode McpSchema.optional fields whose schema decodes to a class (#8723)
92e656c43a fix(vitest): forward the assertion message only when given in deepStrictEqual and notDeepStrictEqual (#8722)
43fdcdc6c8 Fix RPC stdio response draining after stdin EOF (#8714)
0f647153ed fix(platform-node): fail refused websocket upgrades instead of hanging (#8738)
878cb33f4f Fix HTTP logger output for client aborts (#8737)
a81e4e6cb3 Fix PostgreSQL lock ordering for cluster message resets (#8741)
f1aedb0a67 Fix forceKillAfter cleanup after non-zero process leader exit (#8736)
073bb475d1 Support TTL callbacks in Effect.cachedInvalidateWithTTL (#8734)
bc445262ee fix(effect): treat interruption as abandonment in Effect.cached* and Cache (#8719)
e1a521a688 fix(Stream): do not step aggregateWithin schedules while idle (#8718)
234672ba86 fix(sqlite-node): do not cache failed statement preparations (#8716)
f84f41e866 fix(ai-openai): preserve prompt cache diagnostics (#8613)
23047696f9 fix(ai-openrouter): scope transcription JSON encoding to provider spec (#8713)
ed2cc2f322 fix(ai-anthropic): support mid-conversation system messages (#8603)
7336154e2c fix(sqlite-node): return rows from recompiled statements (#8688)
395f256c22 Correct v4 Effect subtyping migration guide (#8712)
e5930bd1f8 Fix SQLite WAL initialization contention and typed setup errors (#8708)
43416c4142 Fix HttpStaticServer If-Range validation (#8705)
81d965eeb1 Fix MSSQL pool recovery and connection error handling (#8709)
1d9fb8c540 Fix Stream.throttle shape strategy exceeding the configured rate (#8698)
a5b1d4e4ca Fix HttpApiSchemaError reporting validation failures (#8706)
f5c2a91621 Fix zoned DateTime when Intl omits fractional seconds (#8707)
d6ac8f923a Fix Stream.scan initial state emission for empty streams (#8704)
5e6f7568a4 Fix HttpTraceContext B3 sampling and zero W3C IDs (#8685)
97ee2bd684 Fix Anthropic streamed tool JSON errors (#8683)
480bba2dfe Add Cloudflare Clef decision provider (#8677)
58a2ee8e0d perf(ai): cache per-tool response schemas (#8680)
f79b23118b Fix NodeSocket re-entrant reader teardown (#8678)
888e326a31 Fix Pool usage TTL to expire idle resources (#8679)
cabf123072 fix(HashRing): make getShards independent of node history (#8675)
6389d9ac64 Fix OpenAPI client inference for possibly undefined response configuration (#8672)
b9188c67ae Fix OpenAPI client includeResponse inference (#8669)
20dcd50605 fix: preserve stateful MCP extension capabilities (#8664)
04706eff5d fix(schema): canonicalize imported JSON Schema pattern sources (#8657)
86c8fb1287 Avoid busy polling in Sharding reset race test (#8665)
157690fcf4 Note NumberFromString's v4 decoding change in migration guidance (#8655)
8615e66073 Point parseJson migration guidance at fromJsonString(Schema.Unknown) (#8654)
cad111867a Avoid cluster workflow replay for self-completed checkpoints (#8662)
1672d9ca8d Fix cluster entity recovery when replayed requests defect during handler rebuild (#8637)
1db93b45ba Run shard lock failover tests sequentially (#8661)
1c18c688df Fix singleton durable RPC cancellation during shard reassignment (#8660)
2ec021eff7 Do not register an entity whose construction finishes after its shard was released (#8659)
0b52bb42fa Release a blocked stream chunk when its RpcClient consumer is interrupted (#8648)
42e5750f7e fix: add keepalive for Mcp http subscriptions (#8653)
962647b6a1 Fix RpcClient protocol errors failing synchronous retries (#8658)
498e72ba14 Resume woken fibers in their own AsyncLocalStorage context (#8629)
1f89b8ec64 fix(ScopedCache): stamp an entry's expiry before completing its lookup (#8618)
18dfb98cf6 Fix lost interruption and typed failure leaks when skipping handlers (#8652)
b5a2d4c1d6 Keep shards acquired during an in-flight lock refresh (#8644)
e823e69377 Isolate RPC stream chunk decoding failures (#8627)
67ba4e46a1 Version Packages (#8577)
8b0eac6ac4 Update readme files (#8634)
2c552f220e Consolidate changesets and fix stability tags (#8633)
735b77b65c Add Effect variants to TestSchema (#8632)
f72790c618 Preserve schema references across contextual projections (#8630)
988c467afa Close server WebSockets according to handler exit (#8598)
5f9c9d17c1 Fix MutableHashMap key retention on equal-key cache refresh (#8625)
ef7d77f382 Make Schema.brand type-only (#8628)
29e0aa7dcc Fix lost failure during concurrent layer interruption (#8585)
0af6d0c8ce Fix encoded RPC interrupt fiberId type for JSON null (#8626)
32559614d9 Stabilize Bun bundle and docgen test timeouts (#8624)
3278821a64 Fix Queue batch taker wake loop on partial offers (#8619)
83429b4202 Fix Effect.race losers left running when the race ends during startup (#8607)
5a81a6f475 Keep newer Atom.family entries when a stale finalizer runs (#8601)
918808cf68 fix .vscode tsdk paths (#8621)
10d8524dc4 Fix Schema projection check preservation (#8617)
927e01e005 Fix branded union type code generation (#8614)
035e369b3a Inline checked sources of Schema JIT transformations (#8597)
aa1947284c Stop Schema unions resolving candidate parsers on every decode (#8555)
35ac25a80b Normalize partition result order across all modules (#8583)
df77fff939 Fix flat RPC client and AtomRpc inference for a union of tags (#8579)
b07406952b Clarify schema branding guidance in v3-to-v4 migration reference (#8590)
878353689f Fail in-flight RPC streams after missed socket pong (#8593)
5250ca63c6 Fix synchronous concurrent Atom.fn results (#8589)
68b639473f Guard workflow replies against stale concurrent resets (#8576)
ee6ffbfde3 Allow MSSQL queue suite more time to acquire its test layer (#8594)
d56bd280ef Wait for suspended workflow finalizer in cluster test (#8592)
cbfc7b4220 Fix Schema brand identifier typing (#8580)
e5f7d12af9 Retry failed cluster workflow run resets (#8575)
ad61db80ef Version Packages (rc) (#8336)
34cc78833d Fix AtomRegistry missed updates through stale nodes and leaked superseded builds (#8543)
e8df3d8e76 Treat infinite PubSub capacity as unbounded (#8540)
fb718d3192 HttpApi: per-slot ParseOptions annotations with ParseOptions fallback (#8572)
aa430d89c1 Fix batch queue takes hanging after termination (#8569)
4113bc78ee fix(sql-pg): Fail transactions that PostgreSQL rolls back at COMMIT (#8558)
ccade1492c Fix atom writes dropped by batch commit listeners (#8556)
b501557939 Report MCP tool failures without an empty message or an invalid-params code (#8552)
d26a913221 Keep RPC servers answering after a malformed client line (#8541)
702c34e2af Stop cluster runners without storage from leaking request ids (#8542)
24f7d32b38 Fix interrupted queue offers after end (#8568)
d68cbd6c8f Retire fatal sql-pg sessions before resuming queries (#8570)
4bb949e64f Authorize identities before unencrypted event-log session binding (#8534)
01e78c60f9 Clarify Semaphore.releaseAll with active permit holders (#8566)
fd9095fb49 Update repository dependencies (#8562)
6bf2eb76f0 Build FindMyWay params without new Function (#8535)
0cf7655d1f fix(openapi): Keep literals and patterns on `asText` bodies (#8551)
64093976e9 Optimize schema construction (#8536)
8d070c3ead Refactor OpenAPI schema representation pipeline (#8547)
8202a6ea41 fix(openapi): Correctly mark Schema's with defaults decoders defined as optional in OpenAPI docs (#8545)
3495bd8858 Preserve Effect.repeat result types with bounded options (#8533)
2a8f5c748d Clean up SQLite transactions after failed commits (#8529)
0786152777 Fix Bun SQLite file URI opening on Linux (#8532)
cf7cfd6144 Fix return-mode toolkit stream encoding error type (#8530)
1f760401be Fix Toolkit handle decoder service requirements (#8531)
9a5a383cc6 Fix ManagedRuntime disposal ordering (#8528)
e36c35c656 Fix JSDoc validation failures (#8524)
16623c7d30 Fix JSON Schema export of built-in checks (#8482)
d470d54495 fix(observability): read OTLP export response bodies (#8522)
0a29ca6840 Discard unclaimed sql-pg background connection failures (#8514)
ccd3440963 fix(http): make HttpRouter entrypoints own their router (#8477)
67ee3b87f0 fix(cluster): order PostgreSQL shard lease locks (#8502)
330b7475e2 Add Schedule.once (#8519)
e54211a57d Restore Error.stackTraceLimit when Cause.prettyErrors throws (#8503)
a9614ff13e Clarify Scope.close interruptibility in API docs (#8515)
af510e8197 Skip LayerMap preloading when idle TTL is zero (#8511)
ff554aeb9b Keep ManagedRuntime disposal uninterruptible (#8512)
4093507c66 Fix zero-TTL cache lookups evicting live entries (#8510)
25d9e47f01 Clarify MCP tool parameter schema errors (#8507)
5e9fd25cbd Report all MCP tool parameter validation errors (#8508)
372a45de59 Fix MCP pings before initialization (#8505)
254fcc1944 Fix CLI lexing of negative number values (#8504)
3788b63bd6 Fix effect/schema test path resolution on macOS (#8494)
19835f2b92 feat(effect): Added `Config.flatMap` (#8334)
18bb92a005 docs: clarify JSON Schema decoding with the canonical codec (#8492)
c2e810cc7a Compile a recursive Schema equivalence once instead of once per value level (#8429)
8d27554650 Stop Schema compilation re-analysing every sub-schema for each enclosing schema (#8451)
2575fcc12b Stop rebuilding the parser wrappers on every SchemaParser.asserts call (#8440)
2cf4e43f02 Add Schema.StringForLiteralAutocomplete (#8366)
c8a9f8543d Simplify Config absence handling (#8488)
99a1b078ff Keep persisted queue retry-delay assertion across SQL backends (#8486)
81a0b3aaae Support Vitest fixtures in Effect tests (#8425)
92e91511e3 fix(ai-anthropic): accept messages without usage.inference_geo (#8478)
a41a4414d3 refactor: add structuredContent policy dependent on protocol (#8468)
0f42b56447 Fix Anthropic gateway 4xx error mapping (#8479)
eb02cbb3f4 fix(reactivity): defer stale-while-revalidate reads (#8421)
6b84149622 Annotate Config.fail return type as Config<never> (#8475)
d6cc5d9870 fix(http): emit buffered multipart parts before pulling input (#8420)
926e8bf4c1 fix(sql-libsql): expose the active transaction service (#8419)
1a3eb9ea60 Fix workflow execution ID collisions from ambiguous hash inputs (#8455)
5521209a76 Stop compiled Schema structs retaining an unused parse traversal (#8435)
f4dd1aec1a Fix Queue takers and offers parking forever after a yield (#8412)
58eef0addc Fix anonymous layers breaking Vitest fixture tests in the same suite (#8422)
bd14b6431a Restrict Scope.closeUnsafe to Closeable scopes (#8474)
1fd49d4e37 Fix MutableList.takeN wedging a Queue so it stops delivering messages (#8448)
c85c8c3178 Fix MCP tool annotation titles in 2025 protocol adapters (#8465)
93f826af79 Stop the Effect run loop building a success Exit between continuations (#8437)
6f44ca0b98 Fix Stream.broadcast subscribers that never end (#8410)
0981d01df8 Fix Queue lost wakeup during taker registration (#8472)
37064fdfc8 Restrict Scope.close to Closeable scopes (#8473)
4f5f866896 Stop forked Scopes registering a finalizer just to leave their parent (#8457)
dd8990bb1b Stop TxPriorityQueue.offerAll re-sorting a queue that is already sorted (#8446)
c00c8ffd48 Fix Stream.forever and Stream.repeat slowing down and leaking per repetition (#8416)
b808b5d0c0 Stop Schema array and tuple decoding running a generator it never needs (#8441)
f05fe36f87 Stop MutableList keeping a slot for every element that ever passed through a list that never empties (#8447)
508c70be13 Honor deferred startup in fiber containers (#8469)
b442528ddf Stop a recursive Schema formatter holding one compiled body per level (#8436)
382992f168 Stop fibers holding memory they no longer need (#8443)
80d5adb167 Fix PubSub losing a message, or publishing one, when a waiter is interrupted (#8449)
c760e1e074 Stop the Schema struct and array traversal allocating a context per item (#8442)
3036241e1e Stop Schema unions rebuilding their candidate list on every decode (#8428)
43bbb257c2 Fix STM transactions that never wake when a TxRef is written (#8452)
83d7c95465 Keep the failure an `onExit` finalizer was cleaning up after when it throws (#8427)
0c6c2dec86 Stop Cause.squash allocating three arrays to read one reason (#8413)
7ef0ce6f42 Fix Context copying every service after eight lookups (#8454)
537cd82174 Stop Effect.gen and Effect.fn allocating on every yield and every call (#8453)
d2f3547561 Stop building a closure chain per Effect.match call (#8439)
0c0aa5ebb0 Stop Effect spans re-resolving the tracer from the context (#8433)
6332de29a8 Stop Stream.concat chains slowing down quadratically with their length (#8445)
0860c0c125 Stop Schema code generation re-proving emittability for every property (#8430)
97afa37ed0 Stop Graph traversals allocating per visit and per relaxation (#8415)
cdec5efd02 Fix DateTime rebuilding the formatter on every call for an aliased time zone (#8414)
ca422fdf49 Fix a scope skipping its remaining finalizers when one throws (#8418)
83b7b1fc91 Fix MutableList.prependAll of no values corrupting the list (#8450)
477394deb6 Stop Schema allocating on every rest-tuple equivalence or formatter call (#8434)
aa7de26631 Fix Stream.mapEffect with concurrency hanging when the function throws (#8411)
c831e82ea6 Document how FileSystem.File cursors differ from POSIX offsets (#8432)
34e09becb6 Fix Unicode semantics in JSON Schema imports (#8459)
35ecbb9864 Fix onExcessProperty "error" rejecting non-enumerable own properties (#8423)
0cbb45792b Store NetAddress IP addresses as numbers instead of Uint8Array (#8407)
32baabcf80 Migrate unstable JSDoc tags to stability annotations (#8406)
98792c3bf8 Fix rounded OpenRouter decision probabilities (#8405)
12f512d0fa feat(sql-clickhouse): support column selection in insertQuery (#8404)
cb85792196 fix(ai-openai): preserve web searches without actions (#8400)
321d74f0f1 Stabilize concurrent Bun docgen example tests (#8401)
21214728d2 Fix PartitionedSemaphore permit loss and competing take race (#8395)
b3032f01f2 Fix four interrupt-time resource leaks in Pool, RcRef, RcMap and ScopedRef (#8390)
cdeccc7e52 Fix Chunk equality being asymmetric on sparse chunks, and stop Chunk copying what it already holds (#8371)
f9179cba72 Fix internal frames leaking into user stack traces, and stop allocating a closure per Effect step (#8386)
db7b69efff Add isNonEmpty predicates to TxHashSet, TxPubSub and TxQueue (#8361)
5709ef6c03 Add guards for HttpBodyError, CookiesError, MultipartError and NdjsonError (#8362)
54ff4f2121 Keep scoped cache lookups alive while callers remain (#8396)
17810b478d Fix cleanup registration interruption gaps (#8397)
6bc0eeea42 Fix spans that never end when a traced region is interrupted as it starts (#8387)
35ef06c56d Fix Metric updates landing in the wrong series (#8380)
107dbecab1 Fix Layer.MemoMap hanging or leaking a shared layer when a requester is interrupted (#8385)
88b79d74f1 Build Mime lookup tables on first use (#8370)
321bae616d Fix hash composition collisions in owned folds (#8360)
dd014d946a Increase multipart parser smoke test timeout (#8392)
20276b3b48 Serialize NodeTerminal fixture tests (#8393)
1519fd7b21 support raw JSON Schema dynamic tool calls (#8363)
061b9611d4 Move Arbitrary to the top-level module (#8382)
59865d1494 runtimeperf-compare: apply the working-tree diff byte for byte (#8376)
f75468a135 Restore global defaults for native property testing (#8367)
4e4fa8b184 Rename Schema checks for grammatical consistency (#8378)
6ecd4b3809 Fix Effect.txRetry parking forever on a stale read set (#8372)
287273cf55 Add Schema code point length checks, closes #8178 (#8364)
62b2ea97fe Rename HTTP API module path (#8365)
24fa0ab30b Retry OpenAI websocket turns after previous_response_not_found (#8355)
8fca194749 Fix Number.remainder precision for large operands (#8359)
d426feb658 Split encoding formats into dedicated modules (#8356)
1b4461ec3a Move unstable Effect modules to top-level paths (#8354)
b409e3f8f4 Make awaitAllChildren interruptible (#8353)
1dbc4c382c feat(PubSub): add isPubSub type guard (#8345)
7b81a95de1 feat(TxChunk): add isTxChunk type guard (#8348)
a37fa2a1c3 Refresh PlatformError migration guidance (#8352)
5bf58f15f3 Reduce BigDecimal bundle size (#8347)
31c6c1c157 Tighten AI guidance for type tests and changesets (#8346)
b8d14d3eed fix(Formatter): include Error message in formatJson (#8150)
c79088d693 Add family-aware NetAddress type helpers (#8340)
325e0fb66a Add dual forms to selected APIs (#8339)
3af6bd0803 Add isPlatformError guard (#8337)
621a65093d Preserve streamed text and tool args for nullable delta.role and tool call id (#8333)
14a3f14009 Version Packages (rc) (#8307)
27de875612 fix(sql-pg): retire a session whose CancelRequest may be in flight (#8330)
9953c92b86 Bound local entity registration waits (#8331)
89c9a39841 Warn on conflicting workflow tag registrations (#8329)
895d94410f fix: align input and outputSchema for older MCP revisions (#8326)
eea03fca8f Update repository dependencies (#8328)
201b5ab5c4 Fix sql-pg prepared statement name collisions (#8327)
87912c0141 Add native socket formatting helpers to NetAddress (#8325)
1b21e0df6a Add branded NetAddress classifications (#8323)
8d40572de3 Fix cluster request resets stranded by in-memory deduplication (#8317)
c6e8b20c27 Extend NetAddress.toCanonical to internet addresses (#8319)
705fb6852a Add Queue.shutdownUnsafe for synchronous teardown (#8318)
3b155e3e24 fix(Pool): release retired usage-TTL resources (#8310)
106af64cf7 fix(sql-pg): release completed transaction savepoints (#8308)
7869f54af4 fix(sql-pg): support regclass binary values (#8309)
e7fc14b59a Document recent getter and client migration changes (#8313)
3d59ae6d5f Make AI probability criteria optional (#8305)
d62dd0d652 Version Packages (rc) (#8201)
4d4c4e8a44 Fix Schema.Redacted inner transformations, closes #8295 (#8298)
0beded04f5 Improve BigInt and BigDecimal arbitrary generation (#8296)
b5404c92eb docs: consolidate Schema migration guidance (#8294)
8cb0a4f28f Add DecisionModel to effect/unstable/ai (#8287)
feef90ccbd Fix Arbitrary derivation for inhabited schemas containing Never (#8293)
c19c63fb71 Optimize Effect Schema and add experimental JIT and AOT compilers (#7908)
9a81b9b4a6 Fix sqlite-do transaction deadlocks from automatic scheduler yields (#8291)
d5f67f3e9d Fix MCP schema JSDoc section formatting (#8288)
c7d1ffff31 Document recent Stream and provider migration changes (#8285)
0045152cdf Fix raw Response metadata loss when omitting bodies (#8284)
9ad9891e24 Expose HttpApi.ParseOptions for schema decoding and encoding (#8269)
23a58c020b Add NetAddress host and IPv6 scope helpers (#8272)
63c15662f9 Fix YAML indentless sequences and multiline scalar parsing (#8270)
072e35ae83 fix(sqlite-do): support nested storage transactions (#8267)
d30a0c880f feat(http): add QUERY method support (#8261)
2940742c3f fix(http): keep raw Web Response bodies readable in toClientResponse (#8260)
a7a71921de fix(sqlite-do): propagate native transaction completion failures (#8257)
ccae354231 Align Effect and Stream APIs and fix Stream type signatures (#8256)
1393080f1c feat(Crypto): add ULID support (#8233)
84fe64a5fb Fix literal action suffixes across HttpApi (#8255)
77a5612035 fix(http): preserve Content-Type on file responses and HttpStaticServer (#8254)
90695b0d5b fix(ai-openai): support API sources in web search (#8236)
05a6405d3d fix(platform-node): clean process groups after successful leader exit (#8245)
1b084cc9a2 Fix mailbox starvation from unrelated workflow deferreds (#8244)
45b510352d Fix lost durable deferred wakes in discarded cluster workflows (#8243)
769f6046a2 Update migration guidance for MCP handlers, tool results, and byte sizes (#8242)
8ef3fcbbe7 feat(sql-pg): decode timestamp and timestamptz columns as Date (#8241)
553c403f1d Fix deferred handover wake-ups and interrupted RPC stream writes (#8235)
fd910d1cc6 fix(sql-pg): decode unregistered scalar OIDs as UTF-8 text (#8240)
4e4a3a6055 feat(sql-pg): support startup parameters and opaque options (#8234)
49e4b37b83 fix(ai): McpServer issues with tool strictness, server instructions and prompt titles (#8228)
10761707b5 Fix deferred self-completion in the memory workflow engine (#8229)
c22bc43355 Reduce Types CI memory pressure with a Go soft limit (#8232)
302de10d99 Fix OpenApiGenerator test timeouts under compiler load (#8230)
efec8a6d1d ci: limit Snapshot compiler memory use (#8231)
ccfe152d11 Fix RunnerServer request leaks on caller disconnect (#8227)
73e6f4bb94 fix(sql-clickhouse): use ping for connection validation (#8210)
abb93c221b fix(openapi-generator): type binary multipart fields as File | Blob (#8208)
205066a76f Support Effect password providers in sql-pg (#8224)
9367dcbeda fix(sql-pg): preserve SqlError when LISTEN connections fail (#8215)
8abae870f9 Update workspace dependencies to latest compatible releases (#8225)
f193ac50d1 fix(sql-clickhouse): use ClickHouse compiler dialect (#8211)
8f420bb3dc Add Arbitrary.array with structural shrinking (#8221)
755e863a79 Restrict ByteSize string inputs to canonical integer quantities (#8212)
f110af1ac5 Fix multipart hang when request body fails during an active file (#8206)
51d4a2f08a fix(RcRef): keep idleTimeToLive when the value is 0 (#8202)
a2c4154cf8 feat: add v2026-07-28 protocol adapter (#7265)
8feeb3c4cd Support TLS fallback for sql-pg prefer and allow modes (#8200)
4a05d4914f Version Packages (rc) (#8192)
657254b821 Optimize Schema initialization (#8196)
f9ef0e9702 fix(http): omit body in toWeb for 204, 205, and 304 (#8190)
ccad0fe130 Fix generated HTTP client path handling (#8188)
4f73f9e0bd fix(persistence): parameterize persistence lookup keys (#8187)
cdb3ac9171 Version Packages (rc) (#8159)
9941e6dbf8 feat(cli): make message optional for Prompt.Select and Prompt.MultiSelect (#8181)
92660514f7 fix(platform-bun): restore startup when hostname is omitted (#8185)
b0f7be1743 fix(ai-openrouter): handle disjoint reasoning and cached token usage details (#8170)
fdec3b23a1 fix(ai-openai): preserve failed search outcomes (#8157)
6d55555b83 fix(FileSystem): keep stat when optional inode exceeds MAX_SAFE_INTEGER (#8164)
3ff49521af Support TTL callbacks in Effect.cachedWithTTL (#8177)
0b8bd9c917 Update migration guidance for branded services and Schema changes (#8176)
f48fb1c0fb Add Match.valueTags API contract type tests (#8175)
91abe38c37 fix(sql-pg): restore TLS SNI for non-IP hosts (#8174)
482b7d7eb0 feat(SchemaRepresentation): improve JSON Schema imports (#8169)
716e0c0094 fix: remove dangling @internal references from published declarations (#8162)
d4e4ad57d0 fix(SchemaRepresentation): group optional tuple element types (#8160)
b1988f496e fix(SchemaRepresentation): preserve __proto__ fields in generated code (#8158)
d3b837aee8 Version Packages (rc) (#8125)
5a77084651 Declare Reactivity, LanguageModel, EmbeddingModel, and Chat as interface + Context.Service (#8155)
399334052d Fix Vitest timeout finalizer ordering (#8154)
7999b07895 Fix Content-Type preservation during HTTP compression (#8148)
53909a9bf1 feat(Schema): improve JSON Schema generation (#8147)
c8349ede1a refactor(Schema): rename transformOrFail to transformEffect (#8143)
45c88f94c8 docs(Logger): fix JSDoc link tag order (#8141)
f3cf1e6c36 fix(Types): preserve opaque values in DeepMutable, closes #7523 (#8140)
88093b5795 fix(workflow): make activity counter acquisition interruption-safe (#8132)
5fcd614a9f Stabilize PGlite client tests under CPU contention (#8136)
10d2c983a8 Backport Schema interpreter behavior (#8131)
addeaea0b0 dispatch websocket events directly (#8127)
b43bfd644a Align CLI constructor names with Schema and Config (#8121)
e7a4e0cb98 Remove changesets for private tool packages (#8122)
7105c732f3 Revert "Version Packages (rc) (#7446)" (#8124)
26e0085d09 Report MCP toolkit failures before recovery (#7520)
54adcab052 Version Packages (rc) (#7446)
3715d9b015 chore(docs): Made all code examples in MCP.md typecheck successfully (#8079)
0a08ae0626 Add shared network address values (#7524)
6d00dcca64 Update migration guidance for recent public API changes (#8118)
5a80204398 Fix arbitrary generation and shrinking for index signatures (#8095)
291d616282 fix(cli): split key=value pairs at the first separator (#8086)
d5c7cd2c47 fix(logger): Removed unused stderr option from consolePretty signature (#8074)
c5eca6539f Fix file body content-length precision and range errors (#8115)
4907e9b247 Skip optional stack capture when stackTraceLimit is zero (#8114)
87654c5eed Fix inconsistency between CookiesError name and tag (#8064)
4ab4e838a4 Fix filesystem and HTTP file range precision loss (#8110)
66e2becda4 fix(platform-bun): preserve readable stream failures (#8036)
a6ceb98e89 Fix invalid File.readAlloc sizes on Node and Deno (#8112)
39b9738727 Fix tool result serialization to respect failure status (#8106)
c85fc0b8f2 Reject file seeks before the start of the file (#8108)
f7f1d78e52 Clamp HttpPlatform file responses to the available bytes (#8111)
fc9fedf59f Fix oversized byte ranges in HttpStaticServer (#8109)
e9915d5d7a Upgrade Vitest integrations to version 5 (#8104)
93f32c93ca Migrate filesystem byte counts to ByteSize (#7552)
c80faab766 Refactor ByteSize exports to use explicit type annotations (#8107)
72cfa24209 feat(logger): Exposed platform specific console loggers separately (#8083)
cda12840a4 Fix JSDoc section formatting in multipart and process APIs (#8105)
ca6f0dc4fc Expose final URL on HttpClientResponse (#7496)
3d203b702e add Effectable.Mixin (#7907)
44f44cae65 Fix token bucket refill timing and fractional costs (#8103)
9f37e58d00 fix(cli): preserve prompt frames while rendering (#8097)
98592a2373 Fix strictJsonSchema leaking into OpenRouter requests (#8102)
8f3ea0d005 Fix Anthropic non-native structured output generation (#8100)
ad8e9ad7af Fix strictJsonSchema leaking into Anthropic Messages requests (#8098)
cce221ebf4 Update compatible workspace dependencies (#8096)
db995df19b Separate template literal validation from codec parsing (#8094)
2a30248b6e Reduce the basic Effect bundle size (#8090)
ef165814ea Control SQL span propagation with a context reference (#7493)
77f85fe161 use new instantiation for streams (#8087)
7e24e3a5ef fix(atom-solid): forward default idle TTL (#7533)
e7eebf4685 fix(docgen): make module page paths relative to the source root (#8051)
1747d842c8 fix(docgen): keep colliding module examples in distinct files (#8043)
8efa56986d fix(doctest): execute TypeScript snippets from Markdown and MDX (#8049)
9f75b5ea51 fix(api-diff): preserve migration example fence framing (#8047)
d681c2eb1b fix(cli): reset date input buffer on Tab navigation (#8057)
32f9c60189 fix(docgen): validate parsed class property examples (#8041)
9bbe1a5940 fix(cli): preserve option-looking flag values in wizard mode (#8059)
f9235832c4 fix(api-diff): preserve CRLF import-map replacement guidance (#8045)
ad07200712 Fix transformClient for generated streaming requests (#8081)
79ae49f19c fix(AtomRpc): match RPC requirements in query return type (#8067)
fc668b61e9 Expose SSE decode options per HttpApiClient call (#7954)
2f106a5245 fix(platform): propagate upstream NodeStream duplex failures (#8071)
6550a074c5 Port HttpApiBuilder.handler from v3 (#8078)
74dd9b3be8 fix(Schema): return compose from encodeTo without transformation, closes #8073 (#8077)
e2ae72481e fix(Graph): respect impassable edges during cycle propagation (#7920)
a29b8f4de5 fix(Effect): type effectify mapper caller inputs (#8009)
0847c41e24 fix(Effect): restore scoped NaN log annotations (#8026)
d6422f4104 fix(Effect): retain union-record errors and services (#8014)
0d98213464 fix(Types): retain required named keys on indexed records (#8024)
c020987a06 fix(Effect): skip restoration of expired scoped services (#8005)
ee336d80b4 fix(Effect): retain direct constructor error types (#8016)
14526354f3 fix(Effect): install cleanup before invoking use callbacks (#8020)
8426e5f7ad fix(Effect): type repeatOrElse fallback metadata correctly (#8022)
b28ab48be7 Fix durable suspension for child workflow fan-out inside activities (#8070)
50ef80e251 fix(Effect): constrain mapped track source errors to the mapper domain (#8030)
1c2afc15bb fix(Effect): complete source cleanup before timeout fallback (#8032)
abe95d1234 fix(Effect): preserve causes for unmatched reasons (#8007)
e255f0893e fix(ai-openai): tolerate missing response sequence numbers (#8037)
bd393d63c1 fix(Effect): return an Effect type from withErrorReporting (#8028)
6f6bd84fe0 fix(platform-bun): preserve routes across handler reloads (#8035)
dd6ce2d6e3 Defer Undici loading in platform-node (#7528)
7b2c5bd3c3 fix(Effect): preserve errors in saved tapDefect operators (#8012)
4950a914a6 fix(Effect): forward original arguments to eager transforms (#8001)
408eaa3b69 Disable npm audit during pnpm setup (#8033)
ba2fd822e9 Wait for the process group in NodeChildProcessSpawner release and kill (#8018)
b2cc832e8e Tighten SocketRunner readiness checks (#7999)
d1ceffab6b Stabilize SocketRunner test synchronization (#7997)
96f99b325d Fix HTTP Router prefix order when nested (#7913)
414dc9056a fix(AtomRpc): preserve client middleware error types (#7963)
d12f922853 fix(Tuple): retain optional evolve transform results (#7924)
fe4fed1b01 fix(AtomHttpApi): expose generated client stream success types (#7965)
be6b6af60a fix(bundle): decode module URLs before discovering fixtures (#7971)
8cf12030e8 fix(Context): infer services for saved curried getters (#7933)
2c63f1e07e fix(RequestResolver): consume tagged iterable results (#7981)
1579d6fd06 fix(Metric): scope cached hooks to the selected registry (#7991)
bea7d4c3a8 fix(ai-codegen): recognize whitespace-leading inline patches (#7894)
a3ebb7fcb2 fix(EventLogRemote): retry wrapped authentication Forbidden errors (#7862)
1e6e206f63 fix(HttpRunner): preserve configured leading path separators (#7898)
4b7e6c74d2 fix(sql-sqlite-wasm): retain statement-specific result columns (#7953)
53e6c7311b fix(Metric): canonicalize attribute order in series keys (#7993)
05b1e80cde fix(reactivity): honor explicit zero query TTL values (#7961)
027ceb91e0 fix(Effectable): evaluate Class with asEffect (#7915)
50640f9ec5 fix(api-diff): preserve literal type categories in snapshots (#7850)
4a59c6a559 fix(Multipart): add isStreamPart guard (#7987)
a71140fbe7 fix(HttpClient): constrain catch recovery to HTTP responses (#7945)
7738b48e48 Stabilize two-step workflow branch test (#7995)
d425c8c131 Skip unencodable atoms during dehydration (#7994)
248201f784 fix(Layer): forward span stack-capture options (#7983)
f1b291027c fix(RateLimiter): report exact fixed-window reset lifetime (#7985)
d39041ea2b fix(oxc): escape rewritten import specifiers (#7975)
b17bcf6f55 fix(bundle): propagate requested output write failures (#7969)
3e2a8adf67 fix(oxc): preserve bigint precision in literal fixes (#7973)
bc582c9431 fix(RequestResolver): preserve tagged handler failure causes (#7979)
84ad49a357 fix(FiberHandle): keep same-fiber registrations idempotent (#7967)
4ffcaf4c4a fix(ChildProcess): preserve astral escapes in templates (#7989)
d150a643c4 fix(AtomHttpApi): dispatch top-level group endpoints (#7959)
8766475023 fix(DurableDeferred): require encoding services when recording exits (#7941)
22cd7fa32a fix(sql-d1): preserve native raw result envelopes (#7882)
7bb878176b fix(Sharding): preserve explicit registration service overrides (#7906)
832c1d8e21 fix(platform-deno): decode Redis URL authority credentials once (#7833)
5fe42ce443 fix(sql-sqlite-bun): allow database export within transactions (#7831)
b4d81832be fix(sql-libsql): isolate transaction contexts per client (#7829)
d8ff9605bb fix(DurableClock): preserve explicit zero in-memory thresholds (#7840)
91e9af0d5f fix(SqlMessageStorage): preserve reply IDs in by-ID reads (#7837)
473bd814a9 fix(ChunkedMessage): return a chunk for empty framing data (#7842)
e80d3972fc fix(LayerMap): retain errors for preloaded service reacquisition (#7937)
f4981cf9a5 fix(sql-sqlite-wasm): start native message ports (#7951)
862ba71de0 fix(platform-deno): apply writeFile modes only during creation (#7943)
88593e4abc fix(sql-sqlite-wasm): retain native worker error codes (#7947)
8f397ed4e7 fix(Reply): align codec service requirements with their direction (#7939)
ce120f474b fix(Layer): require error taps to accept the source error (#7935)
53eb88875d fix(platform-browser): invoke custom runtime teardown (#7866)
f1a941d52c fix(Logger): complete file log writes after partial progress (#7874)
f984ee82d2 fix(Random, Crypto): prevent rounding to exclusive upper bounds (#7864)
436f5eb44a fix(ConfigProvider): substitute dotenv references as literal data (#7884)
1df933d1de fix(HashRing): include the final exclusion search radius (#7886)
6b8128e0bd fix(platform-browser): recognize IndexedDB keys containing bytes (#7868)
e11be41dfc fix(SqlModel): retain insert result decoding services (#7904)
0f0a614dcb Stabilize shard release active-teardown test (#7957)
df3fc47609 fix(SqlRunnerStorage): bound PostgreSQL acquisition results to requested shards (#7860)
a8ea80799a fix(Entity): forward test-client fatal-defect options (#7889)
ce4aa65409 fix(EntityProxyServer): retain client codec service requirements (#7902)
07ffd25bd0 fix(Number): preserve negative-zero remainder dividends (#7910)
d51aa36a73 move a couple more jobs back to github
d473bd3ee9 fix(Formatter): preserve defined falsy Error causes (#7872)
0276a27ddb fix(HttpClient): keep preprocessing inside redirect recovery wrappers (#7922)
f43b9d6d99 fix(Tokenizer): measure complete candidate prompts when truncating (#7912)
3853b112d4 fix(api-diff): retain optional class members in snapshots (#7852)
37eca35cea fix(jsdocs): refresh input caches for each extraction (#7848)
f8ab8e0603 fix(utils): preserve absolute codegen discovery matches (#7854)
e8912473bd fix(MessageStorage): clear queued control envelopes with their address (#7835)
5b03c4861a Update v3-to-v4 guidance for recent API changes (#7955)
4eb0fa7230 Reduce HTTP server overhead in response headers, routing, HttpApi errors, and Effect.cached (#7956)
fa6027b16e feat(http): reduce web handler cold start on Cloudflare (#7927)
a9d1ee3d4d Fix disabled OTLP batch flushing (#7931)
42fd969b45 fix(Scheduler): fall back to a microtask when timers cannot be set (#7930)
a31adbefd6 Optimize OtlpTracer span creation and export (#7929)
d7c66d0349 ci: run Static and Build jobs on GitHub-hosted runners (#7928)
7e74c58bed Fix flaky browser RPC stream test (#7900)
2ec12ad1cd Configure test matrix (#7899)
93422fc5a7 Merge Deno and Node type checks (#7892)
af0ccdd13a fix(TestSchema): compare every own struct field by AST (#7870)
2f474730d1 Right-size Namespace CI runners (#7880)
a2c1ce62f0 fix(SqlEventJournal): preserve callback error identity (#7844)
9cc3e6218a Stabilize durable clock routing test (#7858)
4372c79a32 fix(effect): centralize JavaScript array index validation (#7855)
a62f4838f0 Use GitHub runners for releases (#7856)
2122e07b86 Configure namespace.so runners (#7845)
180b635aea fix(Schema): centralize JSON Pointer URI fragment handling (#7823)
500c60b3ab Remove ignored NodeStream bufferSize option (#7838)
56e72b38c0 fix(effect): encode tool results using their known result branch (#7748)
d84f865a48 fix(platform-browser): return typed errors when subtle crypto is unavailable (#7808)
9252a00ba3 fix(platform-node): preserve unsafe worker reply payloads (#7810)
73bc3a13b6 fix(McpServer): resolve HTTP resource templates without losing origins (#7814)
072005e64b fix(IndexedDb): preserve out-of-line primary keys in query results (#7818)
99f57af401 fix(IndexedDb): keep select streams within their query limits (#7820)
b628bb1240 fix(McpServer): type prompt callbacks with decoded parameters (#7816)
8364ddda23 fix(Socket): resume paused WebSockets after reader handoff (#7825)
ad67d8c5a1 fix(Socket): count UTF-8 text bytes toward WebSocket watermarks (#7827)
a3f2b31934 fix(cli): retain subcommand alias completion contexts (#7802)
ff0f00627e fix(openapi-generator): convert multipart record payloads (#7770)
b845b18637 Add defect recovery operators to Stream and Channel (#7822)
ec0c087526 fix(Channel): emit CR-terminated lines before pulling more input (#7798)
f74282cb08 fix(MutableList): preserve bulk-prepended values when appending (#7776)
8479f4e91f fix(ai-anthropic): preserve base64 image string payloads (#7758)
ab07e66144 fix(opentelemetry): use collection interval starts for delta metrics (#7762)
d6f9eba7e8 fix(ExecutionPlan): capture while predicate requirements (#7784)
412bc408a1 fix(sql-sqlite-do): classify streaming storage failures as SqlError (#7732)
b64f406de1 fix(effect): clear stale dynamic tool schemas when replacing parameters (#7750)
1e92dbd26f Improve HTTP server and HttpRouter request throughput (#7772)
72b85820f1 fix(NodeHttpClient): parse Undici response forms from cached bytes (#7718)
3a0828b058 fix(PersistedCache): persist synchronous lookup defects (#7766)
615c41e193 fix(NodeSink): invalidate drain callbacks on interruption (#7714)
f01b8ad919 fix(docgen): preserve alias names and declared type parameters (#7752)
0beaf69e3c fix(NodeChildProcessSpawner): expose the first pipeline stage stdin (#7728)
474860b462 fix(atom-react): preserve notifications after switching refs (#7744)
fe606666a7 fix(sql-mssql): adapt byte arrays for automatic VarBinary binding (#7726)
84d2a470ec fix(effect): tolerate repeated reactivity keys during query cleanup (#7742)
3f51acdf5e fix(effect): forward fallback atom writes to the primary atom (#7740)
49e39010ff fix(effect): retain completed non-streaming tool approval results (#7738)
736c882a45 fix(BrowserHttpClient): support readers in ArrayBuffer mode (#7736)
e406217f8c fix(NodeHttpServer): forward custom and empty status text (#7730)
fe3830add4 fix(sql-pg): honor explicit SSL overrides for URL modes (#7734)
c8072b6c4a fix(openapi-generator): encode declared form-urlencoded requests (#7768)
b505c0db03 fix(opentelemetry): preserve negative counter deltas in both exporters (#7760)
95c2581e0f fix(FileSystem): retain the sink write default for undefined flags (#7788)
ccc2e02def fix(Optic): splice canonical string indices in optionalKey (#7780)
e42516a9c5 fix(sql-mssql): forward the configured NTLM domain (#7724)
fc3b718711 fix(Trie): preserve valued nodes during removal (#7774)
53511efcd1 fix(Schema): preserve ArrayEnsure element branches and encoding cardinality (#7796)
604b1c109d fix(Optic): preserve deletions through pick and omit (#7778)
14d810a726 fix(Order): retain finite criteria across comparisons (#7782)
d8776058ba fix(platform-bun): report Unix addresses for Unix socket servers (#7800)
310f8d3424 fix(cli): include inherited shared flags in descendant completions (#7804)
4daa260526 fix(sql-sqlite-node): capture unprepared statement preparation errors (#7722)
d68ff05506 fix(HttpMiddleware): preserve existing CORS Vary dimensions (#7693)
163cebdc19 fix(NodeFileSystem): classify watch events relative to their target (#7710)
2ce57b35a6 Isolate MySQL single-table persistence tests (#7812)
3b6d3a4105 test: serialize MySQL integration suites on Node (#7811)
668082885f fix(SynchronizedRef): correct callback-only modifySomeEffect currying (#7790)
2b3a9a3fbb fix(sql-pglite): preserve string values passed to sql.json (#7720)
f93d051c33 fix(platform-node): preserve incoming bytes when selecting text readers (#7716)
48dbbb22bb fix(cli): allow optional wrappers around alternative flags (#7687)
f7490d49c7 Add manual Queue taker flushing APIs (#7806)
45ffa72212 fix(HttpApiTest): run registered pre-response handlers (#7705)
37cdd692ad fix(NodeFileSystem): accept empty writeAll buffers (#7708)
d0a6c5eee0 fix(NodeSink): capture writable finalization errors (#7712)
d8cc9ed80e fix(RpcSerialization): retain falsy control IDs when decoding JSON-RPC (#7683)
7d455f51ac fix(OpenApi): populate schemas before endpoint transforms (#7703)
62326505a7 fix(HttpApiClient): preserve base paths in URL builders (#7701)
47b358a4b8 fix(HttpApiClient): decode form-urlencoded responses through UrlParams (#7699)
7750dbe0d5 fix(HttpApiBuilder): honor status annotations on stream wrappers (#7697)
6525771eef fix(HttpApiSchema): clear stale metadata in encodeToWithHeaders (#7695)
d386979fed fix(HttpStaticServer): ignore Range on non-GET requests (#7691)
2a3a4783bc fix(HttpRouter): normalize prefix-removal metadata (#7689)
975f7586f3 fix(HttpServerResponse): preserve Web response content lengths (#7681)
4b73e1bd55 fix(Schema): preserve percent-encoded JSON Schema references (#7661)
0b93584808 fix(ai): preserve string tool results (#7805)
c86c99939e fix(HttpEffect): close request scopes for streaming HEAD responses (#7679)
1c89c78f9f fix(cli): classify absent required variadic arguments as missing (#7685)
74ff5c3138 fix(atom-vue): publish the selected ref's current value (#7746)
d902f1fd92 fix(doctest): preserve statement boundaries after generated assertions (#7754)
62945c1baf fix(ai-openrouter): retain normalized tool-call finish reasons (#7764)
685275058a fix(ai-openai): preserve image strings in OpenAI and compatible requests (#7756)
d14c4631ac fix(Yaml): preserve folded scalar paragraph and indentation breaks (#7669)
381b79464f refactor(Channel): remove runDone (#7657)
d3c6b73cc4 fix(Model): preserve omitted variants in FieldOption (#7665)
2e39e8bafe fix(Stream): preserve large source chunks when rechunking (#7655)
fc91af659d fix(Toml): allow child tables in distinct array entries (#7667)
9960708052 fix(FetchHttpClient): set duplex for raw Web stream bodies (#7677)
284050c2aa fix(Mime): normalize parameters in all-extension lookups (#7675)
ed74b18b95 fix(Sink): preserve unconsumed leftovers in flatMap (#7659)
d592c1492a fix(SchemaBinary): preserve leading U+FEFF in strings (#7673)
2245997ad2 fix(Sse): preserve events with mixed line endings (#7671)
6f090d4c20 fix(VariantSchema): preserve classes in default extraction (#7663)
243c72f001 Fix SchemaAST declaration parser contract (#7651)
5c7eed0c5a Reduce HTTP server allocations per request (#7650)
183c2ea65e Reduce RPC server allocations per request (#7649)
a1177caf27 Refactor ByteSize as branded bigint (#7648)
9956f0e6f4 Reduce allocations in Effect primitives and fibers (#7643)
7616f73c16 fix(httpapi): transform middleware-declared errors like endpoint errors (#7561)
a2c9e7c17a Simplify Graph protocol and runtime guard (#7644)
464d0b3e52 fix(platform-bun): load Bun's RedisClient lazily so the barrel imports under Node (#7564)
de7774f359 test(sql-mysql2): reuse Model test container (#7642)
f9d0dec12c fix(UrlParams): preserve immutable setAll overrides (#7631)
629870d461 fix(SchemaGetter): preserve duplicate array-valued leaves (#7641)
02be94ce78 fix(Chunk): preserve sliced elements during concatenation (#7617)
8efc70ea16 fix(Struct): honor numeric property selections (#7619)
aa0aba3833 fix(Headers): match stateful redaction patterns independently (#7627)
4446451011 fix(Prompt): preserve text parts during serialization (#7637)
58be97238e fix(Prompt): retain JSON-restorable response attachments (#7639)
7bd3f34385 fix(sql): renumber cached returning fragments (#7635)
f921ed305c fix(HashMap): isolate extracted collision entries (#7625)
f05ae0b3fd fix(DateTime): apply calendar parts without intermediate overflow (#7621)
829aff97d7 fix(Headers): compare redacted names case-insensitively (#7629)
59812fd221 fix(UrlParams): coerce scalar null inputs (#7623)
1693a87732 fix(sql): compile identifiers in returning helpers (#7633)
0856631a89 fix(RequestResolver): preserve persisted batch failure results (#7613)
78cc9c0d0f fix(Cache): avoid caching synchronous interruptions (#7614)
06c6307d3d fix(ScopedCache): capture refresh lookup callback defects (#7612)
0af0985d5c fix(RequestResolver): preserve cached race winners (#7594)
8ac53b6ae6 fix(FiberMap): retain reentrant replacement ownership (#7615)
5f8ad105c0 fix(PubSub): preserve empty sentinel values in batched polling (#7607)
cd83544dd5 fix(Pool): preserve reservations during borrower release (#7604)
cec6c2d7be unstable/ai: route tool param validation through failureMode and drop ToolParameterValidationError.toolParams (#7588)
1320075fd4 fix(PubSub): advance sliding subscribers past dropped messages (#7603)
bb99734ef8 fix(RcRef): reject acquisitions completed after owner shutdown (#7598)
78a42697f6 fix(ScopedCache): detach invalidated entries before finalization (#7606)
1aa1d8bd0f fix(RcMap): handle synchronous lookup defects (#7605)
f17eb0a6f6 fix(Cache): enforce capacity when publishing refreshed entries (#7596)
f30cbfe539 fix(Cache): preserve replacement values after zero-TTL refresh (#7595)
222e7caa4b fix(RcRef): preserve replacement resources during borrower cleanup (#7586)
debe8fdc15 fix(Cache): preserve replacements during conditional invalidation (#7587)
1a86166f10 fix(RequestResolver): evict cancelled pending cache entries (#7583)
7245f87ace fix(PartitionedSemaphore): preserve new waiters during stale cleanup (#7584)
a8588f99a4 fix(Cache): preserve newer entries when refresh is interrupted (#7585)
46d83101e8 Move unstable HTTP schemas to Schema (#7553)
c8ea60231a fix(Queue): prevent duplicate messages from resumed producers (#7576)
d812596a10 Fix CLI formatter NO_COLOR handling (#7573)
4697aaa1d3 Fix CLI help alignment for Unicode graphemes (#7572)
0a3862349e Expose named random service types (#7571)
acc1e5384a Normalize core service key identities (#7568)
797c9e3c1f fix(effect): type Cause.Reason#annotate as Context-only (#7565)
0c95c04b41 Fix Worker.run hanging when a worker dies before the ready handshake (#7570)
c34edcb6d7 Remove invalid SynchronizedRef Ref inheritance (#7569)
ccbdbd51e7 Fix custom HTTP server span header redaction (#7563)
9642776614 Hide SchemaAST and SchemaIssue class implementations (#7560)
5641ad333a Refactor Schema internals and representation APIs (#7558)
81485ef028 fix(cluster): run the empty shard-lock liveness probe on the shared pool (#7551)
9b517ad28a PersistedQueue hardening and optimization pass (#7547)
11c5ee7202 Fix Content-Length parsing (#7538)
40466bf397 Fix JSDoc validation violations (#7549)
3623e3550b Preserve omitted additionalProperties in OpenAPI schemas (#7546)
a267ff08fe Use Effect YAML parser in OpenAPI generator (#7545)
06e0c5ad23 Update v3-to-v4 Socket and typeclass guidance (#7541)
53843f6490 Add exact ByteSize value module (#7525)
a29e05a907 fix(RcMap): preserve replacement entries during invalidated resource cleanup (#7516)
b76a1cf32b Add in-place TLS socket upgrade (#7514)
75e80bfd26 Fix Atom idleTTL cleanup for stale derived nodes (#7535)
c1693ffda8 Update repository dependencies (#7534)
1742d2f484 Fix Set-Cookie name validation (#7522)
145d8e1013 Fix Schema.mutable with encoded arrays, closes #7517 (#7519)
6e3ae7b635 fix(ai): keep non-object tool results out of structuredContent (#7495)
5664c941b5 Add NodeSocketServer.makeTls (#7512)
a181b8be07 Close pending Node sockets immediately (#7513)
a4bb2aa226 Add NodeSocket.makeTls (#7511)
d60c5d40b5 Normalize collection count handling (#7510)
c405edc991 Set sql-pg multiplex concurrency default to 32 (#7509)
09a3c9667b Fix SchemaBinary strict encoding and field collisions (#7508)
9ad2a43d71 Fix SchemaBinary decoder limits (#7507)
20bd53d4a9 Fix SchemaBinary dictionary and number array handling (#7506)
9adb9f2c82 Reject overlong PostgreSQL channel names (#7504)
96ea948655 Fix zero-TTL PostgreSQL pool churn (#7503)
e203638f6e Allow configuring PostgreSQL backend message size (#7502)
1d0ff4ff67 Reject head-side IPv4 tails in the PostgreSQL inet codec (#7501)
4d288b18e0 Update v3-to-v4 migration docs for MessagePack and Arbitrary removals (#7499)
ba53b646e9 Pull-based Socket API with backpressure (#7487)
3787c46b19 Fix React Native SQLite value queries (#7469)
62d82f4919 Decode ArrayBuffer BLOBs in SqlEventJournal (#7498)
97dd022fe7 Treat NaN as a non-positive count in Stream.take (#7497)
f356bc2da6 Recommend Effect.fnUntraced in AI guide (#7492)
078cdbf6a3 Refine repository skill guidance (#7491)
dd99ab007e fix(cluster): bound teardown interrupt classification (#7489)
e72b12fc30 Execute streaming tool handlers eagerly with interruption and synthesized results (#7486)
d7ae6b6491 fix(cluster): never surface transient routing states for persisted messages (#7485)
be0f8221e3 Support WebSocket clients across runtimes (#7477)
561296283c Fix readonly SQLite transactions (#7484)
310dd9ce96 Restore Effect.timeout error message (#7481)
b945ded23a Align type IDs with module paths (#748…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL 1,000+ changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant