Back to the Screen Index

Design Record

Everything behind the thirty-one screens: what each one carries, how they link up, which board directives were applied, which crit points are resolved, and every call made where the board was silent or in conflict with itself. Each entry opens on its own.

Questions For Bryan

Screen Notes

What each of the thirty-one screens carries, and the board frame it was built from. The screen index lists the same thirty-one in one line each.

1. Home, Dashboard Tab

Welcome card, the three week-at-a-glance figures, the appointments list grouped Today first, the Announcements section, and Get Help at the base of the page. The list's Filter button works: it opens a panel of session types and statuses under the list head, hides the rows that do not match as a box is ticked, drops a group heading once every row under it is hidden, and keeps the count beside the title honest. Board frame 172:144.

Open This Screen

5. Dashboard, Notifications Drawer

The same dashboard with the notification bell open. Four notifications, each expandable, each deletable, plus Clear All and a caught-up empty state. The notifications drawer has no filter of its own on the board, and none was invented. The welcome card carries the third setup step, Review Your Session Types, and the My Appointments filter behind the list head works here exactly as it does on screen 1. Board frame 345:1845.

Open This Screen

2. Home, Calendar Tab

The calendar navigates. Day, Week and Month are three working views of one set of sample data covering Mar 9 to Mar 29, 2025; the arrows step three weeks in Week view and day by day in Day view, greying out at either end; Today returns to the week of Mar 17. A month cell opens that day. Every view carries the bookable window, scheduled time off and session cards leading with their time, and any card in any view opens the session details drawer on the right, filled with that card's own client. The Filter drawer actually filters, in all three views: every checkbox shows and hides the matching cards, month chips and bands as it is ticked, and its Time period select moves the calendar, with Custom range opening an inline March 2025 date picker. Board frame 172:1166, with Epic 2 392:539 for the time-period values.

Open This Screen

3. Calendar, Add Time Off Drawer

The time-off tab of the add drawer, including the clash warning that names each affected session with an Open link and a Reschedule link. The toolbar Filter button works here too: it opens the same filter drawer screen 2 carries and suspends the add drawer while it is open, so only one panel ever holds the right edge. Board frame 172:339.

Open This Screen

4. Calendar, Book a Session Drawer

The session tab of the add drawer: client search scoped to assigned cases, the client info block, the session-type accordion with its session-detail cards, duration with a live end time, and the client-timezone equivalence line. The toolbar Filter button works here as it does on screen 3, suspending the add drawer while the filter is open and putting it back untouched. Board frame 172:755.

Open This Screen

6. Home, Appointments Tab

The appointments list with the session details drawer open beside it: client details, the four attendance actions, the no-show modal, and Schedule New Appointment. Clicking any row swaps the drawer to that row's client, case number and time without leaving the page; it opens on the Ella Zaman row so the board frame reads as drawn. The Filter button carries the same working session-type and status filter as screens 1 and 5. Board frame 370:2394.

Open This Screen

7. Calendar, Session Details Drawer

The same drawer opened from a calendar card on the week of Apr 21, 2025, kept as the board's built calendar-plus-drawer state and reached from this list rather than from an appointment row. The drawer has no scrim, so a provider can move between sessions without closing it. Board frame 370:1962.

Open This Screen

8. Reschedule Appointment

Modal over the session drawer: a working week stepper carrying three weeks of sample availability (Apr 28, May 5, May 12), a working time-of-day filter inside the loaded week, a date picker beside them, the note that times are shown in the client's time zone, Confirm gated until a slot is chosen, and a success state. The arrows grey out at either end of the loaded range. Pick a Date opens a May 2025 grid built from the same three weeks the list is built from, so only a day with slots behind it can be chosen; picking one steps to its week and shows that day alone, Show Whole Week puts the week back, and stepping the week clears the day. Board frame 47:5798 with Bryan 345:1430.

Open This Screen

9. Cancel Appointment

Modal over the session drawer: the seven common reasons as Bryan revised them, a note field, Confirm gated until a reason is chosen, and a success state. Board frame 47:5344.

Open This Screen

10. My Availability, Schedule List

The three figures at the top are real links, and they carry the same figures and the same action words as the dashboard on screens 1 and 5. Each schedule card expands to show its session types, carries a Live or Draft badge in its header as its only publish-state signal, and opens for editing with the pencil. A warning names the hours two schedules both claim, states the precedence rule and names which of the two takes them. Get Help closes the page. The board's large dashed create card is a button in the section head, because schedules already exist. Board frame 172:1503.

Open This Screen

11. Schedule Details Panel

The schedule open in a panel beside the list, with everything the board hid behind More options brought onto it as labelled sections: session types, availability, description and limits and buffers. The card the panel is reading is marked on the list itself, with a filled surface, a heavier left rule and aria-current, rather than a sentence telling you to look right, and the panel is filled from whichever card was clicked: title, session types, day switches, hours and preview all come from that schedule. All three schedules show, the draft included, so screens 10, 11 and 19 list the same set. The day toggles work, each day that is on can copy its hours onto other days, the sections open and close, Preview opens a week of this schedule's own hours at the foot of the panel, and Save Changes closes the panel, confirms on the list behind it and puts focus back on the card it was editing. Each section name is a heading as well as a button, so a screen reader can move between the four by heading. Booking page options and notifications and workflows came off the panel on 2026-08-19, because the final Figma does not draw them. Board frames 172:1695 and 172:2430, built as one screen.

Open This Screen

12. Wizard Step 1, Session Details

A Schedule Name field, then four of the seven session types as cards with an edit pencil each; the wizard offers the four the board drew, and the schedule panel on screen 11 lists all seven. A card is a real choice: unselected it is a neutral card, selected it takes the brand fill, a brand border and a second inset edge, and the whole card except the pencil is the hit area. The step ships with Individual session and Couple session ticked, which is the pair step 5 recaps and the schedule list names. The gate is live behind that: clearing the last box disables Continue again, and the line under the grid counts the selection as boxes are ticked and turns into an error only once a provider has cleared the last one. Board frame 172:2692. On 2026-09-01 the step gained a required Start Date and End Date under the name, side by side, because a schedule is bounded rather than perpetual and the platform already holds those two dates on an availability template; the end date cannot open before the start date, and the range reads back on step 5 and on every schedule row. Asked for by the IT team in the Epic 1 walkthrough of 2026-08-28, item IT-1.

Open This Screen

13. Wizard Step 2, Weekly Hours

Seven days, each with a switch and its own time ranges. Turning a day off hides its hours and says Unavailable; Add Time Slot adds a range, focuses it and says so in the status bar; removing one moves focus to the range beside it and says so too; the last range on a day cannot be removed, and its X is drawn and titled as the disabled control it is. Copy To Other Days opens a picker of the other six days and writes this day's ranges onto every one ticked. The three tabs across the top are three working screens. Board frame 172:1840, drawn inside 172:1695.

Open This Screen

14. Wizard Step 2, Date-Specific

One-Time or Recurring under a fieldset labelled Recurrence, with each option stating in words what it does and where it lands, and Recurring revealing its own repeat control. Add Time Slot adds and renumbers the slots. Add These Hours commits: it writes the date into a Dates You Have Added list below the form, with the hours and the recurrence as chips and a Remove on each, then clears the form so the next date starts from empty. The line under the date field states the date in words and follows the field. The board's Logs section is gone. Board frame 172:2949.

Open This Screen

15. Wizard Step 2, Calendar View

March 2025 on its real weekdays. Every cell states its hours start to end with both meridiems, one range per line. Clicking today or any later date opens the day panel beside the grid, filled from the day clicked, without leaving the page: that day's own slot rows, and a read-out that states the hours the day inherits, or says the weekly pattern leaves it empty, or names the time off. Only March 20 has time off, so only March 20 says so, and it stays a green available day with an orange band along its foot rather than turning fully peach. The recurrence choice restates where the hours land as it changes. Past dates and days outside March are drawn but inert. Above 1280 the panel stands beside the grid and the page beside it stays usable. At 1280 and below it covers the page and is a real modal: scrim, announced as modal, the page behind it held still and the Tab ring kept inside. The page loads with the panel open only where it stands beside the calendar; at a modal width the calendar shows first. Board frame 172:3148.

Open This Screen

16. Wizard Step 3, Capacity and Pacing

The step opens with a read-only summary of the hours step 2 produced, weekly pattern and date-specific dates, with a link back to that step, and a notice stands in its place if step 2 produced nothing. The two caps are number fields the provider types in, with one status line under them that only speaks when it has something to say. A hint says which of the two caps actually bites. They were built read-only behind a padlock on Bryan's note 345:1447; Jaspal reversed that on 2026-08-07 and the Judgement Call further down this record carries the reversal in full. The two pacing switches are the provider's, each reveals its own settings when it goes on, and each states its state as its own word on its own line, the way the weekly hours screen and the schedule panel do. Board frame 172:3458.

Open This Screen

17. Wizard Step 4, Time Off

Time Off Type changes the fields shown, a Repeat control makes an entry recurring, and Add Time Off really writes an entry into the Scheduled Time Off list below, which Remove really takes out. An entry you add is written the way the one already there is written: the weekday and the month in words, the clock in twelve-hour time, and the end of a date range shown rather than collected and dropped. The saved entry leads with its day, says which published hours it overlaps, and names both booked sessions inside the window with an Open and a Reschedule link each. Show Conflicts opens the calendar. Board frame 172:3635.

Open This Screen

18. Wizard Step 5, Preview and Confirm

The summary beside the month it produces, grouped by the step each fact came from, so time off is its own group rather than a line under Capacity. Clicking any day states that day's hours under the grid, which is what the board's day-level calendar could not do. The legend carries two keys, each with a one-line meaning. The overlap this schedule will create sits above Publish Availability, so it is read before the decision rather than after it. Save as Draft lands on the schedule list, where the draft is waiting. Board frame 172:3814.

Open This Screen

19. Availability Published

The success banner over the schedule list, dismissible in place. The schedule that was just published carries a Live badge and says when it went live, and its summary line states the hours step 5 actually confirmed, Monday's lunch break and Friday's early finish included, rather than a tidier weekdays 9:00 to 5:00. The count at the top has moved, and the overlap warning has grown to name three schedules, state the precedence rule and say which schedule takes which shared hours. It is the same warning step 5 showed before Publish was pressed. Board frame 172:4184.

Open This Screen

20. Performance

The four date ranges are real. Last 7 Days, Last 30 Days, Last 90 Days and Last Year each rewrite every figure on the page, and the line under the control states the actual dates the range covers, because "Last 30 Days" only means something once you know which 30. The page carries three headline figures, four session figures, Earnings Overview, the Session Types chart and the Provider Scorecard. The client bar chart the board drew is gone and the assessment pie is now the scorecard, both on your own notes. Nothing here advances anything, so the screen carries no call-to-action colour at all. Board frame 172:6252.

Open This Screen

21. Performance, Earnings Shown

The same page with Earnings Overview already open, so the three amounts, their working and the flag on top of them can be read without a click. It is a state of screen 20 rather than a page of its own, the way screen 5 is a state of screen 1 and screen 19 is a state of screen 10. The toggle still closes it again from here. Board frame 172:6252.

Open This Screen

22. Preferences, Appointments

Three settings cards, each stated as label-and-value rows and each with its own Edit: Contact Types, Appointment Timing and Session Caps. Every Edit opens the drawer that owns those fields, on screens 23, 24 and 25. The General Availability card the board drew above them is gone, on the board note. Board frame 370:2656.

Open This Screen

23. Edit Contact Types Drawer

The drawer over screen 22. Video call, phone call and in person as three checkboxes, the rule that one of them has to stay on stated once as a message box rather than as helper text under each row, and the phone-call preference as two pills. The wording is the prototype's own contact type rather than the board's Telehealth and Modalities. Board frame 370:3031.

Open This Screen

24. Edit Appointment Timing Drawer

Same-day booking as a switch that states its own word, the buffer and the start interval as selects, the two advance limits as number fields, and the default calendar hours as a time range. Every value matches the row it edits on screen 22. Board frame 370:3248.

Open This Screen

25. Edit Session Caps Drawer

The daily and weekly caps as typed number fields with the same live validation the capacity step and the schedule panel carry: type a value outside the range and the line under them turns to an error, set the weekly cap under the daily one and it says where bookings will actually stop, and otherwise it states which cap bites first. They read 6 a day and 25 a week, which is what screens 11 and 16 already say. Board frame 374:2443.

Open This Screen

26. Preferences, Session Types

Six types in one table: name, length, contact types, referral type, languages, who can book, whether it is a group appointment, the group a client joins after booking, and whether it carries a waitlist. Each row carries a type glyph in front of its name. Minor Session was the seventh until 2026-08-19, when the final Figma dropped it from this table. Every on-or-off cell is a word on a chip rather than a tick or a bare dash, which is the crit on this table answered. Referral type and languages come from the other board frame that draws this table, 172:4391, and were missing from the first build. Each row carries an edit pencil and a delete, and the row itself opens the type; delete asks first and takes the row off the table. Add New Type opens screen 31. Board frames 370:3500 and 172:4391.

Open This Screen

27. Edit Session Type Drawer

The type the row opened, the discovery call when nothing names one: name, description, length in minutes, the group a client joins after booking, the three contact types, the four referral types, the four languages, who can book it, group appointment and waitlist as switches, the two requirements, the client information this type asks for, the cancellation and reschedule rules, and the confirmation email. It closes with the one line the board draws as a boxed callout: this type can carry timing of its own that overrides Appointments. Board frames 370:3761 and 172:5434, with the field list on notes frame 172:6246.

Open This Screen

31. New Session Type Drawer

The create state of the same drawer, opened by Add New Type on screens 26 and 27. Same fields in the same order as screen 27, empty rather than prefilled, with a name placeholder, a fifty-minute default length and English ticked, and it closes on Add Type rather than Save Changes. The board draws the create side and the edit side as two separate frames with the same shape, and they are built the same way here: one drawer, two states. Board frame 172:4647.

Open This Screen

28. Connected Calendar, Nothing Connected

Calendar Integration with the optional-and-one-at-a-time rule as a message box, then Google, Microsoft Outlook and Apple as three rows, each with a Not connected chip and a Connect button. Under it Privacy and Permissions states the two guarantees that make the integration safe to accept: WPO reads event times only, and event names are never stored. Board frame 370:4145.

Open This Screen

29. Connected Calendar, Google Connected

The same page with Google connected: the row carries the Connected chip and a red outlined Disconnect on that same row. The green detail panel below it, with the account line, the last-sync wording, the auto-block switch, Sync Now and Disconnect Calendar, came off on 2026-08-19 because the final Figma does not draw it. Board frame 370:4304.

Open This Screen

30. Preferences, Notifications

