Disclosure: this issue was drafted by an AI agent (Claude) while testing kagent 1.x on Agent
Substrate, and reviewed by a human before filing.
Summary
On the Claude Code harness an agent cannot ask the user a question through the HITL extension:
there is no ask_user tool. The kagent (Go ADK) runtime and the Codex harness both have one, and
the human-in-the-loop docs describe ask_user as a built-in tool that "is automatically added to
every agent".
What happens
As a user I ask an agent on the Claude Code harness to use ask_user to let me choose between two
options. The turn completes instead of pausing, and Claude answers:
I don't actually have an `ask_user` tool available in my current toolset. However, I can ask you
directly!
On the kagent and Codex runtimes the same request pauses the task in TASK_STATE_INPUT_REQUIRED
with an ask_user_request in the https://kagent.dev/extensions/hitl/v1 metadata, and the answer
resumes the turn.
Reproduce
On kagent v1.0.0-alpha2 with Agent Substrate and a claude Harness, any AgentTemplate under that
Harness, a client that sends the a2a-extensions: https://kagent.dev/extensions/hitl/v1 header,
and the message Use the ask_user tool to ask me which database I prefer, offering the choices PostgreSQL and MySQL. Then tell me which one I chose.
Ask
Give the Claude Code harness the same ask-user path as the Codex harness, so an agent can pause a
turn to ask the user a question on every runtime.
Where the gap is: only the Codex driver creates ask-user requests
The shared harness runtime already handles ask-user requests end to end
(go/harness/runtime/a2a/executor.go: runtime.AskUserRequest becomes an ask_user_request, and
the answer is validated and passed back as runtime.AskUserResponse). Only the Codex driver
produces them (go/harness/codex/internal/driver/process.go, decodeAskUserRequest, from Codex's
request_user_input). The Claude driver has no such path.
Two possible routes, neither verified:
- Claude Code has a built-in question tool (
AskUserQuestion). The driver restricts built-in tools
with --tools (bareBuiltinTools = "Bash,Edit,Read,Write,Glob,Grep,WebSearch,WebFetch"), so it
is not available today; the driver could allow it and translate its calls into ask-user requests.
- The harness already serves tool approval to Claude Code through an MCP permission-prompt tool
(--permission-prompt-tool); an ask_user MCP tool served the same way would pause the turn
through the same broker.
Scope
- Observed on kind with kagent
v1.0.0-alpha2 and Agent Substrate 0.2.0-beta5. Source-confirmed
on main (2026-09-23).
- Tool approval (
requireApproval) works on the Claude Code harness: approve, deny, and the
plain-text hint without the extension all behave as on the other runtimes.
Summary
On the Claude Code harness an agent cannot ask the user a question through the HITL extension:
there is no
ask_usertool. The kagent (Go ADK) runtime and the Codex harness both have one, andthe human-in-the-loop docs describe
ask_useras a built-in tool that "is automatically added toevery agent".
What happens
As a user I ask an agent on the Claude Code harness to use
ask_userto let me choose between twooptions. The turn completes instead of pausing, and Claude answers:
On the kagent and Codex runtimes the same request pauses the task in
TASK_STATE_INPUT_REQUIREDwith an
ask_user_requestin thehttps://kagent.dev/extensions/hitl/v1metadata, and the answerresumes the turn.
Reproduce
On kagent
v1.0.0-alpha2with Agent Substrate and aclaudeHarness, any AgentTemplate under thatHarness, a client that sends the
a2a-extensions: https://kagent.dev/extensions/hitl/v1header,and the message
Use the ask_user tool to ask me which database I prefer, offering the choices PostgreSQL and MySQL. Then tell me which one I chose.Ask
Give the Claude Code harness the same ask-user path as the Codex harness, so an agent can pause a
turn to ask the user a question on every runtime.
Where the gap is: only the Codex driver creates ask-user requests
The shared harness runtime already handles ask-user requests end to end
(
go/harness/runtime/a2a/executor.go:runtime.AskUserRequestbecomes anask_user_request, andthe answer is validated and passed back as
runtime.AskUserResponse). Only the Codex driverproduces them (
go/harness/codex/internal/driver/process.go,decodeAskUserRequest, from Codex'srequest_user_input). The Claude driver has no such path.Two possible routes, neither verified:
AskUserQuestion). The driver restricts built-in toolswith
--tools(bareBuiltinTools = "Bash,Edit,Read,Write,Glob,Grep,WebSearch,WebFetch"), so itis not available today; the driver could allow it and translate its calls into ask-user requests.
(
--permission-prompt-tool); anask_userMCP tool served the same way would pause the turnthrough the same broker.
Scope
v1.0.0-alpha2and Agent Substrate0.2.0-beta5. Source-confirmedon
main(2026-09-23).requireApproval) works on the Claude Code harness: approve, deny, and theplain-text hint without the extension all behave as on the other runtimes.