feat(clarify): ask multiple independent questions in one call - #89467
Merged
Merged
Conversation
૮ >ﻌ< ა ci reviewrunning on b782787 — docs(clarify): advertise the questions batch in the tool des waiting for more jobs to start…
|
The clarify tool gets an optional questions parameter (2-5 independent questions, issue #18450). Batch-capable platform callbacks receive the normalized list in one call and reply with per-question answers. Legacy callbacks are looped one question at a time. The loop stops on timeout so the user is not asked the remaining questions after they walk away. Locked answers survive a timeout: the result carries them plus a timed_out flag, and unanswered entries have an empty user_response. The single-question path is byte-identical to the previous behavior.
One clarify.request carries the question list (qid, question, choices, multi_select per entry). clarify.respond gains an optional question_id: each respond locks one answer, a repeat respond overwrites it, and the batch resolves when every question is locked. A respond without question_id keeps its existing meaning (cancel the whole prompt). Locked answers survive the deadline: a timed-out batch returns the partial answer map with a timed_out flag instead of an empty string. The reconnect replay snapshot also carries the locked answers, so a reattached client restores its per-question state. Both agent-side clarify dispatch sites forward the questions arg.
The clarify card renders every batch question at once. Answers stage locally per question; the footer button locks the staged answer with a clarify.respond keyed by question_id. Locked answers stay editable — a new pick un-locks the row and a re-lock overwrites server-side. When exactly one question is unanswered the button relabels to Confirm and continue, and that final lock completes the batch. Skip cancels the whole batch (no question_id). Reconnect replay seeds the locked map so a reattached window restores its earlier state. The settled card lists every question with its answer; blank answers render as Skipped. Single-question cards are untouched.
Batch clarify renders as a status list — every question on its own line (✓ answered / ▸ current / · pending) with only the active question's choices expanded, so a 5-question batch stays a few rows tall. Enter locks the active question's answer (clarify.respond with question_id) and the cursor jumps to the next unanswered question; Tab walks the question list to answer in any order; the hint reads 'confirm and continue' when one question remains. Esc cancels the whole batch. Answered rows collapse to '✓ question → answer'. The abandoned-prompt transcript record keeps locked partials (they survive a server-side timeout), and reconnect replay seeds them back into the overlay.
The clarify callback accepts a questions list and renders a batch panel. The batch panel shows all questions as a status list with one expanded active question. Enter locks the active answer and moves to the next unanswered question. Tab cycles questions for any-order answering. Locked answers stay editable until the batch completes. A timeout returns the locked partial answers with a timed_out flag. The single-question panel is unchanged.
A batch clarify rendered as two identical interactive cards. The tool.start row carries the model tool_call_id and the clarify.request row carries a gateway request_id. The hydration-race merge correlates the two rows with the top-level question text. A batch payload has no top-level question, so the rows never matched and the card mounted twice. The correlation key for a batch now comes from the joined per-question texts. The NUL separator cannot occur in real question text, so a batch key cannot collide with a single-question key. New coverage: two hydration-race tests for the batch shape (tool.start first and clarify.request first), a mock-server batch clarify trigger, and an E2E spec that runs the full chain and asserts exactly one card, the per-question locks, the Confirm and continue relabel, and the settled card.
The batch card previously locked each answer with its own Continue press. Now picks and typed answers stage locally, and one Confirm and continue button (enabled when every question has an answer) submits the whole batch. Staged answers stay editable until that confirm. The wire protocol is unchanged. The confirm sends the per-question locks in sequence, because the last lock resolves the blocked tool and each earlier lock must already be accepted when it lands. Replayed locked answers from a reconnect pre-stage their questions so restored progress stays visible. The TUI and CLI keep incremental per-question locks, so a timeout there still returns partial answers.
Shift-Tab walks backwards through the questions, with wrap, the same way Tab walks forward. A locked answer now renders on its own indented line in a distinct color under its question, instead of an arrow suffix on the status line, so the current answers stay readable while the cursor moves. A re-visited question restores its earlier state: a choice answer puts the cursor back on that choice, a typed answer highlights the Other row and shows the typed text next to it. Enter on an answered Other switches to freetext with the composer prefilled with the earlier text, so the user edits instead of retyping. Answer metadata records how each answer was produced to drive the restore.
The batch prompt had a separate browse mode: Tab toggled between the question list and the expanded question, and the arrows walked the list. Now Tab moves to the next question and Shift-Tab moves to the previous one, with wrap, and the active question is always the expanded one — the same model as the CLI panel. A locked answer now renders on its own indented line in the ok color under its question, instead of an arrow suffix on the status line, so the answers stay readable while Tab walks the list. A skipped (empty) answer renders muted and italic.
The mock server gains a batch clarify trigger that scripts a two-question clarify turn. The scripted turn fires only while the conversation has no tool result, so the answered batch falls through to the canned reply instead of a repeat of the quiz. The spec runs the real chain from composer to renderer and asserts one batch card, the staged-answers confirm gate, and the settled card. The local harness cannot boot the packaged app in this environment (the pre-existing chat spec fails the same way), so the proof for this spec is the CI run.
ethernet8023
force-pushed
the
ethie/clarify-multi
branch
from
August 19, 2026 00:35
fb249d4 to
42e8c24
Compare
…ited Tab or Shift-Tab onto an answered question now restores its state, the same model as the CLI panel. A choice answer puts the cursor back on its row. An answer that matches no choice was typed via Other, so the cursor lands on the Other row with the text staged in the input — Enter then edits the earlier text instead of starting blank. The restore logic lives in a pure helper (clarifyBatchRevisitState) with direct tests, because the prompt component has no keystroke harness.
The `questions` parameter had a full description, but the top-level tool description still described three single-question modes and never mentioned batching. The model decides how to call a tool from that description, so it kept asking one question per call. The description now states that 2-5 independent questions can go in one call and that one batched call is preferred over a chain of single-question calls. The parameter description also tells the model to put a short batch title in the still-required top-level question. Two schema tests pin the contract: the description names the batch capability, and the questions parameter stays optional with the MAX_QUESTIONS cap.
ethernet8023
enabled auto-merge (rebase)
August 19, 2026 01:23
19 tasks
1 task
gabrielcosi
pushed a commit
to gabrielcosi/home-ops
that referenced
this pull request
Sep 1, 2026
…8.27 ➔ v2026.8.31) (#606) This PR contains the following updates: | Package | Update | Change | |---|---|---| | [ghcr.io/gabrielcosi/hermes-agent](https://github.com/NousResearch/hermes-agent) | patch | `v2026.8.27` → `v2026.8.31` | --- ### Release Notes <details> <summary>NousResearch/hermes-agent (ghcr.io/gabrielcosi/hermes-agent)</summary> ### [`v2026.8.31`](https://github.com/NousResearch/hermes-agent/releases/tag/v2026.8.31): Hermes Agent v0.21.0 (v2026.8.31) [Compare Source](https://github.com/NousResearch/hermes-agent/compare/v2026.8.27...v2026.8.31) ##### Hermes Agent v0.21.0 (v2026.8.31) **Release Date:** August 31, 2026 **Since v0.20.0:** \~5,800 commits · \~2,475 merged PRs · \~5,680 files changed · \~869,000 insertions · \~135,000 deletions · **\~2,100 issues closed** · 760+ contributors > **The Pantheon Release.** v0.20.0 made Hermes the herald — he spoke, and he carried word to other agents. In v0.21.0 the gods assemble. Bot Mode ships built into the desktop app: a society of named agents with their own faces and group chats, where your bots talk to each other — and to you — like a team, not a toolbox. Around that spine: cron jobs gained memory and continuity so scheduled agents actually learn between runs, subagents can be steered live mid-flight, the MCP surface became a real command center, and the agent can now drive the desktop's own browser. This release rolls up everything from the v0.20.1–v0.20.6 infrastructure patch tags — those windows are fully documented here. *** ##### ✨ Highlights - **Bot Mode — your agents become a society, built in** — Bot Mode is now a bundled, default-on part of the desktop app: every agent profile gets a name, a deterministic avatar face (with randomize/lock controls), and a place in a shared roster. Create Discord-style group chats where multiple bots and you talk in one room, @​-mention any bot from the composer, and give rooms names and pictures. Before, "multi-agent" meant plumbing; now it looks like a chat app full of coworkers. ([#​87886](https://github.com/NousResearch/hermes-agent/pull/87886), [#​88243](https://github.com/NousResearch/hermes-agent/pull/88243), [#​89386](https://github.com/NousResearch/hermes-agent/pull/89386), [#​96726](https://github.com/NousResearch/hermes-agent/pull/96726) — [@​teknium1](https://github.com/teknium1), [@​OutThisLife](https://github.com/OutThisLife), [@​dokterdok](https://github.com/dokterdok)) - **`hermes peer` — bot-to-bot DMs between your agents** — Any Hermes agent can now message any other by handle, across profiles and gateways, from the CLI or from inside a conversation. Ask your research bot to hand findings to your coding bot and get the reply back where you can read it. Replies land in each agent's canonical Bot Chat, so conversations between agents are durable and inspectable, not fire-and-forget. ([#​88725](https://github.com/NousResearch/hermes-agent/pull/88725), [#​88178](https://github.com/NousResearch/hermes-agent/pull/88178), [#​91487](https://github.com/NousResearch/hermes-agent/pull/91487) — [@​teknium1](https://github.com/teknium1)) - **Cron jobs that remember** — Scheduled jobs stopped being goldfish. Cron agents now load and update persistent memory like every other agent, `continuity=true` carries each run's output into the next (so a monitor can dedupe against what it already reported), every job gets a durable notepad scratchpad, monitor-mode jobs skip the LLM entirely when nothing changed, and cron output can land in a bot's canonical Bot Chat — where the bot actually responds. Your 9am briefing job now knows what it told you yesterday. ([#​91447](https://github.com/NousResearch/hermes-agent/pull/91447), [#​80774](https://github.com/NousResearch/hermes-agent/pull/80774), [#​81139](https://github.com/NousResearch/hermes-agent/pull/81139), [#​81138](https://github.com/NousResearch/hermes-agent/pull/81138), [#​91487](https://github.com/NousResearch/hermes-agent/pull/91487) — [@​teknium1](https://github.com/teknium1), [@​smwbev](https://github.com/smwbev)) - **Steer your subagents while they run** — `delegate_task` gained live orchestration: list running children, steer one mid-flight with a course correction, or stop it early and keep the partial result. Add optional JSON-schema validation on child outputs, per-delegation cost surfaced in results, and raised defaults (250 iterations, 10 concurrent children) — delegation went from fire-and-pray to actually managed parallel work. ([#​85232](https://github.com/NousResearch/hermes-agent/pull/85232), [#​81144](https://github.com/NousResearch/hermes-agent/pull/81144), [#​81142](https://github.com/NousResearch/hermes-agent/pull/81142), [#​86506](https://github.com/NousResearch/hermes-agent/pull/86506), [#​86745](https://github.com/NousResearch/hermes-agent/pull/86745) — [@​teknium1](https://github.com/teknium1)) - **The MCP command center** — MCP servers and the catalog merged into one coherent desktop page with drag-in "paste anything" import, background health checks that nudge you to re-auth before a tool call fails, a fleet cost/usage overlay showing schema token estimates and 30-day usage per server, and `hermes://` deep links that install an MCP server with explicit confirmation. Managing twenty MCP servers used to be config-file archaeology; now it's a dashboard. ([#​87525](https://github.com/NousResearch/hermes-agent/pull/87525), [#​87572](https://github.com/NousResearch/hermes-agent/pull/87572), [#​87576](https://github.com/NousResearch/hermes-agent/pull/87576), [#​87579](https://github.com/NousResearch/hermes-agent/pull/87579), [#​87581](https://github.com/NousResearch/hermes-agent/pull/87581) — [@​teknium1](https://github.com/teknium1)) - **A CLI power wave** — Ctrl+P opens a fuzzy command palette, the `/model` picker filters as you type, `/status` shows reasoning mode, pending approvals, and context usage, and the status bar can display live cache-hit %, latency, and tokens/sec with per-field toggles. Plus: a global emergency stop, session pin/unpin, rotating task-oriented composer placeholders — and Ghostty-level **terminal pets**, because a companion should have a companion. ([#​90730](https://github.com/NousResearch/hermes-agent/pull/90730), [#​90717](https://github.com/NousResearch/hermes-agent/pull/90717), [#​90745](https://github.com/NousResearch/hermes-agent/pull/90745), [#​98250](https://github.com/NousResearch/hermes-agent/pull/98250), [#​98282](https://github.com/NousResearch/hermes-agent/pull/98282), [#​97666](https://github.com/NousResearch/hermes-agent/pull/97666) — [@​teknium1](https://github.com/teknium1), and salvaged community work) - **The agent drives the desktop's browser** — The in-app browser stopped being a window the agent could only look at: Hermes now navigates, clicks, and reads it directly, and pages can be popped out to your system browser with full link context menus. Ask it to walk a docs site or debug a web app and watch it happen inside your own app. ([#​90197](https://github.com/NousResearch/hermes-agent/pull/90197), [#​89366](https://github.com/NousResearch/hermes-agent/pull/89366) — [@​OutThisLife](https://github.com/OutThisLife), [@​ethernet8023](https://github.com/ethernet8023)) - **Six new providers and a model catalog wave** — Meta Model API (Muse Spark) arrives as a built-in provider, alongside CommandCode, Tencent TokenPlan, Nebius Token Factory, Ramp Router, and Actual Computer. The catalogs picked up GLM-5.3-Flash, qwen3.8-max/flash, Gemini 3.7 Flash, MiniMax M3 free, and Nemotron 3.5 Lightning — and `model_overrides` lets you patch any model's context window or pricing yourself without waiting on a release. ([#​88565](https://github.com/NousResearch/hermes-agent/pull/88565), [#​88308](https://github.com/NousResearch/hermes-agent/pull/88308), [#​97917](https://github.com/NousResearch/hermes-agent/pull/97917), [#​97916](https://github.com/NousResearch/hermes-agent/pull/97916), [#​97915](https://github.com/NousResearch/hermes-agent/pull/97915), [#​85560](https://github.com/NousResearch/hermes-agent/pull/85560) — [@​teknium1](https://github.com/teknium1) and community) - **Security hardening across the board** — Protected agent-instruction files (AGENTS.md, skills, memory stores) now always require write approval so a prompt-injected agent can't quietly rewrite its own standing orders. A deep redaction sweep closed secret-leak gaps across terminal errors, `.env` file reads, checkpoints, and ACP logs; the approval system learned Windows destructive commands; and macOS permission grants finally survive updates via a stable TCC signing identity. ([#​81152](https://github.com/NousResearch/hermes-agent/pull/81152), [#​80965](https://github.com/NousResearch/hermes-agent/pull/80965), [#​84428](https://github.com/NousResearch/hermes-agent/pull/84428), [#​95091](https://github.com/NousResearch/hermes-agent/pull/95091) — [@​teknium1](https://github.com/teknium1) and community) *** ##### 🏗️ Core Agent & Architecture ##### Providers & Models - **New providers:** Actual Computer inference ([#​79644](https://github.com/NousResearch/hermes-agent/pull/79644), salvage of [#​26491](https://github.com/NousResearch/hermes-agent/issues/26491)), CommandCode with GOAT/Pro/Max plans ([#​88308](https://github.com/NousResearch/hermes-agent/pull/88308), salvage of [#​32909](https://github.com/NousResearch/hermes-agent/issues/32909)), Meta Model API (Muse Spark) as a built-in provider plugin ([#​88565](https://github.com/NousResearch/hermes-agent/pull/88565)), Tencent TokenPlan ([#​97917](https://github.com/NousResearch/hermes-agent/pull/97917)), Nebius Token Factory ([#​97916](https://github.com/NousResearch/hermes-agent/pull/97916)), and Ramp Router ([#​97915](https://github.com/NousResearch/hermes-agent/pull/97915)). - **Model catalog wave:** qwen3.8-max and qwen3.8-flash ([#​78024](https://github.com/NousResearch/hermes-agent/pull/78024), [#​96979](https://github.com/NousResearch/hermes-agent/pull/96979)), Gemini 3.7 Flash ([#​85526](https://github.com/NousResearch/hermes-agent/pull/85526)), GLM-5.3-Flash across OpenRouter/Nous/z.ai/OpenCode ([#​95621](https://github.com/NousResearch/hermes-agent/pull/95621), [#​96293](https://github.com/NousResearch/hermes-agent/pull/96293)), MiniMax M3 + Inkling free SKUs ([#​96264](https://github.com/NousResearch/hermes-agent/pull/96264)), Nemotron 3.5 Lightning ([#​84645](https://github.com/NousResearch/hermes-agent/pull/84645)), Meta Muse Spark 1.2 ([#​88600](https://github.com/NousResearch/hermes-agent/pull/88600)). - **Per-model metadata overrides** via `model_overrides` config — patch context windows, pricing, or capabilities for any model without waiting on a release ([#​85560](https://github.com/NousResearch/hermes-agent/pull/85560)). - **Data-training-tier warnings** — a unified selection-guard registry warns you across every picker surface when a model trains on your data ([#​85917](https://github.com/NousResearch/hermes-agent/pull/85917)). - **Pip-installed model providers** discovered via entry points — third parties can ship providers as packages ([#​85504](https://github.com/NousResearch/hermes-agent/pull/85504), salvage [#​81419](https://github.com/NousResearch/hermes-agent/issues/81419)). - **Prompt caching engaged for LiteLLM Claude** on the OpenAI wire ([#​87517](https://github.com/NousResearch/hermes-agent/pull/87517) — [@​kshitijk4poor](https://github.com/kshitijk4poor)) and api.meta.ai routed through the Responses API for caching ([#​88601](https://github.com/NousResearch/hermes-agent/pull/88601)). - **Codex GPT context defaults** back to the verified 272K, with explicit -900k picker variants for the large window ([#​92797](https://github.com/NousResearch/hermes-agent/pull/92797)). ##### Agent Loop & Reliability - **Stalled-provider recovery** — a stalled stream no longer leaves Desktop silent or burns the retry budget ([#​87236](https://github.com/NousResearch/hermes-agent/pull/87236) — [@​fangliquanflq](https://github.com/fangliquanflq)). - **MoA hardening cluster** — the Mixture-of-Agents facade now survives client rebuilds, stream retries, provider rotation, and fallback/restore without leaking prepared requests to native clients ([#​90212](https://github.com/NousResearch/hermes-agent/pull/90212) and siblings). - **Structured-output resilience** — auxiliary calls translate `response_format` for Anthropic wires and retry when a provider rejects structured output ([#​89589](https://github.com/NousResearch/hermes-agent/pull/89589) — [@​ethernet8023](https://github.com/ethernet8023)). - **Compression: lean tail mode** + a compaction recall eval harness to measure what compression actually preserves ([#​87326](https://github.com/NousResearch/hermes-agent/pull/87326)). - **Oversized tool results spill to cache** instead of being truncated in sandbox-less sessions ([#​89028](https://github.com/NousResearch/hermes-agent/pull/89028)). - **`clarify` asks multiple independent questions in one call** — one form instead of a chain of round-trips ([#​89467](https://github.com/NousResearch/hermes-agent/pull/89467) — [@​ethernet8023](https://github.com/ethernet8023)). - **Verify subsystem** (port from superagent-ai/grok-cli): run-recipe detection + environment manifest so "it works" claims are backed by detected build/test commands ([#​80686](https://github.com/NousResearch/hermes-agent/pull/80686)). ##### Sessions & State - **Resumed transcripts never re-append** — `_db_persisted` stamped at row load time ([#​92539](https://github.com/NousResearch/hermes-agent/pull/92539) — [@​kshitijk4poor](https://github.com/kshitijk4poor)). - **SessionDB context-manager protocol** for leak-free DB lifecycles ([#​88048](https://github.com/NousResearch/hermes-agent/pull/88048) — [@​jackulau](https://github.com/jackulau)). - **Instant session naming** from the opening message, with sticky titles across resume ([#​81985](https://github.com/NousResearch/hermes-agent/pull/81985) — [@​OutThisLife](https://github.com/OutThisLife)). - **Session pin/unpin from the CLI** — durable keep flags ([#​80761](https://github.com/NousResearch/hermes-agent/pull/80761)). ##### 📱 Messaging Platforms (Gateway) - **Slack native live cards** — real streaming replies via chat.startStream plus opt-in plan/task cards for tool progress ([#​85476](https://github.com/NousResearch/hermes-agent/pull/85476)); outbound link-preview suppression across native and relay planes ([#​95142](https://github.com/NousResearch/hermes-agent/pull/95142) — [@​benbarclay](https://github.com/benbarclay)). - **Telegram inline picker** — every command and skill searchable via [@​botname](https://github.com/botname), bypassing Telegram's command-menu cap ([#​98317](https://github.com/NousResearch/hermes-agent/pull/98317)). - **Relay matured** — native static/dynamic plugin initialization ([#​77915](https://github.com/NousResearch/hermes-agent/pull/77915) — [@​bbednarski9](https://github.com/bbednarski9)), live-card ops with draft streaming + task cards ([#​85796](https://github.com/NousResearch/hermes-agent/pull/85796) — [@​victor-kyriazakos](https://github.com/victor-kyriazakos)), session-span segmentation ([#​85467](https://github.com/NousResearch/hermes-agent/pull/85467)), voice-note STT restored over the relay lane ([#​95274](https://github.com/NousResearch/hermes-agent/pull/95274) — [@​benbarclay](https://github.com/benbarclay)), transport dedupe/fail-fast fixes ([#​89584](https://github.com/NousResearch/hermes-agent/pull/89584)). - **Gateway control socket** — fleet consumers query the gateway itself (identify/status), and updaters pause gateways gracefully instead of tree-killing them ([#​92447](https://github.com/NousResearch/hermes-agent/pull/92447), [#​95695](https://github.com/NousResearch/hermes-agent/pull/95695)). - **Selective multiplex profile serving** ([#​83400](https://github.com/NousResearch/hermes-agent/pull/83400)), per-profile MCP lifecycle RPCs ([#​86473](https://github.com/NousResearch/hermes-agent/pull/86473)), roster previews showing the latest message ([#​85905](https://github.com/NousResearch/hermes-agent/pull/85905)), concise background-process notifications by default ([#​85877](https://github.com/NousResearch/hermes-agent/pull/85877)). - **Turn-reaper stack dumps** — when the watchdog fires, wedged worker stacks are captured for diagnosis ([#​86248](https://github.com/NousResearch/hermes-agent/pull/86248)), with loop-watchdog tuning knobs wired end-to-end ([#​92317](https://github.com/NousResearch/hermes-agent/pull/92317)). - **Split-delivery bug class closed** — swallowed finals and split deliveries fixed as a class ([#​79669](https://github.com/NousResearch/hermes-agent/pull/79669) — [@​kshitijk4poor](https://github.com/kshitijk4poor), salvages [#​78558](https://github.com/NousResearch/hermes-agent/issues/78558)). ##### 🖥️ Desktop App - **Bot Mode built in** — see Highlights. Full sub-catalog: attributed agent-to-agent message cards ([#​85855](https://github.com/NousResearch/hermes-agent/pull/85855)), sender-side delivery notices ([#​85888](https://github.com/NousResearch/hermes-agent/pull/85888)), paint-first hydration for instant wakes ([#​89510](https://github.com/NousResearch/hermes-agent/pull/89510)), editable group names and room pictures ([#​89371](https://github.com/NousResearch/hermes-agent/pull/89371)), Routines pane ([#​88731](https://github.com/NousResearch/hermes-agent/pull/88731)), rebuilt on the app design system ([#​96726](https://github.com/NousResearch/hermes-agent/pull/96726) — [@​OutThisLife](https://github.com/OutThisLife)). - **In-app browser the agent can drive** — the agent uses the desktop's browser tab, not just looks at it ([#​90197](https://github.com/NousResearch/hermes-agent/pull/90197) — [@​OutThisLife](https://github.com/OutThisLife)), with external-open + link context menus ([#​89366](https://github.com/NousResearch/hermes-agent/pull/89366)). - **Detached update hand-off on every OS** — quit → update → reopen with a single shim window; Windows desktop updates no longer park on "Updating Hermes" ([#​83634](https://github.com/NousResearch/hermes-agent/pull/83634), [#​90937](https://github.com/NousResearch/hermes-agent/pull/90937), [#​95897](https://github.com/NousResearch/hermes-agent/pull/95897)). - **Quality-of-life wave** — HUD snaps to cursor on ⌘⇧G ([#​83130](https://github.com/NousResearch/hermes-agent/pull/83130)), paste into the composer without focusing it ([#​84955](https://github.com/NousResearch/hermes-agent/pull/84955)), per-turn duration badges ([#​87245](https://github.com/NousResearch/hermes-agent/pull/87245)), readable macOS window translucency ([#​88744](https://github.com/NousResearch/hermes-agent/pull/88744)), Linux launcher entry ([#​76456](https://github.com/NousResearch/hermes-agent/pull/76456)), Linux keychain auto-detection ([#​84903](https://github.com/NousResearch/hermes-agent/pull/84903)), cron + blueprint recipes in the sidebar ([#​85162](https://github.com/NousResearch/hermes-agent/pull/85162)). - **Send Diagnostics** — error cards can upload a redacted debug bundle with a support handoff ([#​92020](https://github.com/NousResearch/hermes-agent/pull/92020)). - **Seq-stamped event replay** — lossless desktop reconnect over WebSocket ([#​94219](https://github.com/NousResearch/hermes-agent/pull/94219) — [@​kshitijk4poor](https://github.com/kshitijk4poor)). - **God-file decomposition** — the desktop codebase refactored into atomic modules ([#​89611](https://github.com/NousResearch/hermes-agent/pull/89611) — [@​OutThisLife](https://github.com/OutThisLife)). ##### 🖥️ CLI & TUI - See Highlights for the power wave (command palette, fuzzy /model, richer /status, live status-bar metrics, pets). - **`hermes approval-check`** — dry-run approval verdicts for a command without running it ([#​81137](https://github.com/NousResearch/hermes-agent/pull/81137)). - **Session titles in status bars** ([#​81947](https://github.com/NousResearch/hermes-agent/pull/81947)); subagent model exposed in the auxiliary-models picker ([#​80463](https://github.com/NousResearch/hermes-agent/pull/80463)). - **Ctrl+C fixed** — stopped pushing the Kitty keyboard protocol that broke interrupts ([#​87074](https://github.com/NousResearch/hermes-agent/pull/87074)). ##### 🔧 Tool System & MCP - **MCP command center** — see Highlights ([#​87525](https://github.com/NousResearch/hermes-agent/pull/87525) et al.). - **Interrupted commands no longer poison cwd** — the terminal won't adopt a stale working directory after an interrupt ([#​85654](https://github.com/NousResearch/hermes-agent/pull/85654) — [@​ethernet8023](https://github.com/ethernet8023)). - **Windows rename contention recovery** ([#​84852](https://github.com/NousResearch/hermes-agent/pull/84852) — [@​OutThisLife](https://github.com/OutThisLife)); colon-bearing session IDs no longer break sandbox mounts ([#​93488](https://github.com/NousResearch/hermes-agent/pull/93488), consolidated 6 PRs). - **Vision output uncapped** — aux vision calls stop clamping max\_tokens ([#​75253](https://github.com/NousResearch/hermes-agent/pull/75253) — [@​adikpb](https://github.com/adikpb)). - **Subagent work protected** — delegate no longer deletes a child's uncommitted work when git inspection fails ([#​88419](https://github.com/NousResearch/hermes-agent/pull/88419) — [@​kshitijk4poor](https://github.com/kshitijk4poor)). ##### 🧩 Skills Ecosystem - **Productivity skill wave** (salvaged from [@​community](https://github.com/community) proposals): document-to-action-items, meeting-action-items, email-inbox-triage, github-issue-to-pr, weekly-review-planning, competitor-news-monitor, product-price-monitor, social-media-content-calendar ([#​81185](https://github.com/NousResearch/hermes-agent/pull/81185), [#​81749](https://github.com/NousResearch/hermes-agent/pull/81749), [#​81672](https://github.com/NousResearch/hermes-agent/pull/81672), [#​81708](https://github.com/NousResearch/hermes-agent/pull/81708), [#​81936](https://github.com/NousResearch/hermes-agent/pull/81936), [#​81945](https://github.com/NousResearch/hermes-agent/pull/81945), [#​81906](https://github.com/NousResearch/hermes-agent/pull/81906), [#​81942](https://github.com/NousResearch/hermes-agent/pull/81942)). - **HAR-derived API clients** — watch a website once, then call its hidden API directly with no browser ([#​70823](https://github.com/NousResearch/hermes-agent/pull/70823)). - **publish-site** — versioned website publishing to GitHub/Cloudflare/Netlify Pages ([#​72189](https://github.com/NousResearch/hermes-agent/pull/72189)); **session-librarian** for prompt-driven session management ([#​84917](https://github.com/NousResearch/hermes-agent/pull/84917)); **blocked-page-recovery** fallback ladder ([#​84906](https://github.com/NousResearch/hermes-agent/pull/84906)); **merge-reconciler** for neutral multi-agent conflict resolution ([#​83063](https://github.com/NousResearch/hermes-agent/pull/83063)); Box productivity skill ([#​85767](https://github.com/NousResearch/hermes-agent/pull/85767)); ast-grep codemods ([#​80892](https://github.com/NousResearch/hermes-agent/pull/80892)); draw-your-font + simple-english optional skills ([#​80814](https://github.com/NousResearch/hermes-agent/pull/80814), [#​80811](https://github.com/NousResearch/hermes-agent/pull/80811)); plan-interrogation (evolved grill-me) ([#​97831](https://github.com/NousResearch/hermes-agent/pull/97831)). - **Advisory SKILL.md linter on create** ([#​81896](https://github.com/NousResearch/hermes-agent/pull/81896)); skills-hub live-repo fallback for missing optional skills ([#​82780](https://github.com/NousResearch/hermes-agent/pull/82780)). ##### ⏰ Cron, Delegation & Multi-Agent - **Cron memory + continuity** — see Highlights ([#​91447](https://github.com/NousResearch/hermes-agent/pull/91447), [#​80774](https://github.com/NousResearch/hermes-agent/pull/80774)). - **Monitor-mode jobs** with hash-suppressed change detection ([#​81138](https://github.com/NousResearch/hermes-agent/pull/81138)); per-job durable notepads ([#​81139](https://github.com/NousResearch/hermes-agent/pull/81139)); pre-dispatch config validation ([#​81140](https://github.com/NousResearch/hermes-agent/pull/81140)); acked failure signatures stop re-pinging ([#​95017](https://github.com/NousResearch/hermes-agent/pull/95017)); per-job reasoning-effort pinning ([#​91244](https://github.com/NousResearch/hermes-agent/pull/91244)); "Trigger now" executes immediately and safely ([#​70638](https://github.com/NousResearch/hermes-agent/pull/70638) — [@​smwbev](https://github.com/smwbev)); model-drift impact surfaced in Desktop ([#​83266](https://github.com/NousResearch/hermes-agent/pull/83266) — [@​ctaylor86](https://github.com/ctaylor86)). - **Live subagent orchestration** — see Highlights ([#​85232](https://github.com/NousResearch/hermes-agent/pull/85232)); structured-output schemas on delegate\_task ([#​81144](https://github.com/NousResearch/hermes-agent/pull/81144)); batch-quality validation before spawning ([#​81141](https://github.com/NousResearch/hermes-agent/pull/81141)); truncation markers on capped children ([#​86641](https://github.com/NousResearch/hermes-agent/pull/86641)). - **Kanban hardening** — collision-hotspot flagging ([#​83428](https://github.com/NousResearch/hermes-agent/pull/83428)), split-brain decision-ownership contract ([#​83424](https://github.com/NousResearch/hermes-agent/pull/83424)), memory-aware dispatch guard ([#​88115](https://github.com/NousResearch/hermes-agent/pull/88115)), notify/wake delivery modes ([#​85487](https://github.com/NousResearch/hermes-agent/pull/85487)). ##### 📊 Observability - **Model/provider usage reporting** and bounded tool-metrics aggregation land as an observability subsystem ([#​68881](https://github.com/NousResearch/hermes-agent/pull/68881), [#​68882](https://github.com/NousResearch/hermes-agent/pull/68882) — [@​afourniernv](https://github.com/afourniernv)), with lifecycle ops bounded so a wedged pipeline can never block the agent ([#​83514](https://github.com/NousResearch/hermes-agent/pull/83514) — [@​victor-kyriazakos](https://github.com/victor-kyriazakos)). ##### 🔒 Security & Reliability - **Protected instruction files** — writes to AGENTS.md/skills/memory always require approval ([#​81152](https://github.com/NousResearch/hermes-agent/pull/81152)). - **Redaction sweep** — emission gaps closed across env-name variants, control-splits, process(list), checkpoints ([#​80965](https://github.com/NousResearch/hermes-agent/pull/80965)); `.env` reads redacted via file-read detection ([#​80964](https://github.com/NousResearch/hermes-agent/pull/80964)); terminal exception results + ACP stderr ([#​81675](https://github.com/NousResearch/hermes-agent/pull/81675), [#​81686](https://github.com/NousResearch/hermes-agent/pull/81686)); SSH target logging ([#​88232](https://github.com/NousResearch/hermes-agent/pull/88232)). - **Windows approval coverage** — destructive Windows commands and paths now trip the approval system ([#​84428](https://github.com/NousResearch/hermes-agent/pull/84428)). - **Supply-chain response** — the Blender MCP catalog entry and skill were removed after an upstream compromise ([#​83404](https://github.com/NousResearch/hermes-agent/pull/83404)); plugin installs get Tier-1 security scanning ([#​80728](https://github.com/NousResearch/hermes-agent/pull/80728)). - **macOS TCC identity** — permission grants survive every update via `hermes desktop --setup-tcc-identity` ([#​95091](https://github.com/NousResearch/hermes-agent/pull/95091)). - **PKCE cookie fix** — SameSite=None over HTTPS with a matching clear path ([#​83536](https://github.com/NousResearch/hermes-agent/pull/83536) — [@​benbarclay](https://github.com/benbarclay)). ##### 🏗️ Infrastructure, CI & Packaging - **Real-OS CI** — macOS and Windows CI lanes with tests gated by real host OS ([#​77992](https://github.com/NousResearch/hermes-agent/pull/77992) — [@​ethernet8023](https://github.com/ethernet8023)); work lanes on 32-core runners ([#​92009](https://github.com/NousResearch/hermes-agent/pull/92009)); review comments + image builds moved out of the hot CI path ([#​82668](https://github.com/NousResearch/hermes-agent/pull/82668)). - **Bootstrap installer** no longer waits on pipe EOF ([#​90941](https://github.com/NousResearch/hermes-agent/pull/90941) — [@​OutThisLife](https://github.com/OutThisLife)). ##### 🐛 Notable Bug Fixes - Desktop session races (Stop→edit/resend, submit ownership) fixed as a cluster ([#​86594](https://github.com/NousResearch/hermes-agent/pull/86594)); workspace-pane idle flicker ([#​97513](https://github.com/NousResearch/hermes-agent/pull/97513)); assistant-ui boundary recovery ([#​81232](https://github.com/NousResearch/hermes-agent/pull/81232)). - Kanban schema re-creation when a cached DB path loses it ([#​83619](https://github.com/NousResearch/hermes-agent/pull/83619) — [@​JoaoMarcos44](https://github.com/JoaoMarcos44)). - Cron jobs no longer inherit a kanban worker's dispatcher identity ([#​79657](https://github.com/NousResearch/hermes-agent/pull/79657) — [@​kshitijk4poor](https://github.com/kshitijk4poor)); relay-fronted Slack cron delivery ([#​85340](https://github.com/NousResearch/hermes-agent/pull/85340) — [@​victor-kyriazakos](https://github.com/victor-kyriazakos)). - Model-picker serves cached custom-provider catalogs on no-probe opens ([#​81973](https://github.com/NousResearch/hermes-agent/pull/81973) — [@​austinpickett](https://github.com/austinpickett)). - Docker sandbox MEDIA attachments no longer silently drop ([#​94509](https://github.com/NousResearch/hermes-agent/pull/94509)); desktop binary attachments delivered into sandbox backends ([#​81717](https://github.com/NousResearch/hermes-agent/pull/81717)). - Session-hygiene compaction cooldown escalates on repeat failures ([#​79741](https://github.com/NousResearch/hermes-agent/pull/79741) — [@​kshitijk4poor](https://github.com/kshitijk4poor)). - Provider-injected parameter 400s retried instead of aborting the turn ([#​91643](https://github.com/NousResearch/hermes-agent/pull/91643)). - …and roughly two thousand more closed issues' worth — this window averaged \~85 merged PRs per day. ##### ↩️ Reverted in this window (not shipping) - **Model Council mode (/council)** — landed then reverted; not in this release. - **DCP context engine** — landed then reverted; not in this release. - **WS-only gateway server ([#​94245](https://github.com/NousResearch/hermes-agent/issues/94245))** — merged then reverted ([#​96118](https://github.com/NousResearch/hermes-agent/issues/96118)); FastAPI remains on the desktop boot path. The seq-stamped event replay ([#​94219](https://github.com/NousResearch/hermes-agent/issues/94219)) DID ship. - Electron rolled back to 40.10.2; TCC interpreter anchor removed (superseded by the signing-identity approach that shipped). ##### 👥 Contributors ##### Core Team (Nous Research) - **[@​teknium1](https://github.com/teknium1)** — release direction, Bot Mode, MCP command center, cron memory, and \~1,340 merged PRs - **[@​kshitijk4poor](https://github.com/kshitijk4poor)** (374 PRs) — gateway delivery classes, session persistence, event replay, MoA/caching fixes - **[@​OutThisLife](https://github.com/OutThisLife)** (209 PRs) — desktop architecture, Bot Mode UI, in-app browser, update hand-off - **[@​ethernet8023](https://github.com/ethernet8023)** (38 PRs) — OS-gated CI lanes, clarify multi-question, tool cwd safety, aux structured-output resilience - **[@​benbarclay](https://github.com/benbarclay)** (17 PRs) — relay voice STT, Slack link previews, PKCE - **[@​victor-kyriazakos](https://github.com/victor-kyriazakos)** (15 PRs) — relay live cards, observability bounding - **[@​rob-maron](https://github.com/rob-maron)**, **[@​austinpickett](https://github.com/austinpickett)**, **[@​jquesnelle](https://github.com/jquesnelle)**, **[@​shannonsands](https://github.com/shannonsands)** — providers, dashboard, model catalogs, and more ##### Top Community Contributors (by merged PR count) - **[@​helix4u](https://github.com/helix4u)** (31 PRs) — wake-word capture, session UX, fix wave across desktop and gateway - **[@​fangliquanflq](https://github.com/fangliquanflq)** (17 PRs) — stalled-provider recovery and agent-loop resilience - **[@​bbednarski9](https://github.com/bbednarski9)** — relay native plugin integration; **[@​HexLab98](https://github.com/HexLab98)**, **[@​xxxigm](https://github.com/xxxigm)**, **[@​afourniernv](https://github.com/afourniernv)** (observability), **[@​liuhao1024](https://github.com/liuhao1024)**, **[@​Christopher-Schulze](https://github.com/Christopher-Schulze)**, **[@​Adolanium](https://github.com/Adolanium)**, **[@​webtecnica](https://github.com/webtecnica)**, **[@​smwbev](https://github.com/smwbev)** (cron Trigger-now), **[@​ctaylor86](https://github.com/ctaylor86)** (cron drift in Desktop), **[@​JoaoMarcos44](https://github.com/JoaoMarcos44)** (kanban schema recovery), **[@​jackulau](https://github.com/jackulau)** (SessionDB context manager), **[@​adikpb](https://github.com/adikpb)** (vision output caps), **[@​dokterdok](https://github.com/dokterdok)** (Bot Mode unification), and many more. ##### All Contributors Huge thanks to every one of the 760+ people who contributed code, co-authored fixes, or had their work salvaged into this release: [@​03farren](https://github.com/03farren), [@​0xarkstar](https://github.com/0xarkstar), [@​0xGr1mm](https://github.com/0xGr1mm), [@​0xWhiteMage](https://github.com/0xWhiteMage), [@​100yenadmin](https://github.com/100yenadmin), [@​1052326311](https://github.com/1052326311), [@​29206394](https://github.com/29206394), [@​2ndNatureAI](https://github.com/2ndNatureAI), [@​3Nya3](https://github.com/3Nya3), [@​3x3xX3N0N](https://github.com/3x3xX3N0N), [@​404Dealer](https://github.com/404Dealer), [@​4adwentures](https://github.com/4adwentures), [@​5Hyeons](https://github.com/5Hyeons), [@​686f6c61](https://github.com/686f6c61), [@​69k4xmdfm2-blip](https://github.com/69k4xmdfm2-blip), [@​6ylqq](https://github.com/6ylqq), [@​75day](https://github.com/75day), [@​a-espinoza](https://github.com/a-espinoza), [@​A-Snegin](https://github.com/A-Snegin), [@​a-yeyang](https://github.com/a-yeyang), [@​a0000001](https://github.com/a0000001), [@​A2chitect](https://github.com/A2chitect), [@​abitme](https://github.com/abitme), [@​abundantbeing](https://github.com/abundantbeing), [@​acewong7](https://github.com/acewong7), [@​acgh213](https://github.com/acgh213), [@​adamcap926](https://github.com/adamcap926), [@​addelh](https://github.com/addelh), [@​adikpb](https://github.com/adikpb), [@​Adolanium](https://github.com/Adolanium), [@​adurham](https://github.com/adurham), [@​adybag14-cyber](https://github.com/adybag14-cyber), [@​afourniernv](https://github.com/afourniernv), [@​ag9920](https://github.com/ag9920), [@​ahmadalzaro1](https://github.com/ahmadalzaro1), [@​Ahmett101](https://github.com/Ahmett101), [@​ai-ag2026](https://github.com/ai-ag2026), [@​AIalliAI](https://github.com/AIalliAI), [@​aider4ryder](https://github.com/aider4ryder), [@​Ailirag](https://github.com/Ailirag), [@​Aintworth](https://github.com/Aintworth), [@​airo7](https://github.com/airo7), [@​AiwendilInTheWoods](https://github.com/AiwendilInTheWoods), [@​akivavh](https://github.com/akivavh), [@​AL-ZiLLA](https://github.com/AL-ZiLLA), [@​Al3xand3r1987](https://github.com/Al3xand3r1987), [@​albertodepaola](https://github.com/albertodepaola), [@​aldoeliacim](https://github.com/aldoeliacim), [@​aleksclark](https://github.com/aleksclark), [@​AlexanderPrendota](https://github.com/AlexanderPrendota), [@​alexdev03](https://github.com/alexdev03), [@​AlexFucuson9](https://github.com/AlexFucuson9), [@​AlexGabbia](https://github.com/AlexGabbia), [@​AlexMnrs](https://github.com/AlexMnrs), [@​algf](https://github.com/algf), [@​Allecpu](https://github.com/Allecpu), [@​allin2](https://github.com/allin2), [@​alt-glitch](https://github.com/alt-glitch), [@​amanning3390](https://github.com/amanning3390), [@​andrexibiza](https://github.com/andrexibiza), [@​andyst-dev](https://github.com/andyst-dev), [@​angel12](https://github.com/angel12), [@​angeon922-collab](https://github.com/angeon922-collab), [@​Angriff36](https://github.com/Angriff36), [@​aniruddhaadak80](https://github.com/aniruddhaadak80), [@​annguyenNous](https://github.com/annguyenNous), [@​anuvratrastogi](https://github.com/anuvratrastogi), [@​Aoshi-Dev](https://github.com/Aoshi-Dev), [@​appletechie](https://github.com/appletechie), [@​arccat-114](https://github.com/arccat-114), [@​arcimun](https://github.com/arcimun), [@​ArthurFranckPat](https://github.com/ArthurFranckPat), [@​aryaxo](https://github.com/aryaxo), [@​asdasdadhj](https://github.com/asdasdadhj), [@​ashah360](https://github.com/ashah360), [@​AshuJoshi](https://github.com/AshuJoshi), [@​asimons81](https://github.com/asimons81), [@​assimovt](https://github.com/assimovt), [@​austinpickett](https://github.com/austinpickett), [@​AVW7](https://github.com/AVW7), [@​Axmr1](https://github.com/Axmr1), [@​aydnOktay](https://github.com/aydnOktay), [@​ayushnangia](https://github.com/ayushnangia), [@​baihemax](https://github.com/baihemax), [@​bananawalnut](https://github.com/bananawalnut), [@​Bartok9](https://github.com/Bartok9), [@​bashrusakh](https://github.com/bashrusakh), [@​bbednarski9](https://github.com/bbednarski9), [@​BearHuddleston](https://github.com/BearHuddleston), [@​benbarclay](https://github.com/benbarclay), [@​benfrank241](https://github.com/benfrank241), [@​beplee](https://github.com/beplee), [@​bgrablin](https://github.com/bgrablin), [@​bka9](https://github.com/bka9), [@​BkashJEE](https://github.com/BkashJEE), [@​BlackishGreen33](https://github.com/BlackishGreen33), [@​BlakeB254](https://github.com/BlakeB254), [@​blunkjamie-dev](https://github.com/blunkjamie-dev), [@​BobClawblaw](https://github.com/BobClawblaw), [@​bradmarshall987](https://github.com/bradmarshall987), [@​brian717](https://github.com/brian717), [@​briandevans](https://github.com/briandevans), [@​BrianFranco](https://github.com/BrianFranco), [@​BrinShadewater](https://github.com/BrinShadewater), [@​brucexu-eth](https://github.com/brucexu-eth), [@​BrunoBza](https://github.com/BrunoBza), [@​buffpesos](https://github.com/buffpesos), [@​burak33bb](https://github.com/burak33bb), [@​C-EXCITE-STUDIO](https://github.com/C-EXCITE-STUDIO), [@​c-pompa](https://github.com/c-pompa), [@​cadezhou](https://github.com/cadezhou), [@​calvinnwq](https://github.com/calvinnwq), [@​capt-marbles](https://github.com/capt-marbles), [@​carbongotfound](https://github.com/carbongotfound), [@​carlotestor](https://github.com/carlotestor), [@​Carry00](https://github.com/Carry00), [@​cation98](https://github.com/cation98), [@​ccowan93](https://github.com/ccowan93), [@​cedricziel](https://github.com/cedricziel), [@​cervantesh](https://github.com/cervantesh), [@​cfdude](https://github.com/cfdude), [@​Chadmc9889](https://github.com/Chadmc9889), [@​CharZhou](https://github.com/CharZhou), [@​chelsealong](https://github.com/chelsealong), [@​chesterXalan](https://github.com/chesterXalan), [@​chillerno1](https://github.com/chillerno1), [@​Christopher-Schulze](https://github.com/Christopher-Schulze), [@​chukirk-svg](https://github.com/chukirk-svg), [@​cicav](https://github.com/cicav), [@​citizendev9c](https://github.com/citizendev9c), [@​cj52973](https://github.com/cj52973), [@​clarkvines](https://github.com/clarkvines), [@​ClintonEmok](https://github.com/ClintonEmok), [@​clyu168](https://github.com/clyu168), [@​cmoiccool](https://github.com/cmoiccool), [@​codexbt](https://github.com/codexbt), [@​coe0718](https://github.com/coe0718), [@​Cossackx](https://github.com/Cossackx), [@​coygeek](https://github.com/coygeek), [@​crazyhulk](https://github.com/crazyhulk), [@​CrazyWillBear](https://github.com/CrazyWillBear), [@​criptogus](https://github.com/criptogus), [@​cryptoyasenka](https://github.com/cryptoyasenka), [@​ctaylor86](https://github.com/ctaylor86), [@​cvillarroel2](https://github.com/cvillarroel2), [@​cxxCoolStar](https://github.com/cxxCoolStar), [@​cycorld](https://github.com/cycorld), [@​dagbs](https://github.com/dagbs), [@​damadorPL](https://github.com/damadorPL), [@​DanBennettUK](https://github.com/DanBennettUK), [@​DanDo385](https://github.com/DanDo385), [@​DannyFengTianYu](https://github.com/DannyFengTianYu), [@​Dannyzen](https://github.com/Dannyzen), [@​danspicytaco](https://github.com/danspicytaco), [@​dante32683](https://github.com/dante32683), [@​darko-mesaros](https://github.com/darko-mesaros), [@​daromaj](https://github.com/daromaj), [@​david-bartos-phrase](https://github.com/david-bartos-phrase), [@​davidgut1982](https://github.com/davidgut1982), [@​DavidMetcalfe](https://github.com/DavidMetcalfe), [@​davidneyravyr](https://github.com/davidneyravyr), [@​daxro](https://github.com/daxro), [@​dcdexhome](https://github.com/dcdexhome), [@​deacon-botdoctor](https://github.com/deacon-botdoctor), [@​deadczarvc](https://github.com/deadczarvc), [@​deaneeth](https://github.com/deaneeth), [@​DECRUX9812](https://github.com/DECRUX9812), [@​deepeet-git](https://github.com/deepeet-git), [@​deniqlab](https://github.com/deniqlab), [@​DeseretSaint](https://github.com/DeseretSaint), [@​dhanesh](https://github.com/dhanesh), [@​Dhruv7201](https://github.com/Dhruv7201), [@​dhruvkej9](https://github.com/dhruvkej9), [@​digitalbase](https://github.com/digitalbase), [@​DmytroVolodymyrson](https://github.com/DmytroVolodymyrson), [@​dokterdok](https://github.com/dokterdok), [@​Dolverin](https://github.com/Dolverin), [@​dombejar](https://github.com/dombejar), [@​doncazper](https://github.com/doncazper), [@​dougatbuck](https://github.com/dougatbuck), [@​douxy1994](https://github.com/douxy1994), [@​dpersek](https://github.com/dpersek), [@​dplush](https://github.com/dplush), [@​Drexuxux](https://github.com/Drexuxux), [@​drissman](https://github.com/drissman), [@​dromai](https://github.com/dromai), [@​dtownsel](https://github.com/dtownsel), [@​duclucky](https://github.com/duclucky), [@​Dudeman456](https://github.com/Dudeman456), [@​Dusk1e](https://github.com/Dusk1e), [@​dvbaecker](https://github.com/dvbaecker), [@​e-macgregor](https://github.com/e-macgregor), [@​EAbaracus](https://github.com/EAbaracus), [@​eaglezzz0522-cloud](https://github.com/eaglezzz0522-cloud), [@​Eapwrk](https://github.com/Eapwrk), [@​easyvibecoding](https://github.com/easyvibecoding), [@​echoes666](https://github.com/echoes666), [@​egilewski](https://github.com/egilewski), [@​ehz0ah](https://github.com/ehz0ah), [@​ekinnee](https://github.com/ekinnee), [@​ekzhang](https://github.com/ekzhang), [@​elbukott1](https://github.com/elbukott1), [@​elisam0](https://github.com/elisam0), [@​elphamale](https://github.com/elphamale), [@​ElSnacko](https://github.com/ElSnacko), [@​embwl0x](https://github.com/embwl0x), [@​emozilla](https://github.com/emozilla), [@​EMT5320](https://github.com/EMT5320), [@​EndeavorYen](https://github.com/EndeavorYen), [@​Enough1122](https://github.com/Enough1122), [@​enwaiax](https://github.com/enwaiax), [@​epeterpanz](https://github.com/epeterpanz), [@​EpicIsTheOne](https://github.com/EpicIsTheOne), [@​eric-senyao](https://github.com/eric-senyao), [@​ernst-bablick](https://github.com/ernst-bablick), [@​Eros-ITA](https://github.com/Eros-ITA), [@​erosika](https://github.com/erosika), [@​ethernet8023](https://github.com/ethernet8023), [@​etzelvon](https://github.com/etzelvon), [@​EvanProgramming](https://github.com/EvanProgramming), [@​EvenXieWF](https://github.com/EvenXieWF), [@​explainanalyze](https://github.com/explainanalyze), [@​f-trycua](https://github.com/f-trycua), [@​fanfan343](https://github.com/fanfan343), [@​fangliquanflq](https://github.com/fangliquanflq), [@​fattchris](https://github.com/fattchris), [@​felix-windsor](https://github.com/felix-windsor), [@​Finn763](https://github.com/Finn763), [@​flaviovargasbrandao](https://github.com/flaviovargasbrandao), [@​Fly-onlyone](https://github.com/Fly-onlyone), [@​flyingdoubleG](https://github.com/flyingdoubleG), [@​forkercat](https://github.com/forkercat), [@​francialisomlimoeiro](https://github.com/francialisomlimoeiro), [@​francip](https://github.com/francip), [@​frankmendes1979](https://github.com/frankmendes1979), [@​fred0m](https://github.com/fred0m), [@​frendo](https://github.com/frendo), [@​frizikk](https://github.com/frizikk), [@​frohsinnllc](https://github.com/frohsinnllc), [@​Frowtek](https://github.com/Frowtek), [@​fukutake1207](https://github.com/fukutake1207), [@​fyzanshaik](https://github.com/fyzanshaik), [@​GarlicGo](https://github.com/GarlicGo), [@​Gateton](https://github.com/Gateton), [@​georgell-ceo](https://github.com/georgell-ceo), [@​gfriesen1](https://github.com/gfriesen1), [@​gigabyte22](https://github.com/gigabyte22), [@​gigashad](https://github.com/gigashad), [@​gijoby](https://github.com/gijoby), [@​gitong](https://github.com/gitong), [@​gkd2323c](https://github.com/gkd2323c), [@​gnanirahulnutakki](https://github.com/gnanirahulnutakki), [@​GodsBoy](https://github.com/GodsBoy), [@​gokay-ai](https://github.com/gokay-ai), [@​goktugvatandas](https://github.com/goktugvatandas), [@​golldyck](https://github.com/golldyck), [@​goodchang77](https://github.com/goodchang77), [@​GottZ](https://github.com/GottZ), [@​grahfmusic](https://github.com/grahfmusic), [@​gregorustar-maker](https://github.com/gregorustar-maker), [@​greyvito](https://github.com/greyvito), [@​gsy324](https://github.com/gsy324), [@​guanla-zz](https://github.com/guanla-zz), [@​guilhermeartileshubsai](https://github.com/guilhermeartileshubsai), [@​guilhermeraiuga](https://github.com/guilhermeraiuga), [@​h-mascot](https://github.com/h-mascot), [@​h8hawk](https://github.com/h8hawk), [@​Haakam21](https://github.com/Haakam21), [@​Haik-G](https://github.com/Haik-G), [@​halaprix](https://github.com/halaprix), [@​Halldrix](https://github.com/Halldrix), [@​handnewb](https://github.com/handnewb), [@​Hangzian](https://github.com/Hangzian), [@​hanhvs](https://github.com/hanhvs), [@​hansai-art](https://github.com/hansai-art), [@​HAOWANG116](https://github.com/HAOWANG116), [@​HarishDarko](https://github.com/HarishDarko), [@​hbentel](https://github.com/hbentel), [@​helix4u](https://github.com/helix4u), [@​HenryGHJ](https://github.com/HenryGHJ), [@​hermias1](https://github.com/hermias1), [@​HexLab98](https://github.com/HexLab98), [@​hillimited](https://github.com/hillimited), [@​Hjharris1](https://github.com/Hjharris1), [@​hkfiberlaser-svg](https://github.com/hkfiberlaser-svg), [@​honor2030](https://github.com/honor2030), [@​howdeploy](https://github.com/howdeploy), [@​hsearcy](https://github.com/hsearcy), [@​huklaa](https://github.com/huklaa), [@​hustwkr](https://github.com/hustwkr), [@​hutao562](https://github.com/hutao562), [@​hxwvaa](https://github.com/hxwvaa), [@​IAvecilla](https://github.com/IAvecilla), [@​icemeng](https://github.com/icemeng), [@​infinitycrew39](https://github.com/infinitycrew39), [@​infocentr](https://github.com/infocentr), [@​InphinitiZ](https://github.com/InphinitiZ), [@​insane66613](https://github.com/insane66613), [@​Inspired-by-Atmosphere](https://github.com/Inspired-by-Atmosphere), [@​intelac](https://github.com/intelac), [@​intellectronica](https://github.com/intellectronica), [@​isak-ialogics](https://github.com/isak-ialogics), [@​ishanparihar](https://github.com/ishanparihar), [@​isheng-eqi](https://github.com/isheng-eqi), [@​Ishman82](https://github.com/Ishman82), [@​iskysun96](https://github.com/iskysun96), [@​iso2kx](https://github.com/iso2kx), [@​itsflownium](https://github.com/itsflownium), [@​izumi0uu](https://github.com/izumi0uu), [@​Jaaneek](https://github.com/Jaaneek), [@​Jackal991](https://github.com/Jackal991), [@​jackijianxa](https://github.com/jackijianxa), [@​jackoconner45](https://github.com/jackoconner45), [@​jackulau](https://github.com/jackulau), [@​jaimedhenriques](https://github.com/jaimedhenriques), [@​james47kjv](https://github.com/james47kjv), [@​jbagdonas](https://github.com/jbagdonas), [@​jcjc81](https://github.com/jcjc81), [@​jdgg777](https://github.com/jdgg777), [@​jeeves-assistant](https://github.com/jeeves-assistant), [@​jeff-mettel](https://github.com/jeff-mettel), [@​Jefftree](https://github.com/Jefftree), [@​JElfferich](https://github.com/JElfferich), [@​jeremyrandria-debug](https://github.com/jeremyrandria-debug), [@​JinUltimate1995](https://github.com/JinUltimate1995), [@​jirathip-k](https://github.com/jirathip-k), [@​jmmaloney4](https://github.com/jmmaloney4), [@​JoaoMarcos44](https://github.com/JoaoMarcos44), [@​joe-rodgers](https://github.com/joe-rodgers), [@​joe050860](https://github.com/joe050860), [@​John-Lussier](https://github.com/John-Lussier), [@​Johnny-xuan](https://github.com/Johnny-xuan), [@​johnrazmus](https://github.com/johnrazmus), [@​johnsonAyo](https://github.com/johnsonAyo), [@​jonpol01](https://github.com/jonpol01), [@​JonthanaHanh](https://github.com/JonthanaHanh), [@​JoshPaulie](https://github.com/JoshPaulie), [@​Jreevo](https://github.com/Jreevo), [@​jtstothard](https://github.com/jtstothard), [@​Julientalbot](https://github.com/Julientalbot), [@​justcarlosm](https://github.com/justcarlosm), [@​justinbowes](https://github.com/justinbowes), [@​justinjohnson25600](https://github.com/justinjohnson25600), [@​jwtor7](https://github.com/jwtor7), [@​k0rnacki](https://github.com/k0rnacki), [@​kadiratesdev](https://github.com/kadiratesdev), [@​Kailigithub](https://github.com/Kailigithub), [@​kaishi00](https://github.com/kaishi00), [@​KarateWilly](https://github.com/KarateWilly), [@​kas-cor](https://github.com/kas-cor), [@​katie-lpd](https://github.com/katie-lpd), [@​Kavyrocom](https://github.com/Kavyrocom), [@​KBANTH](https://github.com/KBANTH), [@​kchernev](https://github.com/kchernev), [@​KeaneYan](https://github.com/KeaneYan), [@​kernel-t1](https://github.com/kernel-t1), [@​KeroZelvin](https://github.com/KeroZelvin), [@​kerpopule](https://github.com/kerpopule), [@​KHALIDagara](https://github.com/KHALIDagara), [@​KhanCold](https://github.com/KhanCold), [@​khanhngoo](https://github.com/khanhngoo), [@​KIAgent01](https://github.com/KIAgent01), [@​kim-miram](https://github.com/kim-miram), [@​kimyxx](https://github.com/kimyxx), [@​Kinkoolino-Hermes](https://github.com/Kinkoolino-Hermes), [@​kinsolee](https://github.com/kinsolee), [@​kitsonk](https://github.com/kitsonk), [@​klaus765](https://github.com/klaus765), [@​koltyj](https://github.com/koltyj), [@​konsisumer](https://github.com/konsisumer), [@​kronexoi](https://github.com/kronexoi), [@​krunkosaurus](https://github.com/krunkosaurus), [@​kshitijk4poor](https://github.com/kshitijk4poor), [@​kudapara](https://github.com/kudapara), [@​kvnloo](https://github.com/kvnloo), [@​kweiner](https://github.com/kweiner), [@​kyssta-exe](https://github.com/kyssta-exe), [@​Kyzcreig](https://github.com/Kyzcreig), [@​laithrw](https://github.com/laithrw), [@​lakshyaag-tavily](https://github.com/lakshyaag-tavily), [@​landaun](https://github.com/landaun), [@​laulopezreal](https://github.com/laulopezreal), [@​laviesony](https://github.com/laviesony), [@​lazy-idler](https://github.com/lazy-idler), [@​LBeghini](https://github.com/LBeghini), [@​leeclouddragon](https://github.com/leeclouddragon), [@​Leegenux](https://github.com/Leegenux), [@​LemonSchneid](https://github.com/LemonSchneid), [@​LeonardoLGDS](https://github.com/LeonardoLGDS), [@​leonphull](https://github.com/leonphull), [@​LeonSGP43](https://github.com/LeonSGP43), [@​lepetitprince716-prog](https://github.com/lepetitprince716-prog), [@​Lesnak1](https://github.com/Lesnak1), [@​lesterlxt](https://github.com/lesterlxt), [@​lesyuk](https://github.com/lesyuk), [@​lEWFkRAD](https://github.com/lEWFkRAD), [@​lextiz](https://github.com/lextiz), [@​lgy1027](https://github.com/lgy1027), [@​Lidang-Jiang](https://github.com/Lidang-Jiang), [@​lilShawtty-byte](https://github.com/lilShawtty-byte), [@​lin-hongkuan](https://github.com/lin-hongkuan), [@​liuhao1024](https://github.com/liuhao1024), [@​liusencomic-cyber](https://github.com/liusencomic-cyber), [@​lkz-de](https://github.com/lkz-de), [@​loafoe](https://github.com/loafoe), [@​locker95](https://github.com/locker95), [@​LordMelkor](https://github.com/LordMelkor), [@​lorzl](https://github.com/lorzl), [@​lost9999](https://github.com/lost9999), [@​loulanyue](https://github.com/loulanyue), [@​LovePlayCode](https://github.com/LovePlayCode), [@​luckygreen](https://github.com/luckygreen), [@​lukeroberts](https://github.com/lukeroberts), [@​luoxiao6645](https://github.com/luoxiao6645), [@​luxles](https://github.com/luxles), [@​m1k3s0](https://github.com/m1k3s0), [@​Mabolla](https://github.com/Mabolla), [@​MagMueller](https://github.com/MagMueller), [@​magnus919](https://github.com/magnus919), [@​magnuslundstedt](https://github.com/magnuslundstedt), [@​MaheshBhushan](https://github.com/MaheshBhushan), [@​MarcoFernstaedt](https://github.com/MarcoFernstaedt), [@​mariobgsp](https://github.com/mariobgsp), [@​marketing2981](https://github.com/marketing2981), [@​markmcd](https://github.com/markmcd), [@​markmnl](https://github.com/markmnl), [@​MarkVLK](https://github.com/MarkVLK), [@​marzukia](https://github.com/marzukia), [@​Mat-London](https://github.com/Mat-London), [@​matsvarn](https://github.com/matsvarn), [@​mattprusak](https://github.com/mattprusak), [@​MaximCrabbe](https://github.com/MaximCrabbe), [@​maxmilian](https://github.com/maxmilian), [@​mehmetkr-31](https://github.com/mehmetkr-31), [@​Mengchee118](https://github.com/Mengchee118), [@​menhguin](https://github.com/menhguin), [@​metamindedu](https://github.com/metamindedu), [@​michaelHMK](https://github.com/michaelHMK), [@​michaelsam94](https://github.com/michaelsam94), [@​milnerrad](https://github.com/milnerrad), [@​MindDragonLabs](https://github.com/MindDragonLabs), [@​misterdas](https://github.com/misterdas), [@​mjolley9](https://github.com/mjolley9), [@​mmcallister8](https://github.com/mmcallister8), [@​mmcclean-aws](https://github.com/mmcclean-aws), [@​mmchuangyt-ai](https://github.com/mmchuangyt-ai), [@​moisesvalero](https://github.com/moisesvalero), [@​mollusk](https://github.com/mollusk), [@​monerostar](https://github.com/monerostar), [@​Morad37](https://github.com/Morad37), [@​mrkillbob](https://github.com/mrkillbob), [@​mrmixx-max](https://github.com/mrmixx-max), [@​mrsucesso](https://github.com/mrsucesso), [@​MrTheSoulz](https://github.com/MrTheSoulz), [@​MustafaK99](https://github.com/MustafaK99), [@​myk0la-b](https://github.com/myk0la-b), [@​mzkarami](https://github.com/mzkarami), [@​n-leezy](https://github.com/n-leezy), [@​n1majne3](https://github.com/n1majne3), [@​NaMinhyeok](https://github.com/NaMinhyeok), [@​nanami7777777](https://github.com/nanami7777777), [@​nankingjing](https://github.com/nankingjing), [@​natebransc](https://github.com/natebransc), [@​nateEc](https://github.com/nateEc), [@​Navlem](https://github.com/Navlem), [@​nbxuhk](https://github.com/nbxuhk), [@​nductien](https://github.com/nductien), [@​Ne0teric](https://github.com/Ne0teric), [@​NealZhouPanda](https://github.com/NealZhouPanda), [@​necoweb3](https://github.com/necoweb3), [@​negroni334](https://github.com/negroni334), [@​nftpoetrist](https://github.com/nftpoetrist), [@​nicochase](https://github.com/nicochase), [@​Nicolas-Formenton](https://github.com/Nicolas-Formenton), [@​nicolasdmolina](https://github.com/nicolasdmolina), [@​nikitaBarkov](https://github.com/nikitaBarkov), [@​NikolaRHristov](https://github.com/NikolaRHristov), [@​noahingh](https://github.com/noahingh), [@​nolanchic](https://github.com/nolanchic), [@​NorethSea](https://github.com/NorethSea), [@​notkisk](https://github.com/notkisk), [@​notwitcheer](https://github.com/notwitcheer), [@​NousResearch](https://github.com/NousResearch), [@​null-runner](https://github.com/null-runner), [@​ojassharma7](https://github.com/ojassharma7), [@​oliver-mee](https://github.com/oliver-mee), [@​olympusbuildz](https://github.com/olympusbuildz), [@​OmarB97](https://github.com/OmarB97), [@​ooiuuii](https://github.com/ooiuuii), [@​openclaww-xz](https://github.com/openclaww-xz), [@​opti-josh-holt](https://github.com/opti-josh-holt), [@​osgeek90](https://github.com/osgeek90), [@​ousiaresearch](https://github.com/ousiaresearch), [@​OutThisLife](https://github.com/OutThisLife), [@​Owen-narcissus](https://github.com/Owen-narcissus), [@​paoloantinori](https://github.com/paoloantinori), [@​Parker-Fawcett](https://github.com/Parker-Fawcett), [@​pasevin](https://github.com/pasevin), [@​pasmud](https://github.com/pasmud), [@​PaulBlackSwan](https://github.com/PaulBlackSwan), [@​paultaki](https://github.com/paultaki), [@​peetteerr](https://github.com/peetteerr), [@​pefontana](https://github.com/pefontana), [@​Per0-1](https://github.com/Per0-1), [@​pierrenode](https://github.com/pierrenode), [@​PINKIIILQWQ](https://github.com/PINKIIILQWQ), [@​pittosporum-seu](https://github.com/pittosporum-seu), [@​pju-hoge](https://github.com/pju-hoge), [@​plcunha](https://github.com/plcunha), [@​Pluviobyte](https://github.com/Pluviobyte), [@​pmos69](https://github.com/pmos69), [@​pnascimento9596](https://github.com/pnascimento9596), [@​poisdahl](https://github.com/poisdahl), [@​potatosalad](https://github.com/potatosalad), [@​prashantjain25](https://github.com/prashantjain25), [@​PRATHAMESH75](https://github.com/PRATHAMESH75), [@​professorpalmer](https://github.com/professorpalmer), [@​projetsjsl](https://github.com/projetsjsl), [@​protas-box](https://github.com/protas-box), [@​qazasdsdqaza](https://github.com/qazasdsdqaza), [@​QDung210](https://github.com/QDung210), [@​qixuancao](https://github.com/qixuancao), [@​QuarkAssistant](https://github.com/QuarkAssistant), [@​quocanh261997](https://github.com/quocanh261997), [@​ragingbulld](https://github.com/ragingbulld), [@​rainbowgore](https://github.com/rainbowgore), [@​rapsealk](https://github.com/rapsealk), [@​Raven26-VooDoo](https://github.com/Raven26-VooDoo), [@​RaviTharuma](https://github.com/RaviTharuma), [@​RayCharlizard](https://github.com/RayCharlizard), [@​razultull](https://github.com/razultull), [@​re-ITRT](https://github.com/re-ITRT), [@​Reksely](https://github.com/Reksely), [@​RelaxJonh](https://github.com/RelaxJonh), [@​repfigit](https://github.com/repfigit), [@​RGerrish](https://github.com/RGerrish), [@​RibatTRW](https://github.com/RibatTRW), [@​RichardGuan1](https://github.com/RichardGuan1), [@​RichardHojunJang](https://github.com/RichardHojunJang), [@​richardhowes](https://github.com/richardhowes), [@​RickyYii](https://github.com/RickyYii), [@​rikkarth](https://github.com/rikkarth), [@​rille111](https://github.com/rille111), [@​Ringo6107](https://github.com/Ringo6107), [@​rjhilgefort](https://github.com/rjhilgefort), [@​rjvandeve](https://github.com/rjvandeve), [@​rkfshakti](https://github.com/rkfshakti), [@​rlaope](https://github.com/rlaope), [@​Rmohid](https://github.com/Rmohid), [@​rob-maron](https://github.com/rob-maron), [@​rodrigogs](https://github.com/rodrigogs), [@​royalaid](https://github.com/royalaid), [@​royzhrxy-glitch](https://github.com/royzhrxy-glitch), [@​rroverin](https://github.com/rroverin), [@​rshi0212](https://github.com/rshi0212), [@​rsk-731](https://github.com/rsk-731), [@​rtcopenclawgh](https://github.com/rtcopenclawgh), [@​ruangraung](https://github.com/ruangraung), [@​rudrakshchahal](https://github.com/rudrakshchahal), [@​ruochu88s](https://github.com/ruochu88s), [@​rweddle](https://github.com/rweddle), [@​ryankhart](https://github.com/ryankhart), [@​S-Claw](https://github.com/S-Claw), [@​Sahil-SS9](https://github.com/Sahil-SS9), [@​salch-cred](https://github.com/salch-cred), [@​sam7894604](https://github.com/sam7894604), [@​samclams](https://github.com/samclams), [@​saralilyb](https://github.com/saralilyb), [@​sashmatash](https://github.com/sashmatash), [@​sasquatch9818](https://github.com/sasquatch9818), [@​satotakumi](https://github.com/satotakumi), [@​ScaleLeanChris](https://github.com/ScaleLeanChris), [@​SeashoreShi](https://github.com/SeashoreShi), [@​serefyarar](https://github.com…
53 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What does this PR do?
The
clarifytool gets an optionalquestionsparameter. The agent can ask 2-5 independent questions in one call. Before this change, the agent asked one question per call. Each extra question cost a full round-trip, and composite questions caused a combinatorial explosion of choices (#18450).The user answers the questions in any order. If the prompt times out part-way on the TUI or the CLI, the answers the user already locked are kept: the tool result carries them with a
timed_outflag, and unanswered entries stay blank. This lets the agent tell a deliberate skip from an absent user.Behavior per surface:
✓answered /▸active /·pending) with the active question always expanded. Enter locks the active answer and moves to the next unanswered question. Tab and Shift-Tab cycle the questions in both directions, with wrap. A locked answer renders on its own indented line in a distinct color under its question. On the CLI, a re-visited question restores the earlier selection, a typed answer stays visible next to the Other row, and Enter on an answered Other prefills the input for editing.cli

tui

desktop

The single-question path is byte-identical to the previous behavior on every surface.
Wire protocol: one
clarify.requestcarries the question list with server-generated per-question ids.clarify.respondgets an optionalquestion_idthat locks or overwrites one answer. A respond withoutquestion_idkeeps its existing meaning (cancel). The reconnect replay snapshot carries the locked answers, so a reattached client restores its state. The update-in-place shape also leaves room for a follow-up that persists interim answers in the session database.This PR also fixes a duplicate-card bug found during testing: the desktop hydration-race merge correlated the
tool.startrow and theclarify.requestrow through the top-levelquestiontext, which a batch payload does not have, so the batch card mounted twice. The correlation key for a batch now comes from the joined per-question texts.Related work: PR #70129 proposes a separate
clarify_formtool for the same issue. This PR extends the existing tool instead, so no new core tool ships on every API call.Deferred to follow-ups, by design: interim answer persistence in the session database, TUI multi-select, a desktop checkbox affordance for multi-select, and the CLI answer-restore behavior on the TUI.
Related Issue
Fixes #18450
Closes #70129
Type of Change
Changes Made
tools/clarify_tool.py— thequestionsschema parameter, batch validation, batch dispatch, and a sequential fallback loop for legacy callbacks. The loop stops on timeout and keeps collected answers.tui_gateway/server.py— batchclarify.requestemission, a per-request answer accumulator, partial-answer return on timeout, and locked-answer replay on reconnect.agent/agent_runtime_helpers.py,agent/tool_executor.py— forward thequestionsargument at both clarify dispatch sites.apps/desktop/src/components/assistant-ui/clarify-tool.tsx,apps/desktop/src/store/clarify.ts,apps/desktop/src/app/session/hooks/use-message-stream/gateway-event.ts— the batch card with local staging and a single confirm, batch store state, and the batch event path.apps/desktop/src/lib/chat-messages.ts— the batch correlation key (batchClarifyMatchValue) that fixes the duplicate-card bug.apps/desktop/src/i18n/*— new labels in all five locales.apps/desktop/e2e/batch-clarify.spec.ts,apps/desktop/e2e/mock-server.ts— an E2E spec for the batch card (one card, staged answers, single confirm, settled card) and the mock trigger that scripts the batch turn.ui-tui/src/components/prompts.tsx,ui-tui/src/app/useMainApp.ts,ui-tui/src/app/createGatewayEventHandler.ts,ui-tui/src/lib/text.ts— the compact batch prompt with Tab/Shift-Tab cycling, per-question respond plumbing, and the batch abandoned-prompt record.cli.py— the compact batch panel with Tab/Shift-Tab cycling, answer lines in a distinct color, selection restore on re-visit, and Other edit-prefill.website/docs/reference/tools-reference.md— a section on multi-question batches per surface.tests/tools/test_clarify_tool.py,tests/tui_gateway/test_protocol.py,tests/cli/test_cli_clarify_batch.py(new),apps/desktop/src/store/clarify.test.ts,apps/desktop/src/components/assistant-ui/clarify-tool.test.tsx,apps/desktop/src/app/session/hooks/use-message-stream/clarify-hydration.test.tsx,ui-tui/src/lib/text.test.ts,ui-tui/src/__tests__/createGatewayEventHandler.test.ts.How to Test
scripts/run_tests.sh tests/tools/test_clarify_tool.py tests/tui_gateway/test_protocol.py tests/test_tui_gateway_server.py tests/cli/test_cli_clarify_batch.py -q. Expected: all tests pass (705 on this branch after the latest rebase).npx vitest runinui-tui. Expected: full suite passes (1676 passed, 4 skipped).npm run test:uiinapps/desktop. Expected: full suite passes (4824 on this branch).clarifywith aquestionsarray. Stage answers in any order, edit one, and submit with the single confirm. Repeat in the TUI and the classic CLI with Tab/Shift-Tab and Enter.timed_out: true.npx playwright test e2e/batch-clarify.spec.tsinapps/desktop(requiresnpm run buildfirst). Note: the E2E harness does not boot on the author's NixOS machine — the pre-existingchat.spec.tsfails the samewaitForAppReadytimeout there — so the authoritative run for both specs is CI.Checklist
Code
fix(scope):,feat(scope):, etc.)pytest tests/ -qand all tests passDocumentation & Housekeeping
docs/, docstrings) — or N/Acli-config.yaml.exampleif I added/changed config keys — or N/A (no config keys changed)CONTRIBUTING.mdorAGENTS.mdif I changed architecture or workflows — or N/A (no workflow change)Screenshots / Logs
Final test sweep on this branch, after the rebase onto current
main:Desktop: full
test:uisuite 4824/4824, clarify layer 122/122. TUI: 1676 passed, 4 skipped, typecheck clean.