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
[Due for payment 2026-10-14] Tags - Importing independent multi level tags loads infinitely. #102623
👋 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 this release looks responsible. Keep DeployBlockerCash until the cause is found. Don't revert anything yet.
Why: No App PR on the 9.4.97-0 checklist changes the shared import flow. The only native changes in App are version bumps. Both imports hang in the same place: waiting for the server's reply before showing the confirmation modal. A backend or native-side cause is more likely than an App change.
Next steps:
Check the tester's logs ([email protected], 2026-09-30). See whether ImportMultiLevelTags and ImportPerDiemRates got a response.
Try the same steps on web staging. If web also hangs, the cause is likely on the backend. If only Android hangs, look at the native build.
Confirm which spinner is stuck: "Choose file" or the "Import" button on the columns page. A stuck "Choose file" points to Android file reading instead.
Investigation details
Diff checked:origin/production vs origin/staging (staging SHA c318e93e85e8e406abd32dc58fa951d0e56950b8). There are no changes to ImportSpreadsheet.tsx, ImportSpreadsheetColumns.tsx, useImportSpreadsheetConfirmModal.ts, libs/actions/ImportSpreadsheet.ts, Policy/Tag.ts, Policy/PerDiem.ts, the per diem pages, the tag import pages, or the network layer. I checked the file lists of all 46 App PRs on the checklist. None touches the import pages, the file picker, or the import actions.
If the request never returns, or the modal never opens, the spinner runs forever. Staging builds use the staging API by default and production builds don't. That fits "staging only" without an App code change.
feat: use floating RHP style on web touches BaseModal.tsx and the right-hand panel navigators. It would matter only if the confirmation modal fails to open on Android, and it mainly targets web.
I was able to reproduce the issue and found the error
[info] [SequentialQueue] Request failed with error - {"command":"ImportMultiLevelTags","errorName":"TypeError","errorMessage":"Cannot assign to property 'name' which has only a getter","errorStatus":"unknown","shouldFailAllRequests":false}
console.js:538 [info] [SequentialQueue] Will retry request after rollback and throttle delay - {"command":"ImportMultiLevelTags","errorMessage":"Cannot assign to property 'name' which has only a getter"}
I'm still doing another check rootcause and working on a solution to fix the issue
Follow-up on the error above. The root cause is https://github.com/Expensify/Mobile-Expensify/pull/14144, which switched HybridApp release bundling from Metro to Re.Pack. That's why none of the App PRs in this release look related.
On native, readFileAsync gives back a React Native File, and its name only has a getter.
prepareRequestPayload calls formData.append('file', file), which goes through expo's patch (expo/src/winter/FormData.tsnormalizeArgs). The patch does value.name = blobFilename ?? 'blob'.
Metro's @react-native/babel-preset compiles modules with strictMode: false, so that assignment used to do nothing. Our Re.Pack loader (cjs-inline-requires-loader.mjs) lowers node_modules with SWC, which adds "use strict". Now the assignment throws TypeError: Cannot assign to property 'name' which has only a getter.
The request is never sent. SequentialQueue retries it with backoff, so the button keeps spinning and eventually shows "Import failed".
TypeError: Cannot assign to property 'name' which has only a getter
at normalizeArgs // expo/src/winter/FormData.ts
at append // expo's FormData.prototype.append patch
at anonymous // src/libs/prepareRequestPayload/index.native.ts
Fix: match Metro for node_modules only, and keep src strict:
[Contributor] The offending PR and associated issue have been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake.
[Contributor] If the regression was CRITICAL (e.g. interrupts a core flow) A discussion in #expensify-open-source has been started about whether any other steps should be taken (e.g. updating the PR review checklist) in order to catch this type of bug sooner.
Link to discussion: N/A
[Contributor] If it was decided to create a regression test for the bug, please propose the regression test steps using the template below to ensure the same bug will not reach production again.
Regression Test Proposal
Precondition:
Android or iOS app on a release/adhoc or staging production build (the bug only reproduced in Re.Pack release bundles, not web or debug).
A workspace on the Control plan with Tags enabled.
A CSV with 2+ columns, e.g. header Department,Project and 3 data rows.
Test:
Go to Workspace settings > Tags > More > Import spreadsheet > Multi-level tags.
Choose the CSV, keep "These are independent tags" ON, tap Next.
Tap Import and verify the "Import successful" modal shows, and the tag lists appear.
Repeat with "These are independent tags" OFF (dependent multi-level tags).
@suneox this issue and/or PR mention a deploy blocker or a regression. Before the payment date, post one of the three options in step 20 of the C+ doc: it was a regression, it was not, or you did not review the offending PR. If you don't post, the default is to reduce payment.
The offending PR #99407 was reviewed and approved by shubham1206agra (approval). The PR reviewed on this issue was #102681, the fix itself. The regression learning comment on the offending PR is already posted: #99407 (comment)
Activity
applause-bot commentedon Sep 30, 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/7dd9317bbf3b163ad02c0a6294b6494f055486431c4fb924d83233b341cafbf0
melvin-bot commentedon Sep 30, 2026
Triggered auto assignment to @Julesssss (
DeployBlockerCash), see https://stackoverflowteams.com/c/expensify/questions/9980/ for more details.melvin-bot commentedon Sep 30, 2026
💬 A slack conversation has been started in #expensify-open-source
github-actions commentedon Sep 30, 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:
[-]Tags-Importing independent multi level tags loads infinitely.[/-][+]Tags - Importing independent multi level tags loads infinitely.[/+]MelvinBot commentedon Sep 30, 2026
Deploy Blocker Investigation
Result: No App PR in this release looks responsible. Keep
DeployBlockerCashuntil the cause is found. Don't revert anything yet.Why: No App PR on the 9.4.97-0 checklist changes the shared import flow. The only native changes in App are version bumps. Both imports hang in the same place: waiting for the server's reply before showing the confirmation modal. A backend or native-side cause is more likely than an App change.
Next steps:
ImportMultiLevelTagsandImportPerDiemRatesgot a response.Investigation details
Diff checked:
origin/productionvsorigin/staging(staging SHAc318e93e85e8e406abd32dc58fa951d0e56950b8). There are no changes toImportSpreadsheet.tsx,ImportSpreadsheetColumns.tsx,useImportSpreadsheetConfirmModal.ts,libs/actions/ImportSpreadsheet.ts,Policy/Tag.ts,Policy/PerDiem.ts, the per diem pages, the tag import pages, or the network layer. I checked the file lists of all 46 App PRs on the checklist. None touches the import pages, the file picker, or the import actions.Where the spinner waits:
importMultiLevelTags(Tag.ts:871-929). That function waits for the server response throughwaitForImportFinalModal(ImportSpreadsheet.ts:108-138).importPerDiemRates(PerDiem.ts:144-162).If the request never returns, or the modal never opens, the spinner runs forever. Staging builds use the staging API by default and production builds don't. That fits "staging only" without an App code change.
Weak App candidates (low confidence, don't revert):
src/libs/ApiUtils.ts. On reading, its behavior matches the old code.BaseModal.tsxand the right-hand panel navigators. It would matter only if the confirmation modal fails to open on Android, and it mainly targets web.Possibly related: Android - Home - "Spend over time" section loads infinitelly after expense creation. is another Android-only infinite spinner from this release. It may share the same cause.
Next Steps: Reply with
@MelvinBot <your feedback>to refine this analysis.view run
suneox commentedon Sep 30, 2026
I was able to reproduce the issue and found the error
I'm still doing another check rootcause and working on a solution to fix the issue
suneox commentedon Sep 30, 2026
Follow-up on the error above. The root cause is https://github.com/Expensify/Mobile-Expensify/pull/14144, which switched HybridApp release bundling from Metro to Re.Pack. That's why none of the App PRs in this release look related.
readFileAsyncgives back a React NativeFile, and itsnameonly has a getter.prepareRequestPayloadcallsformData.append('file', file), which goes through expo's patch (expo/src/winter/FormData.tsnormalizeArgs). The patch doesvalue.name = blobFilename ?? 'blob'.@react-native/babel-presetcompiles modules withstrictMode: false, so that assignment used to do nothing. Our Re.Pack loader (cjs-inline-requires-loader.mjs) lowers node_modules with SWC, which adds"use strict". Now the assignment throwsTypeError: Cannot assign to property 'name' which has only a getter.Fix: match Metro for node_modules only, and keep
srcstrict:I tested it with a Re.Pack production bundle on the Android emulator. here is the fixed branch
Julesssss commentedon Sep 30, 2026
Excellent, thank you @suneox could you please raise a PR.
Logic checks out, the bug might be extended to category and member imports too.
19 remaining items
melvin-bot commentedon Oct 13, 2026
Triggered auto assignment to @mallenexpensify (
Awaiting Payment)melvin-bot commentedon Oct 13, 2026
Payment Summary
Resolving PRs:
Disable strict mode in Re.Pack to match Metro #102681
Reviewer: @suneox owed $175 via NewDot
BugZero Checklist (@mallenexpensify)
suneox commentedon Oct 14, 2026
Contributor+ Checklist:
[Contributor] The offending PR and associated issue have been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake.
Link to the comment on the PR: Bundle native builds with Re.Pack + OXC transform pipeline #99407 (comment)
[Contributor] If the regression was CRITICAL (e.g. interrupts a core flow) A discussion in #expensify-open-source has been started about whether any other steps should be taken (e.g. updating the PR review checklist) in order to catch this type of bug sooner.
Link to discussion: N/A
[Contributor] If it was decided to create a regression test for the bug, please propose the regression test steps using the template below to ensure the same bug will not reach production again.
Regression Test Proposal
Precondition:
Department,Projectand 3 data rows.Test:
Do we agree 👍 or 👎
melvin-bot commentedon Oct 16, 2026
@mallenexpensify Uh oh! This issue is overdue by 2 days. Don't forget to update your issues!
mallenexpensify commentedon Oct 16, 2026
@suneox this issue and/or PR mention a deploy blocker or a regression. Before the payment date, post one of the three options in step 20 of the C+ doc: it was a regression, it was not, or you did not review the offending PR. If you don't post, the default is to reduce payment.
suneox commentedon Oct 18, 2026
@mallenexpensify No deploy blocker was referenced after the resolving PR #102681 was merged
The offending PR #99407 was reviewed and approved by shubham1206agra (approval). The PR reviewed on this issue was #102681, the fix itself. The regression learning comment on the offending PR is already posted: #99407 (comment)
mallenexpensify commentedon Oct 18, 2026
Payment Summary
Contributor+: @suneox due $175 via NewDot
Contributor+: @Pujan92 due $175 via NewDot
twisterdotcom commentedon Oct 21, 2026
$175 approved for @Pujan92 in Report ID: R00OZufVgPKg.
Zapier Logs
Run ID: 00040eee-da3c-a82b-97fc-6c32e17edc14SO: https://stackoverflowteams.com/c/expensify/questions/7582