Skip to content

Stage 383 / v0.51.90 — Release BN — 10-PR full sweep batch#2538

Merged
nesquena-hermes merged 25 commits into
masterfrom
stage-383
May 18, 2026
Merged

Stage 383 / v0.51.90 — Release BN — 10-PR full sweep batch#2538
nesquena-hermes merged 25 commits into
masterfrom
stage-383

Conversation

@nesquena-hermes
Copy link
Copy Markdown
Collaborator

Stage 383 / v0.51.90 — Release BN — 10-PR full sweep batch

Full sweep batch covering 10 contributor PRs. No agent-authored work in this stage.

PRs in this batch

Fixed

Added

Documentation

Verification

Pre-Opus 7-point gate — green

  • JS syntax (panels/sessions/messages/ui/i18n): clean
  • Python ast.parse over all api/*.py + tests/*.py: clean
  • Merge marker scan (^<<<<<<< , ^>>>>>>> , ^======= ): none
  • CHANGELOG **PR (TBD|N/A|??)** placeholder scan: none
  • No CJK escape literals added in this stage
  • No Docker surface touched (Dockerfile, docker_init.bash, docker-compose*.yml, .env.docker.example)
  • No new module with concurrent primitives

Tests

  • Pytest full suite: 5952 passed, 6 skipped, 3 xpassed in 119.58s (0:01:59)
  • Browser API sanity (port 8789 via run-browser-tests.sh --skip-unit): 11/11 PASS (GET /health, GET /, GET /static/{ui,messages,sessions}.js, GET /api/settings, POST /api/session/new, GET /api/session, POST /api/chat/start, GET /api/chat/stream/status, POST /api/session/delete)

Opus advisor (opus-advise.sh --thinking) — GO-WITH-FOLLOWUP

Verified each of the four concerns flagged in the brief:

  1. fix: load remote models for named custom providers #2515 × fix: allow keyless named custom endpoints #2522 composition on api/config.py × api/streaming.py — Different layers, no shared state. fix: load remote models for named custom providers #2515 lives in get_available_models() and passes real configured keys to its new _read_custom_endpoint_models helper. fix: allow keyless named custom endpoints #2522 lives in _run_agent_streaming chat-build paths and injects a "dummy-key" only when the named provider has a base_url with no key. Shared dep resolve_custom_provider_connection (api/config.py:1819) is untouched by either PR. Three call sites in _run_agent_streaming correctly DRY'd through the helper.
  2. [codex] Fix empty gateway session hiding messaging history #2286 + Add previous messaging session controls #2294 stack ordering — Composes cleanly. At api/routes.py:2167, show_previous_messaging_sessions=True short-circuits before [codex] Fix empty gateway session hiding messaging history #2286's narrowed visible_active_gateway_session_ids filter. Both new tests in test_gateway_sync.py pass against the merged stage tip.
  3. fix: guard new conversation cold-start clicks #2528 cold-start guard concurrencytry { return await _newSessionInFlight; } finally { _newSessionInFlight=null; } cleans up on resolve AND reject. Traced: network TypeError → retries → finally; HTTP 4xx/5xx → finally; 401 → undefined → TypeError → finally; concurrent click → returns same promise reference.
  4. docs(runtime): define queue goal control gate #2509 RFC + adapter-seam test — The new test_queue_goal_adapter_methods_remain_docs_only_until_slice3c_implementation asserts the absence of queue_message/queue_input/update_goal on RuntimeAdapter/LegacyJournalRuntimeAdapter. It's a gate, not a contract lock — covers both old and new naming. Stamped with REMOVAL REQUIRED comment in tests/test_runtime_adapter_seam.py so the next contributor doesn't "fix" it.

Opus follow-ups (non-blocking, tracker-only):

  1. Add AbortController + ~30s timeout to api() in static/workspace.js so _newSessionInFlight can't stay pinned indefinitely on a request that accepts the connection but never responds. Pre-existing shape (not a regression from fix: guard new conversation cold-start clicks #2528).
  2. Surface a small "models endpoint returned 401" hint when _read_custom_endpoint_models fails on a named provider — picker silently lacking models even though chat works is a confusing failure mode.
  3. (applied in this PR) Stamp REMOVAL REQUIRED comment on test_queue_goal_adapter_methods_remain_docs_only_until_slice3c_implementation so it's deleted with Slice 3c.

Triage actions taken this sweep (not in the batch)

Pre-merge CI

CI will gate the merge as usual.

Michael Lam and others added 25 commits May 17, 2026 21:06
…enu action

PR #2294 added the show_previous_messaging_sessions setting and a "Hide
from list" menu action for external sessions, but tripped 8 tests:

  - 4 locale-parity tests (tests/test_{japanese,russian,spanish,chinese}_locale.py)
    demand every en key be defined in ja/ru/es/zh blocks. The contributor
    only added the 5 new keys to en + ko, leaving ja/ru/es/zh/it/de/zh-TW/pt/fr
    missing them. tests/test_provider_quota_status.py also requires the two
    settings_{label,desc}_previous_messaging_sessions keys in ALL 11 locales.

  - tests/test_1466_sidebar_cancel_clarify.py read the first 5200 chars of
    _openSessionActionMenu to find cancelSessionStream/delete actions; the
    new "Hide from list" branch (17 lines for external sessions) pushed
    those past the read window.

  - tests/test_issue1611_session_profile_filtering.py grep'd for the
    literal string `_keep_latest_messaging_session_per_source(scoped)`,
    which no longer exists after the call was rewritten as a multi-line
    keyword-arg form.

Fixes:

1. Translations for the 5 new i18n keys added to all 9 missing locales
   (it, ja, ru, es, de, zh-CN, zh-TW, pt, fr):
   - session_hide_external
   - session_hide_external_desc
   - session_hidden
   - settings_label_previous_messaging_sessions
   - settings_desc_previous_messaging_sessions

   Where the locale already used the English fallback for related keys
   (ru/es/de session_archive), I provided localized translations for the
   new keys to match the project's general direction. Native-script
   quality, not machine-translation.

2. test_1466 window bumped 5200 → 6400 with a comment explaining the
   bump (mirrors the existing 3200→4400→5200 history annotations).

3. test_1611 dedupe-position check loosened to match the function name
   without the `(scoped)` suffix so it tolerates both single-line and
   keyword-arg call shapes.

Tests: full suite 5828 passed / 63 skipped / 0 failed (was 8 failed).
Behavioral harness verifies the toggle's claimed behavior — off (default)
hides reset/compression segments, on shows all rows in timestamp order.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# Conflicts:
#	tests/test_gateway_sync.py
# Conflicts:
#	CHANGELOG.md
# Conflicts:
#	CHANGELOG.md
# Conflicts:
#	CHANGELOG.md
# Conflicts:
#	CHANGELOG.md
# Conflicts:
#	CHANGELOG.md
# Conflicts:
#	CHANGELOG.md
# Conflicts:
#	CHANGELOG.md
@nesquena-hermes nesquena-hermes merged commit 4589dbe into master May 18, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

4 participants