Do this later. TWO SHAPES, and the only difference is where it lands.
session_id PRESENT — come back to that conversation. The woken turn joins
the session's own FIFO, so it holds everything that was said and answers
where the question was asked. This is 1,707 of the 2,122 schedules this
product has ever written.
session_id ABSENT — a fresh, clean item scoped to the workspace. No
conversation is resumed and nothing is interrupted. 415 of 2,122, and it was
already the path scheduler._dispatch_schedule took for an untargeted
agent.run; it simply had no door on this route.
WHY THE SECOND SHAPE HAD TO EXIST HERE, and it is not a convenience. This
field was mandatory, and _current_session_id raises when
STORMY_MCP_SESSION_ID is unset — which it always is in the ./kk seat,
because a seat is not a durable turn. So the seat's only scheduling verb
refused, every time. A refusal there does not fail safe: measured in the
live seat on 2026-08-15, the model answered the refusal by running
nohup bash -c 'sleep 30 && echo ... > bg_task_30s.log' & and reporting
"Yes! I have dispatched a background task." A process that dies with the
container, a log nobody reads, and a confident false receipt. The cure for
that is not a better refusal, it is a shape that works.
Sibling of /schedules, which stays the general form: any kind, on a cron
or an interval. RECURRENCE IS DELIBERATELY NOT HERE — 2,121 of 2,122 rows
are {"type": "once"} and 544 of 544 recorded agent calls asked for one
wake. A repeating job is infrastructure and goes through /schedules.