Skip to content

[Due for payment 2026-09-03] Spend - Unreported expense shown on arrow navigation on "Reports" as an empty report. #99627

Description

@jponikarchuk

If you haven’t already, check out our contributing guidelines for onboarding and email contributors@expensify.com to request to join our Slack channel!


Version Number: 9.4.62-1
Reproducible in staging?: Yes
Reproducible in production?: No
If this was caught during regression testing, add the test name, ID and link from BrowserStack: #98611
Email or phone of affected tester (no customers): ibellicotest+2766@gmail.com
Issue reported by: Applause Internal Team
Bug source: Exploratory - Significant User Experience Deterioration
Device used: Motorola MotoG60 / Android 12 (Hybrid app) - Windows 11 / Chrome
App Component: Search

Action Performed:

Prerequisite: Account has Self DM
Prerequisite 2: Account has at least one workspace.
Prerequisite 3: Have one manual expense created on Self DM and another one on workspace chat.

  1. Open the staging.new.expensify.com website.
  2. Navigate to "Spend" > "Reports"
  3. Note that only report of expense created on workspace is displayed.
  4. Open expense report.
  5. Note that arrow navigation with "X of 2" is displayed despite remaining created expense being unreported.
  6. Navigate to remaining expense.
  7. Note that you land on an empty report.

Expected Result:

User shouldn´t be able to navigate to an unreported expense via arrows while on "Reports" section.

Actual Result:

Unreported expense is counted on arrow navigation while on "Reports" section and navigating to it leads to an empty report.

Workaround:

Unknown

Platforms:

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

Screenshots/Videos

Video.mp4

View all open jobs on GitHub

Issue OwnerCurrent Issue Owner: @thelullabyy

Activity

  1. added
    BugSomething is broken. Auto assigns a BugZero manager.
    on Aug 27, 2026
  2. melvin-bot commented on Aug 27, 2026

    @melvin-bot

    You have been assigned to this deploy blocker because you recently merged this PR: #98611

  3. melvin-bot commented on Aug 27, 2026

    @melvin-bot

    @JS00001 @ShridharGoel you have been assigned to this deploy blocker because you reviewed the offending PR: #98611

  4. melvin-bot commented on Aug 27, 2026

    @melvin-bot

    @thelullabyy you have been assigned to this deploy blocker because you authored the offending PR: #98611

  5. melvin-bot commented on Aug 27, 2026

    @melvin-bot

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

  6. github-actions commented on Aug 27, 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.
  7. MelvinBot commented on Aug 27, 2026

    @MelvinBot
    Contributor

    🔍 Deploy Blocker Analysis

    Causing PR: Expensify/App#98611 — "Standardize Expense Report and Expense header with predictable button placement and carousel counter" (author thelullabyy, reviewers JS00001 / ShridharGoel) — High confidence

    Recommendation: 🟢 ROLL FORWARD with a targeted fix — do NOT revert.

    The stale carousel written from the flat Expenses view (which legitimately contains [workspace expense, unreported Self‑DM expense]) is never cleared when the user switches to the Reports view and opens a report. The Reports view inherits that 2‑item carousel, shows X of 2, and arrowing to the second (unreported) entry lands on an empty report.

    Root cause

    The counter is rendered from the Onyx key TRANSACTION_THREAD_NAVIGATION_TRANSACTION_IDS at MoneyRequestReportTransactionsNavigation.tsx:357 (total: transactionIDsList.length, sourced at L82). PR #98611 added the code that writes those IDs from the Search list, but the write/clear logic is not scoped to the active Spend sub‑view.

    Evidence chain
    1. carouselSiblingTransactionIDs is derived from the flat filteredData filtered to isTransactionListItemType — Search/index.tsx:563-570. In the flat Expenses view this correctly includes ALL expenses, including the unreported Self‑DM one.
    2. In the grouped Reports view, filteredData is TransactionGroupListItemType[] (report groups, not transaction items), so carouselSiblingTransactionIDs is empty.
    3. The write guard bails out and does NOT clear whenever the candidate list is empty — shouldWriteActiveTransactionIDsForSearch returns false when searchTransactionIDs.length === 0, consumed at Search/index.tsx:766-776.
    4. onSelectRow only clears the carousel when a transaction row is tapped (isTransactionItem); tapping a report group in the Reports view skips both the set and the clear branches — Search/index.tsx:584-590.

    Net effect: the carousel written from the Expenses view persists in Onyx and is never cleared/overwritten when moving to Reports. Because these IDs persist across sessions, the bug reproduces even going straight to Spend > Reports after a prior Expenses‑view interaction.

    Why not revert: #98611 is a 34‑file PR that also standardized the report/expense headers and bundled fixes for #96563, #96545, #96548, #96566, #96575. It's item #20 in the open StagingDeployCash checklist (#99596). A revert would reintroduce those as regressions; a scoped fix is safer and simpler.

    Recommended fix

    Scope carousel seeding to the active view instead of leaking stale IDs. Either (or both):

    • Make the empty‑candidate case in shouldWriteActiveTransactionIDsForSearch (or the useEffect at Search/index.tsx:766-776) clear the active IDs rather than early‑return false when the current view is grouped / has no flat transaction items.
    • In onSelectRow, call clearActiveTransactionIDs() when opening a report group (!isTransactionItem) so grouped Reports navigation is seeded by the report's own transactions, not the previous flat list.

    Assignees

    thelullabyy (author), JS00001 and ShridharGoel (reviewers) — already auto‑assigned.

    Label note: this is a frontend/App bug — DeployBlockerCash should stay; no DeployBlocker (web) label needed.


    Next Steps: Reply with @MelvinBot implement this to create a draft PR, or @MelvinBot <your feedback> to refine this analysis.


    view run

  8. m-natarajan commented on Aug 27, 2026

    @m-natarajan

    Not repro on Mac 26.5.1 Safari, v9.4.62-4

    Recording.2858.mp4
  9. added and removed
    ReviewingHas a PR in review
    on Aug 27, 2026
  10. changed the title [-]Spend - Unreported expense shown on arrow navigation on "Reports" as an empty report.[/-] [+][Due for payment 2026-09-03] Spend - Unreported expense shown on arrow navigation on "Reports" as an empty report.[/+] on Aug 27, 2026
  11. melvin-bot commented on Aug 27, 2026

    @melvin-bot

    @thelullabyy

    The solution for this issue has been 🚀 deployed to production 🚀 in version 9.4.62-4 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:

    If no regressions arise, payment will be issued on 2026-09-03. 🎊

    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]

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

Metadata

Metadata

Labels

BugSomething 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