Build1 publisher3 min readPublished
26 launchd jobs, one log directory: how scheduled automation rots quietly
An operator mapped every cron-style job on his Mac after noticing a metrics pipeline had been dead for two days. The count was never the problem. The missing inventory was.
The Engineer · Build desk
Drafted by a language model from the sources cited here and checked against its claim ledger before publication. How we use AISend a correction

What happened
- The author's Mac runs 26 launchd jobs named com.shun.*.plist.
- Named jobs include vault-ingest firing at 4:55 each morning, a daily brief at 7:30, github-scout on a schedule, and env-map firing twice, at 4:50 and 8:10.
- After listing those jobs the post says "That's already close to ten."
- launchd silently restarts processes when they die.
- Error logs are dumped into ~/.claude/logs/, but multiple plists write to the same directory, so entries scroll away.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
A developer writing on dev.to published an inventory of the 26 `com.shun.*.plist` launchd jobs running on his Mac, along with the script that generates it [1][9]. The reason to care is not the number: it is that launchd silently restarts processes when they die, and multiple plists dump errors into the same `~/.claude/logs/` directory, so failures scroll away instead of paging anyone [3][4].
That combination produces the failure mode he describes: detection by coincidence. Sometimes two days pass before he notices "the Metrics numbers haven't updated" [5]. Two days on a job that fires twice daily is four scheduled runs that either did not happen or happened wrong before anyone looked [3].
The naming problem is visible in the post itself. Four jobs are named by hand: `vault-ingest` at 4:55, a daily brief at 7:30, `github-scout` on a schedule, and `env-map` firing at 4:50 and 8:10 [2]. He then writes that this is "already close to ten" [c2a], which leaves 22 of the 26 jobs unnamed in the write-up [1]. That slippage is the argument for the tool better than any of the prose.
The distinction he draws is worth stealing: a work log records what you did yesterday, while an environment map is a snapshot of what is running, what exists, and what is dead right now [6]. His map reports 47 plugins, 358 agents, 112 auto-skills, 11 projects of which two do not exist on disk, and `lead-finder` sitting on 75 uncommitted changes [7]. Two of eleven project paths resolving to "not found" is exactly the class of rot that never throws an error.
The engineering choices are more instructive than the dashboard. `env-map.sh` runs `set -uo pipefail` rather than `set -e`, on the stated grounds that individual collection failures should degrade to `?` and the map should still be generated [10]. The MCP count is initialised to `?`, then attempted under `timeout 12` before counting `Connected` lines [11]. Output goes to a temp file and is moved into place, so a partial run cannot leave a half-written page [12]. The plist runs with `LowPriorityIO=true` and `Nice=10` [13]. That is a script written by someone who has already been burned by a 4:50am job hanging on a flaky network call.
The change log is accidental and the best part: the vault was already under git, `environment-map.md` is overwritten daily, and `vault-ingest` commits it, so yesterday's clean repo showing 75 uncommitted changes today appears as a diff [8]. Note the ordering, though: `env-map` fires at 4:50 and the committer at 4:55, a five-minute window [2].
Which sets up the obvious gap. Nothing in the described setup watches `env-map` itself, and because the file is overwritten atomically, a failed run leaves yesterday's page intact [12][8]. An empty git diff then means either "nothing changed" or "the mapper is dead," and those are not the same. The post's headline also promises a dead PATH and a four-minute freeze among five pitfalls [14]; the mechanism behind those is not in the portion of the text I can verify, so treat the PATH lesson as unread. The revenue arc in the opening paragraph is single-sourced and unverifiable, and irrelevant to whether the jobs run [15].