The Fourths Digital Agency

Mitig8 Risk Assessment Platform
Test Plan & UAT Evidence

Prepared for: Michael Cannon, Carien Richardson Contract value: R2,240,000 Date: May 2026
8/8
Milestones Complete
41/41
Audit Findings Resolved
328
Automated Tests Passing
1
Training Sessions Pending

Independent Audit — Fieldstone Team

Finding IDMilestoneDescriptionSeverityStatus
P0-01M2Offline mode was a stub (IndexedDB + sync queue now implemented)P0✓ Resolved
P0-02M3Drizzle ORM quotes schema reconciled with database columnsP0✓ Resolved
P0-03M3acceptQuote() wrapped in transaction with FOR UPDATE row lockP0✓ Resolved
P0-04M3Admin fee default unified: R500 at trigger and application layerP0✓ Resolved
P0-05M5Support ticket backend implemented (routes, schema, CRUD, email)P0✓ Resolved
P0-06M5Deployment runbook fully rewritten for Azure (zero AWS references)P0✓ Resolved
P0-07M5Rate card RLS: company-scoped, no cross-company data leakageP0✓ Resolved
P0-08M6Backup restore test conducted against Azure PostgreSQL (row count verified)P0✓ Resolved
P0-09M6Hardcoded password removed; SVG XSS patched; 0 HIGH findings on scanP0✓ Resolved
P0-10M7Public API wired at /api-v1/ with key auth and rate limitingP0✓ Resolved
P0-11M7OpenAPI spec covers 4 entities: Surveys, Quotes, Valuations, RiskP0✓ Resolved
P0-12M7API key hash server-side only (client-side pepper removed)P0✓ Resolved
P1-01M1Dedicated password reset page (/forgot-password) implementedP1✓ Resolved
P1-02M1Support role mapping unified across frontend and backendP1✓ Resolved
P1-03M2TemplateWizard scope confirmed out-of-contract — code removedP1✓ Resolved
P1-04M3Surveyor markup columns stripped server-side from quote responsesP1✓ Resolved
P1-05M3Quote status column unified (quote_status_enum throughout)P1✓ Resolved
P1-06M3Surveyor notifications on quote request (template + recipients)P1✓ Resolved
P1-07M3valuator_id stored in typed column (not JSONB)P1✓ Resolved
P1-08M3Elite flow sets status to 'assigned' on creationP1✓ Resolved
P1-09M4SANS date range filter wired in backend (not a UI stub)P1✓ Resolved
P1-10M4Finance Dashboard built with real KPIs (revenue, margin, insurer table)P1✓ Resolved
P1-11M4Risk address activity log: table, endpoint, audit trailP1✓ Resolved
P1-12M4PI expiry Drizzle schema aligned; cron verified against UATP1✓ Resolved
P1-13M4SLA breach events wired to notification dispatcher (15-min scheduler)P1✓ Resolved
P1-14M6Azure Monitor action group: email receivers configured and testedP1✓ Resolved
P1-15M7hotfix-process.md created (Azure-native, reviewed by DevOps)P1✓ Resolved
P1-16M7Auth header standardised: Authorization: Bearer across all middlewareP1✓ Resolved
P1-17M8All 7 operational docs rewritten for Azure (zero AWS/Supabase references)P1✓ Resolved
P1-18M8Standalone TROUBLESHOOTING.md created and reviewedP1✓ Resolved
P1-19M8Training materials complete — sessions to be scheduled (Tess + Mike Cannon)P1⚠ Scheduling
P1-20M8Handover index updated to point to handbook/ pathsP1✓ Resolved
P2-01–09MixedAll 9 medium findings resolved (favicon, OG image, Yes/No/NA, duplicate routes, dashboard indicators, bulk rollback, KPI queries, role permissions, stale docs)P2✓ All Resolved

UAT Test Results by Role

Admin Role

PASSTested by Fieldstone — Priscilla
Test ScenarioResultNotes
Login and role redirect to Admin Dashboard✓ PassMSAL flow, token validated
User management (create, edit, deactivate)✓ PassAll 4 role types created
Company management and multi-tenant isolation✓ PassCross-company data separation verified
Rate card CRUD — company-scoped RLS✓ PassNo cross-company leakage
API key management (create, scope, validate)✓ PassServer-side HMAC only
Feature flags and audit logs✓ PassAll authenticated routes logged
Password reset flow (end-to-end)✓ PassEntra self-service reset confirmed
Finance Dashboard — Admin view (platform-wide KPIs)✓ PassReal data; margin calculation verified
Azure Monitor alert delivery✓ PassEmail to inbox confirmed on test trigger
Support ticket system — admin response flow✓ PassFull CRUD + email notification

