v0.51.27 — Release E1: 4-PR contributor batch
Theme: Workspace-prefix sentinel hardening (closes the #1913 follow-up filed in v0.51.25) + custom named provider API key resolution + streaming chat scroll-pin retention + Kanban detail scrollable.
Constituent PRs
- #1916 by @Michaelyklam — Make Kanban detail view scrollable (closes #1915)
- #1914 by @ai-ag2026 — Keep streaming chat pinned after final render
- #1918 by @franksong2702 — Fix workspace prefix sentinel handling —
[Workspace::v1: ...]format with]escaping (closes #1913, the follow-up filed in v0.51.25) - #1814 by @hualong1009 — Custom named provider API key resolution (
resolve_custom_provider_connection()helper forcustom:*provider IDs)
Pre-release verification
- Full pytest under
HERMES_HOMEisolation: 4884 passed, 11 skipped, 1 xfailed, 2 xpassed, 8 subtests passed in 145.18s on Python 3.11. - Browser API harness (port 8789): all 11 endpoints + 20 QA tests PASS.
node -constatic/messages.js,static/ui.js: clean.- Stage diff: 14 files, +382/-31.
- Opus advisor pass on stage-322: identified 2 BLOCKERS in PR #1918, both absorbed in-stage (per absorb-in-release default), then SHIP. No MUST-FIX remaining.
- v0.51.26 fixes verified preserved across rebase.
- Pre-stamp re-fetch of all 4 PR heads: no contributor force-pushes during the Opus window.
Opus-absorbed fixes
-
#1918 missed second injection site at
api/routes.py:_handle_chat_sync(POST/api/chat). Pre-fix, this sync chat path would inject legacy[Workspace: ...]while the streaming path injected[Workspace::v1: ...]— leaking the prefix in user bubbles on the sync surface. Fixed: routed through_workspace_context_prefix(...); updated surrounding system-prompt strings to v1 form. -
#1918 JS legacy fallback in
static/ui.js:_stripWorkspaceDisplayPrefix. Pre-fix, existing on-disk transcripts saved before the v1 migration would render the literal[Workspace: /path]prefix in user bubbles after upgrade. Fixed: added legacy-regex fallthrough when v1 strip doesn't match, mirroring the Pythoninclude_legacy=Truebranch. Updated test that previously asserted "legacy regex absent" to assert it IS present.
Test count
4890 → 4898 collected, 4884 passing (+8 net new tests).