- Ya
- 12 Agosti 2026, 03:08 UTC
- Mwandishi
- Kamo
- Ahadi ya
- 26ea4ec
Makes the blockingExceptions gate real. Until now the transition table read a count that nothing wrote, so every timecard looked clean and 'a missing punch is never paid as zero' was a comment rather than a control. The BLOCKING distinction is the taxonomy's whole point: an open shift, an unpairable punch and an unattested provisional punch stop finalization, because closing over them asserts something nobody can stand behind. A geofence miss and a clock skew are ADVISORY and never block -- refusing to record or finalize time that was actually worked is the exact wage violation this system prevents. The detector reports and never repairs. Every way of guessing an unclosed shift is wrong: leaving it open accrues absurd hours, auto-closing under-reports, a cap invents a figure nobody witnessed. So it becomes an exception instead. Idempotent by construction via the unique (member, date, type) constraint -- duplicates would inflate the count and make a timecard unfinalizable for a reason nobody could find.