fix(pi): Fail turns that end on an unresolved abort#20

draft1
contrib/ctm/error-occurrence-preservation
contrib/ctm/pi-abort-outcome
openedSep 27, 2026byMMike Olson
View on GitHubTwo-way sync enabledPR last imported 4h ago

What Changed

A Pi turn whose last main assistant message ended with an aborted stop reason, and that never recovered, now settles as failed with "Pi aborted the response before completion." instead of completed. A later successful assistant message, a tool call or a length stop clears the abort, so turns that Pi or an extension recovered from still complete normally.

User Stop keeps its interrupted outcome, and a more specific provider failure, such as an exhausted retry, keeps its own message.

Why

When an extension's recovery gave up, for example after a repetition loop, Pi aborted the response but T3 reported the turn as completed, which hid the failure from users and parent agents. The outcome is decided only after Pi confirms the turn is idle, so recovery by compaction or retry is not cut short, and it relies on Pi's structured stop reasons rather than notification text.

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

Added 1 commit

  • fix(pi): Fail turns that end on an unresolved abort97f7755