ts will never fail
Track donation lifecycle across form, widget, admin, and backend: - Form: donation_completed, donation_*_failed, donation_slip_conflict, donation_artifact_conflict - Widget: donation_widget_displayed, donation_widget_tts_failed, donation_widget_animation_end, donation_widget_connected, donation_widget_heartbeat_failure - Admin: donation_admin_test_popup, donation_admin_widget_reload, donation_admin_resend - Backend: donation_widget_state_playing, donation_widget_state_shown, donation_resent
Add main donate page with TMN and PromptPay flows, donation schema with retry system, SSE integration, heartbeat endpoint, and file-to-data-url utility. Remove unused donate client component.
- rework form core and migrate all old usages