chore(release): stamp v0.51.9 — 2-PR batch (boot path + Codex session repair) + Opus follow-up

Constituent PRs:
- #1735 (@dso2ng) — keep saved running sessions sidebar-only on root boot (slice of #1694)
- #1738 (@Michaelyklam) — repair stale OpenAI session models for Codex (closes #1734)

Plus 1 in-stage absorbed fix:
- Opus SHOULD-FIX: persist openai-codex provider unconditionally on stale-session
  repair (drop conditional catalog-coverage check that produced redundant
  repair-writes per chat-start).

Tests: 4584 → 4590 passing (+6). 0 regressions. Stably green.

Pre-release verification:
- Both PRs CI-green individually + rebased onto master
- pytest 4590 passed, 0 failed
- node -c clean on static/boot.js
- 11/11 browser API endpoints PASS
- Opus advisor: SHIP, 5/5 verification clean, 0 MUST-FIX, 1 SHOULD-FIX absorbed

Closes #1734.
This commit is contained in:
nesquena-hermes committed 2026-05-06 15:19:38 +00:00
1 parent ec403fa3cf
commit 1b9c8c660c
3 files changed
+32 -3

No files matched your search

+29
View File
@@ -1,5 +1,34 @@
# Hermes Web UI -- Changelog
## [v0.51.9] — 2026-05-06 — 2-PR full-sweep batch
### Fixed
- **PR #1735** by @dso2ng — Keep saved running sessions sidebar-only on root boot (slice of #1694). When a fresh root `/` tab restored a localStorage-saved last session and that session was still running (`active_stream_id` or `pending_user_message` present), the boot path projected the running session into the active pane and the new tab looked busy with another tab's stream. New `_savedSessionShouldStaySidebarOnly()` helper does a metadata-only `/api/session?messages=0&resolve_model=0` probe; if the saved session is running, root `/` boot leaves the pane empty/idle and refreshes the sidebar instead of calling `loadSession(savedLocal)`. Explicit `/session/<sid>` URL behavior unchanged — the gate is `!urlSession && savedLocal`. Probe failure fails open (legacy projecting behavior). 4 new regression tests + 1 cross-tab static-assertion scope-fix.
- **PR #1738** by @Michaelyklam — Repair stale OpenAI session models for Codex (closes #1734). Existing sessions with `model=openai/gpt-...` (OpenRouter shape) and no saved `model_provider` were being treated as compatible by `_resolve_compatible_session_model_state()` when the active provider was OpenAI Codex (both normalize to "openai" family), so they passed through. At runtime, `resolve_model_provider()` then interpreted that slash-qualified ID as an OpenRouter selection under Codex, producing a misleading provider-credential failure. New branch in `_resolve_compatible_session_model_state()` at `api/routes.py:937-955` repairs the legacy no-`model_provider` shape: when `raw_active_provider == "openai-codex" AND model_provider == "openai" AND requested_provider is None AND default_model`, swap the session to active Codex default and persist `model_provider="openai-codex"`. Explicit OpenRouter selections preserved by the line 838 early return + the `requested_provider is None` gate.
### In-stage absorbed fixes
**Opus-applied fix (absorbed in-release):**
- **#1738 follow-up — persist openai-codex provider unconditionally on repair.** Opus stage-303 advisor flagged that the catalog-coverage branch produces a redundant repair-write per chat-start when the active Codex default is itself slash-prefixed (theoretical edge case — Codex defaults are bare `gpt-...` in practice). Drop the conditional `_should_attach_codex_provider_context` check and unconditionally attach `raw_active_provider` ("openai-codex") on this repair path. Once the session has been decided to belong to Codex, that decision is persisted so the same shape can't re-trigger the repair.
### Tests
4584 → **4590 passing** (+6 regression tests across the 2 PRs). 0 regressions. Full suite ~138s. Stably green across multiple clean runs.
### Pre-release verification
- Stage-303: 2 PRs merged with zero conflicts (each rebased clean onto current master).
- All JS files syntax-clean (`node -c static/boot.js`).
- All Python files syntax-clean.
- pytest: 4590 passed, 0 failed (verified across multiple runs).
- `scripts/run-browser-tests.sh`: all 11 endpoints PASS on isolated port 8789 with stage-303 binary.
- Pre-stamp re-fetch: both PR heads still match local rebases — no late contributor commits.
- Opus advisor: SHIP, 5/5 verification questions clean, 0 MUST-FIX, 1 SHOULD-FIX absorbed (Codex provider context unconditional persistence).
Closes #1734.
## [v0.51.8] — 2026-05-06 — 7-PR full-sweep batch
### Added
+1 -1
View File
@@ -2,7 +2,7 @@
> Web companion to the Hermes Agent CLI. Same workflows, browser-native.
>
> Last updated: v0.51.8 (May 6, 2026) — 4584 tests collected — 7-PR full-sweep batch (#1725-1730, #1732)
> Last updated: v0.51.9 (May 6, 2026) — 4590 tests collected — 2-PR full-sweep batch (#1735, #1738)
> Test source: `pytest tests/ --collect-only -q`
> Per-version detail: see [CHANGELOG.md](./CHANGELOG.md)
+2 -2
View File
@@ -1835,8 +1835,8 @@ Bridged CLI sessions:
---
*Last updated: v0.51.8, May 6, 2026*
*Total automated tests collected: 4584*
*Last updated: v0.51.9, May 6, 2026*
*Total automated tests collected: 4590*
*Regression gate: tests/test_regressions.py*
*Run: pytest tests/ -v --timeout=60*
*Source: <repo>/*