{
  "gate": "Unit Tests",
  "gate_number": 5,
  "run_at": "2026-09-08",
  "feature_files": [
    "app/(auth)/forgot-password/page.tsx",
    "app/(auth)/forgot-password/verify/page.tsx",
    "app/(auth)/forgot-password/reset/page.tsx",
    "components/auth/ForgotPasswordForm.tsx",
    "components/auth/VerifyOtpForm.tsx",
    "components/auth/ResetPasswordForm.tsx",
    "components/auth/SignInForm.tsx"
  ],
  "test_files": [
    "tests/auth-forgot-password-form.test.tsx",
    "tests/auth-forgot-password-pages.test.tsx",
    "tests/auth-verify-otp-form.test.tsx",
    "tests/auth-reset-password-form-via-otp.test.tsx",
    "tests/sign-in-form.test.tsx"
  ],
  "test_runner": "vitest",
  "summary": {
    "passed": 80,
    "failed": 0,
    "total": 80,
    "skipped": 0
  },
  "coverage_by_file": {
    "app/(auth)/forgot-password/page.tsx": {
      "lines": 100,
      "functions": 100,
      "branches": 100
    },
    "app/(auth)/forgot-password/reset/page.tsx": {
      "lines": 100,
      "functions": 100,
      "branches": 100
    },
    "app/(auth)/forgot-password/verify/page.tsx": {
      "lines": 100,
      "functions": 100,
      "branches": 100
    },
    "components/auth/ForgotPasswordForm.tsx": {
      "lines": 100,
      "functions": 100,
      "branches": 100
    },
    "components/auth/ResetPasswordForm.tsx": {
      "lines": 100,
      "functions": 100,
      "branches": 100
    },
    "components/auth/SignInForm.tsx": {
      "lines": 100,
      "functions": 100,
      "branches": 100
    },
    "components/auth/VerifyOtpForm.tsx": {
      "lines": 100,
      "functions": 100,
      "branches": 90.47
    }
  },
  "coverage_totals_for_feature_files": {
    "min_lines": 100,
    "min_functions": 100,
    "min_branches": 90.47,
    "binding_number": 90.47
  },
  "gate_status": "PASS",
  "fixes_applied": [
    "auth-reset-password-form-via-otp.test.tsx: changed getByLabelText(\"New Password\") to getByLabelText(\"New Password *\") to match PasswordField label with RequiredMark suffix",
    "auth-verify-otp-form.test.tsx: changed synchronous act(() => vi.advanceTimersByTime(30_000)) to async per-tick loop (30x await act(async () => vi.advanceTimersByTime(1000))) to allow React useEffect to re-run between countdown ticks"
  ],
  "testcases": [
    {
      "name": "ForgotPasswordForm \u2014 rendering (clean state) renders the Forgot Password heading",
      "status": "PASS"
    },
    {
      "name": "ForgotPasswordForm \u2014 rendering (clean state) renders the mobile number input with correct attributes",
      "status": "PASS"
    },
    {
      "name": "ForgotPasswordForm \u2014 rendering (clean state) renders the +91 prefix label",
      "status": "PASS"
    },
    {
      "name": "ForgotPasswordForm \u2014 rendering (clean state) renders the Send Verification Code submit button",
      "status": "PASS"
    },
    {
      "name": "ForgotPasswordForm \u2014 rendering (clean state) renders the Back to Sign In link pointing to /login",
      "status": "PASS"
    },
    {
      "name": "ForgotPasswordForm \u2014 rendering (clean state) renders the footer hint text",
      "status": "PASS"
    },
    {
      "name": "ForgotPasswordForm \u2014 field error state shows a mobile field error when fieldErrors.mobile is set",
      "status": "PASS"
    },
    {
      "name": "ForgotPasswordForm \u2014 field error state does not show a generic error message when fieldErrors is set (field error takes priority in the template)",
      "status": "PASS"
    },
    {
      "name": "ForgotPasswordForm \u2014 generic error state shows a generic error message when ok=false and message is present with no fieldErrors",
      "status": "PASS"
    },
    {
      "name": "ForgotPasswordForm \u2014 generic error state does not show any error when state is clean (ok=true, no message)",
      "status": "PASS"
    },
    {
      "name": "ForgotPasswordForm \u2014 success message state shows the success message in green when ok=true and message is present",
      "status": "PASS"
    },
    {
      "name": "ForgotPasswordForm \u2014 Server Action wiring binds useFormState to requestPasswordResetOtp with ok=true initial state",
      "status": "PASS"
    },
    {
      "name": "ForgotPasswordForm \u2014 Server Action wiring calling the bound action delegates to requestPasswordResetOtp",
      "status": "PASS"
    },
    {
      "name": "ForgotPasswordPage \u2014 rendering renders the ForgotPasswordForm component",
      "status": "PASS"
    },
    {
      "name": "ForgotPasswordPage \u2014 rendering never calls redirect \u2014 no guard on step 1",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpPage \u2014 cookie guard redirects redirects to /forgot-password when the fp_otp_token cookie is absent",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpPage \u2014 cookie guard redirects redirects to /forgot-password when fp_otp_token.value is an empty string",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpPage \u2014 cookie guard redirects does not render VerifyOtpForm when the guard redirects",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpPage \u2014 renders form when token is present renders VerifyOtpForm and does not redirect when fp_otp_token is set",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpPage \u2014 renders form when token is present reads the fp_otp_token cookie by name",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordPage \u2014 cookie guard redirects redirects to /forgot-password when the fp_reset_token cookie is absent",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordPage \u2014 cookie guard redirects redirects to /forgot-password when fp_reset_token.value is an empty string",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordPage \u2014 cookie guard redirects does not render ResetPasswordForm when the guard redirects",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordPage \u2014 renders form when token is present renders ResetPasswordForm and does not redirect when fp_reset_token is set",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordPage \u2014 renders form when token is present reads the fp_reset_token cookie by name",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 initial rendering renders the Reset Password heading",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 initial rendering renders New Password and Re-enter Password fields",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 initial rendering renders the Save New Password submit button",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 initial rendering renders the Cancel button",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 initial rendering does not render a 'Current Password' field (auth variant has no such field)",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 initial rendering renders the PASSWORD POLICY card with all 5 rules",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 initial rendering renders the Strength meter label",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 submit button enable/disable Save New Password button is disabled with empty passwords",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 submit button enable/disable Save New Password button is disabled when policy is not met",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 submit button enable/disable Save New Password button is disabled when passwords don't match",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 submit button enable/disable Save New Password button is enabled when policy passes and passwords match",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 password mismatch shows a 'Passwords do not match' error when confirmPassword differs from newPassword",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 password mismatch does not show a mismatch error when passwords match",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 password mismatch does not show mismatch error on empty confirm field",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 strength meter does not show a strength label when the password field is empty",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 strength meter shows 'Weak' label when only 1 rule is met",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 strength meter shows 'Strong' label when all 5 rules are met",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 field errors from action state shows newPassword field error from action state",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 field errors from action state shows confirmPassword field error from action state",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 field errors from action state shows generic error message when ok=false, message present, no fieldErrors",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 field errors from action state does not show generic error when fieldErrors is also present",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 Cancel button calls router.push('/login') when Cancel is clicked",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 Server Action wiring binds useFormState to resetPasswordViaOtp with ok=true initial state",
      "status": "PASS"
    },
    {
      "name": "ResetPasswordForm (auth) \u2014 Server Action wiring calling the bound action delegates to resetPasswordViaOtp",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 initial rendering renders the Enter Verification Code heading",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 initial rendering renders 6 digit input boxes with correct aria-labels",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 initial rendering renders all 6 digit inputs as empty initially",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 initial rendering renders a hidden input named 'otp' with empty value initially",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 initial rendering renders a Verify Code submit button",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 initial rendering renders the Back link pointing to /forgot-password",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 initial rendering shows countdown text while cooldown is active",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 submit button disabled when OTP incomplete submit button is disabled when fewer than 6 digits are entered",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 submit button disabled when OTP incomplete submit button becomes enabled once all 6 digits are entered",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 digit input updates the digit value when a number is typed",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 digit input strips non-numeric characters from digit input",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 digit input fills the hidden otp field as digits are entered",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 digit input paste fills all 6 boxes from pasted numeric text",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 digit input paste ignores non-numeric characters in pasted text",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 digit input Backspace on an empty box moves focus to the previous box",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 OTP field error from formState shows the OTP field error message when fieldErrors.otp is set",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 OTP field error from formState applies error styling to digit boxes when otpError is present",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 session error from formState shows the session-level error when ok=false and message is set (no fieldErrors)",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 countdown and resend shows countdown text (not resend button) when countdown > 0",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 countdown and resend shows Resend Code button after countdown reaches 0",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 countdown and resend calls resendOtp when the Resend Code button is clicked",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 countdown and resend shows success message after a successful resend",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 countdown and resend shows resend error after a failed resend",
      "status": "PASS"
    },
    {
      "name": "VerifyOtpForm \u2014 Server Action wiring binds useFormState to verifyResetOtp with ok=true initial state",
      "status": "PASS"
    },
    {
      "name": "SignInForm \u2014 rendering renders the heading, username field, password field and Login submit button",
      "status": "PASS"
    },
    {
      "name": "SignInForm \u2014 rendering marks username and password as required and focuses username first",
      "status": "PASS"
    },
    {
      "name": "SignInForm \u2014 error state shows the returned error without clearing the fields",
      "status": "PASS"
    },
    {
      "name": "SignInForm \u2014 error state renders no error text when the state has none",
      "status": "PASS"
    },
    {
      "name": "SignInForm \u2014 Forgot Password link (ticket #3273) renders a 'Forgot Password?' link pointing to /forgot-password",
      "status": "PASS"
    },
    {
      "name": "SignInForm \u2014 submit wiring (Server Action) binds directly to the login Server Action with an undefined initial state",
      "status": "PASS"
    },
    {
      "name": "SignInForm \u2014 submit wiring (Server Action) invokes login exactly once with the submitted FormData",
      "status": "PASS"
    }
  ]
}