diff --git a/CLAUDE.md b/CLAUDE.md index 0b8c528..98b8ed7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -223,8 +223,26 @@ shows only `is_published` topics (sections with no published topics are hidden). the posted time must be in that list, the date must parse, be today-or-later, within `DEMO_MAX_DAYS_AHEAD`, and be a weekday. Dates/times are stored exactly as picked; `DEMO_TIMEZONE_LABEL` is display-only (no tz conversion anywhere). -- **One appointment per slot:** a request for a (date, time) that already has a - non-`cancelled` row is rejected with a flash. Cancelling frees the slot. +- **One appointment per slot**, enforced in three places that share the same + helpers (`taken_slots`, `available_slots`, `demo_day_status` in `app.py`): + 1. `GET /demo/slots?date=YYYY-MM-DD` → JSON `{open, reason, slots[]}`; + `static/js/demo-booking.js` rebuilds the time ` @@ -108,6 +111,8 @@ + +