Skip to main content

Phase 1 UI Gap Analysis

Date: 2026-04-24 Scope: hmp-web-dashboard routes under src/app/(dashboard)/ Method: Presence of sibling keynova.tsx next to page.tsx ⇒ migrated; otherwise legacy Ink & Brass + shadcn.

Executive summary​

  • 19 / 166 dashboard routes carry the KeyNova variant today (11.4%).
  • Across the 10 Phase 1 business flows, migration is hub-first: most flow landing pages are on KeyNova, but drill-ins and settings still fall back to Ink & Brass, creating visible theme whiplash.
  • All 10 flows are functionally GREEN at the backend + API level (flow-tests 100/101 green, 389/404 total).
  • UI-only launch blockers are 5 pages (see below). They don't break functionality, but they break brand cohesion where hotel staff spend the most time.

Coverage by flow​

#FlowMigratedTotalRatioLegacy routes still on Ink & Brass
F1Tenant Onboarding00—handled in admin portal, not dashboard
F2Property Onboarding51145%/settings/property, /settings/room-types, /settings/brands, /settings/rate-restrictions, /settings/seasons
F3Booking Engine (admin view)1250%/rates/restrictions
F4Reservations3650%/reservations/groups, /reservations/groups/[id], /reservations/groups/new
F5Front Desk4944%/front-desk (root), /front-desk/departures, /front-desk/in-house, /front-desk/folio/[id], /front-desk/key-cards
F6Check-in11100% ✓—
F7Housekeeping1617%/housekeeping/tasks, /housekeeping/inventory*, /housekeeping/maintenance, /housekeeping/lost-found, /housekeeping/kpis
F8POS & Folio2729%/pos (root), /pos/menu, /pos/kitchen, /pos/hardware, /pos/tables, /pos/reports
F9Check-out11100% ✓—
F10Night Audit & Reports2729%/reports/[category]*, /reports/bi, /reports/predictive, /reports/competitor-intelligence, /reports/vishramgruh

Phase 1 UI-only launch blockers (5)​

These aren't functionality bugs — the flows work — but hotel staff touch these pages multiple times per shift, so the theme break is customer-visible.

  1. /front-desk (root) — room grid + tab shell. Uses HeaderZone (KeyNova) but legacy tab/content logic below the fold. Everyone's landing page.
  2. /front-desk/folio/[id] — legacy; on the hot path for F9 Check-out.
  3. /pos (root) — pos/outlets and pos/orders migrated but landing page is legacy, so F8 entry point looks like a different app.
  4. /reservations/groups/* (create, list, detail) — F4 group bookings still Ink & Brass.
  5. /settings/property — first screen of F2; base property configuration is still legacy.

Supporting pages (Phase 2 acceptable)​

All of these are low-traffic admin/ops screens and can stay legacy for the Phase 1 launch without blocking a hotel from going live:

  • Housekeeping inventory / lost-and-found / KPI dashboards
  • POS menu / kitchen / hardware / tables / reports
  • Reports category drill-ins, BI, predictive, competitor intel
  • CRM campaigns, loyalty, feedback (except guest profile list)
  • Channel manager setup & sync-logs
  • Control center ops dashboards (labor, revenue, today)
  • Marketing, revenue-manager, chain-level screens
  • Integrations / domains / API / payment providers settings

UI bugs fixed this session (5 + 1)​

IDPageProblemFix
UI-TEST-1/front-desk/check-in/[id]Folio Balance column double-counted subtotalPer-line running balance recalculated from line amounts; taxTotal filtered from category === 'tax'
UI-TEST-2Tape chart detail panelFolio / Notes / Activity tabs showed "Coming in Phase 2"Wired to getFolios, useReservationNotes, and timelineEvents; tabs show top-N with "view all" links
UI-TEST-3Front-desk room gridMove / Swap / Upgrade links pointed at /reservations/[id]Redirected to /front-desk/calendar?res=<id>&action=room-move
UI-TEST-4Add Charge → folio404 when folio-id was actually a reservation-id/front-desk/folio/[id] now retries via getFolios(id) on 404 and resolves to primary folio
UI-TEST-5Housekeeping room tile"Validation Failed" toasters on room clickGateway routing fix: PATCH /rooms/:id/status now routes to property-service (owner of Room), which accepts the triple-status DTO; housekeeping-service only accepts {status}
UI-TEST-9/reservations/[id]"Reservation not found or you do not have access" after creating a reservation and clicking confirmation #reservationApi.get(id) skips X-Property-ID header (new skipPropertyHeader opt-out on axios client); backend still enforces tenant isolation via property relation
  1. Before public launch (UI-only, functional already green):
    • Migrate the 5 blockers above to keynova.tsx using the established AppHeader + FilterChipBar + light-ivory zone pattern.
    • Land E2E Playwright specs per flow (pending UI-TEST-7) so regressions are caught automatically.
  2. Phase 1.5 / Phase 2:
    • Bulk-migrate the supporting pages wave-by-wave per the SP-7 UI adoption plan (hmp-docs/docs/platform-registry/sp-7-ui-adoption-kickoff.md).
    • Consolidate property onboarding (/settings/property, /settings/room-types, /settings/rate-plans, /settings/property-taxes) into a single KeyNova wizard.

Measurement: how we'll track closure​

  • Every migration closes a drift-dashboard "UI legacy" entry (SP-4).
  • Each UI-TEST-# ID above maps to a screen entry in the KeyNova registry (hmp-docs/docs/platform-registry/screens.yaml) once UI-TEST-7 E2E specs are attached.
  • Target: reach 60% migration (100/166) before production launch; 100% within 90 days post-launch.