Channels first, as three switches that state their own word: email on, SMS on, push off. Under them the seven events a provider is told about, by channel, with one line saying these apply to every session type and every schedule. That line and the matrix are the board note answered: the board drew three read-only rows and asked for the UX to be built out. Board frames 370:4488 and 374:2848.

Open This Screen

How the Screens Link Up

The session details drawer opens in place wherever a session is listed: on the calendar (screen 2, every card in every view) and on the appointments lists (screens 1, 5 and 6, every row). Screens 7, 8 and 9 keep it as the built page state for Tiffanee Richter's April 21 session.

On the calendar, a card opens the drawer beside it

Clicking any session card on screen 2 opens the session details drawer on the right of that same page, filled from the card: the client, the day and time, the session type in the drawer title, the contact type in words, the case number, and the client details block. That holds in every week and in Day view, because the card carries its own data rather than the page carrying one fixed session. Nothing navigates. Escape or the X closes it and puts focus back on the card that opened it. Changing the view or the week closes it, since the session showing may not be in the new range. The filter drawer and the session drawer never open together; opening one closes the other.

The toolbar and the filter drawer say the same thing

The Time period select always states what the calendar is showing: This week on Mar 16 to 22, Next week on Mar 23 to 29, This month in Month view. Step the arrows to a range none of those three describes, or open a single day, and it falls back to Custom range with the picker open on the date being shown. Choosing a date in the picker opens the week that holds it.

Every Filter button on the set filters

There are two filters, one per surface. On the calendar (screens 2, 3 and 4) the toolbar Filter opens a side drawer of status, session type and contact type, and every box shows and hides the matching cards and bands as it is ticked. On the appointments list (screens 1, 5 and 6) the Filter button opens a panel of session type and status under the list head, hides the rows that do not match, drops a group heading once every row under it is hidden, and restates the count beside the title. Both carry Clear All. Nothing is inert.

On the appointments lists, a row opens the drawer beside it user-directed

Every appointment row on screens 1, 5 and 6 opens the session details drawer on the right of that same page, filled from the row: the client, the day and time, the session type in the drawer title, the contact type in words, the case number and the client details block. All ten rows behave the same way on all three screens, and nothing navigates. Escape or the X closes the drawer and puts focus back on the row that opened it. Screen 6 ships with it open on the Ella Zaman row; screens 1 and 5 ship with it closed.

What this replaced

Until now a row was routed by the client it named: Ella Zaman's rows went to screen 6 and Tiffanee Richter's rows went to screen 7, which is calendar-based, while the other five clients' rows opened nothing at all. Clicking two rows in the same list therefore landed on two different kinds of screen, or on none. Screens 7, 8 and 9 keep Tiffanee's April 21 session as a built state reached from the screen list above; no row points at them any more.

Filtering with the drawer open keeps it, unless the row it is reading disappears

The Filter button on screens 1, 5 and 6 works with the drawer open. If the row the drawer is reading survives the filter, the drawer stays exactly as it is. If that row is filtered out, the drawer closes rather than describing a session the provider can no longer see, and focus stays on the filter. Clear All puts the rows back; the drawer does not reopen on its own. Same rule as the calendar, where changing the week or the view closes the drawer.

The two sections join through the left rail

My Availability in the left navigation is live on all thirty-one screens, so the sections reach each other from anywhere. Inside My Availability the wizard runs 12, then 13 or 14 or 15 for step 2, then 16, 17, 18 and 19, and every step in the rail is a link so it walks backwards as well as forwards. Publishing lands on 19, Save as Draft lands on 10 with the draft waiting there, and three controls cross back into the Home section: Show Conflicts and the 33 available slots figure both open the calendar, and each clashing session on the time-blocking step opens the session details or the reschedule modal.

Schedule New Appointment carries the client across

The button in the drawer footer opens screen 4 with the client already filled in: name, case number, sessions remaining, authorization window and preferred contact. All seven clients on the week grid are carried, so the button never lands on somebody else's case. It does this with a query string, which is prototype plumbing rather than a proposed URL contract. With JavaScript off, screen 4 shows the client it ships with.

Performance joins from the same rail, and leads nowhere

Performance in the left navigation is live on all thirty-one screens, and on screens 20 and 21 it is the current item. Performance itself is a terminus: it reports on work already done, so it carries no onward action, no button that commits anything, and no call-to-action colour. The bell, the brand mark, Overview and My Availability behave there exactly as they do everywhere else, and the remembered rail state carries across the hop in both directions.

Preferences is four tabs and six drawers, and every drawer is a page state

The four settings areas are the tab row under the breadcrumb, the same secondary navigation the Overview section uses, so a provider moves between them without leaving the page. Every Edit and every pencil opens a drawer as its own built state, the way the calendar add drawer and the session details drawer are built: the scrim and both footer buttons return to the page underneath. Nothing in Preferences is a dead end, and nothing in it saves.

Add New Type is the sixth: it opens the create drawer on screen 31 from screens 26 and 27, and returns to screen 26 on Cancel, on the close button and on the scrim. The session-type pencil on screens 11 and 12 lands on the edit drawer on screen 27, so a value a provider is told is read-only names the surface that owns it.

Preferences is now live in the left menu on all thirty-one screens. It was the one tree item that led nowhere.

Board Directives Applied

Bryan's notes on frame 172:144, and the board-wide terminology sweep.

Case ID chip and modality icon on every appointment 345:1440

Each row carries its UCMS case activity number as a chip, and a video or phone glyph with a screen-reader label beside the time.

Announcements section for admin communications 370:4623

A collapsible section under Appointments, holding communications sent out to providers. The header carries a mail icon with an unread dot and a counted badge, so the state is never colour alone. It is separate from the notification bell, which carries per-appointment events. The board's word was Messages; Jaspal directed the rename, because Messages sat next to the bell and read as a per-provider inbox rather than as notices sent out to everyone. The class names and the panel id keep the board's word, as they are not read by anyone using the screen.

Get Help at the base of the dashboard 370:4619

A single support link closing the page, with a line naming what support covers and how fast it answers.

The word is client 370:4684 and 370:4680

No patient, participant, invitee or member anywhere in the set.

General Availability comes off the Appointments settings page 373:2013

The board note reads "Remove General Availability Section". The card and its three rows, Availability by Session Type, by Location and by Contact Type, are gone from screens 22 to 25. Nothing replaced them: the three facts they stated are set inside a schedule and inside a session type, which is where a provider changes them.

Notification preferences are set globally, and the UX is built out 374:2848

The board note reads "Notifications preferences will be set globally. Build out UX". The board itself drew three read-only rows saying Enabled, Enabled and Disabled. Screen 30 now carries the channels as three switches and, under them, the seven events a provider is told about with a box per channel, plus one line stating that these apply to every session type and every schedule. That line is the global part made visible rather than left as an assumption.

Your notes on the My Availability V2 frames.

A Schedule Name field on step 1 317:418

First field on the step, and the name every later screen calls the schedule by. It is what lets a blocked time say "Weekday hours (Mon to Fri)" rather than "Schedule 1", which crit 244:470 asked for.

An edit pencil on each session type card 317:399

On all four cards on step 1, and on all four rows in the schedule panel. It is also the answer to crit 242:347: the values on a card are read-only, and the pencil is the way out to Preferences, where they are set.

SVC and STC are Video call and Phone call 242:354, answered "y" at 317:403

Everywhere in this section. In person is unchanged. The two codes do not appear on any of the ten screens.

Now carried across Home as well, so neither code appears on any of the nineteen screens. The SVC badge that sat beside the client name in the session panel is gone, and so is the Service line tooltip it carried. On screens 1, 2, 5 and 6 the panel already names the contact type in words a few rows below, so the badge only repeated it. On screens 7, 8 and 9 the drawer named no contact type at all, and it gains that same row, reading Phone call for case 1182046.

To confirm: this reads SVC as the video modality, which is how the session-type work orders write it, as Video Call SVC. If SVC is a service-line code in UCMS rather than a contact type, the Home drawers need a different word rather than none, and this entry changes.

The two caps are set by an administrator, and this was later reversed 345:1447

Applied as written first: Max Sessions Per Day and Max Sessions Per Week were stated with a lock and a line naming who set them, on the wizard step and inside the schedule panel.

Reversed on 2026-08-07 by Jaspal, and no longer the built state. Both caps are number fields the provider types in on screens 16, 11 and 25, with validation in place of the padlock. The read-only line on screen 18 said the same thing and was missed at the time; it now reads the same fact the wizard states. If the caps really are administrator-owned, this directive comes back and the fields go read-only again on all four screens together.

Show Conflicts opens the calendar 317:422

A button beside Add Block on the time-blocking step, going to the Home calendar, where a booked session inside a blocked window is actually visible.

The Logs block is gone 317:458

Removed from the Date-Specific form, which is also what crit 239:537 asked for.

Unavailable is out of the legend 317:436

Two keys remain, Available and Blocked, on both month grids. A third line says what an unmarked day means, which is what crit 244:501 needed.

A Live or Draft badge in the card header 317:454

On every schedule card. It is what makes the publish state readable without the colour rule, which crit 242:246 asked for, and it is half of what crit 244:508 needed.

More options can become accordion sections 317:392

Taken up. The schedule panel carries six labelled sections and no More options button, which answers crits 239:303 and 239:507 together. Your "TBD" on whether these are schedule-driven or account-driven is stated on the panel rather than answered.

Blocks can repeat 370:4780, unattributed

A Repeat control on the time-blocking form, and the repeat shows as a chip on the saved entry. This sticky carries no author on the board node, so confirm it is yours before it counts as a directive.

Not actioned: "@Bryan Rill invesitigate" 320:462

A note to yourself on the Calendar View frame, not a build instruction. Recorded and left alone.

Your notes on the Performance V2 frame.

The client graph is removed 320:492

Applied. The Total Clients bar chart, the one the sticky sits on, is off the page. The New and Returning legend it fed was left with nothing to label, so those two counts moved up under the Total Clients figure, where they still read as a split of the same number.

Assessments Used becomes a provider scorecard 345:2246

Applied. The pie chart of client assessment instruments is gone. In its place is Provider Scorecard, carrying CSAT as its one data chart: a score out of five with the rating spread under it. The second slot is a labelled empty tile rather than an invented second measure, which is the placeholder the sticky asks for. It sits under both chart cards at the width of the chart row, because the note asks for a placeholder for another chart and a slot that size reads as one.

Notes on the Appointment types V2 frames.

Inline row icons and a clickable row on the types table 244:674, agreed by Bryan at 320:477

The board drew a three-dot menu holding only Edit and Delete, and the row itself did not open. Both icons are now on the row, and the row opens the type. Delete asks first, in a confirm dialog that names the type, says what happens to sessions already booked on it, and offers Keep This Type beside Delete Type; confirming takes the row off the table and says so. This is the same shape the schedule list uses, which is what the note asks for.

The advanced options view is not built 374:2855, unattributed

The note reads "remove entire advanced options view. These are set via global preferences, not by session type." Neither stacked Advanced Options panel, 172:5018 or 172:5830, is built, so the note is applied. It also answers crits 244:713, 244:731, 244:762 and 244:776, which all asked for one surface instead of a panel behind a panel. One thing it does not settle is still open, and it is the Judgement Call named "Session types still carry their own timing".

Not actioned, waiting on you 320:481, 320:485 and 244:727

Ignored per Jaspal 2026-08-08, pending Bryan feedback. "use this model above" 320:481 and "All of this pending feedback" 320:485 are both yours and neither names what to change, so nothing was guessed. 244:727 asks whether the notification defaults for a session type, with email, text and follow-up reminders off and only the calendar invite on, were deliberate; screen 30 sets notifications globally under your own note 374:2848, so a per-type answer waits on you as well. All three are recorded rather than built.

Crit Points Resolved

Open crit points from the board, each answered in the design rather than in a comment.

The breadcrumb came off, then went back on 234:210

Answered first by taking it off: Home is the top level, so the crumb trail carried no orientation, and the date under the title was the more useful line.

Reversed on 2026-08-08 by the shell Jaspal chose, which draws a breadcrumb on the canvas of every page. All thirty-one screens carry it again, and the date stayed under the title, so nothing was traded away for it. This entry is the single answer to 234:210: the crumb is present, by the shell's decision rather than by this crit's.

The three figures are real links 234:206

Each names its destination in words, carries a chevron, lifts its border on hover and takes a focus ring. They read left-aligned now, so the number, the label and the action share one reading edge.

The list leads with Today 234:163

Today, then Upcoming, then Earlier. Past sessions stay on the page but run quieter, so a glance lands on what is still ahead.

One status per appointment 234:202

The session that carried both No Show and Rescheduled is two appointments, not one. The March 3 session keeps No Show and says in words that it was rebooked; the March 19 session it produced carries Rescheduled.

Add to Calendar is split into two named actions 244:790

One button was booking a session and blocking time, two opposite intents. It is now Book a Session and Add Time Off in the calendar toolbar. Each opens the drawer already on its own tab, and the drawer keeps both tabs so a provider can switch without going back.

Block is now Time off 244:810

Time off everywhere, in both sections. On the calendar: the tab, the drawer title, Time Off Type, Add Time Off, Scheduled Time Off, the legend key and the band on the grid. In My Availability: wizard step 4 is called Time Off in the rail, in its heading and in its page title, and it reads Time Off Type, Add Time Off and Scheduled Time Off, with the day panel on the Calendar View tab saying a window is time off rather than blocked. The word block does not appear anywhere in the UI of either section. Class names and data attributes in the markup still read blk and blocked; they are not user-visible and renaming them would have touched every rule and handler for no reader's benefit.

Session cards lead with their time 244:804

Every calendar card opens with its time range, before the client name. A half-hour card carries the session type and contact type as glyphs with screen-reader labels rather than dropping them.

The clash warning names the sessions it means 244:808

A plain info message states the rule once at the top of the time-off tab. The warning attached to a saved entry then names each clashing session with its time, its type and the client, and gives each one an Open link and a Reschedule link.

Schedule 1 states its own days 244:809

Renamed to Weekday hours (Mon to Fri).

Sessions show a duration, not just a start 244:825

A Duration field beside Start time, plus a live line stating the end time in words. Changing either updates it.

The three figures on My Availability go somewhere 242:253

Active Schedules jumps to the list, Available Slots This Week opens the calendar, Active Days Per Week opens the weekly hours editor. Same treatment as the dashboard figures, and now the same words: one action label per destination across all five screens that draw a figure. Available Slots This Week reads View Open Slots on 1, 5, 10, 11 and 19; Active Days Per Week reads Edit Weekly Hours on all five and reads 5 on all five. It said 3 on the dashboard and 5 in My Availability, and called the same destination Edit Weekly Schedule on one screen and Edit Weekly Hours on the other.

The overlap between two schedules is named 242:239

A warning above the list names the two schedules and the hours they both cover, and step 5 carries the same warning above Publish Availability so the clash is read before the decision rather than after it. All three stop at naming it: which schedule wins is your open question 316:375, listed below, and inventing a rule would have buried it.

