A weekly cron that scans ~/.local/state/async-loop/*/active.json for loops that have been silent for 7+ days (no ScheduleWakeup fires, no email activity), then asks Gemma to summarize what each loop was *supposed* to be watching — and drops a single tablet brief listing 'ghost loops' with a one-tap 'kill or revive' decision. Ethan keeps bootstrapping async-loops per project but has no surfacing mechanism for ones that have gone quiet because the underlying thread died, so they accumulate as invisible cruft consuming session-start bootstrap checks.
Create ~/bin/async-loop-graveyard-whisper (bash, ~80 lines): (1) glob ~/.local/state/async-loop/*/active.json, read last_tick_at and thread_ids; (2) for each loop where now - last_tick_at > 7d, pipe the loop's slug + original prompt to `gemma-task` with prompt 'in one sentence, what was this loop watching for?'; (3) write combined markdown to ~/Tablet/inbox/ghost-loops-$(date +%F).md with checkbox per loop ([ ] kill [ ] revive); (4) `tablet-sync` push; (5) notify-focus summary. Add bats test stubbing the state dir. Crontab entry: `0 8 * * 1 /home/ethan/.claude/safe-exec.sh /home/ethan/bin/async-loop-graveyard-whisper`. Reuses existing tablet-sync, gemma-task, notify-focus, bounded-email patterns — no new infra.
## Created
**`~/bin/async-loop-graveyard-whisper`** (87 lines, executable)
- Scans `~/.local/state/async-loop/*/active.json` for loops whose `last_tick_at` is older than 7 days
- For each ghost, pipes slug + state JSON to `gemma` for a one-sentence "what was this watching" summary
- Writes `~/Tablet/inbox/ghost-loops-YYYY-MM-DD.md` with per-loop `[ ] kill [ ] revive` checkboxes and one-shot CLI revive/kill commands
- Calls `tablet-sync --once` to push, then `notify-focus` with a count
- Uses absolute paths to `~/bin/gemma`, `~/bin/tablet-sync`, `~/bin/notify-focus` so it runs cleanly under cron's stripped PATH
- All deps tunable via env vars (`ASYNC_LOOP_STATE_DIR`, `TABLET_INBOX`, `GRAVEYARD_THRESHOLD_SECONDS`, `GEMMA_BIN`, `SKIP_TABLET_SYNC`, `SKIP_NOTIFY`)
- Graceful fallbacks: missing gemma, missing tablet-sync, unparseable dates — all degrade rather than crash
**`~/bin/async-loop-graveyard-whisper.test.bats`** (5 tests, executable)
1. No state dirs → no brief
2. Fresh loop (1d) → no brief
3. Stale loop (10d) → brief with slug, both checkboxes, gemma summary, correct age
4. Mixed fresh+stale → only stale reported
5. Gemma unavailable → still exits 0 with fallback text
**Crontab entry** (idempotent via `sort -u`):
```
0 8 * * 1 /home/ethan/.claude/safe-exec.sh /home/ethan/bin/async-loop-graveyard-whisper >> /home/ethan/.local/state/async-loop-graveyard.log 2>&1
```
Runs Monda