Release v0.51.99 (Release BW / stage-392 / 5-PR batch) - #2652
Merged
Merged
Conversation
Compact tool activity regressed into separate Activity rows and standalone Thinking blurbs when interim assistant text retired the current live activity group and Thinking rendered outside the disclosure. Render Compact-mode Thinking inside the shared Activity body for live and settled turns, keep interim assistant text from splitting the current Activity group, and remove the now-unused stream-local activity-close path. This restores the intended single compact disclosure without adding new functionality.
…tale responses are rejected
The WebUI clarification popup had a response-delivery failure: users
submitted answers in the popup, but the agent still fell through to the
timeout fallback message. Three bugs conspired:
1. No stable clarify_id — _ClarifyEntry had no unique identifier, so
the frontend could not reference a specific pending prompt. The
backend used FIFO resolution which silently failed for stale/late
responses.
2. Frontend hid the card before confirmation — respondClarify() called
hideClarifyCard(true, 'sent') BEFORE the API call completed. If the
backend rejected the response, the card was already gone and the
user's draft was discarded.
3. Backend lied about success — _resolve_clarify_legacy() returned
bool(resolved) or not bool(clarify_id). Since the frontend never
sent clarify_id, the backend always reported ok:true even when
nothing was resolved.
Changes:
api/clarify.py:
- _ClarifyEntry now auto-generates a stable clarify_id (uuid4.hex[:12])
- submit_pending() injects clarify_id into the data dict visible to the
frontend via SSE and polling
- New resolve_clarify_by_id() for O(1) lookup by id instead of FIFO pop
api/routes.py:
- _resolve_clarify_legacy() uses resolve_clarify_by_id when clarify_id
is provided; returns actual bool result (no more unconditional True)
- _handle_clarify_respond() returns HTTP 409 + {ok:false, stale:true}
when resolution fails
static/messages.js:
- respondClarify() now sends clarify_id in the POST body
- Waits for a positive backend acknowledgement before hiding the card
- Saves a draft copy before POST and restores it on failure
- On 409/network error: re-enables controls, shows error toast
- Guards against parallel-SSE race where clearing the cache after a
successful response could erase a newly queued next prompt (codex P1)
tests:
- Updated test_sprint30.py for new ack-before-hide behaviour
- Updated test_clarify_unblock.py for 409 on stale responses
Closes #2639.
SysAdminDoc
pushed a commit
to SysAdminDoc/hermes-webui
that referenced
this pull request
Jun 26, 2026
Release v0.51.99 (Release BW / stage-392 / 5-PR batch)
bernyforce
pushed a commit
to bernyforce/hermes-webui
that referenced
this pull request
Jul 29, 2026
Release v0.51.99 (Release BW / stage-392 / 5-PR batch)
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.
Release v0.51.99 — Release BW (stage-392) — 5-PR medium-risk batch
Mixed-risk follow-on batch picking up 5 small/moderate contributor PRs that look self-contained, agent-reviewed (where applicable), and CI-green.
Constituents
message_idkeys, preserving the v0.51.96 invariant. 97 LOC acrossapi/models.py+ 2 static + 2 tests. The previously-failingtest_state_db_reconciliation_preserves_same_second_state_repeatsnow passes against the rebased branch.api/agent_sessions.py+ test.auxiliary.title_generation.api_keyfor config-derived title routes. Completes the fix: honor configured title generation model #2612 / v0.51.96 work. Thecaller_supplied_routeguard prevents API-key leakage to active-agent fallback routes. 97 LOC inapi/streaming.py+ test.api/streaming.py+ test.clarify_id+ backend ack before hiding clarify popup. Three-bug fix: server-side UUID id + ID-based resolver + frontend wait-for-ack. Agent reviewed in depth, all three follow-up notes addressed by contributor. 117 LOC acrossapi/clarify.py+api/routes.py+static/messages.js+ 2 tests.Pre-Opus gate
static/messages.js,static/ui.js.pyfiles**PR TBD**placeholdersapi/streaming.py— verified disjoint hunks (1369-1399 vs 2199-5337)Streaming surface — browser sanity required
Per the "PRs touching api/streaming.py + api/routes.py need browser API check" rule:
generate_title_raw_via_aux()— title generation only fires async after a chat turn, no SSE surface_merge_display_messages_after_agent_result()— post-compression display merge path, exercised on auto-compression continuation_handle_clarify_respondat the routes layer — clarify popup roundtripStats
5 PRs, ~553 LOC net change, 15 files. Surfaces: clarify roundtrip + CLI sidebar perf + title aux routing + compression replay dedup + compact tool activity renderer. No new UI surfaces, no schema/contract changes.
Will run pytest + Opus advisor + browser sanity in parallel before merging.