Skip to content

fix(cron): preflight model fallbacks before skip#82887

Merged
osolmaz merged 4 commits into
openclaw:mainfrom
chen-zhang-cs-code:fix/79329-cron-preflight-fallback
May 29, 2026
Merged

fix(cron): preflight model fallbacks before skip#82887
osolmaz merged 4 commits into
openclaw:mainfrom
chen-zhang-cs-code:fix/79329-cron-preflight-fallback

Conversation

@chen-zhang-cs-code

@chen-zhang-cs-code chen-zhang-cs-code commented May 17, 2026

Copy link
Copy Markdown
Contributor

Summary

Scheduled isolated cron jobs could stop before the real agent turn when the primary model was a local provider and that local endpoint was down.
This change makes cron preflight use the same model candidate chain as normal model fallback, so a dead local primary can move to the configured fallback instead of marking the run skipped.
It keeps fallbacks: [] strict and keeps the existing local endpoint preflight cache and timeout behavior.

What Changed

The fix moves cron preflight away from its own fallback list logic and onto the shared model fallback candidate builder.
Cron now preflights the selected primary first, then walks the configured candidate chain and runs the turn with the first candidate whose provider preflight passes.
If preflight advances past a dead candidate, execution receives only the remaining candidates so the same dead local primary is not retried later in that run.

  • Exported resolveModelCandidateChain from src/agents/model-fallback.ts.
  • Changed src/cron/isolated-agent/run-fallback-policy.ts to return the full cron preflight candidate chain, including the primary.
  • Changed src/cron/isolated-agent/run.ts to select an available fallback before returning skipped.
  • Changed src/cron/isolated-agent/run-executor.ts to honor the narrowed post-preflight fallback list.
  • Kept explicit empty payload fallbacks strict: fallbacks: [] only preflights the selected primary.
  • Added regression coverage for fallback handoff, strict fallback behavior, and execution fallback narrowing.

Testing

I tested the focused source path, adjacent cron behavior, the build, and a real scheduled cron tick with a temporary Gateway.
The live proof used a dead Ollama primary and a local OpenAI-compatible fallback server, so it did not need real provider credentials.
After rebasing onto current origin/main, the current head fe884dab90 was revalidated with the commands below.

  • node scripts/run-vitest.mjs src/agents/model-fallback.test.ts src/cron/isolated-agent.model-preflight.test.ts src/cron/isolated-agent/run-fallback-policy.test.ts src/cron/isolated-agent/run.payload-fallbacks.test.ts src/cron/isolated-agent/run.live-session-model-switch.test.ts src/cron/isolated-agent/run.message-tool-policy.test.ts
  • pnpm exec oxfmt --check --threads=1 src/agents/model-fallback.ts src/agents/model-fallback.test.ts src/cron/isolated-agent/run-fallback-policy.ts src/cron/isolated-agent/run-fallback-policy.test.ts src/cron/isolated-agent/run.ts src/cron/isolated-agent/run-executor.ts src/cron/isolated-agent.model-preflight.test.ts src/cron/isolated-agent/run.payload-fallbacks.test.ts src/cron/isolated-agent/run.live-session-model-switch.test.ts src/cron/isolated-agent/run.message-tool-policy.test.ts docs/cli/cron.md docs/automation/cron-jobs.md
  • node scripts/run-oxlint.mjs src/agents/model-fallback.ts src/agents/model-fallback.test.ts src/cron/isolated-agent/run-fallback-policy.ts src/cron/isolated-agent/run-fallback-policy.test.ts src/cron/isolated-agent/run.ts src/cron/isolated-agent/run-executor.ts src/cron/isolated-agent.model-preflight.test.ts src/cron/isolated-agent/run.payload-fallbacks.test.ts src/cron/isolated-agent/run.live-session-model-switch.test.ts src/cron/isolated-agent/run.message-tool-policy.test.ts
  • node scripts/run-tsgo.mjs -p tsconfig.core.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/core.tsbuildinfo
  • git diff --check origin/main...HEAD
  • pnpm build
  • codex review --base origin/main

Real behavior proof

Behavior addressed: scheduled cron local-model preflight should not mark the run skipped before trying configured fallbacks.

Real environment tested: local OpenClaw branch build at 445a40a before the final rebase; temporary Gateway with cron.enabled: true; primary ollama/qwen3:32b configured at unused loopback http://127.0.0.1:59998; fallback fakecloud/fake-chat configured as an OpenAI-compatible provider at http://127.0.0.1:43200/v1. Current head fe884dab90 contains the same implementation rebased onto current origin/main and passed the post-rebase validation above.

Exact steps or command run after this patch: built the branch with pnpm build, started the temporary Gateway from node openclaw.mjs gateway run, scheduled one-shot cron job 1eb9f68f-8ed7-497f-b956-e8b537dae514 through cron.add, and waited for the scheduler to fire.

Evidence after fix: the Gateway log contained:

[cron:1eb9f68f-8ed7-497f-b956-e8b537dae514] Local provider preflight failed for ollama/qwen3:32b at http://127.0.0.1:59998; continuing with fallback fakecloud/fake-chat.
[agent/embedded] embedded run start: runId=caec41ae-ee72-4013-8cce-ee138e6bd658 sessionId=caec41ae-ee72-4013-8cce-ee138e6bd658 provider=fakecloud model=fake-chat thinking=off messageChannel=unknown
[provider-transport-fetch] [model-fetch] response provider=fakecloud api=openai-completions model=fake-chat status=200 elapsedMs=4 contentType=text/event-stream

The recorded cron run was:

