Heartbeat and GET were parsing progress_phase with a pattern that rejects the colon prefix the writer already persists, which aborted generation after the first chapter. Co-authored-by: Cursor <cursoragent@cursor.com>