Repository navigation
Description
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
- Start (or hand off to) a thread on the Antigravity provider using an extended-thinking Claude model (
claude-opus-5-5). - Run a multi-step turn (
turn:1) that emitsthinking(reasoning) blocks and tool calls — for example, a turn where Antigravity sets an internalschedulewake timer that keepsturn:1open in the background after posting an interim assistant message. - While
turn:1is still open, send a follow-up message so it is promoted to a steer (inputIntent: "promoted_queued_to_steer"), causing the Antigravity ACP turn/process to terminate after ~16s (as in [Bug]: Steer on an Antigravity thread kills the turn (interruptTurn fails, then AcpProcessExitedError) #19689) andsession/resumefrom file storage (AGY_ACP_FORCE_FILE_STORAGE=1) forturn:2. - Send another normal message (
turn:3,inputIntent: "turn_start").
Expected behavior
- Resuming or steering an Antigravity + Claude session preserves
thinking.signatureon historicalthinkingblocks (or strips/redacts unsignedthinkingblocks when reconstructingmessages), soturn:2and later turns succeed. - When Vertex/Anthropic returns an HTTP 400
invalid_request_errorpayload ({"type":"error","error":{"type":"invalid_request_error",...}}),AntigravityAdapterV2fails the turn with a structurederrortimeline item instead of recording the raw JSON string as acompletedassistant_message. - If a native Antigravity session fails with
thinking.signature: Field required, T3 Code invalidates/rotates the poisonedproviderThreadId(via context handoff) rather than routing every future turn into a permanently broken session.
Actual behavior
- Within
turn:1, all 17 internal tool-call rounds succeed (19:50:39Z–19:53:52Z) while the ACP process holds the conversation state in memory. - At
19:53:52Z, the assistant emits an interim status message, while an internal Antigravityscheduletimer (not surfaced as a T3 timeline tool item) holdsturn:1open in the background. - When a user message arrives at
19:54:39.357Z(inputIntent: "promoted_queued_to_steer"),turn:1terminates 16.08s later at19:54:55.435Z(matching theinterruptTurntimeout /AcpProcessExitedErrorbehavior in [Bug]: Steer on an Antigravity thread kills the turn (interruptTurn fails, then AcpProcessExitedError) #19689). - After cold-starting/resuming the session (
19:57:23.175Z,turn:2), Vertex Claude rejects the request becausemessages[1].content[0].thinking(the very first assistant thinking block fromturn:1) is missing its requiredsignaturefield:{"type":"error","error":{"type":"invalid_request_error","message":"messages.1.content.0.thinking.signature: Field required"},"request_id":"req_vrtx_011CgcoGLsLVvNgybmeJxixN"} - Antigravity emits that escaped JSON error payload as
"type": "assistant_message"with"status": "completed", followed by a normalcheckpoint(same ACP error-surfacing gap as Antigravity quota exhaustion (HTTP 429) finishes the turn as completed instead of showing the usage-limit banner #28658). - Because
messages[1]is permanently at the head of that native Antigravity session's persisted history and the run endscompleted, every subsequent turn (turn:3, etc.) reuses the same poisonedproviderThreadIdand fails with the exact same raw JSONassistant_message, permanently bricking the thread.
(Side note from the same trace: during the claudeAgent -> antigravity full_thread_summary handoff right before turn:1, the handoff summary stopped at the first usage_limit error in run 182 and omitted runs 183–187 containing 5 subagent failure notification items, leaving the target provider unaware that the prior subagents had failed until it manually paginated t3_thread_read.)
Impact
Blocks work completely
Version or commit
t3 v0.1.6 (managed antigravity-acp with AGY_ACP_FORCE_FILE_STORAGE=1)
Environment
Linux host environment + Windows 11 client (T3 Code web/desktop), Provider: Antigravity (ACP), Model: claude-opus-5-5 (after provider handoff from claudeAgent claude-opus-5-5)
Logs or stack traces
// Sanitized timeline items from exported thread JSONL (runs 188-190):
// turn:1 first thinking block (succeeded across 17 tool rounds inside turn:1, later missing signature on turn:2/turn:3):
{
"id": "turn-item:provider:antigravity:native-item:provider-instance%3Aantigravity%3A<session-id>%3Aturn%3A1%3Areasoning%3A0",
"runId": "run:thread:<thread-id>:ordinal:188",
"providerThreadId": "provider-thread:provider:antigravity:native-thread:pending%3Arun%3Athread%3A<thread-id>%3Aordinal%3A188",
"providerTurnId": "provider-turn:provider:antigravity:native-turn:provider-instance%3Aantigravity%3A<session-id>%3Aturn%3A1",
"ordinal": 188000003,
"status": "completed",
"startedAt": "2026-11-01T19:50:39.912Z",
"completedAt": "2026-11-01T19:50:45.785Z",
"type": "reasoning"
}
// turn:1 interim assistant message (held open by background schedule timer until steer arrives at 19:54:39.357Z -> ends 16.08s later at 19:54:55.435Z):
{
"id": "turn-item:provider:antigravity:native-item:provider-instance%3Aantigravity%3A<session-id>%3Aturn%3A1%3Aassistant%3A0",
"runId": "run:thread:<thread-id>:ordinal:188",
"ordinal": 188000040,
"status": "completed",
"startedAt": "2026-11-01T19:53:52.705Z",
"completedAt": "2026-11-01T19:54:55.435Z",
"type": "assistant_message"
}
// User message promoted to steer while turn:1 was open:
{
"runId": "run:thread:<thread-id>:ordinal:188",
"nodeId": "node:run:run%3Athread%3A<thread-id>%3Aordinal%3A188:attempt:2:root",
"ordinal": 188000041,
"status": "completed",
"startedAt": "2026-11-01T19:54:39.357Z",
"type": "user_message",
"inputIntent": "promoted_queued_to_steer",
"text": "where are all of the subagents?"
}
// turn:2 fails after resume with missing thinking.signature, recorded as a completed assistant_message:
{
"id": "turn-item:provider:antigravity:native-item:provider-instance%3Aantigravity%3A<session-id>%3Aturn%3A2%3Aassistant%3A0",
"runId": "run:thread:<thread-id>:ordinal:188",
"providerTurnId": "provider-turn:provider:antigravity:native-turn:provider-instance%3Aantigravity%3A<session-id>%3Aturn%3A2",
"ordinal": 188000042,
"status": "completed",
"startedAt": "2026-11-01T19:57:23.175Z",
"completedAt": "2026-11-01T19:57:23.201Z",
"type": "assistant_message",
"text": "{\"type\":\"error\",\"error\":{\"type\":\"invalid_request_error\",\"message\":\"messages.1.content.0.thinking.signature: Field required\"},\"request_id\":\"req_vrtx_011CgcoGLsLVvNgybmeJxixN\"}",
"streaming": false
}
// turn:3 ("what happened?") on run ordinal 190 hits the exact same error 24s later because providerThreadId is permanently poisoned:
{
"id": "turn-item:provider:antigravity:native-item:provider-instance%3Aantigravity%3A<session-id>%3Aturn%3A3%3Aassistant%3A0",
"runId": "run:thread:<thread-id>:ordinal:190",
"providerTurnId": "provider-turn:provider:antigravity:native-turn:provider-instance%3Aantigravity%3A<session-id>%3Aturn%3A3",
"ordinal": 190000002,
"status": "completed",
"startedAt": "2026-11-01T19:58:30.772Z",
"completedAt": "2026-11-01T19:58:30.794Z",
"type": "assistant_message",
"text": "{\"type\":\"error\",\"error\":{\"type\":\"invalid_request_error\",\"message\":\"messages.1.content.0.thinking.signature: Field required\"},\"request_id\":\"req_vrtx_011CgcoMLAKCNDWNgMm4eKVd\"}",
"streaming": false
}Related issues:
- [Bug]: Steer on an Antigravity thread kills the turn (interruptTurn fails, then AcpProcessExitedError) #19689 (Steer on an Antigravity thread fails
interruptTurnafter ~15–16s, kills the ACP process, and forcessession/resumeon the next prompt) - Antigravity quota exhaustion (HTTP 429) finishes the turn as completed instead of showing the usage-limit banner #28658 (Antigravity ACP errors finish the turn as
completedinstead of surfacing a structured failure viaAntigravityAdapterV2)
Workaround
Switch the thread to a different provider (e.g., back to Claude) or switch models/providers for one turn so T3 Code allocates a fresh providerThreadId via context handoff instead of reusing the poisoned Antigravity session. Avoid using Steer while an Antigravity + Claude turn is open.
Activity
jamesdchen commentedon Nov 1, 2026
Follow-up from the same session (request id req_vrtx_011CgcoGLsLVvNgybmeJxixN).
The signature is never written, not stripped after the fact. In that Antigravity conversation the 17 planner steps have thinking text and thinking_signature length 0. Gemini sessions on the same install do store thinking_signature. The in-memory tool loop of the first turn succeeds. The next user turn replays from the database and Vertex rejects messages.1.content.0.thinking.signature.
So this is not only steer/resume. Any second Claude turn that emitted thinking hits it. Rotating to a fresh native session (as in #28889) avoids the brick. Continuing the same native session needs the signature kept on the Gemini thought part and put back on replay. A local proxy reinjection for that is in progress and was not live-verified: the Claude & GPT 5-hour quota was exhausted before a high-thinking second turn.
izahai commentedon Nov 5, 2026
I reproduced this live against the managed runtime (
antigravity-acp1.4.1,claude-opus-5-5-high,AGY_ACP_FORCE_FILE_STORAGE=1) with a standalone ACP client that sends the same calls T3 sends (clientInfo: zed,oauth-personal,session/resume). The runtime does write the signature to disk.session/resumeandsession/loadremove it.What breaks the session is a runtime restart, not a particular kind of turn. In my case the T3 desktop app restarted about 9 s after the first turn finished (update to 0.1.7). The next message started a new runtime and called
session/resume, and every turn after that failed withmessages.1.content.0.thinking.signature: Field required.Repro (no T3 UI involved)
conversations/<id>.db*session/new→ prompt (thinking) → prompt, same processsession/new→ prompt (thinking) →SIGKILLthe runtimesession/resume(no prompt)thinking.signature: Field required(req_vrtx_011CgiyuUD5RsvEqUXn69Myv)session/load→ promptreq_vrtx_011CgiyqNWAfcqRv4XjaZ4CB)* The planner step (
steps.step_type = 15) stores the thinking text at payload field20.3and the signature at20.14. Gemini planner steps use20.14as well. After resume or load, the runtime rewrites the step with20.3intact and20.14missing, so the data is lost for good. Restarting again can't bring it back.Step 2 alone is enough. Resuming without sending a prompt already rewrites the step without the signature.
Repro script (Node + Python, no dependencies): https://gist.github.com/izahai/60a69e79e03e351e18ad4befb8900f3e
What this means for #28889
session/resumeorsession/load. That covers app updates and restarts, idle reaping, steer timeouts ([Bug]: Steer on an Antigravity thread kills the turn (interruptTurn fails, then AcpProcessExitedError) #19689), and provider sign-out.20.14when it loads a step.Investigated with Claude Opus 5.5.
schneidervvv commentedon Nov 5, 2026
Live reproduction on
0.1.8-nightly.20261104.4192(7f6f47b27b44456f1c8214d3b566b375c09f629e) confirming both thesession/resumesignature stripping on delegated-subagent wakeup and the subsequentsession/new->session/loadretry loop before #28889.Environment
0.1.7-nightly.20261104.4151(macOSdarwin arm64, Kernel27.0.0)0.1.8-nightly.20261104.4192(7f6f47b27b44456f1c8214d3b566b375c09f629e), Nodev24.22.11.4.1,claude-opus-5-5-highWhat happened & timeline
05:46:29Z–05:52:57Z): Parent thread (b8219a14-..., native sessionfa686dee-...) ran 3 turns onclaude-opus-5-5-high(including asteering_restarton Turn 3 attempt 2 at05:51:59Z) and delegated 3 child threads (041e4791-...,47707934-...,c9071a90-...).session/newruntime without ever callingsession/resumeorsession/load. In their<session>.dbfiles, every planner step (step_type = 15, field20) still retains both20.3(thinking) and20.14(thinking_signature,CAQS...).fa686dee-...db, all 25 thinking steps have20.3(thinking) intact and20.14(thinking_signature) stripped after resume/load.06:28:51Z) — Subagent callback triggers coldsession/resume:initialize->authenticate->session/resume(06:28:54.250Z) ->session/set_config_option->session/prompt(06:28:56.712Z).400 invalid_request_error:messages.1.content.0.thinking.signature: Field required(req_vrtx_011CgjJrXHzg5WdFd8vZrPfm), recorded atsteps.idx = 67(step_type = 17).AntigravityTurnOutcome.ts(turnFailure, lines 95–127) readstep_type = 17and failed Run 5 (status = "failed"), flagging the adapter to restart its runtime before the next turn.06:31:24Z) —continuefalls back tosession/new+session/loadon the same poisoned session:continue),AcpAdapterV2restarted the runtime (restartRuntimeAfterTeardownIfRequired), which raninitialize->authenticate->session/new(06:31:29.158Z), and thenactivateSession(packages/provider-acp/src/server/adapter.ts:7061-7084) sawcanLoadSession === trueand calledsession/load(06:31:30.248Z) on the samefa686dee-...native session.session/prompt(06:31:32.138Z) failed again withmessages.1.content.0.thinking.signature: Field required(req_vrtx_011CgjK3xj23rcPGVDgP4apf,steps.idx = 69,step_type = 17).Evidence (
logs/provider/events.<thread>.log)Triaged with Antigravity (
gemini-4-argon-medium).