You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When strict user enumeration protection is enabled, we use a combined error for missing identifier and password. When someone uses the hidden instant password field on SignInStart (through password managers), but that password is wrong, this means they stay on the SignInStart screen and see the error there, instead of being redirected to /factor-one which is the normal path.
SignInStart has not previously had the "Forgot password?" option, so the only way to recover has been to remove the password and click continue, which is not great UX.
This PR adds a "Forgot password?" to the password field on SignInStart. It makes this happen by retrying the signIn create with just the identifier first to set things up, and then navigating to the /factor-one screen with a query param (__clerk_reset_password=true, gets reset on exit)
Trying to click forgot password when identifier field is empty will result in the same validation error as when clicking continue.
Checklist
pnpm test runs as expected.
pnpm build runs as expected.
(If applicable) JSDoc comments have been added or updated for any package exports
This PR implements a "Forgot password?" action on the sign-in start page to improve account recovery under strict user enumeration protection. The changes introduce a new URL parameter constant (SIGN_IN_RESET_PASSWORD_INTENT_PARAM) to coordinate state between SignInStart and SignInFactorOne. SignInStart now renders a forgot-password action on the password field and handles the click by validating required fields and navigating to factor-one with the reset-intent parameter. SignInFactorOne detects this parameter and displays the appropriate screen (reset password or alternative methods), cleaning up the parameter on exit. Tests verify the end-to-end flow, and supporting infrastructure updates enable proper test fixture setup with query parameters.
Estimated code review effort
🎯 3 (Moderate) | ⏱️ ~25 minutes
🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
Check name
Status
Explanation
Resolution
Docstring Coverage
⚠️ Warning
Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.
Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name
Status
Explanation
Title check
✅ Passed
The title accurately describes the main change: adding a 'Forgot password?' option to the SignInStart screen, which is the primary objective of this PR.
Linked Issues check
✅ Passed
Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check
✅ Passed
Check skipped because no linked issues were found for this pull request.
Description check
✅ Passed
The PR description clearly explains the UX issue, the implemented solution, and includes screenshots demonstrating the feature.
✏️ Tip: You can configure your own custom pre-merge checks in the settings.
Comment @coderabbitai help to get the list of available commands and usage tips.
Generated by Break Check on 2026-06-04T09:43:42.094Z
Summary
Metric
Count
Packages analyzed
19
Packages with changes
1
🔴 Breaking changes
0
🟡 Non-breaking changes
1
🟢 Additions
0
🤖 This report was reviewed by claude-sonnet-4-6.
Note
Break Check could not snapshot 3 subpaths; the diff below excludes them.
@clerk/astro ./env: Internal Error: Unable to determine module for: /home/runner/_work/javascript/javascript/packages/astro/env.d.ts You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
@clerk/shared ./cookie: Internal Error: Unable to follow symbol for "Cookies" You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
@clerk/testing ./cypress: Symbol not found for identifier: Cypress
Static analyzer: Breaking change in function apiUrlFromPublishableKey: Return type changed: "https://api.lclclerk.com"|"https://api.clerkstage.dev"|"https://api.clerk.com" → "https://api.clerk.com"|"https://api.lclclerk.com"|"https://api.clerkstage.dev"
🤖 AI review (reclassified as non-breaking) (99%): The union members are identical; only their order changed, and TypeScript union types are order-independent — no well-typed consumer code is affected.
Generated by Break Check on 2026-06-09T18:43:50.176Z
Summary
Metric
Count
Packages analyzed
19
Packages with changes
0
🔴 Breaking changes
0
🟡 Non-breaking changes
0
🟢 Additions
0
Note
Break Check could not snapshot 3 subpaths; the diff below excludes them.
@clerk/astro ./env: Internal Error: Unable to determine module for: /home/runner/_work/javascript/javascript/packages/astro/env.d.ts You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
@clerk/shared ./cookie: Internal Error: Unable to follow symbol for "Cookies" You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
@clerk/testing ./cypress: Symbol not found for identifier: Cypress
No API Changes Detected
All packages have stable APIs with no detected changes.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
When strict user enumeration protection is enabled, we use a combined error for missing identifier and password. When someone uses the hidden instant password field on
SignInStart(through password managers), but that password is wrong, this means they stay on theSignInStartscreen and see the error there, instead of being redirected to/factor-onewhich is the normal path.SignInStarthas not previously had the "Forgot password?" option, so the only way to recover has been to remove the password and click continue, which is not great UX.This PR adds a "Forgot password?" to the password field on
SignInStart. It makes this happen by retrying the signIn create with just the identifier first to set things up, and then navigating to the/factor-onescreen with a query param (__clerk_reset_password=true, gets reset on exit)Trying to click forgot password when identifier field is empty will result in the same validation error as when clicking continue.
Checklist
pnpm testruns as expected.pnpm buildruns as expected.Type of change