Skip to content

fix(grok): Harden ACP resume with replay-idle load readiness#3156

Merged
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback
Jun 26, 2026
Merged

fix(grok): Harden ACP resume with replay-idle load readiness#3156
juliusmarminge merged 7 commits into
pingdotgg:mainfrom
mwolson:fix/grok-prompt-complete-fallback

Conversation

@mwolson

@mwolson mwolson commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes #3560.

  • Race session/prompt against xAI _x.ai/session/prompt_complete so Grok turns settle when the standard ACP RPC remains stranded.
  • Make Stop interrupt the wedged prompt, settle the active turn exactly once, and return the session to ready.
  • Resume Grok sessions without replay flooding by dropping replay updates and using replay-idle load readiness when session/load never returns.
  • Keep one strict root-turn boundary: an AcpSessionRuntime only accepts session/update events for its started root session, and Grok drains those accepted events before emitting turn.completed.
  • Keep the actual running turn unfolded in the web timeline when latestTurn temporarily regresses.

Deliberate scope

This is a narrow V1 Grok/ACP bridge. Child-session chunks are ignored instead of being flattened into the parent transcript. After merge, the V2 follow-up can route those chunks through its existing subagent lineage and progress model.

The earlier projection, reducer, shared-message, markdown-throttling, sidebar, and generic orchestration workarounds have been removed. turn.completed remains the canonical terminal barrier, and ProviderRuntimeIngestion retains its strict provider-independent finalization behavior.

Validation

  • vp check passes with 7 unrelated existing mobile warnings.
  • vp run typecheck passes.
  • vp test packages/effect-acp/src/client.test.ts apps/server/src/provider/Layers/CursorAdapter.test.ts apps/server/src/provider/Layers/GrokAdapter.test.ts apps/server/src/provider/acp/AcpJsonRpcConnection.test.ts apps/server/src/provider/acp/AcpRuntimeModel.test.ts apps/web/src/components/ChatView.logic.test.ts apps/web/src/components/chat/MessagesTimeline.logic.test.ts apps/web/src/components/chat/MessagesTimeline.test.tsx: 8 files, 130 tests passed.

Note

Harden Grok ACP turn resumption with replay-idle load readiness and atomic prompt settlement

  • Session load on resume now races between the session/load RPC and a replay-idle timer (waitForSessionLoadReplayIdle), completing as soon as replayed notifications go quiet for a configurable gap; replayed and child-session updates are dropped during load.
  • Prompt settlement is now atomic and context-validated via settlePromptInFlight: late or cross-session completions are ignored, interrupted turns cannot be revived by late RPC results, and multiple in-flight prompts for the same turn merge with only the last settling the turn.
  • interruptTurn now accepts a specific turnId, pre-marks it in interruptedTurnIds, cancels outstanding prompt slots, and moves the session to ready without emitting spurious terminal events.
  • xAI prompt completion fallback (makeXAiPromptCompletionRuntime) races the native ACP prompt RPC against _x.ai/session/prompt_complete notifications, tags requests with promptId/requestId, dedupes completed IDs, and aborts pending fallbacks on cancel.
  • AcpSessionRuntime serializes concurrent prompts, adds drainEvents/EventStreamBarrier for queue synchronization, and resolves an interrupted prompt to { stopReason: 'cancelled' } instead of hanging.
  • MessagesTimeline and ChatView now propagate runningTurnId so fold behavior tracks the active turn rather than a regressed latestTurn, and interrupt actions include the active turn ID.
  • Risk: turn.completed events may now carry a null stopReason when the xAI provider omits one from its notification.

Macroscope summarized bf4b5b5.


Note

High Risk
Changes core Grok turn lifecycle, cancel/settlement ordering, and ACP event routing—areas where race bugs directly affect user-visible transcripts and session readiness.

Overview
Hardens the Grok ACP bridge so turns can finish when the standard session/prompt RPC hangs, resumes do not flood the transcript, and Stop/cancel races do not double-settle or leak late updates.

The ACP session runtime now ignores replay and foreign-session session/update traffic, can complete session/load when replay goes idle (not only when the RPC returns), serializes prompts, interrupts in-flight prompt fibers on cancel, and adds drainEvents / EventStreamBarrier so consumers flush queued events before terminal settlement. xAI _x.ai/session/prompt_complete is wired via makeXAiPromptCompletionRuntime to race the native prompt, track promptIds, and synthesize cancelled/missing-stop-reason responses.

GrokAdapter gains centralized settlePromptInFlight, interruptedTurnIds, turn-scoped interruptTurn, event draining before turn.completed, and drops streaming for cancelled turns. The mock ACP agent and effect-acp client tests cover hang, stale completion, load replay, and mixed extension notification batches.

Web: interrupt sends the session’s active running turnId; the timeline prefers runningTurnId over a regressed latestTurn so the live turn stays unfolded.

Reviewed by Cursor Bugbot for commit bf4b5b5. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitai Bot commented Jun 19, 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

