Skip to content

[Bug]: Cursor steer drops the interrupted prompt; the replacement run only sees the steer message #32568

Closed

Description

@atomic-breath

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.

Area

apps/server

Steps to reproduce

  1. Start a thread on the Cursor provider (seen with claude-opus-5-5, Medium) with Follow-up behavior set to Steer.
  2. Send: can you write me a 1000 word story about a dog?
  3. While it is working, send: no wait a pig please.

Reproduced twice: once in a thread with no project, once in a git project.

Expected behavior

The replacement run still has the original request and adjusts it, for example a 1000-word story about a pig.

Actual behavior

The replacement run has only the steer message. The original prompt is gone:

  • No project: the agent replied "I don't have your earlier message… I can't tell whether you wanted a poem, a story, code, or a drawing" and wrote a short pig poem.
  • In a project: the agent generated a pig image, with no mention of a story.

Diagnosis (likely cause)

Confirmed from the logs:

  1. T3 implements a Cursor steer as cancel and restart on the same agent. The provider log shows run.cancel on the first run, then run.start on the same agentId with only the steer text as the prompt. This matches the adapter, which declares supportsActiveSteering: false and supportsSteeringByInterruptRestart: true (packages/provider-cursor/src/server/adapter.ts).
  2. Cursor drops a cancelled run from the agent's conversation. Cursor's own transcript for each agent (~/.cursor/projects/<workspace>/agent-transcripts/<agentId>/<agentId>.jsonl) starts with the steer message. The interrupted run's user prompt and its partial reply are missing, even though T3's log shows that prompt was sent to the same agentId. In the no-project thread, the agent read that transcript looking for the earlier request and found nothing. This happened both when the cancelled run had streamed only thinking and when it had already streamed reply text.

Inferred, not verified in code:

  1. Interrupt-restart steering assumes the provider keeps the interrupted turn. The orchestration-v2 capability doc describes it as interrupting the active turn and "starting a replacement attempt". That only preserves the user's request if the provider keeps the cancelled turn in its history. Cursor doesn't, and T3 doesn't appear to resend the interrupted message. So the replacement run starts with only the steer.

A possible fix is for the replacement prompt on Cursor to carry the interrupted user message, and ideally the partial reply, ahead of the steer text. A provider-level way to keep cancelled runs in the conversation would also work. It's also worth checking whether other adapters that use interrupt-restart steering behave the same way.

Related: #14585 (Cursor steer changed to interrupt and restart), #21040 (a steered Cursor message lost when the replacement run stalls; a different failure), #27014 (Grok: steer without interrupting).

Impact

Major degradation or frequent failure

Version or commit

0.1.8-nightly.20261106.4288

Environment

macOS 26.7.1, T3 Code (Nightly) desktop, Cursor provider via cursor-agent-sdk.local (cursor-agent 2026.10.22-27dcf5f), model claude-opus-5-5

Logs or stack traces

# Provider protocol events (Cursor), project thread. Prompts truncated.
18:01:10.657 outgoing agent.open      operation=create
18:01:14.013 incoming agent.opened    agentId=agent-41c7eb03-…
18:01:14.104 outgoing run.start       msg="can you write me a 1000 word story about a dog? …"
18:01:14.676 incoming run.started     runId=run-f4bc0f2e-…
18:01:17.143 incoming interaction.update (thinking-delta, text-delta streamed)
18:01:19.050 outgoing run.cancel      runId=run-f4bc0f2e-…
18:01:19.052 incoming run.completed   status=cancelled
18:01:19.084 outgoing run.start       msg="no wait a pig please …"   # same agentId, steer text only
18:01:19.150 incoming run.started     runId=run-c931cc92-…
18:01:39.558 incoming run.completed   status=finished  result="I made you a pig: …"

# Same sequence in the no-project thread:
17:59:02.249 outgoing run.start       msg="can you write me a story about a dog, 1000 words? …"
17:59:25.962 outgoing run.cancel      runId=run-3c15f216-…
17:59:25.964 incoming run.completed   status=cancelled
17:59:25.996 outgoing run.start       msg="No sorry wait a pig …"     # same agentId
17:59:41.329 incoming run.completed   status=finished  result="I don't have your earlier message. …"

Screenshots, recordings, or supporting files

No project: the steer "No sorry wait a pig" gets "I don't have your earlier message".

Cursor steer outside a project: the agent says it doesn't have the earlier message

In a git project: the steer "no wait a pig please" gets a pig image, and the story request is gone.

Cursor steer in a project: the agent generates a pig image with no story

Workaround

Use Queue instead of Steer on Cursor threads, or restate the full request in the steer message.

Activity

  1. MathieuLalonde commented on Nov 8, 2026

    @MathieuLalonde

    Been having the same problem and, combined with #28617, it makes T3 unusable with cursor as trying to stop duplicate responses means it will never have history of the previous response.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions