- Shipped
- September 17, 2026 at 6:50 PM UTC
- Author
- Kamo
- Commit
- ddf8e20
A presenter whose declared hours have run out is the one state in this feature nothing reported: the booking page simply offers no times, the visitor leaves, and the person who could fix it in a minute never hears about it. KamoCRM's own product demo is in exactly that state today — its only presenter's last window was 2026-09-03. GET **************** answers, for the caller alone: how many active types they present, and which of them have no bookable time left. Per type, because each has its own length, advance minimum and horizon; per presenter, because their own windows minus their own bookings and calendar is the thing they can go and change. It runs the SAME arithmetic the booking page does — getBookableTimes and this now share bookableStarts() — so the marker cannot claim a gap the page would fill, or stay dark while the page has nothing to offer. Live over the existing socket: **************** publishes a contentless frame on **************** after the commit of anything that changes the answer — an availability window added, changed or deleted; being added to or removed from a type's presenters; a session booked (signed-in or from the marketing site) or cancelled. **************** puts it on **************** the twin of the training-badge relay, and StompDestinationAuthz guards that destination per member on SUBSCRIBE and refuses client SENDs: the topic names a presenter's member id, and unguarded it would let anyone on the socket watch a named colleague's diary fill and empty. The frame carries no title, no hours and no count — the browser re-reads the endpoint under its own session. What no frame can announce is a window simply EXPIRING, because no write happens. The browser's foreground re-read is the only thing that raises the marker then, which is why it is not optional. Tests: PresenterAvailabilityGapTest runs the rule over a real MemberAvailabilityService (hours in the past, hours ahead, hours consumed by their own bookings, a window too short to host, one type of two, presenting nothing); **************** pins the wire shape and the 401; **************** pins the subject→destination mapping, the guard and the contentless payload. Full suite 991/991.