{
  "action": "finished",
  "status": "ok",
  "summary": "fallback reached",
  "model": "fake-chat",
  "provider": "fakecloud",
  "deliveryStatus": "not-requested",
  "sessionId": "caec41ae-ee72-4013-8cce-ee138e6bd658"
}

The fake fallback server also received GET /v1/models for preflight and POST /v1/chat/completions for the model turn.

Observed result after fix: the scheduled cron run did not skip. It selected the fallback provider and completed with status: "ok".

What was not tested: I did not call a real OpenRouter model or a live Ollama daemon. The proof used a synthetic OpenAI-compatible fallback so the cron scheduler, preflight, fallback selection, and model turn ran without external credentials.

Risks

The main behavior risk is candidate ordering.
Using the shared model fallback candidate builder lowers that risk because cron preflight now follows the same alias resolution, dedupe, primary, and fallback override rules as runtime model fallback.

  • Existing behavior for healthy local primaries is unchanged: the primary passes preflight and runs normally.
  • Existing behavior for no available fallback is preserved: the run is still recorded as skipped.
  • The change does not add retry or wake-up budget knobs from cron: allow retries for local model preflight #82145.

Linked Issue

Fixes #79329.

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation size: M triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 17, 2026
@clawsweeper

clawsweeper Bot commented May 17, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed May 28, 2026, 11:36 PM ET / 03:36 UTC.

Summary
The PR updates isolated cron model preflight so configured fallbacks are checked before a local-provider preflight failure records the run as skipped.

PR surface: Source +73, Tests +198, Docs +3. Total +274 across 8 files.

Reproducibility: yes. by source inspection: current main calls local preflight only for the resolved primary and returns skipped before fallback resolution. The linked issue also supplies a standalone repro, and this PR adds targeted regression coverage plus after-fix runtime logs.

Review metrics: 1 noteworthy metric.

  • Cron fallback decision path: 1 behavior changed. Cron preflight now advances to configured fallback candidates before recording a skipped run, which is the central provider/auth behavior maintainers need to accept.

Merge readiness
Overall: 🦞 diamond lobster
Proof: 🦞 diamond lobster
Patch quality: 🦞 diamond lobster
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Risk before merge

  • [P2] Existing cron jobs with a local primary and configured cloud fallback will now run against the fallback provider when local preflight fails instead of being skipped; that is the intended fix, but it can change provider, credential, and billing behavior for existing configurations.

Maintainer options:

  1. Accept configured fallback routing (recommended)
    Maintainers can merge once they explicitly accept that configured cron fallbacks may use a different provider/auth profile when the local primary preflight fails.
  2. Require stronger provider proof
    Maintainers can ask for one more live provider proof, such as a real local Ollama plus real cloud fallback, before accepting the auth/provider behavior.
  3. Pause if billing behavior is not wanted
    If cron should never move from a local primary to a cloud fallback during preflight without a new opt-in, pause this PR and redesign the policy first.

Next step before merge

  • No ClawSweeper repair is needed; the next action is maintainer review of the auth-provider fallback semantics and normal merge gates.

Security
Cleared: The diff changes cron runtime routing, docs, and tests without adding dependencies, CI, package metadata, secret storage, or credential-handling code; the provider routing concern is tracked as merge risk.

Review details

Best possible solution:

Land this after a maintainer explicitly accepts the configured-fallback provider/auth semantics, keeping fallbacks: [] strict and preserving the shared runtime candidate ordering.

Do we have a high-confidence way to reproduce the issue?

Yes, by source inspection: current main calls local preflight only for the resolved primary and returns skipped before fallback resolution. The linked issue also supplies a standalone repro, and this PR adds targeted regression coverage plus after-fix runtime logs.

Is this the best way to solve the issue?

Yes, the shared candidate-chain approach is the maintainable fix because it aligns cron preflight with runtime fallback ordering and preserves strict empty fallback overrides. The remaining question is maintainer acceptance of the provider/auth behavior, not a code repair.

AGENTS.md: found and applied where relevant.

Codex review notes: model gpt-5.5, reasoning high; reviewed against cb085ec5f1f5.

Label changes

Label changes:

  • add proof: sufficient: Contributor real behavior proof is sufficient. The PR body and maintainer update include after-fix Gateway logs and recorded cron output showing the dead local primary continuing to a fallback provider and finishing successfully.
  • add rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • remove rating: 🐚 platinum hermit: Current PR rating is rating: 🦞 diamond lobster, so this older rating label is no longer current.

Label justifications:

  • P1: The linked bug can silently skip scheduled cron agent runs for real users when a local primary is temporarily unavailable despite configured fallbacks.
  • merge-risk: 🚨 auth-provider: The PR changes cron provider/model routing before the agent turn, so existing jobs may use fallback credentials or billing profiles instead of staying skipped.
  • rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (logs): The PR body and maintainer update include after-fix Gateway logs and recorded cron output showing the dead local primary continuing to a fallback provider and finishing successfully.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body and maintainer update include after-fix Gateway logs and recorded cron output showing the dead local primary continuing to a fallback provider and finishing successfully.
Evidence reviewed

PR surface:

Source +73, Tests +198, Docs +3. Total +274 across 8 files.

View PR surface stats
Area Files Added Removed Net
Source 4 91 18 +73
Tests 2 199 1 +198
Docs 2 3 0 +3
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 8 293 19 +274