Run ID: e88888ef-ddd4-4d21-8038-d79d0f20e24e

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolson marked this pull request as ready for review June 19, 2026 03:20
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts
Comment thread apps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
@macroscopeapp

macroscopeapp Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. Introduces significant runtime behavior changes to Grok session and prompt lifecycle management, including new prompt settlement logic, session resume replay-idle detection, and xAI prompt completion fallback. The complexity and cross-cutting nature of these infrastructure changes warrant human review.

You can customize Macroscope's approvability policy. Learn more.

@mwolson
mwolson force-pushed the fix/grok-prompt-complete-fallback branch 4 times, most recently from 59e347f to 7ac3370 Compare June 19, 2026 03:44
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts Outdated
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolson force-pushed the fix/grok-prompt-complete-fallback branch 3 times, most recently from 1b2c893 to 3c38b27 Compare June 21, 2026 20:26
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolson force-pushed the fix/grok-prompt-complete-fallback branch from 2037ac6 to 3859afb Compare June 21, 2026 21:01
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolson force-pushed the fix/grok-prompt-complete-fallback branch 2 times, most recently from b6f559c to 17d881a Compare June 21, 2026 21:36
@github-actions github-actions Bot added size:XXL 1,000+ changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolson force-pushed the fix/grok-prompt-complete-fallback branch from 17d881a to ba54adf Compare June 21, 2026 21:37
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts
@mwolson
mwolson force-pushed the fix/grok-prompt-complete-fallback branch from ba54adf to a2aaf61 Compare June 21, 2026 21:50
@github-actions github-actions Bot added size:L 100-499 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Jun 21, 2026
@mwolson
mwolson force-pushed the fix/grok-prompt-complete-fallback branch from a2aaf61 to 2a9ced0 Compare June 21, 2026 21:54
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts Outdated
@mwolson
mwolson force-pushed the fix/grok-prompt-complete-fallback branch from 2a9ced0 to 1ce246d Compare June 21, 2026 23:04
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts
Comment thread apps/server/src/orchestration/projector.ts Outdated
Comment thread apps/server/src/provider/acp/AcpRuntimeModel.ts Outdated
Comment thread packages/shared/src/orchestrationMessages.ts Outdated
Comment thread packages/shared/src/orchestrationMessages.ts Outdated
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts
Comment thread packages/shared/src/orchestrationMessages.ts Outdated
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts
Comment thread packages/shared/src/orchestrationMessages.ts Outdated
Comment thread packages/shared/src/orchestrationMessages.ts Outdated
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts
Comment thread packages/shared/src/orchestrationMessages.ts Outdated
Comment thread apps/server/src/orchestration/Layers/ProviderRuntimeIngestion.ts
Comment thread packages/shared/src/orchestrationMessages.ts Outdated
Comment thread apps/server/src/provider/acp/AcpSessionRuntime.ts
Comment thread packages/shared/src/orchestrationMessages.ts Outdated
Comment thread apps/server/src/provider/acp/AcpSessionRuntime.ts Outdated
Comment thread apps/web/src/session-logic.ts
Comment thread apps/server/src/orchestration/projector.ts Outdated
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts
Comment thread apps/web/src/hooks/useRafThrottledValue.ts Outdated
Comment thread apps/server/src/orchestration/projector.ts Outdated
Comment thread apps/server/src/provider/acp/AcpSessionRuntime.ts
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts
Race session/prompt against xAI prompt_complete, harden session/load replay
idle readiness, and interrupt forked prompt RPC fibers on cancel so Grok turns
that hang with no prompt_complete still release the composer and accept follow-ups.
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts Outdated
Prevent stale prompt completion from mutating a replacement Grok session and exercise replay-idle load readiness end to end.

Co-authored-by: codex <codex@users.noreply.github.com>
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts
Prevent late cancelled prompt results from consuming replacement-turn state, and suppress ACP output that arrives after cancellation.

Co-authored-by: codex <codex@users.noreply.github.com>
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts
juliusmarminge and others added 3 commits June 25, 2026 21:10
Co-authored-by: codex <codex@users.noreply.github.com>
Drop foreign child-session updates instead of flattening them into the root turn, drain accepted root events before terminal settlement, and remove the projection/UI bridge workarounds that overlap the V2 architecture.

Co-authored-by: codex <codex@users.noreply.github.com>
Keep the shared ACP session runtime provider-neutral and decorate it with Grok's private prompt-completion behavior at the provider boundary. Reject late settlements unless both session and turn lineage match.

Co-authored-by: codex <codex@users.noreply.github.com>
Comment thread apps/server/src/provider/Layers/GrokAdapter.ts
Keep the xAI notification drain under the thread lock so trailing text is ordered before completion without allowing a new turn to steer into the settling prompt. Mark Stop targets before waiting on the lock so cancellation still wins during the drain window.

Co-authored-by: codex <codex@users.noreply.github.com>
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.

[Bug]: Grok Composer hangs on Stop, resume replay floods thread, and long session/load stalls

2 participants