The colour rule now says what it means 242:246

The board's purple and orange bars had no key, and orange already means a session on hold on the calendar. The rule follows the publish state and always sits beside the state in words, so a schedule can never read as blocked time.

The create card shrinks to a button 242:232

A full-width dashed card suits an empty list. Once schedules exist it competes with them, so it is Create New Schedule in the section head. The full card belongs to the empty list, a state this screen does not show, and that belongs in this document rather than as a line of copy on a screen that has three schedules on it.

Buffers, limits and booking options are labelled sections 239:303 and 239:507

The board reached them through More options, which opened a second panel on top of the first, three layers deep from the page. One panel with six named sections does the same job two layers shallower, and nothing hides behind a vague word.

The three Date and Time tabs state their precedence 239:313, answered "Good point. we need to add" at 317:410

One message on all three tabs: Weekly Hours sets the pattern, Date-Specific replaces it on the dates it names, Calendar View shows the result of both. The One-Time and Recurring options on the Date-Specific tab also say which of the two they write into, which is crit 242:396.

The weekly cap says whether it actually bites 244:429, answered "yes if we keep this here" at 317:414

A quiet line under the caps does the arithmetic: 6 a day across 5 days is 30, so the weekly cap of 25 is the one that stops bookings. It also states the case where the weekly cap would never take effect.

A blocked time is named by its day and its schedule 244:470

The entry leads with "Thursday, March 20, 2025" and the chip beside it reads "Overlaps Weekday hours (Mon to Fri)". The chip says overlaps rather than owns, because the step's own lede says a block applies across every schedule you publish, so a block cannot belong to one of them. A block you add on the step carries "Applies to every published schedule" instead, since nothing has worked out yet which published hours it lands in. No schedule number appears anywhere in this section.

The blocking warning lists the sessions it means 244:477

The saved block carries both booked sessions inside the window, each with its time, its type, the client and an Open and a Reschedule link, so a provider can act without leaving the step. Same pattern as the time-off clash on screen 3, and the same two sessions.

The preview calendar states a day's hours 239:514, answered "yes we need ot iterate this" at 317:429

Clicking any day writes that day's hours under the grid, including the blocked window on March 20. The calendar is no longer day-level only.

The legend keys are explained, and the two legends match 244:501 and 244:440

Two keys, Available and Partly off, each with a one-line meaning, plus a line saying an unmarked day has no availability set. The Calendar View tab and the preview carry the same three lines, so the same calendar cannot read two ways.

The day panel says where its recurrence lands 244:436

One-time says it covers that date only. Weekly says it writes into your weekly hours for every Thursday, so it also shows on the Weekly Hours tab. The line rewrites itself as the choice changes.

A draft is findable again 244:508, answered "yep. Need to add that" at 317:440

Save as Draft lands on the schedule list, where the draft carries a Draft badge, the date it was saved, and a Continue Setup button back into the wizard. It is not counted as an active schedule.

Publishing visibly changes the list 239:524

The published schedule moves to the top with a Live badge and a line saying it went live a moment ago, the Active Schedules figure moves from 2 to 3, and the banner can be dismissed without the evidence going with it.

The fill rate has something to be read against 239:615

52.3 percent on its own tells a provider nothing. The figure now carries the same span in the previous period under it, and in the three shorter ranges the provider's own twelve-month average beside it. Last Year shows the previous year only, because in that range the twelve-month average is the figure above it. All of it moves with the range control. A target would read better than either, but nobody has set one, so none was invented.

The earnings amounts sit behind a click 244:589

Earnings Overview is drawn in full and opens on Show Earnings rather than on load, so a shared screen does not put the dollar working in front of a room. Opened, it leads with the fact that cancellation and no-show pay is not settled and that the $25 rate is the board's own figure. Screen 21 is the same page with the section already open.

A dash is not a state, in the session types table 244:667

Jaspal, on the appointment-types board: "The Bookable column uses a green check or a dash. A dash is vague. Use a clear on/off state." The sticky sits on the session types box rather than on Preferences, but the same table is drawn in both, so it is answered here.

Every on-or-off cell in the table on screens 26 and 27 is now a word on a tinted chip: All clients or Not bookable, Yes or No for group appointment, Yes or No for waitlist. No cell is a tick, none is a dash, and none carries its meaning in colour alone. The Assigned Group column, which is a value and not a state, reads None where there is no group.

Judgement Calls, for Bryan

Places where the board was silent, ambiguous or in conflict with itself, and a call had to be made to build the screen. Each one is reversible.

The objects are called session types, everywhere 239:286 your crit, reversed 2026-08-19

Your note in August: the availability wizard called these session types and Preferences called them appointment types, so the same object was named two ways depending on which screen you were on. There are seven of those objects, not four, and Preferences is where all seven are listed.

The first sweep chose appointment type, because that was the Preferences section name, the tab name and the board box name. The final Epic 1 Figma reverses it: the schedule list, the schedule panel and the Preferences tab all read Session Types there, and you ruled on 2026-08-19 that session type is the word. The sweep ran the other way in one pass and covers every screen, every heading, every filter legend, every status line and both charts. The words appointment type and appointment types do not appear anywhere in the product UI of the thirty-one screens.

Three things were deliberately left alone. The wizard step is still called Session Details, because it names a step rather than the object. The Preferences tab that holds timing, contact types and caps is still called Appointments, because it is about booked appointments rather than about the type objects. Class names, ids and data attributes still read type-card and apt-type, which nobody using the screen reads.

Session types still carry their own timing, which one board note forbids and another draws 374:2855 against 370:3761, open

The board says both things. On the Appointment types V2 box, note 374:2855 reads "remove entire advanced options view. These are set via global preferences, not by session type." On the Preferences V2 box, frame 370:3761 draws a block called Appointment Type-Specific Appointment Settings on the same drawer.

What is built follows both as far as they agree and follows the drawn frame where they do not. The two stacked Advanced Options panels are gone, which is what 374:2855 asks for. The one line the drawn frame carries is kept: screens 27 and 31 close with a boxed note saying this type can override the buffer, intervals and advance limits set on Appointments. So the heavy per-type surface is removed and the per-type override survives as a single statement.

This needs your word, because it is the difference between two product rules rather than two layouts. If timing really is global only, that boxed note comes off both drawers and the sentence about it comes out of this record, which is a five-minute change. If per-type timing stays, the note is where the fields behind it would live.

The session-type field checklist, what is built and what is not 172:6246, the notes frame

The Notes frame on the Appointment types box lists thirteen fields a session type should define. Eleven are now on the edit drawer and the create drawer: name, description, duration, referral type, the three modality options, buffer before and after through the per-type timing note, minimum notice and maximum advance booking window through the same route, cancellation and reschedule rules, and required client information. The final Figma takes requirements and required client information off the create drawer on screen 31; they stay on the edit drawer on screen 27, which the final Figma does not draw. Languages is not on the checklist but is on the drawn frame 172:4391, and on screen 31 it is now one field that opens the full list, English through Japanese.

Two are deliberately not built. Invitee form, because crit 244:723 asks whether it belongs at all in a product where clients arrive by referral rather than through a booking page, and building it would answer that question by accident. Notifications and workflows, because the frame itself marks it "Not in design" and your own note 374:2848 puts notification preferences at the account level, which is where screen 30 builds them. Eligibility and program rules carries a bare question mark on the frame and no field anywhere on the board, so it is recorded here rather than invented.

Referral type and languages read as text in the table and as checkboxes in the drawer 172:4391 and 172:5434

Both columns were dropped from screen 26 when it took the column set of frame 370:3500 rather than 172:4391. They are back, so the table now runs ten columns and scrolls sideways inside its own card at narrow widths rather than widening the page.

The board draws both as chips, and both are plain text here, because the column beside them, Contact Types, has always been plain text in this table and a row of three chip styles in one table reads as decoration rather than as meaning. In the drawer the board draws a token field with removable chips and an Add dropdown; both are checkbox groups instead, the same control the contact types beside them already use. The value sets are small and fixed, four referral types and four languages, and a checkbox group states every option including the ones not chosen, which a token field does not.

The row opens the type on a click, and the Edit link is the keyboard path 244:674, screens 26, 27 and 31

A table row cannot be a link, and making every row a focus stop would put ten extra stops in the Tab order of a table that already carries two controls per row. The click on the row is a pointer affordance layered on top: a click that starts on any control inside the row is left alone, so is a click that finished a text selection, and everything the row does is reachable through the Edit link it carries. Delete never acts on the click; it opens the confirm dialog, and the dialog takes focus, holds it and returns it, through the same contract the reschedule and cancel modals use.

The step 2 recap on step 3 is a compact two-column summary, not a row per weekday user-directed, 2026-08-07, screen 16

Jaspal: the card takes far too much height. It did. It was a full-width row for each of the seven weekdays, a second labelled block holding one line to say no date-specific dates had been added, and the edit link on a line of its own. Measured at 1440 it was 577px of card to state five facts, and it pushed the capacity limits it exists to give context to off the bottom of the screen.

Three things were done to it. Runs of identical days are collapsed, so Tuesday, Wednesday and Thursday become one line rather than three. The two labelled blocks are dropped and the date-specific line joins the same list, because a list of five lines does not need to be split under two headings. The edit link moves onto the title row, where it costs no height at all. The result is five lines in two columns, three rows deep, and the day column is fixed at 86px so the times start on one reading edge.

Measured after: 165px, down from 577px, a 71 percent cut, and the capacity limits and the first pacing switch are now on screen with it. Nothing was hidden behind a disclosure and no fact was dropped: every hour the old card stated is still stated. The .sum rows the old card used are still in the stylesheet because the step 5 summary uses them.

The two capacity caps are editable, with validation instead of a padlock user-directed reversal, 2026-08-07, screens 16 and 11

This reverses an earlier call in this record. The caps were built read-only, behind a padlock, with Set by your administrator under each one, because the board drew them as administrator-owned. Jaspal: "I don't understand why it is locked. I'll let the user change it, and we can make a validation system around it if there is any issue." Both are now number fields the provider sets. The padlock, the administrator line and the standing paragraph that worked out the arithmetic between them are all gone.

What replaces the padlock is a validation model that only speaks when it has something to say. One status line serves both fields and is hidden until a value is touched. Out of range, 1 to 20 a day or 1 to 100 a week, and it is an error and the field is marked invalid. A weekly cap below the daily one is a warning rather than an error, because it is legal but makes the daily cap unreachable: "The weekly cap is lower than the daily one, so bookings stop at 3 in a week." Otherwise it states the one fact the deleted paragraph existed to state, in six words: "Weekly cap of 25 applies first." The available-days count is an attribute on the message rather than a constant, so a schedule with a different pattern states its own number.

The same two fields sit on the schedule panel on screen 11 and were unlocked with it, because one of them locked and the other not would be a worse answer than either. This does not answer Bryan's open question about whether limits are per schedule or per account; it answers who may type in them. If they turn out to be account-level, they move to Preferences and the validation moves with them.

Every info and warning banner is a bold lede and one short sentence standing rule, user-directed 2026-08-07

Jaspal, on reading the live screens: no big paragraphs and no long lines anywhere in the UI. Applied across screens 10 to 19 as a standing rule rather than as a fix to the three banners he named. A banner is now a bold lede plus at most one sentence; anything longer belongs in this record.

The three he named. The tab-precedence banner on screens 13, 14 and 15 went from 240 characters to 74: "Date-specific dates override weekly hours. Calendar View shows the result." The overlap warning on screen 18 went from 296 to 93, and now names only the outcome: "Short-notice hours keeps 3:00 pm to 5:00 pm on Mon, Wed and Fri; Spring hours takes the rest." The same sentence carries the three-schedule warning on screen 19 and the two-schedule one on screen 10. The tie-break rule behind all three is unchanged and still stated in full in the proposal entry further down this list, which is where a rule belongs.

Fifteen more strings went the same way in the same pass: the time-zone note, the one-time and recurring explanations on screens 14 and 15, the calendar instruction, the empty date list, the time-off repeat note, the no-hours notice on screen 16, the per-schedule limits note and the session-type note on screen 11, the schedule-name help on screen 12, the booked-session warning on screen 17 and the published banner on screen 19. After the pass no string in the product UI of screens 10 to 19 runs past 100 characters. Nothing that prevents an error was dropped; every one of them was cut to the clause that was doing the work.

The middle stat card on My Availability stays inside My Availability user-directed, 2026-08-07, screens 10 and 19

Available Slots This Week carried View Open Slots, and it pointed at the Home calendar. Jaspal: the flow has to stay inside My Availability. It now points at the schedule details panel on screen 11 and reads Open Live Schedule, which is the surface inside this section that holds the hours those slots come from, together with its own preview of what they produce.

The metric was kept rather than swapped. It is the one number on the page that answers whether the availability is doing anything, and swapping it would have cost the page a fact to save a link. The other two cards already point in-section, to the schedule list on the same page and to the weekly hours step. The identical row on the Home screens 1 and 5 is untouched and still points at the Home calendar, because there the Home calendar is the in-section destination.

The chosen shell and the call-to-action colour are now applied user-directed, the design file

Jaspal picked one of the shell options in the design file and the two call-to-action specimens beside it, and both are now on all thirty-one screens plus the index and this record. The shell moved: the brand and the collapse control sit at the top of a 285px left column that runs the full height of the viewport in the menu grey and stays put while the page scrolls, and the page title, the date, the notification bell and the account cluster sit in a white page header to the right of it, with the breadcrumb under that on the #fafafa canvas. The menu row is 38px with an 18px icon; the active row is a filled pill in the primary rather than a tinted one. The tabs moved from a 48px underlined row to the design file's own: a 15px label over a 3px bar, 28px apart, on a hairline rule. The rail keeps every behaviour it had: 72px collapsed, the state remembered between screens, the toggle hidden below 900 where the menu is a bar and every label comes back. Every value here was read off the design file's computed styles rather than measured from a picture of it. The one place the file is silent is the collapse control's own size in the rail, which the file draws as a bare 14px chevron pair; it is built as a 24px target around that chevron so it stays clickable, which shifts it about five pixels left of where the file draws it. The buttons keep the specimen geometry exactly: 40px tall, a 20px corner, 16px of side padding and a 4px gap. The colour on them was narrowed on 2026-08-07 and is described in the next entry. The primary is one token, so switching it later is one line.

The call-to-action colour is now on one button per screen, and nowhere else user-directed, 2026-08-07

Jaspal: the colour belongs on the call to action only, and on the main call to action only, not on every call to action. It had been applied as a general accent, so it was carrying the filled button, the outlined button, the active menu row, the active tab and its bar, the avatars, the links, the selection rings and every hover step at once, and nothing on a screen stood out because everything did.

