Day 6 of 16 · Friday · Learning

/loop and ScheduleWakeup vs fragile LaunchAgentsCapability

Two tools let Claude pace its own recurring work while you watch — /loop (repeat a prompt on an interval) and ScheduleWakeup (let the model decide when to wake up next). Unlike your 06:15 LaunchAgents, every iteration happens inside a live session, so when it breaks you SEE it break.

Catch-up progress
6/16
Why this matters to you

Your whole morning system runs on LaunchAgents — com.tom.pdb-plan-day, com.tom.pdb-prep-big3, com.tom.pdb-language-lesson, app.zorc.learning-lesson. They're the right tool for 06:15 when you're asleep. But they fail silently: the RemoteTrigger that emailed your language lesson died twice (5/27 and 5/28) and last_fired_at still said 'success' because the trigger fired even though the work didn't. /loop is the opposite trade — it runs while you're present, so a failure lands in the conversation instead of a log nobody reads.

A LaunchAgent is macOS's cron: a plist in ~/Library/LaunchAgents tells the OS 'run this command at this time' and walks away. It's unattended and durable — perfect for the 06:15 plan-day run — but the OS only guarantees it STARTED the process. Whether the work actually succeeded is invisible unless you build verification in (which is exactly why your CLAUDE.md automation-hygiene rules exist).

/loop is a different shape: you're in a Claude session and you say '/loop 10m /some-command'. Claude runs it now, waits 10 minutes, runs it again — inside the same conversation. Every iteration's output is right there. If iteration 3 errors, you read the error. It's for work you want to babysit: polling a deploy, watching a file land, re-checking a flaky thing until it's green.

ScheduleWakeup is the self-pacing version. Instead of a fixed interval, Claude looks at what it's waiting for and picks its own next wake-up time — 'CI takes ~8 min, I'll check back in 270 seconds' vs 'nothing to do, sleep 20 minutes'. You hand over the cadence decision to the model. The mental model: LaunchAgent = fire-and-forget alarm clock; /loop = a kitchen timer you keep resetting while you cook; ScheduleWakeup = telling a smart assistant 'wake me when it makes sense'.

Worked example

You don't need to write any code to try /loop — it's a slash command you type in a session. Here's the smallest useful one against your own output repo:

/loop 5m check whether output/plan-day/today.html has been updated in the last hour; if not, tell me, otherwise just say 'fresh' and keep waiting
▶ Do it now
  1. Pick ONE thing you currently check by hand-refreshing — pdb.zorc.app loading, a git push landing, the language email arriving in your inbox.
  2. Start a /loop on it with a sane interval (5m for something that changes in minutes; don't go under 60s).
  3. Let it run two or three iterations, then watch what happens when you deliberately make it fail — e.g. point it at a file that doesn't exist — and confirm the failure shows up in the conversation immediately.
  4. Then stop the loop. The lesson isn't the loop itself — it's feeling the difference between a failure you SEE and the silent 5/27 kind.

Gotchas

Go deeper: Your automation-hygiene rules (why silent failure is the enemy)
One-card takeaway

Use launchd for work that must happen while you sleep; use /loop and ScheduleWakeup for work you want to watch happen — the difference is whether a failure surfaces in your face or rots in a log.