Daily rhythm
A single user’sroutines/ directory can define an entire day. Here’s how
17 routines and a handful of reminders fit together:
| Time | Routine | Mode | Purpose |
|---|---|---|---|
| 8:00 AM | Self-reflection | bg | Review last 24h, report one finding |
| 8:30 AM | Morning briefing | bg | Email triage, tasks, calendar dashboard |
| 9:15 AM | Sleep diary | bg | Collect last night’s sleep data |
| 10:00 AM | Email check (morning) | bg | Catch emails after briefing cutoff |
| 12:00 PM | Workout nudge | bg | Weather-aware workout suggestion |
| 12:30 PM | Lunch break | bg | Break nudge + midday task triage |
| 2:00 PM | Email check (afternoon) | bg | Afternoon email sweep |
| 4:30 PM | End-of-day wrap-up | bg | EOD triage, schedule follow-ups |
| 6:00 PM | Chore time | bg | Pick one chore, 15 minutes |
| 8:00 PM | Music practice | bg | Practice nudge with category rotation |
| 10:00 PM | Nightly sleep | bg | Schedule dynamic bedtime chain |
| Every 4h | Identity stabilize | bg, no ping | Keep profile file current |
Routines
Morning briefing — multi-step dashboard
The most complex routine. It gathers data from multiple sources in parallel, creates tasks from findings, schedules reminders for time-critical items, and sends a single dashboard embed with action buttons.routines/morning-briefing.md
- Parallel enrichment — core steps always run; enrichment steps are best-effort and skipped on failure
- Graceful degradation — the embed always sends, even with partial data
- Dedup awareness — checks existing reminders before scheduling new ones
- Cap overwhelm — limits “needs a deadline” suggestions to 2-3 items
Workout nudge — embeds with buttons and follow-up chains
Sends a weather-aware workout suggestion with interactive buttons, then schedules a 2-hour follow-up chain to check in.routines/workout-nudge.md
- Agent buttons — each button’s
actionis anagent:<prompt>that tells the interactive fork what to do when clicked - Adaptive button set — active recovery omits Harder/Easier; runs omit Choose Exercises
- Follow-up chain — the routine itself schedules a chain reminder to check back later
- report_updates is critical — without it, the main session can’t handle button clicks (“Harder” with no workout context)
Nightly sleep — dynamic chain scheduling
A silent scheduler routine that reads sleep data, calculates a custom bedtime, and schedules a 4-step nudge chain timed around it.routines/nightly-sleep.md
- Routine creates reminders — the routine itself never pings; it calculates timing and schedules a chain reminder that does
- Self-contained chain prompts — each chain step must carry all context since it runs in a fresh fork
- Dynamic timing — chain delays are computed from data, not hardcoded
- Data-driven scheduling — bedtime adjusts weekly based on sleep efficiency metrics
Chore time — low-friction ADHD nudge
A simple routine designed around ADHD — lower the bar to “one thing, 15 minutes” instead of listing everything that needs doing.routines/chore-time.md
- Behavioral design — the prompt encodes knowledge about the user’s ADHD and designs the interaction around it
- Chain length by urgency — more urgent tasks get longer chains
- Dedup before scheduling — checks
reminder listto avoid compounding chain reminders
Email check — conditional silence
A quiet background routine that only pings when something is genuinely urgent. Most runs produce no notification at all.routines/email-check-morning.md
- Time-based dedup — ignores emails before 8:30 AM because the morning briefing already handled them
- Conditional ping — strict criteria for when to notify; defaults to silence
- Content boundary — explicit instruction to treat email as data, preventing prompt injection via email
Self-reflection — observation-only meta-routine
A meta-routine that reviews the bot’s own behavior. It runs before the morning briefing and feeds findings into it, but takes no action itself.routines/self-reflection.md
- Routine pipeline — self-reflection runs at 8:00 AM, morning
briefing at 8:30 AM. The briefing receives the finding via
report_updates(prepended as pending updates) - Single finding — avoids information overload by surfacing only the highest-impact issue
- No side effects — explicitly prevented from creating tasks or scheduling reminders to avoid double-processing
Identity stabilize — silent maintenance
A high-frequency maintenance routine that keeps a core profile file accurate. Runs every 4 hours, never pings, and uses the cheapest model.routines/identity-stabilize.md
model: "haiku"— uses the cheapest model since this is simple file maintenanceallow_ping: false— can never notify the user; purely backgroundupdate_main_session: "freely"— reports updates even without pinging, so the main session stays informed- Freshness protocol — date-tagged facts with automatic staleness pruning
Reminders
One-shot reminder — time-sensitive errand
A simple time-based nudge for a real-world errand. Created by the agent during conversation when the user mentioned a pickup.reminders/cake-pickup-reminder.md
- No description needed — the message is self-explanatory
- Agent-created — the user mentioned the pickup in conversation; the agent scheduled the reminder automatically
- Precise timing —
run_atis an exact ISO datetime computed from a delay
Future-dated reminder — scheduled weeks out
A reminder scheduled far in advance for a recurring financial event. The detailed message ensures a fresh agent fork has full context.reminders/token-unlock-reminder.md
- Self-contained context — the reminder includes everything a future agent needs (batch number, remaining count, action to take)
- Foreground — no
background: true, so this fires as a direct DM for maximum visibility on a financial deadline - Far future — scheduled 6 weeks out; the scheduler handles this
natively via
DateTrigger
Chain reminders — spawned by routines
These aren’t created manually. The workout nudge, nightly sleep, and chore routines all schedule chain reminders dynamically:follow_up_chain(minutes_from_now=N) to
schedule the next step, or simply end the chain by not calling it.
Patterns worth noting
Routine pipelines
Routines can feed into each other viareport_updates:
Conditional silence
Most background routines default to silence. They only ping when criteria are met:- Email checks: ping only for urgent, human-sent, actionable mail
- End-of-day: silent if nothing is overdue or due
- Responsiveness review: silent if all reminders are working well
- Identity stabilize:
allow_ping: false— can never notify
Behavioral design in prompts
Routines encode knowledge about the user’s needs directly in the prompt:- Chore time: “ADHD makes starting the hardest part — lower the bar”
- Morning briefing: “cap at 2-3 suggestions because more is overwhelming”
- Workout nudge: “no guilt” skip option on every workout
- Music practice: “feel like a friend nudging, not a task manager”
Chain reminders for progressive nudging
Chains create multi-step follow-up sequences without open-ended loops:- Workout: suggest → 2h check-in → offer quick version (max 2)
- Sleep: wind-down → screens off → bedtime → final call (max 3)
- Chores: nudge → 1h check-in → gentle reminder (max 2)