Three rules now hold the whole prototype. First, one button per surface is the call to action and takes the filled brand blue: the single action that advances that screen's job. Second, every other button is the neutral one, white with a 1px hairline boundary and the body ink for its label, at exactly the same 40px height, 20px corner and 16px side padding, so nothing moves. The white-with-a-blue-outline button is withdrawn entirely. Third, everything that marks state rather than action, which is everything that used to borrow the colour, stays in the same brand blue but states it quietly, in one of two forms. Text, icons, hairlines, rings and the small marks that have to read as on or off take the blue darkened to #0078A6, which is the pressed step already in the file and measures 4.96:1 on white: the links, the text buttons, the wizard step markers, the switches, the selection rings, the today rules and the new-message dots. Surfaces take the blue laid over white at 20 percent, #CCECF8, with the body ink on it at 13.37:1: the active menu row, the segmented control, the mini-calendar day, the session-type card head and the month bar, all five of which used to be solid fills behind white text. Nothing outside the call to action is a solid brand blue behind white text, and no mark larger than 44px is a solid fill at all. That third rule governs controls and surfaces. A chart bar is exempt by kind: its length is the reading, so the two bars on Performance fill in the same darkened blue at whatever width the figure gives them. An avatar takes the neutral ground, because it names a person rather than a state.

A surface is the screen as it opens, or an overlay that covers it behind a scrim. So a modal keeps its own call to action, and while it is open the screen behind it is under a 55 percent scrim that composites the button underneath to a dark slate rather than to the call-to-action colour. Measured at 1440 and at 760, every one of the thirty-three pages shows at most one button in the call-to-action colour when it opens, and opening the session drawer, the filter panel, the day panel or any modal does not add a second one in view.

The call to action, screen by screen. 1 Set Availability. 2 Set Your Availability. 3 Save Time Off, because the time-off panel is what that screen is for. 4 Book Session, for the same reason. 5 Set Availability. 6 and 7 Schedule New Appointment in the session panel, which opens with those screens. 8 Confirm Reschedule, which is disabled until a slot and a reason are chosen, so the screen opens with none. 9 has none: Confirm Cancellation is the destructive red, which is the right colour for it, and Back to Calendar takes the call to action once the cancellation is done. 10 Create New Schedule. 11 Save Changes. 12 Continue to Date and Time, gated until a session type is chosen. 13, 14 and 15 Continue to Capacity and Pacing. 16 Continue to Time Off. 17 Continue to Preview and Confirm. 18 Publish Availability. 19 Create New Schedule. The index page: Start Here. This record: none. Inside the overlays: Confirm No-show and its Done, Apply in the calendar filter, Confirm Reschedule and Back to Calendar.

What lost the colour: Connect Calendar beside every Set Availability, Book a Session and Add Time Off in the calendar toolbar, Set Your Availability on the four screens where an overlay owns the job, Schedule New Appointment in the session panel on the screens where the panel is closed on arrival, Schedule Meeting in the appointments empty state, Create New Schedule on the schedule-details screen, Add These Hours, Add Time Off in the wizard, Save Changes in the day panel, and the Apply in all fourteen Copy To Other Days pickers. Twenty-one filled buttons became neutral and fifty-four buttons in total now read the neutral treatment.

State went back to the brand blue, stated quietly, after the deep blue was rejected user-directed, 2026-08-07, same day

The first version of the pass above moved every state accent to a deep solid #006491. Jaspal turned it down on sight: keep the colour that was already decided, but keep it subtle and do not over-use it. The narrowing itself was not in question, only the second colour it introduced.

So state is back in the chosen brand blue and there is no second hue in the file. It appears in two forms and never as a solid fill behind white text. The ink form is the blue darkened to #0078A6, the pressed step the design file already implies, which measures 4.96:1 on white and carries text, icons, hairlines, rings and the small marks that have to read as on or off. The surface form is the blue laid over white at 20 percent, #CCECF8, baked to a solid so it composites the same wherever it sits, and it always has the body ink on it at 13.37:1.

Five surfaces changed hands: the active menu row, the segmented control, the mini-calendar day, the selected session-type card head and the month bar over the availability preview. All five were solid fills with white labels; all five are now the wash with body ink. Against the #F1F2F6 menu panel the wash is a 1.11:1 step in luminance, which is quiet by design, so the active menu row is carried by three things at once rather than by the wash alone: the wash, the body ink against the #3D4351 of the rows around it, and the semibold weight. Six things stay solid in the darkened blue because they are binary marks rather than surfaces, and none is larger than 44px: the wizard's done markers at 24px, the day and pacing switches at 44 by 24, the new-message dots at 8 and 9px, and the today rule at 1px tall. The chart bars on Performance are the one thing that runs past 44px in that blue, up to 247 by 16 on the session-type chart, and they are exempt because a data mark's length is what is being read rather than a control's boundary. They are still not the call-to-action colour, which is the thing the rule protects.

One judgement call inside this one. The active tab now reads as a body-ink label over a 3px bar in the darkened blue rather than a bar in the same ink. With every other state accent back in the blue family an all-ink tab read as the one orphan on the page, and a 3px hairline is the smallest place to put the family back without adding a second run of coloured text under the header. The same treatment is on the session drawer's tabs.

Measured after the change, and nothing regressed: ghost buttons and links 4.96:1, link hover 7.06:1, every wash label 13.37:1 or better, the wizard done marker 4.96:1, the switch track against its white ground 4.96:1 and against the off track 2.50:1, up from 1.55:1 before this pass. The one-call-to-action-per-screen rule is untouched: all 33 pages still show at most one filled brand-blue button at 1440 and at 760.

The call-to-action colour still does not reach 4.5:1, and that is a knowing call user-directed, measured

The call-to-action colour from the design file is a light cyan. White text on it measures 2.97:1 against the 4.5:1 that normal text needs. The previous pass recorded eight pairs under the line, all of them the same colour. Narrowing the colour to the call to action has cleared seven of them, because seven were not buttons: the outlined button's label and its 1px border are gone with the variant; the active tab's label is body ink on white at 16.60:1 and its 3px bar is the darkened blue at 4.96:1; the active menu row is body ink on the wash at 13.37:1; the header avatar's initials are body ink on the neutral ground at 13.24:1; and the hover step on the filled button lands white at 4.96:1.

One pair is left under the line: white on the filled call to action, 2.97:1. It survives on purpose, because the colour is the one that was chosen and it is now the only thing wearing it. Bryan: if it has to pass, the smallest change is darkening the call to action to the pressed step already in the file's neighbourhood, #0078a6, which lands white at 4.96:1 and changes no layout. Nothing else in the file has to move with it, which was not true a pass ago.

Two boundary values are worth stating with it, because both are hairlines rather than text. The neutral button's 1px boundary is the #d0d5db the shell option draws, which measures 1.48:1 on white against the 3:1 a control boundary is asked for; the button is still identified by its label at 16.60:1, its 40px height and its pill shape, and if the boundary should carry the identification on its own the CDS neutral-300 #878d91 does it at 3.36:1 with no other change. The hover boundary on cards and stat tiles measures 2.11:1, up from 1.72:1 before this pass, and is decoration on top of a border that is already there rather than the only signal. Everything not carrying an accent passes as before: the menu label on the panel at 8.85:1, the page title and the product name at 16.15:1, the account role and the inactive tab at 4.83:1, the destructive button at 5.90:1 and the remove control at 7.61:1.

Proposed: the narrower schedule takes a shared hour user-directed, answers 316:375

The three overlap warnings used to name the clash and stop, because writing a rule into them would have answered Bryan's own question on his behalf. Jaspal directed that a rule be proposed rather than left open. The rule: a shared hour goes to the schedule that covers fewer days; if the days match it goes to the shorter daily window; if both match it goes to the schedule published most recently. Specificity beats breadth, which is the same principle the Date and Time tabs already run on, where a date-specific entry beats the weekly pattern. In the sample it gives 3:00 pm to 5:00 pm on Monday, Wednesday and Friday to Short-notice hours (Mon, Wed, Fri) over Weekday hours (Mon to Fri), three days against five; and once Spring hours (Mon to Fri) is published it takes the remaining shared afternoons from Weekday hours, a shorter day across the same five days. The warnings on screens 10, 18 and 19 stop at two sentences, the clash and the winner, because a provider reading a warning needs the outcome rather than the tie-break order; the rule itself is stated here and nowhere on the screens. It is carried on the screen index as a proposal rather than as a settled call, because it is Bryan's question to close, and reverting it is one paragraph on three screens.

A day's hours can be copied onto other days user-directed, screens 13 and 11

The board draws no copy control and none was invented on the first pass; Jaspal directed that one be built. Every day that is on carries Copy To Other Days beside Add Time Slot. It opens a picker of the other six days as checkboxes with Apply and Cancel, and Apply writes that day's ranges onto every day ticked, replacing what those days held rather than adding to them. A target day that was unavailable is turned on, because it has hours now, and the status region names both what was copied where and which days were turned on. Apply with nothing ticked states that rather than closing on a no-op. The picker opens in normal flow under the day rather than as a popover, for the same reason the appointments filter does: the card around it clips its own overflow. It closes on Escape and on Cancel with focus back on the control that opened it, and opening one picker closes any other. It is on the weekly hours step and on the schedule panel's day list, the two places the same editor appears; the panel holds one range per day except where the schedule itself carries a break, so a copy there is the day's first range to one range.

Helper text that only restates its heading is gone user-directed, standing convention

Standing rule, applied across all thirty-one screens: a heading or label carries its own meaning, and supporting copy is added only where it prevents a misunderstanding or an error, never to say the heading again. Fourteen strings went whole: the My Availability lede on screens 10, 11 and 19, the welcome card's body on screens 1 and 5, the Weekly Hours, Date-Specific and Capacity Limits pane ledes, the two pacing switch descriptions on screen 16 and the buffer one on screen 11, the toggle-the-days line above the day list on screen 11, Not shown to clients under a field already labelled Notes for your own reference, and the Description section's summary of itself. Eight more were trimmed to the sentence that was doing work rather than dropped whole: the step 2 tab ledes on screens 13, 14 and 15, the step 1 pane lede, the pacing lede, the time-off ledes on screens 3 and 17, and the custom-range line on screen 2. What stayed is everything that prevents an error or explains something the screen cannot show: the clash and precedence messages, the One-Time and Recurring explanations, the time-zone equivalence lines, the cross-schedule note on time off, and the legend meanings. Two section summaries on the schedule panel that described their own section now carry the section's own figures instead.

The page title is not said twice user-directed, screens 10, 11 and 19

Screens 10, 11 and 19 carried My Availability in the top bar and again as the first heading in the content column, two headings for one page. The second one is gone and the top bar's is the page title, which is how the other sixteen screens already read. The wizard steps keep their content heading, because it names the step rather than the page: Session Details, Date and Time, Capacity and Pacing, Time Off, Preview and Confirm. With the repeat gone, Schedules is now the first heading under the page title and the schedule names sit under it, so the order runs first, second, third level with nothing skipped.

Schedule Type is now Recurrence user-directed, screen 14

The fieldset on the Date-Specific tab offered One-Time and Recurring under the label Schedule Type, which is how often an entry repeats rather than a type of schedule. Bryan's answer is the honest label, so it reads Recurrence and the two options are unchanged. If Schedule Type turns out to be the platform's own word it goes back, which is one string.

Publish state is the badge and nothing else user-directed, closes 242:246

A schedule card carried both a Live or Draft badge in words and a coloured 3px rule down its leading edge, two signals for one fact. The rule is gone from screens 10, 11 and 19 and the badge stands alone. The brand rule that marks the schedule the panel is reading on screen 11 stays and is now the only rule a card can carry, so a rule means selection and nothing else; the tint on that card and aria-current carry the same fact beside it. The draft card's grey icon wash stays, because it sits beside the Draft badge rather than instead of it.

Step 3 opens with the hours step 2 produced user-directed, screens 13 to 16

Capacity and pacing are limits on hours, and the step carried no sign of which hours it was limiting; nothing summarised step 2 before step 5. It now opens with a read-only summary of the weekly pattern and of how many date-specific dates were added, with a link back to the step that set them, which also makes the cap arithmetic below it legible: six a day across five available days is where the thirty comes from. If step 2 produced nothing the summary has nothing to say, so a notice takes its place instead and points back at the step; the branch is real in the markup and the script, and the sample always has hours, so the summary is what shows. Navigation is deliberately left ungated. Whether a schedule with no hours should be stopped from reaching step 3 at all is a rule about the object rather than about this screen, and it stays on the question list.

Get Help closes every availability screen user-directed, 370:4619

The dashboard closes with Get Help and the ten availability screens had no support route at all, which is the section where a provider is most likely to be stuck. The same link, the same icon and the same note now close screens 10 to 19, as the last thing in the content column on each, so it sits in one place across all nineteen. It is inert here as it is on the dashboard, and it is listed with the other inert controls.

Call-to-action text and section headings are Title Case user-directed, standing convention

Every button, button-styled link and action link across the set reads in Title Case, and so does every section heading that is not a full sentence: Book a Session, Add Time Off, Clear All, View Open Slots, Client Details, Mark Attendance, Scheduled Time Off, Common Reasons. Ninety strings changed, all of them case only, no wording touched. Sentences stay sentence case, and so do field labels, option labels, badge words, legend keys, message subject lines and the empty-state copy, so a heading and a value never read the same way. Hyphenated compounds are treated as one word, which is why Confirm No-show does not become Confirm No-Show. Same convention as the UCM-003 billing prototype.

The appointments filter is an inline panel, not a popover

On screens 1 and 5 the appointments list sits inside the accordion, which opens by growing a grid track with its inner wrapper clipping overflow, so a popover hanging off the Filter button would be cut off at the card edge. The panel opens in normal flow under the list head instead, which also means it needs no outside-click handling and no focus trap. Screen 6 uses the same component for consistency even though it has no accordion around it. Session type and status are the two facets the rows actually carry, so nothing here filters on a field the sample data does not have.

On screens 3 and 4 the filter suspends the add drawer rather than stacking on it

Those two screens ship with the add drawer already open, and two panels cannot share the right edge. Opening the filter slides the add drawer back off the edge and makes it inert; closing the filter brings it back with every field exactly as it was left, and focus returns to the Filter button. Nothing in the add drawer is reset by the trip. Screen 2's Time period select is deliberately left out of the filter drawer on these two screens: the toolbar there is static by design, so a control whose only job is to move the calendar would have been the one dead thing in a working panel. Say the word if the toolbar should be live on 3 and 4 as well and the select comes back with it.

The calendar's session details open in place, not on another screen user-directed, 370:2394 and 370:1962 and 392:555