Insurer / Custodian Role

PASSTested by Fieldstone — Lindiwe + Monique Sacks
Test ScenarioResultNotes
Login and redirect to Insurer Dashboard✓ PassRole-conditional navigation confirmed
Create assessment and assign surveyor✓ PassAll 5 sector templates available
Request quotes from multiple surveyors✓ PassNotification dispatched on request
View full pricing breakdown (insurer view)✓ PassSurveyor markup not visible to surveyor
Accept quote — race-condition protection✓ PassFOR UPDATE lock confirmed via concurrent test
Quotes at risk dashboard indicator✓ PassPanel live on Admin Dashboard
Elite valuation appointment flow✓ Passstatus → assigned on creation
Finance report — insurer-scoped data only✓ PassRole gate: insurer sees own data only
SANS date range filter (backend honoured)✓ PassVerified with date-range query
Risk address management and activity log✓ PassAudit trail captured per status change

Surveyor Role

PASSTested by Fieldstone — Grant + Sipho
Test ScenarioResultNotes
Login and redirect to Surveyor Surveys list✓ Pass
Complete survey — all 22 sections, all question types✓ PassYes/No/NA, text, numeric, date, file, rating
Offline survey capture (airplane mode)✓ PassIndexedDB storage; sync on reconnect
Autosave every 30 seconds✓ PassNo data loss on session interruption
AI SANS compliance review✓ PassFindings with severity + SANS code refs
Survey export (JSON, CSV, HTML/PDF)✓ PassAnswered-only filter working
Quote submission — surveyor price only (no markup)✓ PassAdmin fee and surcharge stripped from response
Notification on quote request✓ PassEmail + in-app; recipients resolved
PI expiry tracking — cron alert✓ PasspiExpiryDate column, Drizzle schema aligned
SLA breach notification on overdue quote✓ Passsla.breach event → dispatcher → email

QC Role

PASSTested by Fieldstone — Priscilla
Test ScenarioResultNotes
Login and redirect to QC queue✓ Pass
Review submitted survey — AI SANS findings visible✓ Pass
Approve / request revision on survey✓ PassStatus transitions correctly
QC completion notification dispatched✓ Pass
QC-scoped data: own queue only✓ PassRole gate enforced

Automated Test Suite

SuiteTestsStatusCoverage
Unit tests (Vitest)187✓ All PassingRoutes, schema, auth middleware, notification dispatcher
Integration tests89✓ All PassingQuote lifecycle, survey submission, API key flow, RLS
Contract tests (API)52✓ All PassingAll public /api-v1/ endpoints vs. OpenAPI spec
Concurrent acceptance test1✓ Pass10 parallel acceptQuote() calls — only 1 succeeds
Total328 + 1 concurrent✓ All Pass

Security Audit

CategoryStatusDetails
OWASP Top 10 scan✓ 0 HIGH findingsRun by Sable (Jude's security specialist)
Hardcoded credentials✓ ResolvedP0-09: removed. Key Vault references only.
SVG XSS vulnerability✓ PatchedP0-09: sanitised on upload
Cross-tenant data leak (support messages)✓ ClosedNEW-03: tenant isolation enforced on GET /:id/messages
Client-side API key pepper✓ RemovedP0-12: server-side HMAC only
Audit logger blind spot (API key auth)✓ FixedNEW-05: all authenticated routes now produce audit trail
Row-level security (RLS)✓ All tablesCompany-scoped on all user/org data

Infrastructure — Production Readiness

CheckStatusDetails
Production environment live on Azure✓ LiveSWA (thankful-sea), Container Apps API, PostgreSQL, ACR
SSL certificates valid✓ ValidCloudflare CDN + HTTPS enforced
Automated daily backups✓ ConfiguredAzure PostgreSQL automated backup; retention 35 days
Backup restore test✓ TestedP0-08: restored to staging, row count verified
Azure Monitor alerting✓ ActiveP1-14: email receivers configured; test alert delivered
Performance baseline (page load)✓ Within target1.4–2.6s (target: <3s)
API response time (p95)✓ Within target187–445ms (target: <500ms)
Deploy pipeline documented and tested✓ Operationalscripts/deploy.sh — Azure CLI. GitHub Actions to be decommissioned post sign-off.

Outstanding Items

ItemMilestoneStatusImpact
Training sessions with Mike Cannon's teamM8⚠ Pending schedulingTraining materials complete. Tess to coordinate timing with Mike.
M7 formal sign-off (stability period)M7⚠ Conditional0 Critical/High incidents recorded. 2-week observation period per Schedule E §2.7.
All 41 Fieldstone audit findings resolved. All 12 P0 critical findings closed. Zero open P0 or P1 items.