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
| # | Flow | Migrated | Total | Ratio | Legacy routes still on Ink & Brass |
|---|---|---|---|---|---|
| F1 | Tenant Onboarding | 0 | 0 | — | handled in admin portal, not dashboard |
| F2 | Property Onboarding | 5 | 11 | 45% | /settings/property, /settings/room-types, /settings/brands, /settings/rate-restrictions, /settings/seasons |
| F3 | Booking Engine (admin view) | 1 | 2 | 50% | /rates/restrictions |
| F4 | Reservations | 3 | 6 | 50% | /reservations/groups, /reservations/groups/[id], /reservations/groups/new |
| F5 | Front Desk | 4 | 9 | 44% | /front-desk (root), /front-desk/departures, /front-desk/in-house, /front-desk/folio/[id], /front-desk/key-cards |
| F6 | Check-in | 1 | 1 | 100% ✓ | — |
| F7 | Housekeeping | 1 | 6 | 17% | /housekeeping/tasks, /housekeeping/inventory*, /housekeeping/maintenance, /housekeeping/lost-found, /housekeeping/kpis |
| F8 | POS & Folio | 2 | 7 | 29% | /pos (root), /pos/menu, /pos/kitchen, /pos/hardware, /pos/tables, /pos/reports |
| F9 | Check-out | 1 | 1 | 100% ✓ | — |
| F10 | Night Audit & Reports | 2 | 7 | 29% | /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.
/front-desk(root) — room grid + tab shell. UsesHeaderZone(KeyNova) but legacy tab/content logic below the fold. Everyone's landing page./front-desk/folio/[id]— legacy; on the hot path for F9 Check-out./pos(root) —pos/outletsandpos/ordersmigrated but landing page is legacy, so F8 entry point looks like a different app./reservations/groups/*(create, list, detail) — F4 group bookings still Ink & Brass./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)
| ID | Page | Problem | Fix |
|---|---|---|---|
| UI-TEST-1 | /front-desk/check-in/[id] | Folio Balance column double-counted subtotal | Per-line running balance recalculated from line amounts; taxTotal filtered from category === 'tax' |
| UI-TEST-2 | Tape chart detail panel | Folio / Notes / Activity tabs showed "Coming in Phase 2" | Wired to getFolios, useReservationNotes, and timelineEvents; tabs show top-N with "view all" links |
| UI-TEST-3 | Front-desk room grid | Move / Swap / Upgrade links pointed at /reservations/[id] | Redirected to /front-desk/calendar?res=<id>&action=room-move |
| UI-TEST-4 | Add Charge → folio | 404 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-5 | Housekeeping room tile | "Validation Failed" toasters on room click | Gateway 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 |
Recommended next actions
- Before public launch (UI-only, functional already green):
- Migrate the 5 blockers above to
keynova.tsxusing the establishedAppHeader+FilterChipBar+ light-ivory zone pattern. - Land E2E Playwright specs per flow (pending UI-TEST-7) so regressions are caught automatically.
- Migrate the 5 blockers above to
- 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.
- Bulk-migrate the supporting pages wave-by-wave per the SP-7 UI adoption plan (
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.