Release BG — stage-376 — 12-PR contributor batch
Twelve well-scoped contributor fixes across run-state consistency, live-streaming UX, cron + gateway plumbing, and stale i18n help text.
Run-state consistency
- #2438 by @franksong2702 (fixes #2435) — Keep the default-off
HERMES_WEBUI_RUNTIME_ADAPTER=legacy-journalchat-start response identical to the legacy-direct response; don't expose adapter-internalrun_id/status/active_controlson the public/api/chat/startpayload. - #2439 by @franksong2702 (fixes #2434) — Recover already-journaled visible assistant text and tool cards even when restart repair first syncs a populated Hermes core transcript into an otherwise empty WebUI sidecar. Closes the rare carve-out from PR #2427.
- #2444 by @franksong2702 (fixes #2442) — Refresh session context-window metadata when a session's resolved model changes during deferred hydration or via
/api/session/update. High-context models no longer stay stuck on the previous model's smaller window. - #2445 by @Michaelyklam (fixes #2443) — Add an in-module catalog + local Codex
models_cache.jsonfingerprint to/api/modelscache validation. Catalog changes invalidate the persisted cache on restart instead of waiting 24 hours. - #2455 by @franksong2702 (fixes #2454) — Reconcile the active-session sidebar spinner against fresh
/api/sessionspayloads. Clears staleS.busy/S.activeStreamId/INFLIGHTstate when the server reports the row as idle.
Live-streaming UX
- #2441 by @Michaelyklam (fixes #2440) — Reuse the same compact live Thinking card across sequential tool calls in one assistant turn instead of stacking new cards each time reasoning resumes.
- #2450 by @Michaelyklam (fixes #2447) — Cap the optional smooth word-fade drain after the final
doneSSE event. Bursty completed responses no longer stay visually "live" until Stop is pressed. - #2460 by @Michaelyklam (closes #2449) — Add a copy button to Thinking card headers. Stops header-toggle propagation; same checkmark feedback pattern as existing copy actions.
Cron + gateway plumbing
- #2452 by @Michaelyklam (fixes #2451) — Manual cron triggers from the WebUI now deliver the same final response or failure notice as scheduled cron runs, with
[SILENT]skip support andlast_delivery_errorseparate metadata. - #2457 by @Michaelyklam (closes #2456) — Email gateway sessions imported from
state.dbnow normalize as messaging sessions and show anEmailsource label in the sidebar instead of falling through as unlabelled.
i18n + preference text cleanup
- #2463 by @Michaelyklam (closes #2462) — Refresh
/themecommand help strings in ru/de/zh/zh-Hant/fr to match the current Theme × Skin contract throughnous; fix Frenchtheme_usageto use the actual/themeprefix. - #2466 by @franksong2702 (closes #2465) — Clarify
Compact tool activitypreference description: the setting preserves the agent timeline while showing compact inline activity, matching current renderer behavior.
Verification
- pytest: 5849 passed, 6 skipped, 3 xpassed, 0 failed
- Opus advisor: SHIP (no blockers; two minor robustness follow-up notes)
- Browser API sanity: all 11 checks green on isolated port-8789 stage server
- CI: 3.11 / 3.12 / 3.13 all green
Closed issues
#2434, #2435, #2440, #2442, #2443, #2447, #2449, #2451, #2454, #2456, #2462, #2465