Dev showed 'Thinking...' for 13+ minutes after two tool calls with no log line and no finalise. Root causes: heartbeat() synchronized with database I/O on the same monitor finish() needs, the deadline/force-finalize ran after two database reads in the watchdog, finish() persisted before emitting message.end, and no INFO phase logging. Fix: deadline first with no database access, bounded abandonable housekeeping worker, finalize guard that ends the stream with an error event, phase logging. New StalledDatabaseTurnsTest: 3 tests fail before the fix, pass after; full ./mvnw verify BUILD SUCCESS. Generated with Claude Code
Dev showed 'Thinking...' for 13+ minutes after two tool calls with no log line and no finalise. Root causes: heartbeat() synchronized with database I/O on the same monitor finish() needs, the deadline/force-finalize ran after two database reads in the watchdog, finish() persisted before emitting message.end, and no INFO phase logging. Fix: deadline first with no database access, bounded abandonable housekeeping worker, finalize guard that ends the stream with an error event, phase logging. New StalledDatabaseTurnsTest: 3 tests fail before the fix, pass after; full ./mvnw verify BUILD SUCCESS. Generated with Claude Code
The watchdog ran the deadline logic after two database reads and heartbeat() was synchronized on the monitor that finish() needs, so one blocked database call stopped the deadline, the force-finalize and the final message.end. The deadline now runs first with no database access, housekeeping runs on a bounded abandonable worker, finish() has a guard that ends the stream with an error event, and every phase logs at INFO.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Dev showed 'Thinking...' for 13+ minutes after two tool calls with no log line and no finalise. Root causes: heartbeat() synchronized with database I/O on the same monitor finish() needs, the deadline/force-finalize ran after two database reads in the watchdog, finish() persisted before emitting message.end, and no INFO phase logging. Fix: deadline first with no database access, bounded abandonable housekeeping worker, finalize guard that ends the stream with an error event, phase logging. New StalledDatabaseTurnsTest: 3 tests fail before the fix, pass after; full ./mvnw verify BUILD SUCCESS. Generated with Claude Code