Set it once, forget it.
carlos's daemon fires scheduled runs. Five-field cron plus a seven-form English grammar. Each schedule binds to a frame; the per-fire context loads that frame's provider override, vault subtree, and capabilities.
How to schedule
carlos schedule add "every weekday at 9am tell me yesterday's PRs" carlos schedule add -f research "daily at 7am summarize hn front page" carlos schedule list carlos schedule rm <id>
Or from the TUI composer:
/schedule list /schedule add <natural-language expression> /schedule rm <id>
Grammar
Two surfaces accepted; both lower to the same internal cron shape.
Five-field cron
m h dom mon dow # standard cron, UTC by default; local-tz via config
Natural language (seven forms)
The parser at internal/schedule/parse.go accepts a small English grammar:
every weekday at 9amdaily at 7amevery 30 minutesevery monday and wednesday at 10pmweekly on friday at 5pmmonthly on the 1st at midnightat 14:30
Each form lowers to the five-field shape; carlos schedule list shows both representations side by side.
Per-frame fires
Schedules carry a frame: field (Phase F-14). Daemon-side per-fire plumbing (73905ac) resolves the right provider via frame.ResolveProvider before each run. The -f <frame> flag on carlos schedule add populates this field; frame.ResolveProvider honors provider_override if set on the frame.
Notifications + gateway
The system notifier is wired to scheduled-run completion: osascript on macOS, notify-send on Linux, no-op fallback elsewhere. When the gateway is enabled, delivery routes through the same broker that handles approval prompts. See Gateway for the adapter set.
Daemon management
carlos daemon enable # install launch agent (launchd / systemd --user) carlos daemon disable # uninstall carlos daemon status # is it running, when did it last fire carlos daemon run # foreground run (for debugging)
The daemon listens on ~/.carlos/daemon.sock (UDS IPC). The onboarding daemon screen surfaces what enabling actually means (Phase O-4 consequence box).
Output
Per-fire artifacts land under ~/.carlos/frames/<name>/digest/. Each run is a sub-agent in its own right; the same Budget and Tracker caps apply. The supervisor view surfaces scheduled runs the same as any other sub-agent, so a runaway nightly job shows up where you already look.
Composing with research
A useful pattern: schedule a recurring /research so the cited report lands automatically. Combined with gateway delivery, you get a digest pushed to your phone every morning.
Daily WebGPU digest at 7am, delivered via ntfy to your phone:
carlos schedule add -f research \ "daily at 7am research what's new in webgpu"
The fire spawns a /research sub-agent in the research frame; the cited report saves to ~/.carlos/frames/research/research/ and the completion notification routes through whichever gateway channel you wired.
Related
Gateway covers the broker that delivers scheduled-run notifications off-box. Research documents the pipeline that pairs naturally with recurring fires. Frames covers provider_override and the per-frame context each fire loads; slash commands covers /schedule and /daemon.