Issue:
Hey — I found what looks like a real cron model-routing bug in OpenClaw.
I’m trying to run cron jobs on openai-codex/gpt-5.2 because gpt-5.4 is too expensive for scheduled jobs.
What we tested:
- Updated existing cron jobs so they explicitly have:
sessionTarget: "isolated"payload.kind: "agentTurn"payload.model: "openai-codex/gpt-5.2"
- Verified in the live cron list and in
~/.openclaw/cron/jobs.jsonthat the jobs really are stored with:
payload.model: "openai-codex/gpt-5.2"
- Forced a run manually and checked the actual run record:
- the job still ran on
gpt-5.4
- Restarted the gateway and forced the same job again:
- still ran on
gpt-5.4
- Created a completely fresh test cron job from scratch with:
payload.model: "openai-codex/gpt-5.2"sessionTarget: "isolated"- then forced it immediately
- live execution still surfaced under the main Discord session on
gpt-5.4
- Created a dedicated agent:
id: cron-codex-52model: openai-codex/gpt-5.2
Then updated the cron job to:
agentId: "cron-codex-52"
Forced it again, and it still ran on gpt-5.4.
Expected behavior
If a cron agentTurn job is configured with:
payload.model = openai-codex/gpt-5.2
or even bound to an agent whose model is:
openai-codex/gpt-5.2
then the actual cron run should execute on gpt-5.2.
Actual behavior
Fresh forced cron runs still execute on gpt-5.4, which appears to be the main/default model.
Strongest clue
Even when the cron job is isolated and freshly forced, the live session state often shows it surfacing through:
agent:main:discord:channel:...
with model:gpt-5.4
So it looks like cron runtime is ignoring the cron model override / bound agent model and falling back to the main default runtime model.
Why this matters
This makes cron jobs much more expensive than intended, because cost-sensitive scheduled tasks can’t actually be pinned to a cheaper model.