The access line names the last full day for a date-only end, and the exact UTC moment for a timed one (admin handoff, part 11).
8 Oct 2026 · branch p00-replace-access-wording · captured against propflow-stage · at 4313d16966f
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.
For a customer no outside company runs (every customer today), the Access card is exactly what it was: the title, the invite button, and the people. No line about another company appears.
Asserted in the captured DOM — Access · Invite admin
How sections 2 and 3 were captured. Stage has no arrangement, and this lane writes nothing. So these come from the same dev server and the same signed-in staff view, with two made-up outside companies added to the roster read's response in the browser only. One ends on a date-only day, Dec 30, 2026, which is exclusive. The other ends at a mid-day instant. Nothing was written. The capture tool did not assert these sections. CustomerDetailClient.accessCard.test.tsx asserts the same sentences word for word, and that each date is one unbreakable run.
An end of Dec 30 is exclusive: access stops at the start of that day. So the line now says "Their access runs through Dec 29, 2026", the last full day, instead of "ends Dec 30", which a reader could take as "still works on the 30th". A timed end names the moment: "Their access ends Mar 15, 2027, 6:30 PM UTC". The last day is worked out with Date.UTC and rendered by formatDateMedium, so no zone can shift it.
Screenshot round 2 found that at a narrow width the date broke across lines ("Mar 15, / 2027, 6:30 PM UTC"). The date and time are now one unbreakable run, so the sentence wraps before the date, never inside it.