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
Company cards - Choose a cardholder page is blank when assigning card after going online #105347
👋 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.
Result: No App PR in Deploy Checklist: New Expensify 2026-10-29 (9.5.25-0) explains this bug. Don't revert anything yet. This likely needs a staging backend/data check.
Why:
None of the 52 App PRs in the checklist touches the "Choose a cardholder" page, the offline modal, the reconnect reload, or the shared list and screen components it uses.
The Applause lead jponikarchuk said on [No QA] Add RBR to workspace agents + Prepare for 1:1:1 that this bug "is repro on all PRs." If every test build reproduces it, one App change is unlikely to be the cause. The staging API is the more likely source.
Next steps:
Check the Applause video. A loading skeleton means the list never initialized. An empty list means policy.employeeList is wrong.
Check the staging responses to OpenPolicyCompanyCardsPage (sent on reconnect) and to the assign/unassign requests. Look for anything that clears or reshapes policy.employeeList.
If an App PR is confirmed later, add DeployBlockerCash back. It was removed when the label was switched to DeployBlocker.
Investigation details
All line links point to App commit 67eb990.
What the page depends on (unchanged in this release):
Only PR touching a wrapper this page uses (ScreenWrapperContainer.tsx). It removes memoization and moves the four-finger-tap handler into a hook. No data or transition-end changes. Its banner only renders under the required-2FA overlay.
⚠️Preliminary analysis (low confidence): treat this as a starting point, not a conclusion.
This appears to be a backend/internal issue. A separate internal investigation is needed.
Why: The bug only reproduces with the staging server on, and no App PR in this release changes the flow. On the App side, a blank cardholder list (with no loading skeleton) means the workspace member list (policy.employeeList) was empty when the page opened. The App never writes employeeList during this flow, so a server response must have emptied it. Likely suspects are the responses to OpenPolicyCompanyCardsPage / OpenPolicyCompanyCardsFeed (sent on reconnect) and AssignCard / unassign.
To confirm:
Reproduce the bug, then open Workspace > Members. If that list is empty too, the member list was cleared. If members show there but not in the assignee picker, member role values changed.
Compare the staging and production responses for the four requests above. Look for a workspace update that replaces or drops employeeList.
I couldn't check backend code or logs from here, so the backend cause is unverified.
App-side evidence (commit 67eb990)
List source: the picker is built only from policy.employeeList. It skips deleted members and roles that can't create expenses: AssigneeStep.tsx:225-257.
Blank vs. loading: the skeleton depends only on areOptionsInitialized, not on employeeList: AssigneeStep.tsx:341. So a blank page with no skeleton means the filtered list was empty.
Empty, not filtered: with exactly one active member, the flow skips the picker and goes to confirmation. With zero, or two or more, it opens the picker: useAssignCard.ts:187-204. The owner is an admin and would pass the role filter, so a fully blank picker points to an empty employeeList rather than filtered entries.
No App write to employeeList: the App's optimistic data for assign and unassign only touches card and report keys: CompanyCards.ts:466-619. Any employeeList change must come from the server.
Activity
applause-bot commentedon Oct 29, 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/2b18703dcaf596090570928bac00b44232e1d4255f523655f0a190c998a0d65d
melvin-bot commentedon Oct 29, 2026
Triggered auto assignment to @mjasikowski (
DeployBlockerCash), see https://stackoverflowteams.com/c/expensify/questions/9980/ for more details.github-actions commentedon Oct 29, 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 29, 2026
💬 A slack conversation has been started in #expensify-open-source
jponikarchuk commentedon Oct 29, 2026
This issue is only reproducible with Staging Server enebled.
MelvinBot commentedon Oct 29, 2026
Deploy Blocker Investigation
Result: No App PR in Deploy Checklist: New Expensify 2026-10-29 (
9.5.25-0) explains this bug. Don't revert anything yet. This likely needs a staging backend/data check.Why:
jponikarchuksaid on [No QA] Add RBR to workspace agents + Prepare for 1:1:1 that this bug "is repro on all PRs." If every test build reproduces it, one App change is unlikely to be the cause. The staging API is the more likely source.Next steps:
policy.employeeListis wrong.OpenPolicyCompanyCardsPage(sent on reconnect) and to the assign/unassign requests. Look for anything that clears or reshapespolicy.employeeList.DeployBlockerCashback. It was removed when the label was switched toDeployBlocker.Investigation details
All line links point to App commit
67eb990.What the page depends on (unchanged in this release):
AssigneeStep.tsx:225-257builds options frompolicy.employeeList. The page shows a skeleton while!areOptionsInitialized(L341). Initialization waits on the screen transition (L111, L328). The last change was Hide Expensify team members from the company card and Expensify Card assignee pickers, which is already in production.useAssignCard.ts:72-75. Last changed 2026-10-15.WorkspaceCompanyCardsPage.tsx:98-100callsopenPolicyCompanyCardsPage. Not in this release.usePersonalDetailSearchSelector/base.ts:212andusePersonalDetailOptions.ts:204. Last changed 2026-10-21, already in production.SelectionList,InteractiveStepWrapper,ScreenWrapper/index.tsx,DecisionModal, oruseNetwork.Candidates ruled out:
ScreenWrapperContainer.tsx). It removes memoization and moves the four-finger-tap handler into a hook. No data or transition-end changes. Its banner only renders under the required-2FA overlay.useWorkspaceMembers, and the members/invite pages. Nothing in the assign-card flow.inverted.Gaps: I couldn't check the Mobile-Expensify PRs in the checklist. I didn't reproduce the bug or confirm the backend behavior.
Confidence: Low that any App PR caused this.
Next Steps: Reply with
@MelvinBot <your feedback>to refine this investigation.MelvinBot commentedon Oct 29, 2026
This appears to be a backend/internal issue. A separate internal investigation is needed.
Why: The bug only reproduces with the staging server on, and no App PR in this release changes the flow. On the App side, a blank cardholder list (with no loading skeleton) means the workspace member list (
policy.employeeList) was empty when the page opened. The App never writesemployeeListduring this flow, so a server response must have emptied it. Likely suspects are the responses toOpenPolicyCompanyCardsPage/OpenPolicyCompanyCardsFeed(sent on reconnect) andAssignCard/ unassign.To confirm:
employeeList.I couldn't check backend code or logs from here, so the backend cause is unverified.
App-side evidence (commit
67eb990)policy.employeeList. It skips deleted members and roles that can't create expenses:AssigneeStep.tsx:225-257.areOptionsInitialized, not onemployeeList:AssigneeStep.tsx:341. So a blank page with no skeleton means the filtered list was empty.useAssignCard.ts:187-204. The owner is an admin and would pass the role filter, so a fully blank picker points to an emptyemployeeListrather than filtered entries.OpenPolicyCompanyCardsPage, and the feed reload runs again:WorkspaceCompanyCardsPage.tsx:91-100.employeeList: the App's optimistic data for assign and unassign only touches card and report keys:CompanyCards.ts:466-619. AnyemployeeListchange must come from the server.employeeList. It's already in production, so it isn't the cause here.Next Steps: Reply with
@MelvinBot <your feedback>to refine this analysis.mjasikowski commentedon Oct 29, 2026
Investigating
m-natarajan commentedon Oct 29, 2026
Unable to reproduce this in v9.5.25-0
screen-20261029-153939-1793281141648.mp4