"""Render overlay.mp4 per cú — lát A2 phần 3 (13/08/2026, BRIEF A2). Tái dụng cách vẽ ``render_overlay`` của ``scripts/broadcast/track_p0.py`` (bản Danh đã xem và chốt 13/08 vì trực quan — đuôi track + header trạng thái), nâng cấp theo design §3.2: vẽ MỌI bi (không chỉ cue), màu theo số bi (BallID hai tầng chạy per-frame trên chính crop bbox), chấm sự kiện va chạm suy ra. Script P0 giữ NGUYÊN không sửa — đây là code path mới cho app (nếp broadcast.py). Render chạy TRONG job analyze, TRƯỚC khi worker xoá clip (bài học lần đo A1: clip đã mất thì overlay không render nổi hồi tố). Detection per frame KHÔNG detect lại: ``RecordingModel`` bọc YOLO quanh MỘT lần gọi ``analyze_clip`` và ghi lại đúng những bbox mà tầng số đã dùng (nếp "adapter quanh một lần gọi, không sửa broadcast.py" — BG26/BG28/BG31); frame đọc lại từ chính clip còn trên đĩa. Chữ trên frame là ASCII không dấu — cv2.putText (font Hershey) không vẽ được tiếng Việt có dấu; phần chữ có dấu sống ở FE/JSON. Encode hai bước: cv2 VideoWriter mp4v (như P0) rồi ffmpeg re-encode H.264 yuv420p +faststart — mp4v mở được bằng player thường nhưng