Screen / route: /calendar/agenda — audited 2026-09-11 at 1440×900 and 375×812
Checklist failed: 2 (empty state names a next action) and 5 (no dead ends)
Problem
The user opens Agenda to see what’s next or to get a calendar connected. When no account is enabled, the screen is a dead end.
Live CDP:
- Fold actions: Agenda/Day/Week/Month/Lifetime tabs and a disabled Sync (y=131 desktop, y=161 mobile). No “Connect” / “Add account” control.
- Empty copy in
client/src/components/calendar/AgendaTab.jsx:130-134: “No upcoming events” / “Sync your calendar accounts to see events here”.
- The Sync button (
AgendaTab.jsx:115-118) is disabled={syncing || accounts.filter(a => a.enabled).length === 0} — so when the copy tells you to sync, Sync cannot be pressed.
- Setup (
/capabilities) reports Calendar as “Not set up / No Calendar accounts connected”, but Agenda does not send the user to /calendar/sync.
Calendar.jsx:63-78 already has a Sync tab (SyncTab.jsx) that is the place to add/enable accounts. Agenda never points there.
Impact
A first-run (or disconnected) user lands on the default Calendar tab, reads “sync your accounts”, and finds the only action disabled. There is no path forward without already knowing the Sync sub-tab exists. Recurring: every session until an account is connected.
Fix
Decision: branch the empty state on whether any enabled account exists. Do not invent in-Agenda OAuth — SyncTab already owns that.
When accounts.filter(a => a.enabled).length === 0:
- Render the shared
EmptyState (client/src/components/EmptyState.jsx) with title “No calendar connected”, message that events appear after an account is connected, actionTo="/calendar/sync", actionLabel="Connect a calendar".
- Hide or keep Sync disabled, but do not tell the user to click it.
When accounts exist but the event list is empty:
- Keep Sync enabled as the in-page action (
onAction={handleSync}), message “Sync now to pull upcoming events”.
Files: client/src/components/calendar/AgendaTab.jsx (primary), add AgendaTab.test.jsx. Optionally reuse the same empty copy on Day/Week/Month if they currently show a blank grid with no CTA — check DayView.jsx / WeekView.jsx / MonthView.jsx and match if they share the no-accounts case.
model:light — one empty-state branch and a link that already exists. effort:low — the enabled-accounts predicate is already on the Sync button.
Scope: small
Acceptance criteria
Screen / route:
/calendar/agenda— audited 2026-09-11 at 1440×900 and 375×812Checklist failed: 2 (empty state names a next action) and 5 (no dead ends)
Problem
The user opens Agenda to see what’s next or to get a calendar connected. When no account is enabled, the screen is a dead end.
Live CDP:
client/src/components/calendar/AgendaTab.jsx:130-134: “No upcoming events” / “Sync your calendar accounts to see events here”.AgendaTab.jsx:115-118) isdisabled={syncing || accounts.filter(a => a.enabled).length === 0}— so when the copy tells you to sync, Sync cannot be pressed./capabilities) reports Calendar as “Not set up / No Calendar accounts connected”, but Agenda does not send the user to/calendar/sync.Calendar.jsx:63-78already has a Sync tab (SyncTab.jsx) that is the place to add/enable accounts. Agenda never points there.Impact
A first-run (or disconnected) user lands on the default Calendar tab, reads “sync your accounts”, and finds the only action disabled. There is no path forward without already knowing the Sync sub-tab exists. Recurring: every session until an account is connected.
Fix
Decision: branch the empty state on whether any enabled account exists. Do not invent in-Agenda OAuth — SyncTab already owns that.
When
accounts.filter(a => a.enabled).length === 0:EmptyState(client/src/components/EmptyState.jsx) with title “No calendar connected”, message that events appear after an account is connected,actionTo="/calendar/sync",actionLabel="Connect a calendar".When accounts exist but the event list is empty:
onAction={handleSync}), message “Sync now to pull upcoming events”.Files:
client/src/components/calendar/AgendaTab.jsx(primary), addAgendaTab.test.jsx. Optionally reuse the same empty copy on Day/Week/Month if they currently show a blank grid with no CTA — checkDayView.jsx/WeekView.jsx/MonthView.jsxand match if they share the no-accounts case.model:light— one empty-state branch and a link that already exists.effort:low— the enabled-accounts predicate is already on the Sync button.Scope: small
Acceptance criteria
/calendar/agendashows EmptyState with a working “Connect a calendar” control that navigates to/calendar/sync.