What I checked:

  • Current main behavior: Current main preflights only the resolved primary provider/model and returns skipped immediately when that local preflight is unavailable, so configured fallbacks are not reached before the skip. (src/cron/isolated-agent/run.ts:641, cb085ec5f1f5)
  • PR implementation: The PR head builds the cron preflight candidate chain, probes candidates in order, switches provider/model to the first available candidate, and only keeps skipping after no candidate passes preflight. (src/cron/isolated-agent/run.ts:643, fe884dab9096)
  • Fallback handoff: The executor accepts the narrowed modelFallbacksOverride, so once preflight advances past a dead local primary, runtime fallback does not retry that dead candidate in the same run. (src/cron/isolated-agent/run-executor.ts:160, fe884dab9096)
  • Shared candidate builder: Cron preflight now reuses the shared model candidate chain resolver with the same fallback override semantics, including explicit empty fallbacks: []. (src/cron/isolated-agent/run-fallback-policy.ts:40, fe884dab9096)
  • Regression coverage: The new tests cover dead local primary handoff to a configured fallback, strict empty payload fallbacks, full candidate-chain planning, and docs coverage for the preflight behavior. (src/cron/isolated-agent.model-preflight.test.ts:94, fe884dab9096)
  • Repository policy: Root AGENTS.md treats provider routing, auth state, and fallback behavior as compatibility-sensitive merge risk even with green CI, which applies to this intentional local-to-fallback cron routing change. (AGENTS.md:19, cb085ec5f1f5)

