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-21] [$175] Not here page opens when creating new workspace from FAB on Account and Insights tab #102095
WORKSPACE_CONFIRMATION is a dynamic route — it is appended as a suffix to whatever path is currently active, and it is only allowed to open from a whitelist of screens (src/ROUTES.ts:235-238):
The FAB item calls createDynamicRoute(...)with no basePath (NewWorkspaceMenuItem.tsx:58), so the base path is whatever getActiveRoute() returns (createDynamicRoute.ts:77). On the two broken tabs that active path resolves to a screen that is not in the whitelist:
Account tab, wide layout:SettingsSplitNavigator pushes SCREENS.SETTINGS.PROFILE.ROOT as the central pane and makes it the focused route (SettingsSplitNavigator.tsx:46, SplitRouter.ts:117). The URL is settings/profile, not settings, so the built route is settings/profile/workspace/confirmation. SETTINGS.PROFILE.ROOT is not whitelisted — only SETTINGS.ROOT is.
Insights tab: the active path is insights/:dashboardID → focused route SCREENS.INSIGHTS, which is not in the list at all.
The whitelist check fails at getStateFromPath.ts:49, the path falls through to React Navigation's parser, matches nothing, and lands on the '*' → SCREENS.NOT_FOUND catch-all (config.ts:40) — the "Not here" page.
This also explains why only Windows: Chrome and MacOS: Chrome/Safari are ticked: on a narrow layout the split navigator pushes no central pane, so the Account tab URL stays settings, SETTINGS.ROOT matches, and the flow works.
What changes do you think we should make in order to solve the problem?
The FAB is rendered in the navigation tab bar, so it is reachable from every tab and every central-pane screen. The whitelist for this one route should reflect that — widen DYNAMIC_ROUTES.WORKSPACE_CONFIRMATION.entryScreens in src/ROUTES.ts:237 to ['*'], which the validator already supports and which ~10 other dynamic routes already use.
Add a case to tests/navigation/workspaceConfirmationEntryScreensTest.ts asserting that settings/profile/workspace/confirmation and insights/<dashboardID>/workspace/confirmation resolve to the confirmation screen rather than SCREENS.NOT_FOUND.
No change is needed to the child routes (currency, plan type, owner selector) — they key off SCREENS.WORKSPACE_CONFIRMATION.DYNAMIC_ROOT and work once the root opens.
What alternative solutions did you explore? (Optional)
Two narrower options and why I'd not pick them
1. Enumerate the missing screens — add SCREENS.INSIGHTS plus every Account-tab central screen (SETTINGS.PROFILE.ROOT, SETTINGS.WALLET.ROOT, SETTINGS.SECURITY, …). This fixes the reported repro but is fragile: any new settings page or new tab silently reintroduces the bug, because the FAB is global and the whitelist is not.
2. Pass a fixed basePath to createDynamicRoute in NewWorkspaceMenuItem, the way WorkspaceListTable passes ROUTES.WORKSPACES_LIST.route. This works, but it changes what sits behind the RHP and where dismiss returns the user, so it's a UX change rather than a bug fix.
Not verified in a browser. Browser control was unavailable for this run, so this is static analysis of the navigation code only. Worth confirming the URL on the Account tab really reads settings/profile before implementing.
Possibly related
Teacher Unite - QAB open not here page (Expensify/App#101092) — open, same "Not here from the FAB on Windows Chrome" family, different dynamic route (QAB). May share the entry-screen validation root cause.
Next Steps for Contributor+ team: To accept:@MelvinBot implement [this](https://github.com/Expensify/App/issues/102095) to create a draft PR. To refine:@MelvinBot <your feedback> To reject: Explain why you are rejecting Melvin's proposal.
What dmkt9 needs to do: submit a proposal on Upwork, from the same account as their profile link, to the job in the latest prompt: upwork.com/jobs/~022108111025467606168 on #103430. They don't need to post anything on GitHub.
@dmkt9 can plz do so and confirm once you have? Thx
@dmkt9 can plz do so and confirm once you have? Thx
@mallenexpensify I'm seeing this message: "This job is private. Only freelancers invited by the client can view this job." I can't view the job details.
What dmkt9 needs to do: submit a proposal on Upwork, from the same account as their profile link, to the job in the latest prompt: upwork.com/jobs/~022108111025467606168 on #103430. They don't need to post anything on GitHub.
The bot might store the ID only when someone is hired from the proposal, not when the proposal is submitted. If you hired them after 13:52 UTC today, the next bot prompt is the real test. If the bot asks dmkt9 for their Upwork ID again on a new job, capture is broken. Someone with access to the bot's internal code would need to check it.
I can't see the bot's code or database, so this is based only on its public comments.
According to the bot's own prompt, the trigger is the proposal, not the hire. The prompt says: "Once you apply to the Upwork job, your Upwork ID will be stored."
That didn't work here. dmkt9 applied on Oct 23, and the bot asked for their Upwork ID again on Oct 24 and Oct 26. Someone with access to the bot's internal code needs to check why the ID wasn't captured.
Possible causes (unverified)
I can't see the bot's code, so these are guesses based on its public behavior:
The job was private until you made it public on Oct 22. The bot might not read proposals on jobs that started private.
The bot might check for proposals only at certain moments, for example when it posts the prompt, and not afterward.
The Upwork account dmkt9 used for the proposal might not match the profile link the bot has on file.
Your rehire on the proposal might also help if the bot reads hires. I can't confirm that. The next job dmkt9 is assigned to will show it: a new "missing your Upwork ID" prompt means the ID still isn't stored.
Activity
applause-bot commentedon Sep 23, 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/e651876098750de3d5c0040c96408e30052ef7ba2eb877ea89e85b8d117742e5
MelvinBot commentedon Sep 23, 2026
Proposal
What is the root cause of that problem?
WORKSPACE_CONFIRMATIONis a dynamic route — it is appended as a suffix to whatever path is currently active, and it is only allowed to open from a whitelist of screens (src/ROUTES.ts:235-238):The FAB item calls
createDynamicRoute(...)with nobasePath(NewWorkspaceMenuItem.tsx:58), so the base path is whatevergetActiveRoute()returns (createDynamicRoute.ts:77). On the two broken tabs that active path resolves to a screen that is not in the whitelist:SettingsSplitNavigatorpushesSCREENS.SETTINGS.PROFILE.ROOTas the central pane and makes it the focused route (SettingsSplitNavigator.tsx:46,SplitRouter.ts:117). The URL issettings/profile, notsettings, so the built route issettings/profile/workspace/confirmation.SETTINGS.PROFILE.ROOTis not whitelisted — onlySETTINGS.ROOTis.insights/:dashboardID→ focused routeSCREENS.INSIGHTS, which is not in the list at all.The whitelist check fails at
getStateFromPath.ts:49, the path falls through to React Navigation's parser, matches nothing, and lands on the'*'→SCREENS.NOT_FOUNDcatch-all (config.ts:40) — the "Not here" page.This also explains why only Windows: Chrome and MacOS: Chrome/Safari are ticked: on a narrow layout the split navigator pushes no central pane, so the Account tab URL stays
settings,SETTINGS.ROOTmatches, and the flow works.What changes do you think we should make in order to solve the problem?
The FAB is rendered in the navigation tab bar, so it is reachable from every tab and every central-pane screen. The whitelist for this one route should reflect that — widen
DYNAMIC_ROUTES.WORKSPACE_CONFIRMATION.entryScreensinsrc/ROUTES.ts:237to['*'], which the validator already supports and which ~10 other dynamic routes already use.Add a case to
tests/navigation/workspaceConfirmationEntryScreensTest.tsasserting thatsettings/profile/workspace/confirmationandinsights/<dashboardID>/workspace/confirmationresolve to the confirmation screen rather thanSCREENS.NOT_FOUND.No change is needed to the child routes (currency, plan type, owner selector) — they key off
SCREENS.WORKSPACE_CONFIRMATION.DYNAMIC_ROOTand work once the root opens.What alternative solutions did you explore? (Optional)
Two narrower options and why I'd not pick them
1. Enumerate the missing screens — add
SCREENS.INSIGHTSplus every Account-tab central screen (SETTINGS.PROFILE.ROOT,SETTINGS.WALLET.ROOT,SETTINGS.SECURITY, …). This fixes the reported repro but is fragile: any new settings page or new tab silently reintroduces the bug, because the FAB is global and the whitelist is not.2. Pass a fixed
basePathtocreateDynamicRouteinNewWorkspaceMenuItem, the wayWorkspaceListTablepassesROUTES.WORKSPACES_LIST.route. This works, but it changes what sits behind the RHP and where dismiss returns the user, so it's a UX change rather than a bug fix.Not verified in a browser. Browser control was unavailable for this run, so this is static analysis of the navigation code only. Worth confirming the URL on the Account tab really reads
settings/profilebefore implementing.Possibly related
Expensify/App#101092) — open, same "Not here from the FAB on Windows Chrome" family, different dynamic route (QAB). May share the entry-screen validation root cause.Next Steps for Contributor+ team:
To accept:
@MelvinBot implement [this](https://github.com/Expensify/App/issues/102095)to create a draft PR.To refine:
@MelvinBot <your feedback>To reject: Explain why you are rejecting Melvin's proposal.
view run
melvin-bot commentedon Sep 23, 2026
Triggered auto assignment to Contributor-plus team member for initial proposal review - @dmkt9 (
External)melvin-bot commentedon Sep 23, 2026
Unable to auto-create job on Upwork. The BZ team member should create it manually for this issue.
naufalfx805-source commentedon Sep 24, 2026
naufalfx805-source commentedon Sep 24, 2026
melvin-bot commentedon Sep 24, 2026
✅ Contributor details stored successfully. Thank you for contributing to Expensify!
melvin-bot commentedon Sep 28, 2026
@dmkt9 Eep! 4 days overdue now. Issues have feelings too...
dmkt9 commentedon Sep 29, 2026
MelvinBot's proposal looks good to me
🎀 👀 🎀 C+
40 remaining items
mallenexpensify commentedon Oct 21, 2026
@dmkt9 can plz do so and confirm once you have? Thx
dmkt9 commentedon Oct 22, 2026
@mallenexpensify I'm seeing this message: "This job is private. Only freelancers invited by the client can view this job." I can't view the job details.
mallenexpensify commentedon Oct 22, 2026
@dmkt9 I just made this job public, can you submit a proposal on it?
https://www.upwork.com/jobs/~022108111025467606168
@dmkt9 , can you please accept the job below (for payment on this job)? Please reply here and tag me once you have.
https://www.upwork.com/jobs/~022113380053525892208
dmkt9 commentedon Oct 23, 2026
@mallenexpensify I've submitted a proposal https://www.upwork.com/nx/proposals/2113543083130322945?success
@mallenexpensify I've accepted the offer
mallenexpensify commentedon Oct 26, 2026
Payment Summary
Contributor+: @dmkt9 paid $175 via Upwork
@dmkt9 thanks for submitting a proposal on the other job, let's see if it works.
mallenexpensify commentedon Oct 26, 2026
@MelvinBot @dmkt9 submitted a proposal and I rehired them here - https://www.upwork.com/nx/proposals/2113543083130322945?success . Can you confirm details were stored for them to get auto-offers going forward?
MelvinBot commentedon Oct 26, 2026
I can't confirm the Upwork ID was stored. The bot's latest posts suggest it wasn't.
dmkt9submitted the proposal on Oct 23. After that, the bot still asked for their Upwork ID twice:The Oct 25 Payment Summary on Choosing a large file to share doesn't redirect App to Home after attach error msg appears also still says "Needs manual offer from BZ."
What could still change this
dmkt9for their Upwork ID again on a new job, capture is broken. Someone with access to the bot's internal code would need to check it.view run
mallenexpensify commentedon Oct 26, 2026
@MelvinBot is the trigger the submission of the proposal or is it an employee hiring them in Upwork?
MelvinBot commentedon Oct 26, 2026
According to the bot's own prompt, the trigger is the proposal, not the hire. The prompt says: "Once you apply to the Upwork job, your Upwork ID will be stored."
That didn't work here.
dmkt9applied on Oct 23, and the bot asked for their Upwork ID again on Oct 24 and Oct 26. Someone with access to the bot's internal code needs to check why the ID wasn't captured.Possible causes (unverified)
I can't see the bot's code, so these are guesses based on its public behavior:
dmkt9used for the proposal might not match the profile link the bot has on file.Your rehire on the proposal might also help if the bot reads hires. I can't confirm that. The next job
dmkt9is assigned to will show it: a new "missing your Upwork ID" prompt means the ID still isn't stored.view run