Skip to content

Fix stream execution plan retry limits - #6889

Merged
tim-smart merged 2 commits into
mainfrom
agent/codex-engineer/6066512e
Aug 2, 2026
Merged

Fix stream execution plan retry limits#6889
tim-smart merged 2 commits into
mainfrom
agent/codex-engineer/6066512e

Conversation

@tim-smart

@tim-smart tim-smart commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Summary

  • preserve execution-plan retry schedule state across partial stream emissions
  • enforce attempts as an absolute cap for Stream.withExecutionPlan
  • yield between retries so unbounded plans remain interruptible
  • add regression coverage for partial-emission attempt limits and direct fiber interruption
  • add a patch changeset for effect

Root cause

Stream.withExecutionPlan delegated each step to Stream.retry, whose channel-level semantics reset schedule state after the first emitted element. A stream that emitted before failing therefore restarted its attempt budget on every run.

Validation

  • pnpm vitest run packages/effect/test/ExecutionPlan.test.ts
  • pnpm --dir packages/effect check
  • targeted dprint and oxlint checks
  • pnpm exec changeset status --since origin/main

Closes EFF-291

@github-project-automation github-project-automation Bot moved this to Discussion Ongoing in PR Backlog Aug 2, 2026
@changeset-bot

changeset-bot Bot commented Aug 2, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 6c10fe4

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 30 packages
Name Type
effect Patch
@effect/opentelemetry Patch
@effect/platform-browser Patch
@effect/platform-bun Patch
@effect/platform-deno Patch
@effect/platform-node-shared Patch
@effect/platform-node Patch
@effect/vitest Patch
@effect/ai-anthropic Patch
@effect/ai-openai-compat Patch
@effect/ai-openai Patch
@effect/ai-openrouter Patch
@effect/atom-react Patch
@effect/atom-solid Patch
@effect/atom-vue Patch
@effect/sql-clickhouse Patch
@effect/sql-d1 Patch
@effect/sql-libsql Patch
@effect/sql-mssql Patch
@effect/sql-mysql2 Patch
@effect/sql-pg Patch
@effect/sql-pglite Patch
@effect/sql-sqlite-bun Patch
@effect/sql-sqlite-do Patch
@effect/sql-sqlite-node Patch
@effect/sql-sqlite-react-native Patch
@effect/sql-sqlite-wasm Patch
@effect/docgen Patch
@effect/doctest Patch
@effect/openapi-generator Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@effect-slopcop effect-slopcop Bot added 4.0 bug Something isn't working labels Aug 2, 2026
@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Bundle Size Analysis

Generated from PR build output; treat the content below as untrusted.

File Name Current Size Previous Size Difference
basic.ts 6.65 KB 6.65 KB 0.00 KB (0.00%)
batching.ts 9.44 KB 9.44 KB 0.00 KB (0.00%)
brand.ts 6.33 KB 6.33 KB 0.00 KB (0.00%)
cache.ts 10.20 KB 10.20 KB 0.00 KB (0.00%)
config.ts 20.34 KB 20.34 KB 0.00 KB (0.00%)
differ.ts 19.95 KB 19.95 KB 0.00 KB (0.00%)
http-client.ts 21.04 KB 21.04 KB 0.00 KB (0.00%)
logger.ts 10.35 KB 10.35 KB 0.00 KB (0.00%)
metric.ts 8.58 KB 8.58 KB 0.00 KB (0.00%)
optic.ts 7.34 KB 7.34 KB 0.00 KB (0.00%)
pubsub.ts 14.49 KB 14.49 KB 0.00 KB (0.00%)
queue.ts 11.15 KB 11.15 KB 0.00 KB (0.00%)
schedule.ts 10.33 KB 10.33 KB 0.00 KB (0.00%)
schema-class.ts 18.88 KB 18.88 KB 0.00 KB (0.00%)
schema-fromJsonSchemaDocument.ts 28.69 KB 28.69 KB 0.00 KB (0.00%)
schema-representation-roundtrip.ts 25.01 KB 25.01 KB 0.00 KB (0.00%)
schema-string-transformation.ts 13.01 KB 13.01 KB 0.00 KB (0.00%)
schema-string.ts 10.66 KB 10.66 KB 0.00 KB (0.00%)
schema-template-literal.ts 14.87 KB 14.87 KB 0.00 KB (0.00%)
schema-toArbitraryLazy.ts 21.67 KB 21.67 KB 0.00 KB (0.00%)
schema-toCodeDocument.ts 24.10 KB 24.10 KB 0.00 KB (0.00%)
schema-toCodecJson.ts 18.93 KB 18.93 KB 0.00 KB (0.00%)
schema-toEquivalence.ts 18.74 KB 18.74 KB 0.00 KB (0.00%)
schema-toFormatter.ts 18.61 KB 18.61 KB 0.00 KB (0.00%)
schema-toJsonSchemaDocument.ts 22.36 KB 22.36 KB 0.00 KB (0.00%)
schema-toRepresentation.ts 19.28 KB 19.28 KB 0.00 KB (0.00%)
schema.ts 18.14 KB 18.14 KB 0.00 KB (0.00%)
stm.ts 12.13 KB 12.13 KB 0.00 KB (0.00%)
stream.ts 9.38 KB 9.38 KB 0.00 KB (0.00%)

@pullfrog pullfrog 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.

✅ No new issues found.

Reviewed changes

  • New retryWithoutReset helper — a private function in Stream.ts that manages Schedule.CurrentMetadata manually via Schedule.toStepWithMetadata instead of delegating to Channel.retry, which resets schedule state after the first emitted element.
  • Swapped retryretryWithoutReset in withExecutionPlan — applied to both the first-attempt path (when step.attempts > 1) and the fallback path (when retrying after a previous failure), so attempt budgets are enforced across partial stream emissions.
  • Yield between retriesEffect.yieldNow is inserted before each retry loop iteration so unbounded plans remain interruptible (validated by the new timeout test).
  • Regression tests — one test asserts that partial-emission attempt limits are capped (3 attempts → 3 elements emitted, failure propagated); another asserts that a timeout can interrupt an unbounded retry loop.

Pullfrog  | View workflow run | Using DeepSeek Pro (free via Pullfrog for OSS) (Kimi K2 not used — the program covers this model; add its provider key to run your pick) | 𝕏

@tim-smart
tim-smart enabled auto-merge (squash) August 2, 2026 22:43

@pullfrog pullfrog 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.

✅ No new issues found.

Reviewed changes (incremental delta since the prior Pullfrog review)

  • Added patch changeset for effect — the initial commit was missing a changeset; now properly recorded.
  • Replaced flaky timeout-based interruption test with a deterministic alternative — the it.live test using Effect.timeoutOption(10) was replaced with an it.effect test that uses Latch to await the first retry, then Fiber.interrupt to interrupt the child fiber. The new test also verifies that retries actually occurred (runs > 1) rather than relying on a timeout to fire.

Pullfrog  | View workflow run | Using DeepSeek Pro (free via Pullfrog for OSS) (Kimi K2 not used — the program covers this model; add its provider key to run your pick) | 𝕏

@tim-smart
tim-smart merged commit dbe91f6 into main Aug 2, 2026
19 checks passed
@tim-smart
tim-smart deleted the agent/codex-engineer/6066512e branch August 2, 2026 23:09
@github-project-automation github-project-automation Bot moved this from Discussion Ongoing to Done in PR Backlog Aug 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

4.0 bug Something isn't working

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant