buildUserRunner built the engine without engine.Transcripts = st, so the scheduler — unlike the web "Summarize now" path — never read or wrote the shared transcript cache. Every discovery pass re-fetched transcripts it had already fetched, burning the scarce per-egress-IP caption budget (ADR-014) on redundant work and starving other users' first-time fetches. The transcripts table was empty despite summaries existing. Wire the cache on this path too. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>