Your scheduled jobs are run by macOS's launchd, configured by little XML files called LaunchAgents. Today you'll learn to read one, list what's actually loaded, and spot the silent-unload failure mode that just cost you three days of plan-day runs.
Your Today list this morning is a wall of 🚨 — plan-day failed 6/13 and 6/14, learning-email and language pre-render too. Yet plan-day runs perfectly when you fire it by hand (you're reading the proof). That gap between *scheduled* and *manual* is a launchd story, and the same silent-unload bug bit you on Jun 5 in the notification audit. You can't fix what you can't read.
launchd is the traffic controller macOS starts before anything else and never stops. Every recurring job you have — the 06:15 plan-day, the 10:00 language email, the Sunday weekly-review — is not a 'cron job' in the Linux sense; it's a *LaunchAgent*: a small XML file (a .plist) in ~/Library/LaunchAgents/ that tells launchd 'run THIS program at THIS time.' launchd reads the file, schedules it, and runs it as you.
The key mental model: there are two states, and they're different. A plist file existing on disk is NOT the same as the job being *loaded* into launchd. You 'load' it once (launchctl load) and launchd remembers it across reboots. But a job can silently fall out of the loaded set — a malformed edit, a macOS update, a path that moved — and then the file still sits there looking healthy while nothing runs. That's the trap: the artifact looks fine, the work never happens.
Your jobs live under two naming conventions because they were added at different times: the older com.tom.pdb-* ones (com.tom.pdb-plan-day, com.tom.pdb-language-lesson, com.tom.pdb-prep-big3) and the newer app.zorc.* ones (app.zorc.learning-lesson, app.zorc.weekly-review, app.zorc.dropzone-router). They all answer to the same launchctl commands.
Three commands that tell you the truth about what's actually scheduled — run them in order:
launchctl list | grep -i -E 'zorc|pdb'
ls -1 ~/Library/LaunchAgents/ | grep -i -E 'zorc|pdb'
plutil -p ~/Library/LaunchAgents/com.tom.pdb-plan-day.plist
A plist on disk is a promise; launchctl list is the receipt. When a scheduled job 'fails silently,' the first move is always: is it even loaded, and what was its last exit code?