Directed by Jaspal and matched to the board: frames 370:2394 and 370:1962 both draw the details panel sitting beside the calendar, and Epic 2 392:555 says appointment details show in a side drawer with cancel, reschedule, no show and confirmed actions. Screen 2 now carries that drawer itself. All seven cards open it, each with its own client, and the two cards that used to navigate to screens 6 and 7 stay on the page instead. The drawer, the no-show modal and the attended confirmation are the same components as screens 6 to 9. The appointment rows on screens 1, 5 and 6 now do the same thing, so a session opens the same way on every surface that lists one.

Closing notifications on screen 5 no longer leaves the page consequence of the row change

Screen 5 is the dashboard with the notifications drawer over it, and that drawer has a scrim, so until now nothing on the dashboard underneath it could be clicked at all. With rows opening the drawer in place, the scrim and the X now dismiss notifications where they are instead of navigating to screen 1, which is what makes the rows underneath reachable. The bell in the top bar brings notifications back, and the Dashboard tab is still the way to the plain dashboard screen. Say the word if closing should go back to being a page hop.

The four attendance actions show on past rows too

The drawer carries Attended, Cancel, Reschedule and No-show whichever row opened it, including the Earlier group, where a session is already marked complete, cancelled or a no-show. The board draws one set of actions and says nothing about which of them survive on a closed session, so the set is left whole rather than guessed at. Tell me which actions should drop on which status and it is a small change.

The two weeks either side of Mar 16 are invented sample data

The board only ever drew one week. Making the arrows work needs somewhere to arrow to, so Mar 9 to 15 and Mar 23 to 29 were written to sit either side of it: the same published weekday hours (9:00 to 5:00), the same seven clients, and seven sessions between them, three in the earlier week and four in the later one, plus one block of scheduled time off on Thu Mar 27. Case numbers keep the existing series running in date order, so nothing collides with the numbers already published on screens 6 and 7. The loaded range is therefore Mar 9 to Mar 29, and the arrows grey out at both ends rather than inventing more. Say the word on the shape of a plausible week and it is a few lines to change.

Time period is a range, so This month opens Month view 392:539

The note lists this week, next week, this month and custom. This week and next week name a week, which the week grid already draws, so those two move the grid. This month names a month, and a month has no honest representation on a seven-day grid, so it switches the view instead. Custom opens the inline picker the note asks for and jumps to the week that holds the date chosen. If Time period is meant to filter the list of sessions rather than move the calendar, that is a different control and worth saying so.

Month view drops the days the sample does not cover

March 2025 is drawn on its real weekdays, six rows of seven, Feb 23 to Apr 5. Only Mar 9 to 29 carry sample data, so the rest of the grid is drawn but inert rather than opening an empty day. The alternative was to invent five more weeks of sessions to fill the month, which would have added sample data nobody asked to review. A line under the grid states the range.

Day view opens on the first day of the week that has anything on it

Switching to Day view from the current week opens today, Mar 17. From another week there is no today to open, so it opens the first day of that week carrying published hours or a session, which is the Monday. Opening the Sunday would have shown an empty column and read as a broken view.

Contact details for five of the seven clients are invented

Screens 6 and 7 only ever published a phone number, email, location, time zone, language and authorization date for Ella Zaman and Tiffanee Richter. The calendar drawer needs the same block for every card, so those fields were invented for Reed Wasson, Sarah Deng, Vance Pearl, Marcus Bell and Priya Raman, in the same shape as the two that exist. Case numbers and session times were not invented: they match screen 6 row for row, which is why Vance Pearl's case stays on the older 11798xx number rather than joining the 11804xx series.

Two-tab against three-tab navigation, built as three 345:1845 against 370:2394

Frames 172:144 and 345:1845 draw two tabs, Dashboard and Calendar. Frames 370:2394, 370:1962, 47:5798 and 47:5344 draw three, adding Appointments. The board contradicts itself and one of the two is stale. Three tabs is the built default across all nine screens, because the Appointments tab is the only route to a real screen in the set and a two-tab dashboard would strand it. Screens 1 and 5 gained the third tab to match. Say the word and the whole set drops back to two.

The no-show modal layout is invented 370:4628 and 392:551

No board frame exists for it. Built as a narrow CDS modal: the session line, a tally of previous no-shows, three statements of what happens next (the slot is released, a missed first appointment closes the case, billing is possible if the criteria are met), then Back and Confirm No-show, then a success face. The counts are sample data.

The yellow reschedule mark is orange-350 392:559

CDS publishes no yellow at all. The token file carries neutral, primary, green, orange, red and one focus blue. The reschedule mark takes Orange/orange-350, the warmest CDS step that still clears 3:1 on white, and no-show takes Neutral/neutral-350 as the note asks. If a true yellow is wanted it needs a new token raised with the design-system team.

Orange means one thing: a session on hold 244:797 and 392:547

The board legend said green is available and orange is blocked, while Epic 2 said green is booked and orange is hold. Both cannot own green. Resolution: the surface layer carries availability (green wash is a bookable window, a grey diagonal hatch is time off), the card layer carries status (a green rule is booked, an orange rule is hold), and session-type tags carry no status colour at all. Individual, Couple and Family are neutral outline chips with a type glyph, so a family session can never read as blocked time.

Notification type is an icon and a word, not a coloured edge 345:1845

The board coded each notification's type with a 4px coloured left edge, which is meaning carried by colour alone. Replaced with a tinted type icon plus the type in text: Booking request, Reminder, Cancelled. Same information, readable without colour vision.

The empty state on screen 6 is rescoped, not verbatim 370:2394

The board puts "No upcoming meetings / You don't appear to have any upcoming meetings" directly under a populated list, which contradicts what is on screen. It now reads "Nothing scheduled after March 21 / Your calendar is clear beyond next week." with the same Schedule Meeting action. Revert to the verbatim copy if the empty state is meant to be the whole-page state instead.

"Late cancellation, greater than 24 hours" is kept verbatim and reads backwards 370:4672

A late cancellation is normally one given with less than 24 hours' notice. The sticky says greater than. Rendered as written rather than corrected. Please confirm the intent.

The timezone mini-calculator comes from an unattributed sticky 370:4715

The note asking for the field to become Client timezone plus a live provider-time equivalent carries no author on the board node. It is built as written: the label is Client timezone, and a line below states the equivalent ("2:00 pm in the client's timezone is 11:00 am in yours, Vancouver, Pacific time"), recalculating on any change. Confirm the note is yours before it counts as a directive.

Confidential notes: flagged, not designed 244:843

Where confidential session notes are stored is unresolved, so no storage control, warning copy or policy statement was invented. The Notes field ships as the board drew it. Once the answer lands it probably needs either helper text naming the system of record or a visibility control. Worth answering before either is designed.

Session details live in one shared drawer 370:4739 and 370:4758

Both stickies sit ambiguously between the Appointments frame and the Calendar frame. The panel they edit exists on both, so they were applied once to the shared drawer component and therefore land on screens 6, 7, 8 and 9 together. Client Details gained phone with a leave-a-message flag, email, location, time zone, preferred language and the authorization date; Create Note, More Info and Join Video Call are gone.

The collapsed rail is a local extension, not a CDS component

CDS models one side navigation at a single 256px width with no icon-only variant. The shell here runs 240px open and a 72px rail closed, remembers the choice, and restores it before the page paints so a closed rail never flashes open. Below 900px the nav is already a horizontal bar, so the toggle hides and the labels come back.

Sample dates and names were corrected where the board contradicted itself

March 17, 2025 is a Monday, not a Tuesday, and a week grid has to put a date in a real column, so the whole set now says Monday. Case 1179884 carried two different client names across its no-show and its rebooked session; it is Vance Pearl throughout. The calendar screens sit on the week of Mar 16 to 22, 2025 with the dashboard; the session-detail screens sit on the week of Apr 21, 2025, which is what their own frames show. Every date the calendar draws is on its real 2025 weekday: March 1 is a Saturday, so the month grid starts its first row on Feb 23.

The cancel confirmation is only half answered 392:579

The note reads "Show cancel confirmation on calendar. Need to think about how to also show a new booked session in same slot." The first half is built: the success state says the session now reads as cancelled and the slot is open again. The second half, how a re-booked session in the freed slot should look, is an open design question the note itself raises, so nothing was invented for it. It needs an answer before the calendar card states are locked.

Two action labels were named rather than copied 392:555

The drawer's primary save action is named for what it does on each tab, Book Session on the Session tab and Save Time Off on the Time Off tab, rather than one Save across both. And the Epic 2 note listing "cancel, reschedule, no show, confirmed actions" is built as Attended, because the provider is recording what happened, not confirming a booking. Both are one-word reversals if you would rather have the board's wording.

Two deviations worth raising with the design-system team

Field, textarea and radio-pill borders run at neutral-350 rather than the CDS-bound neutral-200, because neutral-200 on white is 1.98:1 and a control boundary needs 3:1. Card radius stays at radius-small (8) rather than the CDS Card binding of radius-default (16), matching screen 1 and the billing prototype. Both are the same deviations already recorded on UCM-003.

My Availability: eleven board states built as ten screens 172:1695 and 172:2430

The box holds ten frames, but frame 172:1695 renders two screens stacked, so there are eleven states to build. Frames 172:1695 and 172:2430 are the same page with a panel and then a panel on top of that panel, and both crits against them (239:303 and 239:507) ask for one surface with labelled sections instead. Merging them is the resolution, not a shortcut, and your 317:392 permits it in as many words. Ten files cover all eleven states.

The nine ambiguous stickies, and where each one landed

Nine stickies sat between two frames on the board and were captured under both. 316:382 "we need to decide on color scheme" and 242:232 "the create card competes" both went to the schedule list (172:1503), where the coloured rules and the dashed card actually are. 317:399 "edit pencil on each card" went to the wizard step 1 cards (172:2692), beside the crit it answers. 239:303 "More options is vague" went to the schedule panel (172:1695), the only frame carrying that button. 244:429 "the weekly cap may never bite" went to Capacity and Pacing (172:3458), where the two caps are. 317:458 "remove logs" and 239:537 "a Logs section in the setup form" both went to Date-Specific (172:2949), the only frame with a Logs block. 244:508 "a saved draft seems to disappear" and 317:440 "yep. Need to add that" went to the schedule list (172:4184), because the missing thing, a draft state on the list, lives there rather than on the preview step. In every case the sticky's own words named an element that exists on exactly one of the two candidates.

Client or member: one word is still unsettled 244:531, answered "Members" at 317:444

This needs a decision. Crit 244:531 asks for one word for the person being booked, and you answered "Members" on the My Availability box. But the Home v2 directive 370:4684 and 370:4680 says client throughout the design, and all nine Home screens already read that way. Honouring "Members" here alone would create exactly the inconsistency the crit is about, so this section stays on client and the conflict is raised rather than settled. Switching to member is a rename across all thirty-one screens; say the word and it is one pass.

A one-item tab bar is dropped

Every My Availability frame draws a single tab reading "My Availability" directly under an H1 reading "My Availability". A tab bar with one tab offers no navigation and repeats the title, so it is out. The Home tabs stay because they carry three real destinations. Connect Calendar, which the board draws on six of the ten frames and not the other four, is on all ten for consistency, and is inert.

Two board figures were corrected against the board's own screens

Active Days Per Week reads 5, not the board's 3: the two schedules on the same screen cover Monday to Friday. That correction now runs across the dashboard too, so screens 1, 5, 10, 11 and 19 all read 5. And the preview step's weekly summary marks Thursday available, where the board marked it Unavailable, because the Weekly Hours screen inside frame 172:1695 shows Thursday switched on with hours. In both cases the board contradicts itself on the same screen; tell me which side is right and it is a one-line change either way.

Dates are rebased onto March 2025, the set's own week

The board drew June 2026 on the Calendar View tab, May 2026 on the preview and a May 20, 2026 blocked time. This section runs on March 2025 with the other nine screens, on real weekdays: the Calendar View day panel opens on Thursday, March 20 and the blocked time is Thursday, March 20, 12:00 to 2:00 pm for training, which is the same block screen 3 already publishes, with the same two clashing sessions.

Schedules are named, and one of them was given hours that clash

The board's "Schedule 1" and "Schedule 2" are Weekday hours (Mon to Fri) and Short-notice hours (Mon, Wed, Fri), continuing the naming screen 3 already publishes. Schedule 2 is given 3:00 pm to 7:00 pm so that it genuinely overlaps Schedule 1 and the warning crit 242:239 asks for has something real to describe. A third schedule, Spring hours (Mon to Fri), exists as a draft so the Save as Draft loop closes on a real card. All three sets of hours are sample data.

One switch per day, rather than a Make Available button on some days

The board's weekly hours screen turns a day on with a Make Available button and off with nothing, while the schedule panel uses a toggle. One control on all seven days is easier to learn and easier to reverse. The state is always a word beside the switch, never the track colour alone.

Every wizard step is a link

The board greys the steps ahead of the current one. Here all five are links in both directions, because a five-step flow that can only be walked forwards cannot be reviewed. Continue on step 1 is still gated on choosing a session type, so the one real rule the board states is kept.

Booking page options came off the schedule panel 242:320, removed 2026-08-19

In this model WPO staff book on a client's behalf, so it was never clear a public booking page exists at all, and a slug like /new-meeting would mean nothing to a provider. The section shipped as drawn with that question attached. The final Figma does not draw it, and it is gone from the panel with notifications and workflows. The question it carried is answered by removal rather than by design, so say if that was the intent.

One number to reconcile between the two sections

The Home calendar drew the published bookable window as 8:30 am to 5:00 pm with an hour taken out at noon; this section publishes Schedule 1 as 9:00 am to 5:00 pm with no break, which is what the My Availability board frames say. Two windows for one live schedule, so on 2026-08-10 the calendar was corrected to the board's number: screens 2, 3 and 4 now draw one continuous band from 9:00 am to 5:00 pm and the three Bookable lines on screen 4 read the same. The one sample session that sat at 8:30 am, Sarah Deng on Wednesday March 19, moved to 9:00 am so no booked session sits outside the window it was booked in.

Preview on the schedule panel opens in place, and shows that schedule judgement call, screen 11

The panel's Preview button used to open the wizard's step 5, which previews Spring hours: the schedule the wizard is building, not the one the panel is editing. Two ways out of that. Either step 5 learns to preview whichever schedule sent a provider to it, which means carrying a schedule through the flow in a prototype that stores nothing, or the panel previews its own schedule where it stands. The second is built: Preview opens a week of Weekday hours (Mon to Fri) at the foot of the panel, with the Thursday time off named, and step 5 stays what it is, the last step of creating a schedule. It also matches the rule the rest of the set follows, that a record's own detail opens in place rather than on a screen built for one fixed record.

The board's breadcrumb is dropped drawn on the My Availability frames

The frames draw "Provider Platform > My Schedule" above the page title. It is out, for the same reason the Home screens have no breadcrumb: the left rail already says where you are, the trail is two levels deep with the first level being the product itself, and My Schedule is not what the section is called anywhere else. Recorded here because it was dropped without a note the first time round. Say the word and it comes back on all ten.

