Repository navigation
[Due for payment 2026-09-03] Spend - Self DM opens when navigating to offline created expense via arrow #99612
Description
Activity
- addedDeployBlockerCashThis issue or pull request should block deploymentThis issue or pull request should block deploymentBugSomething is broken. Auto assigns a BugZero manager.Something is broken. Auto assigns a BugZero manager.
on Aug 26, 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/561b902ac0ca01e02e46f28e965b36419a264d8be2dc3e99e91f8ba67dfbd6b1You have been assigned to this deploy blocker because you recently merged this PR: #98611
@JS00001 @ShridharGoel you have been assigned to this deploy blocker because you reviewed the offending PR: #98611
@thelullabyy you have been assigned to this deploy blocker because you authored the offending PR: #98611
💬 A slack conversation has been started in #expensify-open-source
github-actions commented
on Aug 26, 2026 on Aug 26, 2026 – with GitHub ActionsContributorMore actions👋 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.
- Find someone who can quickly fix the issue.
- Fix the issue yourself.
Issue Analysis
Root Cause: PR #98611 (merge
a29eb30) rewrote the prev/next transaction-thread arrow navigation and added a new short-circuit branch that navigates directly tonextTransaction.reportID(the transaction's parent report) instead of the expense's transaction thread, whenever the parent is a one-transaction report. For an offline-created Spend › Expenses expense,reportIDresolves to the self-DM chat report — so the arrow opens the whole self DM instead of the next expense. SeeMoneyRequestReportTransactionsNavigation.tsx:228-233(onNext) and its mirror:293-298(onPrevious).The
reportID !== CONST.REPORT.UNREPORTED_REPORT_IDguard was meant to exclude this case, but it only filters the'0'sentinel — an offline self-DM expense carries a real (non-'0') reportID pointing at the chat, so it slips through the guard and the branch fires. The correct target (the transaction threadchildReportID, creating an optimistic thread when missing) is still computed just below, but the new branchreturns before that code runs.Recommended Fix (roll forward preferred): Tighten both mirrored branches so they don't fire when the resolved
nextTransaction.reportID/prevTransaction.reportIDis a chat / self-DM report (or otherwise has no resolvable one-transaction expense thread) — let those cases fall through to the existingchildReportID/createTransactionThreadReportpath below. This is a small, contained change to one file. A full revert of #98611 is heavier (34 files of wanted header-standardization + carousel work) and should only be used if a safe targeted fix can't land in the deploy window.Investigation details
Culprit confirmation (High confidence): PR #98611 directly rewrote the failing code path —
MoneyRequestReportTransactionsNavigation.tsx(+233/−148), plus supportinguseNavigateToTransactionThread.tsandTransactionThreadNavigation.ts. Timeline matches (merged 2026-08-26, version 9.4.62, staging-only because the feature doesn't exist in production). Before this PR,onNext/onPreviousresolved the target strictly through the transaction thread (nextParentReportAction?.childReportID), creating an optimistic thread when none existed. This PR added the new parent-report short-circuit ahead of that logic.Why the guard is insufficient:
isOneTransactionReportisreport?.transactionCount === 1(ReportUtils.ts:2819-2821). For an offline self-DM expense the sibling'sreportIDpoints at the self-DM chat, which reports as a one-transaction report and is not the'0'UNREPORTED_REPORT_IDsentinel — soisOneTransactionReport(...) && reportID && reportID !== UNREPORTED_REPORT_IDis all true and the branch navigates to the chat report viaNavigation.setParams({reportID: <self-DM reportID>}).Symptom → mechanism → fix all line up: open expense → tap arrow → new branch resolves parent (= self DM) →
setParams(reportID = self-DM)→ self DM opens. The pre-existingchildReportIDpath below (~256-285) is the correct destination and already handles the optimistic-thread case.
Next Steps for Contributor+ team:
To accept:@MelvinBot implement [this](https://github.com/Expensify/App/blob/a29eb30142d79be6251894dbfd8d4443ecee1f31/src/components/MoneyRequestReportView/MoneyRequestReportTransactionsNavigation.tsx#L228-L233)to create a draft PR.
To refine:@MelvinBot <your feedback>
To reject: Explain why you are rejecting Melvin's proposal.
Not repro (Feature reverted), Win 11/Chrome, v9.4.62-4
Recording.3438.mp4
- removedDeployBlockerCashThis issue or pull request should block deploymentThis issue or pull request should block deploymentHourlyKSv2KSv2
on Aug 27, 2026 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]
- changed the title
[-]Spend - Self DM opens when navigating to offline created expense via arrow[/-][+][Due for payment 2026-09-03] Spend - Self DM opens when navigating to offline created expense via arrow[/+]on Aug 27, 2026
Metadata
Metadata
Assignees
Labels
Type
Projects
- StatusShow more project fieldsDone
If you haven’t already, check out our contributing guidelines for onboarding. To join our Slack channel, fill out this form.
Version Number: 9.4.62-1
Reproducible in staging?: Yes
Reproducible in production?: N/A - new feature, doesn't exist in prod
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): sdsiodjnosdjiodsj@gmail.com
Issue reported by: Applause Internal Team
Bug source: Exploratory - Significant User Experience Deterioration
Device used: Mac 26.5 / Chrome
App Component: Money Requests
Action Performed:
Expected Result:
Next expense details thread will open.
Actual Result:
Self DM opens.
Workaround:
Unknown
Platforms:
Screenshots/Videos
To be added by Applause Leads
View all open jobs on GitHub
Issue Owner
Current Issue Owner: @thelullabyy