- Shipped
- August 26, 2026 at 6:46 AM UTC
- Author
- Kamo
- Commit
- 97ae24c
The interval arithmetic — expand, restrictionMask, candidateStarts, and the whole of AvailabilityInterval — was never webinar-specific. All the coupling sat in one method, blockersFor, which is now the BusySource interface. Moved verbatim: the +/-1 day expansion pad, the midnight-crossing rule, the clip-don't-drop trimming and the empty-mask-means-no-mask rule each encode a bug someone already found. The 30 tests moved with them, unchanged. MemberAvailabilityWindow implements AvailabilityWindowSpec without a body change; the entity stays in its package, since moving a mapped class buys boot risk and nothing else.