Scheduled work
Every agent so far only acts when emailed. Scout's real value is proactive: each morning she should check what's running low and email the ops team. That's a responsibility — a standing duty that runs on a schedule, the Loop layer of Protege.
What a responsibility is
A responsibility is a small, dashboard-managed record: which persona, what instruction, how often. It's not code — it's data, so an operator can add or retune a duty without a deploy. When it comes due, the scheduler runs the owning agent through the same inference cycle an email would, but seeded with the responsibility's instructions instead of an inbound message.
The tick that drives this was already wired by protege:install — a job that fires once a minute and dispatches whatever's due. You don't configure anything else for scheduling to work.
Give Scout a duty
In the dashboard, open Scout and add a responsibility (Responsibilities → New under the persona):
Name: Daily low-stock report
Schedule:
0 8 * * *(every day at 08:00 — a standard 5-field cron expression)Instructions:
Check which flavors are low or out of stock. Email a concise summary to
team@thescoop.com, and for anything critical, note whether we should reorder.
Or create it as a record directly:
scout = OperationsPersona.find_by!(name: "Scout")
scout.responsibilities.create!(
name: "Daily low-stock report",
schedule: "0 8 * * *",
instructions: "Check which flavors are low or out of stock. Email a concise summary to " \
"team@thescoop.com, and for anything critical, note whether we should reorder."
)At 08:00, Scout wakes on her own: her responsibility_resolvers chain assembles the turn (her system prompt plus this duty's instructions), she calls check_flavor_stock as needed, and sends the summary with send_email in new mode. No inbound email involved — she initiated the whole thing.
You could add a second duty the same way — an abandoned-order follow-up that emails customers who never completed checkout — and it runs on its own schedule, independently.
Watching runs
Each execution is a run, recorded so you can see history and audit what happened. A run moves through pending → running → completed (or failed), and the dashboard shows Scout's recent runs with their status and the tools each one called. To test without waiting for 08:00, use Run now on the responsibility — it dispatches immediately.
The scheduler is deliberately minimal
The Loop fires due duties and leaves the rest to Rails. There's no overlap guard — if a run is still going when the next tick fires, a second can start — so keep a duty's cadence comfortably longer than its work takes. Concurrency and retries are your job queue's concern, not the scheduler's. See Scheduler.
Next
Sundae and Scout are both working — one reactive, one proactive. Before you trust them, you'll want to see what they're doing.
→ Observing your agent — the introspection panel and tracing.

