You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
fix(frontend): first-run empty state says no rows match filters with no next step #756
On first run (no accounts, no recommendations) Opportunities says "No rows match these filters." with no next step, and Home has no onboarding call to action anywhere.
Where
Reviewed commit b50ca38: frontend/src/recommendations.ts:4761-4798 (empty-result rendering; emptyResult is true whenever the rendered list is empty) and :3969-3970 (action bar "(No recommendations loaded)"). An .empty-state style already exists at frontend/src/styles/base.css:174.
Failure scenario
Verified live with accounts [] and recommendations []. Opportunities shows the full 15-column header, "Showing 0 of 0 recommendations ... No rows match these filters. (No recommendations loaded)", a $0 in green, and an apparently enabled blue Purchase button. Home shows -- tiles, "Savings history is not available yet." and "No upcoming scheduled purchases", with no pointer to connect an account.
User impact
Every new customer: they are told to adjust filters when nothing has been loaded, and nothing points to Admin > Accounts or to collection status.
Suggested fix
Branch on loaded count vs filtered count. Zero loaded: an .empty-state card ("No opportunities yet", last/next collection time, "Connect an AWS, Azure or GCP account" linking to Admin > Accounts, or "Refresh recommendations"). Filtered to zero: keep the hint and add "Clear filters". Add a matching onboarding CTA on Home.
Screenshots
In the review fleet archive (/Users/cristi/.claude/agent-comms/review-fleet-20261008/screens/), NOT uploaded: usab-firstrun-opps.png, usab-firstrun-home.png, opportunities-empty-1280.png.
Severity
Medium: misleading first-run experience for all new users, no data impact.
Related: #182 (empty states for Admin Users/Groups/Permission Overview only; different surfaces).
Reviewer ID: UX-10 (usab M3 + vis M1)
Found by the 2026-10-08 review fleet.
Status update (2026-10-28): #1567 merged: GET /api/recommendations/freshness now returns next_collection_at, computed from a RECOMMENDATION_SCHEDULE that every compute module passes to the app (cron and rate() parsed; null when unknown).
Left: showing it on the empty-state card (UI owner). Note: on default AWS deployments the field is null because the default schedule is rate(1 day), which has no fixed time; switching the AWS default to a fixed cron is an owner decision (D32 in the acting-owner report).
Acting-owner decision (D32, IAmJSD, 2026-10-28): the AWS recommendation collection default moves from rate(1 day) to a fixed 02:00 UTC, like GCP and Azure, so the next-collection time can show on AWS. A PR is in progress.
Status (IAmJSD, acting owner, 2026-10-28): #1580 merged. AWS recommendation collection now defaults to 02:00 UTC (D32), so the freshness endpoint returns next_collection_at on AWS too. A test ties every AWS default and tfvars value to the API. The first-run empty-state UI is still open; that part is the UI owner's.
Activity
IAmJSD commentedon Oct 24, 2026
Claiming: working on this
Merge remote-tracking branch 'origin/main' into ui/issue-756
Merge remote-tracking branch 'origin/main' into ui/issue-756
fix(frontend): show a first-run empty state instead of "no rows match" (
feat(api): report the next scheduled collection in recommendations fr…
IAmJSD commentedon Oct 28, 2026
Status update (2026-10-28): #1567 merged:
GET /api/recommendations/freshnessnow returnsnext_collection_at, computed from aRECOMMENDATION_SCHEDULEthat every compute module passes to the app (cron and rate() parsed; null when unknown).Left: showing it on the empty-state card (UI owner). Note: on default AWS deployments the field is null because the default schedule is
rate(1 day), which has no fixed time; switching the AWS default to a fixed cron is an owner decision (D32 in the acting-owner report).IAmJSD commentedon Oct 28, 2026
Acting-owner decision (D32, IAmJSD, 2026-10-28): the AWS recommendation collection default moves from rate(1 day) to a fixed 02:00 UTC, like GCP and Azure, so the next-collection time can show on AWS. A PR is in progress.
test(iac): give the schedule-default test its own default regex
fix(iac): fire delayed purchases by default; collect AWS recommendati…
IAmJSD commentedon Oct 28, 2026
Status (IAmJSD, acting owner, 2026-10-28): #1580 merged. AWS recommendation collection now defaults to 02:00 UTC (D32), so the freshness endpoint returns
next_collection_aton AWS too. A test ties every AWS default and tfvars value to the API. The first-run empty-state UI is still open; that part is the UI owner's.