scion-scheduler
GitHub指导智能体使用 Scion CLI 调度一次性或周期性事件,对比延迟消息与持久化调度的适用场景,并规范外部等待时的阻塞状态与自唤醒配对机制。
Trigger Scenarios
Install
npx skills add GoogleCloudPlatform/scion --skill scion-scheduler -g -y
SKILL.md
Frontmatter
{
"name": "scion-scheduler",
"description": "Schedule one-shot and recurring events for agents using the Scion CLI. Covers when to use scheduled events vs inline message delays, recurring cron schedules, lifecycle management, and the blocked-wait pairing rule."
}
Scion Scheduler
Schedule future events that deliver messages to agents — either one-shot (fire once at a specific time) or recurring (fire on a cron schedule). All schedules are project-scoped — an agent can only create and manage schedules within its own project.
For full command syntax: scion schedule --help and its subcommands.
Two ways to schedule — when to use which
Scion has two scheduling mechanisms. They solve different problems:
scion message --in/--at |
scion schedule create / create-recurring |
|
|---|---|---|
| Nature | fire-and-forget delayed send | durable, project-scoped event |
| Manageable | no handle once sent | list, inspect, cancel, pause, resume, delete, history |
| Visibility | only sender knows it exists | any agent in the project can scion schedule list |
| Recurrence | no | yes (create-recurring --cron) |
Use scion message --in for a simple self-callback during your own wait —
you need a poke, not a managed object.
Use scion schedule create when any of these apply:
- The event is recurring
- Another agent may need to inspect, cancel, or take over the schedule
- The wait outlives the current agent's session
- You need execution history or failure tracking
Waiting on external processes — the blocked-wait pairing rule
When waiting on an external, non-agent process (CI run, build job, deploy,
third-party API), calling sciontool status blocked "..." alone is not
sufficient. That command marks intentional waiting for the stall detector —
it does not poll anything or wake you when the external condition resolves.
Without a separate wake mechanism, you go fully idle and only resume if an
unrelated inbound message happens to arrive.
Correct pattern: schedule a self-callback, then set blocked status.
scion message --in 5m agent:<self> "recheck CI status"
sciontool status blocked "Waiting for CI run to complete"
The self-callback delivers the wake-up; status blocked prevents the stall
detector from flagging you during the wait. Neither replaces the other.
status blockedalone → stall detector is happy, but you never wake up- Self-callback alone → you wake up, but the stall detector may flag you first
sciontool status blocked alone is sufficient when waiting on another
agent or a scheduled event already tracked by the orchestration system —
those fire their own state-change notifications.
Self-scheduling
To schedule a message to yourself, resolve your own agent name first:
scion schedule create --non-interactive --type message \
--agent "$(scion whoami --non-interactive --format json | jq -r .name)" \
--message "Check if deployment completed" \
--in 15m
Two event types
One-shot events
Fire once, then done. Specify timing with --in (relative delay: 30m,
2h) or --at (absolute ISO 8601 timestamp, UTC).
Recurring schedules
Fire on a cron expression (5-field: minute hour day-of-month month day-of-week, UTC). Each recurring schedule has a name, can be paused and resumed, and maintains execution history.
Message-to-orchestrator pattern
To create agents on a timer, message a long-lived orchestrator rather than dispatching agents directly from the schedule. The orchestrator receives the message and creates/manages task agents as needed — keeping agent lifecycle owned by something that can reason about it.
Lifecycle management
| Action | Command |
|---|---|
| List all events and schedules | scion schedule list |
| List only recurring | scion schedule list --show recurring |
| List only one-shot | scion schedule list --show events |
| Inspect | scion schedule get <id> |
| Cancel a one-shot event | scion schedule cancel <id> |
| Pause a recurring schedule | scion schedule pause <id> |
| Resume a paused schedule | scion schedule resume <id> |
| Delete a recurring schedule | scion schedule delete <id> |
| View execution history | scion schedule history <id> |
Gotchas
- Cron is UTC. There is no timezone configuration — convert from local time before writing the expression.
cancelvspausevsdelete:cancelis for one-shot events only.pauseanddeleteare for recurring schedules only. Using the wrong command on the wrong type will result in an error.- Schedule names must be unique within the project.
- Clean up recurring schedules when the task they serve is complete — they fire indefinitely until paused or deleted.
- Check existing schedules with
scion schedule listbefore creating new ones — duplicate schedules deliver duplicate messages.
Version History
- 0.1.0-dev Current 2026-08-20 01:53


