Resolved.
SystemPostService::postCriticalLogs now reserves the fingerprint row with thread_id = 0 BEFORE calling self::post (src/Services/SystemPostService.php). If the forum post itself fails (and that failure trips the error handler into a CRITICAL log), the next cron run sees the existing fingerprint and skips — no infinite retry loop.
On success, the row is UPDATEd with the real thread_id. On failure, the row persists at thread_id = 0 and the entry is effectively acknowledged (one attempt, then stop). Admins investigating can query WHERE thread_id = 0 to find entries that failed to post.
Locking this thread.