Skip to content

[Bug]: Antigravity questions accept a typed answer, then send it to the agent as cancelled ("User Skipped") #21951

Closed

Description

@cornishandy

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 with the Antigravity provider (seen with gemini-4-argon-high).
  2. 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.
  3. 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 with allowCustomAnswer: false, because these session/request_permission questions can only be answered with one of their optionIds.
  • The Antigravity flavor's extractPermissionQuestion (apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.ts:195-211) copies that question field by field and leaves out allowCustomAnswer, along with each option's value. The question that reaches clients has no allowCustomAnswer, and the web composer only blocks typed answers when it is false (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 returns undefined for anything else. The handleRequestPermission callback (packages/provider-acp/src/server/adapter.ts:5223-5244) turns undefined into { 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

  1. juliusmarminge commented on Oct 19, 2026

    @juliusmarminge
    Member

    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: false and 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 leaves allowCustomAnswer out (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.

  2. added
    acceptedfeature request accepted
    bugSomething is broken or behaving incorrectly.
    via-triageFiled through npx t3 triage
    on Oct 19, 2026
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

    acceptedfeature request acceptedbugSomething is broken or behaving incorrectly.via-triageFiled through npx t3 triage

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions