Skip to content

System shortfall register โ€‹

Living backlog from the 2026-06-09 full-stack walkthrough. Severity: S1 crash/blocker ยท S2 broken feature ยท S3 UX/docs ยท S4 polish.

IDSevOwnerAreaIssueStatus
S-001โ€”supabaseBackendwhatsapp-ai-replay / whatsapp-reliability-action + api.whatsapp_reliability_incidentsverified deployed (walkthrough 2026-06-09)
S-002โ€”mobileNavigationWeb routes.ts drift vs mobile normalizermitigated โ€” web_routes_parity_test.dart + snapshot in test/fixtures/
S-003S3mobileDocsCROSS_PLATFORM_PARITY.md comparables note stalefixed in this walkthrough
S-004S3mobileDocsREMAINING_WORK.md ยงA body contradicted update tablefixed in this walkthrough
S-005โ€”mobileQADeferred /reports/* manual web sweepmitigated โ€” widget tests + route parity; manual spot-check optional
S-006S2mobileE2EPatrol tiers 02โ€“03 still skip: true; Android Patrol runner not bootstrappedmitigated โ€” Tier 2.1โ€“2.2 + Tier 3.1โ€“3.2 un-skipped with widget keys; CI runs smoke_patrol_bundle_integration_test.dart (Tier 1+5); WhatsAppMockWebhookReplay added in integration_test/
S-007โ€”opsMailboxFour Hostinger accounts + on-device IMAPverified on device (2026-06-09)
S-008โ€”FlutterHermeshermes-server model-pin read + AI gatewayfixed โ€” canonical server, gateway, tests, lockfiles, health checks, and deploy workflow live in services/ + supabase/functions/ here
S-009S1/S2mobile/webAuthLong-lived tab gotrue refresh storm (F-004)fixed โ€” auth_refresh_guard.dart circuit-breaker, tab visibility pause, and unrecoverable token fail-closed guard eliminates gotrue refresh storms
S-010โ€”FlutterRepoEdge Function deploy ownershipfixed โ€” all 150 inventoried functions are local; the generated ownership manifest allowlists 145 deployable slugs and explicitly quarantines six legacy entries
S-011S3supabaseSecurityAdvisor WARN: anon/authenticated EXECUTE on some api.* SECURITY DEFINER RPCsmitigated โ€” 20260609150000_revoke_public_execute_catalog_rpc.sql applied live; anon/authenticated catalog + price-map RPCs unchanged
S-012S3supabaseSecurityRLS-enabled tables without policies (backup/internal WhatsApp queue tables)fixed โ€” explicit service_role_all policies added via 20260915060000_s012_harden_internal_research_tables_rls.sql (Supabase linter 0008 count: 0)
S-013S2mobileTestswhatsapp_drip_repository_test / conversation ErrorState driftfixed in this walkthrough
S-014S2mobileReportsFinancial Reports (/reports/financial) stuck on loading spinner โ€” its deals query selects deals.agent_name, a column that doesn't exist โ†’ PostgREST 400 โ†’ the fetch dies before it reaches invoices. Confirmed via live API logs (GET /rest/v1/deals?select=โ€ฆagent_nameโ€ฆ โ†’ 400) during 2026-06-22 device sweep.fixed โ€” fix/financial-report-deals-agent-name-400: drop agent_name from the select, resolve agent display names from profiles (mirrors deals_repository.dart). Cross-repo follow-up: confirm web useFinancialReportData.ts doesn't make the same select.
S-015S4mobileReportsLarge KWD stat-card figures truncate with an ellipsis instead of scaling/wrapping (KPI "value brokered" โ†’ 16,390,00โ€ฆ; transaction-analytics "trading volume" โ†’ 217,225,787,931โ€ฆ).fixed โ€” wrapped the figure in FittedBox(scaleDown) on the KPI, transaction-analytics, and financial-report stat cards; the full number now shrinks to fit.
S-016S4mobileAIAI hub โ†’ quick-estimate (/ai/hub): the location field hint reused the area example ("ู…ุซุงู„: 400"), and the condition dropdown placeholder read "ุงุฎุชุฑ ุงู„ู†ูˆุน" (choose type) instead of choose-condition.fixed โ€” added aiPricing.locationPlaceholder ("ู…ุซุงู„: ุงู„ุณุงู„ู…ูŠุฉ" / "e.g. Salmiya") and aiPricing.selectCondition ("ุงุฎุชุฑ ุงู„ุญุงู„ุฉ" / "Select condition") in both locales; wired the screen to them.
S-017S3mobileAdminTeam/Users (/admin/users): role chips rendered raw English machine-keys (secretary_aldilaijan, hr_manager, whatsapp_agent, admin) in the Arabic UI.fixed โ€” added a staffRoles i18n namespace covering all 17 app_role enum values (en + ar); _RolePill now renders l.t('staffRoles.<role>').
S-018S3mobileAnalyticsPredictive Analytics (/transactions/predictive): every area card showed a raw i18n placeholder ุฏ.ูƒ/ู…ยฒ ุญุงู„ูŠุงู‹ โ€” predict.currentPrice is rendered as a label (the value already prints below via _MiniTile) but the string embedded an un-interpolated .fixed โ€” label changed to "ุงู„ุณุนุฑ ุงู„ุญุงู„ูŠ" / "Current Price" in both locales.

S-014-class audit (2026-06-22) โ€” Flutter Supabase query references a column/table absent from the live schema โ†’ PostgREST 400 โ†’ broken/empty screen. Found by an exhaustive 14-agent workflow cross-checking all 109 query-building files vs a live schema snapshot, each finding adversarially verified against the live DB (9 confirmed, 0 false-positive). โ€‹

IDSevOwnerAreaIssueStatus
S-019S2mobileRevaluationsreminders_repository.create() inserts valuation_id โ€” reminders has no such column; the revaluation-reminder caller always passes it โ†’ every "set reminder" tap 400s.fixed โ€” dropped the unstorable key + unused param (title already carries the valuation ref). If reminderโ†’valuation linkage is wanted, add a valuation_id column.
S-020S2mobileReportsreports_repository.agentScorecards() selects/filters properties.agent_id; the column is assigned_broker_id. Future.wait fails the whole future โ†’ Agent Scorecards report never loads.fixed โ€” agent_id โ†’ assigned_broker_id (select + .not() + row read).
S-021S2mobileHermeshermes_repository filtered .gte('started_at',โ€ฆ) (status KPIs) and .order('started_at') (recent runs) โ€” hermes_agent_runs has no started_at (it's created_at).fixed โ€” both โ†’ created_at; recent-runs select aliases started_at:created_at so the model's start-time still populates (matches the 2026-05-26 runById fix).
S-022S2mobileFollow-upfollow_up_repository today-appointments select referenced four non-existent appointments columns (system, description, deal_id, request_id) โ†’ todayAppointments() 400s (confirmed via live API logs after the first partial fix still 400'd).fixed โ€” select trimmed to real columns only; model dealId/requestId degrade to null. (Audit caught only system; the rest were found via on-device API-log verification.)
S-023S2mobileAdminaudit_repository.get() embedded profiles!user_activity_logs_user_id_fkey(...) โ€” there is no FK from user_activity_logs.user_id โ†’ profiles (it FKs auth.users), so PostgREST can't resolve the embed โ†’ audit-event detail 400s (and profiles.name was also wrong โ†’ display_name).fixed โ€” dropped the embed; resolve the actor profile in a second profiles lookup keyed on user_id (mirrors deals/reports). Column also corrected to display_name.
S-024S2mobile/supabaseAdminImport-status dashboard queries moj_sync_log in the default (public) schema; the table lived only in internal (not exposed by PostgREST). Never returned rows.fixed โ€” migration 20260622220000_expose_internal_import_status_views.sql adds a staff-gated public.moj_sync_log view (definer + WHERE is_staff(auth.uid()), granted to authenticated only). Verified on-device: MOJ sync history populates. No Flutter change.
S-025S3mobile/supabaseAdminSame as S-024 for paci_import_jobs (PACI import-jobs panel).fixed โ€” same migration adds public.paci_import_jobs view. Verified on-device (PACI batches + parcel estimate populate).
S-026S2mobile/supabaseFilesfiles_repository.recentActivity() queries file_activity_logs (with a file:files(...) embed) in public; table lived only in internal. Recent-activity panel couldn't load.fixed โ€” same migration adds public.file_activity_logs view; PostgREST resolves the files embed through it. Verified on-device (activity log shows file names).
S-027S2mobileSearchFree-text area search returns nothing: properties.al_mintaqa and valuations.area store English area_keys (nuzha, salmiyaโ€ฆ) post-migration, but property / valuation / global search ILIKE'd the raw Arabic/English area name against them โ†’ 0 hits (user reported "ุงู„ู†ุฒู‡ุฉ" missing all 84 Nuzha properties; confirmed live).fixed โ€” resolve the term via AreaCanon โ†’ area_key + stored forms, and add al_mintaqa/area ILIKE terms: applyPropertiesQueryFilters, valuations_repository.list (+ areaCanon threaded through valuationsListProvider), shared valuationSearchOrFilter, and global_search_screen (property + valuation). Follow-ups: requests search never queried al_manatiq (separate pre-existing gap) โ†’ S-028; web app likely has the same area-search bug.
S-028S2mobileSearchRequests list search ignored the area entirely โ€” requests_repository.list .or(...) matched only al_ism/al_raqam/tafasil, never al_manatiq (a text[] of English area_keys), so searching a request by area name returned 0.fixed โ€” resolve the term via AreaCanon.resolve and add an array-containment term al_manatiq.cs.{<area_key>} to the search .or() (exact element match โ†’ keep the raw snake_case key, no wildcard-strip); areaCanon threaded through requestsListProvider like valuations. DB-verified (cs nuzhaโ†’31, abu_fteira_suburbโ†’3 requests).
S-029S2mobileTransactionsMoJ transaction explorer governorate filter returned ~0 across all three screens (search, analytics, predictive): real_estate_transactions.governorate stores English machine keys (ahmadi, capitalโ€ฆ) post-Stage-4, but the filter sheet emits Arabic short names (kMojGovernoratesAr), and the 7 RPCs (get_public_real_estate_transactions, get_transaction_stats/cat_distribution/area_prices/monthly_trend/yearly_comparison, get_area_monthly_ppm) all match governorate = <param> with no normalization. Same English-key bug class as S-027 but on the governorate facet of a different (MoJ-mirror) table.fixed โ€” resolve the selection to its key via governorateKey() before sending: transactions_repository.searchPublic (p_governorate), transaction_analytics_repository.fetch (gov across 5 RPCs), predictive_analytics_repository.fetchAreaMonthly (p_governorate); fixed the stale kMojGovernoratesAr comment claiming the table stores Arabic. Verified live (demo user): get_transaction_stats key=capitalโ†’14,505 vs Arabicโ†’0; get_area_monthly_ppm key=ahmadiโ†’1000 vs Arabicโ†’6. (p_property_type/p_area/p_category left raw โ€” those columns are still Arabic.)

Edge functions invoked by mobile (19) โ€‹

Documented in test/core/navigation/edge_function_inventory_test.dart. All verified ACTIVE on project jrsgosnnyjonxaesqtln as of walkthrough date.

  • test/fixtures/web_routes_snapshot.ts โ€” pinned copy of web ROUTES
  • test/core/navigation/web_routes_parity_test.dart
  • test/core/navigation/notification_link_normalization_test.dart
  • test/fixtures/notification_link_samples.json

Device QA (user execution) โ€‹

Run docs/DEVICE_QA_CHECKLIST.md on TestFlight / Play Internal. Record results in checklist checkboxes or append rows here.

Aldilaijan & Khobara Real Estate Platform