The wizard step rail is one row at every width screens 12 to 18

It used to wrap, and on the Calendar View tab, where the column gives up the width of the day panel, step 5 dropped onto a second line with a connector left dangling off the end of the first. The rail now never wraps. The connectors are the only elastic part, so they take the squeeze at 24px down to 8px before a label is touched, and the rail measures itself rather than the window: once even the squeezed row would not fit, the step names step aside and the numbers carry the rail, with the current step keeping its name. The step chips lost 4px of padding and their circles went from 28 to 24 to buy the room. All seven wizard screens share it, so the rail behaves the same way on each at the same width.

The wizard rail and the page under it say the same words screens 12 to 18

A step used to be called one thing in the rail and another on the page it opened: rail Date and Time against heading Set Your Available Hours, rail Capacity and Pacing against Capacity Limits, rail Time Blocking against Block Time, and step 5 had no heading at all. Each page now opens with its rail label verbatim as its heading, the schedule being built and the step number under it, and its browser tab title matches. Continue names the step it reaches by the same name. The rail is also a nav with its own label now, rather than a bare list carrying one.

A day that gives up an hour is not a day that is gone

March 20 is available 9:00 to 5:00 with 12:00 to 2:00 taken as time off. Both month grids painted it fully peach, the same fill a wholly unavailable day would take, so six of its seven bookable hours read as lost. It keeps the green available wash and takes an orange band along its foot, the cell states both facts in words, and the legend carries the partial state with its own key drawn the same way. Full peach is reserved for a day with nothing bookable left; no day in the March sample is one, so no legend key claims otherwise.

The three dialogs now behave like dialogs screens 1, 5, 6, 8 and 9

The reschedule, cancel and no-show modals all declared aria-modal and shipped no behaviour to match: focus stayed outside them, Tab walked through the two dozen controls of the page behind the scrim, Escape did nothing and the page behind kept scrolling. One shared script now gives all three the same contract. Focus moves in on open, Tab and Shift-Tab stay inside, the background is inert and held still, Escape closes, and focus returns to the control that opened it. It opens and closes nothing on its own except on Escape, so each screen keeps its own handlers. Screens 8 and 9 ship with their dialog open, which is a built page state rather than an action, so there is no trigger to return to and none is invented.

One drawer chrome, one set of drawer contracts

The same drawer component carried three different ARIA contracts across the set and two different headers. Every drawer is now role="dialog" with aria-labelledby pointing at its own title and aria-modal stating what is actually true of it, which is false everywhere except the day panel at a width where it covers the page. And the day panel's brand-purple header is gone: every drawer in both sections uses the white one, because two chromes for one component was a difference that carried no meaning. Equivalent footer actions read alike, so the day panel saves with Save Changes as the schedule panel does.

Design rationale is in this document, not in the served markup

The screens carried about a hundred and forty HTML comments explaining why each decision was made, quoting board stickies and citing node ids. View-source on a public URL is a publication channel, so all of them moved to the internal build notes and the screens kept structural section markers and a neutral sample-data header. Nothing was summarised or dropped on the way.

One board frame is built as two screens 172:6252

Performance V2 holds a single frame. It is built as screen 20, and screen 21 is the same page with Earnings Overview open. Splitting a page state into its own file is the pattern the set already uses for screen 5 against screen 1 and screen 19 against screen 10, and it is what makes the earnings decision reviewable without anyone having to click.

Neither Performance screen carries the call-to-action colour

The rule is one filled brand-blue button per screen, on the action that advances the screen's job, and none where nothing advances. Performance reports. Show Earnings reveals something already on the page rather than moving the provider on, and the board draws no export, no download and no share, so none was invented to give the colour something to sit on. Both screens carry zero filled buttons, which the sweep checks.

"Remove this graph" was read as the Total Clients chart 320:492

The sticky names no chart. Placed on the frame it sits at y 688 to 928, which is inside the Total Clients card and nothing else; the Session Types and Assessments cards start 200px lower. The other two charts also have their own stickies, and this one does not. If the intended target was a different chart, say so and it moves.

CSAT is drawn as a score with its rating spread

Your note says CSAT will be one data chart and does not say what shape. A trend line was rejected because it cannot be drawn honestly for Last 7 Days, and the same chart has to work in all four ranges. It is a score out of five with the five-star to one-star spread under it, which reads the same at every range and reuses the bar the Session Types chart already uses.

The reference point is the previous period and a twelve-month average 239:615

Your crit offers three: a target, the last period, or an average. Two of the three are computable from data the provider already has, and both are shown in Last 7, 30 and 90 Days. Last Year carries the previous year alone, because there the twelve-month average and the headline figure are the same number. A target is a policy number nobody has set, so inventing one would have put a made-up goal on a real screen. If WPO does set a target, it belongs here and it should replace the average rather than join it.

The invented ranges sit under the weekly cap; the board's own column does not screens 11 and 16

Max Sessions Per Week reads 25 on the schedule panel and on the capacity step. The three invented ranges were re-cut to sit at or under that: 23 sessions in Last 7 Days, 24.5 a week in Last 90 Days, 24.7 a week in Last Year. Nothing invented now contradicts a number the provider can read on another screen.

Last 30 Days is left alone at the board's 112, which averages 26.1 a week. That cap is set per schedule, not per provider, and Dana runs two live schedules, so 112 is inside her ceiling. It is recorded here rather than rewritten, because 112 is your number and the alternative was to lose the one column that is yours verbatim. If the cap is meant to be per account, say so and the column moves with it.

Three of the four date ranges are invented data

Last 30 Days is the board's own column, carried across verbatim: 110 clients, 52.3 percent, 234 hours, 112 sessions split 87, 14 and 11, and $350, $275 and $8,975. The other three ranges are invented, and they balance the way the board's does: the three outcomes add up to total sessions, the two amounts are the count times $25, total earnings is the completed amount plus those two, and the session-type counts add up to total sessions. The sweep checks all four of those sums in all four ranges, and that no invented range runs over 25 sessions a week. The board's five session-type bars are the one thing not carried across as drawn: measured off the frame they run about 45, 32, 28, 18 and 12, which sums to roughly 135 against the same frame's total of 112, so they are rescaled to 45, 27, 21, 12 and 7 and the top bar and the ordering are kept.

Charts take the accent ink, never the call-to-action colour

The board drew the bars green and the pie in five colours. One data colour is used here instead, the same darkened brand blue that carries links and icons, at 3.95:1 against its own track and 4.96:1 against the page. A bar runs to 247 by 16, past the 44px the colour rule sets for a solid fill; a data mark is exempt from that rule because its length is the reading rather than a control's boundary, and both entries in the rule now say so. Switching the bars to the 20 percent wash was the alternative and was rejected: against the neutral track the wash is a 1.05:1 step, which is not a chart. The four session figures keep the CDS status ramps because the rest of the set already gives green, orange and red those three meanings, and each figure has its label beside it so the colour is never the only signal.

The board's uppercase micro-labels are not carried across

The frame sets TOTAL CLIENTS, FILL RATE and the rest in small uppercase. The stat card in this set has a label style already, on screens 1, 5 and 10, and matching the set beats matching one frame. Sentence-case Title Case labels at 14px, as everywhere else.

Tabular figures are off everywhere except the chart's value column

HN for TELUS gives a comma and a full stop the same wide advance as a digit while tabular figures are on, so "$8,975" rendered as "$8 , 975" and "53.8%" as "53 . 8%". Tabular figures earn their place in a column that has to line up, which here is the bar chart's value column and nothing else. Every other figure takes the proportional cut. Scoped to these two screens; no other screen is touched.

Two inherited colour pairs are raised on these two screens only

The shared stat label and the shared message-box body are neutral-350, which measures 3.36:1 on white against the 4.5:1 normal text needs. Both are moved one step to neutral-450 at 9.66:1 here. The override is scoped to the Performance screens rather than applied set-wide, because changing a shared primitive would have rewritten nineteen screens that were in scope only for one navigation line. The rest of the set carries the same pair and wants the same fix in a pass of its own.

Hours Delivered carries no reference line

Total Clients has its new and returning split and Fill Rate has its comparison, so the third card looks bare beside them. Nothing on the board gives Hours Delivered a companion figure, and the honest ones would have exposed a number the board does not support. Left bare rather than filled with an invented average.

The (i) on an earnings card opens in place

The board draws an information icon beside all three earnings labels. Each one is a disclosure that opens a single line inside the card rather than a popover, because a popover inside a card with a clipped panel is a shape this set has already been bitten by. Two of the three say the $25 rate is the board's figure and not a confirmed WPO rate; the third says what the total is made of.

The shell was rebuilt on the image Jaspal chose user-directed, 2026-08-08, every screen

The header-first shell that carried the set until now is gone. The brand and the collapse control moved out of a full-width header and into a full-height left panel 285px wide; the menu became a tree with one group expanded; the page ground moved from white to #fafafa so a white card reads as a card rather than as a boundary drawn on nothing; and a breadcrumb went back above the page.

What did not change: the collapse control, the attribute it writes, the localStorage key behind it and the pre-paint script that restores it. A rail that was collapsed before the retheme is still collapsed after it, on every screen, and the rail is still 72px wide.

Home is called Overview user-directed, 2026-08-08, screens 1 to 9

The image names the scheduler's first page Overview, not Home. The menu item, the page title, the breadcrumb leaf and the document title all read Overview on screens 1 to 9. The three tabs under it keep their own names, Dashboard, Calendar and Appointments, because they are views of Overview rather than alternatives to it.

One collision worth naming: the top of the tree is a platform row also called Dashboard, and the first tab under Overview is also called Dashboard. That is how the image draws the platform, so it is drawn that way here. If the platform row is really something else, it is a one-word change in one place.

The breadcrumb is back, and it reads Dashboard / Provider Scheduler / page user-directed, 2026-08-08

A previous crit took the breadcrumb out, because with the page title in a full-width header a crumb trail above it carried no orientation. The chosen image puts one back, and now it earns its place: the scheduler is one product area inside a platform, and the crumb is the only thing on the page that says so. Its first two steps are live links, to the screen index and to the scheduler's own first page.

The active menu pill and the avatar are a solid brand blue, applied as drawn user override, 2026-08-08

The August 7 pass moved every solid brand blue off everything except the one call-to-action button per screen, and put the active menu row on a 20 percent wash with body ink on it at 13.37:1. The chosen image draws the active menu pill as a solid #00A0DD with a white label, and the account avatar as a solid #00A0DD circle with white initials. Both are applied as drawn.

Measured: white on #00A0DD is 2.97:1, against 4.5:1 for text and 3:1 for a non-text control. Both pairs fail. Neither is the only carrier of its fact: the menu pill is also the only row with a chevron and the group whose children are showing, and the avatar sits beside the same name in body ink. Moving the fill to the pressed step #0078A6 lands white on it at 4.96:1 and changes no layout.

The outlined brand-blue secondary button is back user override, 2026-08-08

The August 7 pass withdrew the outlined brand-blue secondary and made every non-primary button neutral: white fill, a #d0d5db hairline, body ink. The chosen image draws the secondary as white with a #00A0DD outline and a #00A0DD label, so that is what the button is again, at the same height, corner and padding.

Measured: #00A0DD on white is 2.97:1 for the label, against 4.5:1, and 2.97:1 for the 1px boundary, against 3:1. This is the change that puts the brand blue back on more than one control per screen: screen 22 carries three of them. The neutral button is kept in the token layer as --pp-btn-quiet-* and can be pointed back at in one line.

Five platform rows are drawn around the scheduler, and none of them leads anywhere the shell image, every screen

Dashboard, Application, Provider Bio, Case Management and Administration are drawn because the image draws them, and because they are what puts the scheduler in its place inside the Provider Platform. None is a link: each is a span, so it cannot be tabbed into or clicked into a dead end. Administration carries the collapsed chevron the image gives it.

Below 900 the platform rows step out and the bar carries the four scheduler pages every screen

The left panel becomes a scrolling bar above the page, as it did before. The five inert platform rows are hidden at that width and the four scheduler destinations come up to the bar, which is exactly what the old shell showed there. A rail that is a horizontal bar cannot be collapsed, so the toggle is hidden and every label comes back whatever the remembered state says.

Preferences uses the tab row, not the board's inner Settings rail screens 22 to 30

The board draws a second vertical rail inside the content, headed Settings, holding the four areas. The shell already carries a full-height left menu; a second rail beside it would be a third level of navigation chrome for four destinations. The four areas are the tab row under the breadcrumb instead, which is the same secondary navigation the Overview section already uses for its three views.

The session types are the ones the booking flow already offers screens 26 and 27

The board lists eight types from a nutrition practice: Free Discovery Call, Initial Consultation - Insurance, Initial Assessment - Self-Pay, Virtual Follow-Up, In-Person Follow Up, Family Nutrition Group Live Class, Healthy Eating Webinar and Team Meeting. Screen 4 of this prototype already offers four types with their own lengths and contact types, and screen 12 gates on the same four. Listing the board's eight in Preferences would have contradicted the two screens a provider books from.

The table carries the prototype's four, Individual session 50, Couple session 60, Family session 60 and Discovery call 15, with their contact types taken from screen 4 unchanged, plus two the board adds that nothing else in the set contradicts: a group class with a waitlist, and a non-bookable internal type. Every distinguishing case the board drew is still on the table.

Contact type wins over the board's Modalities variant screens 22 to 27

The board carries the same page twice, once labelled Contact Types with Healthcare Video Call, and once labelled Modalities with Supported Modalities. The rest of this prototype says contact types, and says Video call, Phone call and In person: screens 4, 7, 11 and 12 all use those words. Preferences uses them too. The board's alternate wording is recorded here rather than built, because two words for one thing across thirty screens is a worse outcome than either word.

The session caps read 6 a day and 25 a week, not the board's 4 and 20 screens 22 and 25

The board's Modalities frame writes Max Sessions Per Day 4 and Max Sessions Per Week 20. Screen 11's schedule panel and screen 16's capacity step both already read 6 and 25, and screen 18 states 25 sessions in its summary, and the three invented Performance ranges were cut to sit at or under 25. Preferences reads 6 and 25, so a provider sees the same two numbers wherever they appear.

The buffer reads 10 minutes, not the board's 15 screens 22 and 24

The board writes "15 minutes between appointments". Screen 11 reads "6 a day, 25 a week, 10 min buffer" and every session type on screen 4 says "plus a 10 minute buffer after". Ten minutes wins for the same reason as the caps.

The caps are typed and validated, not stated and locked screen 25

The board draws the caps as a stepper. This prototype had them padlocked at one point and that was reversed on August 7: a padlock costs a paragraph of apology and prevents nothing a validation model cannot catch. Screen 25 uses the same number fields and the same live status line the capacity step and the schedule panel already carry, so the three places that hold these two numbers behave identically.