Likely related people:

  • Vincent Koc: Current-main blame attributes the isolated cron preflight skip path and fallback-policy helper snapshot to this author, and git history shows many recent isolated cron runtime/performance changes. (role: recent area contributor; confidence: high; commits: 60392a1136ff, 35176f3cb730, 241349cdc5b2; files: src/cron/isolated-agent/run.ts, src/cron/isolated-agent/run-fallback-policy.ts, src/agents/model-fallback.ts)
  • Peter Steinberger: Git history links this author to the original models/fallbacks work and later isolated cron runner seam refactors that shaped the current fallback path. (role: model fallback and cron seam contributor; confidence: medium; commits: 734bb6b4fd9a, bbb73d3171e5, 91d20781ed03; files: src/agents/model-fallback.ts, src/cron/isolated-agent/run-executor.ts, src/cron/isolated-agent/run-fallback-policy.ts)
  • Dallin Romney: Merged adjacent isolated cron fallback test-harness work in test(cron): speed up isolated fallback tests #87520, which cross-referenced this PR and touches the same test surface. (role: recent adjacent test contributor; confidence: medium; commits: 127c0ad4181a; files: src/cron/isolated-agent/run.payload-fallbacks.test.ts, src/cron/isolated-agent/run.test-harness.ts)
  • osolmaz: GitHub context shows this reviewer/assignee completed the latest implementation loop and authored the final PR commits on the branch after maintainer review. (role: recent PR follow-up owner; confidence: medium; commits: dab4ce3396ce, 5eb21e4e0310, fe884dab9096; files: src/cron/isolated-agent/run.ts, src/cron/isolated-agent/run-executor.ts, src/cron/isolated-agent/run-fallback-policy.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels May 17, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. P1 High-priority user-facing bug, regression, or broken workflow. impact:message-loss Channel message delivery can be lost, duplicated, or misrouted. impact:auth-provider Auth, provider routing, model choice, or SecretRef resolution may break. labels May 17, 2026
@chen-zhang-cs-code chen-zhang-cs-code force-pushed the fix/79329-cron-preflight-fallback branch from a38d50e to 0862072 Compare May 17, 2026 11:45
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 17, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 17, 2026
@osolmaz osolmaz self-assigned this May 28, 2026
@openclaw-barnacle openclaw-barnacle Bot added agents Agent runtime and tooling and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. labels May 29, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. and removed impact:message-loss Channel message delivery can be lost, duplicated, or misrouted. impact:auth-provider Auth, provider routing, model choice, or SecretRef resolution may break. labels May 29, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 29, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 29, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 29, 2026
@clawsweeper clawsweeper Bot added rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels May 29, 2026
@osolmaz osolmaz force-pushed the fix/79329-cron-preflight-fallback branch from 445a40a to 34b82ae Compare May 29, 2026 03:15
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🌊 off-meta tidepool PR readiness rating does not apply to this item. labels May 29, 2026
@osolmaz osolmaz force-pushed the fix/79329-cron-preflight-fallback branch from 34b82ae to fe884da Compare May 29, 2026 03:24
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label May 29, 2026
@osolmaz

osolmaz commented May 29, 2026

Copy link
Copy Markdown
Member

Implementation loop complete for current head fe884dab90.

Summary:

  • Cron local-provider preflight now walks the same model fallback candidate chain used by runtime fallback before returning skipped.
  • If preflight selects a fallback, execution receives only the remaining fallback candidates, so the failed local primary is not reintroduced during the same run.
  • fallbacks: [] remains strict for preflight and execution.
  • Rebased onto current origin/main after the unrelated duplicate-key CI failure was fixed upstream.

Local validation:

  • node scripts/run-vitest.mjs src/agents/model-fallback.test.ts src/cron/isolated-agent.model-preflight.test.ts src/cron/isolated-agent/run-fallback-policy.test.ts src/cron/isolated-agent/run.payload-fallbacks.test.ts src/cron/isolated-agent/run.live-session-model-switch.test.ts src/cron/isolated-agent/run.message-tool-policy.test.ts -> passed, 7 files / 210 tests.
  • pnpm exec oxfmt --check --threads=1 src/agents/model-fallback.ts src/agents/model-fallback.test.ts src/cron/isolated-agent/run-fallback-policy.ts src/cron/isolated-agent/run-fallback-policy.test.ts src/cron/isolated-agent/run.ts src/cron/isolated-agent/run-executor.ts src/cron/isolated-agent.model-preflight.test.ts src/cron/isolated-agent/run.payload-fallbacks.test.ts src/cron/isolated-agent/run.live-session-model-switch.test.ts src/cron/isolated-agent/run.message-tool-policy.test.ts docs/cli/cron.md docs/automation/cron-jobs.md -> passed.
  • node scripts/run-oxlint.mjs src/agents/model-fallback.ts src/agents/model-fallback.test.ts src/cron/isolated-agent/run-fallback-policy.ts src/cron/isolated-agent/run-fallback-policy.test.ts src/cron/isolated-agent/run.ts src/cron/isolated-agent/run-executor.ts src/cron/isolated-agent.model-preflight.test.ts src/cron/isolated-agent/run.payload-fallbacks.test.ts src/cron/isolated-agent/run.live-session-model-switch.test.ts src/cron/isolated-agent/run.message-tool-policy.test.ts -> passed.
  • node scripts/run-tsgo.mjs -p tsconfig.core.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/core.tsbuildinfo -> passed.
  • git diff --check origin/main...HEAD -> passed.
  • pnpm build -> passed.
  • codex review --base origin/main -> no actionable regressions; targeted cron preflight/fallback-policy tests passed in review.

Real behavior proof:

  • Temporary Gateway scheduled cron run with dead primary ollama/qwen3:32b at http://127.0.0.1:59998 and fallback fakecloud/fake-chat at http://127.0.0.1:43200/v1.
  • Cron job 1eb9f68f-8ed7-497f-b956-e8b537dae514 logged: Local provider preflight failed ... continuing with fallback fakecloud/fake-chat.
  • The embedded run started with provider=fakecloud model=fake-chat and completed with recorded cron status ok.
  • The fake fallback server received both GET /v1/models and POST /v1/chat/completions.
  • Not tested against a real OpenRouter model or live Ollama daemon; the synthetic OpenAI-compatible fallback covered scheduler, preflight, fallback selection, and model turn without external credentials.

CI:

  • Main check run 26616053140: passed, including check-lint, check-test-types, build artifacts, and cron isolated-agent shards.
  • Critical Quality run 26616053143: relevant selected shards passed.
  • Security High run 26616053145: passed.
  • Real behavior proof run 26616209313: passed.
  • Dependency guard run 26616051724: passed.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. labels May 29, 2026
@osolmaz

osolmaz commented May 29, 2026

Copy link
Copy Markdown
Member

Maintainer note on the provider/auth/billing behavior called out by review:

This is a real behavior change, but it is also the intended meaning of configured cron fallbacks. If a job is configured with a local primary plus a cloud fallback, for example ollama/qwen3 -> openrouter/model, then cron should be allowed to use the configured fallback when the local primary fails preflight. The old behavior skipped before the fallback policy could run, which made that fallback config ineffective for scheduled runs.

I would not add another opt-in here. That would make configured fallbacks surprising in the opposite direction: users would have configured a fallback, but cron would still skip unless a second policy was enabled.

The right guardrail is the one this PR keeps: fallbacks: [] remains strict and preserves the skip-only behavior for jobs that should never move to another provider. The docs/PR body now also make the fallback-before-skip behavior explicit.

@osolmaz osolmaz merged commit 7a381b8 into openclaw:main May 29, 2026
126 of 131 checks passed
@osolmaz

osolmaz commented May 29, 2026

Copy link
Copy Markdown
Member

Merged in 7a381b8.

Verification used for merge:

  • GitHub CI on pinned PR head fe884da was green.
  • Local focused cron/model fallback tests passed earlier for the touched surface.
  • Local merge-wrapper build and check passed on the prepared candidate.
  • Local full pnpm test had unrelated failures outside this PR's touched files, so this was merged based on the green PR-head CI plus focused/touched-surface proof.

github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 30, 2026
Fix cron local-model preflight fallback handling so scheduled runs try configured fallback candidates before skipping when the local primary is unavailable.

Verification:
- GitHub CI on PR head fe884da: passing required CI checks.
- Local focused cron/model fallback tests passed earlier for the touched surface.
- Local merge-wrapper build and check passed on the prepared candidate.
- Local full pnpm test reported unrelated failures outside this PR's touched files; touched files are limited to cron docs, src/agents/model-fallback.ts, and src/cron/isolated-agent/*.

Co-authored-by: chen-zhang-cs-code <chenzhangcode@163.com>
Co-authored-by: Onur Solmaz <2453968+osolmaz@users.noreply.github.com>
eleboucher pushed a commit to eleboucher/homelab that referenced this pull request May 31, 2026
…026.5.28) (#759)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/openclaw/openclaw](https://openclaw.ai) ([source](https://github.com/openclaw/openclaw)) | patch | `2026.5.27` → `2026.5.28` |

---

### Release Notes

<details>
<summary>openclaw/openclaw (ghcr.io/openclaw/openclaw)</summary>

### [`v2026.5.28`](https://github.com/openclaw/openclaw/blob/HEAD/CHANGELOG.md#2026528)

[Compare Source](openclaw/openclaw@v2026.5.27...v2026.5.28)

##### Highlights

- Agent and Codex runtime recovery is steadier: subagents keep cwd/workspace separation, hook context stays prompt-local, session locks release on timeout abort while live OpenClaw locks survive cleanup, stale restart continuations are avoided, and Codex app-server/helper failures no longer tear down shared runtime state. ([#&#8203;87218](openclaw/openclaw#87218), [#&#8203;86875](openclaw/openclaw#86875), [#&#8203;87409](openclaw/openclaw#87409), [#&#8203;87399](openclaw/openclaw#87399), [#&#8203;87375](openclaw/openclaw#87375), [#&#8203;88129](openclaw/openclaw#88129))
- Channel delivery and session identity got safer across outbound plugin hooks, Matrix room ids, iMessage reactions/approvals, Slack final replies, Discord recovered tool warnings, runtime-config message actions, WhatsApp profile auth roots, Telegram polling, and Microsoft Teams service URL trust checks. ([#&#8203;73706](openclaw/openclaw#73706), [#&#8203;75670](openclaw/openclaw#75670), [#&#8203;87366](openclaw/openclaw#87366), [#&#8203;87451](openclaw/openclaw#87451), [#&#8203;87334](openclaw/openclaw#87334), [#&#8203;84535](openclaw/openclaw#84535), [#&#8203;82492](openclaw/openclaw#82492), [#&#8203;83304](openclaw/openclaw#83304), [#&#8203;87160](openclaw/openclaw#87160))
- Mobile and chat surfaces got a broader refresh: the iOS Pro UI, hosted push relay default, realtime Talk tab playback, Gateway chat transport, onboarding, Talk permissions, WebChat reconnect delivery, and session picker behavior now preserve more state across reconnects and empty searches. ([#&#8203;87367](openclaw/openclaw#87367), [#&#8203;87531](openclaw/openclaw#87531), [#&#8203;87682](openclaw/openclaw#87682), [#&#8203;88096](openclaw/openclaw#88096), [#&#8203;88105](openclaw/openclaw#88105)) Thanks [@&#8203;ngutman](https://github.com/ngutman) and [@&#8203;BunsDev](https://github.com/BunsDev).
- Browser, channel, and automation inputs are stricter: Browser tool timeouts, viewport/tab indices, Gateway ports, cron retry handling, Discord component ids, schema array refs, Telegram callback pages, and channel progress callbacks now reject malformed values earlier and preserve the intended delivery context. ([#&#8203;82887](openclaw/openclaw#82887))
- Provider, media, and document coverage expands with Claude Opus 4.8, Fal Krea image schemas, NVIDIA featured models, MiniMax streaming music responses, encrypted PDF extraction, voice model catalogs, GitHub Copilot agent runtime support, and a Codex Supervisor plugin path for delegated Codex workflows. ([#&#8203;87845](openclaw/openclaw#87845), [#&#8203;87890](openclaw/openclaw#87890), [#&#8203;80775](openclaw/openclaw#80775), [#&#8203;84764](openclaw/openclaw#84764), [#&#8203;87751](openclaw/openclaw#87751), [#&#8203;87794](openclaw/openclaw#87794))
- CLI, auth, doctor, and provider paths fail faster and recover more clearly: malformed numeric/version options are rejected, workspace dotenv provider credentials are ignored, heartbeat defaults, OAuth/token lifetimes, and local service startup requests are bounded, agent auth health labels are clearer, legacy `api_key` auth profiles migrate to canonical form, and restart guidance is actionable. ([#&#8203;87398](openclaw/openclaw#87398), [#&#8203;86281](openclaw/openclaw#86281), [#&#8203;87361](openclaw/openclaw#87361), [#&#8203;88133](openclaw/openclaw#88133), [#&#8203;83655](openclaw/openclaw#83655), [#&#8203;87559](openclaw/openclaw#87559), [#&#8203;88088](openclaw/openclaw#88088), [#&#8203;85924](openclaw/openclaw#85924)) Thanks [@&#8203;vincentkoc](https://github.com/vincentkoc) and [@&#8203;giodl73-repo](https://github.com/giodl73-repo).
- Plugin and Gateway hot paths do less repeated work while preserving cache correctness for install records, config JSON parsing, tool search catalogs, session stores, manifest model rows, auto-enabled plugin config, browser tokens, viewer assets, and release-split external plugin packages. ([#&#8203;86699](openclaw/openclaw#86699))
- Release, QA, and E2E validation now bound more log, artifact, harness, and cross-OS waits so failing lanes produce proof instead of hanging or false-greening.

##### Changes

- Status: show active subagent details in status output.
- Diffs: split the default language pack and expand default Diffs language coverage while keeping the host floor aligned. ([#&#8203;87370](openclaw/openclaw#87370), [#&#8203;87372](openclaw/openclaw#87372)) Thanks [@&#8203;RomneyDa](https://github.com/RomneyDa).
- ClawHub: add plugin display names plus skill verification and trust surfaces. ([#&#8203;87354](openclaw/openclaw#87354), [#&#8203;86699](openclaw/openclaw#86699)) Thanks [@&#8203;thewilloftheshadow](https://github.com/thewilloftheshadow) and [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen).
- iOS: refresh the dev app with Pro Command, Chat, Agents, Settings, hosted push relay defaults, and realtime Talk playback wired to gateway sessions, diagnostics, chat, and realtime Talk. ([#&#8203;87367](openclaw/openclaw#87367), [#&#8203;88096](openclaw/openclaw#88096), [#&#8203;88105](openclaw/openclaw#88105)) Thanks [@&#8203;Solvely-Colin](https://github.com/Solvely-Colin) and [@&#8203;ngutman](https://github.com/ngutman).
- Docs: clarify Codex computer-use setup, paste-token stdin auth setup, macOS gateway sleep troubleshooting, native Codex hook relay recovery, container model auth, install deployment cards, device-token admin gating, CLI setup flow compatibility, Notte cloud browser CDP setup, and backport targets. ([#&#8203;87313](openclaw/openclaw#87313), [#&#8203;63050](openclaw/openclaw#63050), [#&#8203;87685](openclaw/openclaw#87685)) Thanks [@&#8203;bdjben](https://github.com/bdjben), [@&#8203;liaoandi](https://github.com/liaoandi), and [@&#8203;thewilloftheshadow](https://github.com/thewilloftheshadow).
- PDF/tools: use ClawPDF for PDF extraction, support encrypted PDF extraction, and surface MCP structured content in agent tool results. ([#&#8203;87670](openclaw/openclaw#87670), [#&#8203;87751](openclaw/openclaw#87751))
- Providers: add Claude Opus 4.8 support, Fal Krea image model schemas, NVIDIA featured model catalogs, MiniMax streaming music responses, and provider-backed voice model catalogs. ([#&#8203;87845](openclaw/openclaw#87845), [#&#8203;87890](openclaw/openclaw#87890), [#&#8203;80775](openclaw/openclaw#80775), [#&#8203;84764](openclaw/openclaw#84764), [#&#8203;87794](openclaw/openclaw#87794)) Thanks [@&#8203;eleqtrizit](https://github.com/eleqtrizit) and [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Codex/GitHub: add the GitHub Copilot agent runtime and the Codex Supervisor plugin package.
- Plugins: externalize GitHub Copilot and Tokenjuice as official install-on-demand plugins with npm and ClawHub publish metadata.
- Workboard: add agent coordination tools for tracking and handing off active agent work.
- Discord: show commentary in progress drafts so live Discord runs expose useful in-progress context. ([#&#8203;85200](openclaw/openclaw#85200))
- Plugin SDK: add a reply payload sending hook for plugins that need to deliver channel-owned replies and flatten package types for SDK declarations. ([#&#8203;82823](openclaw/openclaw#82823), [#&#8203;87165](openclaw/openclaw#87165)) Thanks [@&#8203;piersonr](https://github.com/piersonr) and [@&#8203;RomneyDa](https://github.com/RomneyDa).
- Policy: add policy comparison, ingress-channel conformance, and sandbox-posture conformance checks. ([#&#8203;85572](openclaw/openclaw#85572), [#&#8203;85744](openclaw/openclaw#85744), [#&#8203;86768](openclaw/openclaw#86768))

##### Fixes

- Agents: fall back to local config pruning when the optional `agents delete` Gateway probe cannot authenticate, so offline installs can still delete agents without removing shared workspaces.
- Tighten phone-control mutation authorization \[AI]. ([#&#8203;87150](openclaw/openclaw#87150)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- Clarify directive persistence authorization policy \[AI]. ([#&#8203;86369](openclaw/openclaw#86369)) Thanks [@&#8203;pgondhi987](https://github.com/pgondhi987).
- Agents/Codex: keep spawned agent cwd/workspace state separated, forward ACP spawn attachments, keep hook context prompt-local, release session locks on timeout abort and runtime teardown without deleting live OpenClaw-owned locks during cleanup, avoid session event queue self-wait, clean up exec abort listeners, stream assistant deltas incrementally, recover raw missing-thread compaction failures, preserve rotated compaction session identity, keep compaction-timeout snapshots continuable, preserve shared app-server state across startup or helper failures, keep native hook relay alive across restarts and prune stale bridge files, close native hook relay replacement races, keep Claude live tool progress visible for watchdog recovery, suppress abandoned requester completion handoff, route workspace memory through tools, resolve Codex runtime models first, report quarantined dynamic tools, format `skills` command output, bind node auto-review to prepared plans, retry Claude CLI transcript probes, and bound compaction/steering retries. ([#&#8203;87218](openclaw/openclaw#87218), [#&#8203;86875](openclaw/openclaw#86875), [#&#8203;86123](openclaw/openclaw#86123), [#&#8203;88129](openclaw/openclaw#88129), [#&#8203;87399](openclaw/openclaw#87399), [#&#8203;87375](openclaw/openclaw#87375), [#&#8203;72574](openclaw/openclaw#72574), [#&#8203;87383](openclaw/openclaw#87383), [#&#8203;87400](openclaw/openclaw#87400), [#&#8203;83022](openclaw/openclaw#83022), [#&#8203;87671](openclaw/openclaw#87671), [#&#8203;87738](openclaw/openclaw#87738), [#&#8203;87747](openclaw/openclaw#87747), [#&#8203;87706](openclaw/openclaw#87706), [#&#8203;87546](openclaw/openclaw#87546), [#&#8203;87541](openclaw/openclaw#87541), [#&#8203;81048](openclaw/openclaw#81048)) Thanks [@&#8203;mbelinky](https://github.com/mbelinky), [@&#8203;Alix-007](https://github.com/Alix-007), [@&#8203;luoyanglang](https://github.com/luoyanglang), [@&#8203;yetval](https://github.com/yetval), [@&#8203;sjf](https://github.com/sjf), [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;benjamin1492](https://github.com/benjamin1492), [@&#8203;c19354837](https://github.com/c19354837), [@&#8203;fuller-stack-dev](https://github.com/fuller-stack-dev), [@&#8203;pfrederiksen](https://github.com/pfrederiksen), and [@&#8203;dodge1218](https://github.com/dodge1218).
- Codex Supervisor: keep real-home app-server MCP session listing on the loaded state path, bound stored history scans, and close WebSocket probes cleanly.
- Channels: thread canonical session keys into outbound hooks, preserve Matrix room-id case, keep fallback tool warnings mention-inert, retain delivered Slack final replies during late cleanup, continue iMessage polling after denied reactions, suppress duplicate native exec approvals, resolve Gateway message actions against the active runtime config, preserve Telegram SecretRef prompt config and polling keepalives, preserve WhatsApp profile auth roots, QR display, document filenames, and plugin hook config, suppress Discord recovered tool warnings, preserve the Discord voice outbound helper, cap Discord/Signal/Zalo channel request and container timeouts, and block untrusted Teams service URLs while keeping TeamsSDK patterns aligned. ([#&#8203;73706](openclaw/openclaw#73706), [#&#8203;75670](openclaw/openclaw#75670), [#&#8203;87366](openclaw/openclaw#87366), [#&#8203;87451](openclaw/openclaw#87451), [#&#8203;87465](openclaw/openclaw#87465), [#&#8203;87334](openclaw/openclaw#87334), [#&#8203;84535](openclaw/openclaw#84535), [#&#8203;76262](openclaw/openclaw#76262), [#&#8203;83304](openclaw/openclaw#83304), [#&#8203;82492](openclaw/openclaw#82492), [#&#8203;87581](openclaw/openclaw#87581), [#&#8203;77114](openclaw/openclaw#77114), [#&#8203;86426](openclaw/openclaw#86426), [#&#8203;85529](openclaw/openclaw#85529), [#&#8203;87160](openclaw/openclaw#87160)) Thanks [@&#8203;zeroaltitude](https://github.com/zeroaltitude), [@&#8203;lukeboyett](https://github.com/lukeboyett), [@&#8203;jarvis-mns1](https://github.com/jarvis-mns1), [@&#8203;xiaotian](https://github.com/xiaotian), [@&#8203;funmerlin](https://github.com/funmerlin), [@&#8203;joshavant](https://github.com/joshavant), [@&#8203;eleqtrizit](https://github.com/eleqtrizit), [@&#8203;heyitsaamir](https://github.com/heyitsaamir), [@&#8203;amittell](https://github.com/amittell), [@&#8203;lidge-jun](https://github.com/lidge-jun), [@&#8203;liorb-mountapps](https://github.com/liorb-mountapps), [@&#8203;masatohoshino](https://github.com/masatohoshino), [@&#8203;bladin](https://github.com/bladin), and [@&#8203;giodl73-repo](https://github.com/giodl73-repo).
- CLI/auth/doctor/providers: reject malformed numeric/timeout/subcommand-version inputs, ignore workspace dotenv provider credentials, wait for respawn child shutdown, bound heartbeat defaults plus Codex, GitHub Copilot, OpenAI, Anthropic, Google, Feishu, LM Studio, MiniMax, Xiaomi TTS, and local-provider OAuth/token/model requests, harden Codex auth probes, label auth health by agent, preserve explicit agentRuntime pins during Codex model migration, warm provider auth off the main thread, honor Codex response timeouts, stop migrating current Claude Haiku 4.5 profiles to Sonnet, bound local service startup, resolve GPT-5.5 without cached catalog, migrate legacy memory auto-provider config, rewrite non-canonical `api_key` auth profiles, and make doctor restart follow-ups actionable. ([#&#8203;87398](openclaw/openclaw#87398), [#&#8203;86281](openclaw/openclaw#86281), [#&#8203;87361](openclaw/openclaw#87361), [#&#8203;88133](openclaw/openclaw#88133), [#&#8203;83655](openclaw/openclaw#83655), [#&#8203;87559](openclaw/openclaw#87559), [#&#8203;87719](openclaw/openclaw#87719), [#&#8203;88088](openclaw/openclaw#88088), [#&#8203;85924](openclaw/openclaw#85924), [#&#8203;84362](openclaw/openclaw#84362)) Thanks [@&#8203;Patrick-Erichsen](https://github.com/Patrick-Erichsen), [@&#8203;samzong](https://github.com/samzong), [@&#8203;giodl73-repo](https://github.com/giodl73-repo), [@&#8203;alkor2000](https://github.com/alkor2000), [@&#8203;mmaps](https://github.com/mmaps), [@&#8203;nxmxbbd](https://github.com/nxmxbbd), and [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Gateway/security/session state: expire browser tokens after auth rotation, scope assistant idempotency dedupe, drain probe client closes, avoid stale restart continuation reuse, preserve retry-after fallbacks and stale rate-limit cooldown probes, bound webchat image and artifact transcript scans, include seconds in inbound metadata timestamps, clear completed session active runs, clear stale chat stream buffers, and evict current plugin-state namespaces at row caps. ([#&#8203;87810](openclaw/openclaw#87810), [#&#8203;87833](openclaw/openclaw#87833), [#&#8203;75089](openclaw/openclaw#75089)) Thanks [@&#8203;joshavant](https://github.com/joshavant) and [@&#8203;litang9](https://github.com/litang9).
- Config/parsing/network: reject partial numeric parsing, parse provider/Discord retry headers and dates strictly, honor IPv6 and bare IPv6 `no_proxy` entries, preserve empty plugin allowlists, canonicalize secret target array indexes, and reject malformed media content lengths, inspected TCP ports, marketplace content lengths, cron epochs, sandbox stat fields, unsafe duration values, empty config path segments, noncanonical schema array refs, unsafe Telegram callback pages, and invalid Teams attachment-fetch DNS targets. ([#&#8203;87883](openclaw/openclaw#87883)) Thanks [@&#8203;zhangguiping-xydt](https://github.com/zhangguiping-xydt).
- Browser/input hardening: reject invalid tab indexes, excessive viewport resizes, explicit zero CDP ports, malformed geolocation options, unsafe screenshot or permission-grant timeouts, loose response-body limits, invalid cookie expiries, and non-finite Browser tool delays/timeouts.
- Cron/automation: retry recurring jobs after transient model rate limits before waiting for the next scheduled slot, and preflight model fallbacks before skipping scheduled work. ([#&#8203;82887](openclaw/openclaw#82887)) Thanks [@&#8203;chen-zhang-cs-code](https://github.com/chen-zhang-cs-code).
- Auto-reply/directives: respect provider and relayed channel metadata during directive persistence so channel-originated decisions keep their intended context. ([#&#8203;87683](openclaw/openclaw#87683))
- WhatsApp: resolve the auth directory from the active profile so profile-scoped WhatsApp installs do not drift to the wrong credential root. ([#&#8203;82492](openclaw/openclaw#82492)) Thanks [@&#8203;lidge-jun](https://github.com/lidge-jun).
- Gateway/session state: clear completed session active runs, avoid cold-loading providers for MCP inventory, cache single-session child indexes, cap handshake timers, and bound preauth, auth-guard, media, transcript, readiness, and port options.
- Channels/replies: preserve channel-owned progress callbacks when verbose output is off, keep group-room progress suppression intact, prefer external session delivery context, escape Discord component id delimiters, force final TUI chat repaints, show Slack reasoning previews, and normalize Discord/Matrix/Mattermost channel numeric options. ([#&#8203;87476](openclaw/openclaw#87476), [#&#8203;87423](openclaw/openclaw#87423))
- Agents/tool args: harden smart-quoted argument repair for edit arrays and exact escaped arguments so model-produced tool calls recover without corrupting valid input. ([#&#8203;86611](openclaw/openclaw#86611)) Thanks [@&#8203;ferminquant](https://github.com/ferminquant).
- Providers/agents: preserve seeded Anthropic signatures, preserve signed thinking payloads, concatenate signature-delta chunks, preserve DeepSeek `reasoning_content` replay across tier suffixes, apply OpenRouter strict9 ids to Mistral routes, promote Ollama plain-text tool calls, load NVIDIA featured model catalogs, stream MiniMax music generation responses, and recover empty preflight compaction. ([#&#8203;87593](openclaw/openclaw#87593), [#&#8203;87493](openclaw/openclaw#87493), [#&#8203;80775](openclaw/openclaw#80775), [#&#8203;84764](openclaw/openclaw#84764)) Thanks [@&#8203;Pluviobyte](https://github.com/Pluviobyte) and [@&#8203;eleqtrizit](https://github.com/eleqtrizit).
- Media/images: skip CLI image cache refs when resolving generated images, allow trusted generated HTML attachments, and bound generated video downloads so stale refs and slow providers fail cleanly. ([#&#8203;87523](openclaw/openclaw#87523), [#&#8203;87982](openclaw/openclaw#87982))
- File transfer: handle late tar stdin pipe errors after archive validation or unpacking has already settled.
- Performance: trust install-record caches between reloads, prefer native JSON parsing, reuse unchanged tool-search catalogs, reuse gateway session and plugin metadata paths, skip unchanged store serialization, patch single-entry session writes, add precomputed session patch writers, reduce store clone allocations, cache manifest model catalog rows and auto-enabled plugin config, avoid full session snapshots for entry reads, defer configured Slack full startup, prefer bundled plugin dist entries, and slim current metadata identity caches. ([#&#8203;87760](openclaw/openclaw#87760))
- Docker/release/QA: package runtime workspace templates, stream cross-OS served artifacts, preserve sparse Crabbox run artifacts, isolate npm plugin installs per package, reject incompatible package plugin API installs, drop the leftover root Sharp dependency from package manifests after the Rastermill migration, bound OpenClaw instance logs, plugin gauntlet relay logs, MCP channel buffers, kitchen-sink scans, agent-turn assertions, QA-Lab credential broker calls, QA Matrix substrate requests, and release scenario logs, and keep release/google live guards current. ([#&#8203;87647](openclaw/openclaw#87647), [#&#8203;87477](openclaw/openclaw#87477)) Thanks [@&#8203;rohitjavvadi](https://github.com/rohitjavvadi) and [@&#8203;vincentkoc](https://github.com/vincentkoc).
- Release/CI: bound manual git fetches, ClawHub verifier responses, ClawHub owner metadata, dependency-guard error bodies, Parallels limits, startup/test/memory budget parsing, and diffs viewer build warnings so release lanes fail with useful proof instead of hanging. ([#&#8203;87839](openclaw/openclaw#87839))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL3BhdGNoIl19-->

Reviewed-on: https://git.erwanleboucher.dev/eleboucher/homelab/pulls/759
SYU8384 pushed a commit to SYU8384/openclaw that referenced this pull request Jun 3, 2026
Fix cron local-model preflight fallback handling so scheduled runs try configured fallback candidates before skipping when the local primary is unavailable.

Verification:
- GitHub CI on PR head fe884da: passing required CI checks.
- Local focused cron/model fallback tests passed earlier for the touched surface.
- Local merge-wrapper build and check passed on the prepared candidate.
- Local full pnpm test reported unrelated failures outside this PR's touched files; touched files are limited to cron docs, src/agents/model-fallback.ts, and src/cron/isolated-agent/*.

Co-authored-by: chen-zhang-cs-code <chenzhangcode@163.com>
Co-authored-by: Onur Solmaz <2453968+osolmaz@users.noreply.github.com>
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
Fix cron local-model preflight fallback handling so scheduled runs try configured fallback candidates before skipping when the local primary is unavailable.

Verification:
- GitHub CI on PR head fe884da: passing required CI checks.
- Local focused cron/model fallback tests passed earlier for the touched surface.
- Local merge-wrapper build and check passed on the prepared candidate.
- Local full pnpm test reported unrelated failures outside this PR's touched files; touched files are limited to cron docs, src/agents/model-fallback.ts, and src/cron/isolated-agent/*.

Co-authored-by: chen-zhang-cs-code <chenzhangcode@163.com>
Co-authored-by: Onur Solmaz <2453968+osolmaz@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling docs Improvements or additions to documentation merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. P1 High-priority user-facing bug, regression, or broken workflow. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. size: M status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cron model preflight skips entire run when local primary is unreachable, ignoring configured cloud fallbacks [AI]

2 participants