From 1b9c8c660cba1884f4cf3d2a25ed2bba166971f4 Mon Sep 17 00:00:00 2001 From: nesquena-hermes Date: Wed, 6 May 2026 15:19:38 +0000 Subject: [PATCH] =?UTF-8?q?chore(release):=20stamp=20v0.51.9=20=E2=80=94?= =?UTF-8?q?=202-PR=20batch=20(boot=20path=20+=20Codex=20session=20repair)?= =?UTF-8?q?=20+=20Opus=20follow-up?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- CHANGELOG.md | 29 +++++++++++++++++++++++++++++ ROADMAP.md | 2 +- TESTING.md | 4 ++-- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b24dab63..7fc4dc1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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/` 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 diff --git a/ROADMAP.md b/ROADMAP.md index 916dbfe5..969c1cc1 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -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) diff --git a/TESTING.md b/TESTING.md index 791299ad..0546e658 100644 --- a/TESTING.md +++ b/TESTING.md @@ -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: /*