message_update events contain full accumulated text, not deltas. Previously appending them caused repeated content in artifacts and progress display. Now message_update only updates progress display (replacing, not accumulating) and message_end handles final output.