{
  "summary": {
    "project": "visaready",
    "env": "sit",
    "runId": "20260711180241",
    "baseUrl": "https://visaready-sit.winds-os.com",
    "total": 74,
    "passed": 74,
    "failed": 0,
    "byArea": {
      "auth": {
        "total": 8,
        "passed": 8
      },
      "masters": {
        "total": 3,
        "passed": 3
      },
      "validation": {
        "total": 6,
        "passed": 6
      },
      "scoring": {
        "total": 9,
        "passed": 9
      },
      "crud": {
        "total": 5,
        "passed": 5
      },
      "documents": {
        "total": 4,
        "passed": 4
      },
      "payment": {
        "total": 7,
        "passed": 7
      },
      "rbac": {
        "total": 3,
        "passed": 3
      },
      "integrations": {
        "total": 2,
        "passed": 2
      },
      "profile": {
        "total": 3,
        "passed": 3
      },
      "workflow": {
        "total": 15,
        "passed": 15
      },
      "ui": {
        "total": 9,
        "passed": 9
      }
    }
  },
  "results": [
    {
      "id": "TC-A01",
      "title": "OTP request succeeds for a new email with a resend timer",
      "area": "auth",
      "srs_ref": "VR-4.2",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/auth/request-otp",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 55
    },
    {
      "id": "TC-A02",
      "title": "Correct OTP signs the user in and creates a customer account",
      "area": "auth",
      "srs_ref": "VR-4.2",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/auth/request-otp",
          "ok": true
        },
        {
          "name": "POST /api/auth/verify-otp",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 25
    },
    {
      "id": "TC-A03",
      "title": "Wrong OTP is rejected",
      "area": "auth",
      "srs_ref": "VR-4.2",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/auth/request-otp",
          "ok": true
        },
        {
          "name": "POST /api/auth/verify-otp",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 19
    },
    {
      "id": "TC-A04",
      "title": "OTP verify without a prior request is rejected as expired",
      "area": "auth",
      "srs_ref": "VR-4.2",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/auth/verify-otp",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 8
    },
    {
      "id": "TC-A05",
      "title": "Empty identifier is rejected with a helpful message",
      "area": "auth",
      "srs_ref": "VR-4.2",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/auth/request-otp",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 2
    },
    {
      "id": "TC-A06",
      "title": "Session token identifies the signed-in customer on /auth/me",
      "area": "auth",
      "srs_ref": "VR-4.2",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "GET /api/auth/me",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 23
    },
    {
      "id": "TC-A07",
      "title": "Protected APIs refuse anonymous access",
      "area": "auth",
      "srs_ref": "VR-4.2",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "GET /api/application",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 2
    },
    {
      "id": "TC-A08",
      "title": "Mobile-number OTP login is enabled",
      "area": "auth",
      "srs_ref": "VR-4.2",
      "kind": "api",
      "priority": "P3",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/auth/request-otp",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 6
    },
    {
      "id": "TC-M01",
      "title": "Country master is seeded and searchable",
      "area": "masters",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "GET /api/country?page=1&limit=100",
          "ok": true
        },
        {
          "name": "GET /api/country?q=India",
          "ok": true
        },
        {
          "name": "GET /api/country?q=France",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 29
    },
    {
      "id": "TC-M02",
      "title": "Plans master is seeded (Lite / Starter / Advance …)",
      "area": "masters",
      "srs_ref": "VR-4.15",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "GET /api/plan?page=1&limit=50",
          "ok": true
        },
        {
          "name": "GET /api/plan?q=Starter",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 18
    },
    {
      "id": "TC-M03",
      "title": "Document checklist master is seeded",
      "area": "masters",
      "srs_ref": "VR-4.14",
      "kind": "api",
      "priority": "P3",
      "ok": true,
      "steps": [
        {
          "name": "GET /api/doc_requirement?page=1&limit=100",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 9
    },
    {
      "id": "TC-V01",
      "title": "Passport number format is enforced (8–9 uppercase alphanumerics)",
      "area": "validation",
      "srs_ref": "VR-4.7",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/application",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 7
    },
    {
      "id": "TC-V02",
      "title": "PIN code must be 6 digits",
      "area": "validation",
      "srs_ref": "VR-4.9",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/application",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 5
    },
    {
      "id": "TC-V03",
      "title": "Travel end date cannot be before the start date (cross-field)",
      "area": "validation",
      "srs_ref": "VR-4.8",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/application",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 5
    },
    {
      "id": "TC-V04",
      "title": "Required fields are enforced on application create",
      "area": "validation",
      "srs_ref": "VR-4.9",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/application",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 3
    },
    {
      "id": "TC-V05",
      "title": "GSTIN format is validated when provided",
      "area": "validation",
      "srs_ref": "VR-4.9",
      "kind": "api",
      "priority": "P3",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/application",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 14
    },
    {
      "id": "TC-V06",
      "title": "Passport expiry must be after the issue date (cross-field)",
      "area": "validation",
      "srs_ref": "VR-4.7",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/application",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 6
    },
    {
      "id": "TC-S01",
      "title": "Customer can create a complete application (draft)",
      "area": "scoring",
      "srs_ref": "VR-4.7",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/application",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 20
    },
    {
      "id": "TC-S02",
      "title": "VisaScore Lite — strong profile scores High (≥85)",
      "area": "scoring",
      "srs_ref": "VR-4.13",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/flows/generate_lite_score/run",
          "ok": true
        },
        {
          "name": "GET /api/application/60",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 46
    },
    {
      "id": "TC-S03",
      "title": "Scoring is blocked until the return declaration is confirmed",
      "area": "scoring",
      "srs_ref": "VR-4.12",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/application",
          "ok": true
        },
        {
          "name": "POST /api/flows/generate_lite_score/run",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 33
    },
    {
      "id": "TC-S04",
      "title": "VisaScore Lite — weak profile lands in the Low band (≤30)",
      "area": "scoring",
      "srs_ref": "VR-4.13",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/application",
          "ok": true
        },
        {
          "name": "POST /api/flows/generate_lite_score/run",
          "ok": true
        },
        {
          "name": "GET /api/application/62",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 71
    },
    {
      "id": "TC-S05",
      "title": "Final VisaScore — full lifecycle to Strong Readiness with VisaMatrix report",
      "area": "scoring",
      "srs_ref": "VR-4.16",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/application/60/transition",
          "ok": true
        },
        {
          "name": "POST /api/application/60/transition",
          "ok": true
        },
        {
          "name": "POST /api/flows/generate_final_score/run",
          "ok": true
        },
        {
          "name": "GET /api/application/60",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 129
    },
    {
      "id": "TC-S06",
      "title": "One free score regeneration is allowed",
      "area": "scoring",
      "srs_ref": "VR-5.3",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/flows/regenerate_score/run",
          "ok": true
        },
        {
          "name": "GET /api/application/60",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 65
    },
    {
      "id": "TC-S07",
      "title": "A second regeneration is refused (2 scores total)",
      "area": "scoring",
      "srs_ref": "VR-5.3",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/flows/regenerate_score/run",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 7
    },
    {
      "id": "TC-S08",
      "title": "Every final score writes a VisaMatrix report record",
      "area": "scoring",
      "srs_ref": "VR-4.16",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "GET /api/visa_report?page=1&limit=50",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 10
    },
    {
      "id": "TC-S09",
      "title": "Lifecycle-button path also produces the Lite score (transition + async flow)",
      "area": "scoring",
      "srs_ref": "VR-4.13",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/application",
          "ok": true
        },
        {
          "name": "POST /api/application/63/transition",
          "ok": true
        },
        {
          "name": "GET /api/application/63",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 105
    },
    {
      "id": "TC-C01",
      "title": "Applications are searchable by title",
      "area": "crud",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "GET /api/application?q=QA%20Strong%2020260711180241",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 9
    },
    {
      "id": "TC-C02",
      "title": "List pagination respects the limit",
      "area": "crud",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "GET /api/application?page=1&limit=2",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 9
    },
    {
      "id": "TC-C03",
      "title": "Application fields can be updated (PATCH)",
      "area": "crud",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "PATCH /api/application/60",
          "ok": true
        },
        {
          "name": "GET /api/application/60",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 38
    },
    {
      "id": "TC-C04",
      "title": "Deleting an application removes it from lists (soft delete)",
      "area": "crud",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/application",
          "ok": true
        },
        {
          "name": "DELETE /api/application/64",
          "ok": true
        },
        {
          "name": "GET /api/application?q=QAScratch20260711180241",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 48
    },
    {
      "id": "TC-C05",
      "title": "Fetching a non-existent application returns 404",
      "area": "crud",
      "kind": "api",
      "priority": "P3",
      "ok": true,
      "steps": [
        {
          "name": "GET /api/application/999999",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 6
    },
    {
      "id": "TC-D01",
      "title": "Customer can attach a document to their application",
      "area": "documents",
      "srs_ref": "VR-4.14",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/document",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 14
    },
    {
      "id": "TC-D02",
      "title": "Document can be verified (uploaded → verified)",
      "area": "documents",
      "srs_ref": "VR-4.14",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/document/32/transition",
          "ok": true
        },
        {
          "name": "GET /api/document/32",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 16
    },
    {
      "id": "TC-D03",
      "title": "Admin can flag a document",
      "area": "documents",
      "srs_ref": "VR-4.14",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/document",
          "ok": true
        },
        {
          "name": "PATCH /api/document/33",
          "ok": true
        },
        {
          "name": "POST /api/document/33/transition",
          "ok": true
        },
        {
          "name": "GET /api/document/33",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 46
    },
    {
      "id": "TC-D04",
      "title": "Customer cannot flag documents (admin-only transition)",
      "area": "documents",
      "srs_ref": "VR-4.14",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/document",
          "ok": true
        },
        {
          "name": "POST /api/document/34/transition",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 17
    },
    {
      "id": "TC-P01",
      "title": "Admin can register an agency",
      "area": "payment",
      "srs_ref": "VR-4.5",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/agency",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 12
    },
    {
      "id": "TC-P02",
      "title": "Admin approves the agency (KYC → active)",
      "area": "payment",
      "srs_ref": "VR-4.5",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/agency/16/transition",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 13
    },
    {
      "id": "TC-P03",
      "title": "Admin issues a promo code allocated to the agency",
      "area": "payment",
      "srs_ref": "VR-4.15",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/promo_code",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 11
    },
    {
      "id": "TC-P04",
      "title": "Valid promo waives the fee and issues an invoice",
      "area": "payment",
      "srs_ref": "VR-4.15",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/payment",
          "ok": true
        },
        {
          "name": "POST /api/flows/apply_promo/run",
          "ok": true
        },
        {
          "name": "GET /api/payment/47",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 72
    },
    {
      "id": "TC-P05",
      "title": "Unknown promo code is rejected with guidance",
      "area": "payment",
      "srs_ref": "VR-4.15",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/payment",
          "ok": true
        },
        {
          "name": "POST /api/flows/apply_promo/run",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 17
    },
    {
      "id": "TC-P06",
      "title": "Applying promo without a code tells the user to enter one",
      "area": "payment",
      "srs_ref": "VR-4.15",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/payment",
          "ok": true
        },
        {
          "name": "POST /api/flows/apply_promo/run",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 20
    },
    {
      "id": "TC-P07",
      "title": "Successful payment triggers automatic invoice issuance",
      "area": "payment",
      "srs_ref": "VR-4.15",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/payment/49/transition",
          "ok": true
        },
        {
          "name": "GET /api/payment/49",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 1027
    },
    {
      "id": "TC-R01",
      "title": "Customer cannot approve agencies (admin-only lifecycle)",
      "area": "rbac",
      "srs_ref": "VR-4.5",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/agency",
          "ok": true
        },
        {
          "name": "POST /api/agency/17/transition",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 13
    },
    {
      "id": "TC-R02",
      "title": "Flows cannot be triggered anonymously",
      "area": "rbac",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/flows/generate_final_score/run",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 1
    },
    {
      "id": "TC-R03",
      "title": "SIT header-auth backdoor works for admin (must be OFF outside SIT)",
      "area": "rbac",
      "kind": "api",
      "priority": "P3",
      "ok": true,
      "steps": [
        {
          "name": "GET /api/auth/me",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 2
    },
    {
      "id": "TC-I01",
      "title": "Signed-in users can upload files (storage slot → R2)",
      "area": "integrations",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/upload",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 149
    },
    {
      "id": "TC-I02",
      "title": "Anonymous users cannot upload files",
      "area": "integrations",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/upload",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 2
    },
    {
      "id": "TC-F01",
      "title": "Customer can create their applicant profile",
      "area": "profile",
      "srs_ref": "VR-4.6",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/applicant_profile",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 10
    },
    {
      "id": "TC-F02",
      "title": "Duplicate profile email is rejected cleanly (unique)",
      "area": "profile",
      "srs_ref": "VR-4.6",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/applicant_profile",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 8
    },
    {
      "id": "TC-F03",
      "title": "First name must be at least 2 characters",
      "area": "profile",
      "srs_ref": "VR-4.6",
      "kind": "api",
      "priority": "P3",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/applicant_profile",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 4
    },
    {
      "id": "TC-W01",
      "title": "Workflow: full customer journey draft → lite → docs → paid → final → embassy → approved",
      "area": "workflow",
      "srs_ref": "VR-2.2",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/application",
          "ok": true
        },
        {
          "name": "POST /api/flows/generate_lite_score/run",
          "ok": true
        },
        {
          "name": "POST /api/document",
          "ok": true
        },
        {
          "name": "POST /api/document",
          "ok": true
        },
        {
          "name": "POST /api/document/35/transition",
          "ok": true
        },
        {
          "name": "POST /api/document/36/transition",
          "ok": true
        },
        {
          "name": "POST /api/application/65/transition",
          "ok": true
        },
        {
          "name": "POST /api/application/65/transition",
          "ok": true
        },
        {
          "name": "POST /api/flows/generate_final_score/run",
          "ok": true
        },
        {
          "name": "GET /api/application/65",
          "ok": true
        },
        {
          "name": "POST /api/application/65/transition",
          "ok": true
        },
        {
          "name": "PATCH /api/application/65",
          "ok": true
        },
        {
          "name": "POST /api/application/65/transition",
          "ok": true
        },
        {
          "name": "GET /api/application/65",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 327
    },
    {
      "id": "TC-W02",
      "title": "Workflow: rejection path ends in terminal rejected status",
      "area": "workflow",
      "srs_ref": "VR-4.17",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/application",
          "ok": true
        },
        {
          "name": "POST /api/flows/generate_lite_score/run",
          "ok": true
        },
        {
          "name": "POST /api/application/66/transition",
          "ok": true
        },
        {
          "name": "POST /api/application/66/transition",
          "ok": true
        },
        {
          "name": "POST /api/flows/generate_final_score/run",
          "ok": true
        },
        {
          "name": "POST /api/application/66/transition",
          "ok": true
        },
        {
          "name": "POST /api/application/66/transition",
          "ok": true
        },
        {
          "name": "GET /api/application/66",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 190
    },
    {
      "id": "TC-W03",
      "title": "Workflow: customer submits to agent, agent forwards to embassy (role interplay)",
      "area": "workflow",
      "srs_ref": "VR-4.5",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/application",
          "ok": true
        },
        {
          "name": "POST /api/flows/generate_lite_score/run",
          "ok": true
        },
        {
          "name": "POST /api/application/67/transition",
          "ok": true
        },
        {
          "name": "POST /api/application/67/transition",
          "ok": true
        },
        {
          "name": "POST /api/flows/generate_final_score/run",
          "ok": true
        },
        {
          "name": "POST /api/application/67/transition",
          "ok": true
        },
        {
          "name": "POST /api/application/67/transition",
          "ok": true
        },
        {
          "name": "GET /api/application/67",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 223
    },
    {
      "id": "TC-W04",
      "title": "Workflow: agency code is validated — valid code maps, unknown code errors",
      "area": "workflow",
      "srs_ref": "VR-4.13",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "PATCH /api/application/67",
          "ok": true
        },
        {
          "name": "POST /api/flows/map_agency_code/run",
          "ok": true
        },
        {
          "name": "PATCH /api/application/67",
          "ok": true
        },
        {
          "name": "POST /api/flows/map_agency_code/run",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 92
    },
    {
      "id": "TC-W05",
      "title": "Workflow: multi-applicant — co-applicant attaches to the application",
      "area": "workflow",
      "srs_ref": "VR-4.7a",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "PATCH /api/application/65",
          "ok": true
        },
        {
          "name": "POST /api/co_applicant",
          "ok": true
        },
        {
          "name": "GET /api/co_applicant?filter[application]=65",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 55
    },
    {
      "id": "TC-W06",
      "title": "Workflow: failed payment can be retried and still issues an invoice",
      "area": "workflow",
      "srs_ref": "VR-4.15",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/payment",
          "ok": true
        },
        {
          "name": "POST /api/payment/50/transition",
          "ok": true
        },
        {
          "name": "POST /api/payment/50/transition",
          "ok": true
        },
        {
          "name": "GET /api/payment/50",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 1062
    },
    {
      "id": "TC-W07",
      "title": "Workflow: promo redemption increments its usage counter",
      "area": "workflow",
      "srs_ref": "VR-4.15",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "GET /api/promo_code/25",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 5
    },
    {
      "id": "TC-W08",
      "title": "Workflow: expired promo code is refused",
      "area": "workflow",
      "srs_ref": "VR-4.15",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/promo_code",
          "ok": true
        },
        {
          "name": "POST /api/payment",
          "ok": true
        },
        {
          "name": "POST /api/flows/apply_promo/run",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 37
    },
    {
      "id": "TC-W09",
      "title": "Workflow: promo code not yet in its validity window is refused",
      "area": "workflow",
      "srs_ref": "VR-4.15",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/promo_code",
          "ok": true
        },
        {
          "name": "POST /api/payment",
          "ok": true
        },
        {
          "name": "POST /api/flows/apply_promo/run",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 42
    },
    {
      "id": "TC-W10",
      "title": "Workflow: deactivated promo code is refused",
      "area": "workflow",
      "srs_ref": "VR-4.15",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/promo_code",
          "ok": true
        },
        {
          "name": "POST /api/payment",
          "ok": true
        },
        {
          "name": "POST /api/flows/apply_promo/run",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 39
    },
    {
      "id": "TC-W11",
      "title": "Workflow: single-use promo is exhausted after one redemption (usage cap)",
      "area": "workflow",
      "srs_ref": "VR-4.15",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/promo_code",
          "ok": true
        },
        {
          "name": "POST /api/payment",
          "ok": true
        },
        {
          "name": "POST /api/flows/apply_promo/run",
          "ok": true
        },
        {
          "name": "GET /api/payment/54",
          "ok": true
        },
        {
          "name": "GET /api/promo_code/29",
          "ok": true
        },
        {
          "name": "POST /api/payment",
          "ok": true
        },
        {
          "name": "POST /api/flows/apply_promo/run",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 150
    },
    {
      "id": "TC-W12",
      "title": "Workflow: improving the profile and regenerating raises the final score",
      "area": "workflow",
      "srs_ref": "VR-5.3",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/application",
          "ok": true
        },
        {
          "name": "POST /api/flows/generate_lite_score/run",
          "ok": true
        },
        {
          "name": "POST /api/application/68/transition",
          "ok": true
        },
        {
          "name": "POST /api/application/68/transition",
          "ok": true
        },
        {
          "name": "POST /api/flows/generate_final_score/run",
          "ok": true
        },
        {
          "name": "GET /api/application/68",
          "ok": true
        },
        {
          "name": "PATCH /api/application/68",
          "ok": true
        },
        {
          "name": "POST /api/flows/regenerate_score/run",
          "ok": true
        },
        {
          "name": "GET /api/application/68",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 319
    },
    {
      "id": "TC-W13",
      "title": "Workflow: flagged document — customer cannot clear the flag, agent can",
      "area": "workflow",
      "srs_ref": "VR-4.14",
      "kind": "api",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/document/33/transition",
          "ok": true
        },
        {
          "name": "POST /api/document/33/transition",
          "ok": true
        },
        {
          "name": "GET /api/document/33",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 22
    },
    {
      "id": "TC-W14",
      "title": "Workflow: admin analytics reports run and group correctly",
      "area": "workflow",
      "srs_ref": "VR-5.x",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "GET /api/reports",
          "ok": true
        },
        {
          "name": "GET /api/reports/applications_by_band",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 9
    },
    {
      "id": "TC-W15",
      "title": "Workflow: uploaded document gets OCR-scanned into ocr_summary (vision model)",
      "area": "workflow",
      "srs_ref": "VR-4.14",
      "kind": "api",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "POST /api/upload",
          "ok": true
        },
        {
          "name": "POST /api/document",
          "ok": true
        },
        {
          "name": "POST /api/document/37/transition",
          "ok": true
        },
        {
          "name": "GET /api/document/37",
          "ok": true
        }
      ],
      "evidence": [],
      "durationMs": 3184
    },
    {
      "id": "TC-U01",
      "title": "Email OTP login lands on the personalised dashboard",
      "area": "ui",
      "srs_ref": "VR-4.2",
      "kind": "ui",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "goto: \"/\"",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"you@example.com\", \"value\": \"qa.20260711180241@visaready.test\"}",
          "ok": true
        },
        {
          "name": "tap: \"Send code\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Enter the 4-digit code\"",
          "ok": true
        },
        {
          "name": "fill: {\"nth\": 0, \"value\": \"1234\"}",
          "ok": true
        },
        {
          "name": "tap: \"Verify & sign in\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Hi there\"",
          "ok": true
        },
        {
          "name": "screenshot: \"home\"",
          "ok": true
        }
      ],
      "error": null,
      "evidence": [
        "TC-U01-home.png"
      ],
      "console": [],
      "durationMs": 2837
    },
    {
      "id": "TC-U02",
      "title": "Wrong OTP shows an inline error",
      "area": "ui",
      "srs_ref": "VR-4.2",
      "kind": "ui",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "goto: \"/\"",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"you@example.com\", \"value\": \"qa.ui2.20260711180241@visaready.test\"}",
          "ok": true
        },
        {
          "name": "tap: \"Send code\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Enter the 4-digit code\"",
          "ok": true
        },
        {
          "name": "fill: {\"nth\": 0, \"value\": \"9999\"}",
          "ok": true
        },
        {
          "name": "tap: \"Verify & sign in\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Incorrect code\"",
          "ok": true
        },
        {
          "name": "screenshot: \"wrong-otp\"",
          "ok": true
        }
      ],
      "error": null,
      "evidence": [
        "TC-U02-wrong-otp.png"
      ],
      "console": [
        "error: Failed to load resource: the server responded with a status of 401 (Unauthorized)"
      ],
      "durationMs": 2748
    },
    {
      "id": "TC-U03",
      "title": "Dashboard shows score card, journeys, recent apps and explore links",
      "area": "ui",
      "srs_ref": "VR-2.2",
      "kind": "ui",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "goto: \"/\"",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"you@example.com\", \"value\": \"qa.20260711180241@visaready.test\"}",
          "ok": true
        },
        {
          "name": "tap: \"Send code\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Enter the 4-digit code\"",
          "ok": true
        },
        {
          "name": "fill: {\"nth\": 0, \"value\": \"1234\"}",
          "ok": true
        },
        {
          "name": "tap: \"Verify & sign in\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Hi there\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Visa Readiness\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Get started\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Visa Application (6 Steps + Score)\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Start New Application\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Explore\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Verified score\"",
          "ok": true
        },
        {
          "name": "screenshot: \"dashboard\"",
          "ok": true
        }
      ],
      "error": null,
      "evidence": [
        "TC-U03-dashboard.png"
      ],
      "console": [],
      "durationMs": 2839
    },
    {
      "id": "TC-U04",
      "title": "Profile tab opens the applicant profile form",
      "area": "ui",
      "srs_ref": "VR-4.6",
      "kind": "ui",
      "priority": "P2",
      "ok": true,
      "steps": [
        {
          "name": "goto: \"/\"",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"you@example.com\", \"value\": \"qa.20260711180241@visaready.test\"}",
          "ok": true
        },
        {
          "name": "tap: \"Send code\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Enter the 4-digit code\"",
          "ok": true
        },
        {
          "name": "fill: {\"nth\": 0, \"value\": \"1234\"}",
          "ok": true
        },
        {
          "name": "tap: \"Verify & sign in\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Hi there\"",
          "ok": true
        },
        {
          "name": "tap: \"Profile\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Passport Number\"",
          "ok": true
        },
        {
          "name": "screenshot: \"profile\"",
          "ok": true
        }
      ],
      "error": null,
      "evidence": [
        "TC-U04-profile.png"
      ],
      "console": [],
      "durationMs": 3577
    },
    {
      "id": "TC-U05",
      "title": "Customer does not see admin/agent-only navigation",
      "area": "ui",
      "kind": "ui",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "goto: \"/\"",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"you@example.com\", \"value\": \"qa.20260711180241@visaready.test\"}",
          "ok": true
        },
        {
          "name": "tap: \"Send code\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Enter the 4-digit code\"",
          "ok": true
        },
        {
          "name": "fill: {\"nth\": 0, \"value\": \"1234\"}",
          "ok": true
        },
        {
          "name": "tap: \"Verify & sign in\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Hi there\"",
          "ok": true
        },
        {
          "name": "expect_not_text: \"Leads\"",
          "ok": true
        },
        {
          "name": "expect_not_text: \"Administration\"",
          "ok": true
        }
      ],
      "error": null,
      "evidence": [],
      "console": [],
      "durationMs": 5702
    },
    {
      "id": "TC-U06",
      "title": "Guided journey opens at Step 1 with the passport form",
      "area": "ui",
      "srs_ref": "VR-2.2",
      "kind": "ui",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "goto: \"/\"",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"you@example.com\", \"value\": \"qa.20260711180241@visaready.test\"}",
          "ok": true
        },
        {
          "name": "tap: \"Send code\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Enter the 4-digit code\"",
          "ok": true
        },
        {
          "name": "fill: {\"nth\": 0, \"value\": \"1234\"}",
          "ok": true
        },
        {
          "name": "tap: \"Verify & sign in\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Hi there\"",
          "ok": true
        },
        {
          "name": "tap: \"Visa Application (6 Steps + Score)\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Step 1 of 7\"",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"Passport Number\", \"value\": \"M7654321\"}",
          "ok": true
        },
        {
          "name": "screenshot: \"wizard-step1\"",
          "ok": true
        }
      ],
      "error": null,
      "evidence": [
        "TC-U06-wizard-step1.png"
      ],
      "console": [],
      "durationMs": 3466
    },
    {
      "id": "TC-U07",
      "title": "Explore links include the Terms & Consent page",
      "area": "ui",
      "srs_ref": "VR-4.4",
      "kind": "ui",
      "priority": "P3",
      "ok": true,
      "steps": [
        {
          "name": "goto: \"/\"",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"you@example.com\", \"value\": \"qa.20260711180241@visaready.test\"}",
          "ok": true
        },
        {
          "name": "tap: \"Send code\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Enter the 4-digit code\"",
          "ok": true
        },
        {
          "name": "fill: {\"nth\": 0, \"value\": \"1234\"}",
          "ok": true
        },
        {
          "name": "tap: \"Verify & sign in\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Hi there\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Terms of Use, Consent & Disclaimer\"",
          "ok": true
        }
      ],
      "error": null,
      "evidence": [],
      "console": [],
      "durationMs": 2615
    },
    {
      "id": "TC-U08",
      "title": "Library tab renders without errors",
      "area": "ui",
      "kind": "ui",
      "priority": "P3",
      "ok": true,
      "steps": [
        {
          "name": "goto: \"/\"",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"you@example.com\", \"value\": \"qa.20260711180241@visaready.test\"}",
          "ok": true
        },
        {
          "name": "tap: \"Send code\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Enter the 4-digit code\"",
          "ok": true
        },
        {
          "name": "fill: {\"nth\": 0, \"value\": \"1234\"}",
          "ok": true
        },
        {
          "name": "tap: \"Verify & sign in\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Hi there\"",
          "ok": true
        },
        {
          "name": "tap: \"Library\"",
          "ok": true
        },
        {
          "name": "wait: 1500",
          "ok": true
        },
        {
          "name": "screenshot: \"library\"",
          "ok": true
        }
      ],
      "error": null,
      "evidence": [
        "TC-U08-library.png"
      ],
      "console": [],
      "durationMs": 4877
    },
    {
      "id": "TC-U09",
      "title": "Workflow UI: complete all 7 guided steps and generate a Lite score",
      "area": "ui",
      "srs_ref": "VR-2.2",
      "kind": "ui",
      "priority": "P1",
      "ok": true,
      "steps": [
        {
          "name": "goto: \"/\"",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"you@example.com\", \"value\": \"qa.20260711180241@visaready.test\"}",
          "ok": true
        },
        {
          "name": "tap: \"Send code\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Enter the 4-digit code\"",
          "ok": true
        },
        {
          "name": "fill: {\"nth\": 0, \"value\": \"1234\"}",
          "ok": true
        },
        {
          "name": "tap: \"Verify & sign in\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Hi there\"",
          "ok": true
        },
        {
          "name": "tap: \"Start New Application\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Step 1 of 7\"",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"Passport Number\", \"value\": \"U1802419\"}",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"Name (as in passport)\", \"value\": \"UI Journey Tester\"}",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"Place of Issue\", \"value\": \"Mumbai\"}",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"YYYY-MM-DD\", \"nth\": 0, \"value\": \"2020-01-15\"}",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"YYYY-MM-DD\", \"nth\": 1, \"value\": \"2031-01-14\"}",
          "ok": true
        },
        {
          "name": "tap: \"Select Nationality\"",
          "ok": true
        },
        {
          "name": "tap: \"India\"",
          "ok": true
        },
        {
          "name": "tap: \"Save & Continue\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Step 2 of 7\"",
          "ok": true
        },
        {
          "name": "tap: \"Select Destination Country\"",
          "ok": true
        },
        {
          "name": "tap: \"France\"",
          "ok": true
        },
        {
          "name": "tap: \"Done\"",
          "ok": true
        },
        {
          "name": "tap: \"Select Visa Type\"",
          "ok": true
        },
        {
          "name": "tap: \"Tourist / Visitor\"",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"YYYY-MM-DD\", \"nth\": 0, \"value\": \"2026-08-10\"}",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"YYYY-MM-DD\", \"nth\": 1, \"value\": \"2026-08-24\"}",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"Trip Duration (days)\", \"value\": \"14\"}",
          "ok": true
        },
        {
          "name": "tap: \"Save & Next\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Step 3 of 7\"",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"First Name\", \"value\": \"UI\"}",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"YYYY-MM-DD\", \"nth\": 0, \"value\": \"1990-05-20\"}",
          "ok": true
        },
        {
          "name": "tap: \"Select Gender\"",
          "ok": true
        },
        {
          "name": "tap: \"Male\"",
          "ok": true
        },
        {
          "name": "tap: \"Select Marital Status\"",
          "ok": true
        },
        {
          "name": "tap: \"Married\"",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"Current City of Residence\", \"value\": \"Mumbai\"}",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"State\", \"value\": \"Maharashtra\"}",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"PIN / Postal Code\", \"value\": \"400001\"}",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"Email\", \"value\": \"qa.20260711180241@visaready.test\"}",
          "ok": true
        },
        {
          "name": "fill: {\"placeholder\": \"Mobile\", \"value\": \"9876543299\"}",
          "ok": true
        },
        {
          "name": "tap: \"Select Highest Qualification\"",
          "ok": true
        },
        {
          "name": "tap: \"Postgraduate\"",
          "ok": true
        },
        {
          "name": "tap: \"Select User Type\"",
          "ok": true
        },
        {
          "name": "tap: \"Salaried\"",
          "ok": true
        },
        {
          "name": "tap: \"Save & Next\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Step 4 of 7\"",
          "ok": true
        },
        {
          "name": "tap: \"Save & Next\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Step 5 of 7\"",
          "ok": true
        },
        {
          "name": "tap: \"Save & Next\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Step 6 of 7\"",
          "ok": true
        },
        {
          "name": "toggle: 3",
          "ok": true
        },
        {
          "name": "tap: \"Save & Next\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Step 7 of 7\"",
          "ok": true
        },
        {
          "name": "screenshot: \"journey-step7\"",
          "ok": true
        },
        {
          "name": "tap: \"Generate VisaScore\"",
          "ok": true
        },
        {
          "name": "wait: 3500",
          "ok": true
        },
        {
          "name": "goto: \"/\"",
          "ok": true
        },
        {
          "name": "expect_text: \"Indicative (Lite) result\"",
          "ok": true
        },
        {
          "name": "screenshot: \"journey-done\"",
          "ok": true
        }
      ],
      "error": null,
      "evidence": [
        "TC-U09-journey-step7.png",
        "TC-U09-journey-done.png"
      ],
      "console": [
        "error: Failed to load resource: the server responded with a status of 403 (Forbidden)",
        "error: Failed to load resource: the server responded with a status of 403 (Forbidden)"
      ],
      "durationMs": 23125
    }
  ]
}