# Navi Button Action Registry

Audit date: 2026-05-05
Rule: no visible action may remain fake. Every action must navigate to a real screen, call a real API, open a real native action, be hidden behind a feature flag, or be disabled with a real reason.

Status meanings:

- Connected: action is wired to a route, API, native action, or local state transition.
- Partial: action exists but has incomplete backend, missing target route, missing success/error state, or is only locally filtered.
- Missing: action expected by the PDF or product docs but does not exist.
- Risk: action exists but is not production-ready.

## Phase One Database And Dashboard Reflection Registry

This section adds the Phase One council fields required for implementation planning. It focuses on the actions that create, update, delete, route to, or expose operational data. Detailed per-screen action rows continue below.

| Screen | Action label | User role | Expected behavior | Route target | API endpoint | Database effect | Dashboard reflection | Success state | Loading state | Error state | Empty state | Current status | Fix required |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Splash | Auto route | Guest/Auth | Route to onboarding, login, or home after hydration | Onboarding/Login/Home | Local session; optional `/v1/users/me` | Reads `Session`/user state | None | Correct landing route | Initializing label | Error boundary | N/A | Connected | Add PDF-style splash polish |
| Onboarding | Skip/Next/Get Started | Guest | Move through onboarding or enter login/home | Onboarding steps/Login/Home | Future `/v1/onboarding` | Should read `OnboardingPage`; today local copy | Future Onboarding Content | Next screen opens | N/A | Error boundary | N/A | Partial | Add CMS API/dashboard; keep buttons real |
| Login | Sign In | Guest | Authenticate and create session | Home | `POST /v1/auth/login` | Creates `Session`, writes `AuditLog` | Audit Logs; future user sessions | Home with user session | Button spinner | Inline/API error | N/A | Connected | Add auth/me alias and device metadata |
| Login | Google/Apple | Guest | Social login/signup | Missing/provider callback | Missing social endpoints | Should create `User`, `UserCredential`, `Session` | Users/Audit Logs | Session | Provider loading | Provider error | N/A | Missing | Hide behind feature flag or implement providers |
| Signup | Create Account | Guest | Register pending user and route OTP | OTP | `POST /v1/auth/signup` | Creates `User`, `UserCredential`, `OtpCode`; later `Session` | Users | OTP screen | Button spinner | Validation/API error | N/A | Partial | Add `Profile`, confirm password, register alias, legal links |
| Forgot Password | Send code | Guest | Send reset OTP and route OTP | OTP reset | `POST /v1/auth/forgot-password` | Creates `OtpCode` | Audit Logs optional | OTP screen | Button spinner | Inline/API error | N/A | Connected | Add cooldown UX |
| OTP | Verify | Guest | Verify signup/reset OTP | Home or Reset Password | `POST /v1/auth/otp/verify` | Updates `User` verification; creates `Session` for signup | Users/Audit Logs | Home/reset route | Button spinner | Verification error | N/A | Connected | Add resend timer and stricter attempt limits |
| Reset Password | Save password | Guest | Replace password after OTP | Login | `POST /v1/auth/reset-password` | Updates `UserCredential`, revokes sessions later | Audit Logs | Login screen | Button spinner | Inline/API error | N/A | Partial | Add confirm password and session revocation policy |
| Home | Search | Guest/Tourist | Open discovery/search | Discover | Future `/v1/search` | Reads `Listing`, `Destination`, `Category` | Search analytics later | Discover opens | N/A | Error boundary | No results later | Partial | Add backend search and focus query |
| Home | Service tile | Guest/Tourist | Open service screen or emergency | Service/Emergency route | Service-specific APIs | Reads listings; transactional services should create `Booking`/`Order` later | Provider/Admin service ops | Service screen | Screen loading | State error | Empty catalog | Partial | Add real taxi/order flows before demoing as transactional |
| Home | Offer/banner CTA | Guest/Tourist | Open offer/stays/listing | Service/listing route | Future `/v1/banners`, `/v1/home` | Should read `Banner`/`ContentAsset`; today static/catalog | Home Banners | Target opens | N/A | Error boundary | N/A | Partial | Add banner model/API/dashboard |
| Discover | Heart save | Tourist | Save or unsave item | Same screen/login for guest | `POST /v1/saved`, `DELETE /v1/saved/:type/:id` | Creates/deletes `SavedItem` | Future saved analytics/user detail | Heart state changes | Mutation pending | Visible API error needed | No saved state | Partial | Add optimistic loading, error state, analytics |
| Discover | Listing card | Guest/Tourist | Open listing detail | `/listing/[id]` | `GET /v1/listings/:id` | Reads `Listing`, `Room` | Listings | Detail opens | Detail loading | Not found/error | Empty listing | Connected | None |
| Discover | Destination card | Guest/Tourist | Open destination detail | Missing detail route | Existing `/v1/destinations/:slug` | Reads `Destination` | Destinations | Detail should open | Loading | Not found/error | No destination | Partial | Add destination detail route |
| Listing Detail | Save | Tourist | Save/unsave listing | Same screen/login | Saved APIs | Creates/deletes `SavedItem` | Future saved analytics | Saved state | Button/mutation loading needed | API error visible | N/A | Partial | Add visible mutation state and unsave consistency |
| Listing Detail | Share | Guest/Tourist | Open native share | Native sheet | None | No DB effect | None | Share sheet opens | Native loading | Native failure fallback needed | N/A | Connected | Add fallback error |
| Listing Detail | Select Room/Book | Tourist | Select room or create booking | `/rooms/[listingId]` or bookings | `POST /v1/bookings`; missing quote | Creates `Booking`; payment later | Bookings; provider bookings | Room route or booking created | Button spinner | API/validation error | No rooms | Partial | Add quote/date/payment review and provider reflection |
| Select Room | Select room | Tourist | Choose room and create booking after review | Bookings | Current booking create; missing quote | Creates `Booking` but lacks quote/payment details | Bookings; future room availability | Booking created | Button spinner | API/availability error | No rooms | Partial | Add `/v1/bookings/quote`, date/guest filters, availability |
| Bookings | Booking card | Tourist | Open booking detail | Booking detail missing/partial | `GET /v1/bookings/:id` | Reads `Booking` | Bookings | Detail opens | Loading | Error | Empty bookings | Partial | Add booking detail route and cancel/pay actions |
| Emergency | Call Now | Guest/Tourist | Open native dialer | Native `tel:` | None | No DB effect unless location/share used | None | Dialer opens | N/A | Native fallback needed | N/A | Connected | Add device QA and fallback |
| Emergency | Share location | Guest/Tourist | Request location and send safety log | Missing | Missing `/v1/emergency/location-share` | Should create emergency support/audit record | Emergency support logs | Location shared | Permission/API loading | Permission/API error | N/A | Missing | Add privacy-safe location share and support dashboard |
| Profile | Logout | Tourist | Revoke session and clear mobile state | Splash/Login | Missing `/v1/auth/logout` | Should revoke `Session`, write `AuditLog` | Audit Logs; sessions | Splash/login | Button spinner | Logout error | N/A | Partial | Add logout API and call before local clear |
| Profile | Update profile/settings | Tourist | Persist personal info/preferences | Settings/profile routes | Missing profile APIs | Should update `Profile`/`User` | Users/profile detail | Saved state | Form loading | Inline error | N/A | Partial | Add `Profile` model/API and settings persistence |
| Profile | Help & Support | Tourist | Create/view support ticket | Help/support route | Missing support APIs | Should create `SupportTicket`, `TicketMessage` | Support Tickets | Ticket created | Form loading | Support error | Empty tickets | Partial | Add support module and dashboard queue |
| Saved | Saved/Trips tabs | Tourist | Filter saved items and trip plans | Same screen | `GET /v1/saved`, `GET /v1/trip-planner/plans` | Reads `SavedItem`, `Trip` | Future saved/trip analytics | Filtered list | Loading | Error | Empty saved/trips | Partial | Add real tabs/filters/trips view |
| Translator | Camera/Gallery | Tourist | Open native picker and set image | Native picker | None | No DB until translate | None | Image preview | Native picker loading | Permission error | No image selected | Connected | Device QA |
| Translator | Translate Image | Tourist | OCR/translate and store history | Same screen/result | `POST /v1/translator/image` | Creates `TranslationJob` | Future Translator Usage | Result card | Button spinner | State error | Disabled until image | Connected | Replace mock providers and add analytics/privacy dashboard |
| Translator History | Delete | Tourist | Delete own translation | Same screen | `DELETE /v1/translator/history/:id` | Deletes `TranslationJob` | Analytics aggregate only | Row removed | Row loading | Row error needed | Empty history | Partial | Add visible per-row error state |
| Trip Planner Step 1 | Next | Tourist | Validate emirates/dates and continue | Step 2 | Missing draft API | Should create/update draft `Trip` | Trip analytics | Step 2 | N/A | Validation error | N/A | Partial | Add draft persistence |
| Trip Planner Step 2 | Next | Tourist | Validate group/interests and continue | Step 3 | Missing draft patch | Should update draft `Trip` | Trip analytics | Step 3 | N/A | Validation error | N/A | Partial | Add draft patch |
| Trip Planner Step 3 | Generate My Trip | Tourist | Generate itinerary | Result | `POST /v1/trip-planner/generate` | Creates `Trip`, `TripStep` | Trip Planner Analytics | Result screen | Button spinner | State/API error | N/A | Connected | Add premium gates and analytics |
| Trip Planner Step 3 | Save for later | Tourist | Persist draft without generation | Missing/Stay route | Missing draft endpoint | Should create/update draft `Trip` | Trip Planner Analytics | Saved draft state | Button spinner | API error | N/A | Missing | Add draft API and route behavior |
| Itinerary Result | Save to My Destinations | Tourist | Save trip | Same screen | `POST /v1/saved` | Creates `SavedItem` for `Trip` | Saved/trip analytics | Saved state | Button loading | Visible error needed | N/A | Partial | Add success/error state |
| Itinerary Result | Edit Itinerary | Tourist | Continue editing existing plan | Planner route | Missing patch API | Should update `Trip`, `TripStep` | Trip analytics | Planner opens | N/A | Error boundary | N/A | Partial | Preserve trip id and add patch/delete |
| Itinerary Result | Open Live Map | Tourist | Open maps for itinerary | Native maps URL | Optional maps API later | No DB effect | None | Maps opens | Native loading | Native fallback needed | N/A | Connected | Use itinerary-specific coordinates |
| Taxi | Estimate/Confirm | Tourist | Estimate and book ride | Taxi state flow | Missing taxi APIs | Should create `Booking` plus driver assignment | Taxi bookings; driver queue | Ride booked | Map/API loading | Estimate/booking error | No cars available | Missing | Build taxi module and hide active CTA until real |
| Food | Add to cart/Checkout | Tourist | Build cart and create food order | Cart/order detail | Missing food/order APIs | Should create `Order`, `OrderItem` | Orders; provider orders; driver queue | Order created | Checkout loading | Order error | Empty cart/menu | Missing | Build food menu/cart/order and dashboard reflection |
| Pharmacy | Upload prescription | Tourist | Upload private prescription and request quote | Prescription flow | Missing upload/prescription APIs | Should create `UploadFile`, `PrescriptionRequest` | Prescription Requests | Request created | Upload loading | Permission/API error | No file | Missing | Add private upload and compliance workflow |
| Grocery | Add/Checkout | Tourist | Create grocery cart/order | Cart/order detail | Missing grocery APIs | Should create `Order`, `OrderItem` | Orders/provider orders | Order created | Checkout loading | Order error | Empty cart/products | Missing | Add product/cart/order flow |
| SIM | Choose plan/order | Tourist | Create SIM/eSIM order | SIM order detail | Missing SIM APIs | Should create `Order`, `OrderItem`, activation status | SIM Orders/provider orders | Order created | Order loading | Order error | No plans | Missing | Add SIM order and activation flow |
| Admin Dashboard | Edit content | Admin/Super Admin | Update mobile/website managed content | Content pages | Missing specific content APIs | Should update `Banner`, `OnboardingPage`, `MarketingPage`, `ContentAsset`, `AuditLog` | Content/Banners/Onboarding/Marketing | Saved content | Save loading | Validation/API error | Empty content | Partial | Add specific CMS pages and APIs |
| Provider Dashboard | Update order/listing | Provider | Manage own operational data only | Provider pages | Missing provider-specific APIs | Should update scoped `Listing`, `Order`, `Booking`, `AuditLog` | Provider dashboard/Admin dashboard | Updated row | Row loading | Scope/API error | Empty provider data | Missing | Add provider dashboard routes and backend ownership guards |
| Super Admin | Change role/settings | Super Admin | Manage roles, permissions, system config | System/roles pages | Missing write endpoints | Updates `RolePermission`, `UserRole`, settings, `AuditLog` | Roles/Permissions/System/Audit Logs | Saved change | Save loading | Permission/API error | Empty config | Partial | Add write APIs, split admin vs super admin wildcard |