The connected calendar states itself on the row screen 29, revised 2026-08-19

The account line, the last-sync wording, the auto-block switch, Sync Now and Disconnect Calendar were all on a panel under the provider list, carried across from the board. The final Figma removes that panel, so the connected row now carries the Connected chip and Disconnect and nothing else. Whether sync and auto-block are dropped or simply not drawn is the one thing this needs your word on.

Connected Calendar carries no single call to action screen 28

A provider picks one of three calendar providers, and nothing on the page says which. Making one of the three Connect buttons the filled one would have been a recommendation nobody made, so all three are the secondary button and the screen carries no primary. Performance already sets the precedent for a screen with none. Screen 29 carries none either, since the final Figma removed Sync Now with the rest of the panel.

Notifications is a channel list plus an event matrix screen 30, board note 374:2848

The board drew three rows saying Enabled, Enabled, Disabled, and asked for the UX to be built out. Two questions have to be answerable on this page: which channels are on at all, and what each channel is used for. So the page is two cards: three channel switches that state their own word, then seven events by channel. The seven are the four the notification bell already carries on screen 5, plus a second reminder, a waitlist match and a weekly summary.

The events are invented beyond the four on screen 5, and the checkbox pattern per event per channel is a proposal rather than something the board specified. If the real product notifies on a different set, this table is a list change rather than a layout change.

The connected provider row carries the chip and the action screen 29, revised 2026-08-19

The board drew a Connected chip on the Google row and a Disconnect Calendar button in a panel below it, and building both would have put the same destructive action on screen twice. With the panel gone the row owns both: the chip states the state and one red outlined Disconnect sits beside it, so the action is still stated exactly once.

Bookings So Far reads ten, which is what the page already lists screens 1 and 5, Epic 1 review blocker, amended

The stat card said 0 while the appointments list two sections below it rendered the week's rows, and the card's own link opened the screen that lists the same ones. A provider reading the top of the dashboard was told the week was empty. The figure was set to 8 in the blocker pass and is now 10, because the two Thursday sessions the calendar always carried were added to the list in the same review. The figure, the list count and the filter summary are all re-derived from the rows. The label and the link are unchanged.

The calendar strip states the published state instead of nudging setup screens 2, 3, 4, 7, 8 and 9, Epic 1 review blocker

Six screens carried a setup nudge saying the weekly hours were not published and clients could not book, over a calendar holding seven booked and held sessions, beside a schedule list with two live schedules. The strip now states what is true: a lede reading Your Weekly Hours Are Live and one sentence saying clients can book the hours you have published. The strip itself stays, with both its actions, because removing it would take screen 2's only call to action with it.

Minor Session left the Preferences table again, and the wizard still offers it screens 26, 11 and 12, reopened 2026-08-19

Preferences held six types and the availability screens offered a seventh, Minor Session, that Preferences did not contain. The review pass added it as a row, so the master list read seven and the schedule panel could honestly say 2 of 7.

The final Figma drops the Minor Session row from that table, and it is built as drawn. The schedule panel on screen 11 and the wizard on screen 12 still offer Minor Session, so the master list is six and two screens offer a seventh it does not hold. That is the gap the review closed, reopened by the final frame, and it needs your word: either Minor Session returns to the table or it comes off screens 11 and 12.

Two things follow from a table of seven. Team meeting is drawn as not bookable, which the drawer had no way to say, so Who Can Book This Type carries a third choice, Not bookable. And the schedule panel showed Individual session with the contact types that schedule set rather than the ones Preferences sets; that was on the review list in its own right and has since been unified onto the Preferences set on screens 10, 11 and 19.

Couple session is sixty minutes everywhere screens 10, 11, 12, 18 and 19, Epic 1 review blocker

Preferences said 60 minutes on video or phone; the availability screens said 50 minutes on video or in person, for the same type. Preferences is the master, so every availability surface now reads 60 min, video call, phone call.

The calendar's bookable band is the published nine to five screens 2, 3 and 4, Epic 1 review blocker

The grid opened at 8:30 am and took an hour out at noon that no schedule mentions. It is now one continuous band, 9:00 am to 5:00 pm, on every weekday column and in every view the script draws, which is what My Availability publishes. The Available Slots figures were left alone; they never derived from either window and they are on the review list in their own right.

A record drawer is filled from the row that opened it screens 11 and 27, Epic 1 review blockers

Two drawers opened one fixed record however you reached them. Thirty-two pencils and twenty-one table rows across screens 26, 27, 31, 11 and 12 all opened the discovery call, and seven Edit routes across screens 10, 11 and 19 all opened Weekday hours, with the Weekday card marked current on the list behind them even when Short-notice was the card clicked.

Every route now names its record in the query string and a small script writes it into the drawer. On screen 27 that is the name, description, length, contact types, referral types, languages, who can book, the group joined after booking and the two switches, from a map of all seven types that reads the Preferences table row for row. On screen 11 it is the title, the session types ticked, the day switches, the hours in each day's fields, the available-days count behind the cap validation and the preview, from a map of the three schedules; the marker moves to the card that was clicked. A drawer reached with nothing named keeps the record the board drew, the discovery call and Weekday hours, so the screens still open as the board frames read.

Spring hours breaks for lunch on Monday, and the panel holds one range per day, so a second range row is built beside the first for that day only, with its own labels. The twelve routes on screens 27 and 31 sit behind those screens' own full-viewport scrim, so they carry the right record but cannot be clicked while the drawer is open. The scrim was on the review list separately, and the left rail now sits above it.

An authorization is one date, on every surface screen 4, Epic 1 review major

Screen 4 read the same client's authorization as a window, Feb 3 to Jun 30, 2025, while the session drawer on screens 1, 2, 5 and 6 read it as a single date, February 24, 2025, for the same case. One of the two had to go, and the single date is the one seven screens already carry, so the booking drawer now reads Authorization date and the client's own date, and its seven-client map holds single dates too.

The wider question is which the platform actually holds. If UCMS authorizes a window, the drawer takes back a from and a to on every surface at once, which is one field on seven screens. Only the label and the value on screen 4 were touched here; the spelling of the word elsewhere on that screen is on the review list in its own right.

An authorization date belongs to a case, not to a client screens 1, 5 and 6, Epic 1 review major

Two past sessions opened a drawer stating an authorization dated after the session it described: Reed Wasson on Friday, February 28 with an authorization of March 3, and Tiffanee Richter on Wednesday, February 19 with one of March 5. Both clients appear twice in the list under two different case numbers, and the later case's date had been stamped on the earlier session.

Each row now carries the date belonging to its own case: February 21 for case 1179610 and February 12 for case 1179402, both before the session they authorize. Every dated row in the set was re-checked the same way and no other row fails. Nothing about the current cases moved.

The appointments list carries the whole week, so it reads ten screens 1, 5 and 6, Epic 1 review major

The calendar carried two Thursday March 20 sessions, Marcus Bell on hold and Priya Raman confirmed, and both were named again in the time-off clash warnings on screens 3 and 17. Neither was on any appointments list. A confirmed session two days out appeared on three surfaces and on no list a provider would look at first.

Both are now rows in the Upcoming group in date order, carrying the same data attributes as their calendar cards, so the drawer fills identically from either surface. Three figures follow from the list rather than being written beside it: the list count, the filter summary and the Bookings So Far stat all read ten. The hold takes the same orange chip the calendar gives a hold, and On Hold joins the status filter so the new row can be filtered like every other.

The overlap warning names every schedule it is about screens 18 and 19, Epic 1 review major

The warning's heading said two live schedules and its sentence named one. Weekday hours (Mon to Fri) is live, is overlapped in full, and was never mentioned. The sentence also said Spring hours takes the rest, which cannot be true on Friday: Spring hours ends at 1:00 pm that day and never reaches the 3:00 to 5:00 pm window.

The heading now names both live schedules on step 5 and all three on the published screen, and the sentence states only what is true and why: Short-notice hours keeps Mon, Wed and Fri, 3:00 pm to 5:00 pm, because the narrower schedule wins. That is the same precedence rule the index proposes and the warning on screen 10 already follows.

The Performance chart plots case types, and now says so screens 20 and 21, Epic 1 review major, settled 2026-08-19

The chart was headed Appointment Types and plotted Mental Health Assessment, Behavioral Health, Therapy Session, Follow-up and Initial Consultation. Three of those are Case type values from the session drawer, and none of the five is a session type. Either the heading was wrong or the data was. The review pass changed the data to match the heading; the final Figma changes the heading to match the data.

The chart is headed Case Types and carries the five case values again. The counts are untouched, so every arithmetic identity the chart holds still holds: the five bars sum to that range's total sessions in all four ranges, 23, 112, 315 and 1290, and the top bar stays the largest.

A type's contact set is the Preferences set, on every schedule that includes it screens 10, 11 and 19, Epic 1 review major

Individual session read three different contact sets across the three schedule cards on one screen, and none of the three matched Preferences. The schedule panel states directly that these are set in Preferences and shared by every schedule, so a card that drops phone call contradicts the sentence under the picker.

Every card and every picker row now reads the Preferences set: Individual session 50 min on video call, phone call and in person; Couple session 60 min on video call and phone call; Family session 60 min on video call and in person. What a schedule chooses is which types it includes, not what a type is.

The April sample week books inside the windows the set publishes screens 7, 8 and 9, Epic 1 review major

The week grid put a session on Sunday April 20, when every schedule in the set is a weekday one and both Saturday and Sunday read Unavailable on screens 11 and 18. Two more Family sessions sat on Wednesday morning and on Thursday, against screen 4's own statement that Family is bookable Mon and Wed, 1:00 pm to 5:00 pm.

All three moved into Monday and Wednesday afternoons: the no-show to Mon 3:00 pm, the rescheduled session to Wed 3:00 pm and the third to Wed 4:00 pm, with the two afternoon rows on those two columns washed as bookable so the window the sessions sit in is drawn as well as stated. Weekday arithmetic was re-checked on every cell moved: April 21 2025 is a Monday and April 23 a Wednesday. No session overlaps another, and the held intake block is where it was.

Wizard step 1 ships with the two types step 5 recaps screen 12, Epic 1 review major

Step 1 shipped with nothing ticked and Continue disabled, to demonstrate the gate the board draws. Step 5 then recapped two chosen types, and the schedule list called Spring hours a two-session-type schedule. The walkthrough showed a provider a wizard whose first step contradicted its last.

Step 1 now opens with Individual session and Couple session ticked and Continue enabled, which is the state the rest of the wizard describes. The gate itself is untouched and still live: clearing both boxes disables Continue again and turns the line under the grid into the board's error, so the rule can still be seen working on the screen it is drawn on.

The left rail stays clickable behind a drawer, but not behind a modal ten screens, Epic 1 review major

On ten screens a real click on Performance in the rail did not reach Performance. On eight of them a full-viewport scrim anchor sat over the rail and swallowed the press, so a rail click became a drawer dismissal and landed on the parent screen instead. The record claimed the four scheduler destinations worked from every one of the thirty-one.

The rail now sits above the scrims and the drawers in the stacking order, and below the modal layer. Section navigation is not part of what a side drawer is cancelling, so it stays reachable while one is open. A modal is different, because everything behind it is deliberately inert, so screens 8 and 9 keep their rail unreachable and the record now says so.

That is the wide layout only. Below 900 the rail is a bar across the top of the flow rather than a column beside the page, and an overlay there covers the whole viewport, so the bar gives the stacking order back and the drawer keeps its own header and close control on top. Both states were driven at 1440 and at 760.

A modal's success face takes focus screens 1, 2, 5, 6, 8 and 9, Epic 1 review major

Confirming a reschedule, a cancellation or a no-show swaps the dialog to its success face, which replaces everything on screen including the button that was pressed. Focus fell to the document body. The Tab ring still held, so one Tab landed back inside the dialog, but a keyboard or screen-reader user was left with no place and nothing announced.

Focus now moves to the success heading, which is the thing that says what happened. The heading takes a negative tabindex so it can be focused without joining the Tab ring, and it is done once in the shared focus file rather than per screen, so every dialog in the set behaves the same way. Escape, the ring and the return-to-trigger behaviour are unchanged.

The five inert week cards are spans, and are on the list screens 7, 8 and 9, Epic 1 review major

Five of the six session cards on the week grid were anchors pointing at a hash, so they took focus, showed a hover ring and did nothing. Wiring them to a record would have been the wrong fix twice over: they would all have opened the one session the page is built around, which is the antipattern this review already removed from two other drawers.

They are spans now, with the same card drawing and no hover ring, and they are named in Controls That Do Nothing. The sixth card, the session the page is open on, stays a real link and keeps its current marker. The same five carry on screens 8 and 9, which are the same built state behind a modal, so all three were changed together.

An attendance action changes the row it was taken on screens 1, 5 and 6, Epic 1 review major

Marking a session attended raised a snackbar and left the row reading Confirmed. The no-show path raised nothing at all after Done, and left the row reading Confirmed too. The chip is the surface a provider reads next, and it contradicted the action just taken.

Both paths now write the row they were taken on: the chip and the status the filter reads become Attended or No-show, on the row the panel is open on. The no-show path acknowledges on Done, once the modal has shown what the action did, so the two paths confirm the same way. Nothing is stored, as with every other control in the set.

Sample session lengths stay snapped to the half-hour grid screens 1 to 9, Epic 1 review

The declared lengths are 15, 45, 50 and 60 minutes; the calendar draws half-hour rows, so most sample sessions are drawn as 30 or 60 minute blocks and few match the length their own type declares. Redrawing the grid to five-minute rows to fit a 50-minute session would change every calendar in the set for sample data nobody asked to review. The blocks stay as drawn and the numbers that are read as facts were corrected instead: the booking drawer on screen 4 states each type's real length and its end time follows it. Say the word and the grid becomes a fifteen or five minute lattice in one pass.

Case numbers run in date order, April included screens 4, 7, 8 and 9, Epic 1 review minor

The April 21 session carried 1180476, which sits between two March 17 numbers, while the record says the series keeps running in date order. It is 1182046 now, above every March number in the set, which is where a session twenty-four days later belongs. No other session carries that number.

A no-show tally has an event behind it, and reads as one or many screens 1, 2, 5, 6 and 7, Epic 1 review minor

Tiffanee Richter carried one previous no-show on every surface that names her, and no no-show for her exists anywhere in the sample. Her tally is 0, which is what the other clients with nothing behind them read. Vance Pearl keeps his 1, because the March 3 no-show on the appointments list is the event it counts.

The line the panel writes was always plural, so a client with one carried 1 previous no-shows. It is singular at one and plural everywhere else, in the shared panel file and in the copy screen 2 keeps of it.

One time-off entry, written one way and counted accurately screens 3 and 17, Epic 1 review minor

