---
name: swarm-discovery-gc-spin
description: "releases#125 — swarm-discovery 0.6.0-alpha.2 updater::gc retries dead actor at 100Hz forever; orphan loops accumulate and burn broker-net workers; fix upstream PR #27, unreleased on crates.io."
metadata: 
  node_type: memory
  type: project
  originSessionId: a6044c46-9fd0-4ab0-831a-cea2fc0b2b7d
  modified: 2026-08-03T00:28:48.841Z
---

releases#125 (filed + RCA'd 2026-08-02): kitsubito's gen-0 supervisor (`spt daemon run`, spt 0.38.1, systemd user unit `spt-daemon.service`) burned ~2 cores for 2 weeks. Mechanism: swarm-discovery 0.6.0-alpha.2 (via iroh, spt-net mDNS) `updater::gc` — when the updater actor is stopped, `ActoRef::send` returns false and the code reschedules GC in 10 ms forever; each destroyed updater = a permanent ~100 Hz loop. ~900 voluntary ctxt-switches/sec ≈ 9 accumulated orphans. Driver: interface churn recreates updaters — kitsubito is wifi-only (ethernet NO-CARRIER). Upstream fix: rkuhn/swarm-discovery PR #27 (merged 2026-07-13), in NO crates.io release (latest 0.6.3 predates it). Current main pins the same broken version — latent in every daemon.

**Why:** the supervisor survives brain-generation updates by design, so a supervisor-side spin persists across `--start-reason update` cycles; only a unit restart clears it. The CI quiet predicate cannot see it (no cargo/nextest, constant load).

**How to apply:** diagnosis recipe that worked: ps -L for hot TIDs → /proc task status ctxt-switch counts (voluntary ~100Hz-per-orphan multiples) → empty kernel stack = userspace spin → sudo perf record -t <tids> for the closure name. Fix path: `[patch.crates-io]` git-pin post-#27 sha or upstream 0.6.4 bump. Related: [[reap-root-needs-authenticated-ancestry]], [[psyche-fail-log-instrument]].
