Root cause: The StreamlineVRS DTO bug accounts for 86% of all failed jobs today. Only platform affected: Five Star Luxury Travel (Streamline) with 83 failed sync runs. All other platforms are completing normally.
Stuck Sync Backlog
Critical
Orphaned "Running"
22,694
Never completed or failed
Actually Running Now
~25
Started < 2 hrs ago
Oldest Stuck
355d
Since March 20, 2025
Monthly accumulation of stuck records
Oct '25
163
Nov '25
1,185
Dec '25
2,915
Jan '26
11,104
Feb '26
6,619
Mar '26
479 so far
March Projection
21 days remaining
Period
Stuck
Avg / Day
Mar 1–3 (spike)
444
148
Mar 4–10 (post-spike)
35
5
Trend is strongly positive. After the Mar 2–3 burst (215/day each), the daily rate dropped to ~5/day. Even the moderate projection is 4.4× better than February.
Optimistic
~584
Post-spike rate holds 5/day × 21 remaining
Moderate
~1,487
Blended March average 48/day × 21 remaining
Pessimistic
2,000–3,000
Another burst event like Mar 2–3 occurs
Risk factor: The Streamline DTO bug generating today's 138 failures could trigger another burst if it starts orphaning sync processes. Fixing it reduces the chance of the pessimistic scenario.
Recommendations
1
Fix StreamlineVRS IndexDTO type mismatch
The $last_update_prices parameter in IndexDTO::__construct() receives stdClass instead of string. Cast to JSON string or update the type hint. This one bug generates 86% of today's failures.
2
Purge 22,694 stuck sync records
Batch-update orphaned "running" records (older than 2 hours) to "timed_out". They inflate health metrics and obscure real running syncs. Single UPDATE query resolves it.
3
Add a sync timeout reaper
Implement a scheduled job that marks syncs as timed out if they exceed 2 hours. The Jan 2026 spike (11K in one month) indicates the completion callback path broke silently. A reaper prevents future accumulation.
4
Investigate Five Star Luxury Travel sync failures
Only failing platform today (83 failed sync runs). Likely the same DTO bug cascading into sync-level failures. May need a Streamline API response format review.
5
Archive old failed_jobs
163K records total, only 326 from last 7 days. Truncate or archive entries older than 90 days to keep the table lean.