Skip to content

Release BJ (stage-379): v0.51.86 — 4-PR review-bypass batch — WebUI memory-provider session lifecycle + cross-provider /model alias + RuntimeAdapter cancel seam + Fork-from-here messaging coord#2486

Merged
nesquena-hermes merged 14 commits into
masterfrom
stage-379
May 17, 2026

Conversation

@nesquena-hermes
Copy link
Copy Markdown
Collaborator

stage-379 — Release BJ / v0.51.86 — 4-PR review-bypass batch

Constituents (all nesquena APPROVED with detailed end-to-end traces)

PR Author Type LOC Approved at
#2461 @starship-s Fix — WebUI memory-provider session lifecycle +768/-18 2026-05-17T17:09
#2473 @ts2111 Fix — /model alias cross-provider routing +72/-1 2026-05-17T23:05
#2479 @Michaelyklam Changed — Slice 3a cancel-control adapter route +44/-4 2026-05-17T23:08
#2480 @Michaelyklam Fix — Fork-from-here messaging coordinate space +151/-33 2026-05-17T23:11

Total stage diff: 12 files changed, 1033 insertions(+), 56 deletions(-) (incl. 444 LOC tests + 208 LOC new module).

Theme of the batch

Four already-approved contributor fixes spanning four runtime surfaces: (a) a new WebUI memory-provider session-lifecycle module that gives OpenViking-style batch-extraction providers reliable boundary commits without per-turn extraction; (b) cross-provider /model <alias> routing repair; (c) the first code slice of the Slice 3a cancel-control gate accepted in v0.51.85; (d) "Fork from here" coordinate-space fix on messaging-backed sessions.

Verification

Pre-Opus gate (all clean)

  • node -c on static/commands.js + static/sessions.js: PASS
  • ast.parse on api/session_lifecycle.py (new), api/streaming.py, api/routes.py, api/config.py, server.py: PASS
  • Merge-marker grep: clean
  • CHANGELOG placeholder grep: clean (**PR #TBD** from feat(runtime): route cancel through RuntimeAdapter seam #2479 contributor branch fixed during stamp)
  • api/routes.py duplicate-function-def check: clean
  • api/streaming.py lines changed: 71 (only fix: add WebUI memory-provider session lifecycle for batch-extraction providers #2461 touches it; sensitive path)
  • Agent self-verify on api/session_lifecycle.py (per the two-layer rule for >100 LOC + concurrency + new module): late-commit safety invariant, segment-merge correctness, empty-commit no-op, drain_all_on_shutdown, unregister_agent cleanup — all PASS via direct unmocked execution.

pytest (full suite)

5889 passed, 6 skipped, 3 xpassed, 8 subtests passed in 112.11s

No regression in 20+ existing resolve_model_provider tests (relevant to #2473's narrow new conditional).

Opus advisor sanity check

Decision: STAGE-FIX-FIRST → SHIP (after fix applied)

Opus found one CHANGELOG hygiene issue: a stray ### Fixed block under v0.51.83 mis-attributed #2461's lifecycle work to that release. Fixed in stage commit 9543addd — the duplicate bullet removed; #2461 is now correctly described once under v0.51.86. All code-level review came back clean: lifecycle module is well-tested (16 dedicated tests, late-commit safety verified), cross-PR handler interactions in api/routes.py are disjoint, the cancel route is byte-identical on the default legacy-direct path, cmdModel() XSS surface is safe (verified showToast uses textContent for success path).

Notable known gap Opus flagged as low-risk: the reviewer's PR #2473 APPROVE comment references regression tests in commit 7b351336 that were never actually pushed. The change is a single narrow conditional with explicit guards, and 20+ existing resolver tests pass; ship-acceptable.

Browser sanity checks (port 8789 stage server)

All 11 API checks PASS: /health, /, /static/*.js, /api/settings, POST /api/session/new, GET /api/session, POST /api/chat/start, GET /api/chat/stream/status, POST /api/session/delete.

Not in this batch

Closes: PR #2461 closes the OpenViking commit gap; #2473 closes the cross-provider /model alias routing bug; #2479 lands the first code slice of Slice 3a; #2480 closes #2472 ("Fork from here" coordinate space).

starship-s and others added 14 commits May 17, 2026 03:30
Backend (api/config.py):
- resolve_model_provider(): check custom_providers for prefix match
  BEFORE the config_base_url branch. Previously, providers with a
  base_url set (e.g. deepseek) would catch all slash-delimited model
  ids and return the config provider, preventing custom provider
  routing.
- get_available_models(): include model aliases in response so the
  frontend can resolve them on /model commands.

Frontend (static/commands.js):
- cmdModel(): resolve aliases by fetching /api/models before fuzzy
  matching the dropdown.
- Add bare-model fallback when the alias resolves to a slash-delimited
  provider/model id (e.g. "deepseek/deepseek-v4-flash").
- Add cross-provider fallback: when the model is from a custom provider
  not in the active provider dropdown, call /api/session/update directly
  with the provider/model id and provider override.
# Conflicts:
#	CHANGELOG.md
# Conflicts:
#	CHANGELOG.md
@nesquena-hermes nesquena-hermes merged commit 2927702 into master May 17, 2026
3 checks passed
@nesquena-hermes nesquena-hermes deleted the stage-379 branch May 17, 2026 23:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Session fork-from-here: forked session includes messages beyond the fork point

3 participants