renderBoard() wipes #board and rebuilds every column, so each .drop is a new node with scrollTop 0 — and render() runs on every SSE frame, so the board resets under you continuously while agents work. The log already solves this for itself with S.logStick; the columns never got it.