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-11-05] [$175] Expense - Unable to create expense with Parent\\:Child tag, wrong preview on Tag field&table #104911
Version Number: 9.5.20-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:#104305 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: Mac 26.5 / Chrome App Component: Money Requests
Action Performed:
Precondition:
Enable Tags.
Create this tag - Parent\:Child
Go to staging.new.expensify.com
Go to workspace chat.
Open FAB > Create expense > Manual.
Create an expense with Parent\:Child tag.
→ Expense cannot be created. Nothing happens after clicking Create expense.
Create two expenses without tag.
Open any expense.
Change the tag to Parent\:Child.
Return to expense report.
Expected Result:
In Step 4, expense can be created with Parent\:Child tag.
In Step 7, Tag field will show Parent\:Child when Parent\:Child tag is selected.
In Step 8, table will show Parent\:Child tag.
Actual Result:
In Step 4, expense cannot be created with Parent\:Child tag. Nothing happens after clicking Create expense..
In Step 7, Tag field shows Parent\when Parent\:Child tag is selected.
In Step 8, Parent\, Child is shown on the table.
👋 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.
Recommendation: Revert. It is a one-line change in one file plus tests, and nothing depends on it.
Root cause: The PR changed escapeTagName in src/libs/PolicyUtils/tag.ts:271 from replaceAll(':', '\\:') to replaceAll(/(?<!\\):/g, '\\:'). The lookbehind treats any colon after a backslash as already escaped. In Parent\\:Child, though, the backslash before the colon is itself escaped, so the colon is still a level separator. The tag is now saved unescaped and splits into Parent\\ and Child.
Investigation details
How each symptom happens
Production: saves Parent\\\:Child. getTagArrayFromName reads this as one level, so it works.
Staging: saves Parent\\:Child. The same parser reads it as two levels: ['Parent\\', 'Child'].
Create expense does nothing:useConfirmationValidation.ts:273-275 calls hasMatchingTag. Neither split part matches a policy tag, so validation fails with tagOutOfPolicy and submit is blocked. This is the likely mechanism; I didn't confirm how the error shows in the UI.
The PR review thread raised the \\: case, and the reviewers marked it out of scope. They missed that production already handled it correctly, so leaving it out caused a regression.
escapeTagName now escapes a colon unless an odd number of backslashes comes before it, so parent\\:child is saved as parent\\\:child and stays one tag level. I added unit tests for the \\: and \\\: cases. The related unit tests, typecheck, lint, and spell check pass. I didn't test it in the UI.
changed the title [-]Expense - Unable to create expense with Parent\\:Child tag, wrong preview on Tag field&table[/-][+][$175] Expense - Unable to create expense with Parent\\:Child tag, wrong preview on Tag field&table[/+]on Oct 27, 2026
changed the title [-][$175] Expense - Unable to create expense with Parent\\:Child tag, wrong preview on Tag field&table[/-][+][Due for payment 2026-11-05] [$175] Expense - Unable to create expense with Parent\\:Child tag, wrong preview on Tag field&table[/+]on Oct 29, 2026
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.24-8 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-11-05. 🎊
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]
Activity
applause-bot commentedon Oct 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/3c919e0818052c9a1dca99ca9f96ceb79094c6838cb7be894e32c299df695dbb
melvin-bot commentedon Oct 23, 2026
@blimpich recently merged #104305, but they are OOO right now, so I'll auto-assign someone else.
github-actions commentedon Oct 23, 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:
melvin-bot commentedon Oct 23, 2026
Triggered auto assignment to @yuwenmemon (
DeployBlockerCash), see https://stackoverflowteams.com/c/expensify/questions/9980/ for more details.melvin-bot commentedon Oct 23, 2026
@blimpich @bernhardoj you have been assigned to this deploy blocker because you reviewed the offending PR: #104305
melvin-bot commentedon Oct 23, 2026
💬 A slack conversation has been started in #expensify-open-source
MelvinBot commentedon Oct 23, 2026
Deploy Blocker Analysis
Causing PR: Skip already escaped colons when escaping tag names (high confidence). It is on the current staging checklist.
Recommendation: Revert. It is a one-line change in one file plus tests, and nothing depends on it.
Root cause: The PR changed
escapeTagNameinsrc/libs/PolicyUtils/tag.ts:271fromreplaceAll(':', '\\:')toreplaceAll(/(?<!\\):/g, '\\:'). The lookbehind treats any colon after a backslash as already escaped. InParent\\:Child, though, the backslash before the colon is itself escaped, so the colon is still a level separator. The tag is now saved unescaped and splits intoParent\\andChild.Investigation details
How each symptom happens
Parent\\\:Child.getTagArrayFromNamereads this as one level, so it works.Parent\\:Child. The same parser reads it as two levels:['Parent\\', 'Child'].useConfirmationValidation.ts:273-275callshasMatchingTag. Neither split part matches a policy tag, so validation fails withtagOutOfPolicyand submit is blocked. This is the likely mechanism; I didn't confirm how the error shows in the UI.Parent\\:getTagForDisplayshows only level 0.Parent\\, Child:getCommaSeparatedTagNameWithSanitizedColonsjoins both levels.Other evidence
\\:case, and the reviewers marked it out of scope. They missed that production already handled it correctly, so leaving it out caused a regression.Fix-forward option (if re-landing the PR)
Treat a colon as escaped only when an odd number of backslashes comes before it:
Parent\\:ChildbecomesParent\\\:Child, which is one level, as on production.Parent\:Childstays unchanged, which keeps the PR's fix.Add
Parent\\:Childanda\\\:bcases to theescapeTagNametests intests/unit/PolicyUtilsTest.ts. I checked these cases by hand and didn't run them.view run
6 remaining items
blimpich commentedon Oct 26, 2026
@bernhardoj would you be able to work on this as follow up?
bernhardoj commentedon Oct 27, 2026
Yes
bernhardoj commentedon Oct 27, 2026
@MelvinBot please implement this
MelvinBot commentedon Oct 27, 2026
🤖 Draft PR created: Escape tag name colons preceded by an even number of backslashes
Please mark it as "Ready for review" or ask me to do that for you when it is ready for review.
escapeTagNamenow escapes a colon unless an odd number of backslashes comes before it, soparent\\:childis saved asparent\\\:childand stays one tag level. I added unit tests for the\\:and\\\:cases. The related unit tests, typecheck, lint, and spell check pass. I didn't test it in the UI.bernhardoj commentedon Oct 27, 2026
PR is ready
#105102
[-]Expense - Unable to create expense with Parent\\:Child tag, wrong preview on Tag field&table[/-][+][$175] Expense - Unable to create expense with Parent\\:Child tag, wrong preview on Tag field&table[/+]melvin-bot commentedon Oct 27, 2026
Job added to Upwork: https://www.upwork.com/jobs/~022114957397046533934
[-][$175] Expense - Unable to create expense with Parent\\:Child tag, wrong preview on Tag field&table[/-][+][Due for payment 2026-11-05] [$175] Expense - Unable to create expense with Parent\\:Child tag, wrong preview on Tag field&table[/+]melvin-bot commentedon Oct 29, 2026
@bernhardoj
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.24-8 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-11-05. 🎊
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]