---
name: empty-tasklist-is-not-a-dead-background-task
description: "TaskList returning \"No tasks found\" does NOT mean a background task died — tasks survive a context clear invisibly, so re-arming a replacement puts two pollers on one subject"
metadata: 
  node_type: memory
  type: feedback
  originSessionId: d62f0296-f25d-4225-a244-7a5697de1b19
  modified: 2026-08-04T20:35:46.479Z
---

After a `/clear`, CC's `TaskList` returned "No tasks found" while background task `b1bcx20mb`
(a run-land poller holding `gh run rerun --failed`) was **still running**. Measured 2026-08-04 on
golden 30940180764: I read the empty list as "poller died", armed a replacement (`b8w558paj`), and
both were then live on the same run. The replacement won the race and fired attempt 3; the original
woke 40 minutes later at run-land and fired again into the now-green run. The GitHub API refused it
("This workflow run cannot be retried") — that refusal, contingent on the run being GREEN, was the
only thing that prevented a duplicate rerun.

**Why:** a stale poller that survives invisibly still holds a *mutating* command. Had attempt 3 gone
red, the forgotten poller would have fired a FOURTH attempt — the exact cycle the gater had ruled
must not happen, executed with nobody's intent behind it. The blast radius is not "a wasted poll",
it is an unauthorized state change on a shared subject.

**How to apply:** an empty `TaskList` is not evidence a background task is gone — only its own
output file, or an explicit `TaskStop`, is. Before re-arming any poller that MUTATES (rerun,
retry, merge, publish, kill), read the prior task's `.output` path first; if you cannot prove the
old one is finished, make the new one read-only and mutate by hand. Applies across a context clear
in either direction: work started before the clear keeps running after it.

Related: [[audit-live-watchers-before-rearming]], [[start-event-is-not-proof-nothing-ran]],
[[absence-needs-sibling-probe]], [[zero-match-filter-reads-as-absent]].
