8381d4fadf
Context compression can stream for minutes with no deltas, tool events, or status lines reaching remote transports. Idle-progress watchdogs on those clients treat the silence as a dead turn and interrupt it — the Android relay app's 180s turn watchdog fires session.interrupt, killing a healthy compression mid-flight and rolling back its work. On sessions near the context ceiling this loops forever: every new prompt retriggers preflight compression, which dies at exactly +180s again (observed telemetry: attempts aborted at 180469ms/180233ms/180219ms with failure_class=explicit_interrupt). Fix: the existing _CompressionActivityHeartbeat (which today only refreshes the SessionDB activity tracker) now also emits a 'compacting' status through agent.status_callback — once at compression start and on every heartbeat tick. The gateway already routes status_callback to status.update events, and clients already reset their watchdogs on any received event, so each heartbeat re-arms them. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> (cherry picked from commit 6d2e0e860d6fdb44ce549d1fa11a06662b1a4b0b)