{
  "synthetic_sample": true,
  "note": "Synthetic sample data published by 9jatesters to show the report format. The app under test, DemoPay NG, is fictional. No real client, tester, or session is represented. Tester references are anonymised placeholders.",
  "report": "Nigeria usability report (sample)",
  "session": {
    "id": "SES-2026-0614-0142",
    "date": "2026-06-14",
    "start_time": "10:32",
    "timezone": "WAT",
    "duration_minutes": 34,
    "location": "Surulere, Lagos, Nigeria",
    "network": "4G (Glo)",
    "app": {
      "name": "DemoPay NG (fictional)",
      "version": "2.4.1",
      "build": 241
    },
    "tester": {
      "ref": "T-0142",
      "verification": "bank-verified",
      "languages": ["English", "Pidgin"]
    }
  },
  "device": {
    "model": "Infinix Hot 30i",
    "os": "Android 13",
    "form_factor": "phone",
    "ownership": "tester personal device"
  },
  "cohort": [
    { "tester_ref": "T-0142", "city": "Lagos (Surulere)", "device": "Infinix Hot 30i", "os": "Android 13", "carrier": "Glo", "verification": "bank-verified" },
    { "tester_ref": "T-0143", "city": "Abuja", "device": "Samsung Galaxy A14", "os": "Android 14", "carrier": "Airtel", "verification": "bank-verified" },
    { "tester_ref": "T-0144", "city": "Ibadan", "device": "Tecno Spark 10", "os": "Android 13", "carrier": "MTN", "verification": "bank-verified" },
    { "tester_ref": "T-0145", "city": "Port Harcourt", "device": "Nokia C21", "os": "Android 12 (Go)", "carrier": "Glo", "verification": "bank-verified" }
  ],
  "findings": [
    {
      "id": "F-01",
      "severity": "critical",
      "title": "Transfer PIN modal reverts to empty entry while the debit is still processing",
      "device": "Infinix Hot 30i, Android 13, 4G (Glo)",
      "tester_ref": "T-0142",
      "timestamp_in_recording": "07:41",
      "network_dependent": true,
      "steps_to_reproduce": [
        "Log in and open Transfer.",
        "Enter a recipient account and an amount of NGN 5,000.",
        "Tap Send and enter the transaction PIN.",
        "Wait on 4G while the signal drops to one bar."
      ],
      "expected": "A visible processing state stays on screen until the gateway confirms success or failure.",
      "actual": "After about 12 seconds the PIN modal clears back to empty entry with no message. The tester re-entered the PIN, which risks a double debit on a still-processing transfer.",
      "recommendation": "Hold the processing state, disable PIN re-entry until the gateway responds, and de-duplicate transfer requests with an idempotency key."
    },
    {
      "id": "F-02",
      "severity": "high",
      "title": "OTP screen dead-ends when the resend countdown expires on slow 3G",
      "device": "Infinix Hot 30i, 3G (Glo, congested cell)",
      "tester_ref": "T-0142",
      "timestamp_in_recording": "04:12",
      "network_dependent": true,
      "steps_to_reproduce": [
        "Sign up with a new phone number.",
        "Wait for the SMS OTP on a congested 3G cell.",
        "Let the 60 second countdown expire before the SMS arrives.",
        "Tap Resend code."
      ],
      "expected": "Resend requests a new OTP and restarts the countdown, or the screen offers a way back.",
      "actual": "Resend stays disabled after the countdown hits zero and the screen has no back action. The tester recovered only by force-closing the app. An emulator on office Wi-Fi cannot reproduce this; it needs a real SIM on a congested cell.",
      "recommendation": "Re-enable Resend the moment the countdown ends, add a back affordance, and time out gracefully with a clear retry path."
    },
    {
      "id": "F-03",
      "severity": "high",
      "title": "KYC document upload fails silently at 90 percent when the connection drops",
      "device": "Tecno Spark 10, Android 13, 4G (MTN)",
      "tester_ref": "T-0144",
      "timestamp_in_recording": "11:05",
      "network_dependent": true,
      "steps_to_reproduce": [
        "Open KYC and photograph the ID card.",
        "Tap Upload on 4G.",
        "Move to a weaker signal spot mid-upload, as a commuting user would."
      ],
      "expected": "The app reports the failed upload within seconds, keeps the captured photo, and offers retry.",
      "actual": "The progress bar sits at 90 percent indefinitely. Leaving the screen loses the photo and KYC shows pending with nothing queued. Transfer stayed blocked for the rest of the session.",
      "recommendation": "Upload in resumable chunks, surface failure within 30 seconds, and cache the captured image so retry does not restart from the camera."
    },
    {
      "id": "F-04",
      "severity": "medium",
      "title": "Airtime amount field rejects comma-formatted input with a generic error",
      "device": "Samsung Galaxy A14, Android 14, 4G (Airtel)",
      "tester_ref": "T-0143",
      "timestamp_in_recording": "18:47",
      "network_dependent": false,
      "steps_to_reproduce": [
        "Open Airtime.",
        "Type 5,000 with a comma, the same way the app formats money on its own receipt screens.",
        "Tap Buy airtime."
      ],
      "expected": "The field accepts or auto-formats the comma, or validation says exactly what to fix.",
      "actual": "A generic toast saying something went wrong appears and nothing marks the field. Two of eight testers gave up at this step.",
      "recommendation": "Strip separators before validation and show field-level errors instead of a global toast."
    },
    {
      "id": "F-05",
      "severity": "low",
      "title": "Back button after logout briefly shows the cached dashboard",
      "device": "Samsung Galaxy A14, Android 14",
      "tester_ref": "T-0143",
      "timestamp_in_recording": "27:19",
      "network_dependent": false,
      "steps_to_reproduce": [
        "Log out from Settings.",
        "On the login screen, press the Android back button."
      ],
      "expected": "The session is cleared and the login screen stays in place.",
      "actual": "The previous dashboard, including the account balance, renders for about two seconds before redirecting back to login.",
      "recommendation": "Clear the navigation back stack on logout and gate the dashboard route on a live session check."
    }
  ],
  "cases": [
    { "case": "Install from Play Store", "finding_ref": null, "results": { "Infinix Hot 30i": "pass", "Tecno Spark 10": "pass", "Samsung Galaxy A14": "pass" } },
    { "case": "First launch", "finding_ref": null, "results": { "Infinix Hot 30i": "pass", "Tecno Spark 10": "pass", "Samsung Galaxy A14": "pass" } },
    { "case": "Sign-up", "finding_ref": null, "results": { "Infinix Hot 30i": "pass", "Tecno Spark 10": "pass", "Samsung Galaxy A14": "pass" } },
    { "case": "OTP verification", "finding_ref": "F-02", "results": { "Infinix Hot 30i": "fail", "Tecno Spark 10": "pass", "Samsung Galaxy A14": "pass" } },
    { "case": "KYC upload", "finding_ref": "F-03", "results": { "Infinix Hot 30i": "pass", "Tecno Spark 10": "fail", "Samsung Galaxy A14": "pass" } },
    { "case": "Transfer", "finding_ref": "F-01", "results": { "Infinix Hot 30i": "fail", "Tecno Spark 10": "blocked", "Samsung Galaxy A14": "pass" } },
    { "case": "Airtime purchase", "finding_ref": "F-04", "results": { "Infinix Hot 30i": "pass", "Tecno Spark 10": "pass", "Samsung Galaxy A14": "fail" } },
    { "case": "Logout", "finding_ref": "F-05", "results": { "Infinix Hot 30i": "pass", "Tecno Spark 10": "pass", "Samsung Galaxy A14": "fail" } }
  ],
  "totals": {
    "case_runs": 24,
    "pass": 18,
    "fail": 5,
    "blocked": 1
  }
}