## Mobile PDF Screens

| Screen | Button label | User role allowed | Expected behavior | Route target | API endpoint if needed | Success state | Error state | Loading state | Empty state | Current status | Fix needed |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Splash | Auto route | Guest/Auth | Route to onboarding/login/home after hydration | `/(auth)/onboarding/1`, `/(auth)/login`, `/(tabs)/home` | Local SecureStore/session; optional `/v1/users/me` | Correct landing screen | Error boundary | Initializing text | Not applicable | Connected | Add PDF-style loading polish |
| Onboarding 1 | Skip | Guest | Mark onboarded, continue as guest, go home | `/(tabs)/home` | None | Home screen | Error boundary | None | None | Connected | Add image and CMS content |
| Onboarding 1 | Next | Guest | Go to onboarding 2 | `/(auth)/onboarding/2` | None | Step 2 | Error boundary | None | None | Connected | Add image-led UI |
| Onboarding 2 | Back | Guest | Go to onboarding 1 | `/(auth)/onboarding/1` | None | Step 1 | Error boundary | None | None | Connected | None |
| Onboarding 2 | Skip | Guest | Mark onboarded and go home as guest | `/(tabs)/home` | None | Home screen | Error boundary | None | None | Connected | Add CMS-managed copy |
| Onboarding 2 | Next | Guest | Go to onboarding 3 | `/(auth)/onboarding/3` | None | Step 3 | Error boundary | None | None | Connected | Add planner visual |
| Onboarding 3 | Back to intro | Guest | Go back one step through `BackButton` | `/(auth)/onboarding/2` | None | Step 2 | Error boundary | None | None | Connected | Label currently generic/back, not exact PDF |
| Onboarding 3 | Get Started | Guest | Mark onboarded and go login | `/(auth)/login` | None | Login | Error boundary | None | None | Connected | Add service visual |
| Login | Sign In | Guest | Validate email/password and create session | `/(tabs)/home` | `POST /v1/auth/login`, `GET /v1/users/me` | Home screen with secure session | Inline error | Button loading | Not applicable | Connected | Add auth/me alias and logout API |
| Login | Continue as guest | Guest | Save guest flag and browse public app | `/(tabs)/home` | None | Home | Error boundary | None | None | Connected | Confirm guest permissions consistently |
| Login | Create Account | Guest | Open registration | `/(auth)/signup` | None | Signup screen | Error boundary | None | None | Connected | None |
| Login | Forgot Password | Guest | Start reset flow | `/(auth)/forgot-password` | None until submit | Forgot password screen | Error boundary | None | None | Connected | None |
| Login | Google | Guest | Social login | Missing | `POST /v1/auth/social/google` | Session | Provider error | Loading | None | Missing | Hide behind feature flag or implement provider |
| Login | Apple | Guest | Social login | Missing | `POST /v1/auth/social/apple` | Session | Provider error | Loading | None | Missing | Hide behind feature flag or implement provider |
| Signup | Terms checkbox | Guest | Toggle accepted terms | Same screen | None | Checkbox selected | Validation error if absent | None | None | Connected | Add terms/privacy links |
| Signup | Create Account | Guest | Validate form, create pending user, route OTP | `/(auth)/otp/signup` | `POST /v1/auth/signup` | OTP screen | Inline/API error | Button loading | None | Connected | Add confirm password/social |
| Signup | Continue as guest | Guest | Browse public app | `/(tabs)/home` | None | Home | Error boundary | None | None | Connected | None |
| Signup | Log in | Guest | Go login | `/(auth)/login` | None | Login | Error boundary | None | None | Connected | None |
| Signup | Google/Apple | Guest | Social signup | Missing | Social endpoints | Session/OTP | Provider error | Loading | None | Missing | Feature flag or implement |
| Forgot Password | Send code | Guest | Request reset OTP and route OTP | `/(auth)/otp/reset` | `POST /v1/auth/forgot-password` | OTP screen | Inline error | Button loading | None | Connected | Use shared email validator |
| OTP | Verify | Guest | Verify OTP; signup/login creates session; reset goes reset password | `/(tabs)/home` or `/(auth)/reset-password` | `POST /v1/auth/otp/verify`, `GET /v1/users/me` | Home/reset | Inline error | Button loading | None | Connected | Add resend timer |
| OTP | Request a new code | Guest | Request fresh OTP | Same screen | `POST /v1/auth/otp/request` | Code refreshed/dev code shown | Inline error | Button loading | None | Connected | Add cooldown timer |
| OTP | Continue as guest | Guest | Browse public app | `/(tabs)/home` | None | Home | Error boundary | None | None | Connected | Consider hiding during reset |
| OTP | Back to sign in | Guest | Return login | `/(auth)/login` | None | Login | Error boundary | None | None | Connected | None |
| Reset Password | Save password | Guest with valid OTP | Save new password and return login | `/(auth)/login` | `POST /v1/auth/reset-password` | Login | Inline error | Button loading | None | Connected | Add confirm password |
| Home | Translate | Guest/Tourist | Open translator; translator itself gates auth | `/translator/` | None | Translator screen | Error boundary | None | None | Connected | None |
| Home | Profile icon | Guest/Tourist | Open profile | `/(tabs)/profile` | None | Profile | Error boundary | None | None | Connected | None |
| Home | Search bar | Guest/Tourist | Open Discover | `/(tabs)/discover` | None | Discover | Error boundary | None | None | Connected | Later focus search field |
| Home | Service tiles | Guest/Tourist | Open service route or emergency | `/services/[type]`, `/emergency` | Listing/emergency API after route | Service screen | StateView error | Loading state | Empty state | Connected | Ordering service routes still partial |
| Home | Offer banner Book Now | Guest/Tourist | Open stays | `/services/stays` | `GET /v1/listings?kind=STAY` | Stays list | Error state | Loading state | Empty state | Connected | Make banner CMS-managed |
| Home | Featured Experiences See all | Guest/Tourist | Open Discover | `/(tabs)/discover` | None | Discover | Error boundary | None | None | Connected | None |
| Home | Featured listing card | Guest/Tourist | Open listing detail | `/listing/[id]` | `GET /v1/listings/:id` | Detail screen | Error state | Loading state | Not found state | Connected | None |
| Home | Emirates chip | Guest/Tourist | Open Discover | `/(tabs)/discover` | None | Discover | Error boundary | None | None | Connected | Pass filter target later |
| Discover | Search input | Guest/Tourist | Filter visible catalog | Same screen | Should become `GET /v1/search` | Filtered list | Error state if API search | None | No matches | Partial | Add backend search |
| Discover | Filter chips | Guest/Tourist | Filter local listings by kind | Same screen | Should support query filters | Filtered list | None | None | No matches | Partial | Add backend filters/categories |
| Discover | Listing card tap | Guest/Tourist | Open listing detail | `/listing/[id]` | `GET /v1/listings/:id` | Detail screen | Error state | Loading | Not found | Connected | None |
| Discover | Heart save | Tourist | Save/unsave listing; guest prompted to sign in | Same screen or `/(auth)/login` | `POST /v1/saved`, `DELETE /v1/saved/:type/:id` | Saved state refresh | Alert + error | Mutation loading not visibly indicated | None | Partial | Add visible loading/optimistic/error state |
| Discover | Destination card tap | Guest/Tourist | Should open destination detail | Currently `/(tabs)/discover` | `GET /v1/destinations/:id or :slug` | Detail | Error | Loading | Not found | Partial | Add destination detail route |
| Services | Listing card/CTA | Guest/Tourist | Open listing detail | `/listing/[id]` | `GET /v1/listings/:id` | Detail | Error | Loading | Empty | Connected | Add service-specific forms/filters |
| Listing Detail | Save | Tourist | Save/unsave listing; guest prompted login | Same screen or login | Saved API | Saved label | Alert/API error | No visible mutation state | None | Partial | Add visible loading/error and unsave |
| Listing Detail | Select Room/Book Now | Tourist | Stays route to room selection; activity/taxi create booking | `/rooms/[listingId]` or `/(tabs)/bookings` | `POST /v1/bookings` | Room screen or booking created | Alert/API error | Button loading | Not applicable | Partial | Add quote/date/payment review before production |
| Listing Detail | Room card | Guest/Tourist | Preview room inventory; detailed selection happens on Select Room route | `/rooms/[listingId]` from CTA | `POST /v1/bookings/quote` later | Room screen/booking selected | Error | Loading | None | Partial | Add quote API and date/guest selectors |
| Emergency | Emergency card tap | Guest/Tourist | Open confirmation modal | Same screen | None | Modal open | None | None | None | Connected | None |
| Emergency | Call Now | Guest/Tourist | Open native dialer | Native `tel:` | None | Dialer opens | Native failure unhandled | None | None | Connected | Add fallback error state |
| Emergency | Cancel | Guest/Tourist | Close modal | Same screen | None | Modal closed | None | None | None | Connected | None |
| Profile | Sign In | Guest | Open login | `/(auth)/login` | None | Login | Error boundary | None | None | Connected | None |
| Profile | Create Account | Guest | Open signup | `/(auth)/signup` | None | Signup | Error boundary | None | None | Connected | None |
| Profile | Language | Guest/Tourist | Toggle local language | Same screen | None | Locale changed | None | None | None | Connected | Add RTL QA |
| Profile | Notifications | Tourist | Open settings | `/settings/notifications` | None | Settings page | Error boundary | None | None | Connected | Backend preferences missing |
| Profile | Payment methods | Tourist | Open settings | `/settings/payment-methods` | None | Settings page | Error boundary | None | None | Connected | Payment method CRUD missing |
| Profile | Help & Support | Tourist | Open support information and support email action | `/help` | `POST/GET /v1/support/tickets` later | Help screen | Error boundary | None | None | Partial | Add real support ticket API/form |
| Profile | Privacy policy | Guest/Tourist | Open mobile privacy policy screen | `/legal/privacy` | Website privacy exists | Privacy content | Error boundary | None | None | Connected | Replace placeholder legal copy after counsel review |
| Profile | Logout | Tourist/Guest | Clear local session and route splash | `/(auth)/splash` | Should call logout endpoint | Splash | Error boundary | None | None | Partial | Add `POST /v1/auth/logout` and revoke session |
| Saved | Sign In | Guest | Open login | `/(auth)/login` | None | Login | Error boundary | None | None | Connected | None |
| Saved | Listing card | Tourist | Open listing detail | `/listing/[id]` | Listing API | Detail | Error | Loading | Empty | Connected | None |
| Saved | Destination card | Tourist | Should open destination detail | Currently discover | Destination API | Detail | Error | Loading | Empty | Partial | Add destination detail route |
| Saved | Tabs/filters | Tourist | Filter saved/trips/items | Missing | Saved/trip APIs | Filtered data | Error | Loading | Empty | Missing | Add Saved/Trips tabs and filters |
| Translator | Sign In | Guest | Open login | `/(auth)/login` | None | Login | Error boundary | None | None | Connected | None |
| Translator | History | Tourist | Open history | `/translator/history` | `GET /v1/translator/history` | History list | Error state | Loading | Empty | Connected | None |
| Translator | Language chips | Tourist | Set target language | Same screen | None | Active chip | None | None | None | Connected | None |
| Translator | Camera | Tourist | Request camera and capture image | Native camera | None | Image preview | Permission error | Native picker | None | Connected | Requires device QA |
| Translator | Gallery | Tourist | Request library and pick image | Native gallery | None | Image preview | Permission error | Native picker | None | Connected | Requires device QA |
| Translator | Translate Image | Tourist | OCR/translate and save history | Same screen | `POST /v1/translator/image` | Result card | StateView error | Button loading | Disabled if no image | Connected | Replace mock providers before production |
| Translator History | Delete | Tourist | Delete history entry | Same screen | `DELETE /v1/translator/history/:id` | Entry removed | API error currently not shown | Button loading | Empty history | Partial | Add per-row error state |
| Trip Step 1 | Emirate chips | Tourist | Toggle city IDs | Same screen | None | Active chips | Validation error if none | None | None | Connected | Add draft persistence |
| Trip Step 1 | Date quick chips | Tourist | Set date range | Same screen | None | Dates changed | None | None | None | Connected | Add real calendar range |
| Trip Step 1 | Back | Tourist | Go home | `/(tabs)/home` | None | Home | Error boundary | None | None | Connected | None |
| Trip Step 1 | Next | Tourist | Validate and go step 2 | `/trip-planner/2` | None | Step 2 | StateView error | None | None | Connected | Add draft API |
| Trip Step 2 | Party chips | Tourist | Set party | Same screen | None | Active chip | None | None | None | Connected | None |
| Trip Step 2 | Interest chips | Tourist | Toggle interests | Same screen | None | Active chips | Validation if none | None | None | Connected | None |
| Trip Step 2 | Back/Next | Tourist | Route step 1/3 | `/trip-planner/1`, `/trip-planner/3` | None | Correct step | Error boundary | None | None | Connected | Add draft API |
| Trip Step 3 | Budget/Pace chips | Tourist | Set preferences | Same screen | None | Active chips | None | None | None | Connected | None |
| Trip Step 3 | Generate My Trip | Tourist | Generate itinerary | `/trip-planner/result/[id]` | `POST /v1/trip-planner/generate` | Result screen | StateView error | Button loading | None | Connected | Add premium advanced AI gates later |
| Trip Step 3 | Save for later | Tourist | Save draft | Missing | `POST /v1/trip-planner/draft` | Draft saved | Error | Loading | None | Missing | Add draft route/API |
| Itinerary Result | Save to My Destinations | Tourist | Save trip | Same screen | `POST /v1/saved` | Saved | Error not visible | Button loading | None | Partial | Add success/error toast/state |
| Itinerary Result | Edit Itinerary | Tourist | Go step 1 | `/trip-planner/1` | Should patch draft | Step 1 | Error boundary | None | None | Partial | Preserve existing trip/draft |
| Itinerary Result | Open Live Map | Tourist | Open native maps for UAE itinerary context | Native maps URL | Maps API optional | Map opens | Native failure | Loading | None | Connected | Replace generic Dubai query with itinerary-specific coordinates |

## Dashboard And Website Actions

| Screen | Button label | User role allowed | Expected behavior | Route target | API endpoint if needed | Success state | Error state | Loading state | Empty state | Current status | Fix needed |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Dashboard Login | Sign in | Admin/Provider/Support | Create dashboard session | `next` route or `/overview` | `POST /v1/auth/login`, `GET /v1/users/me/access` | Dashboard overview | Error message | Button loading | None | Connected | Add provider invite/login UX |
| Dashboard Sidebar | Navigation links | Based on permissions | Navigate to authorized page | `/overview`, `/bookings`, `/listings`, etc. | Page-specific APIs | Page renders | AccessDenied/error | Route loading | Empty states | Connected for existing pages | Add missing Orders, Support, CMS, Analytics pages |
| Dashboard Partners | Open businesses | Admin/Provider | Navigate businesses page | `/businesses` | `GET /v1/businesses` | Businesses table | Error | Loading | Empty table | Connected | None |
| Website Nav | Navi/Home | Public | Navigate homepage | `/{locale}` | None | Page loads | 404 if route missing | Next loading | None | Connected | Add richer marketing sections |
| Website Nav | For tourists | Public | Navigate tourist page | `/{locale}/tourists` | None | Page loads | 404 | Loading | None | Connected | Expand content |
| Website Nav | For partners | Public | Navigate partner page | `/{locale}/partners` | None | Page loads | 404 | Loading | None | Connected | Split partner vertical pages |
| Website Nav | Destinations | Public | Navigate destinations | `/{locale}/destinations` | Should call discovery APIs later | Page loads | 404 | Loading | None | Partial | API-backed cards/search |
| Website Nav | About/Contact | Public | Navigate pages | `/{locale}/about`, `/{locale}/contact` | None | Page loads | 404 | Loading | None | Connected | Contact sales form missing |
| Website Partners | Apply | Public partner | Start partner inquiry | `mailto:partners@navi.ae` | Should submit CRM/support API | Email client | Native mail failure | None | None | Partial | Add demo/contact sales form API |
| Website Home | Get the app | Public | Navigate tourist page | `/{locale}/tourists` | None | Page loads | 404 | Loading | None | Connected | Later app store links |
| Website Home | Destination cards | Public | Navigate destinations | `/{locale}/destinations` | None | Page loads | 404 | Loading | None | Connected | Destination detail routes missing |

## Audit Checklist For Button Registry Smoke Test

Run this checklist before declaring a release candidate:

1. Search for `onPress={() => {}}`, `console.log`, `TODO`, `alert(`, and `Alert.alert` in `apps/mobile`.
2. Confirm every `router.push` and `router.replace` target exists in `apps/mobile/app`.
3. Confirm every `Link href` target exists in `apps/website/src/app` or `apps/dashboard/src/app`.
4. Confirm every mobile action that mutates data uses `@navi/api-client` or a native API.
5. Confirm all guest-only blocked actions route to login or are disabled with a reason.
6. Confirm every dashboard sidebar route has a permission rule in `apps/dashboard/src/lib/routePermissions.ts`.
7. Confirm all disabled buttons include visible reason text or are hidden behind feature flags.
