Skip to content

AI-assisted rule creation - #99624

Merged
JS00001 merged 79 commits into
Expensify:mainfrom
rushatgabhane:ai-rule-parser-pr
Oct 12, 2026
Merged

JS00001 merged 79 commits into
Expensify:mainfrom
rushatgabhane:ai-rule-parser-pr

Conversation

@rushatgabhane

@rushatgabhane rushatgabhane commented Aug 27, 2026 •

Copy link
Copy Markdown
Member

Explanation of Change

Each rule editor gets a Describe button beside Save rule. It opens a sheet where the admin describes the rule in plain English, and Concierge fills in the form for them to review and save.

Sends the open editor's rule type with the GenerateRule command. The backend doesn't use that parameter yet: it picks the rule type from the description, so a description that fits a different rule type can fill the editor with that type's values. The generated rule is pushed to Onyx and applied to the editor's draft.

Fixed Issues

$ #92743
PROPOSAL:

Tests

  1. On a Control workspace, go to Rules > New rule > Flag for review and click Describe.
  2. Verify a modal opens with the text "Describe your rule in plain English and have Concierge build the rule for you", a tall "Describe the rule" input, and a Next button.
  3. Click Next with the input empty and verify the input shows "This field is required".
  4. Enter "Flag meal expenses over $50" and click Next. Verify the modal closes and the form is filled in with category Meals (if the workspace has it) and amount 50.
  5. Click Describe again, enter "Flag meal expenses over $100", and press Cmd/Ctrl+Enter. Verify the modal closes and the new values replace the old ones (amount is now 100).
  6. Click Describe and enter each of these. Verify the modal stays open and shows the inline error:
    • An unsupported rule, like "Require two approvers for expenses over $1000": "That rule isn't supported yet — we're working on it. Please try a different rule for now."
    • Two rules at once, like "Block gift cards and require receipts over $50": "One rule at a time, please — try describing a single rule, like: block retail purchases on all cards."
    • Gibberish, like "asdf": "Try phrasing your rule like: if expenses have a value over $100, then require a receipt."
  7. Go to Rules > New rule and repeat the Describe flow in each of the other editors, using a description that matches that editor's rule type. Verify Concierge fills in that editor's form:
    • Restrict card spend: "Block retail purchases on all cards"
    • Set field requirements: "Require a description and attendees for meal expenses"
    • Apply expense defaults: "Set the category to Travel for Uber expenses"
  8. Open an existing rule in each editor and verify there is no Describe button.
  • Verify that no errors appear in the JS console

Offline tests

  1. Go offline, click Describe, enter a rule description, and verify the Next button is disabled.

QA Steps

Same as tests.

  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If the PR adds or modifies the UI:
    • I asked an AI agent to review the changes for accessibility issues and addressed its findings.
    • I tested with a screen reader (VoiceOver on macOS) and verified all new/changed elements are reachable with a logical focus order.
    • I verified all new/changed elements have meaningful accessible names and roles.
    • I verified state changes are announced (e.g. checked/unchecked, expanded/collapsed, selected).
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari
Screen.Recording.2026-10-02.at.14.33.58.mov

@melvin-bot

melvin-bot Bot commented Aug 27, 2026

Copy link
Copy Markdown

Hey, I noticed you changed src/languages/en.ts in a PR from a fork. For security reasons, translations are not generated automatically for PRs from forks.

If you want to automatically generate translations for other locales, an Expensify employee will have to:

  1. Look at the code and make sure there are no malicious changes.
  2. Run the Generate static translations GitHub workflow. If you have write access and the K2 extension, you can simply click: [this button]

Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running:

npx bun ./scripts/generateTranslations.ts --help

Typically, you'd want to translate only what you changed by running npx bun ./scripts/generateTranslations.ts --compare-ref main

@codecov

codecov Bot commented Aug 27, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ Changes either increased or maintained existing code coverage, great job!

Files with missing lines Coverage Δ
src/CONST/index.ts 95.90% <ø> (ø)
src/ONYXKEYS.ts 100.00% <ø> (ø)
src/libs/API/types.ts 100.00% <ø> (ø)
src/libs/ExportOnyxState/masking.ts 80.95% <ø> (ø)
src/styles/index.ts 62.79% <ø> (ø)
src/styles/variables.ts 100.00% <ø> (ø)
src/types/form/NewRulePromptForm.ts 100.00% <100.00%> (ø)
...s/FlagForReviewRules/FlagForReviewRulePageBase.tsx 0.00% <0.00%> (ø)
...space/rules/MerchantRules/MerchantRulePageBase.tsx 64.17% <88.88%> (+1.18%) ⬆️
...s/workspace/rules/SpendRules/SpendRulePageBase.tsx 0.00% <0.00%> (ø)
... and 4 more
... and 88 files with indirect coverage changes

@melvin-bot

melvin-bot Bot commented Sep 10, 2026

Copy link
Copy Markdown

I could not review this diff, so I did not approve the workflow runs. An Expensify employee will review it and approve them manually.

@melvin-bot

melvin-bot Bot commented Sep 10, 2026

Copy link
Copy Markdown

I could not review this diff, so I did not approve the workflow runs. An Expensify employee will review it and approve them manually.

@JS00001
JS00001 merged commit 84d8513 into Expensify:main Oct 12, 2026
36 of 37 checks passed
@github-actions

Copy link
Copy Markdown
Contributor

🚧 JS00001 has triggered a test Expensify/App build. You can view the workflow run here.

@Krishna2323

Copy link
Copy Markdown
Contributor

Thanks for handling this! Don't know why GH is taking 7 business days to deliver the email 😹 I didn't get a notification when this was commented on.

@Krishna2323

Copy link
Copy Markdown
Contributor

Finally, I got the mail now 😂

image

@OSBotify

Copy link
Copy Markdown
Contributor

🚀 Deployed to staging by https://github.com/JS00001 in version: 9.5.8-0 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

@MelvinBot

Copy link
Copy Markdown
Contributor

Help site update needed. This PR adds a new feature for all users: a Describe button in each new-rule editor that has Concierge fill in the rule. It isn't behind a beta.

I opened a draft docs PR: Docs updates for E/A#99624 Add Describe option to build rules with Concierge

It adds one sentence to the "How to add a rule from any tab" section of Workspace-Rules.md:149.

@MelvinBot, please review the linked help site PR and confirm it reflects the current behavior. Then mark the linked help site PR Ready for review


view run

@jponikarchuk

Copy link
Copy Markdown

Deploy Blocker #103859 was identified to be related to this PR.

@jponikarchuk

Copy link
Copy Markdown

Deploy Blocker #103862 was identified to be related to this PR.

@nlemma

nlemma commented Oct 13, 2026

Copy link
Copy Markdown

Deploy Blocker #103863 was identified to be related to this PR.

@jponikarchuk

Copy link
Copy Markdown

Deploy Blocker #103867 was identified to be related to this PR.

@jponikarchuk

Copy link
Copy Markdown

Deploy Blocker #103872 was identified to be related to this PR.

@jponikarchuk

Copy link
Copy Markdown

Deploy Blocker #103878 was identified to be related to this PR.

@lanitochka17

Copy link
Copy Markdown

Deploy Blocker #103930 was identified to be related to this PR.

@OSBotify

Copy link
Copy Markdown
Contributor

🚀 Deployed to production by https://github.com/cristipaval in version: 9.5.8-5 🚀

platform result
🕸 web 🕸 success ✅
🤖 android 🤖 success ✅
🍎 iOS 🍎 success ✅

Bundle Size Analysis (Sentry):

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.