Skip to content

fix(core): fail steps with empty provider output after bounded retries - #40511

Closed
ServOMorph wants to merge 1 commit into
anomalyco:devfrom
ServOMorph:empty-reasoning-output
Closed

fix(core): fail steps with empty provider output after bounded retries#40511
ServOMorph wants to merge 1 commit into
anomalyco:devfrom
ServOMorph:empty-reasoning-output

Conversation

@ServOMorph

Copy link
Copy Markdown

Issue for this PR

Closes #37372

Type of change

  • Bug fix

What does this PR do?

A provider turn that streams a successful step finish but produces no visible text and no tool call (for example a reasoning-only response) was recorded as a successful step (finish: "stop"), so the session ended cleanly with an empty assistant turn.

The publisher now tracks whether any usable output was streamed: non-blank text deltas or a tool call. When a successful stream has neither, the turn is retried up to two times through the existing bounded turn-transition path. If the budget is exhausted, the step is recorded as a terminal failure (finish: "error") with a clear message instead of a false success.

How did you verify your code works?

  • Ran the session-runner tests in packages/core (86 tests in session-runner.test.ts, 129 across the runner files) — all green.
  • bun typecheck in packages/core — clean.
  • Updated existing empty-turn fixtures to produce real output and added tests for retry-then-fail, retry-then-recover, and tool-call (no retry).

Screenshots / recordings

N/A — core change, no UI.

Checklist

  • I have tested my changes locally
  • I have not included unrelated changes in this PR

@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

The following comment was made by an LLM, it may be inaccurate:

Based on my search, I found potential related PRs:

  1. fix(core): fail empty provider output #37843 - fix(core): fail empty provider output

    • Very closely related; this appears to be a prior attempt to address empty provider output failures.
  2. fix(opencode): surface truncated turns instead of ending the loop #40142 - fix(opencode): surface truncated turns instead of ending the loop

    • Related to handling incomplete provider responses that should be retried rather than ending the session.
  3. fix(opencode): drop truncated reasoning from replayed history #40148 - fix(opencode): drop truncated reasoning from replayed history

    • Related to handling empty or incomplete reasoning-only responses.
  4. fix(core): recover from truncated tool arguments with bounded retries #37220 - fix(core): recover from truncated tool arguments with bounded retries

    • Related pattern of using bounded retries for provider output issues.
  5. fix(session): retry empty stream truncations and discard partial parts #26167 - fix(session): retry empty stream truncations and discard partial parts

    • Older related fix for handling empty stream truncations with retry logic.

The most notable is #37843 which directly addresses failing on empty provider output — this PR (40511) may be building upon or superseding that approach with the addition of bounded retry behavior.

@ServOMorph ServOMorph closed this by deleting the head repository Aug 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

v2: empty reasoning-only response is recorded as successful completion

1 participant