fix: five independent single-site fixes — target_model on custom providers, STT error surfacing, stale cron next_run_at, browser-use PATH floor, draft-sweep age gate (#93092, #93045, #93049, #93115, #93055) - #93356
Merged
Conversation
resolve_runtime_provider() documents target_model as the explicit model override for mid-session switches and auxiliary slots, but the custom provider path (_resolve_named_custom_runtime) never received it and silently substituted the provider's configured default_model instead. This made auxiliary slots such as auxiliary.background_review silently run the provider's default model rather than the configured one — e.g. an ocx-proxy slot configured for gemini-flash actually executed cursor/claude-sonnet-5, hitting upstream rate limits. Pass target_model through to the custom runtime resolver and prefer it over the provider's default model in both the pooled and non-pooled credential paths.
When the managed openai-audio gateway is unavailable, _resolve_openai_audio_client_config() raises a ValueError that names the blocker (and, for managed-Nous users, the `hermes tools` remediation). The boolean probe in _get_provider's explicit-openai branch flattened that into False, so the log claimed "no API key available" and the transcription result returned the all-provider install hint -- pointing operators at unrelated setup instead of their managed route (#93045). Resolve the config directly in the branch so the warning names the real blocker, and let the dispatch's "none" fallback surface the selection-specific error for an explicit openai choice. No fallback is added: an unavailable selection still resolves to "none", it just reports why.
…e edits get_due_jobs() fires purely off the stored next_run_at <= now, with no check that the stored instant is still an occurrence of the schedule's current expression. A direct jobs.json edit that narrows schedule.expr (e.g. daily "0 7 * * *" -> weekdays "0 7 * * 1-5") keeps the stored next_run_at computed under the old expression, so the job fires on days the new expression excludes. The within-grace fire and the catch-up "run once now" path both inherit the wrong instant. Add a best-effort stale-schedule guard on the fire path: when the stored next_run_at is not an occurrence of the current cron expression, re-anchor it via compute_next_run() from the current expression and skip the fire. Non-cron kinds, missing expr, croniter unavailability, and malformed input all report a match so the fire path keeps its existing semantics. Recomputation uses the current expression, so the re-anchor converges and cannot defer a valid job forever. Fixes #93049
…dirs Profile-spawned workers (kanban bots, cron jobs) can inherit a PATH of only version-manager dirs — observed in the wild as one nvm node dir repeated 7x. The uv-installed browser-use binary is a POSIX sh trampoline that resolves dirname/realpath through PATH, so it died with 'realpath: not found … exec: /python: not found' (exit 127) before its own Python ever started. _base_subprocess_env now floors the child PATH via browser_tool's _merge_browser_path (the agent-browser backend already guards the same hazard), degrading to appending FHS bin dirs if that import is ever unavailable. Windows is a no-op (.cmd shims don't trampoline). Verified: unit tests + real uvx browser-use --version under a nvm-only-PATH worker env, rc 127 -> rc 0.
Contributor
૮ >ﻌ< ა ci reviewran on 7714db7 — chore: add contributor email mappings for salvage
|
This was referenced Aug 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Five independent, file-disjoint bug fixes salvaged in one sweep — each is a contributor's targeted fix for a verified bug, cherry-picked with authorship preserved.
Fixes #93092. Fixes #93045. Fixes #93049. Fixes #93115. Fixes #93055.
Changes
hermes_cli/runtime_provider.py: explicittarget_modelnow wins over a named custom provider's default model on both pool and direct paths —auxiliary.<task>.modelno longer silently falls back. Salvaged from fix(cli): honor target_model when resolving custom providers #78573 by @web-wyf (earliest submitter, Aug 4); fix(providers): honor target_model on the custom-provider resolve path #93094 by @liuhao1024 arrived at the same fix independently 3 weeks later and its extra call-site test coverage is noted on the PR (closing as duplicate with credit).tools/transcription_tools.py: explicit managed-OpenAI STT surfaces the selection-specific ValueError (Nous-gateway blocker +hermes toolsremediation) instead of a generic "No STT provider available". Salvaged from fix(stt): surface the selection-specific error for explicit openai STT #93052 by @liuhao1024.cron/jobs.py:_get_due_jobs_locked()re-validates persistednext_run_atagainst the current cron expression, so directjobs.jsonedits can't fire a job on an excluded day-of-week; re-anchors and skips. Includes fail-on-main control test. Salvaged from fix(cron): re-anchor stale next_run_at after direct jobs.json schedule edits #93069 by @liuhao1024.tools/browser_use_cli.py: browser-use CLI subprocess PATH floored with sane system dirs (_merge_browser_pathparity with the agent-browser backend) — no morerealpath: not foundexit 127 under version-manager-only PATHs. Salvaged from fix(browser): floor browser-use CLI subprocess PATH with sane system dirs #93116 by @justcarlosm.apps/desktop/src/plugins/hermes-bots/plugin.js: title sweep can no longer hide a brand-new desktop draft whose birth title collides withBOT_MODE_SWEEP_TITLES— 5-minute minimum age before a title-matched row is hidden. Salvaged from fix(bots): keep new desktop drafts visible during auto-titling #93079 by @fangliquanflq.Validation
All five touch disjoint files; no cross-fix interaction.
Infographic