Repository navigation
[Bug]: Antigravity questions accept a typed answer, then send it to the agent as cancelled ("User Skipped") #21951
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 a thread with the Antigravity provider (seen with
gemini-4-argon-high). - Ask the agent to use its own question tool to ask a multiple-choice question, for example "Which colour?" with the options Red and Blue.
- When the question card appears, don't pick an option. Type an answer in the composer instead, such as
Green, please, and submit it.
Answering through T3's t3_pending_request_respond MCP tool with {"interaction_…": "Green, please"} gives the same result.
Expected behavior
The agent receives the typed answer. If Antigravity's interaction_* questions can only return one of their options, T3 should not offer a typed answer on them at all, as the adapter already intends (it marks them allowCustomAnswer: false; see below).
Actual behavior
The card closes as answered and T3 saves the typed text (orchestration_v2_projection_runtime_requests.payload_json → answers), but the agent's question tool returns User Skipped, and T3's transcript shows the tool call as failed with Interaction cancelled. The agent carries on as if the question was skipped. Picking a listed option works: the agent receives Red.
Cause, at main @ 54983e3:
extractAntigravityUserInputQuestion(apps/server/src/provider/acp/AntigravityProtocol.ts:125-153) builds the question withallowCustomAnswer: false, because thesesession/request_permissionquestions can only be answered with one of theiroptionIds.- The Antigravity flavor's
extractPermissionQuestion(apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.ts:195-211) copies that question field by field and leaves outallowCustomAnswer, along with each option'svalue. The question that reaches clients has noallowCustomAnswer, and the web composer only blocks typed answers when it isfalse(apps/web/src/pendingUserInput.ts), so typing is allowed. makeAntigravityUserInputResponse(AntigravityProtocol.ts:156-174) matches the answer only to an option id or an exact label, and returnsundefinedfor anything else. ThehandleRequestPermissioncallback (packages/provider-acp/src/server/adapter.ts:5223-5244) turnsundefinedinto{ outcome: { outcome: "cancelled" } }.
From source, not run: because the composer treats these questions as open, it also accepts a file attached to the answer (#9871). The server appends the attachment's path to the answer text (appendUserInputAttachmentPaths), so even a picked option with an attachment would no longer match and would go out as cancelled.
Claude threads are not affected; their AskUserQuestion answers pass through as text.
A likely fix is to carry allowCustomAnswer (and the option values) through extractPermissionQuestion, so clients show the fixed-choice state and refuse typed answers and attachments instead of losing them.
Related: #15743 and PR #19659 enable form elicitation for Antigravity; they don't change this session/request_permission path. #21005 is the same symptom for Factory Droid, with a different cause.
Impact
Major degradation or frequent failure
Version or commit
T3 Code Nightly 0.1.1-nightly.20261019.3373 (first seen on the 18 Oct 2026 nightly); source checked at main @ 54983e3
Environment
macOS 27.2 (Apple silicon), T3 Code Nightly desktop, Antigravity provider (ACP agent 1.3.0), gemini-4-argon-high
Logs or stack traces
# Question as delivered to clients (no allowCustomAnswer):
{"id":"interaction_b0b9a6eb","header":"Question","question":"Repro test: which colour?",
"options":[{"label":"Red","description":"Red"},{"label":"Blue","description":"Blue"}],"multiSelect":false}
# Typed answer sent: {"interaction_b0b9a6eb": "Green, please"}
# Agent's tool result: A1: User Skipped
# Control, same build: {"interaction_b3c8c5e3": "Red"}
# Agent's tool result: A1: Red
# Saved turn items, for both runs above and in the thread where this first happened:
# typed answer -> dynamic_tool status "failed", output "Interaction cancelled"
# picked option -> dynamic_tool status "completed", output "Response received"Screenshots, recordings, or supporting files
No response
Workaround
Pick one of the listed options, then send anything else as a normal message.
Activity
juliusmarminge commentedon Oct 19, 2026
Note
Grok responding on behalf of Julius.
Thanks for tracing this end to end. Current main matches it.
The Antigravity protocol builds these questions with
allowCustomAnswer: falseand option values set to the native option ids (apps/server/src/provider/acp/AntigravityProtocol.ts:125-153). The V2 adapter then rebuilds the question with only labels and descriptions and leavesallowCustomAnswerout (apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.ts:195-211). The web composer only blocks typed answers when that field is explicitly false (apps/web/src/pendingUserInput.ts:61-68). A typed answer that matches no option id or label makes the response helper return nothing (AntigravityProtocol.ts:156-174), and the shared ACP handler then sends a cancel (packages/provider-acp/src/server/adapter.ts:5240-5244).The open ACP form question pull request doesn't change this function.
Accepting this as a bug. For now, picking one of the listed options instead of typing works.