Skip to content

[Bug] Antigravity transcript activity does not reset watchdog; active runs killed after 120s #244

Description

@GSL-R

Summary

Active Antigravity (agy) runs can be killed after 120 seconds with:

[jaw:watchdog] killing main — no first progress after 120s

This can happen even while the Antigravity transcript is growing with planner/thinking activity. Telegram then receives 응답 없음, and the stored assistant result may contain Error: timed out waiting for response.

Environment

  • cli-jaw: 2.1.5
  • agy: 1.0.10
  • backend: Gemini 3.5 Flash, reproduced with Low and Medium reasoning
  • Linux

Reproduction Pattern

  1. Use the agy backend.
  2. Start a task that spends more than two minutes planning before its first parsed tool event or final stdout response. A multi-step maintenance task reproduces this reliably; long media-generation workflows are also susceptible.
  3. Observe that the Antigravity transcript file is found and tailed.
  4. At approximately 120 seconds, cli-jaw kills the process as having no first progress.

Example log sequence:

[jaw:main] Spawning: agy -p ...
[jaw:agy:transcript] tailing .../transcript.jsonl
... transcript/planner activity continues ...
[jaw:watchdog] killing main — no first progress after 120s
[jaw:main] exited code=124, text=0 chars
[tg:out] ...: 응답 없음

Root Cause

agy-transcript-watcher.js correctly notices any transcript growth:

if (delta.offset > previousOffset) {
    options.ctx.agyTranscriptActive = true;
    options.onActivity?.();
}

However, spawn.js currently handles onActivity only by scheduling quiet completion:

onActivity: () => {
    scheduleAgyQuietCompletion();
},

The watchdog is reset only when applyTranscriptTool() parses a tool row:

ctx.stallWatchdog?.markProgress();

Planner/thinking rows grow the transcript but may not parse as tool rows. A run can therefore be visibly active while firstProgressMs remains unsatisfied.

This occurs before Antigravity's own print timeout. cli-jaw passes --print-timeout using the configured absoluteHardCapMs (240 minutes with the current default hard cap), while the watchdog's default firstProgressMs is 120 seconds.

Expected Behavior

Any current-turn Antigravity transcript growth should count as process progress and prevent the no-first-progress watchdog from killing an active run.

Suggested Fix

Mark watchdog progress in the transcript watcher's onActivity callback:

onActivity: () => {
    ctx.stallWatchdog?.markProgress();
    scheduleAgyQuietCompletion();
},

It would also be useful to add a regression test covering:

  • planner-only transcript growth for longer than firstProgressMs
  • a later parsed tool event
  • genuinely silent runs that should still be terminated
  • long-running tool calls with sparse output

Notes

Increasing agentTimeout.agy.firstProgressMs is a workable local mitigation, but it only delays the false positive. Treating verified transcript growth as progress addresses the integration mismatch directly while retaining the watchdog for genuinely stalled processes.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions