Skip to content

App Sitemap & Navigation Reachability ​

Generated from the 2026-07-12 full reachability audit (both repos). The enforcement twin of this document is test/navigation/route_reachability_test.dart β€” every AppRoutes constant must be linked from a navigation surface or explicitly allowlisted there. The React web repo has the equivalent guardrail at src/test/layout/routeNavCoverage.test.ts.

Route zones ​

ZonePrefixesShellAuth
Auth / onboarding/, /sign-in, /phone-otp, /onboardingnonepublic
Public visitor/public, /catalog, /tools/*, /about, /services, /contact, /terms, /privacy, /area-guides, /submit-property, /verify, /request-valuation, /p/:idPublicVisitorShell (4 tabs)public
Token portals/bundle/, /deal/, /owner/, /client/, /valuation/portal/, /valuation/pay/, /brokerage/pay/, /sign/, /inspector/nonetoken-authorized
Client shell/client/*ClientAppShell (4 tabs)client account
Staff shell/dashboard, /brokerage/*, /valuation/*, /clients/*, /comms/*AppShell (5 branches)staff
Cross-cutting staff/tasks, /documents, /finance, /reports/*, /ai/*, /admin/*, /network/*, /transactions/*, /settings/*, …pushed over AppShellstaff (some admin-only)

Role gating: role_route_policy.dart (client-only accounts β†’ client shell; finance routes β†’ admin/accountant; /residents + /admin/offices β†’ admin). v1 gating: kV1HiddenRoutes in routes.dart (currently empty).

Programmatic catalogues (checked by the reachability test):

  • staff_bottom_nav_policy.dart β€” per-persona 4 tabs + overflow (Agentic OS at /dashboard, brokerage/valuation, clients, comms/tasks/settings + persona variants).
  • shell_tools_sheet.dart β€” the center tools drawer: 19 shared shortcuts + admin shortcuts (residents, property registry, tahdeed, Hermes dashboard, send email).
  • tool_catalog.dart β€” global-search launcher (~60 tools; empty query = browsable list). The safety net: every staff tool, including Reports Hub and the agent KPI dashboard, must appear here.
  • clientBottomNavConfig β€” client shell tabs + support shortcuts.

Widget hubs (allowlisted with their surface in the reachability test):

  • Side drawers: brokerage_drawer.dart (11 entries), khobara_drawer.dart (5).
  • Reports hub (19 tiles), AI tools menu (9), WhatsApp tools menu (13), Comms tab, Network hub, Settings, Agentic OS menu.
  • Public: visitor shell tabs, landing + footer, public tools hub (13 tiles).
  • Contextual: valuations-list ops menu (data quality, coordinates, bulk, completeness, stats, appraiser/evaluator dashboards, templates, kanban), transactions-explorer staff menu (analytics, anomaly, predictive), properties-list tools menu (price heatmap, property alerts), documents-list actions (file manager, document manager), visit-detail "Site inspection" CTA (β†’ which carries the Comparables CTA).
  • Redirect/alias shapes: /sign-up, /password-reset, /ai, /admin/whatsapp/marketing, /admin/party-registry, /brokerage/sales/requests*, /brokerage/properties/heatmap (web shape), /valuation/valuations/kanban, /finance/invoices|quotations (mode shortcuts β€” the brand paths are the linked ones).
  • Token portals β€” shared as links, never browsed to.
  • /admin/widget-gallery β€” dev-only design gallery.
  • /settings/language, /settings/theme β€” Settings has inline pickers.
  • /brokerage/properties/new β€” superseded by /properties/new (AddPropertyScreen, the properties-list FAB).
  • /valuation/clients β€” duplicated by the unified Contacts tab.

Dead code found by the audit was removed rather than wired: the never-routed ClientsListScreen (superseded by ClientsTabScreen) and the standalone IndividualDetailScreen wrapper (its IndividualProfileTab body lives on inside PartyDetailScreen).

Cross-repo path bridge (web ⇄ mobile) ​

Deep links use the web-canonical shapes (DB/notification convention); inbound_route_normalizer.dart maps them to mobile routes (static alias table + dynamic :id patterns), and kWebInboundRedirects entries are also mounted as redirect GoRoutes. The web handles mobile-ish shapes via redirects in SharedRoutes.tsx (/transactions, /mailbox, …). Divergent pairs already bridged include:

Web canonicalMobile route
/admin/activity-feed/dashboard/activity
/market/analytics Β· /market/anomaly-detection Β· /analytics/predictive/transactions/analytics Β· /transactions/anomaly Β· /transactions/predictive
/valuation/reports/{performance, evaluator-dashboard, valuation-stats}/valuation/valuations/{appraiser-performance, evaluator-dashboard, stats}
/ai/hermes-dashboard/admin/hermes
/tools/documents Β· /tools/workspace/documents/dashboard Β· /documents/manager
/brokerage/crm/call-logs/call-logs
/leaderboard Β· /kpi Β· /sla Β· /lead-source-roi/reports/{leaderboard, kpi, sla, lead-source}

When adding a route on either surface: keep the path identical if possible; otherwise add the alias to the normalizer (mobile) or SharedRoutes.tsx (web) in the same PR, and record the pair here.

2026-07-12 audit outcome ​

23 mobile routes (19 staff + 4 public) were shipped with zero navigation entries; all are now wired (tool catalog + reports hub + contextual homes + public tools tiles). The web repo was audited the same day and is covered by its own guardrail; its intentional exemptions (/verify = QR entry, /admin/paci-areas = duplicate alias, buyers β†’ filtered Contacts) are documented in routeNavCoverage.test.ts.

Aldilaijan & Khobara Real Estate Platform