PASS: password hashing verifies PASS: password policy accepts strong local password PASS: auth service registers and verifies PASS: local environment allows demo auto-login for app routes PASS: production environment disables demo auto-login PASS: explicit demo flag allows demo mode outside local PASS: session cookie policy hardens local cookies without forcing Secure on HTTP PASS: session cookie policy requires Secure cookies for HTTPS production PASS: security headers include CSP and production HSTS policy PASS: security headers include browser hardening and omit X-Powered-By PASS: valid login starts an authenticated session PASS: invalid login fails without creating a session PASS: signup creates owner session PASS: auth UI exposes login and signup forms PASS: rbac permission checks PASS: rbac removes dead delete/API permissions without active routes PASS: rbac allows read-only accounting integration visibility PASS: rbac limits accounting sandbox management PASS: rbac separates inventory visibility from stock management PASS: rbac limits financial job cost capture PASS: rbac allows calendar integration visibility PASS: rbac limits calendar connection management PASS: rbac allows LLM settings visibility PASS: rbac limits LLM API key management PASS: rbac limits saved report and delivery management PASS: rbac allows demo operations showcase PASS: rbac keeps demo users read-only for owner-level actions PASS: rbac blocks supervisor tenant and billing administration PASS: rbac separates dispatch assignment from assigned-job updates PASS: rbac limits global pricing administration PASS: rbac limits platform admin panel visibility PASS: rbac limits tenant impersonation to platform admins PASS: rbac limits platform billing overrides PASS: rbac keeps tenant admins out of platform admin permissions PASS: request path strips XAMPP public base path PASS: request normalizes duplicated XAMPP public base path PASS: app renders forbidden RBAC failures as 403 responses PASS: forbidden platform admin response links to platform admin demo login PASS: app blocks POST requests with invalid CSRF tokens PASS: csrf failure response keeps security check message PASS: app returns JSON 404 envelope for unknown API routes PASS: app returns JSON 403 envelope for forbidden API routes PASS: client validation accepts valid data PASS: client validation rejects invalid data PASS: client validation rejects unsupported status PASS: client service finds seeded client by name PASS: client service maps seeded client to edit form values PASS: client repository saves edits over seeded client without duplicates PASS: client index supports drill-in UI: /clients/view?name= PASS: client index supports drill-in UI: /clients/edit?name= PASS: client index supports drill-in UI: View details PASS: client index supports drill-in UI: Edit client PASS: client detail view contains Contact details PASS: client detail view contains Operational snapshot PASS: client detail view contains Edit client PASS: client detail operational snapshot contains Open jobs PASS: client detail operational snapshot contains Outstanding balance PASS: client detail operational snapshot contains Last activity PASS: client detail operational snapshot has no placeholder quote/invoice labels PASS: client edit form posts original client identity PASS: client operational snapshot links Martinez quotes by client id PASS: client operational snapshot links Martinez invoices by client id PASS: client operational snapshot calculates open jobs, outstanding balance, and last activity PASS: client operational snapshot renders zero counts without dead links PASS: client detail route renders real operational snapshot counts and links PASS: job workflow validation accepts valid data PASS: job workflow validation rejects unsupported status PASS: job workflow allows next-step transition PASS: job workflow blocks skipped transition PASS: job workflow stats highlight blockers PASS: job workflow filters by status PASS: job workflow search filters demo jobs PASS: job workflow finds demo job by id PASS: job workflow returns null for unknown job id PASS: job workflow builds detail checklist PASS: job workflow builds detail timeline PASS: job workflow builds financial snapshot PASS: job workflow builds related job actions PASS: operations demo jobs cover status: pending PASS: operations demo jobs cover status: scheduled PASS: operations demo jobs cover status: in_progress PASS: operations demo jobs cover status: completed PASS: operations demo jobs cover status: blocked PASS: operations demo jobs cover status: invoiced PASS: operations demo quotes cover status: draft PASS: operations demo quotes cover status: sent PASS: operations demo quotes cover status: approved PASS: operations demo quotes cover status: declined PASS: operations demo invoices cover status: draft PASS: operations demo invoices cover status: sent PASS: operations demo invoices cover status: unpaid PASS: operations demo invoices cover status: partial PASS: operations demo invoices cover status: paid PASS: operations demo invoices cover status: overdue PASS: operations demo data includes expanded scenario scale PASS: operations demo summaries include blocker and conversion scenarios PASS: report summary computes revenue and quote conversion from invoice/quote records PASS: report summary computes technician workload and unassigned dispatch backlog PASS: advanced report summary computes completion, blocker, and quote conversion KPIs PASS: advanced profitability report stays unavailable until cost capture data exists PASS: advanced profitability report computes material and direct-cost-backed margin for linked invoice jobs PASS: purchase order accrual service includes committed line costs and excludes draft orders PASS: supplier invoice matching links actual supplier cost to purchase orders and excludes draft bills PASS: timesheet cost service includes approved payroll labour and excludes draft or unlinked entries PASS: advanced profitability report includes purchase-order accruals without counting draft or cancelled orders PASS: advanced profitability report uses supplier invoices to replace matched purchase-order accrual PASS: advanced profitability report includes approved timesheet labour and excludes draft payroll rows PASS: contract profitability report links agreement jobs, invoices, billing schedules, and captured costs PASS: contract profitability report includes explicit and job-linked purchase-order accruals PASS: contract profitability report replaces matched purchase-order accrual with supplier invoice actuals PASS: contract profitability report includes approved timesheet labour cost PASS: report summary exposes contract profitability without counting unlinked same-customer invoices PASS: advanced report summary computes engineer productivity and customer performance rows PASS: dashboard summary computes job totals, collected revenue, and invoice follow-up from records PASS: dashboard pending quote list excludes approved and converted quotes PASS: report period service scopes invoice revenue to custom date ranges PASS: period comparison computes previous range and real dashboard trend notes PASS: quotes page filters by client id from client detail snapshot link PASS: invoices page filters by client id from client detail snapshot link PASS: reports page renders repository-backed revenue, workload, and advanced report summaries instead of placeholder content PASS: reports page renders custom period-scoped revenue values and comparisons PASS: saved report service validates and normalizes custom period filters PASS: saved report service rejects missing names and incomplete custom ranges PASS: reports page opens tenant-scoped saved report presets and renders preset management UI PASS: report preset create action persists tenant preset and writes audit log PASS: report preset delete action removes tenant preset and writes audit log PASS: report delivery service queues scheduled presets once and decorates local provider status PASS: report delivery queue action redirects and writes audit log PASS: report delivery queue route is registered PASS: database saved report and delivery repositories persist and isolate tenant report records PASS: dashboard renders computed revenue and only draft/sent pending quotes PASS: dashboard renders custom period-scoped KPI values, comparisons, and empty states PASS: client DB repository persists created clients PASS: client DB repository persists client edits PASS: job DB repository persists created jobs PASS: job DB repository lists persisted jobs after refresh-style read PASS: job DB repository updates assigned technician by user id PASS: recurring agreement validation accepts valid data PASS: recurring agreement validation rejects unsupported frequency PASS: recurring agreement advances weekly dates PASS: recurring agreement advances monthly dates PASS: recurring agreement advances quarterly dates PASS: recurring agreement advances annual dates PASS: recurring agreement repository persists created template PASS: recurring agreement generates linked pending job through job repository PASS: recurring agreement stores generated job link and next run date PASS: recurring agreement can be paused PASS: paused recurring agreement cannot generate jobs PASS: recurring agreement can be resumed PASS: recurring jobs route renders maintenance agreement board PASS: recurring jobs template exposes generate and pause/resume actions PASS: demo recurring agreements seed PPM frequencies and annual certificate scenarios PASS: dispatch service treats team members as managed technician resources PASS: dispatch service creates crew grouping with lead technician PASS: dispatch recommendation matches job skill and technician availability PASS: dispatch recommendation insights explain score and reasons PASS: dispatch assigns job to technician by user id PASS: dispatch blocks same-technician time conflict PASS: dispatch assigns job to crew and crew lead PASS: dispatch blocks same-crew time conflict PASS: dispatch edit blocks double-booking an assigned technician PASS: dispatch edit changes date, time, and technician assignment PASS: dispatch edit can return a job to unassigned PASS: dispatch blocks unavailable technician assignment PASS: dispatch board groups jobs by technician and crew PASS: dispatch route renders crew board PASS: team member cannot open dispatch assignment board PASS: dispatch update route redirects after editing a dispatch PASS: dispatch template exposes crew creation and assignment actions PASS: dispatch template exposes editable dispatch actions PASS: dispatch template exposes assignment intelligence panel PASS: dispatch update route is registered PASS: demo team repository seeds technician skills for fresh dispatch sessions PASS: demo job repository seeds dispatch and workflow edge statuses PASS: demo field note repository seeds technician note scenarios for QA PASS: demo customer portal token repository seeds portal access scenarios for QA PASS: demo customer portal token seed can be resolved by generated token hash PASS: demo inventory repository seeds catalog, truck stock, and job material movement scenarios PASS: demo job cost repository seeds labour and subcontractor cost scenarios PASS: demo timesheet repository seeds payroll cost and exclusion scenarios PASS: demo purchase order repository seeds accrual and exclusion scenarios PASS: demo supplier invoice repository seeds matching and exclusion scenarios PASS: inventory validation accepts valid catalog item PASS: inventory usage validation accepts job material capture PASS: inventory usage records job material cost PASS: inventory summary rolls up job material cost PASS: inventory template exposes item and usage forms PASS: job cost validation accepts a valid direct cost PASS: job cost validation rejects unsupported cost types PASS: job cost repository persists tenant-scoped direct cost entries PASS: job cost repository blocks cross-tenant job/user references PASS: job cost service summarizes direct costs by type PASS: timesheet repository persists tenant-scoped payroll labour and excludes other tenants PASS: timesheet repository blocks cross-tenant job/user references PASS: purchase order repository reads tenant-scoped orders and ignores cross-tenant lines PASS: supplier invoice repository reads tenant-scoped bills and ignores cross-tenant lines PASS: team member cannot view an unassigned job PASS: team member can view an assigned job PASS: trainee cannot create a job PASS: manager can view tenant jobs without assignment PASS: owner can add field notes PASS: assigned technician can add field notes PASS: trainee cannot add field notes PASS: field note repository persists edits and edit history PASS: job controller adds field note and redirects PASS: job controller updates an editable field note PASS: assigned team member cannot edit another user field note PASS: trainee cannot add field notes through controller PASS: job controller adds a direct cost entry and writes an audit log PASS: team member cannot add financial job cost entries PASS: job detail renders captured direct cost ledger and financial snapshot PASS: job controller generates durable customer portal link PASS: portal link email share records honest sandbox message log PASS: portal SMS share validates mobile recipient before logging PASS: customer portal accepts active durable job token PASS: customer portal blocks revoked durable job token PASS: job detail template supports notes and portal sharing: /jobs/field-notes PASS: job detail template supports notes and portal sharing: /jobs/field-notes/update PASS: job detail template supports notes and portal sharing: /jobs/costs PASS: job detail template supports notes and portal sharing: /jobs/portal-link/generate PASS: job detail template supports notes and portal sharing: /jobs/portal-link/share PASS: job detail template supports notes and portal sharing: data-copy-portal-link PASS: job detail template supports notes and portal sharing: data-field-note-edit PASS: job detail template supports notes and portal sharing: Job cost ledger PASS: job notes and portal route is registered: 'POST /jobs/field-notes' PASS: job notes and portal route is registered: 'POST /jobs/field-notes/update' PASS: job notes and portal route is registered: 'POST /jobs/costs' PASS: job notes and portal route is registered: 'POST /jobs/portal-link/generate' PASS: job notes and portal route is registered: 'POST /jobs/portal-link/share' PASS: quote DB repository persists quotes and line items PASS: quote DB repository supports bounded index reads PASS: invoice DB repository persists invoices and line items PASS: invoice DB repository supports bounded index reads PASS: billing schedule validation accepts valid 50/50 data PASS: billing schedule validation blocks percentage totals over 100 PASS: billing schedule validation blocks fixed amounts over contract total PASS: billing schedule validation allows manager override for fixed overage PASS: billing schedule validation allows only one remaining balance point PASS: billing schedule calculates remaining balance point amount PASS: billing schedule summary calculates scheduled and ready amounts PASS: billing schedule DB repository persists schedule and billing points PASS: billing schedule DB repository finds schedule by quote PASS: billing schedule DB repository finds schedule by job PASS: billing schedule DB repository returns linked client name PASS: billing schedule DB repository enforces tenant scope PASS: billing schedule DB repository rejects saves for missing schedules PASS: invoice DB repository persists linked billing point id PASS: demo billing repository keeps billing point ids unique across schedules PASS: billing schedule templates include 50_50 PASS: billing schedule templates include 10_40_40_10 PASS: billing schedule templates include 30_40_30 PASS: billing schedule templates include monthly PASS: billing schedule templates include custom PASS: monthly billing template creates instalments with final balance point PASS: approved quote creates active billing schedule PASS: upfront billing point becomes ready when schedule activates PASS: billing point creates linked progress invoice PASS: billing point cannot be invoiced twice PASS: paid invoice updates linked billing point PASS: job completion trigger marks final billing point ready PASS: billing workflow writes audit log entries PASS: RBAC allows owner and manager billing actions PASS: RBAC limits supervisor billing override PASS: RBAC limits team member and trainee billing schedule access PASS: billing builder UI exposes Billing Plan Selector PASS: billing builder UI exposes Add billing point PASS: billing builder UI exposes Edit billing point PASS: billing builder UI exposes Delete billing point PASS: billing builder UI exposes Reorder by step number PASS: billing builder delete removes and renumbers rows: data-billing-delete-row PASS: billing builder delete removes and renumbers rows: row.remove() PASS: billing builder delete removes and renumbers rows: updateRows() PASS: billing builder delete removes and renumbers rows: countInput.value = String(rows.length) PASS: billing summary UI exposes Mark ready to invoice PASS: billing summary UI exposes Create invoice PASS: billing summary UI exposes Skip point PASS: billing summary UI exposes Cancel schedule PASS: quote form includes billing schedule builder PASS: billing route registered: POST /billing/schedules/job PASS: billing route registered: POST /billing/points/ready PASS: billing route registered: POST /billing/points/invoice PASS: billing route registered: POST /billing/points/skip PASS: billing route registered: POST /billing/schedules/cancel PASS: customer portal displays and accepts payment schedule PASS: customer portal forms use base-path-aware actions PASS: customer portal renderer avoids double-prefixed XAMPP form actions PASS: reports expose Scheduled future billing PASS: reports expose Ready to invoice PASS: reports expose Outstanding staged invoices PASS: reports expose Paid by billing point PASS: reports expose Remaining contract value PASS: reports expose Costed invoices PASS: reports expose Material cost captured PASS: reports expose Direct cost captured PASS: reports expose Purchase-order accrual PASS: reports expose Supplier invoice cost PASS: reports expose Contract Profitability PASS: reports expose Contract revenue PASS: reports expose Costed contracts PASS: reports expose Contract cost coverage PASS: reports expose Matched supplier invoices PASS: billing report calculates staged billing metrics PASS: team DB repository persists created team members PASS: team DB repository stores imported/manual team members with login disabled until invite acceptance PASS: team DB repository supports bounded index reads PASS: team DB repository persists team member edits PASS: team member validation accepts valid data PASS: team member validation rejects invalid data PASS: team member validation rejects unsupported role PASS: team service finds seeded member by email PASS: team service maps seeded member to edit form values PASS: team repository saves edits over seeded member without duplicates PASS: team index supports drill-in UI: /team/view?email= PASS: team index supports drill-in UI: /team/edit?email= PASS: team index supports drill-in UI: View PASS: team index supports drill-in UI: Edit PASS: team detail view contains Team member profile PASS: team detail view contains Access snapshot PASS: team detail view contains Edit member PASS: team edit form posts original member identity PASS: SaaS plan catalog includes trade and SaaS plans PASS: SaaS Basic plan is free in GBP PASS: SaaS Pro plan is GBP 30 per month PASS: SaaS Pro plan includes the 30-day free trial PASS: SaaS growth plan supports accounting integrations PASS: SaaS starter plan excludes advanced reports PASS: pricing configuration accepts international global settings PASS: pricing configuration persists defaults in demo repository PASS: pricing catalog applies currency and global discount PASS: pricing configuration falls back to enabled default currency PASS: pricing configuration rejects unsupported currencies PASS: pricing catalog applies active discount before expiry PASS: pricing catalog ignores expired global discounts PASS: database pricing repository persists global pricing settings in settings table PASS: database pricing repository stores one platform-level settings record PASS: database pricing repository resets global pricing settings PASS: pricing admin save redirects after valid settings PASS: pricing admin save writes global pricing audit log PASS: pricing admin reset redirects after reset PASS: pricing admin reset writes global pricing audit log PASS: platform admin overview summarizes SaaS tenants and revenue PASS: platform admin billing health reflects pricing settings PASS: platform admin exposes tenant list and operator actions PASS: platform admin marks live integration as contract tested but not live: Accounting providers PASS: platform admin marks live integration as contract tested but not live: Google Calendar PASS: platform admin marks live integration as contract tested but not live: Outlook Calendar PASS: platform admin marks LLM API as guarded contract tested PASS: platform admin marks platform invoicing as manual-review until payments are connected PASS: platform admin marks billing webhooks guarded behind provider configuration PASS: platform admin tenants cover status: trialing PASS: platform admin tenants cover status: active PASS: platform admin tenants cover status: past_due PASS: platform admin tenants cover status: suspended PASS: platform admin tenants cover status: expired_trial PASS: platform admin tenants cover plan: basic PASS: platform admin tenants cover plan: pro PASS: platform admin tenants include an explicit demo tenant PASS: platform admin navigation includes Dashboard PASS: platform admin navigation includes Tenants PASS: platform admin navigation includes Billing PASS: platform admin navigation includes Plans PASS: platform admin navigation includes Audit Logs PASS: platform admin navigation includes Demo Management PASS: platform admin navigation includes Import/Export PASS: platform admin navigation includes System Health PASS: platform admin navigation includes Support Access PASS: platform admin navigation includes Security PASS: platform admin navigation includes Mobile/Offline Status PASS: platform admin navigation anchors are unique PASS: platform admin navigation stays under platform-admin PASS: platform admin navigation does not create admin routes PASS: platform admin template contains section platform-dashboard PASS: platform admin template contains section platform-tenants PASS: platform admin template contains section platform-billing PASS: platform admin template contains section platform-plans PASS: platform admin template contains section platform-audit-logs PASS: platform admin template contains section platform-demo-management PASS: platform admin template contains section platform-import-export PASS: platform admin template contains section platform-system-health PASS: platform admin template contains section platform-support-access PASS: platform admin template contains section platform-security PASS: platform admin template contains section platform-mobile-offline PASS: system health snapshot includes app PASS: system health snapshot includes database PASS: system health snapshot includes session_auth PASS: system health snapshot includes background_jobs PASS: system health snapshot includes api_health PASS: system health snapshot includes storage PASS: system health snapshot includes mobile_offline_sync PASS: system health snapshot includes deployment_readiness PASS: system health overall status requires review while production probes are missing PASS: system health marks production probe as not configured: api_health PASS: system health marks production probe as not configured: storage PASS: system health marks production probe as not configured: mobile_offline_sync PASS: platform admin links to dedicated system health page PASS: system health page exposes App status PASS: system health page exposes Database status PASS: system health page exposes Session / auth status PASS: system health page exposes Background jobs PASS: system health page exposes API health PASS: system health page exposes Storage status PASS: system health page exposes Mobile / offline sync PASS: system health page exposes Deployment readiness PASS: system health page exposes Gate 7 deployment hardening table PASS: deployment readiness blocks unsafe production configuration PASS: deployment readiness blocks unsafe check: debug_disabled PASS: deployment readiness blocks unsafe check: app_secret PASS: deployment readiness blocks unsafe check: database_config PASS: deployment readiness blocks unsafe check: demo_disabled PASS: deployment readiness blocks unsafe check: public_https_url PASS: deployment readiness blocks unsafe check: secure_cookies PASS: deployment readiness blocks unsafe check: public_document_root PASS: deployment readiness can pass with complete production release evidence PASS: deployment readiness marks configured check ready: environment_mode PASS: deployment readiness marks configured check ready: debug_disabled PASS: deployment readiness marks configured check ready: app_secret PASS: deployment readiness marks configured check ready: database_config PASS: deployment readiness marks configured check ready: demo_disabled PASS: deployment readiness marks configured check ready: public_https_url PASS: deployment readiness marks configured check ready: secure_cookies PASS: deployment readiness marks configured check ready: trusted_proxy_policy PASS: deployment readiness marks configured check ready: public_document_root PASS: deployment readiness marks configured check ready: runtime_logging PASS: deployment readiness marks configured check ready: backup_restore PASS: deployment readiness marks configured check ready: monitoring_alerting PASS: deployment readiness marks configured check ready: rollback_plan PASS: deployment readiness marks configured check ready: ci_release_gate PASS: security admin snapshot includes session_policy PASS: security admin snapshot includes mfa_policy PASS: security admin snapshot includes password_policy PASS: security admin snapshot includes csp_checklist PASS: security admin snapshot includes data_export_requests PASS: security admin snapshot includes data_deletion_requests PASS: security admin snapshot includes tenant_isolation_checklist PASS: platform admin links to dedicated security page PASS: security admin page contains Session policy PASS: security admin page contains MFA PASS: security admin page contains Password policy PASS: security admin page contains CSP / security checklist PASS: security admin page contains Data export request log PASS: security admin page contains Data deletion request log PASS: security admin page contains Tenant isolation checklist PASS: mobile/offline snapshot includes native app readiness gate PASS: mobile/offline snapshot includes pwa PASS: mobile/offline snapshot includes capacitor_android PASS: mobile/offline snapshot includes capacitor_ios PASS: mobile/offline snapshot includes offline_sync_queue PASS: mobile/offline snapshot includes failed_sync PASS: mobile/offline snapshot includes app_version PASS: platform admin links to dedicated mobile/offline page PASS: mobile/offline page exposes PWA status PASS: mobile/offline page exposes Capacitor Android status PASS: mobile/offline page exposes Capacitor iOS status PASS: mobile/offline page exposes Offline sync queue count PASS: mobile/offline page exposes Failed sync PASS: mobile/offline page exposes App version PASS: mobile/offline page exposes Native app release gate PASS: mobile/offline page exposes Store readiness checks PASS: mobile/offline page exposes Required owner evidence PASS: mobile/offline page exposes Native commands PASS: main layout wires mobile/PWA shell: rel="manifest" PASS: main layout wires mobile/PWA shell: serviceWorker.register PASS: main layout wires mobile/PWA shell: data-fieldops-nav-toggle PASS: main layout wires mobile/PWA shell: app-sidebar-backdrop PASS: main layout wires mobile/PWA shell: apple-mobile-web-app-capable PASS: main layout cache-busts FieldOps app CSS after schedule layout changes PASS: PWA manifest exists PASS: PWA manifest is installable standalone PASS: PWA manifest defines app icons PASS: PWA manifest defines app shortcuts PASS: service worker supports offline PWA behavior: FIELDOPS_CACHE_VERSION PASS: service worker supports offline PWA behavior: offline.html PASS: service worker supports offline PWA behavior: request.mode === 'navigate' PASS: service worker supports offline PWA behavior: caches.open PASS: service worker cache version is bumped for schedule layout CSS refresh PASS: offline fallback page is present PASS: responsive mobile shell style exists: .app-sidebar.is-open PASS: responsive mobile shell style exists: .app-sidebar-backdrop PASS: responsive mobile shell style exists: .mobile-nav-toggle PASS: responsive mobile shell style exists: .pwa-status-pill PASS: responsive mobile shell style exists: -webkit-overflow-scrolling PASS: responsive mobile shell style exists: @media (max-width: 575.98px) PASS: offline mode limits team member workspace to assigned jobs PASS: offline mode uses tenant/user scoped browser storage key PASS: offline sync validation accepts assigned technician update PASS: offline sync validation accepts GPS check-in coordinates PASS: offline sync validation accepts customer signature capture PASS: offline sync validation accepts material usage capture PASS: offline sync validation rejects unassigned job update PASS: offline technician template contains data-offline-workspace PASS: offline technician template contains data-offline-queue-form PASS: offline technician template contains data-offline-sync-now PASS: offline technician template contains Save offline PASS: offline technician template contains Technician offline queue PASS: offline technician template contains data-offline-capture-location PASS: offline technician template contains signature_name PASS: offline technician template contains material_name PASS: offline technician script contains localStorage PASS: offline technician script contains FieldOpsOfflineQueue PASS: offline technician script contains fetch(syncEndpoint, PASS: offline technician script contains offline_payload PASS: offline technician script contains navigator.onLine PASS: offline technician script contains navigator.geolocation PASS: offline technician script contains material_quantity PASS: offline technician routes are registered PASS: production app wiring uses database-backed schedule appointments when PDO is available PASS: production app wiring uses database-backed SaaS admin repositories when PDO is available PASS: production app wiring uses database-backed import/export history when PDO is available PASS: demo role switching is explicit and does not silently promote demo users to platform admin PASS: main navigation links to offline mode PASS: main navigation is permission-filtered by role PASS: demo role identity exists for owner PASS: demo role identity exists for manager PASS: demo role identity exists for supervisor PASS: demo role identity exists for team_member PASS: demo role identity exists for trainee PASS: demo role identity exists for demo_user PASS: demo role identity exists for platform_admin PASS: unsupported demo role is rejected PASS: demo team member role seeds an assigned job fixture PASS: service worker caches offline technician route PASS: renderer prefixes root-relative script src for XAMPP base path PASS: offline sync API accepts valid queued update PASS: offline sync API reports accepted count PASS: offline sync API writes audit log PASS: mobile status marks Capacitor Android native build as blocked until owner evidence exists PASS: mobile status marks Capacitor iOS native build as blocked until owner evidence exists PASS: mobile readiness keeps app-store submission blocked without owner evidence PASS: mobile readiness has no local artifact failures PASS: mobile readiness records native/store owner-evidence blockers PASS: mobile readiness passes local artifact check pwa_manifest PASS: mobile readiness passes local artifact check service_worker PASS: mobile readiness passes local artifact check offline_technician PASS: mobile readiness passes local artifact check capacitor_package PASS: mobile readiness passes local artifact check capacitor_config PASS: mobile readiness passes local artifact check capacitor_shell PASS: mobile readiness blocks native/store check android_native_project PASS: mobile readiness blocks native/store check ios_native_project PASS: mobile readiness blocks native/store check android_signing PASS: mobile readiness blocks native/store check ios_signing PASS: mobile readiness blocks native/store check store_metadata PASS: mobile readiness blocks native/store check privacy_manifest PASS: mobile readiness blocks native/store check physical_device_qa PASS: composer exposes mobile-readiness script PASS: mobile readiness tool contains MobileAppReadinessService PASS: mobile readiness tool contains MOBILE_APP_READINESS_REPORT.md PASS: mobile readiness tool contains failure_count PASS: release gate tool contains composer_audit PASS: release gate tool contains http_route_harness PASS: release gate tool contains form_flow_harness PASS: release gate tool contains performance_smoke PASS: release gate tool contains mobile_readiness PASS: release gate tool contains mysql_isolation_smoke PASS: release gate tool contains mysql_volume_profile PASS: release gate tool contains RELEASE_GATE_REPORT.md PASS: release gate tool contains FIELDOPS_RELEASE_GATE_BROWSER PASS: HTTP route harness tool contains HTTP_ROUTE_HARNESS_REPORT.md PASS: HTTP route harness tool contains post_missing_csrf_403 PASS: HTTP route harness tool contains api_post_bypasses_csrf PASS: HTTP route harness tool contains POST /api/billing/stripe/webhook PASS: form-flow harness tool contains FORM_FLOW_HARNESS_REPORT.md PASS: form-flow harness tool contains client_create_side_effect PASS: form-flow harness tool contains schedule_booking_side_effect PASS: form-flow harness tool contains platform_tenant_action_side_effect PASS: import/export history repository contains recordValidationReport PASS: import/export history repository contains recordImportJob PASS: import/export history repository contains markImportJobUndone PASS: import/export history repository contains recordExportJob PASS: import/export history repository contains queueImportRetry PASS: import/export history repository contains claimQueuedImportRetry PASS: import/export history repository contains markQueuedImportRetryFailed PASS: import/export history repository contains dashboard PASS: platform admin status map contains import retry state queued_retry PASS: platform admin status map contains import retry state retry_in_progress PASS: platform admin status map contains import retry state retry_failed PASS: platform admin status map contains import retry state failed_rolled_back PASS: platform admin status map contains import retry state replay_queued PASS: platform admin status map contains import retry state replay_in_progress PASS: platform admin status map contains import retry state replay_completed PASS: platform admin status map contains import retry state replay_failed PASS: MySQL isolation smoke tool contains TenantReferenceGuard PASS: MySQL isolation smoke tool contains MYSQL_TENANT_ISOLATION_SMOKE_REPORT.md PASS: MySQL isolation smoke tool contains FIELDOPS_MYSQL_HOST PASS: MySQL isolation smoke tool contains Job create rejects cross-tenant client PASS: MySQL volume profile tool contains MYSQL_VOLUME_PROFILE_REPORT.md PASS: MySQL volume profile tool contains FIELDOPS_MYSQL_VOLUME_CLIENTS PASS: MySQL volume profile tool contains idx_jobs_tenant_status_schedule PASS: MySQL volume profile tool contains appointments_week PASS: schema contains operational index idx_clients_tenant_created PASS: schema contains operational index idx_jobs_tenant_status_schedule PASS: schema contains operational index idx_quotes_tenant_number PASS: schema contains operational index idx_invoices_tenant_status_due PASS: schema contains operational index idx_inventory_movements_tenant_job_created PASS: schema contains operational index idx_job_cost_entries_tenant_job_date PASS: schema contains operational index idx_timesheet_entries_tenant_job_date PASS: schema contains operational index idx_timesheet_entries_tenant_contract_date PASS: schema contains operational index idx_purchase_orders_tenant_job_ordered PASS: schema contains operational index idx_supplier_invoices_tenant_po_invoice PASS: schema contains operational index idx_supplier_invoices_tenant_job_invoice PASS: schema contains operational index idx_supplier_invoice_lines_tenant_invoice PASS: schema contains operational index idx_import_jobs_tenant_created PASS: schema contains operational index idx_import_validation_tenant_idempotency PASS: schema contains operational index idx_export_jobs_tenant_created