29f23e3715
Closes the audit finding: a crash between 'sink accepted it' and 'we recorded that' caused duplicate sends on the next tick with no trace. BeginDeliveryAttempt now runs before Send, CompleteDeliveryAttempt after — a stale 'pending' row found at startup reconciles to 'unknown' (never silently resent, never silently dropped, same rule as the Hexis execution engine's timeout handling). Wired into DispatchNudge, DispatchReminder, and RepeatUnacked; ReconcileStaleDeliveryAttempts runs once at mavend startup before the tick loop resumes. 9 new dispatcher tests cover begin-before-send ordering, failed-send completion, the reminder path, and begin-failure not blocking send. Vikunja #270. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018ghELqYhZNLub2TXGMazqA