Welcome to New Expensify: a complete re-imagination of financial collaboration, centered around chat. Help us build the next generation of Expensify by sharing feedback and contributing to the code.
This report summarizes scanner evidence for Expensify/App, a TypeScript project with 5,086 GitHub stars. SynthScan examined 2,141,296 lines of code across 12840 source files, recording 7789 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 3.8 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 6558 finding(s).
Are imports declared and package/API names verified? 1166 finding(s).
Are wrappers, guards, and repeated structures necessary? 6045 finding(s).
Which changes need focused human review? 7789 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 7789 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | __mocks__/react-native-safe-area-context.tsx | 35 | function WithSafeAreaInsetsWithRef(props: WithSafeAreaInsetsProps & {ref: ForwardedRef<unknown>}) { | CODE |
| LOW | __mocks__/react-native-onyx.ts | 11 | function addDelayToConnectCallback(delay: number) { | CODE |
| LOW | contributingGuides/NAVIGATION.md | 1485 | function useCustomRootStackNavigatorState({state}: CustomStateHookProps) { | CODE |
| LOW | contributingGuides/NAVIGATION.md | 1520 | function useCustomSplitNavigatorState({state}: CustomStateHookProps) { | CODE |
| LOW | contributingGuides/STYLE.md | 1172 | function WithCurrentUserPersonalDetails(props: Omit<TProps, keyof HOCProps>) { | CODE |
| LOW | config/rsbuild/ModuleInitTimingPlugin.ts | 13 | function createTimingRuntimeModule(): InstanceType<typeof rspack.RuntimeModule> { | CODE |
| LOW | config/rsbuild/rsbuild.common.ts | 123 | function mapEnvironmentToLogoSuffix(environmentFile: string): string { | CODE |
| LOW | config/babel/oxcJestTransformer.js | 130 | function processWithOxcForCoverage(sourceText, sourcePath, transformOptions) { | CODE |
| LOW | web/cloudflare-worker/tests/worker.test.ts | 16 | function assertTemplateInlineScriptsAllowed(csp: string) { | CODE |
| LOW | eslint-plugin-local-rules/no-onyx-get-snapshot-key.js | 104 | function unwrapAwaitAndTypeOnlyExpressions(node) { | CODE |
| LOW | eslint-plugin-local-rules/no-onyx-get-snapshot-key.js | 188 | function tupleElementIsConciergeReportID(call, elementIndex) { | CODE |
| LOW | eslint-plugin-local-rules/no-onyx-get-snapshot-key.js | 212 | function isConciergeReportIDExpression(node) { | CODE |
| LOW | eslint-plugin-local-rules/no-raw-typography.js | 73 | function isVariablesTypographyReference(node) { | CODE |
| LOW | eslint-plugin-local-rules/no-unsafe-onyx-read.js | 195 | function getRenderTimeArgumentIndices(callee) { | CODE |
| LOW | eslint-plugin-local-rules/no-unsafe-onyx-read.js | 201 | function getOutermostTypeOnlyWrapper(node) { | CODE |
| LOW | eslint-plugin-local-rules/no-unsafe-onyx-read.js | 423 | function isEffectHookCallbackArgument(call, argument) { | CODE |
| LOW | eslint-plugin-local-rules/no-unsafe-onyx-read.js | 453 | function getMemoizedFunctionBinding(functionNode, parent) { | CODE |
| LOW | eslint-plugin-local-rules/no-unsafe-onyx-read.js | 502 | function isHandlerInvokedFromEffect(binding) { | CODE |
| LOW | eslint-plugin-local-rules/no-unsafe-onyx-read.js | 582 | function requiresComponentOrHookScope(filename) { | CODE |
| LOW | …-local-rules/require-live-region-for-status-updates.js | 43 | function getConstRoleValueFromExpression(expression) { | CODE |
| LOW | …-local-rules/require-live-region-for-status-updates.js | 70 | function getResolvedRolesFromExpression(expression) { | CODE |
| LOW | …cal-rules/no-direct-pre-insert-fullscreen-under-rhp.js | 25 | function isStaticPreInsertProperty(property, computed) { | CODE |
| LOW⚡ | …cal-rules/no-direct-pre-insert-fullscreen-under-rhp.js | 60 | function isNavigationPreInsertMemberExpression(node, scope, navigationImportBindings) { | CODE |
| LOW⚡ | …cal-rules/no-direct-pre-insert-fullscreen-under-rhp.js | 69 | function isPreInsertFullscreenUnderRHPCall(node, scope, navigationImportBindings) { | CODE |
| LOW⚡ | …cal-rules/no-direct-pre-insert-fullscreen-under-rhp.js | 73 | function getPreInsertAliasFromObjectPatternProperty(property) { | CODE |
| LOW | eslint-plugin-local-rules/utils/onyxReadUtils.js | 51 | function unwrapTypeOnlyExpressions(node) { | CODE |
| LOW | eslint-plugin-local-rules/utils/onyxReadUtils.js | 103 | function getSingleVariableDefinition(variable, constOnly) { | CODE |
| LOW | tests/ui/SearchRouterContextualSuggestionTest.tsx | 91 | function getContextualSuggestionText(reportName: string) { | CODE |
| LOW | tests/ui/SpendRuleCategoryBaseTest.tsx | 83 | function renderSpendRuleCategoryBase(categories: SpendRuleCategory[] = []) { | CODE |
| LOW | tests/ui/TableTest.tsx | 389 | function MockGenericEmptyStateComponent({title, subtitle, minModalHeight = 400}: {title?: string; subtitle?: string; | CODE |
| LOW | tests/ui/TableTest.tsx | 610 | function activateStickyHeadersAfterListLoad() { | CODE |
| LOW | tests/ui/TableTest.tsx | 3237 | function ControlledSelectableTable({data = mockData, initialSelected = [], showSearch = false}: {data?: TestItem | CODE |
| LOW | tests/ui/TotalCellTest.tsx | 86 | function mockPressableWithFeedback({ | CODE |
| LOW | tests/ui/ReportActionComposeTest.tsx | 88 | function ReportActionEditMessageContextProviderForReport({children}: PropsWithChildren) { | CODE |
| LOW | tests/ui/DomainGroupPreferredWorkspacePageTest.tsx | 64 | async function setUpDomainAdminWithPolicies(policyCount: number) { | CODE |
| LOW | tests/ui/DomainGroupPreferredWorkspacePageTest.tsx | 136 | function renderCreatePreferredWorkspacePage() { | CODE |
| LOW | tests/ui/DomainGroupPreferredWorkspacePageTest.tsx | 140 | function renderEditPreferredWorkspacePage(groupID = GROUP_ID) { | CODE |
| LOW | tests/ui/GLCodeCellTest.tsx | 44 | function mockPressableWithFeedback({ | CODE |
| LOW | tests/ui/DynamicBetaOverridesPageTest.tsx | 66 | function renderDynamicBetaOverridesPage() { | CODE |
| LOW | tests/ui/ConciergePromptBoxTest.tsx | 187 | function ConciergePromptBoxWrapper({isCopyLoading = false}: {isCopyLoading?: boolean} = {}) { | CODE |
| LOW | tests/ui/ConciergePromptBoxTest.tsx | 260 | function settleLayoutTriggeredScroll() { | CODE |
| LOW | tests/ui/ConciergePromptBoxTest.tsx | 278 | function getLastMentionSuggestionsProps(): MentionSuggestionsProps { | CODE |
| LOW | tests/ui/ConciergePromptBoxTest.tsx | 286 | function getLastEmojiSuggestionsProps(): EmojiSuggestionsProps { | CODE |
| LOW | tests/ui/ClearReportActionErrorsUITest.tsx | 95 | function ReportActionItemWithHierarchy({action, report}: {action: ReportAction; report: Report}) { | CODE |
| LOW | tests/ui/WorkspaceCompanyCardsPageSelectionModeTest.tsx | 186 | function getWorkspaceCompanyCardsPage() { | CODE |
| LOW | …sts/ui/IOURequestStepDistanceOdometerSflResumeTest.tsx | 163 | function createOdometerTransaction(withImage: boolean): Transaction { | CODE |
| LOW | …sts/ui/IOURequestStepDistanceOdometerSflResumeTest.tsx | 182 | function createDistanceCreateRoute(): DistanceCreateRoute { | CODE |
| LOW | …sts/ui/IOURequestStepDistanceOdometerSflResumeTest.tsx | 207 | function getKeyboardAvoidingViewEnabled(): boolean | undefined { | CODE |
| LOW | tests/ui/ChatTransactionPreviewTest.tsx | 61 | function SearchSnapshotQueryProvider({children}: ChildrenProps) { | CODE |
| LOW⚡ | tests/ui/ReportActionMessageEditLayoutTest.tsx | 170 | function ReportActionEditMessageContextProviderForReport({children}: PropsWithChildren) { | CODE |
| LOW⚡ | tests/ui/ReportActionMessageEditLayoutTest.tsx | 174 | function ReportActionEditMessageContextProviderForNestedThread({children}: PropsWithChildren) { | CODE |
| LOW⚡ | tests/ui/ReportActionMessageEditLayoutTest.tsx | 178 | function ReportActionEditMessageContextProviderForThread({children}: PropsWithChildren) { | CODE |
| LOW⚡ | tests/ui/ReportActionMessageEditLayoutTest.tsx | 216 | async function setReportActionDraftWithMessage(message: string) { | CODE |
| LOW⚡ | tests/ui/ReportActionMessageEditLayoutTest.tsx | 226 | async function clearReportActionDraftsForReport() { | CODE |
| LOW⚡ | tests/ui/ReportActionMessageEditLayoutTest.tsx | 232 | function renderNarrowMessageCompose() { | CODE |
| LOW⚡ | tests/ui/ReportActionMessageEditLayoutTest.tsx | 241 | async function seedNestedThreadHierarchyWithAncestorEditDraft(draftMessage: string) { | CODE |
| LOW | tests/ui/ReportActionMessageEditLayoutTest.tsx | 268 | async function getReportActionDraftMessage(reportID: string, reportActionID: string) { | CODE |
| LOW | tests/ui/ReportActionMessageEditLayoutTest.tsx | 279 | function renderNestedThreadNarrowMessageCompose() { | CODE |
| LOW | tests/ui/ReportActionMessageEditLayoutTest.tsx | 289 | function renderThreadNarrowMessageCompose() { | CODE |
| LOW | tests/ui/IOURequestStepHoursTest.tsx | 65 | function createPolicyWithTimeTracking(): Policy { | CODE |
| 5920 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | __mocks__/reportData/personalDetails.ts | 56 | displayName: 'Jane Doe', | CODE |
| LOW | tests/ui/LeaveWorkspaceFlowTest.tsx | 39 | const USER_EMAIL = 'user@example.com'; | CODE |
| LOW | tests/ui/ReportAttachments.tsx | 78 | const TEST_USER_LOGIN = 'test@test.com'; | CODE |
| LOW | tests/ui/ProfilePageTest.tsx | 136 | const email = 'user@example.com'; | CODE |
| LOW | tests/ui/ProfilePageTest.tsx | 173 | const defaultEmail = 'user@example.com'; | CODE |
| LOW | tests/ui/ProfilePageTest.tsx | 788 | const customDisplayName = 'John Doe'; | CODE |
| LOW | tests/ui/ReportActionComposeTest.tsx | 328 | await Onyx.merge(ONYXKEYS.SESSION, {accountID: currentUserAccountID, email: 'test@test.com'}); | CODE |
| LOW | tests/ui/ReportActionComposeTest.tsx | 335 | owner: 'test@test.com', | CODE |
| LOW | tests/ui/DomainMemberVacationDelegateFormPageTest.tsx | 40 | jest.mock('@hooks/useCurrentUserPersonalDetails', () => jest.fn(() => ({login: 'admin@example.com', timezone: {selected: | CODE |
| LOW | tests/ui/DomainMemberVacationDelegateFormPageTest.tsx | 70 | mockVacationDelegate = {creator: 'admin@example.com', delegate: 'delegate@example.com'}; | CODE |
| LOW | tests/ui/DomainMemberVacationDelegateFormPageTest.tsx | 86 | mockVacationDelegate = {creator: 'admin@example.com', delegate: 'delegate@example.com', delegatorFor: ['other@ex | CODE |
| LOW | tests/ui/ConciergePromptBoxTest.tsx | 796 | describe('placeholder', () => { | CODE |
| LOW⚡ | tests/ui/ConciergePromptBoxTest.tsx | 831 | expect(getInput()).toHaveProp('placeholder', ''); | CODE |
| LOW⚡ | tests/ui/ConciergePromptBoxTest.tsx | 837 | expect(getInput()).toHaveProp('placeholder', LONG_PLACEHOLDER); | CODE |
| LOW⚡ | tests/ui/ConciergePromptBoxTest.tsx | 845 | expect(getInput()).toHaveProp('placeholder', ''); | CODE |
| LOW | tests/ui/ConciergePromptBoxTest.tsx | 857 | expect(getInput()).toHaveProp('placeholder', SHORT_PLACEHOLDER); | CODE |
| LOW | tests/ui/ConciergePromptBoxTest.tsx | 872 | expect(getInput()).toHaveProp('placeholder', ''); | CODE |
| LOW | tests/ui/ConciergePromptBoxTest.tsx | 882 | expect(getInput()).toHaveProp('placeholder', LONG_PLACEHOLDER); | CODE |
| LOW | tests/ui/ClearReportActionErrorsUITest.tsx | 35 | const ACTOR_EMAIL = 'test@test.com'; | CODE |
| LOW | tests/ui/WorkspaceCompanyCardsPageSelectionModeTest.tsx | 76 | default: () => ({login: 'admin@example.com'}), | CODE |
| LOW | tests/ui/WorkspaceInviteMessageApproverPageTest.tsx | 61 | const adminEmail = 'admin@example.com'; | CODE |
| LOW | tests/ui/WorkspaceInviteMessageApproverPageTest.tsx | 63 | const userEmail = 'user@example.com'; | CODE |
| LOW | …micWorkspaceWorkflowsApprovalsExpensesFromPageTest.tsx | 31 | const ADMIN_EMAIL = 'admin@example.com'; | CODE |
| LOW | tests/ui/WorkspaceExpensifyCardListPageWaitlistTest.tsx | 22 | const memberLogin = 'admin@example.com'; | CODE |
| LOW | …ts/ui/WorkspaceMembersChangeOfficeLocationPageTest.tsx | 36 | jest.mock('@hooks/useCurrentUserPersonalDetails', () => jest.fn(() => ({login: 'admin@example.com'}))); | CODE |
| LOW | tests/ui/UnshareBankAccountTest.tsx | 59 | const OTHER_ADMIN_EMAIL = 'admin@example.com'; | CODE |
| LOW | tests/ui/ProductMarketingWindowNavigationTest.tsx | 24 | const USER_EMAIL = 'user@example.com'; | CODE |
| LOW | tests/ui/MoneyRequestViewReceiptTest.tsx | 116 | const currentUserEmail = 'test@test.com'; | CODE |
| LOW | tests/ui/WorkspaceInviteMessageDEWApproverRowTest.tsx | 26 | const ADMIN_EMAIL = 'admin@example.com'; | CODE |
| LOW | tests/ui/WorkspaceCompanyCardFeedSelectorPageTest.tsx | 42 | let mockPrimaryContactMethod = 'admin@example.com'; | CODE |
| LOW | tests/ui/WorkspaceCompanyCardFeedSelectorPageTest.tsx | 213 | mockPrimaryContactMethod = 'admin@example.com'; | CODE |
| LOW | tests/ui/BottomTabBarTest.tsx | 165 | email: 'foo@bar.com', | CODE |
| LOW | tests/ui/BottomTabBarTest.tsx | 188 | partnerUserID: 'foo@bar.com', | CODE |
| LOW | tests/ui/BottomTabBarTest.tsx | 223 | partnerUserID: 'foo@bar.com', | CODE |
| LOW | tests/ui/ReportActionsListTest.tsx | 327 | login: 'test@test.com', | CODE |
| LOW | tests/ui/AgentsPromoBannersTest.tsx | 25 | const USER_EMAIL = 'admin@example.com'; | CODE |
| LOW⚡ | tests/ui/AuthScreensInitHandlerTest.tsx | 174 | await Onyx.merge(ONYXKEYS.SESSION, {accountID: TEST_ACCOUNT_ID, email: 'test@test.com'}); | CODE |
| LOW⚡ | tests/ui/AuthScreensInitHandlerTest.tsx | 181 | expect(subscribeToUserEvents).toHaveBeenCalledWith(TEST_ACCOUNT_ID, 'test@test.com', expect.any(Function), expec | CODE |
| LOW⚡ | tests/ui/AuthScreensInitHandlerTest.tsx | 187 | await Onyx.merge(ONYXKEYS.SESSION, {accountID: TEST_ACCOUNT_ID, email: 'test@test.com'}); | CODE |
| LOW⚡ | tests/ui/AuthScreensInitHandlerTest.tsx | 195 | expect(subscribeToUserEvents).toHaveBeenCalledWith(TEST_ACCOUNT_ID, 'test@test.com', expect.any(Function), expec | CODE |
| LOW⚡ | tests/ui/AuthScreensInitHandlerTest.tsx | 201 | await Onyx.merge(ONYXKEYS.SESSION, {accountID: TEST_ACCOUNT_ID, email: 'test@test.com'}); | CODE |
| LOW | tests/ui/AuthScreensInitHandlerTest.tsx | 220 | await Onyx.merge(ONYXKEYS.SESSION, {accountID: TEST_ACCOUNT_ID, email: 'test@test.com'}); | CODE |
| LOW | tests/ui/AuthScreensInitHandlerTest.tsx | 246 | await Onyx.merge(ONYXKEYS.SESSION, {accountID: TEST_ACCOUNT_ID, email: 'test@test.com'}); | CODE |
| LOW | tests/ui/AuthScreensInitHandlerTest.tsx | 259 | await Onyx.merge(ONYXKEYS.SESSION, {accountID: TEST_ACCOUNT_ID, email: 'test@test.com'}); | CODE |
| LOW | tests/ui/AuthScreensInitHandlerTest.tsx | 273 | await Onyx.merge(ONYXKEYS.SESSION, {accountID: TEST_ACCOUNT_ID, email: 'test@test.com'}); | CODE |
| LOW | tests/ui/AuthScreensInitHandlerTest.tsx | 285 | await Onyx.merge(ONYXKEYS.SESSION, {accountID: TEST_ACCOUNT_ID, email: 'test@test.com'}); | CODE |
| LOW | tests/ui/AuthScreensInitHandlerTest.tsx | 298 | await Onyx.merge(ONYXKEYS.SESSION, {accountID: TEST_ACCOUNT_ID, email: 'test@test.com'}); | CODE |
| LOW | tests/ui/ChatActionableButtonsTest.tsx | 63 | await Onyx.merge(ONYXKEYS.SESSION, {accountID: CURRENT_USER_ACCOUNT_ID, email: 'test@test.com'}); | CODE |
| LOW | tests/ui/ChatActionableButtonsTest.tsx | 67 | login: 'test@test.com', | CODE |
| LOW | tests/ui/WorkspaceMemberOfficeLocationPageTest.tsx | 33 | jest.mock('@hooks/useCurrentUserPersonalDetails', () => jest.fn(() => ({login: 'admin@example.com'}))); | CODE |
| LOW | tests/ui/DomainMemberDetailsPageTest.tsx | 119 | mockDomain = {[`${CONST.DOMAIN.PRIVATE_VACATION_DELEGATE_PREFIX}${MEMBER_ACCOUNT_ID}`]: {creator: 'admin@example | CODE |
| LOW | tests/ui/VacationDelegateMissingWorkspacesPageTest.tsx | 278 | const DELEGATE_DISPLAY_NAME = 'Jane Doe'; | CODE |
| LOW | …sts/ui/WorkspaceWorkflowsApprovalsApproverPageTest.tsx | 36 | const ADMIN_EMAIL = 'admin@example.com'; | CODE |
| LOW | tests/ui/IOURequestStepDistanceTest.tsx | 245 | waypoint0: {address: '123 Main St', lat: 40.7128, lng: -74.006, keyForList: 'start_waypoint'}, | CODE |
| LOW | tests/ui/SessionTest.tsx | 35 | const TEST_USER_LOGIN_1 = 'test@test.com'; | CODE |
| LOW | tests/ui/IOURequestEditReportCommonTest.tsx | 268 | await Onyx.set(ONYXKEYS.PRIVATE_PERSONAL_DETAILS, {addresses: [{street: '123 Main St', city: 'San Franci | CODE |
| LOW | tests/ui/MoneyRequestViewTest.tsx | 137 | const currentUserEmail = 'test@test.com'; | CODE |
| LOW | tests/ui/ReportActionItemTest.tsx | 98 | const actorEmail = 'test@test.com'; | CODE |
| LOW | tests/ui/ReportActionItemTest.tsx | 502 | const action = createReportAction(CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.ASSIGN_COMPANY_CARD, {email: ' | CODE |
| LOW | tests/ui/ReportActionItemTest.tsx | 511 | const action = createReportAction(CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.UNASSIGN_COMPANY_CARD, {email: | CODE |
| 1105 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | contributingGuides/HOW_TO_CREATE_A_PLAN.md | 11 | ## Step 1: Define the problem | COMMENT |
| LOW | contributingGuides/HOW_TO_CREATE_A_PLAN.md | 27 | ## Step 2: Workshop the solutions | COMMENT |
| LOW | contributingGuides/HOW_TO_CREATE_A_PLAN.md | 39 | ## Step 3: Write out each problem and solution (P/S statement) | COMMENT |
| LOW | contributingGuides/HOW_TO_CREATE_A_PLAN.md | 42 | ## Step 4: Propose it | COMMENT |
| LOW⚡ | tests/unit/FraudProtectionTest.ts | 85 | // Step 1: BeginSignIn returns account data (no session yet) | COMMENT |
| LOW⚡ | tests/unit/FraudProtectionTest.ts | 91 | // Step 2: Validate code verified, session is created | COMMENT |
| LOW⚡ | tests/unit/SubscriptionVisibilityTest.ts | 112 | // Step 1: User has a paid workspace — subscriptionPlan is TEAM | COMMENT |
| LOW⚡ | tests/unit/SubscriptionVisibilityTest.ts | 122 | // Step 2: User deletes the workspace — subscriptionPlan becomes null | COMMENT |
| LOW⚡ | tests/unit/SubscriptionVisibilityTest.ts | 129 | // Step 3: amountOwed > 0 keeps subscription visible | COMMENT |
| LOW⚡ | tests/actions/IOUTest/SplitTest.ts | 5067 | // Step 6: Verify the new transaction thread report exists | COMMENT |
| LOW⚡ | tests/actions/IOUTest/SplitTest.ts | 5072 | // Step 7: Verify the comment was migrated to the new thread | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 2782 | // Step 1: Split into 2 (creates child transactions via creation path) | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 2862 | // Step 2: Revert to 1 split expense, moving it to a different report | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 3253 | // Step 1: Split the original expense into 2 (creation path). One split stays in the workspace | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 3325 | // Step 2: Revert - remove the selfDM split (opened from within selfDM, per the repro), leaving the | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 3378 | // Step 3: Split the now-reverted original transaction into 2 again, initiated from "Spend > Expenses". | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 3477 | // Step 4: Revert a second time - remove one of the second-round splits, leaving the other as the sole | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 4827 | // Step 1: Split into 2 child transactions | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 4914 | // Step 2: Find the split's transaction thread and add a comment to it | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 4955 | // Step 3: Revert to 1 split (triggers isReverseSplitOperation) | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 5020 | // Step 4: Verify the original transaction is restored with correct data | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 5035 | // Step 5: Verify the new IOU action for the restored original transaction | COMMENT |
| LOW | tests/actions/IOUTest/SplitSelfDMTest.ts | 471 | // Step 1: Create the splits | COMMENT |
| LOW⚡ | tests/actions/IOUTest/SplitSelfDMTest.ts | 528 | // Step 2: Re-fetch allTransactions (now contains the created children) | COMMENT |
| LOW⚡ | tests/actions/IOUTest/SplitSelfDMTest.ts | 536 | // Step 3: Edit the splits (change amounts) | COMMENT |
| LOW | .claude/agents/deploy-blocker-investigator.md | 47 | ### Step 1: Read the issue | COMMENT |
| LOW | .claude/agents/deploy-blocker-investigator.md | 60 | ### Step 2: Check StagingDeployCash | COMMENT |
| LOW | .claude/agents/deploy-blocker-investigator.md | 69 | ### Step 3: Find the causing PR | COMMENT |
| LOW | .claude/agents/deploy-blocker-investigator.md | 81 | ### Step 4: Verify the causing PR | COMMENT |
| LOW⚡ | .claude/agents/deploy-blocker-investigator.md | 104 | ### Step 5: Determine fix location | COMMENT |
| LOW⚡ | .claude/agents/deploy-blocker-investigator.md | 111 | ### Step 6: Apply the decision tree | COMMENT |
| LOW⚡ | .claude/agents/deploy-blocker-investigator.md | 115 | ### Step 7: Post comment and update labels | COMMENT |
| LOW | .claude/agents/deploy-blocker-investigator.md | 130 | ### Step 8: Assign contributors | COMMENT |
| LOW | .claude/commands/review-helpdot-pr.md | 12 | ## Step 1: Inline Review | COMMENT |
| LOW | .claude/commands/review-helpdot-pr.md | 18 | ## Step 2: Summary Review | COMMENT |
| LOW | docs/Hidden/Global-Reimbursement-Singapore.md | 28 | # Step 1: Connect Your Singaporean Bank Account | COMMENT |
| LOW | docs/Hidden/Global-Reimbursement-Singapore.md | 39 | # Step 2: Complete the DocuSign Form and Upload Documents | COMMENT |
| LOW | docs/Hidden/Global-Reimbursement-Singapore.md | 51 | # Step 3: Confirm Test Payment | COMMENT |
| LOW | docs/Hidden/Global-Reimbursement-Singapore.md | 57 | # Step 4: Start Reimbursing Internationally | COMMENT |
| LOW⚡ | docs/Hidden/Greenhouse.md | 24 | ## Step 1: Establish the Connection | COMMENT |
| LOW⚡ | docs/Hidden/Greenhouse.md | 31 | ## Step 2: Create the WebHook | COMMENT |
| LOW⚡ | docs/Hidden/Greenhouse.md | 38 | ## Step 3: Create the Custom Candidate Field | COMMENT |
| LOW | …ensify-card/Set-Up-and-Manage-the-Expensify-Card-US.md | 29 | # Step 1: Enable the Expensify Card | COMMENT |
| LOW | …ensify-card/Set-Up-and-Manage-the-Expensify-Card-US.md | 40 | # Step 2: Select a Bank Account | COMMENT |
| LOW | …ensify-card/Set-Up-and-Manage-the-Expensify-Card-US.md | 54 | # Step 3: Issue Expensify Cards | COMMENT |
| LOW | …rticles/new-expensify/connections/Uber-for-Business.md | 13 | ## Step 1: Enable Receipt Partners in your Workspace | COMMENT |
| LOW | …rticles/new-expensify/connections/Uber-for-Business.md | 20 | ## Step 2: Connect Uber for Business | COMMENT |
| LOW | …ons/quickbooks-desktop/Configure-QuickBooks-Desktop.md | 13 | # Step 1: Initial Connection | COMMENT |
| LOW | …ons/quickbooks-desktop/Configure-QuickBooks-Desktop.md | 23 | # Step 2: Configure Import Settings | COMMENT |
| LOW | …ons/quickbooks-desktop/Configure-QuickBooks-Desktop.md | 53 | # Step 3: Configure Export Settings | COMMENT |
| LOW | …ons/quickbooks-desktop/Configure-QuickBooks-Desktop.md | 103 | # Step 4: Configure Advanced Settings | COMMENT |
| LOW | …ons/quickbooks-desktop/Configure-QuickBooks-Desktop.md | 123 | # Step 5: Export Process | COMMENT |
| LOW | …sktop/Troubleshooting/Sync-Errors/DESK66-Sync-Error.md | 91 | ### Step 1: Remove Web Connector | COMMENT |
| LOW | …sktop/Troubleshooting/Sync-Errors/DESK66-Sync-Error.md | 100 | ### Step 2: Disconnect QuickBooks Desktop in the Workspace | COMMENT |
| LOW | …sktop/Troubleshooting/Sync-Errors/DESK66-Sync-Error.md | 111 | ### Step 3: Reboot and Reinstall Web Connector | COMMENT |
| LOW | …Troubleshooting/Connection-errors/DESK66-Sync-Error.md | 91 | ### Step 1: Remove Web Connector | COMMENT |
| LOW | …Troubleshooting/Connection-errors/DESK66-Sync-Error.md | 100 | ### Step 2: Disconnect QuickBooks Desktop in the Workspace | COMMENT |
| LOW | …Troubleshooting/Connection-errors/DESK66-Sync-Error.md | 111 | ### Step 3: Reboot and Reinstall Web Connector | COMMENT |
| LOW | …icles/new-expensify/connections/xero/Configure-Xero.md | 28 | # Step 1: Set Up Import Settings | COMMENT |
| LOW | …icles/new-expensify/connections/xero/Configure-Xero.md | 43 | # Step 2: Set Up Export Settings | COMMENT |
| 208 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/ui/components/Button.tsx | 73 | // ── Rendering ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/Button.tsx | 119 | // ── ButtonStateContext ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/Button.tsx | 184 | // ── Press handling ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/Button.tsx | 350 | // ── Disabled-state styles ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/Button.tsx | 379 | // ── Variant styles ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/Button.tsx | 408 | // ── Size styles ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/Button.tsx | 440 | // ── removeBorderRadius ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/Button.tsx | 474 | // ── Hover styles ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/Button.tsx | 507 | // ── Accessibility ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/Button.tsx | 572 | // ── Event handlers ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/Button.tsx | 602 | // ── Haptic feedback ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/Button.tsx | 641 | // ── Layout and composition ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/ButtonKeyboardShortcut.tsx | 10 | // ── Keyboard-shortcut wiring ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/ButtonKeyboardShortcut.tsx | 30 | // ────────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/ButtonKeyboardShortcut.tsx | 64 | // ── Registration ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/ButtonKeyboardShortcut.tsx | 76 | // ── onPress invocation ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/ButtonKeyboardShortcut.tsx | 116 | // ── Shortcut config ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/ui/components/ButtonKeyboardShortcut.tsx | 151 | // ── Rendering ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/useCreateReportTest.tsx | 18 | // ── Mocks ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/useCreateReportTest.tsx | 85 | // ── Helpers ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/useCreateReportTest.tsx | 177 | // ── Tests ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/LHNAvatarPipelineTest.ts | 269 | // ── Case 1: 1:1 DM ───────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/LHNAvatarPipelineTest.ts | 279 | // ── Case 2: Group Chat ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit/LHNAvatarPipelineTest.ts | 289 | // ── Case 3: Policy Expense Chat (not own) ─────────────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 31 | // ─── Test Constants ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 66 | // ─── Pipeline Helper ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 148 | // ─── Tests ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 318 | // ── Case 5: Expense Request ───────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 335 | // ── Case 6: Expense Report ────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 349 | // ── Case 7: IOU (multi-sender) ───────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 359 | // ── Case 8: IOU (single sender, request) ─────────────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 370 | // ── Case 9: IOU (single sender, send money) ──────────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 381 | // ── Case 10: Workspace Thread ─────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 396 | // ── Case 11: Expense Request Thread (with policy) ─────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 435 | // ── Case 13: Trip Room ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 450 | // ── Case 14: Invoice Room ─────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 464 | // ── Case 15: Invoice Report (non-B2B) ─────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 494 | // ── Case 16: Archived Expense Report ──────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 508 | // ── Case 17: Archived Non-Expense Chat ────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 518 | // ── Case 18: With delegate ────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 537 | // ── Case 19: Policy Expense Chat + Task (no parent PEC in Onyx) ───── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 567 | // ── Case 12c: Personal task (parent is DM) → SINGLE ────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 608 | // ── Case 22: Delegate applied for task WITH chatReportID ───────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 622 | // ── Case 23: Delegate skipped for invoice report ───────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 635 | // ── Case 24: Delegate applied for chat reports ────────────────── | COMMENT |
| MEDIUM | tests/unit/LHNAvatarPipelineTest.ts | 645 | // ── Case 24b: Delegate skipped for a Concierge thread ──────────── | COMMENT |
| MEDIUM | tests/unit/hooks/useOdometerReceiptStitcherTest.tsx | 18 | // ─── Mocks ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/hooks/useOdometerReceiptStitcherTest.tsx | 95 | // ─── Test helpers ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/unit/hooks/useOdometerReceiptStitcherTest.tsx | 136 | // ─── Tests ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/select-device.sh | 4 | # ============================================ | COMMENT |
| MEDIUM | scripts/select-device.sh | 11 | # ---------------------- | COMMENT |
| MEDIUM⚡ | scripts/setup-newdot-web-emulators.sh | 4 | # ============================================================= | COMMENT |
| MEDIUM⚡ | scripts/setup-newdot-web-emulators.sh | 12 | # ----------- | COMMENT |
| MEDIUM⚡ | scripts/setup-newdot-web-emulators.sh | 20 | # ---------------------- | COMMENT |
| MEDIUM⚡ | scripts/setup-mapbox-sdk-walkthrough.sh | 4 | # ================================== | COMMENT |
| MEDIUM⚡ | scripts/setup-mapbox-sdk-walkthrough.sh | 14 | # ----------- | COMMENT |
| MEDIUM⚡ | scripts/setup-mapbox-sdk.sh | 4 | # =================================================== | COMMENT |
| MEDIUM⚡ | scripts/setup-mapbox-sdk.sh | 13 | # ----------- | COMMENT |
| MEDIUM⚡ | scripts/setup-mapbox-sdk.sh | 19 | # ---------------------------------------- | COMMENT |
| MEDIUM⚡ | scripts/setup-mapbox-sdk.sh | 24 | # ------------------------------------------------------- | COMMENT |
| 5 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | babel.config.js | 101 | bundleMode: true, | COMMENT |
| LOW | tsconfig.json | 1 | { | COMMENT |
| LOW | config/rsbuild/rsbuild.common.ts | 241 | // same fixed-value behavior without the warning. This also matters for Storybook's | COMMENT |
| LOW | config/rsbuild/rsbuild.common.ts | 321 | ], | COMMENT |
| LOW | config/rsbuild/rsbuild.common.ts | 521 | ...(isDevelopment | COMMENT |
| LOW | patches/react-navigation/details.md | 1 | # `@react-navigation` patches | COMMENT |
| LOW | tests/ui/IOURequestStepDistanceOdometerBackupTest.tsx | 261 | }); | COMMENT |
| LOW | tests/unit/PolicyUtilsTest.ts | 1621 | // Given a policy viewed by an admin, holding a regular member in its employee list | COMMENT |
| LOW | tests/unit/CardUtilsTest.ts | 941 | // Direct feed with oAuthAccountDetails and no cards — shown | COMMENT |
| LOW | tests/unit/NoUnsafeOnyxReadRuleTest.ts | 161 | // Then it is an event handler, so the read is allowed | COMMENT |
| LOW | tests/unit/NoUnsafeOnyxReadRuleTest.ts | 881 | }); | COMMENT |
| LOW | tests/unit/NoUnsafeOnyxReadRuleTest.ts | 1061 | // When the rule checks the Onyx reference | COMMENT |
| LOW | tests/unit/NoUnsafeOnyxReadRuleTest.ts | 1261 | // When the rule checks the reference | COMMENT |
| LOW | tests/unit/PersistedRequests.ts | 141 | expect(PersistedRequests.getAll().length).toBe(0); | COMMENT |
| LOW | tests/unit/CardFeedErrorsDerivedValueTest.ts | 501 | COMMENT | |
| LOW | tests/unit/CardFeedErrorsDerivedValueTest.ts | 521 | // [cardFeed.feedName]: { | COMMENT |
| LOW | tests/unit/OnyxUpdateManagerTest.ts | 101 | // After all missing and deferred updates have been applied, the lastUpdateIDAppliedToClient should be 6. | COMMENT |
| LOW | tests/unit/OnyxUpdateManagerTest.ts | 221 | // - once for the first fetched missing update (2) | COMMENT |
| LOW | tests/unit/OnyxUpdateManagerTest.ts | 321 | COMMENT | |
| LOW | tests/tooling/generateTranslations.test.ts | 2421 | // 3: const strings = { | COMMENT |
| LOW | ios/RCTShareActionHandlerModule.h | 1 | // | COMMENT |
| LOW | ios/NewExpensify-Bridging-Header.h | 1 | // | COMMENT |
| LOW | ios/BridgingFile.swift | 1 | // | COMMENT |
| LOW | ios/SentryNativeSDKManager.m | 1 | // | COMMENT |
| LOW | ios/CertificatePinning.swift | 1 | // | COMMENT |
| LOW | ios/CertificatePinning.swift | 41 | // which have already broken leaf/intermediate pins in production (2026-07-07 | COMMENT |
| LOW | ios/SceneDelegate.swift | 1 | // | COMMENT |
| LOW | ios/NewExpensify/OriginImageRequestHandler.mm | 1 | // | COMMENT |
| LOW | ios/NewExpensify/RCTBootSplash.mm | 1 | #import "RCTBootSplash.h" | COMMENT |
| LOW | ios/NewExpensify/OriginImageRequestHandler.h | 1 | // | COMMENT |
| LOW | scripts/android-repackage-app-bundle-and-sign.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/stubReactNative.js | 1 | // Comprehensive React Native module interceptor for Bun script preload. | COMMENT |
| LOW | scripts/select-device.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/validateMobileExpensifySubmodule.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/setup-newdot-web-emulators.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/setup-newdot-web-emulators.sh | 21 | # This script streamlines the process of adding the certificates to both android and | COMMENT |
| LOW | scripts/setup-mapbox-sdk-walkthrough.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/generateCertificatePins.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/generateCertificatePins.sh | 21 | # pinned domain's live chain actually builds up to one of its pinned roots. | COMMENT |
| LOW | scripts/generateCertificatePins.sh | 41 | # staying in sync with the manifest. | COMMENT |
| LOW | scripts/generateCertificatePins.sh | 101 | # requests once enforce mode is on. | COMMENT |
| LOW | scripts/setup-mapbox-sdk.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/setup-mapbox-sdk.sh | 21 | # This file is used in Unix-like systems to store credentials for remote machine access. | COMMENT |
| LOW | scripts/artifacts-utils/ios/sync-prebuilt-rncore.sh | 1 | #!/bin/bash | COMMENT |
| LOW | .github/workflows/resolveBuildRefs.yml | 1 | name: Resolve build refs | COMMENT |
| LOW | .github/workflows/lint.yml | 41 | # Only use the elevated OSBotify token on the post-merge `workflow_call` run | COMMENT |
| LOW | .github/workflows/deploy.yml | 121 | // push trigger: all pushed commits are in the payload | COMMENT |
| LOW | .github/scripts/enforceVideoFormats.sh | 1 | #!/bin/bash | COMMENT |
| LOW | .github/scripts/enforceVideoFormats.sh | 21 | # Non-capturing groups are part of the matching pattern, but not returned in matches. | COMMENT |
| LOW | .github/scripts/enforceVideoFormats.sh | 41 | while IFS= read -r MATCH; do | COMMENT |
| LOW | .github/scripts/inject-ci-data.sh | 1 | #!/bin/bash | COMMENT |
| LOW | .github/scripts/syncVersions.sh | 1 | #!/bin/bash | COMMENT |
| LOW | .github/scripts/syncVersions.sh | 21 | # is rejected before the sync writes or pushes. Empty means "use the Mobile-Expensify version". | COMMENT |
| LOW | .github/scripts/verifyRedirect.sh | 1 | #!/bin/bash | COMMENT |
| LOW | …hub/actions/javascript/validateReassureOutput/index.js | 12921 | // undici implementation note: headersList is cloned in makeRequest | COMMENT |
| LOW | .github/actions/javascript/bumpVersion/index.js | 13381 | // being handled by a service worker. In this scenario a request can have an origin that is different | COMMENT |
| LOW | modules/group-ib-fp/ios/ModuleFhpIos-Bridging-Header.h | 1 | #import <React/RCTBridgeModule.h> | COMMENT |
| LOW | …ulator/GIBMobileSdk.framework/Headers/GIBLogsHandler.h | 1 | // | COMMENT |
| LOW | …/GIBMobileSdk.framework/Headers/GIBAttributeTitleKey.h | 1 | // | COMMENT |
| LOW | …/GIBMobileSdk.framework/Headers/GIBAttributeTitleKey.h | 21 | /// Operation identifier | COMMENT |
| 149 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/unit/FraudProtectionTest.ts | 85 | // Step 1: BeginSignIn returns account data (no session yet) | COMMENT |
| LOW⚡ | tests/unit/FraudProtectionTest.ts | 91 | // Step 2: Validate code verified, session is created | COMMENT |
| LOW⚡ | tests/unit/SubscriptionVisibilityTest.ts | 112 | // Step 1: User has a paid workspace — subscriptionPlan is TEAM | COMMENT |
| LOW⚡ | tests/unit/SubscriptionVisibilityTest.ts | 122 | // Step 2: User deletes the workspace — subscriptionPlan becomes null | COMMENT |
| LOW⚡ | tests/unit/SubscriptionVisibilityTest.ts | 129 | // Step 3: amountOwed > 0 keeps subscription visible | COMMENT |
| LOW⚡ | tests/actions/IOUTest/SplitTest.ts | 5067 | // Step 6: Verify the new transaction thread report exists | COMMENT |
| LOW⚡ | tests/actions/IOUTest/SplitTest.ts | 5072 | // Step 7: Verify the comment was migrated to the new thread | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 2782 | // Step 1: Split into 2 (creates child transactions via creation path) | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 2862 | // Step 2: Revert to 1 split expense, moving it to a different report | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 3253 | // Step 1: Split the original expense into 2 (creation path). One split stays in the workspace | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 3325 | // Step 2: Revert - remove the selfDM split (opened from within selfDM, per the repro), leaving the | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 3378 | // Step 3: Split the now-reverted original transaction into 2 again, initiated from "Spend > Expenses". | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 3477 | // Step 4: Revert a second time - remove one of the second-round splits, leaving the other as the sole | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 4827 | // Step 1: Split into 2 child transactions | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 4914 | // Step 2: Find the split's transaction thread and add a comment to it | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 4955 | // Step 3: Revert to 1 split (triggers isReverseSplitOperation) | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 5020 | // Step 4: Verify the original transaction is restored with correct data | COMMENT |
| LOW | tests/actions/IOUTest/SplitTest.ts | 5035 | // Step 5: Verify the new IOU action for the restored original transaction | COMMENT |
| LOW | tests/actions/IOUTest/SplitSelfDMTest.ts | 471 | // Step 1: Create the splits | COMMENT |
| LOW⚡ | tests/actions/IOUTest/SplitSelfDMTest.ts | 528 | // Step 2: Re-fetch allTransactions (now contains the created children) | COMMENT |
| LOW⚡ | tests/actions/IOUTest/SplitSelfDMTest.ts | 536 | // Step 3: Edit the splits (change amounts) | COMMENT |
| LOW | src/libs/SearchUIUtils.ts | 5830 | // Date presets come with the equals operator, so we need to check if the value is a date preset | COMMENT |
| LOW | src/libs/ValidationUtils.ts | 363 | // so we need to check if it is a valid phone. | COMMENT |
| LOW⚡ | src/libs/SidebarUtils.ts | 651 | // Step 1: Categorize reports | COMMENT |
| LOW⚡ | src/libs/SidebarUtils.ts | 654 | // Step 2: Sort each category | COMMENT |
| LOW⚡ | src/libs/SidebarUtils.ts | 657 | // Step 3: Combine and extract IDs | COMMENT |
| LOW⚡ | src/libs/CategoryOptionListUtils.ts | 146 | // Step 1: Combine selected and enabled categories for searching | COMMENT |
| LOW⚡ | src/libs/CategoryOptionListUtils.ts | 149 | // Step 2: Get search results using tokenizedSearch | COMMENT |
| LOW⚡ | src/libs/CategoryOptionListUtils.ts | 158 | // Step 3: Deduplicate by name (keep first occurrence, which is likely the selected one if present) | COMMENT |
| LOW⚡ | src/libs/CategoryOptionListUtils.ts | 168 | // Step 4: Re-sort to restore hierarchical grouping | COMMENT |
| LOW⚡ | src/libs/CategoryOptionListUtils.ts | 176 | // Step 5: Re-apply the isSelected flag and GL code (lost during sortCategories) | COMMENT |
| LOW⚡ | src/libs/CategoryOptionListUtils.ts | 182 | // Step 6: Generate the option tree and push the section | COMMENT |
| LOW⚡ | src/libs/OptionsListUtils/index.ts | 1312 | // Step 1: Pre-filter reports to avoid processing thousands | COMMENT |
| LOW⚡ | src/libs/OptionsListUtils/index.ts | 1318 | // Step 2: Select the top N reports by priority (self-DM and default workspace chat, then non-archived, then most re | COMMENT |
| LOW⚡ | src/libs/OptionsListUtils/index.ts | 1324 | // Step 3: If search term is present, build report map with ONLY 1:1 DM reports | COMMENT |
| LOW | src/libs/OptionsListUtils/index.ts | 1350 | // Step 4: Process the limited set of reports (performance optimization) | COMMENT |
| LOW | src/libs/Navigation/helpers/useIsSidebarRouteActive.ts | 29 | // To check if the sidebar is active on a narrow layout, we need to check if the focused route is the sidebar route | COMMENT |
| LOW⚡ | src/libs/PolicyUtils/workflows.ts | 29 | * This gets a "corrected" value for autoReportingFrequency. The purpose of this function is to encapsulate some logic a | COMMENT |
| LOW | src/libs/actions/OnyxUpdateManager/utils/index.ts | 14 | * we need to check if there are any gaps between deferred updates. | COMMENT |
| LOW | src/libs/actions/OnyxUpdateManager/utils/index.ts | 53 | // For any other updates, we need to check if the previousUpdateID of the current update is found in the deferre | COMMENT |
| LOW⚡ | src/libs/actions/IOU/UpdateMoneyRequest.ts | 1925 | // Step 1: Get the transaction being updated | COMMENT |
| LOW⚡ | src/libs/actions/IOU/UpdateMoneyRequest.ts | 1935 | // Step 2: Set any "pending fields" (ones updated while the user was offline) to have error messages in the failureD | COMMENT |
| LOW⚡ | src/libs/actions/IOU/UpdateMoneyRequest.ts | 2594 | // Step 1: Set any "pending fields" (ones updated while the user was offline) to have error messages in the failureD | COMMENT |
| LOW⚡ | src/libs/actions/IOU/UpdateMoneyRequest.ts | 2599 | // Step 2: Get all the collections being updated | COMMENT |
| LOW | src/libs/actions/IOU/UpdateMoneyRequest.ts | 2064 | // Step 3: Build the modified expense report actions | COMMENT |
| LOW | src/libs/actions/IOU/UpdateMoneyRequest.ts | 2139 | // Step 4: Compute the IOU total and update the report preview message (and report header) so LHN amount owed is cor | COMMENT |
| LOW | src/libs/actions/IOU/UpdateMoneyRequest.ts | 2685 | // Step 3: Build the modified expense report actions | COMMENT |
| LOW | src/libs/actions/IOU/UpdateMoneyRequest.ts | 2725 | // Step 4: Update the report preview message (and report header) so LHN amount tracked is correct. | COMMENT |
| LOW | src/libs/actions/Policy/CopyPolicySettings.ts | 492 | // Step 3: collection keys (categories / tags) — SET-level overwrite with snapshot rollback | COMMENT |
| LOW | src/libs/actions/Policy/CopyPolicySettings.ts | 562 | // Step 4: drive currentStep on the COPY_POLICY_SETTINGS key itself. | COMMENT |
| LOW | …/MoneyRequestConfirmationList/sections/ReportField.tsx | 73 | * We need to check if the transaction report exists first in order to prevent the outstanding reports from being us | COMMENT |
| LOW | …/MoneyRequestConfirmationList/sections/ReportField.tsx | 74 | * Also we need to check if transaction report exists in outstanding reports in order to show a correct report name. | COMMENT |
| LOW⚡ | …components/Search/hooks/useOptimisticSearchTracking.ts | 109 | // Step 1: resolve watch key if not yet available. | COMMENT |
| LOW⚡ | …components/Search/hooks/useOptimisticSearchTracking.ts | 118 | // Step 2: if the watched transaction is a split parent, swap to child. | COMMENT |
| LOW | src/hooks/useOriginalReportID.ts | 76 | // In that case, we need to check if the reportActionID belongs to the transaction thread. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/_plugins/cache_bust_filter.rb | 15 | # Check if the asset type is supported | COMMENT |
| LOW | scripts/import-cloudflare-certs-into-jdk.sh | 105 | # Check if certificate already exists | COMMENT |
| LOW⚡ | scripts/shellUtils.sh | 3 | # Check if GREEN has already been defined | COMMENT |
| LOW⚡ | scripts/shellUtils.sh | 8 | # Check if RED has already been defined | COMMENT |
| LOW⚡ | scripts/shellUtils.sh | 13 | # Check if BLUE has already been defined | COMMENT |
| LOW⚡ | scripts/shellUtils.sh | 18 | # Check if TITLE has already been defined | COMMENT |
| LOW⚡ | scripts/shellUtils.sh | 23 | # Check if RESET has already been defined | COMMENT |
| LOW⚡ | scripts/setup-mapbox-sdk.sh | 70 | # Check if the token was provided | COMMENT |
| LOW⚡ | scripts/setup-mapbox-sdk.sh | 120 | # Check if gradle.properties exists. If not, create one. | COMMENT |
| LOW⚡ | scripts/setup-mapbox-sdk.sh | 125 | # Check if MAPBOX_DOWNLOADS_TOKEN already exists in the file | COMMENT |
| LOW | scripts/is-hybrid-app.sh | 5 | # Check if jq is installed | COMMENT |
| LOW | scripts/is-hybrid-app.sh | 18 | # Check if 'package.json' exists | COMMENT |
| LOW | scripts/is-hybrid-app.sh | 23 | # Check if the 'name' field is 'mobile-expensify' | COMMENT |
| LOW | scripts/run-build.sh | 65 | # Check if the argument is one of the desired values | COMMENT |
| LOW | scripts/run-build.sh | 77 | # Check if this is an Expensify developer with WARP (only they need cert import) | COMMENT |
| LOW⚡ | scripts/pod-install.sh | 28 | # Check if bundle is installed | COMMENT |
| LOW⚡ | scripts/pod-install.sh | 34 | # Check if jq is installed | COMMENT |
| LOW⚡ | scripts/pod-install.sh | 40 | # Check if yq is installed | COMMENT |
| LOW | .github/workflows/deploy.yml | 1026 | # Check if the release already exists | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …-coding-standards/rules/consistency-16-no-ai-jargon.md | 6 | ## [CONSISTENCY-16] No AI-generated jargon in code or comments | COMMENT |
| HIGH | src/types/onyx/OriginalMessage.ts | 1046 | /** Whether the updated description was generated by AI */ | COMMENT |
| HIGH | src/libs/ModifiedExpenseMessage.ts | 367 | // Add attribution suffix based on AI-generated descriptions | COMMENT |
| HIGH | src/libs/ModifiedExpenseMessage.ts | 567 | // know the change was AI-generated, fall back to an AI-attributed generic summary so | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …routerExtensions/addRootHistoryRouterExtension.test.ts | 513 | // which was incomplete and caused leak-or-misfire. Key-based pairing is robust to non-RHP | COMMENT |
| MEDIUM | ios/SceneDelegate.swift | 50 | // mounting. Both use the `BootSplash` storyboard, so the handoff is seamless. | COMMENT |
| MEDIUM⚡ | scripts/setup-mapbox-sdk-walkthrough.sh | 8 | # This script assists users in setting up the necessary credentials to utilize | COMMENT |
| MEDIUM | .github/workflows/reassurePerformanceTests.yml | 44 | # Tests: only the perf harness feeds the measurement. | COMMENT |
| MEDIUM | src/components/Table/TableBody.tsx | 485 | // Absolutely positioned rows don't widen the scroller's content, so hold the scroll extent open. | COMMENT |
| MEDIUM | src/components/MapView/MapViewImpl.web.tsx | 29 | // we utilize a different Mapbox library @rnmapbox/maps tailored for mobile development. | COMMENT |
| MEDIUM | src/components/MapView/Direction.web.tsx | 8 | // we utilize a different Mapbox library @rnmapbox/maps tailored for mobile development. | COMMENT |
| MEDIUM | src/pages/inbox/report/ReportActionItem.tsx | 543 | // The long term solution will leverage end-to-end encryption and only targeted users will be able to decrypt. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docs/_plugins/cache_bust_filter.rb | 12 | # Define a list of supported asset types | COMMENT |
| MEDIUM⚡ | scripts/setup-mapbox-sdk.sh | 21 | # This file is used in Unix-like systems to store credentials for remote machine access. | COMMENT |
| MEDIUM | scripts/setup-mapbox-sdk.sh | 45 | # This function provides a user-friendly error message when the script encounters an error. | COMMENT |
| MEDIUM | .github/workflows/finishReleaseCycle.yml | 118 | # Create a new patch version to prep for next release cycle | COMMENT |
| MEDIUM | .github/scripts/createDocsRoutes.ts | 54 | const disclaimer = '# This file is auto-generated. Do not edit it directly. Use npm run createDocsRoutes instead.\n'; | CODE |
| MEDIUM | .github/scripts/printPodspec.rb | 3 | # This file is a lightweight port of the `pod ipc spec` command. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/libs/actions/IOU/MoneyRequestBuilder.ts | 1610 | // I want to clean this up at some point, but it's possible this will live in the code for a while so I've created h | COMMENT |
| HIGH | src/libs/actions/IOU/TrackExpense.ts | 1181 | // I want to clean this up at some point, but it's possible this will live in the code for a while so I've created h | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | scripts/setup-newdot-web-emulators.sh | 24 | # Usage: | COMMENT |
| LOW⚡ | scripts/setup-mapbox-sdk-walkthrough.sh | 19 | # Usage: | COMMENT |
| LOW | scripts/generateCertificatePins.sh | 23 | # Usage: | COMMENT |
| LOW | scripts/shellUtils.sh | 172 | # Usage: | COMMENT |
| LOW⚡ | scripts/setup-mapbox-sdk.sh | 34 | # Usage: | COMMENT |
| LOW | src/libs/mapChildrenFlat.ts | 11 | * // Usage example: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | patches/expo-location/details.md | 26 | at com.google.android.gms.tasks.zzw.getResult(...) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/tooling/artifactsResolver.test.ts | 113 | it('falls back to source build when the gh CLI cannot provide credentials', async () => { | CODE |