Frontend: pivotWfShifts now skips entries where times='?' and hours=0
— immediately removes the visual glitch from any stale DB rows.
Backend: when today's timesheet pull finds no completed shifts, write
a source='workforce' row instead of skipping, so the stale timesheet
entry is overwritten and rota sync can restore schedule data for today.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>