The building-wide calendar reads the padded month grid for every source, opens on today, pages by month, and kind mode names the days it covers.
23 Sept 2026 · branch feat/building-calendar-reads-index · captured against propflow-stage · at 9b8e912db7
Data note. Every name and balance below comes from propflow-stage, which is anonymized by construction (ADR-0097/0110 — phones in the impossible +1000 NPA, emails @example.test). The identical capture against prod would carry real tenants' names and balances and is not safe to attach anywhere, which is why the generator refuses to run against one.
With no ?month= the page reads the month containing the buildings' own today and opens the agenda on today (the Today badge beside the date), not on the first day with events. That day is guaranteed to be inside the read.
Asserted in the captured DOM — September 2026 · Wednesday, September 23, 2026. The month header is the current month and the agenda is on today. Bound to the capture date (2026-09-23): a re-run on another day must update these two strings, and a red here then reads as the date, not a defect.
From ?month=2026-03, Next month pushes ?month=2026-04 and the server reads that month's padded grid. Today is not in April, so the agenda opens on the 1st, a day the read covers.
Asserted in the captured DOM — April 2026 · Wednesday, April 1, 2026. After the arrow, the header is October and the selected day is the 1st of the month read.
Picking the Move-in chip lists move-ins for the padded October grid only, and the heading names the range (Sunday-first: Sep 27 – Nov 7). It no longer claims to span every month; the arrows are how an operator asks for another one.
Asserted in the captured DOM — Move-ins · Sep 27 – Nov 7 · Back to the day. The kind heading carries the read range.
A month with no move-ins: the empty state says No move-ins on the books, May 30 – Jul 10, a claim about the days read, never about all time.
Asserted in the captured DOM — No move-ins on the books, May 30 – Jul 10. The empty state carries the read range.
The warning banner appears only when a tour window comes back short (an index key the read-back did not return, or a truncated window). Stage can't be made to do that without faking rows, so it is pinned by BuildingCalendarClient.window.test.tsx and load-building-calendar.test.ts instead of a capture.