The same Thursday entry read as two chips on the calendar and three on the wizard step. The wizard's fuller form is the master: the clock in twelve-hour time, the published hours it overlaps named as an overlap, and whether it repeats. The calendar chip now says the same three things.

Both screens headed the clash warning Two booked sessions fall inside this time off, and one of the two is on hold rather than booked. The heading names both states, and the two rows underneath already said which was which.

One legend and one week-range format across every calendar screens 2, 3, 4, 7, 8 and 9, Epic 1 review minor

The Overview calendar and the April week grid each carried their own legend, and the two named the same states differently: Booked against Booked session, Session on hold against On hold. The fuller pair wins on both. The keys themselves still differ where the states differ, because No-show only happens in the April week and time off only appears on the Overview grid.

The two week ranges read Week of Mar 16 - 22, 2025 and April 20 to 26, 2025. Both are Week of, both use to, and the script that rewrites the range as you step weeks writes the same form.

US spelling, and one hyphenation for the no-show status screens 1, 4, 5, 6 and 9, Epic 1 review minor

Authorised on the booking drawer was the last British spelling in the set; Couples Counselling was the last in the sample data, on fifteen client rows. Both are US now. Counselor was already US and is unchanged, and Behavioral Health on Performance is a case type from the board.

The status filter and the status badge read No Show while the drawer action, the modal title and the notification all read No-show. The hyphenated form is the one the product uses everywhere else, so the filter and the badge follow it.

Preferences says what its own editors set screens 22 to 25, Epic 1 review minor

Three things on the Appointments summary disagreed with the drawers that write them. The timing row was headed Minimum time in advance while its editor calls the field Minimum days in advance; the editor's label wins. The Session Caps summary listed the two caps and not the consecutive-session limit its editor ships On; that row is on the summary now. The default calendar view said 8:00 am to 9:00 pm while every grid in the set runs 8:00 am to 6:00 pm; the preference and its editor both say 6:00 pm.

Judgement call on the consecutive-session limit: the switch on wizard step 3 stays Off. That one is per schedule, set while a schedule is being built, and Preferences holds the account-wide default. A schedule that does not use the limit is not a contradiction of a default that does, so the two are left to differ and the scoping is recorded here instead.

Available Slots This Week is derived, and is the same figure on every screen that draws it screens 1, 5, 10, 11 and 19, Epic 1 review minor

Judgement call. The figure read 18 on four screens and 26 on the published screen, and neither could be derived from any window the set publishes. Publishing Spring hours cannot raise it either: Spring sits inside the already-published weekday window and, under the precedence rule this set states, takes hours from it rather than adding any.

It is 33 everywhere now, derived from what the screens actually say. The published band is Weekdays 9:00 am to 5:00 pm, which is eight hours; Preferences puts a ten-minute buffer between sessions and the Individual session runs fifty minutes, so a slot is an hour and a weekday holds eight. Five weekdays give forty. The shipped week takes seven of them: two on Monday, two on Wednesday, two on Thursday, where the noon time off covers both sessions inside it, and one on Friday. Forty less seven is thirty-three.

Total Hours becomes Hours Delivered, with a definition screens 20 and 21, Epic 1 review minor

Judgement call. The tile read 234 in all four date ranges, which is 2.09 hours a session against a set whose longest session type is an hour, and the label said nothing about whether it counted hours offered or hours worked.

It is Hours Delivered now: completed sessions times fifty minutes, rounded to whole hours, recomputed per range. Completed is total sessions less cancellations and no-shows, so a reader can check the tile against the four session figures beside it. The four ranges read 16, 73, 204 and 838. Fifty minutes is the Individual session length in Preferences and the commonest type in every column; a weighted mix across the five types is the production version of the same sum.

Every satisfaction bar is a whole number of responses screens 20 and 21, Epic 1 review minor

Last 7 Days paired 17 responses with a 1 per cent bucket, and the finest thing 17 responses can express is 5.9 per cent. The seven-day spread is rebuilt from real counts: 11 five-star, 5 four-star and 1 three-star, which display as 65, 29 and 6 per cent, add to 100, and give a mean of 4.59 against the 4.6 on the card. The other three ranges were checked the same way and each of them already resolves to whole responses: 59/16/2/1/1 of 79, 163/46/7/2/2 of 220 and 627/218/45/9/9 of 908.

The cancellation notice is dated with the session it names screen 5, Epic 1 review minor

Judgement call. The notification read 1 day ago and described a session on February 28, seventeen days before the day the set is built on, and claimed the slot was back on the calendar. A slot in the past does not come back.

The named facts are kept, because that cancelled session is really in the appointments list: same client, same session type, same date and time. What changed is the age, which now says 17 days ago and matches the session it describes, and the slot-back sentence, which is gone. Inventing a fresh cancellation in the coming week was the other option; it would have meant adding a session to the lists and the calendar to cancel, which moves the counts three other screens read.

Every string in the product UI is 100 characters or fewer all thirty-one screens, Epic 1 review minor

The 100-character rule was applied to screens 10 to 19 when it was set and never swept across the rest. Twenty-two strings on screens 1 to 9 were over, the longest at 191 characters, and one aria-label on screen 18 at 114. All of them are inside the limit now and the sweep runs over the whole set: 0 strings over 100 characters on any of the thirty-one screens, measured in the rendered DOM at 1440 and at 760, attributes included.

The no-show success line was the long one, and it was carrying three facts in one sentence. It is split the way the rule asks: the heading says what happened, the line under it names the session, and one sentence says what follows. Nothing was dropped.

Session type names are Title Case everywhere all thirty-one screens, reversed 2026-08-19

Preferences, which owns the seven types, wrote Individual session. The Home lane and My Availability wrote Individual Session, so the same object was named two ways depending on which screen you were on. The review pass settled on sentence case, because the master list used it.

The final Epic 1 Figma writes Individual Session everywhere, and you confirmed Title Case as one product-wide rule rather than screen by screen. It now runs through the drawer titles, the modal ledes, the appointment rows, the schedule pickers, the Preferences table and the shared panel script. Data values a provider reads rather than picks, such as a contact set or a duration, stay in sentence case.

Time off is the word, in the index and in Preferences index, screen 17, screens 28 and 29, Epic 1 review minor

Screen 17 is called Time Off on its rail step, its heading and its tab title, and Time Blocking in the index and in these notes. It is Time Off in all four now.

The connected-calendar note read Events on a connected calendar block your WPO availability, and crit 244:810 retired block in favour of time off. It reads Events on a connected calendar become time off in WPO.

Nine schedule headings close as headings screens 10, 11 and 19, Epic 1 review minor

Every schedule card's name opened as an h3 and closed as an h4. No h4 exists anywhere in the set, so this was a typo repeated nine times rather than a heading level. All nine close as h3.

The skip link lands on the page all thirty-three pages, Epic 1 review minor

Skip to Main Content is the first Tab stop on every page. Pressing Enter moved the address bar to #main and left focus on the body, because main carried no tabindex, so a keyboard user arrived nowhere. Every main now takes a negative tabindex, which keeps it out of the Tab ring and lets the skip link put focus in it. Driven on a sample across both former shell implementations, the index and this record: activeElement is MAIN every time.

One shell implementation, not two all thirty-one screens, Epic 1 review minor

Six screens wrote the rail-collapse state on the layout container and twenty-five wrote it on the document element. Both read the same stored key and both rendered the same 72px rail, so this was a maintenance trap rather than a live defect: a change to one would have skipped six screens. All thirty-one use the document-element version now, which applies the stored state before first paint so a collapsed rail never flashes open, and mirrors it onto the container for the rules that read it there. Collapse parity was re-driven on both former groups: 72px collapsed, 285px expanded.

The calendar cards on screens 3 and 4 are the buttons screen 2 ships screens 3 and 4, Epic 1 review minor

Screen 2's seven cards are buttons driven by script. The same seven on screens 3 and 4 were anchors, two of them pointing at real screens and five at a hash, all of them under the full-viewport scrim and none of them reachable. The markup contradicted screen 2 and it contradicted this record, which says those cards do not open the drawer there. They are the same buttons now, and still inert on those two screens for the reason already on the list: the add drawer holds the right edge.

A day switch always says which state it is in screen 13, Epic 1 review minor

The seven day switches on the weekly hours step wrote an empty word when a day was on, so turning Sunday on took the row from Sunday Unavailable to Sunday. The eight equivalent switches on the schedule panel wrote Available. Screen 13 writes Available too, at load and on every toggle, so one control does not have two behaviours.

The first breadcrumb is prototype plumbing all thirty-one screens, Epic 1 review minor

Judgement call. The trail opens with Dashboard, which reads as the platform dashboard and lands on the prototype's own screen index. That is deliberate: the platform dashboard is not in Epic 1 scope and is not built, and a crumb that goes nowhere is worse than one that goes to the list of what is built. In production it points at the platform dashboard and nothing else about the trail changes.

The last breadcrumb names the record being edited screens 11, 23, 24, 25, 27 and 31, Epic 1 review minor

Six screens open a record and the trail stopped at the section, so Preferences was the last crumb whether you were editing Contact Types or a session type. There is a fourth crumb now, carrying the current-page marker, and the section above it became a link to the screen the drawer sits on.

On the two screens that fill from a route, the crumb is written by the same file that fills the drawer, so it names the schedule or the session type actually opened. The other four are static, because each of those drawers edits one fixed section: Contact Types, Appointment Timing, Session Caps and New Session Type.

Back from the reschedule modal lands on the one built calendar state screens 7, 8 and 9, Epic 1 review minor

Judgement call. Reaching the reschedule modal from the Overview calendar and pressing Back returns you to screen 7, not to the calendar you came from. Screens 7, 8 and 9 are one built state, Tiffanee Richter's April session, with the drawer, the reschedule modal and the cancel modal drawn over it; the modals do not carry a route back to whichever list or grid opened them. In production the modal closes over the surface that opened it and no navigation happens at all. Kept as it is, and named here rather than papered over with a Back that guesses.

Left For Production

Known and deliberately out of scope for a desktop design review. Recorded so none of them is discovered as a surprise later.

Phone widths, 320 to 414

The set is built for review on a desktop screen and holds together down to about 900. Below roughly 480 the top bar's title, Connect Calendar button, notification bell and user block share one row and crowd. The reflow is a production task, not a review one, and it does not change any decision on this page.

The typeface ships as OTF

HN for TELUS is loaded from the OpenType files as licensed. Converting to woff2 would cut the download substantially and is a build-pipeline task for the real product rather than something to change in a prototype.

Motion preferences and layout transitions

The panels slide and the chevrons rotate on a fixed 150 to 200ms curve, with no prefers-reduced-motion branch, and content that steps aside for an opening panel jumps rather than eases. Both are production polish and neither affects what is being reviewed.

Controls That Do Nothing

Everything on this list is drawn but inert. If a control is not named here, it works.

Shell, on every screen

The user block in the top bar, and the five platform rows in the tree: Dashboard, Application, Provider Bio, Case Management and Administration. Each of those five is a span rather than a link, so none of them is a click into nothing. All four scheduler pages, Overview, My Availability, Performance and Preferences, go to a built screen from every one of the thirty-one, including the ten that ship with a drawer or a panel open. The two exceptions are screens 8 and 9, where a real modal makes everything behind it inert, the rail included, which is what a modal is for. The Connect Calendar button in the My Availability top bar is drawn and inert.

Preferences screens 22 to 31

Save Changes in all five drawers, and the three Connect buttons and Disconnect, which move between screens 28 and 29 without connecting anything. The seven-by-three notification matrix and the three channel switches change on screen and store nothing.

Everything else works: the four settings tabs, Add New Type, which now opens the create drawer on screen 31, every Edit and every row pencil, the row delete with its confirm dialog, which takes the row off the table, the clickable rows, the drawer scrims and close buttons, the switches with the words they write, the pills, the checkboxes, and the live cap validation on screen 25.

My Availability screens 10 to 19

Duplicate and Delete on a schedule card are drawn and inert. The pencil beside a session type is no longer one of them: on screens 11 and 12 it opens that type in the Preferences edit drawer on screen 27, which is where its length, contact types, referral types and languages are set. The Get Help link at the foot of every one of these ten screens is inert, as it is on the dashboard. The Save Changes button on the schedule panel closes the panel and confirms, but nothing is stored. Everything else works: the card chevrons, all three stat links, the day switches, Add Time Slot and its remove buttons, Copy To Other Days and its picker, the session-type cards and the gate on step 1, the three Date and Time tabs, the recurrence and time-off-type choices with the panels they reveal, Add These Hours and its Dates You Have Added list, the calendar day panel with its per-day hours and read-out, the schedule panel's Preview, the pacing switches, Add Time Off and Remove, and the preview day read-out.

Dashboard screens 1 and 5

The welcome card's Set Availability, Connect Calendar and Review Your Session Types; the Announcements titles and the Get Help link. All three stat cards now go somewhere: the third one, Active Days Per Week, reaches the weekly hours editor, which is the same destination the My Availability figure uses.

Calendar screens 3, 4, 7, 8 and 9

The calendar toolbar is live on screen 2 only. On screens 3, 4, 7, 8 and 9 the same toolbar is drawn but static: Today, Day, Week, Month and the two arrows do nothing there, because each of those screens is built around one fixed drawer or modal state and stepping the grid underneath it would leave the panel describing a session that is no longer on screen. The Filter button is the exception: it works everywhere it is drawn. On screens 3 and 4 the session cards are the same buttons screen 2 ships and they still do not open the details drawer, because those two screens already have the add drawer open and only one panel holds the right edge. On screen 2 the session drawer's Reschedule and Cancel actions go to screens 8 and 9, which carry Tiffanee Richter's session whichever card was open.

Week grid screens 7, 8 and 9

Five of the six session cards on the April week grid are drawn but inert. They are spans rather than links, so none of them takes focus or offers a hover ring, and each of the three screens is built around one fixed session that the drawer or the modal is already describing. The sixth card, the open session, is a real link and carries the current marker.

Add drawer screens 3 and 4

On the Time Off tab: Add Time Off, Remove and Save Time Off. On the Session tab: Book Session. The session-type accordion, the duration and end-time readout and the client-timezone equivalence line are all live.

Appointments lists screens 1, 5 and 6

Nothing on these lists is inert any more. Every row opens the session details drawer for its own client, and the Filter button, the four attendance actions, the no-show modal and Schedule New Appointment all work. The one limit is the same one screen 2 has: the drawer's Reschedule and Cancel actions go to screens 8 and 9, which carry Tiffanee Richter's session whichever row was open.

Performance screens 20 and 21

The Get Help link at the foot of the page is inert, as it is everywhere else in the set. Everything else works: all four date ranges rewrite every figure on the page, Show Earnings opens and closes the earnings section, and each of the three information buttons opens and closes its own line. There is no export, no download and no share, because the board draws none.