Skip to content

[Due for payment 2026-10-14] Tags - Importing independent multi level tags loads infinitely. #102623

Closed

Description

@applause-bot

If you haven’t already, check out our contributing guidelines for onboarding. To join our Slack channel, fill out this form.


Version Number: V9.4.97-0
Reproducible in staging?: Yes
Reproducible in production?: No
If this was caught during regression testing, add the test name, ID and link from BrowserStack: https://test-management.browserstack.com/projects/2219752/test-runs/76328606/folder/57600901/41237320/1811656453?sort=%2Bname
Email or phone of affected tester (no customers): [email protected]
Issue reported by: Applause Internal Team
Bug source: Exploratory - Significant User Experience Deterioration
Device used: Redmi note 10s android 13
App Component: Workspace Settings

Action Performed:

  1. Launch app
  2. Go to workspace settings
  3. Enable tags and try to import independent multi level tags

Expected Result:

Importing independent multi level tags must not load infinitely.

Actual Result:

Importing independent multi level tags loads infinitely.

Note : similarly import per diem loads infinitely

Workaround:

Unknown

Platforms:

  • Android: App
  • Android: mWeb Chrome
  • iOS: App
  • iOS: mWeb Safari
  • iOS: mWeb Chrome
  • Windows: Chrome
  • MacOS: Chrome Safari

Screenshots/Videos

Bug7273129_1790742916584.Screenrecorder-2026-09-30-10-01-10-652.mp4

View all open jobs on GitHub

Applause Internal Information
Exported by: Julia Ponikarchuk
Bug ID: 7273129

Issue OwnerCurrent Issue Owner: @Pujan92

Activity

  1. added
    DeployBlockerCashThis issue or pull request should block deployment
    BugSomething is broken. Auto assigns a BugZero manager.
    on Sep 30, 2026
  2. applause-bot commented on Sep 30, 2026

    @applause-bot
    Author

    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

  3. melvin-bot commented on Sep 30, 2026

    @melvin-bot

    Triggered auto assignment to @Julesssss (DeployBlockerCash), see https://stackoverflowteams.com/c/expensify/questions/9980/ for more details.

  4. melvin-bot commented on Sep 30, 2026

    @melvin-bot

    💬 A slack conversation has been started in #expensify-open-source

  5. github-actions commented on Sep 30, 2026

    @github-actions
    Contributor

    👋 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:

    1. Identify the pull request that introduced this issue and revert it.
    2. Find someone who can quickly fix the issue.
    3. Fix the issue yourself.
  6. changed the title [-]Tags-Importing independent multi level tags loads infinitely.[/-] [+]Tags - Importing independent multi level tags loads infinitely.[/+] on Sep 30, 2026
  7. MelvinBot commented on Sep 30, 2026

    @MelvinBot
    Contributor

    Deploy Blocker Investigation

    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:

    1. Check the tester's logs ([email protected], 2026-09-30). See whether ImportMultiLevelTags and ImportPerDiemRates got a response.
    2. 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.
    3. 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.

    Where the spinner waits:

    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):

    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

  8. suneox commented on Sep 30, 2026

    @suneox
    Contributor

    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

  9. suneox commented on Sep 30, 2026

    @suneox
    Contributor

    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.ts normalizeArgs). 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:

    module: {type: 'commonjs', lazy: false, strictMode: !options.hermesLowering},

    I tested it with a Re.Pack production bundle on the Android emulator. here is the fixed branch

  10. Julesssss commented on Sep 30, 2026

    @Julesssss
    Contributor

    Excellent, thank you @suneox could you please raise a PR.

    Logic checks out, the bug might be extended to category and member imports too.

  11. 19 remaining items

  12. melvin-bot commented on Oct 13, 2026

    @melvin-bot

    Triggered auto assignment to @mallenexpensify (Awaiting Payment)

  13. melvin-bot commented on Oct 13, 2026

    @melvin-bot

    Payment Summary

    Resolving PRs:

    BugZero Checklist (@mallenexpensify)

    • I have confirmed assignees, roles, and Upwork contracts look correct
    • I have paid out Upwork contracts / manual NewDot requests
    • [BugZero Assignee] I have created a GH issue for creating/updating the regression test once above steps have been agreed upon
  14. suneox commented on Oct 14, 2026

    @suneox
    Contributor

    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:

    • 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:

    1. Go to Workspace settings > Tags > More > Import spreadsheet > Multi-level tags.
    2. Choose the CSV, keep "These are independent tags" ON, tap Next.
    3. Tap Import and verify the "Import successful" modal shows, and the tag lists appear.
    4. Repeat with "These are independent tags" OFF (dependent multi-level tags).
    5. Repeat once on the other mobile platform.

    Do we agree 👍 or 👎

  15. melvin-bot commented on Oct 16, 2026

    @melvin-bot

    @mallenexpensify Uh oh! This issue is overdue by 2 days. Don't forget to update your issues!

  16. mallenexpensify commented on Oct 16, 2026

    @mallenexpensify
    Contributor

    @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.

  17. suneox commented on Oct 18, 2026

    @suneox
    Contributor

    @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)

  18. mallenexpensify commented on Oct 18, 2026

    @mallenexpensify
    Contributor

    Payment Summary

    Contributor+: @suneox due $175 via NewDot
    Contributor+: @Pujan92 due $175 via NewDot

  19. twisterdotcom commented on Oct 21, 2026

    @twisterdotcom
    Contributor

    $175 approved for @Pujan92 in Report ID: R00OZufVgPKg.

    Zapier Logs Run ID: 00040eee-da3c-a82b-97fc-6c32e17edc14

    SO: https://stackoverflowteams.com/c/expensify/questions/7582

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

Awaiting PaymentAuto-added when associated PR is deployed to productionBugSomething is broken. Auto assigns a BugZero manager.DailyKSv2Engineering

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions