1. Create it with the schedule attached
No
completion_window here, on purpose. standard and flex are served
only on zai-org/GLM-5.2-FP8; on anthropic/claude-sonnet-4-5 a non-asap
window is meant to be refused at the first model call with window_unavailable
rather than downgraded, which would turn this agent’s 6am wake into a failed
task. 🔴 On deployed staging the refusal did not fire — the wake ran and was
billed on asap under a flex request — so the downside is a silent wrong
tariff rather than a loud failure, which is worse to notice. If the agent is
pinned to GLM-5.2, completion_window: "flex" is the right setting for work
nobody is waiting on — see pricing.Five cron fields —
min hour dom mon dow. Seconds are not a field, and a
6-field expression is refused at create with invalid_input. tz is IANA and
defaults to UTC; use a real timezone if you care about daylight saving,
because 0 6 * * * in UTC drifts an hour against Pacific twice a year.--cron takes "<5-field cron>=<the work>":
2. Several schedules on one agent
schedule takes an array.
enabled: false keeps the row without arming it — the way to pause one
schedule without losing its definition.
3. Check that it actually woke
The board records which door the work came through, so a schedule-fired task is distinguishable from one you sent by hand:4. Read what it delivered
content. Larger ones come back as a
download_url minted fresh on this read, valid for an hour and
unauthenticated once issued — do not cache it, call again.
5. Stop it without deleting it
6. What it costs to leave running
Between 06:00 and 06:00 the next day this agent is asleep with one alarm set for its next fire, and it costs storage. You are billed for the wake, the model calls inside it, and any paid tools it used.alert_at is stored and
nothing fires off it. Read the budget event on the stream instead: it carries
spend against the cap on every turn, before the call it is gating.
Failure modes worth wiring up
Every diagnosis below reads the board, never
agent.status. The agent
record’s status, blocked_reason, attention, next_wake_at and wakes are
a mirror nothing writes back to; a braked or blocked agent still reads
status: "idle".It braked mid-month
It braked mid-month
A task with
status: "braked" on the board means the cap bound. It does not
restart on its own — the board never claims a braked task, and neither the
period reset nor a higher cap moves it back. Raise the cap and re-send the work:budget on update is a full replacement, so send every field you want kept.It is waiting on you
It is waiting on you
A task sitting at A scheduled agent that parks at 6am and is not answered stays parked. If you do
not want it asking, give it
status: "waiting" on the board. Find it and answer it:mode guidance in instructions — a task sent with
mode: "ask" gets read-only tools, but a schedule’s work always runs as act.Nothing ran at all
Nothing ran at all
Check the primitive first, then the agent’s own log:An empty board with
source: schedule and an empty log is the real signal. Do
not read next_wake_at for this: it is null on every agent, armed or not.
The usual causes are every schedule entry having enabled: false, or a cron
the agent’s parser rejected at config push — which surfaces as
agent_not_configured on the next task rather than as a silent no-op.