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
{{ message }}
Repository navigation
KYC flow-Country and state fields are empty and cannot be filled #105210
Version Number: 9.5.24-2 Reproducible in staging?: Yes Reproducible in production?: Unable to validate in Prod - Provide reasoning. If this was caught during regression testing, add the test name, ID and link from BrowserStack:https://test-management.browserstack.com/tc/TC-4422. https://test-management.browserstack.com/tc/TC-300156 Email or phone of affected tester (no customers): N/A Issue reported by: Applause Internal Team Bug source: Regression TC Execution Device used: MacBook Air 26.6.2 Chrome, iPhone 15 iOS 26.6.1 App Component: Other
Action Performed:
Sign in to ND with a new gmail account, verify the account
Open a chat with another user, click + button, select Pay
Enter an amount and select Pay with personal account
Click Next, Log into your bank, Regions 1111
Enter first and last name, click Next
Enter a valid address in Address line 1 field, select from suggested
Observe the Country and State fields
Try to update the fields manually
Expected Result:
The country and state are populated from the suggested address. The fields can be filled manually
Actual Result:
Country and State fields are empty after selecting the suggested address and cannot be filled manually
👋 Friendly reminder that deploy blockers are time-sensitive ⏱ issues! Check out the open `StagingDeployCash` deploy checklist to see the list of PRs included in this release, then work quickly to do one of the following:
Identify the pull request that introduced this issue and revert it.
Root Cause: The PR removed the useMemo around address in AddPersonalBankAccountPage/substeps/AddressStep.tsx:43-50. address is now a new object on every render. The effect at AddressStep.tsx:64-72 lists address as a dependency, so it runs after every render. Each time, it resets Country and State to the saved values, which are empty for a new account. Selecting a suggestion or picking a value manually is wiped immediately.
Recommended Fix (roll forward): In AddressStep.tsx, remove address from the effect's dependency array and drop the always-true if (!address) guard. The effect then runs only when the primitive fields (address?.state, address?.country, address?.city, address?.zip, draftCountry, draftState) change.
A full revert is the fallback. It is risky, because the PR touches 932 files and later PRs build on it.
Investigation details
Screen: The steps (Pay with personal account → Plaid → name → address) go through AddPersonalBankAccountPage, whose address page is substeps/AddressStep.tsx.
Why only Country and State break: In AddressForm, Country and State are controlled inputs (value={country} / value={state}, AddressForm.tsx:174-206). City and Zip use defaultValue (AddressForm.tsx:209-231), so the resets don't reach them.
Why the user's choice is lost:handleAddressChange (AddressStep.tsx:74-100) sets the new country or state. That re-renders the page, which rebuilds address, which reruns the effect and sets the value back to ''.
Staging bundle check: In the deployed staging web bundle, React Compiler compiled AddressStep but did not cache address. The object is rebuilt each render, and the effect's dependency array includes it. So the PR's assumption that the compiler would keep address stable does not hold here. Native uses the same compiler, which fits the iOS and Android reports.
Why production is fine: Production does not include this PR, so the explicit useMemo is still there.
Follow-up: Other files changed by the PR may have the same pattern: an object built during render is listed in an effect's dependencies, and the effect sets state. Those files are worth a quick scan.
Limitation: I did not reproduce this in a running app. The evidence is the source code plus the compiled staging bundle.
Next Steps: Reply with @MelvinBot implement this to create a draft PR, or @MelvinBot <your feedback> to refine this analysis.
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.24-8 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:
The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the Contributor+ Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]. If no checklist is needed for this issue, you can click: [no checklist button]
Activity
applause-bot commentedon Oct 28, 2026
While Applause doesn't embed attachments for this bug, here are the links for quick view:
https://platform.applause.com/services/links/v1/external/165355bb0d028763725a16720dc5aa8ad905ccbe960473c4380d58f22f7d377c
github-actions commentedon Oct 28, 2026
👋 Friendly reminder that deploy blockers are time-sensitive ⏱ issues! Check out the open `StagingDeployCash` deploy checklist to see the list of PRs included in this release, then work quickly to do one of the following:
melvin-bot commentedon Oct 28, 2026
Triggered auto assignment to @jasperhuangg (
DeployBlockerCash), see https://stackoverflowteams.com/c/expensify/questions/9980/ for more details.melvin-bot commentedon Oct 28, 2026
💬 A slack conversation has been started in #expensify-open-source
MelvinBot commentedon Oct 28, 2026
Deploy Blocker Analysis
Causing PR: [No QA] Disallow manual memoization in compiled React code (author
roryabraham, merged 2026-10-26). Confidence: High. It is the only PR in this deploy that changes the affected file.Root Cause: The PR removed the
useMemoaroundaddressin AddPersonalBankAccountPage/substeps/AddressStep.tsx:43-50.addressis now a new object on every render. The effect at AddressStep.tsx:64-72 listsaddressas a dependency, so it runs after every render. Each time, it resets Country and State to the saved values, which are empty for a new account. Selecting a suggestion or picking a value manually is wiped immediately.Recommended Fix (roll forward): In
AddressStep.tsx, removeaddressfrom the effect's dependency array and drop the always-trueif (!address)guard. The effect then runs only when the primitive fields (address?.state,address?.country,address?.city,address?.zip,draftCountry,draftState) change.A full revert is the fallback. It is risky, because the PR touches 932 files and later PRs build on it.
Investigation details
AddPersonalBankAccountPage, whose address page issubsteps/AddressStep.tsx.AddressForm, Country and State are controlled inputs (value={country}/value={state}, AddressForm.tsx:174-206). City and Zip usedefaultValue(AddressForm.tsx:209-231), so the resets don't reach them.handleAddressChange(AddressStep.tsx:74-100) sets the new country or state. That re-renders the page, which rebuildsaddress, which reruns the effect and sets the value back to''.AddressStepbut did not cacheaddress. The object is rebuilt each render, and the effect's dependency array includes it. So the PR's assumption that the compiler would keepaddressstable does not hold here. Native uses the same compiler, which fits the iOS and Android reports.useMemois still there.Next Steps: Reply with
@MelvinBot implement thisto create a draft PR, or@MelvinBot <your feedback>to refine this analysis.test: reproduce KYC address field resets
fix: preserve KYC address field edits
roryabraham commentedon Oct 28, 2026
Requested retest: https://expensify.slack.com/archives/C09V78U42D8/p1793213435207939
IuliiaHerets commentedon Oct 28, 2026
@roryabraham issue was checked here
melvin-bot commentedon Oct 29, 2026
@roryabraham
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.24-8 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:
The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the Contributor+ Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]. If no checklist is needed for this issue, you can click: [no checklist button]