00addc540d
- Add __post_init__ validation so Appointment rejects negative durations - Add __repr__ to Appointment, Gap, and DayBoard for readable debugging - Fix DayBoard.to_dict to serialize preceding_appointment_id and following_appointment_id on Gap (were previously dropped) - Add utilization_rate property (booked / total) with 0.0 guard